yayan 1 year ago
parent
commit
0dbb5d6310

+ 2 - 0
app/src/main/java/io/nexilis/alpha/ui/components/Person.kt

@@ -21,6 +21,7 @@ import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.unit.dp
 import coil.compose.AsyncImage
 import coil.request.ImageRequest
+import io.nexilis.service.core.getUnsafeImageLoader
 import io.nexilis.service.data.entities.Buddy
 
 @Composable
@@ -38,6 +39,7 @@ fun Person(buddy: Buddy) {
                     .build(),
                 placeholder = rememberVectorPainter(image = Icons.Default.Person),
                 contentDescription = "",
+                imageLoader = LocalContext.current.getUnsafeImageLoader(),
                 contentScale = ContentScale.Crop,
                 modifier = Modifier
                     .size(48.dp)

+ 2 - 0
app/src/main/java/io/nexilis/alpha/ui/main/Contact.kt

@@ -25,6 +25,7 @@ import coil.compose.AsyncImage
 import coil.request.ImageRequest
 import io.nexilis.alpha.ui.components.Person
 import io.nexilis.alpha.ui.screen.Screen
+import io.nexilis.service.core.getUnsafeImageLoader
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 import io.nexilis.service.data.viewmodels.GroupViewModel
 
@@ -133,6 +134,7 @@ fun GroupContact(navController: NavHostController) {
                                 .crossfade(true)
                                 .build(),
                             contentDescription = "",
+                            imageLoader = LocalContext.current.getUnsafeImageLoader(),
                             contentScale = ContentScale.Crop,
                             modifier = Modifier
                                 .size(48.dp)

+ 9 - 0
app/src/main/java/io/nexilis/alpha/ui/main/Gallery.kt

@@ -0,0 +1,9 @@
+package io.nexilis.alpha.ui.main
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+
+@Composable
+fun Gallery(modifier: Modifier = Modifier) {
+
+}

+ 3 - 1
app/src/main/java/io/nexilis/alpha/ui/main/Home.kt

@@ -16,6 +16,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
 import coil.compose.AsyncImage
 import coil.request.ImageRequest
 import io.nexilis.alpha.R
+import io.nexilis.service.core.getUnsafeImageLoader
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
 @OptIn(ExperimentalFoundationApi::class)
@@ -48,11 +49,12 @@ fun Home(
             AsyncImage(
                 model = ImageRequest.Builder(LocalContext.current)
                     .data("https://digixplatform.com/filepalio/image/${buddy?.image_id}")
-                    .addHeader("Cookie" , "PHPSESSID=123;MOBILE=123")
+                    .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
                     .crossfade(true)
                     .build(),
                 placeholder = painterResource(R.drawable.ic_placeholder),
                 contentDescription = "",
+                imageLoader = LocalContext.current.getUnsafeImageLoader(),
                 contentScale = ContentScale.Crop,
                 modifier = mod
             )

+ 3 - 1
app/src/main/java/io/nexilis/alpha/ui/main/Profile.kt

@@ -31,6 +31,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
 import coil.compose.rememberAsyncImagePainter
 import coil.request.ImageRequest
 import io.nexilis.service.core.createFile
+import io.nexilis.service.core.getUnsafeImageLoader
 import io.nexilis.service.data.entities.Buddy
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
@@ -94,7 +95,8 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), me: Buddy) {
                         .data("https://digixplatform.com/filepalio/image/${me.image_id}")
                         .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
                         .crossfade(true)
-                        .build()
+                        .build(),
+                    imageLoader = LocalContext.current.getUnsafeImageLoader(),
                 )
             Image(
                 painter = painter, contentDescription = "", modifier = Modifier

+ 8 - 0
cpaas-lite/src/main/java/io/nexilis/service/core/Extension.kt

@@ -7,6 +7,8 @@ import android.provider.OpenableColumns
 import android.util.Log
 import android.webkit.MimeTypeMap
 import androidx.compose.ui.graphics.Color
+import coil.ImageLoader
+import coil.imageLoader
 import io.nexilis.service.namePreference
 import io.nexilis.service.tag
 import java.io.File
@@ -118,6 +120,12 @@ fun Context.getSharedPreferences(): SharedPreferences {
     )
 }
 
+fun Context.getUnsafeImageLoader(): ImageLoader {
+    return this.imageLoader.newBuilder().okHttpClient(
+        getUnsafeOkHttpClient()
+    ).build()
+}
+
 fun InputStream.toFile(context: Context, name: String? = null): File {
     val file = this.use { input ->
         var fileName = name

+ 1 - 2
cpaas-lite/src/main/java/io/nexilis/service/core/Incoming.kt

@@ -10,7 +10,6 @@ import androidx.core.app.ActivityCompat
 import androidx.core.app.NotificationManagerCompat
 import androidx.core.app.Person
 import androidx.core.graphics.drawable.IconCompat
-import coil.ImageLoader
 import coil.request.ImageRequest
 import coil.transform.CircleCropTransformation
 import com.google.android.gms.tasks.OnCompleteListener
@@ -503,7 +502,7 @@ class Incoming(private val context: Context) {
                     .data("https://digixplatform.com/filepalio/image/${buddy.image_id}")
                     .transformations(CircleCropTransformation())
                     .build()
-                val drawable = ImageLoader(context).execute(request).drawable as BitmapDrawable
+                val drawable = context.getUnsafeImageLoader().execute(request).drawable as BitmapDrawable
                 val user = Person.Builder()
                     .setIcon(IconCompat.createWithBitmap(drawable.bitmap))
                     .setName("${buddy.first_name} ${buddy.last_name}".trim())

+ 62 - 3
cpaas-lite/src/main/java/io/nexilis/service/core/Network.kt

@@ -29,12 +29,51 @@ import okio.buffer
 import okio.sink
 import java.io.File
 import java.io.IOException
+import java.security.SecureRandom
+import java.security.cert.X509Certificate
+import javax.net.ssl.HostnameVerifier
+import javax.net.ssl.SSLContext
+import javax.net.ssl.SSLSession
+import javax.net.ssl.SSLSocketFactory
+import javax.net.ssl.TrustManager
+import javax.net.ssl.X509TrustManager
+import javax.security.cert.CertificateException
 
 
+fun getUnsafeOkHttpClient(): OkHttpClient {
+    return try {
+        val trustAllCerts = arrayOf<TrustManager>(
+            object : X509TrustManager {
+                @Throws(CertificateException::class)
+                override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
+                }
+
+                @Throws(CertificateException::class)
+                override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
+                }
+
+                override fun getAcceptedIssuers(): Array<X509Certificate> {
+                    return arrayOf()
+                }
+            }
+        )
+        val sslContext = SSLContext.getInstance("TLS")
+        sslContext.init(null, trustAllCerts, SecureRandom())
+        val sslSocketFactory: SSLSocketFactory = sslContext.socketFactory
+        val builder = OkHttpClient.Builder()
+        builder.followRedirects(false)
+        builder.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
+        builder.hostnameVerifier(HostnameVerifier { hostname: String?, session: SSLSession? -> true })
+        builder.build()
+    } catch (e: Exception) {
+        throw RuntimeException(e)
+    }
+}
+
 class Network {
 
     fun upload(url: String, file: File, completion: (Boolean) -> Unit) {
-        val client = OkHttpClient()
+        val client = getUnsafeOkHttpClient()
         val body: RequestBody = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             MultipartBody.Builder()
                 .setType(MultipartBody.FORM)
@@ -75,7 +114,7 @@ class Network {
     }
 
     fun uploadSync(url: String, file: File, onProgress: (Long, Long) -> Unit): Boolean {
-        val client = OkHttpClient()
+        val client = getUnsafeOkHttpClient()
         val body: RequestBody = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             MultipartBody.Builder()
                 .setType(MultipartBody.FORM)
@@ -108,7 +147,7 @@ class Network {
     }
 
     fun post(url: String, body: String, completion: (Boolean, body: String?) -> Unit) {
-        val client = OkHttpClient()
+        val client = getUnsafeOkHttpClient()
         val requestBody: RequestBody =
             body.toRequestBody("application/x-www-form-urlencoded".toMediaTypeOrNull())
         val request: Request = Request.Builder()
@@ -136,7 +175,27 @@ class Network {
         url: String,
         onProgress: ((Long, Long) -> Unit) = { _, _ -> }
     ): Uri? {
+        val trustAllCerts = arrayOf<TrustManager>(
+            object : X509TrustManager {
+                @Throws(CertificateException::class)
+                override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
+                }
+
+                @Throws(CertificateException::class)
+                override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
+                }
+
+                override fun getAcceptedIssuers(): Array<X509Certificate> {
+                    return arrayOf()
+                }
+            }
+        )
+        val sslContext = SSLContext.getInstance("TLS")
+        sslContext.init(null, trustAllCerts, SecureRandom())
+        val sslSocketFactory: SSLSocketFactory = sslContext.socketFactory
         val client = OkHttpClient.Builder()
+            .sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
+            .hostnameVerifier(HostnameVerifier { hostname: String?, session: SSLSession? -> true })
             .addNetworkInterceptor {
                 val originalResponse = it.proceed(it.request())
                 val interceptor = originalResponse.newBuilder()

+ 1 - 1
gradle/libs.versions.toml

@@ -8,7 +8,7 @@ junitVersion = "1.1.5"
 espressoCore = "3.5.1"
 lifecycleRuntimeKtx = "2.7.0"
 activityCompose = "1.8.2"
-composeBom = "2024.03.00"
+composeBom = "2024.04.00"
 hilt = "2.49"
 hiltNavigation = "1.2.0"
 gms = "4.3.14"