diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsActivity.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsActivity.java index b45ad94..36c6670 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsActivity.java @@ -8,7 +8,11 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import org.mercury_im.messenger.R; +import org.mercury_im.messenger.android.crypto.ikey.IkeyBackupCreationFragment; import org.mercury_im.messenger.android.ui.MercuryActivity; +import org.mercury_im.messenger.android.ui.account.login.IkeyBackupRestoreOrSkipFragment; +import org.mercury_im.messenger.android.ui.account.login.IkeyKeyInfoFragment; +import org.mercury_im.messenger.android.ui.account.login.IkeySetupNavigator; import org.mercury_im.messenger.android.util.ArgumentUtils; import java.util.UUID; @@ -17,7 +21,7 @@ import butterknife.BindView; import butterknife.ButterKnife; import lombok.Value; -public class AccountDetailsActivity extends AppCompatActivity implements MercuryActivity { +public class AccountDetailsActivity extends AppCompatActivity implements MercuryActivity, IkeySetupNavigator { public static final String EXTRA_ACCOUNT_ID = "ACCOUNT_ID"; @@ -54,6 +58,34 @@ public class AccountDetailsActivity extends AppCompatActivity implements Mercury return new Arguments(accountId); } + @Override + public void setupIkey(UUID accountId) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragment, IkeyBackupRestoreOrSkipFragment.newInstance(accountId), "setup_ikey") + .commit(); + } + + @Override + public void restoreSuccessful(UUID accountId) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragment, IkeyKeyInfoFragment.newInstance(accountId), "ikey_success") + .commit(); + } + + @Override + public void generateIkeyBackup(UUID accountId) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragment, IkeyBackupCreationFragment.newInstance(accountId), "backup") + .commit(); + } + + @Override + public void displayInfo(UUID accountId) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragment, IkeyKeyInfoFragment.newInstance(accountId), "info") + .commit(); + } + @Value private class Arguments { UUID accountId; diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsFragment.java index 984bdb2..5007ee8 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsFragment.java @@ -24,6 +24,7 @@ import com.google.android.material.card.MaterialCardView; import org.mercury_im.messenger.R; import org.mercury_im.messenger.android.MercuryImApplication; import org.mercury_im.messenger.android.crypto.ikey.IkeyBackupCreationFragment; +import org.mercury_im.messenger.android.ui.account.login.IkeySetupFragment; import org.mercury_im.messenger.android.ui.openpgp.ToggleableFingerprintsAdapter; import org.mercury_im.messenger.android.ui.openpgp.OpenPgpV4FingerprintFormatter; import org.mercury_im.messenger.core.util.Optional; @@ -131,11 +132,11 @@ public class AccountDetailsFragment extends Fragment { viewModel.onRestoreIkeyBackup(); return true; - // case R.id.action_setup_ikey: - // getParentFragmentManager().beginTransaction() - // .replace(R.id.fragment, IkeySetupFragment.newInstance(accountId)) - // .commit(); - // return true; + case R.id.action_setup_ikey: + getParentFragmentManager().beginTransaction() + .replace(R.id.fragment, IkeySetupFragment.newInstance(accountId)) + .commit(); + return true; } return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountActivity.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountActivity.java index 597689c..e3ea5fd 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountActivity.java @@ -26,7 +26,7 @@ import butterknife.BindView; import butterknife.ButterKnife; import lombok.Getter; -public class AddAccountActivity extends AppCompatActivity { +public class AddAccountActivity extends AppCompatActivity implements IkeySetupNavigator { @BindView(R.id.viewpager) ViewPager2 viewPager; @@ -58,6 +58,7 @@ public class AddAccountActivity extends AppCompatActivity { } } + @Override public void setupIkey(UUID accountId) { int nextPos = pagerAdapter.getItemCount(); pagerAdapter.getFragments().put(nextPos, IkeyBackupRestoreOrSkipFragment.newInstance(accountId)); @@ -65,6 +66,7 @@ public class AddAccountActivity extends AppCompatActivity { viewPager.setCurrentItem(nextPos); } + @Override public void restoreSuccessful(UUID accountId) { int nextPos = pagerAdapter.getItemCount(); pagerAdapter.getFragments().put(nextPos, IkeyKeyInfoFragment.newInstance(accountId)); @@ -72,6 +74,7 @@ public class AddAccountActivity extends AppCompatActivity { viewPager.setCurrentItem(nextPos); } + @Override public void generateIkeyBackup(UUID accountId) { int nextPos = pagerAdapter.getItemCount(); pagerAdapter.getFragments().put(nextPos, IkeyBackupCreationFragment.newInstance(accountId)); @@ -79,6 +82,7 @@ public class AddAccountActivity extends AppCompatActivity { viewPager.setCurrentItem(nextPos); } + @Override public void displayInfo(UUID accountId) { int nextPos = pagerAdapter.getItemCount(); pagerAdapter.getFragments().put(nextPos, IkeyKeyInfoFragment.newInstance(accountId)); diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupRestoreOrSkipFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupRestoreOrSkipFragment.java index aa3586e..96b856e 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupRestoreOrSkipFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupRestoreOrSkipFragment.java @@ -62,7 +62,7 @@ public class IkeyBackupRestoreOrSkipFragment extends Fragment { restoreButton.setOnClickListener(v -> onRestore()); regenerateButton.setOnClickListener(v -> - ((AddAccountActivity) getActivity()).generateIkeyBackup(accountId)); + ((IkeySetupNavigator) getActivity()).generateIkeyBackup(accountId)); viewModel.getPassphraseError().observe(this, opt -> { if (opt.isPresent()) { @@ -75,7 +75,7 @@ public class IkeyBackupRestoreOrSkipFragment extends Fragment { String backupCode = backupCodeEditText.getText().toString(); if (viewModel.restoreBackup(backupCode)) { - ((AddAccountActivity) getActivity()).restoreSuccessful(accountId); + ((IkeySetupNavigator) getActivity()).restoreSuccessful(accountId); } } diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyKeyInfoFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyKeyInfoFragment.java index 759e7f7..0c17004 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyKeyInfoFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyKeyInfoFragment.java @@ -59,7 +59,7 @@ public class IkeyKeyInfoFragment extends Fragment { viewModel.init(accountId); viewModel.getFingerprint().observe(this, f -> fingerprint.setText(f)); - buttonBackupIkey.setOnClickListener(v -> ((AddAccountActivity)getActivity()).generateIkeyBackup(accountId)); + buttonBackupIkey.setOnClickListener(v -> ((IkeySetupNavigator)getActivity()).generateIkeyBackup(accountId)); buttonDone.setOnClickListener(v -> getActivity().finish()); } } diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeySetupFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeySetupFragment.java index 29bd632..f400c00 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeySetupFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeySetupFragment.java @@ -62,10 +62,10 @@ public class IkeySetupFragment extends Fragment { .observeOn(AndroidSchedulers.mainThread()) .doOnSuccess(opt -> { if (opt.isPresent()) { - ((AddAccountActivity) getActivity()).setupIkey(accountId); + ((IkeySetupNavigator) getActivity()).setupIkey(accountId); } else { viewModel.generateIdentityKey(); - ((AddAccountActivity) getActivity()).displayInfo(accountId); + ((IkeySetupNavigator) getActivity()).displayInfo(accountId); } }) .subscribe(); diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeySetupNavigator.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeySetupNavigator.java new file mode 100644 index 0000000..1beca5c --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeySetupNavigator.java @@ -0,0 +1,14 @@ +package org.mercury_im.messenger.android.ui.account.login; + +import java.util.UUID; + +public interface IkeySetupNavigator { + + void setupIkey(UUID accountId); + + void restoreSuccessful(UUID accountId); + + void generateIkeyBackup(UUID accountId); + + void displayInfo(UUID accountId); +} diff --git a/domain/src/main/java/org/mercury_im/messenger/core/crypto/MercuryOpenPgpManager.java b/domain/src/main/java/org/mercury_im/messenger/core/crypto/MercuryOpenPgpManager.java index ded1c84..6ed5428 100644 --- a/domain/src/main/java/org/mercury_im/messenger/core/crypto/MercuryOpenPgpManager.java +++ b/domain/src/main/java/org/mercury_im/messenger/core/crypto/MercuryOpenPgpManager.java @@ -76,6 +76,33 @@ public class MercuryOpenPgpManager { OpenPgpManager oxManager = OpenPgpManager.getInstanceFor(connection.getConnection()); oxManager.setOpenPgpProvider(provider); OpenPgpSecretKeyBackupPassphrase passphrase = passphraseGenerator.generateBackupPassphrase(); + + + generateAndPublish(connection, oxManager, passphrase); + } + + private void generateAndPublish(MercuryConnection connection, OpenPgpManager oxManager, OpenPgpSecretKeyBackupPassphrase passphrase) { + boolean mustGenerate = false; + try { + if (!oxManager.hasSecretKeysAvailable()) { + oxManager.generateAndImportKeyPair(connection.getAccount().getJid()); + //if (OpenPgpManager.serverSupportsSecretKeyBackups(connection.getConnection())) { + // oxManager.backupSecretKeyToServer( + // availableSecretKeys -> availableSecretKeys, + // passphrase); + //} + } + oxManager.announceSupportAndPublish(); + OXInstantMessagingManager oximManager = OXInstantMessagingManager.getInstanceFor(connection.getConnection()); + oximManager.addOxMessageListener(new MercuryMessageStore(connection.getAccount(), + peerRepository, directChatRepository, messageRepository, schedulers)); + oximManager.announceSupportForOxInstantMessaging(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void tryRestoringAndPublish(MercuryConnection connection, OpenPgpManager oxManager, OpenPgpSecretKeyBackupPassphrase passphrase) { boolean mustGenerate = false; try { if (!oxManager.hasSecretKeysAvailable()) { diff --git a/domain/src/main/java/org/mercury_im/messenger/core/di/module/OpenPgpModule.java b/domain/src/main/java/org/mercury_im/messenger/core/di/module/OpenPgpModule.java index bcdd8b7..a13c433 100644 --- a/domain/src/main/java/org/mercury_im/messenger/core/di/module/OpenPgpModule.java +++ b/domain/src/main/java/org/mercury_im/messenger/core/di/module/OpenPgpModule.java @@ -1,9 +1,7 @@ package org.mercury_im.messenger.core.di.module; -import org.mercury_im.messenger.core.crypto.InsecureStaticSecretKeyBackupPassphraseGenerator; -import org.mercury_im.messenger.core.crypto.LocalOxKeyGenerationStrategy; import org.mercury_im.messenger.core.crypto.OpenPgpSecretKeyBackupPassphraseGenerator; -import org.mercury_im.messenger.core.crypto.OxPlusIkeyKeyGenerationStrategy; +import org.mercury_im.messenger.core.crypto.SecureRandomSecretKeyBackupPassphraseGenerator; import javax.inject.Singleton; @@ -16,7 +14,6 @@ public class OpenPgpModule { @Singleton @Provides static OpenPgpSecretKeyBackupPassphraseGenerator provideSecretKeyBackupPassphraseGenerator() { - // TODO: THIS MUST NEVER MAKE IT TO PRODUCTION!!! - return new InsecureStaticSecretKeyBackupPassphraseGenerator(); + return new SecureRandomSecretKeyBackupPassphraseGenerator(); } }