- try {
- return new URI("https", "signal.art", "/addstickers/", "pack_id=" + URLEncoder.encode(packId, "utf-8") + "&pack_key=" + URLEncoder.encode(Hex.toStringCondensed(packKey), "utf-8"))
- .toString();
- } catch (URISyntaxException e) {
- throw new AssertionError(e);
- }
- }
-
- private SignalServiceStickerManifestUpload getSignalServiceStickerManifestUpload(final String path) throws IOException, StickerPackInvalidException {
- ZipFile zip = null;
- String rootPath = null;
-
- final File file = new File(path);
- if (file.getName().endsWith(".zip")) {
- zip = new ZipFile(file);
- } else if (file.getName().equals("manifest.json")) {
- rootPath = file.getParent();
- } else {
- throw new StickerPackInvalidException("Could not find manifest.json");
- }
-
- JsonStickerPack pack = parseStickerPack(rootPath, zip);
-
- if (pack.stickers == null) {
- throw new StickerPackInvalidException("Must set a 'stickers' field.");
- }
-
- if (pack.stickers.isEmpty()) {
- throw new StickerPackInvalidException("Must include stickers.");
- }
-
- List<StickerInfo> stickers = new ArrayList<>(pack.stickers.size());
- for (JsonStickerPack.JsonSticker sticker : pack.stickers) {
- if (sticker.file == null) {
- throw new StickerPackInvalidException("Must set a 'file' field on each sticker.");
- }
-
- Pair<InputStream, Long> data;
- try {
- data = getInputStreamAndLength(rootPath, zip, sticker.file);
- } catch (IOException ignored) {
- throw new StickerPackInvalidException("Could not find find " + sticker.file);
- }
-
- StickerInfo stickerInfo = new StickerInfo(data.first(), data.second(), Optional.fromNullable(sticker.emoji).or(""));
- stickers.add(stickerInfo);
- }
-
- StickerInfo cover = null;
- if (pack.cover != null) {
- if (pack.cover.file == null) {
- throw new StickerPackInvalidException("Must set a 'file' field on the cover.");
- }
-
- Pair<InputStream, Long> data;
- try {
- data = getInputStreamAndLength(rootPath, zip, pack.cover.file);
- } catch (IOException ignored) {
- throw new StickerPackInvalidException("Could not find find " + pack.cover.file);
- }
-
- cover = new StickerInfo(data.first(), data.second(), Optional.fromNullable(pack.cover.emoji).or(""));
- }
-
- return new SignalServiceStickerManifestUpload(
- pack.title,
- pack.author,
- cover,
- stickers);
- }
-
- private static JsonStickerPack parseStickerPack(String rootPath, ZipFile zip) throws IOException {
- InputStream inputStream;
- if (zip != null) {
- inputStream = zip.getInputStream(zip.getEntry("manifest.json"));
- } else {
- inputStream = new FileInputStream((new File(rootPath, "manifest.json")));
- }
- return new ObjectMapper().readValue(inputStream, JsonStickerPack.class);
- }
-
- private static Pair<InputStream, Long> getInputStreamAndLength(final String rootPath, final ZipFile zip, final String subfile) throws IOException {
- if (zip != null) {
- final ZipEntry entry = zip.getEntry(subfile);
- return new Pair<>(zip.getInputStream(entry), entry.getSize());
- } else {
- final File file = new File(rootPath, subfile);
- return new Pair<>(new FileInputStream(file), file.length());
- }
- }
-
- void requestSyncGroups() throws IOException {
- SignalServiceProtos.SyncMessage.Request r = SignalServiceProtos.SyncMessage.Request.newBuilder().setType(SignalServiceProtos.SyncMessage.Request.Type.GROUPS).build();
- SignalServiceSyncMessage message = SignalServiceSyncMessage.forRequest(new RequestMessage(r));
- try {
- sendSyncMessage(message);
- } catch (UntrustedIdentityException e) {
- e.printStackTrace();
- }
- }
-
- void requestSyncContacts() throws IOException {
- SignalServiceProtos.SyncMessage.Request r = SignalServiceProtos.SyncMessage.Request.newBuilder().setType(SignalServiceProtos.SyncMessage.Request.Type.CONTACTS).build();
- SignalServiceSyncMessage message = SignalServiceSyncMessage.forRequest(new RequestMessage(r));
- try {
- sendSyncMessage(message);
- } catch (UntrustedIdentityException e) {
- e.printStackTrace();
- }
- }
-
- void requestSyncBlocked() throws IOException {
- SignalServiceProtos.SyncMessage.Request r = SignalServiceProtos.SyncMessage.Request.newBuilder().setType(SignalServiceProtos.SyncMessage.Request.Type.BLOCKED).build();
- SignalServiceSyncMessage message = SignalServiceSyncMessage.forRequest(new RequestMessage(r));
- try {
- sendSyncMessage(message);
- } catch (UntrustedIdentityException e) {
- e.printStackTrace();
- }
- }
-
- void requestSyncConfiguration() throws IOException {
- SignalServiceProtos.SyncMessage.Request r = SignalServiceProtos.SyncMessage.Request.newBuilder().setType(SignalServiceProtos.SyncMessage.Request.Type.CONFIGURATION).build();
- SignalServiceSyncMessage message = SignalServiceSyncMessage.forRequest(new RequestMessage(r));
- try {
- sendSyncMessage(message);
- } catch (UntrustedIdentityException e) {
- e.printStackTrace();
- }
- }
-
- private byte[] getSenderCertificate() {
- // TODO support UUID capable sender certificates
- // byte[] certificate = accountManager.getSenderCertificate();
- byte[] certificate;
- try {
- certificate = accountManager.getSenderCertificateLegacy();
- } catch (IOException e) {
- System.err.println("Failed to get sender certificate: " + e);
- return null;
- }
- // TODO cache for a day
- return certificate;
- }
-
- private byte[] getSelfUnidentifiedAccessKey() {
- return UnidentifiedAccess.deriveAccessKeyFrom(account.getProfileKey());
- }
-
- private static SignalProfile decryptProfile(SignalServiceProfile encryptedProfile, ProfileKey profileKey) throws IOException {
- ProfileCipher profileCipher = new ProfileCipher(profileKey);
- try {
- return new SignalProfile(
- encryptedProfile.getIdentityKey(),
- encryptedProfile.getName() == null ? null : new String(profileCipher.decryptName(Base64.decode(encryptedProfile.getName()))),
- encryptedProfile.getAvatar(),
- encryptedProfile.getUnidentifiedAccess() == null || !profileCipher.verifyUnidentifiedAccess(Base64.decode(encryptedProfile.getUnidentifiedAccess())) ? null : encryptedProfile.getUnidentifiedAccess(),
- encryptedProfile.isUnrestrictedUnidentifiedAccess()
- );
- } catch (InvalidCiphertextException e) {
- return null;
- }
- }