1 /*
2  * Copyright (C) 2021 Finn Herzfeld
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 package io.finn.signald;
19 
20 import com.fasterxml.jackson.annotation.JsonProperty;
21 import io.finn.signald.annotations.Deprecated;
22 import io.finn.signald.clientprotocol.v1.JsonAddress;
23 import io.finn.signald.db.IdentityKeysTable;
24 import io.finn.signald.db.Recipient;
25 import io.finn.signald.util.SafetyNumberHelper;
26 import java.io.IOException;
27 import java.sql.SQLException;
28 import org.asamk.signal.util.Hex;
29 import org.whispersystems.libsignal.fingerprint.Fingerprint;
30 import org.whispersystems.util.Base64;
31 
32 @Deprecated(1641027661)
33 class JsonIdentity {
34   public String trust_level;
35   public long added;
36   public String fingerprint;
37   public String safety_number;
38   public String qr_code_data;
39   public JsonAddress address;
40 
JsonIdentity(IdentityKeysTable.IdentityKeyRow identity, Manager m)41   JsonIdentity(IdentityKeysTable.IdentityKeyRow identity, Manager m) throws IOException, SQLException {
42     this.trust_level = identity.getTrustLevel().name();
43     this.added = identity.getDateAdded().getTime();
44     this.fingerprint = Hex.toStringCondensed(identity.getFingerprint());
45     if (identity.getAddress() != null) {
46       this.address = new JsonAddress(identity.getAddress());
47       generateSafetyNumber(identity, m);
48     }
49   }
50 
JsonIdentity(IdentityKeysTable.IdentityKeyRow identity, Manager m, Recipient recipient)51   JsonIdentity(IdentityKeysTable.IdentityKeyRow identity, Manager m, Recipient recipient) throws IOException, SQLException {
52     this(identity, m);
53     this.address = new JsonAddress(recipient.getAddress());
54     generateSafetyNumber(identity, m);
55   }
56 
generateSafetyNumber(IdentityKeysTable.IdentityKeyRow identity, Manager m)57   private void generateSafetyNumber(IdentityKeysTable.IdentityKeyRow identity, Manager m) throws IOException, SQLException {
58     if (address != null) {
59       Fingerprint fingerprint = SafetyNumberHelper.computeFingerprint(m.getOwnRecipient(), m.getIdentity(), m.getRecipientsTable().get(address), identity.getKey());
60       if (fingerprint == null) {
61         safety_number = "INVALID ID";
62       } else {
63         safety_number = fingerprint.getDisplayableFingerprint().getDisplayText();
64         qr_code_data = Base64.encodeBytes(fingerprint.getScannableFingerprint().getSerialized());
65       }
66     }
67   }
68 
69   @JsonProperty
setNumber(String number)70   public void setNumber(String number) {
71     if (this.address == null) {
72       this.address = new JsonAddress(number);
73     } else {
74       this.address.number = number;
75     }
76   }
77 }
78