]> nmode's Git Repositories - signal-cli/commitdiff
Add commands to update profile name and avatar
authorJérémy Bobbio <lunar@debian.org>
Tue, 24 Sep 2019 17:22:14 +0000 (19:22 +0200)
committerAsamK <asamk@gmx.de>
Wed, 16 Oct 2019 17:27:36 +0000 (19:27 +0200)
Two new commands are added `setProfileName` and `setProfileAvatar` which
allow to update the name and avatar visible by other users for the
current profiles.

Closes #227

man/signal-cli.1.adoc
src/main/java/org/asamk/signal/commands/Commands.java
src/main/java/org/asamk/signal/commands/SetProfileAvatarCommand.java [new file with mode: 0644]
src/main/java/org/asamk/signal/commands/SetProfileNameCommand.java [new file with mode: 0644]
src/main/java/org/asamk/signal/manager/Manager.java
src/main/java/org/asamk/signal/manager/Utils.java

index d8e0cb9071d70110ccfe709e74d1441683bb3a21..e72c3d022ccb83d328e7094f1276e9b9e0997aa6 100644 (file)
@@ -208,6 +208,19 @@ number::
        Specify the safety number or fingerprint of the key, only use this option if you have verified
        the fingerprint.
 
        Specify the safety number or fingerprint of the key, only use this option if you have verified
        the fingerprint.
 
+setProfileName
+--------------
+Update the name visible by message recipients for the current users.
+
+name::
+       New name visible by message recipients.
+
+setProfileAvatar
+----------------
+Update the avatar visible by message recipients for the current users.
+
+avatar::
+       Path to the new avatar visible by message recipients.
 
 daemon
 ~~~~~~
 
 daemon
 ~~~~~~
index 6f262fdf059ff93bb2892e6b136f4bd678f43836..aef34d8608e04bf67c1765c8949a7b16d9843f46 100644 (file)
@@ -20,6 +20,8 @@ public class Commands {
         addCommand("removeDevice", new RemoveDeviceCommand());
         addCommand("removePin", new RemovePinCommand());
         addCommand("send", new SendCommand());
         addCommand("removeDevice", new RemoveDeviceCommand());
         addCommand("removePin", new RemovePinCommand());
         addCommand("send", new SendCommand());
+        addCommand("setProfileAvatar", new SetProfileAvatarCommand());
+        addCommand("setProfileName", new SetProfileNameCommand());
         addCommand("setPin", new SetPinCommand());
         addCommand("trust", new TrustCommand());
         addCommand("unregister", new UnregisterCommand());
         addCommand("setPin", new SetPinCommand());
         addCommand("trust", new TrustCommand());
         addCommand("unregister", new UnregisterCommand());
diff --git a/src/main/java/org/asamk/signal/commands/SetProfileAvatarCommand.java b/src/main/java/org/asamk/signal/commands/SetProfileAvatarCommand.java
new file mode 100644 (file)
index 0000000..fae66e3
--- /dev/null
@@ -0,0 +1,40 @@
+package org.asamk.signal.commands;
+
+import java.io.IOException;
+import java.io.File;
+
+import net.sourceforge.argparse4j.impl.Arguments;
+import net.sourceforge.argparse4j.inf.Namespace;
+import net.sourceforge.argparse4j.inf.Subparser;
+import org.asamk.signal.manager.Manager;
+
+public class SetProfileAvatarCommand implements LocalCommand {
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
+        subparser.addArgument("avatar")
+                .help("Path to new profile avatar");
+        subparser.help("Set the avatar for this profile");
+    }
+
+    @Override
+    public int handleCommand(final Namespace ns, final Manager m) {
+        if (!m.isRegistered()) {
+            System.err.println("User is not registered.");
+            return 1;
+        }
+
+        String avatarPath = ns.getString("avatar");
+        File avatarFile = new File(avatarPath);
+
+        try {
+            m.setProfileAvatar(avatarFile);
+        } catch (IOException e) {
+            System.err.println("UpdateAccount error: " + e.getMessage());
+            return 3;
+        }
+
+        return 0;
+    }
+
+}
diff --git a/src/main/java/org/asamk/signal/commands/SetProfileNameCommand.java b/src/main/java/org/asamk/signal/commands/SetProfileNameCommand.java
new file mode 100644 (file)
index 0000000..761261b
--- /dev/null
@@ -0,0 +1,38 @@
+package org.asamk.signal.commands;
+
+import java.io.IOException;
+
+import net.sourceforge.argparse4j.impl.Arguments;
+import net.sourceforge.argparse4j.inf.Namespace;
+import net.sourceforge.argparse4j.inf.Subparser;
+import org.asamk.signal.manager.Manager;
+
+public class SetProfileNameCommand implements LocalCommand {
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
+        subparser.addArgument("name")
+                .help("New profile name");
+        subparser.help("Set a new name for this profile");
+    }
+
+    @Override
+    public int handleCommand(final Namespace ns, final Manager m) {
+        if (!m.isRegistered()) {
+            System.err.println("User is not registered.");
+            return 1;
+        }
+
+        String name = ns.getString("name");
+
+        try {
+            m.setProfileName(name);
+        } catch (IOException e) {
+            System.err.println("UpdateAccount error: " + e.getMessage());
+            return 3;
+        }
+
+        return 0;
+    }
+
+}
index 202a7d446bc8bfec1bbee882929f97b1a3e65e87..5a26ff56622bec74b45d543f249eb8b67a7981e3 100644 (file)
@@ -54,6 +54,7 @@ import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureExcept
 import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
 import org.whispersystems.signalservice.api.util.SleepTimer;
 import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
 import org.whispersystems.signalservice.api.util.SleepTimer;
