]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/util/Utils.java
Refactor register and verify
[signal-cli] / src / main / java / org / asamk / signal / manager / util / Utils.java
1 package org.asamk.signal.manager.util;
2
3 import com.fasterxml.jackson.databind.JsonNode;
4
5 import org.whispersystems.libsignal.IdentityKey;
6 import org.whispersystems.libsignal.fingerprint.Fingerprint;
7 import org.whispersystems.libsignal.fingerprint.NumericFingerprintGenerator;
8 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
9 import org.whispersystems.signalservice.api.util.StreamDetails;
10 import org.whispersystems.signalservice.api.util.UuidUtil;
11
12 import java.io.BufferedInputStream;
13 import java.io.File;
14 import java.io.FileInputStream;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.io.InvalidObjectException;
18 import java.net.URLConnection;
19 import java.nio.file.Files;
20
21 public class Utils {
22
23 public static String getFileMimeType(File file, String defaultMimeType) throws IOException {
24 String mime = Files.probeContentType(file.toPath());
25 if (mime == null) {
26 try (InputStream bufferedStream = new BufferedInputStream(new FileInputStream(file))) {
27 mime = URLConnection.guessContentTypeFromStream(bufferedStream);
28 }
29 }
30 if (mime == null) {
31 return defaultMimeType;
32 }
33 return mime;
34 }
35
36 public static StreamDetails createStreamDetailsFromFile(File file) throws IOException {
37 InputStream stream = new FileInputStream(file);
38 final long size = file.length();
39 String mime = Files.probeContentType(file.toPath());
40 if (mime == null) {
41 mime = "application/octet-stream";
42 }
43 return new StreamDetails(stream, mime, size);
44 }
45
46 public static String computeSafetyNumber(
47 boolean isUuidCapable,
48 SignalServiceAddress ownAddress,
49 IdentityKey ownIdentityKey,
50 SignalServiceAddress theirAddress,
51 IdentityKey theirIdentityKey
52 ) {
53 int version;
54 byte[] ownId;
55 byte[] theirId;
56
57 if (isUuidCapable && ownAddress.getUuid().isPresent() && theirAddress.getUuid().isPresent()) {
58 // Version 2: UUID user
59 version = 2;
60 ownId = UuidUtil.toByteArray(ownAddress.getUuid().get());
61 theirId = UuidUtil.toByteArray(theirAddress.getUuid().get());
62 } else {
63 // Version 1: E164 user
64 version = 1;
65 if (!ownAddress.getNumber().isPresent() || !theirAddress.getNumber().isPresent()) {
66 return "INVALID ID";
67 }
68 ownId = ownAddress.getNumber().get().getBytes();
69 theirId = theirAddress.getNumber().get().getBytes();
70 }
71
72 Fingerprint fingerprint = new NumericFingerprintGenerator(5200).createFor(version,
73 ownId,
74 ownIdentityKey,
75 theirId,
76 theirIdentityKey);
77 return fingerprint.getDisplayableFingerprint().getDisplayText();
78 }
79
80 public static SignalServiceAddress getSignalServiceAddressFromIdentifier(final String identifier) {
81 if (UuidUtil.isUuid(identifier)) {
82 return new SignalServiceAddress(UuidUtil.parseOrNull(identifier), null);
83 } else {
84 return new SignalServiceAddress(null, identifier);
85 }
86 }
87
88 public static JsonNode getNotNullNode(JsonNode parent, String name) throws InvalidObjectException {
89 JsonNode node = parent.get(name);
90 if (node == null) {
91 throw new InvalidObjectException(String.format("Incorrect file format: expected parameter %s not found ",
92 name));
93 }
94
95 return node;
96 }
97 }