package org.mercury_im.messenger.core.crypto; import org.jivesoftware.smack.AbstractConnectionListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smackx.ox.OpenPgpManager; import org.jivesoftware.smackx.ox.crypto.OpenPgpProvider; import org.jivesoftware.smackx.ox.exception.InvalidBackupCodeException; import org.jivesoftware.smackx.ox.exception.NoBackupFoundException; import org.jivesoftware.smackx.ox_im.OXInstantMessagingManager; import org.jivesoftware.smackx.pubsub.PubSubException; import org.mercury_im.messenger.core.xmpp.MercuryConnection; import java.util.logging.Level; import java.util.logging.Logger; import javax.inject.Inject; public class MercuryOpenPgpManager { private static final Logger LOGGER = Logger.getLogger(MercuryOpenPgpManager.class.getName()); private final OpenPgpProvider openPgpProvider; @Inject public MercuryOpenPgpManager(OpenPgpProvider openPgpProvider) { this.openPgpProvider = openPgpProvider; } public void initialize(MercuryConnection connection) { if (connection.getConnection().isAuthenticated()) { setup(connection); } else { connection.getConnection().addConnectionListener(new AbstractConnectionListener() { @Override public void authenticated(XMPPConnection con, boolean resumed) { if (!resumed) { setup(connection); } } }); } } private void setup(MercuryConnection connection) { try { OpenPgpManager oxManager = OpenPgpManager.getInstanceFor(connection.getConnection()); oxManager.setOpenPgpProvider(openPgpProvider); if (!oxManager.hasSecretKeysAvailable()) { try { oxManager.restoreSecretKeyServerBackup( //() -> "RW8X-367S-A2C3-QYAL-VG6E-Z2IM"); () -> "KISJ-5Z1T-FGDW-WMDK-SC2U-SQUA"); LOGGER.log(Level.INFO, "Successfully restored secret key backup!"); } catch (NoBackupFoundException | PubSubException.NotALeafNodeException | InvalidBackupCodeException e) { LOGGER.log(Level.INFO, "Error restoring secret key backup.", e); oxManager.generateAndImportKeyPair(connection.getAccount().getJid()); oxManager.backupSecretKeyToServer( backupCode -> LOGGER.log(Level.INFO, "OpenPGP Backup Code: " + backupCode), availableSecretKeys -> availableSecretKeys); } } oxManager.announceSupportAndPublish(); OXInstantMessagingManager oximManager = OXInstantMessagingManager.getInstanceFor(connection.getConnection()); oximManager.announceSupportForOxInstantMessaging(); } catch (Exception e) { e.printStackTrace(); } } }