]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java
17cc2caaf10e737f866ece457dae3bfd009bc0b5
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusSignalImpl.java
1 package org.asamk.signal.dbus;
2
3 import org.asamk.Signal;
4 import org.asamk.signal.manager.AttachmentInvalidException;
5 import org.asamk.signal.manager.GroupNotFoundException;
6 import org.asamk.signal.manager.Manager;
7 import org.asamk.signal.manager.NotAGroupMemberException;
8 import org.asamk.signal.storage.groups.GroupInfo;
9 import org.freedesktop.dbus.exceptions.DBusExecutionException;
10 import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
11 import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
12 import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException;
13 import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
14 import org.whispersystems.signalservice.api.util.InvalidNumberException;
15
16 import java.io.IOException;
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.List;
20
21 public class DbusSignalImpl implements Signal {
22
23 private final Manager m;
24
25 public DbusSignalImpl(final Manager m) {
26 this.m = m;
27 }
28
29 @Override
30 public boolean isRemote() {
31 return false;
32 }
33
34 @Override
35 public String getObjectPath() {
36 return null;
37 }
38
39 @Override
40 public long sendMessage(final String message, final List<String> attachments, final String recipient) {
41 List<String> recipients = new ArrayList<>(1);
42 recipients.add(recipient);
43 return sendMessage(message, attachments, recipients);
44 }
45
46 private static DBusExecutionException convertEncapsulatedExceptions(EncapsulatedExceptions e) {
47 if (e.getNetworkExceptions().size() + e.getUnregisteredUserExceptions().size() + e.getUntrustedIdentityExceptions().size() == 1) {
48 if (e.getNetworkExceptions().size() == 1) {
49 NetworkFailureException n = e.getNetworkExceptions().get(0);
50 return new Error.Failure("Network failure for \"" + n.getE164number() + "\": " + n.getMessage());
51 } else if (e.getUnregisteredUserExceptions().size() == 1) {
52 UnregisteredUserException n = e.getUnregisteredUserExceptions().get(0);
53 return new Error.UnregisteredUser("Unregistered user \"" + n.getE164Number() + "\": " + n.getMessage());
54 } else if (e.getUntrustedIdentityExceptions().size() == 1) {
55 UntrustedIdentityException n = e.getUntrustedIdentityExceptions().get(0);
56 return new Error.UntrustedIdentity("Untrusted Identity for \"" + n.getIdentifier() + "\": " + n.getMessage());
57 }
58 }
59
60 StringBuilder message = new StringBuilder();
61 message.append("Failed to send (some) messages:").append('\n');
62 for (NetworkFailureException n : e.getNetworkExceptions()) {
63 message.append("Network failure for \"").append(n.getE164number()).append("\": ").append(n.getMessage()).append('\n');
64 }
65 for (UnregisteredUserException n : e.getUnregisteredUserExceptions()) {
66 message.append("Unregistered user \"").append(n.getE164Number()).append("\": ").append(n.getMessage()).append('\n');
67 }
68 for (UntrustedIdentityException n : e.getUntrustedIdentityExceptions()) {
69 message.append("Untrusted Identity for \"").append(n.getIdentifier()).append("\": ").append(n.getMessage()).append('\n');
70 }
71
72 return new Error.Failure(message.toString());
73 }
74
75 @Override
76 public long sendMessage(final String message, final List<String> attachments, final List<String> recipients) {
77 try {
78 return m.sendMessage(message, attachments, recipients);
79 } catch (EncapsulatedExceptions e) {
80 throw convertEncapsulatedExceptions(e);
81 } catch (InvalidNumberException e) {
82 throw new Error.InvalidNumber(e.getMessage());
83 } catch (AttachmentInvalidException e) {
84 throw new Error.AttachmentInvalid(e.getMessage());
85 } catch (IOException e) {
86 throw new Error.Failure(e.getMessage());
87 }
88 }
89
90 @Override
91 public void sendEndSessionMessage(final List<String> recipients) {
92 try {
93 m.sendEndSessionMessage(recipients);
94 } catch (IOException e) {
95 throw new Error.Failure(e.getMessage());
96 } catch (EncapsulatedExceptions e) {
97 throw convertEncapsulatedExceptions(e);
98 } catch (InvalidNumberException e) {
99 throw new Error.InvalidNumber(e.getMessage());
100 }
101 }
102
103 @Override
104 public long sendGroupMessage(final String message, final List<String> attachments, final byte[] groupId) {
105 try {
106 return m.sendGroupMessage(message, attachments, groupId);
107 } catch (IOException e) {
108 throw new Error.Failure(e.getMessage());
109 } catch (EncapsulatedExceptions e) {
110 throw convertEncapsulatedExceptions(e);
111 } catch (GroupNotFoundException | NotAGroupMemberException e) {
112 throw new Error.GroupNotFound(e.getMessage());
113 } catch (AttachmentInvalidException e) {
114 throw new Error.AttachmentInvalid(e.getMessage());
115 }
116 }
117
118 @Override
119 public String getContactName(final String number) {
120 try {
121 return m.getContactName(number);
122 } catch (InvalidNumberException e) {
123 throw new Error.InvalidNumber(e.getMessage());
124 }
125 }
126
127 @Override
128 public void setContactName(final String number, final String name) {
129 try {
130 m.setContactName(number, name);
131 } catch (InvalidNumberException e) {
132 throw new Error.InvalidNumber(e.getMessage());
133 }
134 }
135
136 @Override
137 public void setContactBlocked(final String number, final boolean blocked) {
138 try {
139 m.setContactBlocked(number, blocked);
140 } catch (InvalidNumberException e) {
141 throw new Error.InvalidNumber(e.getMessage());
142 }
143 }
144
145 @Override
146 public void setGroupBlocked(final byte[] groupId, final boolean blocked) {
147 try {
148 m.setGroupBlocked(groupId, blocked);
149 } catch (GroupNotFoundException e) {
150 throw new Error.GroupNotFound(e.getMessage());
151 }
152 }
153
154 @Override
155 public List<byte[]> getGroupIds() {
156 List<GroupInfo> groups = m.getGroups();
157 List<byte[]> ids = new ArrayList<>(groups.size());
158 for (GroupInfo group : groups) {
159 ids.add(group.groupId);
160 }
161 return ids;
162 }
163
164 @Override
165 public String getGroupName(final byte[] groupId) {
166 GroupInfo group = m.getGroup(groupId);
167 if (group == null) {
168 return "";
169 } else {
170 return group.name;
171 }
172 }
173
174 @Override
175 public List<String> getGroupMembers(final byte[] groupId) {
176 GroupInfo group = m.getGroup(groupId);
177 if (group == null) {
178 return Collections.emptyList();
179 } else {
180 return new ArrayList<>(group.getMembersE164());
181 }
182 }
183
184 @Override
185 public byte[] updateGroup(final byte[] groupId, final String name, final List<String> members, final String avatar) {
186 try {
187 return m.updateGroup(groupId, name, members, avatar);
188 } catch (IOException e) {
189 throw new Error.Failure(e.getMessage());
190 } catch (EncapsulatedExceptions e) {
191 throw convertEncapsulatedExceptions(e);
192 } catch (GroupNotFoundException | NotAGroupMemberException e) {
193 throw new Error.GroupNotFound(e.getMessage());
194 } catch (InvalidNumberException e) {
195 throw new Error.InvalidNumber(e.getMessage());
196 } catch (AttachmentInvalidException e) {
197 throw new Error.AttachmentInvalid(e.getMessage());
198 }
199 }
200
201 @Override
202 public boolean isRegistered() {
203 return true;
204 }
205 }