Skip to content

Commit

Permalink
Merge branch 'main' into app_auth
Browse files Browse the repository at this point in the history
# Conflicts:
#	.gitignore
#	account/src/main/kotlin/com/alfresco/content/account/Account.kt
#	account/src/main/kotlin/com/alfresco/content/account/SecureSharedPreferencesManager.kt
#	auth/build.gradle
#	auth/src/main/kotlin/com/alfresco/auth/activity/LoginViewModel.kt
#	auth/src/main/kotlin/com/alfresco/auth/activity/LogoutActivity.kt
#	auth/src/main/kotlin/com/alfresco/auth/config/DefaultAuthConfig.kt
#	component/src/main/java/com/alfresco/content/component/ComponentData.kt
#	gradle/libs.versions.toml
#	settings.gradle
  • Loading branch information
aman-alfresco committed Oct 28, 2024
2 parents 338d814 + 0948f42 commit 5a086cc
Show file tree
Hide file tree
Showing 327 changed files with 8,657 additions and 6,512 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up JDK 18
uses: actions/setup-java@v1
with:
java-version: 18

- uses: actions/cache@v2
- uses: actions/cache@v3
name: Cache gradle
with:
path: |
Expand All @@ -44,7 +44,7 @@ jobs:
run: ./gradlew assembleDebug

