That fuck shit the fascists are using
1package org.tm.archive.migrations;
2
3import androidx.annotation.NonNull;
4import androidx.annotation.Nullable;
5
6import org.signal.core.util.logging.Log;
7import org.signal.libsignal.protocol.state.PreKeyRecord;
8import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
9import org.tm.archive.crypto.PreKeyUtil;
10import org.tm.archive.crypto.storage.PreKeyMetadataStore;
11import org.tm.archive.dependencies.ApplicationDependencies;
12import org.tm.archive.jobmanager.Job;
13import org.tm.archive.jobmanager.impl.NetworkConstraint;
14import org.tm.archive.keyvalue.SignalStore;
15import org.tm.archive.recipients.Recipient;
16import org.whispersystems.signalservice.api.SignalServiceAccountDataStore;
17import org.whispersystems.signalservice.api.SignalServiceAccountManager;
18import org.whispersystems.signalservice.api.account.PreKeyUpload;
19import org.whispersystems.signalservice.api.push.ServiceId.PNI;
20import org.whispersystems.signalservice.api.push.ServiceIdType;
21
22import java.io.IOException;
23import java.util.List;
24
25/**
26 * Initializes various aspects of the PNI identity. Notably:
27 * - Creates an identity key
28 * - Creates and uploads one-time prekeys
29 * - Creates and uploads signed prekeys
30 */
31public class PniAccountInitializationMigrationJob extends MigrationJob {
32
33 private static final String TAG = Log.tag(PniAccountInitializationMigrationJob.class);
34
35 public static final String KEY = "PniAccountInitializationMigrationJob";
36
37 PniAccountInitializationMigrationJob() {
38 this(new Parameters.Builder()
39 .addConstraint(NetworkConstraint.KEY)
40 .build());
41 }
42
43 private PniAccountInitializationMigrationJob(@NonNull Parameters parameters) {
44 super(parameters);
45 }
46
47 @Override
48 public boolean isUiBlocking() {
49 return false;
50 }
51
52 @Override
53 public @NonNull String getFactoryKey() {
54 return KEY;
55 }
56
57 @Override
58 public void performMigration() throws IOException {
59 PNI pni = SignalStore.account().getPni();
60
61 if (pni == null || SignalStore.account().getAci() == null || !Recipient.self().isRegistered()) {
62 Log.w(TAG, "Not yet registered! No need to perform this migration.");
63 return;
64 }
65
66 if (!SignalStore.account().hasPniIdentityKey()) {
67 Log.i(TAG, "Generating PNI identity.");
68 SignalStore.account().generatePniIdentityKeyIfNecessary();
69 } else {
70 Log.w(TAG, "Already generated the PNI identity. Skipping this step.");
71 }
72
73 SignalServiceAccountManager accountManager = ApplicationDependencies.getSignalServiceAccountManager();
74 SignalServiceAccountDataStore protocolStore = ApplicationDependencies.getProtocolStore().pni();
75 PreKeyMetadataStore metadataStore = SignalStore.account().pniPreKeys();
76
77 if (!metadataStore.isSignedPreKeyRegistered()) {
78 Log.i(TAG, "Uploading signed prekey for PNI.");
79 SignedPreKeyRecord signedPreKey = PreKeyUtil.generateAndStoreSignedPreKey(protocolStore, metadataStore);
80 List<PreKeyRecord> oneTimePreKeys = PreKeyUtil.generateAndStoreOneTimeEcPreKeys(protocolStore, metadataStore);
81
82 accountManager.setPreKeys(new PreKeyUpload(ServiceIdType.PNI, signedPreKey, oneTimePreKeys, null, null));
83 metadataStore.setActiveSignedPreKeyId(signedPreKey.getId());
84 metadataStore.setSignedPreKeyRegistered(true);
85 } else {
86 Log.w(TAG, "Already uploaded signed prekey for PNI. Skipping this step.");
87 }
88 }
89
90 @Override
91 boolean shouldRetry(@NonNull Exception e) {
92 return e instanceof IOException;
93 }
94
95 public static class Factory implements Job.Factory<PniAccountInitializationMigrationJob> {
96 @Override
97 public @NonNull PniAccountInitializationMigrationJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
98 return new PniAccountInitializationMigrationJob(parameters);
99 }
100 }
101}