Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@ The MIRACL Trust Android SDK provides the following functionalities:

```kotlin
dependencies {
implementation("com.miracl:trust-sdk-android:1.12.0")
implementation("com.miracl:trust-sdk-android:1.13.0")
}
```

Groovy:

```groovy
dependencies {
implementation "com.miracl:trust-sdk-android:1.12.0"
implementation "com.miracl:trust-sdk-android:1.13.0"
}
```

Expand Down
9 changes: 8 additions & 1 deletion miracl-sdk/api/miracl-sdk.api
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public final class com/miracl/trust/MIRACLSuccess : com/miracl/trust/MIRACLResul

public final class com/miracl/trust/MIRACLTrust {
public static final field Companion Lcom/miracl/trust/MIRACLTrust$Companion;
public synthetic fun <init> (Landroid/content/Context;Lcom/miracl/trust/configuration/Configuration;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Lcom/miracl/trust/configuration/Configuration;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun abortAuthenticationSession (Lcom/miracl/trust/session/AuthenticationSessionDetails;Lcom/miracl/trust/delegate/ResultHandler;)V
public final fun abortCrossDeviceSession (Lcom/miracl/trust/session/CrossDeviceSession;Lcom/miracl/trust/delegate/ResultHandler;)V
public final synthetic fun abortCrossDeviceSession (Lcom/miracl/trust/session/CrossDeviceSession;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
Expand Down Expand Up @@ -83,7 +83,13 @@ public final class com/miracl/trust/MIRACLTrust {

public final class com/miracl/trust/MIRACLTrust$Companion {
public final fun configure (Landroid/content/Context;Lcom/miracl/trust/configuration/Configuration;)V
public final fun createInstance (Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Lcom/miracl/trust/MIRACLTrust;
public final fun getInstance ()Lcom/miracl/trust/MIRACLTrust;
public final fun getUsers (Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun setDefaultConfiguration (Lcom/miracl/trust/configuration/Configuration;)V
}

public abstract interface annotation class com/miracl/trust/MIRACLTrustAuthenticatorApi : java/lang/annotation/Annotation {
}

public abstract class com/miracl/trust/authentication/AuthenticationException : java/lang/Exception {
Expand Down Expand Up @@ -145,6 +151,7 @@ public final class com/miracl/trust/configuration/Configuration {
}

public final class com/miracl/trust/configuration/Configuration$Builder {
public fun <init> ()V
public fun <init> (Ljava/lang/String;)V
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
Expand Down
2 changes: 1 addition & 1 deletion miracl-sdk/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ plugins {
alias libs.plugins.jreleaser
}

version = '1.12.0'
version = '1.13.0'

android {
namespace 'com.miracl.trust'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import com.miracl.trust.network.ApiRequestExecutor
import com.miracl.trust.network.ApiSettings
import com.miracl.trust.network.HttpsURLConnectionRequestExecutor
import com.miracl.trust.util.json.KotlinxSerializationJsonUtil
import com.miracl.trust.util.log.DefaultLogger
import com.miracl.trust.util.log.Logger
import com.miracl.trust.utilities.AccessIdResponse
import com.miracl.trust.utilities.MIRACLService
import com.miracl.trust.utilities.randomPinLength
Expand All @@ -26,14 +28,15 @@ class SessionManagerTest {

@Before
fun setUp() = runBlocking {
val httpRequestExecutor = HttpsURLConnectionRequestExecutor(10, 10)
val logger = DefaultLogger(Logger.LoggingLevel.NONE)
val httpRequestExecutor = HttpsURLConnectionRequestExecutor(logger, 10, 10)
val apiSettings = ApiSettings(projectUrl)
val apiRequestExecutor =
ApiRequestExecutor(httpRequestExecutor, KotlinxSerializationJsonUtil)

val sessionApi =
SessionApiManager(apiRequestExecutor, KotlinxSerializationJsonUtil, apiSettings)
sessionManager = SessionManager(sessionApi)
sessionManager = SessionManager(sessionApi, logger)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import com.miracl.trust.network.HttpMethod
import com.miracl.trust.network.HttpsURLConnectionRequestExecutor
import com.miracl.trust.signing.Signature
import com.miracl.trust.test.BuildConfig
import com.miracl.trust.util.log.DefaultLogger
import com.miracl.trust.util.log.Logger
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down Expand Up @@ -67,7 +69,12 @@ data class VerifySignatureResponse(
)

object MIRACLService {
private val requestExecutor = HttpsURLConnectionRequestExecutor(10, 10)
private val requestExecutor = HttpsURLConnectionRequestExecutor(
logger = DefaultLogger(Logger.LoggingLevel.NONE),
connectTimeout = 10,
readTimeout = 10
)

private val json = Json {
encodeDefaults = true
ignoreUnknownKeys = true
Expand Down
117 changes: 101 additions & 16 deletions miracl-sdk/src/main/java/com/miracl/trust/MIRACLTrust.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import androidx.annotation.VisibleForTesting
import com.miracl.trust.authentication.*
import com.miracl.trust.authentication.AuthenticatorScopes
import com.miracl.trust.configuration.*
import com.miracl.trust.configuration.factory.ConfigurationFactory
import com.miracl.trust.configuration.factory.DefaultConfigurationFactory
import com.miracl.trust.delegate.PinProvider
import com.miracl.trust.delegate.ResultHandler
import com.miracl.trust.factory.ComponentFactory
Expand All @@ -20,9 +22,9 @@ import com.miracl.trust.session.SessionManagerContract
import com.miracl.trust.signing.*
import com.miracl.trust.storage.UserStorageException
import com.miracl.trust.storage.UserStorage
import com.miracl.trust.storage.room.RoomDatabaseModule
import com.miracl.trust.util.UrlValidator
import com.miracl.trust.util.json.KotlinxSerializationJsonUtil
import com.miracl.trust.util.log.Logger
import com.miracl.trust.util.log.LoggerConstants
import com.miracl.trust.util.toUserDto
import com.miracl.trust.util.toUser
Expand All @@ -39,14 +41,24 @@ import kotlin.jvm.Throws
*/
public class MIRACLTrust private constructor(
context: Context,
projectId: String,
projectUrl: String,
configuration: Configuration
) {
public companion object {
internal var logger: Logger? = null
private set

private const val NOT_INITIALIZED_EXCEPTION = "MIRACLTrust SDK not initialized!"

@VisibleForTesting
internal var configurationFactory: ConfigurationFactory = DefaultConfigurationFactory()

@Volatile
@VisibleForTesting
internal var defaultUserStorage: UserStorage? = null

@Volatile
@VisibleForTesting
internal var defaultConfiguration: Configuration? = null

private lateinit var instance: MIRACLTrust

@JvmStatic
Expand All @@ -67,11 +79,82 @@ public class MIRACLTrust private constructor(
*/
@JvmStatic
public fun configure(context: Context, configuration: Configuration) {
instance = MIRACLTrust(context, configuration)
val projectId = requireNotNull(configuration.projectId) {
"MIRACLTrust SDK: Project ID is missing. Pass a valid Project ID to Configuration.Builder."
}

configuration.userStorage?.loadStorage()
instance = MIRACLTrust(
projectId = projectId,
projectUrl = configuration.projectUrl,
context = context,
configuration = configuration
)
}

//region Authenticator API
/**
* This is an experimental API.
* @suppress
*/
@MIRACLTrustAuthenticatorApi
public fun setDefaultConfiguration(configuration: Configuration) {
configuration.userStorage?.loadStorage()
this.defaultConfiguration = configuration
}

/**
* This is an experimental API.
* @suppress
*/
@MIRACLTrustAuthenticatorApi
public fun createInstance(
context: Context,
projectId: String,
projectUrl: String
): MIRACLTrust {
require(projectId.isNotEmpty()) {
"MIRACLTrust SDK: Project ID cannot be empty. Pass a valid Project ID when calling createInstance()."
}

require(UrlValidator.isValid(projectUrl)) {
"MIRACLTrust SDK: Project URL is invalid. Pass a valid URL when calling createInstance()."
}

val configuration = defaultConfiguration ?: configurationFactory.create()

return MIRACLTrust(context, projectId, projectUrl, configuration)
}

/**
* This is an experimental API.
* @suppress
*/
@MIRACLTrustAuthenticatorApi
public suspend fun getUsers(context: Context): List<User> {
val userStorage =
defaultConfiguration?.userStorage ?: defaultUserStorage ?: synchronized(this) {
val userStorage = defaultConfiguration?.userStorage ?: defaultUserStorage

userStorage ?: RoomDatabaseModule(context, "").userStorage().also {
it.loadStorage()
defaultUserStorage = it
}
}

return withContext(Dispatchers.IO) {
try {
userStorage.all().map { it.toUser() }
} catch (ex: Exception) {
throw UserStorageException(ex)
}
}
}
//endregion
}

//region Properties
private val logger = configuration.logger
private val apiSettings: ApiSettings
private val verificator: Verificator
private val registrator: RegistratorContract
Expand All @@ -87,33 +170,35 @@ public class MIRACLTrust private constructor(
@VisibleForTesting
internal var resultHandlerDispatcher: CoroutineDispatcher = Dispatchers.Main

private val deviceName: String = configuration.deviceName
@VisibleForTesting
internal val deviceName: String = configuration.deviceName

/** Project ID setting for the application in the MIRACL Trust platform. */
public var projectId: String = configuration.projectId
public var projectId: String = projectId
private set

//endregion

//region Initialization
init {
logger = configuration.logger

val apiRequestExecutor = ApiRequestExecutor(
configuration.httpRequestExecutor,
KotlinxSerializationJsonUtil,
configuration.applicationInfo
)

val componentFactory = configuration.componentFactory ?: ComponentFactory(context)
apiSettings = ApiSettings(configuration.projectUrl)
val componentFactory = configuration.componentFactory ?: ComponentFactory(context, logger)
apiSettings = ApiSettings(projectUrl)

miraclTrustCoroutineContext = configuration.miraclCoroutineContext
miraclTrustScope = CoroutineScope(SupervisorJob() + configuration.miraclCoroutineContext)

userStorage = configuration.userStorage
?: componentFactory.defaultUserStorage(configuration.projectId)
userStorage.loadStorage()
userStorage = configuration.userStorage ?: defaultUserStorage ?: synchronized(this) {
defaultUserStorage ?: componentFactory.defaultUserStorage(projectId).also {
it.loadStorage()
defaultUserStorage = it
}
}

val registrationApi = RegistrationApiManager(
apiRequestExecutor = apiRequestExecutor,
Expand Down Expand Up @@ -1687,7 +1772,7 @@ public class MIRACLTrust private constructor(

//region Private
private fun logError(tag: String, exception: Exception) {
logger?.error(
logger.error(
tag,
LoggerConstants.FLOW_ERROR
.format(
Expand All @@ -1698,7 +1783,7 @@ public class MIRACLTrust private constructor(

private fun <T> T.logIfError(tag: String): T {
if (this is MIRACLError<*, *>) {
logger?.error(
logger.error(
tag,
LoggerConstants.FLOW_ERROR
.format(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.miracl.trust

/**
* This is an experimental API.
* @suppress
*/
@RequiresOptIn
@Retention(AnnotationRetention.BINARY)
public annotation class MIRACLTrustAuthenticatorApi
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import com.miracl.trust.session.SessionApi
import com.miracl.trust.storage.UserStorage
import com.miracl.trust.util.acquirePin
import com.miracl.trust.util.hexStringToByteArray
import com.miracl.trust.util.log.Loggable
import com.miracl.trust.util.log.Logger
import com.miracl.trust.util.log.LoggerConstants
import com.miracl.trust.util.toUserDto
import com.miracl.trust.util.toHexString
Expand Down Expand Up @@ -74,8 +74,9 @@ internal class Authenticator(
private val sessionApi: SessionApi,
private val crypto: Crypto,
private val registrator: RegistratorContract,
private val userStorage: UserStorage
) : AuthenticatorContract, Loggable {
private val userStorage: UserStorage,
private val logger: Logger
) : AuthenticatorContract {
companion object {
const val PUSH_NOTIFICATION_PROJECT_ID = "projectID"
const val PUSH_NOTIFICATION_USER_ID = "userID"
Expand Down Expand Up @@ -320,7 +321,7 @@ internal class Authenticator(
try {
userStorage.update(user.revoke().toUserDto())
} catch (ex: Exception) {
logger?.error(
logger.error(
LoggerConstants.AUTHENTICATOR_TAG,
LoggerConstants.AuthenticatorOperations.REVOKE_USER_ERROR.format(
ex
Expand All @@ -330,6 +331,6 @@ internal class Authenticator(
}

private fun logOperation(operation: String) {
logger?.info(LoggerConstants.AUTHENTICATOR_TAG, operation)
logger.info(LoggerConstants.AUTHENTICATOR_TAG, operation)
}
}
Loading
Loading