package org.asamk.signal.dbus; import org.asamk.Signal; import org.asamk.signal.manager.AttachmentInvalidException; import org.asamk.signal.manager.GroupNotFoundException; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.NotAGroupMemberException; import org.asamk.signal.storage.groups.GroupInfo; import org.freedesktop.dbus.exceptions.DBusExecutionException; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException; import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; import org.whispersystems.signalservice.api.util.InvalidNumberException; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class DbusSignalImpl implements Signal { private final Manager m; public DbusSignalImpl(final Manager m) { this.m = m; } @Override public boolean isRemote() { return false; } @Override public String getObjectPath() { return null; } @Override public long sendMessage(final String message, final List attachments, final String recipient) { List recipients = new ArrayList<>(1); recipients.add(recipient); return sendMessage(message, attachments, recipients); } private static DBusExecutionException convertEncapsulatedExceptions(EncapsulatedExceptions e) { if (e.getNetworkExceptions().size() + e.getUnregisteredUserExceptions().size() + e.getUntrustedIdentityExceptions().size() == 1) { if (e.getNetworkExceptions().size() == 1) { NetworkFailureException n = e.getNetworkExceptions().get(0); return new Error.Failure("Network failure for \"" + n.getE164number() + "\": " + n.getMessage()); } else if (e.getUnregisteredUserExceptions().size() == 1) { UnregisteredUserException n = e.getUnregisteredUserExceptions().get(0); return new Error.UnregisteredUser("Unregistered user \"" + n.getE164Number() + "\": " + n.getMessage()); } else if (e.getUntrustedIdentityExceptions().size() == 1) { UntrustedIdentityException n = e.getUntrustedIdentityExceptions().get(0); return new Error.UntrustedIdentity("Untrusted Identity for \"" + n.getIdentifier() + "\": " + n.getMessage()); } } StringBuilder message = new StringBuilder(); message.append("Failed to send (some) messages:").append('\n'); for (NetworkFailureException n : e.getNetworkExceptions()) { message.append("Network failure for \"").append(n.getE164number()).append("\": ").append(n.getMessage()).append('\n'); } for (UnregisteredUserException n : e.getUnregisteredUserExceptions()) { message.append("Unregistered user \"").append(n.getE164Number()).append("\": ").append(n.getMessage()).append('\n'); } for (UntrustedIdentityException n : e.getUntrustedIdentityExceptions()) { message.append("Untrusted Identity for \"").append(n.getIdentifier()).append("\": ").append(n.getMessage()).append('\n'); } return new Error.Failure(message.toString()); } @Override public long sendMessage(final String message, final List attachments, final List recipients) { try { return m.sendMessage(message, attachments, recipients); } catch (EncapsulatedExceptions e) { throw convertEncapsulatedExceptions(e); } catch (InvalidNumberException e) { throw new Error.InvalidNumber(e.getMessage()); } catch (AttachmentInvalidException e) { throw new Error.AttachmentInvalid(e.getMessage()); } catch (IOException e) { throw new Error.Failure(e.getMessage()); } } @Override public void sendEndSessionMessage(final List recipients) { try { m.sendEndSessionMessage(recipients); } catch (IOException e) { throw new Error.Failure(e.getMessage()); } catch (EncapsulatedExceptions e) { throw convertEncapsulatedExceptions(e); } catch (InvalidNumberException e) { throw new Error.InvalidNumber(e.getMessage()); } } @Override public long sendGroupMessage(final String message, final List attachments, final byte[] groupId) { try { return m.sendGroupMessage(message, attachments, groupId); } catch (IOException e) { throw new Error.Failure(e.getMessage()); } catch (EncapsulatedExceptions e) { throw convertEncapsulatedExceptions(e); } catch (GroupNotFoundException | NotAGroupMemberException e) { throw new Error.GroupNotFound(e.getMessage()); } catch (AttachmentInvalidException e) { throw new Error.AttachmentInvalid(e.getMessage()); } } @Override public String getContactName(final String number) { try { return m.getContactName(number); } catch (InvalidNumberException e) { throw new Error.InvalidNumber(e.getMessage()); } } @Override public void setContactName(final String number, final String name) { try { m.setContactName(number, name); } catch (InvalidNumberException e) { throw new Error.InvalidNumber(e.getMessage()); } } @Override public void setContactBlocked(final String number, final boolean blocked) { try { m.setContactBlocked(number, blocked); } catch (InvalidNumberException e) { throw new Error.InvalidNumber(e.getMessage()); } } @Override public void setGroupBlocked(final byte[] groupId, final boolean blocked) { try { m.setGroupBlocked(groupId, blocked); } catch (GroupNotFoundException e) { throw new Error.GroupNotFound(e.getMessage()); } } @Override public List getGroupIds() { List groups = m.getGroups(); List ids = new ArrayList<>(groups.size()); for (GroupInfo group : groups) { ids.add(group.groupId); } return ids; } @Override public String getGroupName(final byte[] groupId) { GroupInfo group = m.getGroup(groupId); if (group == null) { return ""; } else { return group.name; } } @Override public List getGroupMembers(final byte[] groupId) { GroupInfo group = m.getGroup(groupId); if (group == null) { return Collections.emptyList(); } else { return new ArrayList<>(group.getMembersE164()); } } @Override public byte[] updateGroup(final byte[] groupId, final String name, final List members, final String avatar) { try { return m.updateGroup(groupId, name, members, avatar); } catch (IOException e) { throw new Error.Failure(e.getMessage()); } catch (EncapsulatedExceptions e) { throw convertEncapsulatedExceptions(e); } catch (GroupNotFoundException | NotAGroupMemberException e) { throw new Error.GroupNotFound(e.getMessage()); } catch (InvalidNumberException e) { throw new Error.InvalidNumber(e.getMessage()); } catch (AttachmentInvalidException e) { throw new Error.AttachmentInvalid(e.getMessage()); } } @Override public boolean isRegistered() { return true; } }