diff --git a/smack-openpgp-bouncycastle/src/main/java/org/jivesoftware/smackx/ox/bouncycastle/PainlessOpenPgpProvider.java b/smack-openpgp-bouncycastle/src/main/java/org/jivesoftware/smackx/ox/bouncycastle/PainlessOpenPgpProvider.java index 297b25a6e..c19287b29 100644 --- a/smack-openpgp-bouncycastle/src/main/java/org/jivesoftware/smackx/ox/bouncycastle/PainlessOpenPgpProvider.java +++ b/smack-openpgp-bouncycastle/src/main/java/org/jivesoftware/smackx/ox/bouncycastle/PainlessOpenPgpProvider.java @@ -409,7 +409,12 @@ public class PainlessOpenPgpProvider implements OpenPgpProvider { throw new SmackOpenPgpException("Could not create SecretKeyRingCollection from SecretKeyRing.", e); } } else { - secretKeyRings = PGPSecretKeyRingCollection.addSecretKeyRing(secretKeyRings, secretKeys); + try { + secretKeyRings = PGPSecretKeyRingCollection.addSecretKeyRing(secretKeyRings, secretKeys); + } catch (IllegalArgumentException e) { + LOGGER.log(Level.INFO, "Skip key " + Long.toHexString(secretKeys.getPublicKey().getKeyID()) + + " as it is already part of the key ring."); + } } getStore().storeSecretKeyRing(owner, secretKeyRings); diff --git a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpManager.java b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpManager.java index 8d80c0327..4134a0989 100644 --- a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpManager.java +++ b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/OpenPgpManager.java @@ -339,7 +339,7 @@ public final class OpenPgpManager extends Manager { SecretKeyRestoreSelectionCallback selectionCallback) throws InterruptedException, PubSubException.NotALeafNodeException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, SmackException.NoResponseException, SmackOpenPgpException, - InvalidBackupCodeException, SmackException.NotLoggedInException { + InvalidBackupCodeException, SmackException.NotLoggedInException, IOException, MissingUserIdOnKeyException { throwIfNoProviderSet(); throwIfNotAuthenticated(); SecretkeyElement backup = PubSubDelegate.fetchSecretKey(connection()); @@ -348,7 +348,8 @@ public final class OpenPgpManager extends Manager { return; } byte[] encrypted = Base64.decode(backup.getB64Data()); - // provider.restoreSecretKeyBackup(backup, codeCallback.askForBackupCode(), selectionCallback); + byte[] decrypted = provider.symmetricallyDecryptWithPassword(encrypted, codeCallback.askForBackupCode()); + provider.importSecretKey(connection().getUser().asBareJid(), decrypted); // TODO: catch InvalidBackupCodeException in order to prevent re-fetching the backup on next try. }