expert 'setting' to remove omemo identity. fixes #2038

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java |  3 
src/main/java/eu/siacs/conversations/ui/SettingsActivity.java         | 62 
src/main/res/values/strings.xml                                       |  3 
src/main/res/xml/preferences.xml                                      |  4 
4 files changed, 68 insertions(+), 4 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java 🔗

@@ -1184,9 +1184,6 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		storeIdentityKey(account, account.getJid().toBareJid().toString(), true, identityKeyPair.getPublicKey().getFingerprint().replaceAll("\\s", ""), Base64.encodeToString(identityKeyPair.serialize(), Base64.DEFAULT), XmppAxolotlSession.Trust.TRUSTED);
 	}
 
-	public void recreateAxolotlDb() {
-		recreateAxolotlDb(getWritableDatabase());
-	}
 
 	public void recreateAxolotlDb(SQLiteDatabase db) {
 		Log.d(Config.LOGTAG, AxolotlService.LOGPREFIX + " : " + ">>> (RE)CREATING AXOLOTL DATABASE <<<");

src/main/java/eu/siacs/conversations/ui/SettingsActivity.java 🔗

@@ -29,6 +29,8 @@ import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Account;
 import eu.siacs.conversations.services.ExportLogsService;
 import eu.siacs.conversations.xmpp.XmppConnection;
+import eu.siacs.conversations.xmpp.jid.InvalidJidException;
+import eu.siacs.conversations.xmpp.jid.Jid;
 
 public class SettingsActivity extends XmppActivity implements
 		OnSharedPreferenceChangeListener {
@@ -91,7 +93,7 @@ public class SettingsActivity extends XmppActivity implements
 					displayToast(getString(R.string.toast_no_trusted_certs));
 					return true;
 				}
-				final ArrayList selectedItems = new ArrayList<Integer>();
+				final ArrayList selectedItems = new ArrayList<>();
 				final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(SettingsActivity.this);
 				dialogBuilder.setTitle(getResources().getString(R.string.dialog_manage_certs_title));
 				dialogBuilder.setMultiChoiceItems(aliases.toArray(new CharSequence[aliases.size()]), null,
@@ -151,6 +153,64 @@ public class SettingsActivity extends XmppActivity implements
 				return true;
 			}
 		});
+
+		final Preference deleteOmemoPreference = mSettingsFragment.findPreference("delete_omemo_identities");
+		deleteOmemoPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+			@Override
+			public boolean onPreferenceClick(Preference preference) {
+				deleteOmemoIdentities();
+				return true;
+			}
+		});
+	}
+
+	private void deleteOmemoIdentities() {
+		AlertDialog.Builder builder = new AlertDialog.Builder(this);
+		builder.setTitle(R.string.pref_delete_omemo_identities);
+		final List<CharSequence> accounts = new ArrayList<>();
+		for(Account account : xmppConnectionService.getAccounts()) {
+			if (!account.isOptionSet(Account.OPTION_DISABLED)) {
+				accounts.add(account.getJid().toBareJid().toString());
+			}
+		}
+		final boolean[] checkedItems = new boolean[accounts.size()];
+		builder.setMultiChoiceItems(accounts.toArray(new CharSequence[accounts.size()]), checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
+			@Override
+			public void onClick(DialogInterface dialog, int which, boolean isChecked) {
+				checkedItems[which] = isChecked;
+				final AlertDialog alertDialog = (AlertDialog) dialog;
+				for(boolean item : checkedItems) {
+					if (item) {
+						alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true);
+						return;
+					}
+				}
+				alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false);
+			}
+		});
+		builder.setNegativeButton(R.string.cancel,null);
+		builder.setPositiveButton(R.string.delete_selected_keys, new DialogInterface.OnClickListener() {
+			@Override
+			public void onClick(DialogInterface dialog, int which) {
+				for(int i = 0; i < checkedItems.length; ++i) {
+					if (checkedItems[i]) {
+						try {
+							Jid jid = Jid.fromString(accounts.get(i).toString());
+							Account account = xmppConnectionService.findAccountByJid(jid);
+							if (account != null) {
+								account.getAxolotlService().regenerateKeys(true);
+							}
+						} catch (InvalidJidException e) {
+							//
+						}
+
+					}
+				}
+			}
+		});
+		AlertDialog dialog = builder.create();
+		dialog.show();
+		dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
 	}
 
 	@Override

src/main/res/values/strings.xml 🔗

@@ -687,4 +687,7 @@
 	<string name="wrong_conference_configuration">This is not a private, non-anonymous conference.</string>
 	<string name="this_conference_has_no_members">There are no members in this conference.</string>
 	<string name="report_jid_as_spammer">Report this JID as sending unwanted messages.</string>
+	<string name="pref_delete_omemo_identities">Delete OMEMO identities</string>
+	<string name="pref_delete_omemo_identities_summary">Regenerate your OMEMO keys. All your contacts will have to verify you again. Use this only as a last resort.</string>
+	<string name="delete_selected_keys">Delete selected keys</string>
 </resources>

src/main/res/xml/preferences.xml 🔗

@@ -183,6 +183,10 @@
                     android:key="allow_message_correction"
                     android:title="@string/pref_allow_message_correction"
                     android:summary="@string/pref_allow_message_correction_summary"/>
+                <Preference
+                    android:key="delete_omemo_identities"
+                    android:title="@string/pref_delete_omemo_identities"
+                    android:summary="@string/pref_delete_omemo_identities_summary"/>
             </PreferenceCategory>
             <PreferenceCategory
                 android:key="connection_options"