diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b13aac..d6de576 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -100,8 +100,10 @@ jobs: TEST_DV_PROJECT_URL: ${{ vars.TEST_DV_PROJECT_URL }} TEST_ECV_PROJECT_ID: ${{ vars.TEST_ECV_PROJECT_ID }} TEST_ECV_PROJECT_URL: ${{ vars.TEST_ECV_PROJECT_URL }} - GMAIL_CREDENTIALS: ${{ secrets.GMAIL_CREDENTIALS }} - GMAIL_TOKEN: ${{ secrets.GMAIL_TOKEN }} + TEST_MAILPIT_URL: ${{ secrets.TEST_MAILPIT_URL }} + TEST_MAILPIT_USER: ${{ secrets.TEST_MAILPIT_USER }} + TEST_MAILPIT_PASS: ${{ secrets.TEST_MAILPIT_PASS }} + TEST_MAILPIT_EMAIL_ADDRESS: ${{ secrets.TEST_MAILPIT_EMAIL_ADDRESS }} with: api-level: 35 arch: "x86_64" diff --git a/miracl-sdk/build.gradle b/miracl-sdk/build.gradle index a6a1f14..bc10b35 100644 --- a/miracl-sdk/build.gradle +++ b/miracl-sdk/build.gradle @@ -79,6 +79,11 @@ android { buildConfigField "String", "ECV_PROJECT_ID", "\"${project.getProperties().get('miracltrust.ecvProjectId')}\"" buildConfigField "String", "ECV_PROJECT_URL", "\"${project.getProperties().get('miracltrust.ecvProjectUrl')}\"" + + buildConfigField "String", "MAILPIT_URL", "\"${project.getProperties().get('mailpit.url')}\"" + buildConfigField "String", "MAILPIT_USER", "\"${project.getProperties().get('mailpit.user')}\"" + buildConfigField "String", "MAILPIT_PASS", "\"${project.getProperties().get('mailpit.pass')}\"" + buildConfigField "String", "MAILPIT_EMAIL_ADDRESS", "\"${project.getProperties().get('mailpit.emailAddress')}\"" } } @@ -154,8 +159,6 @@ dependencies { androidTestRuntimeOnly(libs.jjwt.orgjson) { exclude(group: 'org.json', module: 'json') // Provided by Android natively } - - androidTestImplementation project(':utilities') } apiValidation { diff --git a/miracl-sdk/gradle.properties b/miracl-sdk/gradle.properties index 6541a4c..f1c7bed 100644 --- a/miracl-sdk/gradle.properties +++ b/miracl-sdk/gradle.properties @@ -6,4 +6,9 @@ miracltrust.dvProjectId= miracltrust.dvProjectUrl= miracltrust.ecvProjectId= -miracltrust.ecvProjectUrl= \ No newline at end of file +miracltrust.ecvProjectUrl= + +mailpit.url= +mailpit.user= +mailpit.pass= +mailpit.emailAddress= \ No newline at end of file diff --git a/miracl-sdk/src/androidTest/java/com/miracl/trust/MIRACLTrustJavaTest.java b/miracl-sdk/src/androidTest/java/com/miracl/trust/MIRACLTrustJavaTest.java index cdf4e4f..1eee046 100644 --- a/miracl-sdk/src/androidTest/java/com/miracl/trust/MIRACLTrustJavaTest.java +++ b/miracl-sdk/src/androidTest/java/com/miracl/trust/MIRACLTrustJavaTest.java @@ -3,11 +3,11 @@ import static com.miracl.trust.utilities.UtilitiesKt.USER_ID; import static com.miracl.trust.utilities.UtilitiesKt.USER_PIN_LENGTH; +import static com.miracl.trust.utilities.UtilitiesKt.createMailpitUserId; import static com.miracl.trust.utilities.UtilitiesKt.getUnixTime; import static com.miracl.trust.utilities.UtilitiesKt.randomHash; import static com.miracl.trust.utilities.UtilitiesKt.randomNumericPin; -import android.content.Context; import android.net.Uri; import androidx.test.platform.app.InstrumentationRegistry; @@ -31,9 +31,9 @@ import com.miracl.trust.signing.SigningException; import com.miracl.trust.signing.SigningResult; import com.miracl.trust.storage.UserStorageException; -import com.miracl.trust.utilities.GmailService; import com.miracl.trust.utilities.JwtHelper; import com.miracl.trust.utilities.MIRACLService; +import com.miracl.trust.utilities.MailpitService; import com.miracl.trust.utilities.VerifySignatureResponse; import org.junit.Assert; @@ -78,11 +78,11 @@ public void testDefaultVerification() throws ConfigurationException { miraclTrust.updateProjectSettings(BuildConfig.DV_PROJECT_ID, BuildConfig.DV_PROJECT_URL); long timestamp = getUnixTime(); - miraclTrust.sendVerificationEmail(USER_ID, result -> { + String userId = createMailpitUserId(); + miraclTrust.sendVerificationEmail(userId, result -> { Assert.assertTrue(result instanceof MIRACLSuccess); - Context context = InstrumentationRegistry.getInstrumentation().getContext(); - String verificationUrl = GmailService.INSTANCE.getVerificationUrl(context, USER_ID, USER_ID, timestamp); + String verificationUrl = MailpitService.INSTANCE.getVerificationUrl(userId, timestamp); Assert.assertNotNull(verificationUrl); miraclTrust.getActivationToken( @@ -90,9 +90,9 @@ public void testDefaultVerification() throws ConfigurationException { activationTokenResult -> { Assert.assertTrue(activationTokenResult instanceof MIRACLSuccess); - String userId = ((MIRACLSuccess) - activationTokenResult).getValue().getUserId(); - Assert.assertEquals(USER_ID, userId); + ActivationTokenResponse activationTokenResponse = + ((MIRACLSuccess) activationTokenResult).getValue(); + Assert.assertEquals(userId, activationTokenResponse.getUserId()); } ); }); diff --git a/miracl-sdk/src/androidTest/java/com/miracl/trust/registration/RegistrationTest.kt b/miracl-sdk/src/androidTest/java/com/miracl/trust/registration/RegistrationTest.kt index 10222e7..eaaca09 100644 --- a/miracl-sdk/src/androidTest/java/com/miracl/trust/registration/RegistrationTest.kt +++ b/miracl-sdk/src/androidTest/java/com/miracl/trust/registration/RegistrationTest.kt @@ -9,9 +9,10 @@ import com.miracl.trust.MIRACLTrust import com.miracl.trust.configuration.Configuration import com.miracl.trust.delegate.PinProvider import com.miracl.trust.network.ApiException -import com.miracl.trust.utilities.GmailService import com.miracl.trust.utilities.MIRACLService +import com.miracl.trust.utilities.MailpitService import com.miracl.trust.utilities.USER_ID +import com.miracl.trust.utilities.createMailpitUserId import com.miracl.trust.utilities.generateWrongPin import com.miracl.trust.utilities.getUnixTime import com.miracl.trust.utilities.randomNumericPin @@ -63,12 +64,12 @@ class RegistrationTest { // Send verification email miraclTrust.updateProjectSettings(dvProjectId, dvProjectUrl) val timestamp = getUnixTime() - val sendEmailResult = miraclTrust.sendVerificationEmail(USER_ID) + val userId = createMailpitUserId() + val sendEmailResult = miraclTrust.sendVerificationEmail(userId) Assert.assertTrue(sendEmailResult is MIRACLSuccess) // Fetch the verification URL from the email - val context = InstrumentationRegistry.getInstrumentation().context - val verificationUrl = GmailService.getVerificationUrl(context, USER_ID, USER_ID, timestamp) + val verificationUrl = MailpitService.getVerificationUrl(userId, timestamp) Assert.assertNotNull(verificationUrl) // Get activation token @@ -77,10 +78,10 @@ class RegistrationTest { // Register val activationToken = (activationTokenResult as MIRACLSuccess).value.activationToken - val result = register(activationToken = activationToken) + val result = register(userId = userId, activationToken = activationToken) Assert.assertTrue(result is MIRACLSuccess) - Assert.assertEquals(USER_ID, (result as MIRACLSuccess).value.userId) + Assert.assertEquals(userId, (result as MIRACLSuccess).value.userId) Assert.assertEquals(dvProjectId, result.value.projectId) } diff --git a/miracl-sdk/src/androidTest/java/com/miracl/trust/registration/VerificationTest.kt b/miracl-sdk/src/androidTest/java/com/miracl/trust/registration/VerificationTest.kt index 88e6fc7..65b2602 100644 --- a/miracl-sdk/src/androidTest/java/com/miracl/trust/registration/VerificationTest.kt +++ b/miracl-sdk/src/androidTest/java/com/miracl/trust/registration/VerificationTest.kt @@ -14,9 +14,10 @@ import com.miracl.trust.model.User import com.miracl.trust.session.AuthenticationSessionDetails import com.miracl.trust.session.AuthenticationSessionException import com.miracl.trust.util.secondsSince1970 -import com.miracl.trust.utilities.GmailService import com.miracl.trust.utilities.MIRACLService +import com.miracl.trust.utilities.MailpitService import com.miracl.trust.utilities.USER_ID +import com.miracl.trust.utilities.createMailpitUserId import com.miracl.trust.utilities.generateWrongPin import com.miracl.trust.utilities.getUnixTime import com.miracl.trust.utilities.randomNumericPin @@ -27,7 +28,6 @@ import org.junit.Before import org.junit.Test import java.net.URL import java.util.Date -import java.util.UUID class VerificationTest { private val projectId = BuildConfig.CUV_PROJECT_ID @@ -58,16 +58,14 @@ class VerificationTest { fun testDefaultVerification() = runTest(testCoroutineDispatcher) { // Send verification email miraclTrust.updateProjectSettings(dvProjectId, dvProjectUrl) - val addressParts = USER_ID.split("@") - val email = "${addressParts[0]}+${UUID.randomUUID()}@${addressParts[1]}" + val email = createMailpitUserId() val timestamp = getUnixTime() val sendEmailResult = miraclTrust.sendVerificationEmail(email) Assert.assertTrue(sendEmailResult is MIRACLSuccess) // Fetch the verification URL from the email - val context = InstrumentationRegistry.getInstrumentation().context - val verificationUrl = GmailService.getVerificationUrl(context, USER_ID, email, timestamp) + val verificationUrl = MailpitService.getVerificationUrl(email, timestamp) Assert.assertNotNull(verificationUrl) // Get activation token @@ -80,8 +78,7 @@ class VerificationTest { fun testDefaultVerificationBackoff() = runTest(testCoroutineDispatcher) { // Send verification email miraclTrust.updateProjectSettings(dvProjectId, dvProjectUrl) - val addressParts = USER_ID.split("@") - val email = "${addressParts[0]}+${UUID.randomUUID()}@${addressParts[1]}" + val email = createMailpitUserId() var sendEmailResult = miraclTrust.sendVerificationEmail(email) Assert.assertTrue(sendEmailResult is MIRACLSuccess) @@ -97,8 +94,7 @@ class VerificationTest { fun testDefaultVerificationWithSessionDetails() = runTest(testCoroutineDispatcher) { // Send verification email miraclTrust.updateProjectSettings(dvProjectId, dvProjectUrl) - val addressParts = USER_ID.split("@") - val email = "${addressParts[0]}+${UUID.randomUUID()}@${addressParts[1]}" + val email = createMailpitUserId() val qrCode = MIRACLService.obtainAccessId(dvProjectId, dvProjectUrl).qrURL var authenticationSessionDetailsResult: @@ -122,8 +118,7 @@ class VerificationTest { Assert.assertTrue(sendEmailResult is MIRACLSuccess) // Fetch the verification URL from the email - val context = InstrumentationRegistry.getInstrumentation().context - val verificationUrl = GmailService.getVerificationUrl(context, USER_ID, email, timestamp) + val verificationUrl = MailpitService.getVerificationUrl(email, timestamp) Assert.assertNotNull(verificationUrl) // Get activation token @@ -138,8 +133,7 @@ class VerificationTest { fun testDefaultVerificationWithCrossDeviceSession() = runTest(testCoroutineDispatcher) { // Send verification email miraclTrust.updateProjectSettings(dvProjectId, dvProjectUrl) - val addressParts = USER_ID.split("@") - val email = "${addressParts[0]}+${UUID.randomUUID()}@${addressParts[1]}" + val email = createMailpitUserId() val qrCode = MIRACLService.obtainAccessId(dvProjectId, dvProjectUrl).qrURL val crossDeviceSessionResult = miraclTrust.getCrossDeviceSessionFromQRCode(qrCode) @@ -155,8 +149,7 @@ class VerificationTest { Assert.assertTrue(sendEmailResult is MIRACLSuccess) // Fetch the verification URL from the email - val context = InstrumentationRegistry.getInstrumentation().context - val verificationUrl = GmailService.getVerificationUrl(context, USER_ID, email, timestamp) + val verificationUrl = MailpitService.getVerificationUrl(email, timestamp) Assert.assertNotNull(verificationUrl) // Get activation token @@ -171,16 +164,14 @@ class VerificationTest { fun testDefaultVerificationWithMpinId() = runTest(testCoroutineDispatcher) { // Send verification email miraclTrust.updateProjectSettings(dvProjectId, dvProjectUrl) - val addressParts = USER_ID.split("@") - val email = "${addressParts[0]}+${UUID.randomUUID()}@${addressParts[1]}" + val email = createMailpitUserId() val timestamp = System.currentTimeMillis() / 1000 val sendEmailResult = miraclTrust.sendVerificationEmail(email) Assert.assertTrue(sendEmailResult is MIRACLSuccess) // Fetch the verification URL from the email - val context = InstrumentationRegistry.getInstrumentation().context - val verificationUrl = GmailService.getVerificationUrl(context, USER_ID, email, timestamp) + val verificationUrl = MailpitService.getVerificationUrl(email, timestamp) Assert.assertNotNull(verificationUrl) // Get activation token @@ -210,16 +201,14 @@ class VerificationTest { fun testEmailCodeVerification() = runTest(testCoroutineDispatcher) { // Send verification email miraclTrust.updateProjectSettings(evcProjectId, evcProjectUrl) - val addressParts = USER_ID.split("@") - val email = "${addressParts[0]}+${UUID.randomUUID()}@${addressParts[1]}" + val email = createMailpitUserId() val timestamp = System.currentTimeMillis() / 1000 val sendEmailResult = miraclTrust.sendVerificationEmail(email) Assert.assertTrue(sendEmailResult is MIRACLSuccess) // Fetch the verification code from the email - val context = InstrumentationRegistry.getInstrumentation().context - val code = GmailService.getVerificationCode(context, USER_ID, email, timestamp) + val code = MailpitService.getVerificationCode(email, timestamp) Assert.assertNotNull(code) // Get activation token @@ -232,16 +221,14 @@ class VerificationTest { fun testEmailCodeVerificationWithMpinId() = runTest(testCoroutineDispatcher) { // Send verification email miraclTrust.updateProjectSettings(evcProjectId, evcProjectUrl) - val addressParts = USER_ID.split("@") - val email = "${addressParts[0]}+${UUID.randomUUID()}@${addressParts[1]}" + val email = createMailpitUserId() val timestamp = System.currentTimeMillis() / 1000 val sendEmailResult = miraclTrust.sendVerificationEmail(email) Assert.assertTrue(sendEmailResult is MIRACLSuccess) - // Fetch the verification URL from the email - val context = InstrumentationRegistry.getInstrumentation().context - val code = GmailService.getVerificationCode(context, USER_ID, email, timestamp) + // Fetch the verification code from the email + val code = MailpitService.getVerificationCode(email, timestamp) Assert.assertNotNull(code) // Get activation token @@ -271,16 +258,14 @@ class VerificationTest { fun testEmailCodeVerificationWithoutMpinId() = runTest(testCoroutineDispatcher) { // Send verification email miraclTrust.updateProjectSettings(evcProjectId, evcProjectUrl) - val addressParts = USER_ID.split("@") - val email = "${addressParts[0]}+${UUID.randomUUID()}@${addressParts[1]}" + val email = createMailpitUserId() val timestamp = System.currentTimeMillis() / 1000 val sendEmailResult = miraclTrust.sendVerificationEmail(email) Assert.assertTrue(sendEmailResult is MIRACLSuccess) - // Fetch the verification URL from the email - val context = InstrumentationRegistry.getInstrumentation().context - val code = GmailService.getVerificationCode(context, USER_ID, email, timestamp) + // Fetch the verification code from the email + val code = MailpitService.getVerificationCode(email, timestamp) Assert.assertNotNull(code) // Get activation token @@ -314,16 +299,14 @@ class VerificationTest { fun testEmailCodeVerificationWithRevokedMpinId() = runTest(testCoroutineDispatcher) { // Send verification email miraclTrust.updateProjectSettings(evcProjectId, evcProjectUrl) - val addressParts = USER_ID.split("@") - val email = "${addressParts[0]}+${UUID.randomUUID()}@${addressParts[1]}" + val email = createMailpitUserId() val timestamp = System.currentTimeMillis() / 1000 val sendEmailResult = miraclTrust.sendVerificationEmail(email) Assert.assertTrue(sendEmailResult is MIRACLSuccess) - // Fetch the verification URL from the email - val context = InstrumentationRegistry.getInstrumentation().context - val code = GmailService.getVerificationCode(context, USER_ID, email, timestamp) + // Fetch the verification code from the email + val code = MailpitService.getVerificationCode(email, timestamp) Assert.assertNotNull(code) // Get activation token diff --git a/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/MailpitService.kt b/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/MailpitService.kt new file mode 100644 index 0000000..1df60a8 --- /dev/null +++ b/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/MailpitService.kt @@ -0,0 +1,115 @@ +package com.miracl.trust.utilities + +import android.util.Base64 +import android.util.Log +import com.miracl.trust.BuildConfig +import com.miracl.trust.MIRACLSuccess +import com.miracl.trust.network.ApiRequest +import com.miracl.trust.network.HttpMethod +import com.miracl.trust.network.HttpsURLConnectionRequestExecutor +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import java.net.URLEncoder + +@Serializable +private data class MessageList(val messages: List) + +@Serializable +private data class Message(@SerialName("ID") val id: String) + +@Serializable +private data class MessageContent(@SerialName("Text") val text: String) + + +object MailpitService { + private val TAG = MailpitService::class.simpleName + + private const val RETRY_COUNT = 60 + private const val RETRY_TIMEOUT = 10 * 1000L + + private val requestExecutor = HttpsURLConnectionRequestExecutor( + logger = DefaultLogger(Logger.LoggingLevel.NONE), + connectTimeout = 10, + readTimeout = 10 + ) + + private val json = Json { + ignoreUnknownKeys = true + } + + fun getVerificationUrl( + receiver: String, + timestamp: Long + ): String? = runBlocking { + val messageData = getMessageData(receiver, timestamp) ?: return@runBlocking null + + val regex = + """https?://.*/verification/confirmation\?code=([^&]*)&user_id=(\S*)""".toRegex() + val matchResult = regex.find(messageData) + + matchResult?.groups?.get(0)?.value + } + + fun getVerificationCode( + receiver: String, + timestamp: Long + ): String? = runBlocking { + val messageData = getMessageData(receiver, timestamp) ?: return@runBlocking null + + val regex = """Type the following code to register your device: (\d{6})""".toRegex() + val matchResult = regex.find(messageData) + + matchResult?.groups?.get(1)?.value + } + + private suspend fun getMessageData(receiver: String, timestamp: Long): String? { + val baseUrl = BuildConfig.MAILPIT_URL + val query = "from:noreply@trust.miracl.cloud to:$receiver after:$timestamp" + val credentials = Base64.encodeToString( + "${BuildConfig.MAILPIT_USER}:${BuildConfig.MAILPIT_PASS}".toByteArray(), + Base64.NO_WRAP + ) + + val searchRequest = ApiRequest( + method = HttpMethod.GET, + headers = mapOf("Authorization" to "Basic $credentials"), + body = null, + params = mapOf("query" to URLEncoder.encode(query, "UTF-8")), + url = "$baseUrl/api/v1/search" + ) + + var messageData: String? = null + for (currentRetryCount in 1..RETRY_COUNT) { + Log.d(TAG, "Getting the email message data attempt: $currentRetryCount") + + val messages = requestExecutor.execute(searchRequest) as? MIRACLSuccess ?: return null + val messagesList = json.decodeFromString(messages.value) + if (messagesList.messages.isEmpty()) { + Log.d(TAG, "No messages found.") + delay(RETRY_TIMEOUT) + continue + } + + val messageRequest = ApiRequest( + method = HttpMethod.GET, + headers = mapOf("Authorization" to "Basic $credentials"), + body = null, + params = null, + url = "${baseUrl}/api/v1/message/${messagesList.messages.first().id}" + ) + + val msgJson = requestExecutor.execute(messageRequest) as? MIRACLSuccess ?: return null + val message = json.decodeFromString(msgJson.value) + + messageData = message.text + break + } + + return messageData + } +} \ No newline at end of file diff --git a/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/Utilities.kt b/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/Utilities.kt index 59c7a1a..1daf067 100644 --- a/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/Utilities.kt +++ b/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/Utilities.kt @@ -1,5 +1,6 @@ package com.miracl.trust.utilities +import com.miracl.trust.test.BuildConfig import java.util.UUID import kotlin.random.Random import kotlin.random.nextInt @@ -9,6 +10,13 @@ const val USER_PIN_LENGTH = 4 const val WRONG_FORMAT_PIN = "FAIL" const val SINGLE_DIGIT_LIMITER = 10 +fun createMailpitUserId(): String { + return BuildConfig.MAILPIT_EMAIL_ADDRESS.replace( + "{tag}", + UUID.randomUUID().toString().lowercase() + ) +} + fun randomNumericPin(length: Int = USER_PIN_LENGTH): String { var pass = "" diff --git a/run-instrumentation-tests.sh b/run-instrumentation-tests.sh index 9e2c511..c8d2a58 100755 --- a/run-instrumentation-tests.sh +++ b/run-instrumentation-tests.sh @@ -1,11 +1,5 @@ #!/bin/sh -TEST_CREDENTIALS_DIR="./utilities/src/main/res/raw" -mkdir -p $TEST_CREDENTIALS_DIR -echo $GMAIL_CREDENTIALS > "${TEST_CREDENTIALS_DIR}/credentials.json" -echo $GMAIL_TOKEN > "${TEST_CREDENTIALS_DIR}/token.json" - -#Instrumentation tests ./gradlew connectedAndroidTest \ -Pmiracltrust.cuvProjectId="$TEST_CUV_PROJECT_ID" \ -Pmiracltrust.cuvProjectUrl="$TEST_CUV_PROJECT_URL" \ @@ -13,11 +7,8 @@ echo $GMAIL_TOKEN > "${TEST_CREDENTIALS_DIR}/token.json" -Pmiracltrust.dvProjectId="$TEST_DV_PROJECT_ID" \ -Pmiracltrust.dvProjectUrl="$TEST_DV_PROJECT_URL" \ -Pmiracltrust.ecvProjectId="$TEST_ECV_PROJECT_ID" \ - -Pmiracltrust.ecvProjectUrl="$TEST_ECV_PROJECT_URL" - -GRADLE_EXIT_CODE=$? - -rm "${TEST_CREDENTIALS_DIR}/credentials.json" -rm "${TEST_CREDENTIALS_DIR}/token.json" - -exit $GRADLE_EXIT_CODE + -Pmiracltrust.ecvProjectUrl="$TEST_ECV_PROJECT_URL" \ + -Pmailpit.url=$TEST_MAILPIT_URL \ + -Pmailpit.user=$TEST_MAILPIT_USER \ + -Pmailpit.pass=$TEST_MAILPIT_PASS \ + -Pmailpit.emailAddress=$TEST_MAILPIT_EMAIL_ADDRESS diff --git a/settings.gradle b/settings.gradle index 15f69ab..f6c5d12 100644 --- a/settings.gradle +++ b/settings.gradle @@ -20,4 +20,4 @@ dependencyResolutionManagement { } rootProject.name = 'MIRACLTrust' -include ':miracl-sdk', ':utilities' \ No newline at end of file +include ':miracl-sdk' \ No newline at end of file diff --git a/utilities/.gitignore b/utilities/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/utilities/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/utilities/build.gradle b/utilities/build.gradle deleted file mode 100644 index 98075f8..0000000 --- a/utilities/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) -} - -android { - namespace 'com.miracl.trust.utilities' - compileSdk 35 - - defaultConfig { - minSdk 21 - } - - buildTypes { - release { - minifyEnabled false - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } - - packagingOptions { - resources.excludes.add("META-INF/*") - } -} - -dependencies { - implementation(libs.google.api.client) { - exclude(group: 'commons-logging', module: 'commons-logging') - exclude(group: 'org.apache.httpcomponents', module: 'httpclient') - } - implementation(libs.google.oauth.client.jetty) { - exclude(group: 'org.apache.httpcomponents', module: 'httpclient') - } - implementation(libs.google.api.services.gmail) { - exclude(group: 'commons-logging', module: 'commons-logging') - exclude(group: 'org.apache.httpcomponents', module: 'httpclient') - } -} \ No newline at end of file diff --git a/utilities/src/main/AndroidManifest.xml b/utilities/src/main/AndroidManifest.xml deleted file mode 100644 index a5918e6..0000000 --- a/utilities/src/main/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/utilities/src/main/java/com/miracl/trust/utilities/GmailService.kt b/utilities/src/main/java/com/miracl/trust/utilities/GmailService.kt deleted file mode 100644 index 80548bd..0000000 --- a/utilities/src/main/java/com/miracl/trust/utilities/GmailService.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.miracl.trust.utilities - -import android.content.Context -import android.util.Base64 -import android.util.Log -import com.google.api.client.auth.oauth2.BearerToken -import com.google.api.client.auth.oauth2.ClientParametersAuthentication -import com.google.api.client.auth.oauth2.Credential -import com.google.api.client.auth.oauth2.TokenResponse -import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets -import com.google.api.client.http.GenericUrl -import com.google.api.client.http.HttpRequestInitializer -import com.google.api.client.http.javanet.NetHttpTransport -import com.google.api.client.json.gson.GsonFactory -import com.google.api.services.gmail.Gmail -import java.nio.charset.StandardCharsets - -object GmailService { - private val TAG = GmailService::class.simpleName - - private const val RETRY_COUNT = 60 - private const val RETRY_TIMEOUT = 10 * 1000L - - private val httpTransport = NetHttpTransport() - private val gsonFactory = GsonFactory.getDefaultInstance() - - fun getVerificationUrl( - context: Context, - userId: String, - receiver: String, - timestamp: Long - ): String? { - val messageData = getMessageData(context, userId, receiver, timestamp) ?: return null - - val regex = - """https?://.*/verification/confirmation\?code=([^&]*)&user_id=(\S*)""".toRegex() - val matchResult = regex.find(messageData) - - return matchResult?.groups?.get(0)?.value - } - - fun getVerificationCode( - context: Context, - userId: String, - receiver: String, - timestamp: Long - ): String? { - val messageData = getMessageData(context, userId, receiver, timestamp) ?: return null - - val regex = """Type the following code to register your device: (\d{6})""".toRegex() - val matchResult = regex.find(messageData) - - return matchResult?.groups?.get(1)?.value - } - - private fun getMessageData( - context: Context, - userId: String, - receiver: String, - timestamp: Long - ): String? { - val gmail = Gmail.Builder(httpTransport, gsonFactory, getCredentials(context)).build() - var messageData: String? = null - - for (currentRetryCount in 1..RETRY_COUNT) { - Log.d(TAG, "Getting the email message data attempt: $currentRetryCount") - - val listResponse = gmail.users().messages().list(userId) - .setQ("from:noreply@trust.miracl.cloud to:$receiver after:${timestamp}") - .setMaxResults(1) - .execute() - - val messages = listResponse.messages - if (messages == null || messages.isEmpty()) { - Log.d(TAG, "No messages found.") - Thread.sleep(RETRY_TIMEOUT) - continue - } - - val message = - gmail.users().messages().get(userId, messages.first().id).setFormat("full") - .execute() - - messageData = String( - Base64.decode(message.payload.parts[0].body.data, Base64.URL_SAFE), - StandardCharsets.UTF_8 - ) - break - } - - return messageData - } - - private fun getCredentials(context: Context): HttpRequestInitializer { - val credentialsInputStream = context.resources.openRawResource(R.raw.credentials) - val googleClientSecrets = - gsonFactory.fromInputStream(credentialsInputStream, GoogleClientSecrets::class.java) - - val tokenInputStream = context.resources.openRawResource(R.raw.token) - val tokenResponse = gsonFactory.fromInputStream(tokenInputStream, TokenResponse::class.java) - - return Credential.Builder(BearerToken.authorizationHeaderAccessMethod()) - .setJsonFactory(gsonFactory) - .setTransport(httpTransport) - .setClientAuthentication( - ClientParametersAuthentication( - /* clientId = */ googleClientSecrets.installed.clientId, - /* clientSecret = */ googleClientSecrets.installed.clientSecret - ) - ) - .setTokenServerUrl(GenericUrl(googleClientSecrets.installed.tokenUri)) - .build() - .setFromTokenResponse(tokenResponse) - } -} \ No newline at end of file diff --git a/utilities/src/main/res/raw/credentials.json b/utilities/src/main/res/raw/credentials.json deleted file mode 100644 index e69de29..0000000 diff --git a/utilities/src/main/res/raw/token.json b/utilities/src/main/res/raw/token.json deleted file mode 100644 index e69de29..0000000