Unset all PGP signatures once

fiaxh created

... so they will be redone to match the changed status.

Change summary

src/main/java/eu/siacs/conversations/entities/Account.java            |  17 
src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java |  11 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java     | 142 
3 files changed, 96 insertions(+), 74 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Account.java 🔗

@@ -413,13 +413,13 @@ public class Account extends AbstractEntity {
 	}
 
 	public String getPgpSignature() {
-		if (keys.has(KEY_PGP_SIGNATURE)) {
-			try {
+		try {
+			if (keys.has(KEY_PGP_SIGNATURE) && !"null".equals(keys.getString(KEY_PGP_SIGNATURE))) {
 				return keys.getString(KEY_PGP_SIGNATURE);
-			} catch (final JSONException e) {
+			} else {
 				return null;
 			}
-		} else {
+		} catch (final JSONException e) {
 			return null;
 		}
 	}
@@ -433,6 +433,15 @@ public class Account extends AbstractEntity {
 		return true;
 	}
 
+	public boolean unsetPgpSignature() {
+		try {
+			keys.put(KEY_PGP_SIGNATURE, JSONObject.NULL);
+		} catch (JSONException e) {
+			return false;
+		}
+		return true;
+	}
+
 	public long getPgpId() {
 		if (keys.has(KEY_PGP_ID)) {
 			try {

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

@@ -43,7 +43,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 	private static DatabaseBackend instance = null;
 
 	private static final String DATABASE_NAME = "history";
-	private static final int DATABASE_VERSION = 20;
+	private static final int DATABASE_VERSION = 21;
 
 	private static String CREATE_CONTATCS_STATEMENT = "create table "
 			+ Contact.TABLENAME + "(" + Contact.ACCOUNT + " TEXT, "
@@ -335,6 +335,15 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		if (oldVersion < 18 && newVersion >= 18) {
 			db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN " + Message.READ + " NUMBER DEFAULT 1");
 		}
+
+		if (oldVersion < 21 && newVersion >= 21) {
+			List<Account> accounts = getAccounts(db);
+			for (Account account : accounts) {
+				account.unsetPgpSignature();
+				db.update(Account.TABLENAME, account.getContentValues(), Account.UUID
+						+ "=?", new String[]{account.getUuid()});
+			}
+		}
 	}
 
 	public static synchronized DatabaseBackend getInstance(Context context) {

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

@@ -1062,81 +1062,85 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
 		final ConversationActivity activity = (ConversationActivity) getActivity();
 		final XmppConnectionService xmppService = activity.xmppConnectionService;
 		final Contact contact = message.getConversation().getContact();
-		if (activity.hasPgp()) {
-			if (conversation.getMode() == Conversation.MODE_SINGLE) {
-				if (contact.getPgpKeyId() != 0) {
-					xmppService.getPgpEngine().hasKey(contact,
-							new UiCallback<Contact>() {
-
-								@Override
-								public void userInputRequried(PendingIntent pi,
-															  Contact contact) {
-									activity.runIntent(
-											pi,
-											ConversationActivity.REQUEST_ENCRYPT_MESSAGE);
-								}
-
-								@Override
-								public void success(Contact contact) {
-									messageSent();
-									activity.encryptTextMessage(message);
-								}
-
-								@Override
-								public void error(int error, Contact contact) {
+		if (!activity.hasPgp()) {
+			activity.showInstallPgpDialog();
+			return;
+		}
+		if (conversation.getAccount().getPgpSignature() == null) {
+			activity.announcePgp(conversation.getAccount(), conversation);
+			return;
+		}
+		if (conversation.getMode() == Conversation.MODE_SINGLE) {
+			if (contact.getPgpKeyId() != 0) {
+				xmppService.getPgpEngine().hasKey(contact,
+						new UiCallback<Contact>() {
+
+							@Override
+							public void userInputRequried(PendingIntent pi,
+														  Contact contact) {
+								activity.runIntent(
+										pi,
+										ConversationActivity.REQUEST_ENCRYPT_MESSAGE);
+							}
 
-								}
-							});
+							@Override
+							public void success(Contact contact) {
+								messageSent();
+								activity.encryptTextMessage(message);
+							}
 
-				} else {
-					showNoPGPKeyDialog(false,
-							new DialogInterface.OnClickListener() {
+							@Override
+							public void error(int error, Contact contact) {
+								System.out.println();
+							}
+						});
 
-								@Override
-								public void onClick(DialogInterface dialog,
-													int which) {
-									conversation
-											.setNextEncryption(Message.ENCRYPTION_NONE);
-									xmppService.databaseBackend
-											.updateConversation(conversation);
-									message.setEncryption(Message.ENCRYPTION_NONE);
-									xmppService.sendMessage(message);
-									messageSent();
-								}
-							});
-				}
 			} else {
-				if (conversation.getMucOptions().pgpKeysInUse()) {
-					if (!conversation.getMucOptions().everybodyHasKeys()) {
-						Toast warning = Toast
-								.makeText(getActivity(),
-										R.string.missing_public_keys,
-										Toast.LENGTH_LONG);
-						warning.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
-						warning.show();
-					}
-					activity.encryptTextMessage(message);
-					messageSent();
-				} else {
-					showNoPGPKeyDialog(true,
-							new DialogInterface.OnClickListener() {
-
-								@Override
-								public void onClick(DialogInterface dialog,
-													int which) {
-									conversation
-											.setNextEncryption(Message.ENCRYPTION_NONE);
-									message.setEncryption(Message.ENCRYPTION_NONE);
-									xmppService.databaseBackend
-											.updateConversation(conversation);
-									xmppService.sendMessage(message);
-									messageSent();
-								}
-							});
-				}
+				showNoPGPKeyDialog(false,
+						new DialogInterface.OnClickListener() {
+
+							@Override
+							public void onClick(DialogInterface dialog,
+												int which) {
+								conversation
+										.setNextEncryption(Message.ENCRYPTION_NONE);
+								xmppService.databaseBackend
+										.updateConversation(conversation);
+								message.setEncryption(Message.ENCRYPTION_NONE);
+								xmppService.sendMessage(message);
+								messageSent();
+							}
+						});
 			}
 		} else {
-			activity.showInstallPgpDialog();
+			if (conversation.getMucOptions().pgpKeysInUse()) {
+				if (!conversation.getMucOptions().everybodyHasKeys()) {
+					Toast warning = Toast
+							.makeText(getActivity(),
+									R.string.missing_public_keys,
+									Toast.LENGTH_LONG);
+					warning.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
+					warning.show();
+				}
+				activity.encryptTextMessage(message);
+				messageSent();
+			} else {
+				showNoPGPKeyDialog(true,
+						new DialogInterface.OnClickListener() {
+
+							@Override
+							public void onClick(DialogInterface dialog,
+												int which) {
+								conversation
+										.setNextEncryption(Message.ENCRYPTION_NONE);
+								message.setEncryption(Message.ENCRYPTION_NONE);
+								xmppService.databaseBackend
+										.updateConversation(conversation);
+								xmppService.sendMessage(message);
+								messageSent();
+							}
+						});
+			}
 		}
 	}