Loading app/src/main/java/foundation/e/accountmanager/DavService.kt +6 −5 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import foundation.e.accountmanager.model.Collection import foundation.e.accountmanager.settings.AccountSettings import foundation.e.accountmanager.ui.DebugInfoActivity import foundation.e.accountmanager.ui.NotificationUtils import net.openid.appauth.AuthState import okhttp3.HttpUrl import okhttp3.OkHttpClient import java.lang.ref.WeakReference Loading Loading @@ -154,7 +155,7 @@ class DavService: android.app.Service() { * @throws HttpException * @throws foundation.e.dav4jvm.exception.DavException */ fun queryHomeSets(client: OkHttpClient, url: HttpUrl, accessToken: String, recurse: Boolean = true) { fun queryHomeSets(client: OkHttpClient, url: HttpUrl, accessToken: String?, recurse: Boolean = true) { val related = mutableSetOf<HttpUrl>() fun findRelated(root: HttpUrl, dav: Response) { Loading Loading @@ -272,12 +273,12 @@ class DavService: android.app.Service() { .build().use { client -> val httpClient = client.okHttpClient val accessToken = service.accessToken val authState = service.authState // refresh home set list (from principal) service.principal?.let { principalUrl -> Logger.log.fine("Querying principal $principalUrl for home sets") queryHomeSets(httpClient, principalUrl, accessToken) queryHomeSets(httpClient, principalUrl, AuthState.jsonDeserialize(authState).accessToken) } // now refresh homesets and their member collections Loading @@ -287,7 +288,7 @@ class DavService: android.app.Service() { Logger.log.fine("Listing home set ${homeSet.key}") try { DavResource(httpClient, homeSet.key, accessToken).propfind(1, *DAV_COLLECTION_PROPERTIES) { response, relation -> DavResource(httpClient, homeSet.key, AuthState.jsonDeserialize(authState).accessToken).propfind(1, *DAV_COLLECTION_PROPERTIES) { response, relation -> if (!response.isSuccess()) return@propfind Loading Loading @@ -321,7 +322,7 @@ class DavService: android.app.Service() { val (url, info) = itCollections.next() if (!info.confirmed) try { DavResource(httpClient, url, accessToken).propfind(0, *DAV_COLLECTION_PROPERTIES) { response, _ -> DavResource(httpClient, url, AuthState.jsonDeserialize(authState).accessToken).propfind(0, *DAV_COLLECTION_PROPERTIES) { response, _ -> if (!response.isSuccess()) return@propfind Loading app/src/main/java/foundation/e/accountmanager/model/AppDatabase.kt +2 −3 Original line number Diff line number Diff line Loading @@ -114,13 +114,12 @@ abstract class AppDatabase: RoomDatabase() { "CREATE TABLE service(" + "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + "accountName TEXT NOT NULL," + "accessToken TEXT ," + "refreshToken TEXT ," + "authState TEXT ," + "type TEXT NOT NULL," + "principal TEXT DEFAULT NULL" + ")", "CREATE UNIQUE INDEX index_service_accountName_type ON service(accountName, type)", "INSERT INTO service(id, accountName, accessToken, refreshToken, type, principal) SELECT _id, accountName, accessToken, refreshToken, service, principal FROM services", "INSERT INTO service(id, accountName, authState, type, principal) SELECT _id, accountName, authState, service, principal FROM services", "DROP TABLE services", // migrate "homesets" to "homeset": rename columns, make id NOT NULL Loading app/src/main/java/foundation/e/accountmanager/model/Credentials.kt +4 −4 Original line number Diff line number Diff line Loading @@ -8,11 +8,12 @@ package foundation.e.accountmanager.model import net.openid.appauth.AuthState class Credentials( val userName: String? = null, val password: String? = null, val accessToken: String? = null, val refreshToken: String? = null, val authState: AuthState? = null, val certificateAlias: String? = null ) { Loading @@ -28,8 +29,7 @@ class Credentials( type = when { !certificateAlias.isNullOrEmpty() -> Type.ClientCertificate !userName.isNullOrEmpty() && !accessToken.isNullOrEmpty() && !refreshToken.isNullOrEmpty() -> !userName.isNullOrEmpty() && (authState != null) -> Type.OAuth !userName.isNullOrEmpty() && !password.isNullOrEmpty() -> Type.UsernamePassword Loading app/src/main/java/foundation/e/accountmanager/model/Service.kt +1 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,7 @@ data class Service( var accountName: String, var accessToken: String, var refreshToken: String, var authState: String, var type: String, var principal: HttpUrl? Loading app/src/main/java/foundation/e/accountmanager/settings/AccountSettings.kt +19 −11 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import foundation.e.ical4android.TaskProvider import foundation.e.ical4android.TaskProvider.ProviderName.OpenTasks import foundation.e.vcard4android.ContactsStorageException import foundation.e.vcard4android.GroupMethod import net.openid.appauth.AuthState import okhttp3.HttpUrl import org.apache.commons.lang3.StringUtils import org.dmfs.tasks.contract.TaskContract Loading @@ -55,8 +56,7 @@ class AccountSettings( const val KEY_SETTINGS_VERSION = "version" const val KEY_USERNAME = "user_name" const val KEY_ACCESS_TOKEN = "access_token" const val KEY_REFRESH_TOKEN = "refresh_token" const val KEY_AUTH_STATE = "auth_state" const val KEY_CERTIFICATE_ALIAS = "certificate_alias" const val KEY_WIFI_ONLY = "wifi_only" // sync on WiFi only (default: false) Loading Loading @@ -106,8 +106,7 @@ class AccountSettings( bundle.putString(KEY_USERNAME, credentials.userName) Credentials.Type.OAuth -> { bundle.putString(KEY_USERNAME, credentials.userName) bundle.putString(KEY_ACCESS_TOKEN, credentials.accessToken) bundle.putString(KEY_REFRESH_TOKEN, credentials.refreshToken) bundle.putString(KEY_AUTH_STATE, credentials.authState!!.jsonSerializeString()) } Credentials.Type.ClientCertificate -> bundle.putString(KEY_CERTIFICATE_ALIAS, credentials.certificateAlias) Loading Loading @@ -140,13 +139,22 @@ class AccountSettings( // authentication settings fun credentials() = Credentials( fun credentials(): Credentials { if (accountManager.getUserData(account, KEY_AUTH_STATE).isNullOrEmpty()) { return Credentials( accountManager.getUserData(account, KEY_USERNAME), accountManager.getPassword(account), accountManager.getUserData(account, KEY_ACCESS_TOKEN), accountManager.getUserData(account, KEY_REFRESH_TOKEN), accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS) ) null, accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS)) } else { return Credentials( accountManager.getUserData(account, KEY_USERNAME), accountManager.getPassword(account), AuthState.jsonDeserialize(accountManager.getUserData(account, KEY_AUTH_STATE)), accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS)) } } fun credentials(credentials: Credentials) { accountManager.setUserData(account, KEY_USERNAME, credentials.userName) Loading Loading
app/src/main/java/foundation/e/accountmanager/DavService.kt +6 −5 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import foundation.e.accountmanager.model.Collection import foundation.e.accountmanager.settings.AccountSettings import foundation.e.accountmanager.ui.DebugInfoActivity import foundation.e.accountmanager.ui.NotificationUtils import net.openid.appauth.AuthState import okhttp3.HttpUrl import okhttp3.OkHttpClient import java.lang.ref.WeakReference Loading Loading @@ -154,7 +155,7 @@ class DavService: android.app.Service() { * @throws HttpException * @throws foundation.e.dav4jvm.exception.DavException */ fun queryHomeSets(client: OkHttpClient, url: HttpUrl, accessToken: String, recurse: Boolean = true) { fun queryHomeSets(client: OkHttpClient, url: HttpUrl, accessToken: String?, recurse: Boolean = true) { val related = mutableSetOf<HttpUrl>() fun findRelated(root: HttpUrl, dav: Response) { Loading Loading @@ -272,12 +273,12 @@ class DavService: android.app.Service() { .build().use { client -> val httpClient = client.okHttpClient val accessToken = service.accessToken val authState = service.authState // refresh home set list (from principal) service.principal?.let { principalUrl -> Logger.log.fine("Querying principal $principalUrl for home sets") queryHomeSets(httpClient, principalUrl, accessToken) queryHomeSets(httpClient, principalUrl, AuthState.jsonDeserialize(authState).accessToken) } // now refresh homesets and their member collections Loading @@ -287,7 +288,7 @@ class DavService: android.app.Service() { Logger.log.fine("Listing home set ${homeSet.key}") try { DavResource(httpClient, homeSet.key, accessToken).propfind(1, *DAV_COLLECTION_PROPERTIES) { response, relation -> DavResource(httpClient, homeSet.key, AuthState.jsonDeserialize(authState).accessToken).propfind(1, *DAV_COLLECTION_PROPERTIES) { response, relation -> if (!response.isSuccess()) return@propfind Loading Loading @@ -321,7 +322,7 @@ class DavService: android.app.Service() { val (url, info) = itCollections.next() if (!info.confirmed) try { DavResource(httpClient, url, accessToken).propfind(0, *DAV_COLLECTION_PROPERTIES) { response, _ -> DavResource(httpClient, url, AuthState.jsonDeserialize(authState).accessToken).propfind(0, *DAV_COLLECTION_PROPERTIES) { response, _ -> if (!response.isSuccess()) return@propfind Loading
app/src/main/java/foundation/e/accountmanager/model/AppDatabase.kt +2 −3 Original line number Diff line number Diff line Loading @@ -114,13 +114,12 @@ abstract class AppDatabase: RoomDatabase() { "CREATE TABLE service(" + "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + "accountName TEXT NOT NULL," + "accessToken TEXT ," + "refreshToken TEXT ," + "authState TEXT ," + "type TEXT NOT NULL," + "principal TEXT DEFAULT NULL" + ")", "CREATE UNIQUE INDEX index_service_accountName_type ON service(accountName, type)", "INSERT INTO service(id, accountName, accessToken, refreshToken, type, principal) SELECT _id, accountName, accessToken, refreshToken, service, principal FROM services", "INSERT INTO service(id, accountName, authState, type, principal) SELECT _id, accountName, authState, service, principal FROM services", "DROP TABLE services", // migrate "homesets" to "homeset": rename columns, make id NOT NULL Loading
app/src/main/java/foundation/e/accountmanager/model/Credentials.kt +4 −4 Original line number Diff line number Diff line Loading @@ -8,11 +8,12 @@ package foundation.e.accountmanager.model import net.openid.appauth.AuthState class Credentials( val userName: String? = null, val password: String? = null, val accessToken: String? = null, val refreshToken: String? = null, val authState: AuthState? = null, val certificateAlias: String? = null ) { Loading @@ -28,8 +29,7 @@ class Credentials( type = when { !certificateAlias.isNullOrEmpty() -> Type.ClientCertificate !userName.isNullOrEmpty() && !accessToken.isNullOrEmpty() && !refreshToken.isNullOrEmpty() -> !userName.isNullOrEmpty() && (authState != null) -> Type.OAuth !userName.isNullOrEmpty() && !password.isNullOrEmpty() -> Type.UsernamePassword Loading
app/src/main/java/foundation/e/accountmanager/model/Service.kt +1 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,7 @@ data class Service( var accountName: String, var accessToken: String, var refreshToken: String, var authState: String, var type: String, var principal: HttpUrl? Loading
app/src/main/java/foundation/e/accountmanager/settings/AccountSettings.kt +19 −11 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import foundation.e.ical4android.TaskProvider import foundation.e.ical4android.TaskProvider.ProviderName.OpenTasks import foundation.e.vcard4android.ContactsStorageException import foundation.e.vcard4android.GroupMethod import net.openid.appauth.AuthState import okhttp3.HttpUrl import org.apache.commons.lang3.StringUtils import org.dmfs.tasks.contract.TaskContract Loading @@ -55,8 +56,7 @@ class AccountSettings( const val KEY_SETTINGS_VERSION = "version" const val KEY_USERNAME = "user_name" const val KEY_ACCESS_TOKEN = "access_token" const val KEY_REFRESH_TOKEN = "refresh_token" const val KEY_AUTH_STATE = "auth_state" const val KEY_CERTIFICATE_ALIAS = "certificate_alias" const val KEY_WIFI_ONLY = "wifi_only" // sync on WiFi only (default: false) Loading Loading @@ -106,8 +106,7 @@ class AccountSettings( bundle.putString(KEY_USERNAME, credentials.userName) Credentials.Type.OAuth -> { bundle.putString(KEY_USERNAME, credentials.userName) bundle.putString(KEY_ACCESS_TOKEN, credentials.accessToken) bundle.putString(KEY_REFRESH_TOKEN, credentials.refreshToken) bundle.putString(KEY_AUTH_STATE, credentials.authState!!.jsonSerializeString()) } Credentials.Type.ClientCertificate -> bundle.putString(KEY_CERTIFICATE_ALIAS, credentials.certificateAlias) Loading Loading @@ -140,13 +139,22 @@ class AccountSettings( // authentication settings fun credentials() = Credentials( fun credentials(): Credentials { if (accountManager.getUserData(account, KEY_AUTH_STATE).isNullOrEmpty()) { return Credentials( accountManager.getUserData(account, KEY_USERNAME), accountManager.getPassword(account), accountManager.getUserData(account, KEY_ACCESS_TOKEN), accountManager.getUserData(account, KEY_REFRESH_TOKEN), accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS) ) null, accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS)) } else { return Credentials( accountManager.getUserData(account, KEY_USERNAME), accountManager.getPassword(account), AuthState.jsonDeserialize(accountManager.getUserData(account, KEY_AUTH_STATE)), accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS)) } } fun credentials(credentials: Credentials) { accountManager.setUserData(account, KEY_USERNAME, credentials.userName) Loading