+import org.whispersystems.signalservice.api.util.StreamDetails;
 import org.whispersystems.signalservice.api.util.UptimeSleepTimer;
 import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
 import org.whispersystems.signalservice.internal.push.UnsupportedDataMessageException;
 import org.whispersystems.signalservice.api.util.UptimeSleepTimer;
 import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
 import org.whispersystems.signalservice.internal.push.UnsupportedDataMessageException;
@@ -204,6 +205,14 @@ public class Manager implements Signal {
         accountManager.setAccountAttributes(account.getSignalingKey(), account.getSignalProtocolStore().getLocalRegistrationId(), true, account.getRegistrationLockPin(), getSelfUnidentifiedAccessKey(), false);
     }
 
         accountManager.setAccountAttributes(account.getSignalingKey(), account.getSignalProtocolStore().getLocalRegistrationId(), true, account.getRegistrationLockPin(), getSelfUnidentifiedAccessKey(), false);
     }
 
+    public void setProfileName(String name) throws IOException {
+        accountManager.setProfileName(account.getProfileKey(), name);
+    }
+
+    public void setProfileAvatar(File avatar) throws IOException {
+        accountManager.setProfileAvatar(account.getProfileKey(), Utils.createStreamDetailsFromFile(avatar));
+    }
+
     public void unregister() throws IOException {
         // When setting an empty GCM id, the Signal-Server also sets the fetchesMessages property to false.
         // If this is the master device, other users can't send messages to this number anymore.
     public void unregister() throws IOException {
         // When setting an empty GCM id, the Signal-Server also sets the fetchesMessages property to false.
         // If this is the master device, other users can't send messages to this number anymore.
index 4012674f1c76219296fa7e71f7433351c860dd90..2636a301b0cb13c3045e1e7751547adc8d459d06 100644 (file)
@@ -15,6 +15,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
+import org.whispersystems.signalservice.api.util.StreamDetails;
 import org.whispersystems.signalservice.internal.util.Base64;
 
 import java.io.*;
 import org.whispersystems.signalservice.internal.util.Base64;
 
 import java.io.*;
@@ -56,6 +57,16 @@ class Utils {
         return new SignalServiceAttachmentStream(attachmentStream, mime, attachmentSize, Optional.of(attachmentFile.getName()), false, preview, 0, 0, caption, null);
     }
 
         return new SignalServiceAttachmentStream(attachmentStream, mime, attachmentSize, Optional.of(attachmentFile.getName()), false, preview, 0, 0, caption, null);
     }
 
+    static StreamDetails createStreamDetailsFromFile(File file) throws IOException {
+        InputStream stream = new FileInputStream(file);
+        final long size = file.length();
+        String mime = Files.probeContentType(file.toPath());
+        if (mime == null) {
+            mime = "application/octet-stream";
+        }
+        return new StreamDetails(stream, mime, size);
+    }
+
     static CertificateValidator getCertificateValidator() {
         try {
             ECPublicKey unidentifiedSenderTrustRoot = Curve.decodePoint(Base64.decode(BaseConfig.UNIDENTIFIED_SENDER_TRUST_ROOT), 0);
     static CertificateValidator getCertificateValidator() {
         try {
             ECPublicKey unidentifiedSenderTrustRoot = Curve.decodePoint(Base64.decode(BaseConfig.UNIDENTIFIED_SENDER_TRUST_ROOT), 0);