private final ObjectMapper jsonProcessot = new ObjectMapper();
private String username;
- int deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID;
+ private int deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID;
private String password;
private String signalingKey;
private int preKeyIdOffset;
return username;
}
+ public int getDeviceId() {
+ return deviceId;
+ }
+
public String getFileName() {
new File(dataPath).mkdirs();
return dataPath + "/" + username;
save();
}
+ public List<DeviceInfo> getLinkedDevices() throws IOException {
+ return accountManager.getDevices();
+ }
+
+ public void removeLinkedDevices(int deviceId) throws IOException {
+ accountManager.removeDevice(deviceId);
+ }
public static Map<String, String> getQueryMap(String query) {
String[] params = query.split("&");
}
public void addDeviceLink(URI linkUri) throws IOException, InvalidKeyException {
- Map<String, String> query = getQueryMap(linkUri.getQuery());
+ Map<String, String> query = getQueryMap(linkUri.getRawQuery());
String deviceIdentifier = query.get("uuid");
String publicKeyEncoded = query.get("pub_key");
ECPublicKey deviceKey = Curve.decodePoint(Base64.decode(publicKeyEncoded), 0);
- addDeviceLink(deviceIdentifier, deviceKey);
+ addDevice(deviceIdentifier, deviceKey);
}
- private void addDeviceLink(String deviceIdentifier, ECPublicKey deviceKey) throws IOException, InvalidKeyException {
+ private void addDevice(String deviceIdentifier, ECPublicKey deviceKey) throws IOException, InvalidKeyException {
IdentityKeyPair identityKeyPair = signalProtocolStore.getIdentityKeyPair();
String verificationCode = accountManager.getNewDeviceVerificationCode();
}
SignalServiceDataMessage message = messageBuilder.build();
- sendMessage(message, groupStore.getGroup(groupId).members);
+ Set<String> members = groupStore.getGroup(groupId).members;
+ members.remove(this.username);
+ sendMessage(message, members);
}
public void sendQuitGroupMessage(byte[] groupId) throws GroupNotFoundException, IOException, EncapsulatedExceptions, UntrustedIdentityException {
.asGroupMessage(group)
.build();
- sendMessage(message, groupStore.getGroup(groupId).members);
+ final GroupInfo g = groupStore.getGroup(groupId);
+ g.members.remove(this.username);
+ groupStore.updateGroup(g);
+
+ sendMessage(message, g.members);
}
public byte[] sendUpdateGroupMessage(byte[] groupId, String name, Collection<String> members, String avatarFile) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException, UntrustedIdentityException {
.asGroupMessage(group.build())
.build();
- sendMessage(message, g.members);
+ final Set<String> membersSend = g.members;
+ membersSend.remove(this.username);
+ sendMessage(message, membersSend);
return g.groupId;
}
private void sendMessage(SignalServiceDataMessage message, Collection<String> recipients)
throws IOException, EncapsulatedExceptions, UntrustedIdentityException {
- SignalServiceMessageSender messageSender = new SignalServiceMessageSender(URL, TRUST_STORE, username, password,
- deviceId, signalProtocolStore, USER_AGENT, Optional.<SignalServiceMessageSender.EventListener>absent());
+ try {
+ SignalServiceMessageSender messageSender = new SignalServiceMessageSender(URL, TRUST_STORE, username, password,
+ deviceId, signalProtocolStore, USER_AGENT, Optional.<SignalServiceMessageSender.EventListener>absent());
- Set<SignalServiceAddress> recipientsTS = new HashSet<>(recipients.size());
- for (String recipient : recipients) {
- try {
- recipientsTS.add(getPushAddress(recipient));
- } catch (InvalidNumberException e) {
- System.err.println("Failed to add recipient \"" + recipient + "\": " + e.getMessage());
- System.err.println("Aborting sending.");
- save();
- return;
+ Set<SignalServiceAddress> recipientsTS = new HashSet<>(recipients.size());
+ for (String recipient : recipients) {
+ try {
+ recipientsTS.add(getPushAddress(recipient));
+ } catch (InvalidNumberException e) {
+ System.err.println("Failed to add recipient \"" + recipient + "\": " + e.getMessage());
+ System.err.println("Aborting sending.");
+ save();
+ return;
+ }
}
- }
- if (message.getGroupInfo().isPresent()) {
- messageSender.sendMessage(new ArrayList<>(recipientsTS), message);
- } else {
- // Send to all individually, so sync messages are sent correctly
- for (SignalServiceAddress address : recipientsTS) {
- messageSender.sendMessage(address, message);
+ if (message.getGroupInfo().isPresent()) {
+ messageSender.sendMessage(new ArrayList<>(recipientsTS), message);
+ } else {
+ // Send to all individually, so sync messages are sent correctly
+ for (SignalServiceAddress address : recipientsTS) {
+ messageSender.sendMessage(address, message);
+ }
}
- }
- if (message.isEndSession()) {
- for (SignalServiceAddress recipient : recipientsTS) {
- handleEndSession(recipient.getNumber());
+ if (message.isEndSession()) {
+ for (SignalServiceAddress recipient : recipientsTS) {
+ handleEndSession(recipient.getNumber());
+ }
}
+ } finally {
+ save();
}
- save();
}
private SignalServiceContent decryptMessage(SignalServiceEnvelope envelope) {
try {
group = groupStore.getGroup(groupInfo.getGroupId());
group.members.remove(source);
+ groupStore.updateGroup(group);
} catch (GroupNotFoundException e) {
}
break;