]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncModels.java
ecb97bdff48ced99500a5b4ae9d87eeab1311089
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / syncStorage / StorageSyncModels.java
1 package org.asamk.signal.manager.syncStorage;
2
3 import org.asamk.signal.manager.api.PhoneNumberSharingMode;
4 import org.asamk.signal.manager.api.TrustLevel;
5 import org.asamk.signal.manager.storage.configuration.ConfigurationStore;
6 import org.asamk.signal.manager.storage.groups.GroupInfoV1;
7 import org.asamk.signal.manager.storage.groups.GroupInfoV2;
8 import org.asamk.signal.manager.storage.identities.IdentityInfo;
9 import org.asamk.signal.manager.storage.recipients.Recipient;
10 import org.whispersystems.signalservice.api.push.UsernameLinkComponents;
11 import org.whispersystems.signalservice.api.storage.SignalAccountRecord;
12 import org.whispersystems.signalservice.api.storage.SignalContactRecord;
13 import org.whispersystems.signalservice.api.storage.SignalGroupV1Record;
14 import org.whispersystems.signalservice.api.storage.SignalGroupV2Record;
15 import org.whispersystems.signalservice.api.storage.SignalStorageRecord;
16 import org.whispersystems.signalservice.api.util.UuidUtil;
17 import org.whispersystems.signalservice.internal.storage.protos.AccountRecord;
18 import org.whispersystems.signalservice.internal.storage.protos.AccountRecord.UsernameLink;
19 import org.whispersystems.signalservice.internal.storage.protos.ContactRecord.IdentityState;
20
21 import java.util.Optional;
22
23 import okio.ByteString;
24
25 public final class StorageSyncModels {
26
27 private StorageSyncModels() {
28 }
29
30 public static AccountRecord.PhoneNumberSharingMode localToRemote(PhoneNumberSharingMode phoneNumberPhoneNumberSharingMode) {
31 return switch (phoneNumberPhoneNumberSharingMode) {
32 case EVERYBODY -> AccountRecord.PhoneNumberSharingMode.EVERYBODY;
33 case CONTACTS, NOBODY -> AccountRecord.PhoneNumberSharingMode.NOBODY;
34 };
35 }
36
37 public static PhoneNumberSharingMode remoteToLocal(AccountRecord.PhoneNumberSharingMode phoneNumberPhoneNumberSharingMode) {
38 return switch (phoneNumberPhoneNumberSharingMode) {
39 case EVERYBODY -> PhoneNumberSharingMode.EVERYBODY;
40 case NOBODY -> PhoneNumberSharingMode.NOBODY;
41 case UNKNOWN -> null;
42 };
43 }
44
45 public static SignalStorageRecord localToRemoteRecord(
46 ConfigurationStore configStore,
47 Recipient self,
48 UsernameLinkComponents usernameLinkComponents,
49 byte[] rawStorageId
50 ) {
51 final var builder = new SignalAccountRecord.Builder(rawStorageId, self.getStorageRecord());
52 if (self.getProfileKey() != null) {
53 builder.setProfileKey(self.getProfileKey().serialize());
54 }
55 if (self.getProfile() != null) {
56 builder.setGivenName(self.getProfile().getGivenName())
57 .setFamilyName(self.getProfile().getFamilyName())
58 .setAvatarUrlPath(self.getProfile().getAvatarUrlPath());
59 }
60 builder.setTypingIndicatorsEnabled(Optional.ofNullable(configStore.getTypingIndicators()).orElse(true))
61 .setReadReceiptsEnabled(Optional.ofNullable(configStore.getReadReceipts()).orElse(true))
62 .setSealedSenderIndicatorsEnabled(Optional.ofNullable(configStore.getUnidentifiedDeliveryIndicators())
63 .orElse(true))
64 .setLinkPreviewsEnabled(Optional.ofNullable(configStore.getLinkPreviews()).orElse(true))
65 .setUnlistedPhoneNumber(Optional.ofNullable(configStore.getPhoneNumberUnlisted()).orElse(false))
66 .setPhoneNumberSharingMode(Optional.ofNullable(configStore.getPhoneNumberSharingMode())
67 .map(StorageSyncModels::localToRemote)
68 .orElse(AccountRecord.PhoneNumberSharingMode.UNKNOWN))
69 .setE164(self.getAddress().number().orElse(""))
70 .setUsername(self.getAddress().username().orElse(null));
71 if (usernameLinkComponents != null) {
72 final var linkColor = configStore.getUsernameLinkColor();
73 builder.setUsernameLink(new UsernameLink.Builder().entropy(ByteString.of(usernameLinkComponents.getEntropy()))
74 .serverId(UuidUtil.toByteString(usernameLinkComponents.getServerId()))
75 .color(linkColor == null ? UsernameLink.Color.UNKNOWN : UsernameLink.Color.valueOf(linkColor))
76 .build());
77 }
78
79 return SignalStorageRecord.forAccount(builder.build());
80 }
81
82 public static SignalStorageRecord localToRemoteRecord(
83 Recipient recipient, IdentityInfo identity, byte[] rawStorageId
84 ) {
85 final var address = recipient.getAddress();
86 final var builder = new SignalContactRecord.Builder(rawStorageId,
87 address.aci().orElse(null),
88 recipient.getStorageRecord()).setE164(address.number().orElse(null))
89 .setPni(address.pni().orElse(null))
90 .setUsername(address.username().orElse(null))
91 .setProfileKey(recipient.getProfileKey() == null ? null : recipient.getProfileKey().serialize());
92 if (recipient.getProfile() != null) {
93 builder.setProfileGivenName(recipient.getProfile().getGivenName())
94 .setProfileFamilyName(recipient.getProfile().getFamilyName());
95 }
96 if (recipient.getContact() != null) {
97 builder.setSystemGivenName(recipient.getContact().givenName())
98 .setSystemFamilyName(recipient.getContact().familyName())
99 .setSystemNickname(recipient.getContact().nickName())
100 .setNicknameGivenName(recipient.getContact().nickNameGivenName() == null
101 ? ""
102 : recipient.getContact().nickNameGivenName())
103 .setNicknameFamilyName(recipient.getContact().nickNameFamilyName() == null
104 ? ""
105 : recipient.getContact().nickNameFamilyName())
106 .setNote(recipient.getContact().note())
107 .setBlocked(recipient.getContact().isBlocked())
108 .setProfileSharingEnabled(recipient.getContact().isProfileSharingEnabled())
109 .setMuteUntil(recipient.getContact().muteUntil())
110 .setHideStory(recipient.getContact().hideStory())
111 .setUnregisteredTimestamp(recipient.getContact().unregisteredTimestamp() == null
112 ? 0
113 : recipient.getContact().unregisteredTimestamp())
114 .setArchived(recipient.getContact().isArchived())
115 .setHidden(recipient.getContact().isHidden());
116 }
117 if (identity != null) {
118 builder.setIdentityKey(identity.getIdentityKey().serialize())
119 .setIdentityState(localToRemote(identity.getTrustLevel()));
120 }
121 return SignalStorageRecord.forContact(builder.build());
122 }
123
124 public static SignalStorageRecord localToRemoteRecord(
125 GroupInfoV1 group, byte[] rawStorageId
126 ) {
127 final var builder = new SignalGroupV1Record.Builder(rawStorageId,
128 group.getGroupId().serialize(),
129 group.getStorageRecord());
130 builder.setBlocked(group.isBlocked());
131 builder.setArchived(group.archived);
132 builder.setProfileSharingEnabled(true);
133 return SignalStorageRecord.forGroupV1(builder.build());
134 }
135
136 public static SignalStorageRecord localToRemoteRecord(
137 GroupInfoV2 group, byte[] rawStorageId
138 ) {
139 final var builder = new SignalGroupV2Record.Builder(rawStorageId,
140 group.getMasterKey(),
141 group.getStorageRecord());
142 builder.setBlocked(group.isBlocked());
143 builder.setProfileSharingEnabled(group.isProfileSharingEnabled());
144 return SignalStorageRecord.forGroupV2(builder.build());
145 }
146
147 public static TrustLevel remoteToLocal(IdentityState identityState) {
148 return switch (identityState) {
149 case DEFAULT -> TrustLevel.TRUSTED_UNVERIFIED;
150 case UNVERIFIED -> TrustLevel.UNTRUSTED;
151 case VERIFIED -> TrustLevel.TRUSTED_VERIFIED;
152 };
153 }
154
155 private static IdentityState localToRemote(TrustLevel local) {
156 return switch (local) {
157 case TRUSTED_VERIFIED -> IdentityState.VERIFIED;
158 case UNTRUSTED -> IdentityState.UNVERIFIED;
159 default -> IdentityState.DEFAULT;
160 };
161 }
162 }