From 09c2fcb1c4a8c8476a344589c1d32eea52930f8a Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 24 Dec 2021 08:18:25 +0100 Subject: [PATCH] Allow converting to OAuth --- app/src/main/java/eu/faircode/email/DaoAccount.java | 11 +++++++---- app/src/main/java/eu/faircode/email/DaoIdentity.java | 9 +++++---- app/src/main/java/eu/faircode/email/EmailService.java | 4 ++-- .../main/java/eu/faircode/email/FragmentGmail.java | 7 ++++--- .../main/java/eu/faircode/email/FragmentOAuth.java | 7 ++++--- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoAccount.java b/app/src/main/java/eu/faircode/email/DaoAccount.java index 621b7b4cdb..481fac45f6 100644 --- a/app/src/main/java/eu/faircode/email/DaoAccount.java +++ b/app/src/main/java/eu/faircode/email/DaoAccount.java @@ -150,8 +150,8 @@ public interface DaoAccount { @Query("SELECT * FROM account" + " WHERE user = :user" + - " AND auth_type = :auth_type") - List getAccounts(String user, int auth_type); + " AND auth_type IN (:auth_type)") + List getAccounts(String user, int[] auth_type); @Query("SELECT * FROM account WHERE `primary`") EntityAccount getPrimaryAccount(); @@ -204,8 +204,11 @@ public interface DaoAccount { @Query("UPDATE account SET name = :name WHERE id = :id AND NOT (name IS :name)") int setAccountName(long id, String name); - @Query("UPDATE account SET password = :password WHERE id = :id AND NOT (password IS :password)") - int setAccountPassword(long id, String password); + @Query("UPDATE account" + + " SET password = :password, auth_type = :auth_type" + + " WHERE id = :id" + + " AND NOT (password IS :password AND auth_type = :auth_type)") + int setAccountPassword(long id, String password, int auth_type); @Query("UPDATE account SET last_connected = :last_connected WHERE id = :id AND NOT (last_connected IS :last_connected)") int setAccountConnected(long id, Long last_connected); diff --git a/app/src/main/java/eu/faircode/email/DaoIdentity.java b/app/src/main/java/eu/faircode/email/DaoIdentity.java index 12b7dd4db1..bc3a962cd0 100644 --- a/app/src/main/java/eu/faircode/email/DaoIdentity.java +++ b/app/src/main/java/eu/faircode/email/DaoIdentity.java @@ -111,12 +111,13 @@ public interface DaoIdentity { " AND host LIKE :domain") int setIdentityPassword(long account, String user, String password, String domain); - @Query("UPDATE identity SET password = :password" + + @Query("UPDATE identity" + + " SET password = :password, auth_type = :new_auth_type" + " WHERE account = :account" + " AND user = :user" + - " AND NOT (password IS :password)" + - " AND auth_type = :auth_type") - int setIdentityPassword(long account, String user, String password, int auth_type); + " AND auth_type = :auth_type" + + " AND NOT (password IS :password AND auth_type IS :new_auth_type)") + int setIdentityPassword(long account, String user, String password, int auth_type, int new_auth_type); @Query("UPDATE identity SET last_connected = :last_connected WHERE id = :id AND NOT (last_connected IS :last_connected)") int setIdentityConnected(long id, long last_connected); diff --git a/app/src/main/java/eu/faircode/email/EmailService.java b/app/src/main/java/eu/faircode/email/EmailService.java index 14b10f7579..e6757611de 100644 --- a/app/src/main/java/eu/faircode/email/EmailService.java +++ b/app/src/main/java/eu/faircode/email/EmailService.java @@ -330,8 +330,8 @@ public class EmailService implements AutoCloseable { public void onPasswordChanged(Context context, String newPassword) { DB db = DB.getInstance(context); account.password = newPassword; - int accounts = db.account().setAccountPassword(account.id, account.password); - int identities = db.identity().setIdentityPassword(account.id, account.user, account.password, account.auth_type); + int accounts = db.account().setAccountPassword(account.id, account.password, account.auth_type); + int identities = db.identity().setIdentityPassword(account.id, account.user, account.password, account.auth_type, account.auth_type); EntityLog.log(context, EntityLog.Type.Account, account, "token refreshed=" + accounts + "/" + identities); } diff --git a/app/src/main/java/eu/faircode/email/FragmentGmail.java b/app/src/main/java/eu/faircode/email/FragmentGmail.java index 4e45b03743..a771c0c617 100644 --- a/app/src/main/java/eu/faircode/email/FragmentGmail.java +++ b/app/src/main/java/eu/faircode/email/FragmentGmail.java @@ -23,6 +23,7 @@ import static android.accounts.AccountManager.newChooseAccountIntent; import static android.app.Activity.RESULT_OK; import static eu.faircode.email.GmailState.TYPE_GOOGLE; import static eu.faircode.email.ServiceAuthenticator.AUTH_TYPE_GMAIL; +import static eu.faircode.email.ServiceAuthenticator.AUTH_TYPE_PASSWORD; import android.Manifest; import android.accounts.Account; @@ -459,7 +460,7 @@ public class FragmentGmail extends FragmentBase { if (args.getBoolean("update")) { List accounts = - db.account().getAccounts(user, AUTH_TYPE_GMAIL); + db.account().getAccounts(user, new int[]{AUTH_TYPE_GMAIL, AUTH_TYPE_PASSWORD}); if (accounts != null && accounts.size() == 1) update = accounts.get(0); } @@ -536,8 +537,8 @@ public class FragmentGmail extends FragmentBase { args.putLong("account", update.id); EntityLog.log(context, "Gmail update account=" + update.name); db.account().setAccountSynchronize(update.id, true); - db.account().setAccountPassword(update.id, password); - db.identity().setIdentityPassword(update.id, update.user, password, update.auth_type); + db.account().setAccountPassword(update.id, password, AUTH_TYPE_GMAIL); + db.identity().setIdentityPassword(update.id, update.user, password, update.auth_type, AUTH_TYPE_GMAIL); } db.setTransactionSuccessful(); diff --git a/app/src/main/java/eu/faircode/email/FragmentOAuth.java b/app/src/main/java/eu/faircode/email/FragmentOAuth.java index 4e10437765..ea16f85f1c 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOAuth.java +++ b/app/src/main/java/eu/faircode/email/FragmentOAuth.java @@ -21,6 +21,7 @@ package eu.faircode.email; import static android.app.Activity.RESULT_OK; import static eu.faircode.email.ServiceAuthenticator.AUTH_TYPE_OAUTH; +import static eu.faircode.email.ServiceAuthenticator.AUTH_TYPE_PASSWORD; import android.content.ActivityNotFoundException; import android.content.Context; @@ -806,7 +807,7 @@ public class FragmentOAuth extends FragmentBase { if (args.getBoolean("update")) { List accounts = - db.account().getAccounts(username, AUTH_TYPE_OAUTH); + db.account().getAccounts(username, new int[]{AUTH_TYPE_OAUTH, AUTH_TYPE_PASSWORD}); if (accounts != null && accounts.size() == 1) update = accounts.get(0); } @@ -893,8 +894,8 @@ public class FragmentOAuth extends FragmentBase { args.putLong("account", update.id); EntityLog.log(context, "OAuth update account=" + update.name); db.account().setAccountSynchronize(update.id, true); - db.account().setAccountPassword(update.id, state); - db.identity().setIdentityPassword(update.id, update.user, state, update.auth_type); + db.account().setAccountPassword(update.id, state, AUTH_TYPE_OAUTH); + db.identity().setIdentityPassword(update.id, update.user, state, update.auth_type, AUTH_TYPE_OAUTH); } db.setTransactionSuccessful();