- name: Store Artifact
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: libs
path: ./app/build/outputs/apk/**/*.apk
8 changes: 6 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,12 @@ lint/reports/
app/google-services_1.json
app/google-services_2.json
/alfresco-auth/
/build-other.gradle
/gradle/libs.versions-app.toml
/gradle/libs.versions-other.toml
/alfresco-auth/
/build-app.gradle
/build-other.gradle
/alfresco-auth/
/gradle/libs.versions-app.toml
/gradle/libs.versions-other.toml
/build-app.gradle
/build-other.gradle
85 changes: 32 additions & 53 deletions account/src/main/kotlin/com/alfresco/content/account/Account.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,14 @@ data class Account(
val displayName: String? = null,
val email: String? = null,
val myFiles: String? = null,
val hostName: String? = null,
val clientId: String? = null,
) {
companion object {
private const val displayNameKey = "displayName"
private const val emailKey = "email"
private const val authTypeKey = "type"
private const val authConfigKey = "config"
private const val serverKey = "server"
private const val myFilesKey = "myFiles"
private const val hostNameKey = "auth0HostName"
private const val clientIdKey = "auth0ClientId"
private const val DISPLAY_NAME_KEY = "displayName"
private const val EMAIL_KEY = "email"
private const val AUTH_TYPE_KEY = "type"
private const val AUTH_CONFIG_KEY = "config"
private const val SERVER_KEY = "server"
private const val MY_FILES_KEY = "myFiles"

fun createAccount(
context: Context,
Expand All @@ -40,42 +36,29 @@ data class Account(
displayName: String,
email: String,
myFiles: String,
hostName: String,
clientId: String,
) {
val sharedSecure = SecureSharedPreferencesManager(context)

val b = Bundle()
b.putString(authTypeKey, authType)
b.putString(authConfigKey, authConfig)
b.putString(serverKey, serverUrl)
b.putString(displayNameKey, KEY_DISPLAY_NAME)
b.putString(emailKey, KEY_EMAIL)
b.putString(myFilesKey, myFiles)
b.putString(hostNameKey, hostName)
b.putString(clientIdKey, clientId)

val accountType = context.getString(R.string.android_auth_account_type)

val acc = AndroidAccount(id, accountType)
b.putString(AUTH_TYPE_KEY, authType)
b.putString(AUTH_CONFIG_KEY, authConfig)
b.putString(SERVER_KEY, serverUrl)
b.putString(DISPLAY_NAME_KEY, KEY_DISPLAY_NAME)
b.putString(EMAIL_KEY, KEY_EMAIL)
b.putString(MY_FILES_KEY, myFiles)
val acc = AndroidAccount(id, context.getString(R.string.android_auth_account_type))

// Save credentials securely using the SecureSharedPreferencesManager
sharedSecure.saveCredentials(email, authState, displayName, hostName, clientId)

val accountManager = AccountManager.get(context)
val accounts = accountManager.getAccountsByType(accountType)
sharedSecure.saveCredentials(email, authState, displayName)

val removeOtherAccounts = accounts.filter { it.name != id }

if (removeOtherAccounts.isNotEmpty()) {
removeOtherAccounts.forEach { account ->
accountManager.removeAccountExplicitly(account)
}
}
accountManager.addAccountExplicitly(acc, KEY_PASSWORD, b)
AccountManager.get(context).addAccountExplicitly(acc, KEY_PASSWORD, b)
}

fun update(context: Context, id: String, authState: String) {
fun update(
context: Context,
id: String,
authState: String,
) {
val am = AccountManager.get(context)
val acc = getAndroidAccount(context)
val sharedSecure = SecureSharedPreferencesManager(context)
Expand All @@ -93,29 +76,28 @@ data class Account(
displayName: String,
email: String,
myFiles: String,
hostName: String,
clientId: String,
) {
val sharedSecure = SecureSharedPreferencesManager(context)
val am = AccountManager.get(context)
val acc = getAndroidAccount(context)

// Save credentials securely using the SecureSharedPreferencesManager
sharedSecure.saveCredentials(email, authState, displayName, hostName, clientId)
sharedSecure.saveCredentials(email, authState, displayName)

am.setPassword(acc, KEY_PASSWORD)
am.setUserData(acc, displayNameKey, KEY_DISPLAY_NAME)
am.setUserData(acc, emailKey, KEY_EMAIL)
am.setUserData(acc, myFilesKey, myFiles)
am.setUserData(acc, hostNameKey, hostName)
am.setUserData(acc, clientIdKey, clientId)
am.setUserData(acc, DISPLAY_NAME_KEY, KEY_DISPLAY_NAME)
am.setUserData(acc, EMAIL_KEY, KEY_EMAIL)
am.setUserData(acc, MY_FILES_KEY, myFiles)

if (acc?.name != id) {
am.renameAccount(acc, id, null, null)
}
}

fun delete(context: Context, callback: () -> Unit) {
fun delete(
context: Context,
callback: () -> Unit,
) {
AccountManager.get(context)
.removeAccount(getAndroidAccount(context), null, {
callback()
Expand All @@ -130,18 +112,15 @@ data class Account(
val secureCredentials = sharedSecure.getSavedCredentials()
if (accountList.isNotEmpty() && secureCredentials != null) {
val acc = accountList[0]
val secureAuth0 = sharedSecure.getSavedAuth0Data()
return Account(
acc.name,
secureCredentials.second,
am.getUserData(acc, authTypeKey),
am.getUserData(acc, authConfigKey),
am.getUserData(acc, serverKey),
am.getUserData(acc, AUTH_TYPE_KEY),
am.getUserData(acc, AUTH_CONFIG_KEY),
am.getUserData(acc, SERVER_KEY),
secureCredentials.third,
secureCredentials.first,
am.getUserData(acc, myFilesKey),
secureAuth0?.first,
secureAuth0?.second,
am.getUserData(acc, MY_FILES_KEY),
)
}
return null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import android.os.Bundle

class Authenticator(context: Context) :
AbstractAccountAuthenticator(context) {

override fun getAuthTokenLabel(authTokenType: String?): String {
throw UnsupportedOperationException()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import android.os.IBinder
* when started.
*/
class AuthenticatorService : Service() {

private lateinit var authenticator: Authenticator

override fun onCreate() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,30 @@ import androidx.security.crypto.MasterKey
* Marked as SecureSharedPreferencesManager
*/
class SecureSharedPreferencesManager(private val context: Context) {

private val masterKey: MasterKey = MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()

fun saveCredentials(email: String, password: String, displayName: String, auth0HostName: String, auth0ClientId: String) {
private val masterKey: MasterKey =
MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()

fun saveCredentials(
email: String,
password: String,
displayName: String,
) {
try {
val encryptedSharedPreferences = EncryptedSharedPreferences.create(
context,
KEY_PREF_NAME,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,
)
val encryptedSharedPreferences =
EncryptedSharedPreferences.create(
context,
KEY_PREF_NAME,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,
)

encryptedSharedPreferences.edit()
.putString(KEY_EMAIL, email)
.putString(KEY_DISPLAY_NAME, displayName)
.putString(KEY_PASSWORD, password)
.putString(KEY_HOST_NAME, auth0HostName)
.putString(KEY_CLIENT_ID, auth0ClientId)
.apply()

Log.d(TAG, "Credentials saved securely")
Expand All @@ -40,13 +43,14 @@ class SecureSharedPreferencesManager(private val context: Context) {

fun savePassword(password: String) {
try {
val encryptedSharedPreferences = EncryptedSharedPreferences.create(
context,
KEY_PREF_NAME,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,
)
val encryptedSharedPreferences =
EncryptedSharedPreferences.create(
context,
KEY_PREF_NAME,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,
)

encryptedSharedPreferences.edit()
.putString(KEY_PASSWORD, password)
Expand All @@ -60,13 +64,14 @@ class SecureSharedPreferencesManager(private val context: Context) {

fun getSavedCredentials(): Triple<String, String, String>? {
try {
val encryptedSharedPreferences = EncryptedSharedPreferences.create(
context,
KEY_PREF_NAME,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,
)
val encryptedSharedPreferences =
EncryptedSharedPreferences.create(
context,
KEY_PREF_NAME,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,
)

val email = encryptedSharedPreferences.getString(KEY_EMAIL, null)
val password = encryptedSharedPreferences.getString(KEY_PASSWORD, null)
Expand All @@ -82,36 +87,11 @@ class SecureSharedPreferencesManager(private val context: Context) {
return null
}

fun getSavedAuth0Data(): Pair<String, String>? {
try {
val encryptedSharedPreferences = EncryptedSharedPreferences.create(
context,
KEY_PREF_NAME,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,
)

val hostName = encryptedSharedPreferences.getString(KEY_HOST_NAME, null)
val clientId = encryptedSharedPreferences.getString(KEY_CLIENT_ID, null)

if (hostName != null && clientId != null) {
return Pair(hostName, clientId)
}
} catch (e: Exception) {
Log.e(TAG, "Error retrieving credentials: ${e.message}")
}

return null
}

companion object {
const val KEY_DISPLAY_NAME = "display_name"
const val KEY_EMAIL = "email"
const val KEY_PASSWORD = "password"
const val KEY_PREF_NAME = "secure_prefs"
const val KEY_HOST_NAME = "host_name"
const val KEY_CLIENT_ID = "client_id"

val TAG: String = SecureSharedPreferencesManager::class.java.simpleName
}
Expand Down
9 changes: 5 additions & 4 deletions actions/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
plugins{
id('com.android.library')
id('kotlin-android')
id('kotlin-kapt')
id 'com.android.library'
id 'kotlin-android'
// id('kotlin-kapt')
id 'com.google.devtools.ksp'
}

android {
Expand Down Expand Up @@ -35,7 +36,7 @@ dependencies {
implementation libs.epoxy.core
implementation libs.mavericks

kapt libs.epoxy.processor
ksp libs.epoxy.processor

// Testing
testImplementation libs.junit
Expand Down
Loading

0 comments on commit 5a086cc

Please sign in to comment.