Refactoring, move more functionality into Manager
This commit is contained in:
		
							parent
							
								
									4b5bfcba80
								
							
						
					
					
						commit
						ef5d3a65f8
					
				
							
								
								
									
										14
									
								
								src/main/java/cli/AttachmentInvalidException.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/main/java/cli/AttachmentInvalidException.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					package cli;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class AttachmentInvalidException extends Exception {
 | 
				
			||||||
 | 
					    private final String attachment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public AttachmentInvalidException(String attachment, Exception e) {
 | 
				
			||||||
 | 
					        super(e);
 | 
				
			||||||
 | 
					        this.attachment = attachment;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getAttachment() {
 | 
				
			||||||
 | 
					        return attachment;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										14
									
								
								src/main/java/cli/GroupNotFoundException.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/main/java/cli/GroupNotFoundException.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					package cli;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class GroupNotFoundException extends Exception {
 | 
				
			||||||
 | 
					    private final byte[] groupId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public GroupNotFoundException(byte[] groupId) {
 | 
				
			||||||
 | 
					        super();
 | 
				
			||||||
 | 
					        this.groupId = groupId;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public byte[] getGroupId() {
 | 
				
			||||||
 | 
					        return groupId;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -23,8 +23,12 @@ public class JsonGroupStore {
 | 
				
			|||||||
        groups.put(Base64.encodeBytes(group.groupId), group);
 | 
					        groups.put(Base64.encodeBytes(group.groupId), group);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GroupInfo getGroup(byte[] groupId) {
 | 
					    GroupInfo getGroup(byte[] groupId) throws GroupNotFoundException {
 | 
				
			||||||
        return groups.get(Base64.encodeBytes(groupId));
 | 
					        GroupInfo g = groups.get(Base64.encodeBytes(groupId));
 | 
				
			||||||
 | 
					        if (g == null) {
 | 
				
			||||||
 | 
					            throw new GroupNotFoundException(groupId);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return g;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static class MapToListSerializer extends JsonSerializer<Map<?, ?>> {
 | 
					    public static class MapToListSerializer extends JsonSerializer<Map<?, ?>> {
 | 
				
			||||||
 | 
				
			|||||||
@ -26,18 +26,11 @@ import org.whispersystems.textsecure.api.messages.multidevice.TextSecureSyncMess
 | 
				
			|||||||
import org.whispersystems.textsecure.api.push.exceptions.EncapsulatedExceptions;
 | 
					import org.whispersystems.textsecure.api.push.exceptions.EncapsulatedExceptions;
 | 
				
			||||||
import org.whispersystems.textsecure.api.push.exceptions.NetworkFailureException;
 | 
					import org.whispersystems.textsecure.api.push.exceptions.NetworkFailureException;
 | 
				
			||||||
import org.whispersystems.textsecure.api.push.exceptions.UnregisteredUserException;
 | 
					import org.whispersystems.textsecure.api.push.exceptions.UnregisteredUserException;
 | 
				
			||||||
import org.whispersystems.textsecure.api.util.InvalidNumberException;
 | 
					 | 
				
			||||||
import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
 | 
					import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
import java.io.FileInputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.io.InputStream;
 | 
					 | 
				
			||||||
import java.nio.file.Files;
 | 
					 | 
				
			||||||
import java.nio.file.Paths;
 | 
					 | 
				
			||||||
import java.security.Security;
 | 
					import java.security.Security;
 | 
				
			||||||
import java.util.ArrayList;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class Main {
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -95,39 +88,22 @@ public class Main {
 | 
				
			|||||||
                    System.exit(1);
 | 
					                    System.exit(1);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                byte[] groupId = null;
 | 
					 | 
				
			||||||
                List<String> recipients = null;
 | 
					 | 
				
			||||||
                if (ns.getString("group") != null) {
 | 
					 | 
				
			||||||
                    try {
 | 
					 | 
				
			||||||
                        GroupInfo g = m.getGroupInfo(Base64.decode(ns.getString("group")));
 | 
					 | 
				
			||||||
                        if (g == null) {
 | 
					 | 
				
			||||||
                            System.err.println("Failed to send to group \"" + ns.getString("group") + "\": Unknown group");
 | 
					 | 
				
			||||||
                            System.err.println("Aborting sending.");
 | 
					 | 
				
			||||||
                            System.exit(1);
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        groupId = g.groupId;
 | 
					 | 
				
			||||||
                        recipients = new ArrayList<>(g.members);
 | 
					 | 
				
			||||||
                    } catch (IOException e) {
 | 
					 | 
				
			||||||
                        System.err.println("Failed to send to group \"" + ns.getString("group") + "\": " + e.getMessage());
 | 
					 | 
				
			||||||
                        System.err.println("Aborting sending.");
 | 
					 | 
				
			||||||
                        System.exit(1);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    recipients = ns.<String>getList("recipient");
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (ns.getBoolean("endsession")) {
 | 
					                if (ns.getBoolean("endsession")) {
 | 
				
			||||||
                    sendEndSessionMessage(m, recipients);
 | 
					                    if (ns.getList("recipient") == null) {
 | 
				
			||||||
                } else {
 | 
					                        System.err.println("No recipients given");
 | 
				
			||||||
                    List<TextSecureAttachment> textSecureAttachments = null;
 | 
					 | 
				
			||||||
                    try {
 | 
					 | 
				
			||||||
                        textSecureAttachments = getTextSecureAttachments(ns.<String>getList("attachment"));
 | 
					 | 
				
			||||||
                    } catch (IOException e) {
 | 
					 | 
				
			||||||
                        System.err.println("Failed to add attachment: " + e.getMessage());
 | 
					 | 
				
			||||||
                        System.err.println("Aborting sending.");
 | 
					                        System.err.println("Aborting sending.");
 | 
				
			||||||
                        System.exit(1);
 | 
					                        System.exit(1);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					                    try {
 | 
				
			||||||
 | 
					                        m.sendEndSessionMessage(ns.getList("recipient"));
 | 
				
			||||||
 | 
					                    } catch (IOException e) {
 | 
				
			||||||
 | 
					                        handleIOException(e);
 | 
				
			||||||
 | 
					                    } catch (EncapsulatedExceptions e) {
 | 
				
			||||||
 | 
					                        handleEncapsulatedExceptions(e);
 | 
				
			||||||
 | 
					                    } catch (AssertionError e) {
 | 
				
			||||||
 | 
					                        handleAssertionError(e);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
                    String messageText = ns.getString("message");
 | 
					                    String messageText = ns.getString("message");
 | 
				
			||||||
                    if (messageText == null) {
 | 
					                    if (messageText == null) {
 | 
				
			||||||
                        try {
 | 
					                        try {
 | 
				
			||||||
@ -139,7 +115,26 @@ public class Main {
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    sendMessage(m, messageText, textSecureAttachments, recipients, groupId);
 | 
					                    try {
 | 
				
			||||||
 | 
					                        if (ns.getString("group") != null) {
 | 
				
			||||||
 | 
					                            byte[] groupId = decodeGroupId(ns.getString("group"));
 | 
				
			||||||
 | 
					                            m.sendGroupMessage(messageText, ns.<String>getList("attachment"), groupId);
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            m.sendMessage(messageText, ns.<String>getList("attachment"), ns.getList("recipient"));
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    } catch (IOException e) {
 | 
				
			||||||
 | 
					                        handleIOException(e);
 | 
				
			||||||
 | 
					                    } catch (EncapsulatedExceptions e) {
 | 
				
			||||||
 | 
					                        handleEncapsulatedExceptions(e);
 | 
				
			||||||
 | 
					                    } catch (AssertionError e) {
 | 
				
			||||||
 | 
					                        handleAssertionError(e);
 | 
				
			||||||
 | 
					                    } catch (GroupNotFoundException e) {
 | 
				
			||||||
 | 
					                        handleGroupNotFoundException(e);
 | 
				
			||||||
 | 
					                    } catch (AttachmentInvalidException e) {
 | 
				
			||||||
 | 
					                        System.err.println("Failed to add attachment (\"" + e.getAttachment() + "\"): " + e.getMessage());
 | 
				
			||||||
 | 
					                        System.err.println("Aborting sending.");
 | 
				
			||||||
 | 
					                        System.exit(1);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
@ -176,19 +171,17 @@ public class Main {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    GroupInfo g = m.getGroupInfo(Base64.decode(ns.getString("group")));
 | 
					                    m.sendQuitGroupMessage(decodeGroupId(ns.getString("group")));
 | 
				
			||||||
                    if (g == null) {
 | 
					                } catch (IOException e) {
 | 
				
			||||||
                        System.err.println("Failed to send to group \"" + ns.getString("group") + "\": Unknown group");
 | 
					                    handleIOException(e);
 | 
				
			||||||
                        System.err.println("Aborting sending.");
 | 
					                } catch (EncapsulatedExceptions e) {
 | 
				
			||||||
                        System.exit(1);
 | 
					                    handleEncapsulatedExceptions(e);
 | 
				
			||||||
 | 
					                } catch (AssertionError e) {
 | 
				
			||||||
 | 
					                    handleAssertionError(e);
 | 
				
			||||||
 | 
					                } catch (GroupNotFoundException e) {
 | 
				
			||||||
 | 
					                    handleGroupNotFoundException(e);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    sendQuitGroupMessage(m, new ArrayList<>(g.members), g.groupId);
 | 
					 | 
				
			||||||
                } catch (IOException e) {
 | 
					 | 
				
			||||||
                    System.err.println("Failed to send to group \"" + ns.getString("group") + "\": " + e.getMessage());
 | 
					 | 
				
			||||||
                    System.err.println("Aborting sending.");
 | 
					 | 
				
			||||||
                    System.exit(1);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case "updateGroup":
 | 
					            case "updateGroup":
 | 
				
			||||||
                if (!m.isRegistered()) {
 | 
					                if (!m.isRegistered()) {
 | 
				
			||||||
@ -197,65 +190,24 @@ public class Main {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    GroupInfo g;
 | 
					                    byte[] groupId = null;
 | 
				
			||||||
                    if (ns.getString("group") != null) {
 | 
					                    if (ns.getString("group") != null) {
 | 
				
			||||||
                        g = m.getGroupInfo(Base64.decode(ns.getString("group")));
 | 
					                        groupId = decodeGroupId(ns.getString("group"));
 | 
				
			||||||
                        if (g == null) {
 | 
					 | 
				
			||||||
                            System.err.println("Failed to send to group \"" + ns.getString("group") + "\": Unknown group");
 | 
					 | 
				
			||||||
                            System.err.println("Aborting sending.");
 | 
					 | 
				
			||||||
                            System.exit(1);
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    } else {
 | 
					                    byte[] newGroupId = m.sendUpdateGroupMessage(groupId, ns.getString("name"), ns.getList("member"), ns.getString("avatar"));
 | 
				
			||||||
                        // Create new group
 | 
					                    if (groupId == null) {
 | 
				
			||||||
                        g = new GroupInfo(Util.getSecretBytes(16));
 | 
					                        System.out.println("Creating new group \"" + Base64.encodeBytes(newGroupId) + "\" …");
 | 
				
			||||||
                        g.members.add(m.getUsername());
 | 
					 | 
				
			||||||
                        System.out.println("Creating new group \"" + Base64.encodeBytes(g.groupId) + "\" …");
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
                    String name = ns.getString("name");
 | 
					 | 
				
			||||||
                    if (name != null) {
 | 
					 | 
				
			||||||
                        g.name = name;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    final List<String> members = ns.getList("member");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (members != null) {
 | 
					 | 
				
			||||||
                        for (String member : members) {
 | 
					 | 
				
			||||||
                            try {
 | 
					 | 
				
			||||||
                                g.members.add(m.canonicalizeNumber(member));
 | 
					 | 
				
			||||||
                            } catch (InvalidNumberException e) {
 | 
					 | 
				
			||||||
                                System.err.println("Failed to add member \"" + member + "\" to group: " + e.getMessage());
 | 
					 | 
				
			||||||
                                System.err.println("Aborting…");
 | 
					 | 
				
			||||||
                                System.exit(1);
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    TextSecureGroup.Builder group = TextSecureGroup.newBuilder(TextSecureGroup.Type.UPDATE)
 | 
					 | 
				
			||||||
                            .withId(g.groupId)
 | 
					 | 
				
			||||||
                            .withName(g.name)
 | 
					 | 
				
			||||||
                            .withMembers(new ArrayList<>(g.members));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    String avatar = ns.getString("avatar");
 | 
					 | 
				
			||||||
                    if (avatar != null) {
 | 
					 | 
				
			||||||
                        try {
 | 
					 | 
				
			||||||
                            group.withAvatar(createAttachment(avatar));
 | 
					 | 
				
			||||||
                            // TODO
 | 
					 | 
				
			||||||
                            g.avatarId = 0;
 | 
					 | 
				
			||||||
                } catch (IOException e) {
 | 
					                } catch (IOException e) {
 | 
				
			||||||
                            System.err.println("Failed to add attachment \"" + avatar + "\": " + e.getMessage());
 | 
					                    handleIOException(e);
 | 
				
			||||||
                            System.err.println("Aborting sending.");
 | 
					                } catch (AttachmentInvalidException e) {
 | 
				
			||||||
                            System.exit(1);
 | 
					                    System.err.println("Failed to add avatar attachment (\"" + e.getAttachment() + ") for group\": " + e.getMessage());
 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    m.setGroupInfo(g);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    sendUpdateGroupMessage(m, group.build());
 | 
					 | 
				
			||||||
                } catch (IOException e) {
 | 
					 | 
				
			||||||
                    System.err.println("Failed to send to group \"" + ns.getString("group") + "\": " + e.getMessage());
 | 
					 | 
				
			||||||
                    System.err.println("Aborting sending.");
 | 
					                    System.err.println("Aborting sending.");
 | 
				
			||||||
                    System.exit(1);
 | 
					                    System.exit(1);
 | 
				
			||||||
 | 
					                } catch (GroupNotFoundException e) {
 | 
				
			||||||
 | 
					                    handleGroupNotFoundException(e);
 | 
				
			||||||
 | 
					                } catch (EncapsulatedExceptions e) {
 | 
				
			||||||
 | 
					                    handleEncapsulatedExceptions(e);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
@ -264,24 +216,21 @@ public class Main {
 | 
				
			|||||||
        System.exit(0);
 | 
					        System.exit(0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static List<TextSecureAttachment> getTextSecureAttachments(List<String> attachments) {
 | 
					    private static void handleGroupNotFoundException(GroupNotFoundException e) {
 | 
				
			||||||
    private static List<TextSecureAttachment> getTextSecureAttachments(List<String> attachments) throws IOException {
 | 
					        System.err.println("Failed to send to group \"" + Base64.encodeBytes(e.getGroupId()) + "\": Unknown group");
 | 
				
			||||||
        List<TextSecureAttachment> textSecureAttachments = null;
 | 
					        System.err.println("Aborting sending.");
 | 
				
			||||||
        if (attachments != null) {
 | 
					        System.exit(1);
 | 
				
			||||||
            textSecureAttachments = new ArrayList<>(attachments.size());
 | 
					 | 
				
			||||||
            for (String attachment : attachments) {
 | 
					 | 
				
			||||||
                textSecureAttachments.add(createAttachment(attachment));
 | 
					 | 
				
			||||||
             }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return textSecureAttachments;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static TextSecureAttachmentStream createAttachment(String attachment) throws IOException {
 | 
					    private static byte[] decodeGroupId(String groupId) {
 | 
				
			||||||
        File attachmentFile = new File(attachment);
 | 
					        try {
 | 
				
			||||||
        InputStream attachmentStream = new FileInputStream(attachmentFile);
 | 
					            return Base64.decode(groupId);
 | 
				
			||||||
        final long attachmentSize = attachmentFile.length();
 | 
					        } catch (IOException e) {
 | 
				
			||||||
        String mime = Files.probeContentType(Paths.get(attachment));
 | 
					            System.err.println("Failed to decode groupId (must be base64) \"" + groupId + "\": " + e.getMessage());
 | 
				
			||||||
        return new TextSecureAttachmentStream(attachmentStream, mime, attachmentSize, null);
 | 
					            System.err.println("Aborting sending.");
 | 
				
			||||||
 | 
					            System.exit(1);
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static Namespace parseArgs(String[] args) {
 | 
					    private static Namespace parseArgs(String[] args) {
 | 
				
			||||||
@ -369,57 +318,14 @@ public class Main {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static void sendMessage(Manager m, String messageText, List<TextSecureAttachment> textSecureAttachments,
 | 
					    private static void handleAssertionError(AssertionError e) {
 | 
				
			||||||
                                    List<String> recipients, byte[] groupId) {
 | 
					        System.err.println("Failed to send message (Assertion): " + e.getMessage());
 | 
				
			||||||
        final TextSecureDataMessage.Builder messageBuilder = TextSecureDataMessage.newBuilder().withBody(messageText);
 | 
					        System.err.println(e.getStackTrace());
 | 
				
			||||||
        if (textSecureAttachments != null) {
 | 
					        System.err.println("If you use an Oracle JRE please check if you have unlimited strength crypto enabled, see README");
 | 
				
			||||||
            messageBuilder.withAttachments(textSecureAttachments);
 | 
					        System.exit(1);
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (groupId != null) {
 | 
					 | 
				
			||||||
            messageBuilder.asGroupMessage(new TextSecureGroup(groupId));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        TextSecureDataMessage message = messageBuilder.build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        sendMessage(m, message, recipients);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static void sendEndSessionMessage(Manager m, List<String> recipients) {
 | 
					    private static void handleEncapsulatedExceptions(EncapsulatedExceptions e) {
 | 
				
			||||||
        final TextSecureDataMessage.Builder messageBuilder = TextSecureDataMessage.newBuilder().asEndSessionMessage();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        TextSecureDataMessage message = messageBuilder.build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        sendMessage(m, message, recipients);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static void sendQuitGroupMessage(Manager m, List<String> recipients, byte[] groupId) {
 | 
					 | 
				
			||||||
        final TextSecureDataMessage.Builder messageBuilder = TextSecureDataMessage.newBuilder();
 | 
					 | 
				
			||||||
        TextSecureGroup group = TextSecureGroup.newBuilder(TextSecureGroup.Type.QUIT)
 | 
					 | 
				
			||||||
                .withId(groupId)
 | 
					 | 
				
			||||||
                .build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        messageBuilder.asGroupMessage(group);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        TextSecureDataMessage message = messageBuilder.build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        sendMessage(m, message, recipients);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static void sendUpdateGroupMessage(Manager m, TextSecureGroup g) {
 | 
					 | 
				
			||||||
        final TextSecureDataMessage.Builder messageBuilder = TextSecureDataMessage.newBuilder();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        messageBuilder.asGroupMessage(g);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        TextSecureDataMessage message = messageBuilder.build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        sendMessage(m, message, g.getMembers().get());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static void sendMessage(Manager m, TextSecureDataMessage message, List<String> recipients) {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            m.sendMessage(recipients, message);
 | 
					 | 
				
			||||||
        } catch (IOException e) {
 | 
					 | 
				
			||||||
            System.err.println("Failed to send message: " + e.getMessage());
 | 
					 | 
				
			||||||
        } catch (EncapsulatedExceptions e) {
 | 
					 | 
				
			||||||
        System.err.println("Failed to send (some) messages:");
 | 
					        System.err.println("Failed to send (some) messages:");
 | 
				
			||||||
        for (NetworkFailureException n : e.getNetworkExceptions()) {
 | 
					        for (NetworkFailureException n : e.getNetworkExceptions()) {
 | 
				
			||||||
            System.err.println("Network failure for \"" + n.getE164number() + "\": " + n.getMessage());
 | 
					            System.err.println("Network failure for \"" + n.getE164number() + "\": " + n.getMessage());
 | 
				
			||||||
@ -430,12 +336,10 @@ public class Main {
 | 
				
			|||||||
        for (UntrustedIdentityException n : e.getUntrustedIdentityExceptions()) {
 | 
					        for (UntrustedIdentityException n : e.getUntrustedIdentityExceptions()) {
 | 
				
			||||||
            System.err.println("Untrusted Identity for \"" + n.getE164Number() + "\": " + n.getMessage());
 | 
					            System.err.println("Untrusted Identity for \"" + n.getE164Number() + "\": " + n.getMessage());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        } catch (AssertionError e) {
 | 
					 | 
				
			||||||
            System.err.println("Failed to send message (Assertion): " + e.getMessage());
 | 
					 | 
				
			||||||
            System.err.println(e.getStackTrace());
 | 
					 | 
				
			||||||
            System.err.println("If you use an Oracle JRE please check if you have unlimited strength crypto enabled, see README");
 | 
					 | 
				
			||||||
            System.exit(1);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static void handleIOException(IOException e) {
 | 
				
			||||||
 | 
					        System.err.println("Failed to send message: " + e.getMessage());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
 | 
					    private static class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
 | 
				
			||||||
 | 
				
			|||||||
@ -44,6 +44,8 @@ import org.whispersystems.textsecure.api.util.InvalidNumberException;
 | 
				
			|||||||
import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
 | 
					import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.*;
 | 
					import java.io.*;
 | 
				
			||||||
 | 
					import java.nio.file.Files;
 | 
				
			||||||
 | 
					import java.nio.file.Paths;
 | 
				
			||||||
import java.util.*;
 | 
					import java.util.*;
 | 
				
			||||||
import java.util.concurrent.TimeUnit;
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
import java.util.concurrent.TimeoutException;
 | 
					import java.util.concurrent.TimeoutException;
 | 
				
			||||||
@ -244,7 +246,132 @@ class Manager {
 | 
				
			|||||||
        accountManager.setPreKeys(axolotlStore.getIdentityKeyPair().getPublicKey(), lastResortKey, signedPreKeyRecord, oneTimePreKeys);
 | 
					        accountManager.setPreKeys(axolotlStore.getIdentityKeyPair().getPublicKey(), lastResortKey, signedPreKeyRecord, oneTimePreKeys);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void sendMessage(List<String> recipients, TextSecureDataMessage message)
 | 
					
 | 
				
			||||||
 | 
					    private static List<TextSecureAttachment> getTextSecureAttachments(List<String> attachments) throws AttachmentInvalidException {
 | 
				
			||||||
 | 
					        List<TextSecureAttachment> textSecureAttachments = null;
 | 
				
			||||||
 | 
					        if (attachments != null) {
 | 
				
			||||||
 | 
					            textSecureAttachments = new ArrayList<>(attachments.size());
 | 
				
			||||||
 | 
					            for (String attachment : attachments) {
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    textSecureAttachments.add(createAttachment(attachment));
 | 
				
			||||||
 | 
					                } catch (IOException e) {
 | 
				
			||||||
 | 
					                    throw new AttachmentInvalidException(attachment, e);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return textSecureAttachments;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static TextSecureAttachmentStream createAttachment(String attachment) throws IOException {
 | 
				
			||||||
 | 
					        File attachmentFile = new File(attachment);
 | 
				
			||||||
 | 
					        InputStream attachmentStream = new FileInputStream(attachmentFile);
 | 
				
			||||||
 | 
					        final long attachmentSize = attachmentFile.length();
 | 
				
			||||||
 | 
					        String mime = Files.probeContentType(Paths.get(attachment));
 | 
				
			||||||
 | 
					        return new TextSecureAttachmentStream(attachmentStream, mime, attachmentSize, null);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void sendGroupMessage(String messageText, List<String> attachments,
 | 
				
			||||||
 | 
					                                 byte[] groupId)
 | 
				
			||||||
 | 
					            throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException {
 | 
				
			||||||
 | 
					        final TextSecureDataMessage.Builder messageBuilder = TextSecureDataMessage.newBuilder().withBody(messageText);
 | 
				
			||||||
 | 
					        if (attachments != null) {
 | 
				
			||||||
 | 
					            messageBuilder.withAttachments(getTextSecureAttachments(attachments));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (groupId != null) {
 | 
				
			||||||
 | 
					            TextSecureGroup group = TextSecureGroup.newBuilder(TextSecureGroup.Type.DELIVER)
 | 
				
			||||||
 | 
					                    .withId(groupId)
 | 
				
			||||||
 | 
					                    .build();
 | 
				
			||||||
 | 
					            messageBuilder.asGroupMessage(group);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        TextSecureDataMessage message = messageBuilder.build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sendMessage(message, getGroupInfo(groupId).members);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void sendQuitGroupMessage(byte[] groupId) throws GroupNotFoundException, IOException, EncapsulatedExceptions {
 | 
				
			||||||
 | 
					        TextSecureGroup group = TextSecureGroup.newBuilder(TextSecureGroup.Type.QUIT)
 | 
				
			||||||
 | 
					                .withId(groupId)
 | 
				
			||||||
 | 
					                .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TextSecureDataMessage message = TextSecureDataMessage.newBuilder()
 | 
				
			||||||
 | 
					                .asGroupMessage(group)
 | 
				
			||||||
 | 
					                .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sendMessage(message, getGroupInfo(groupId).members);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public byte[] sendUpdateGroupMessage(byte[] groupId, String name, Collection<String> members, String avatarFile) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException {
 | 
				
			||||||
 | 
					        GroupInfo g;
 | 
				
			||||||
 | 
					        if (groupId == null) {
 | 
				
			||||||
 | 
					            // Create new group
 | 
				
			||||||
 | 
					            g = new GroupInfo(Util.getSecretBytes(16));
 | 
				
			||||||
 | 
					            g.members.add(getUsername());
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            g = getGroupInfo(groupId);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (name != null) {
 | 
				
			||||||
 | 
					            g.name = name;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (members != null) {
 | 
				
			||||||
 | 
					            for (String member : members) {
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    g.members.add(canonicalizeNumber(member));
 | 
				
			||||||
 | 
					                } catch (InvalidNumberException e) {
 | 
				
			||||||
 | 
					                    System.err.println("Failed to add member \"" + member + "\" to group: " + e.getMessage());
 | 
				
			||||||
 | 
					                    System.err.println("Aborting…");
 | 
				
			||||||
 | 
					                    System.exit(1);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TextSecureGroup.Builder group = TextSecureGroup.newBuilder(TextSecureGroup.Type.UPDATE)
 | 
				
			||||||
 | 
					                .withId(g.groupId)
 | 
				
			||||||
 | 
					                .withName(g.name)
 | 
				
			||||||
 | 
					                .withMembers(new ArrayList<>(g.members));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (avatarFile != null) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                group.withAvatar(createAttachment(avatarFile));
 | 
				
			||||||
 | 
					                // TODO
 | 
				
			||||||
 | 
					                g.avatarId = 0;
 | 
				
			||||||
 | 
					            } catch (IOException e) {
 | 
				
			||||||
 | 
					                throw new AttachmentInvalidException(avatarFile, e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        setGroupInfo(g);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TextSecureDataMessage message = TextSecureDataMessage.newBuilder()
 | 
				
			||||||
 | 
					                .asGroupMessage(group.build())
 | 
				
			||||||
 | 
					                .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sendMessage(message, g.members);
 | 
				
			||||||
 | 
					        return g.groupId;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void sendMessage(String messageText, List<String> attachments,
 | 
				
			||||||
 | 
					                            Collection<String> recipients)
 | 
				
			||||||
 | 
					            throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException {
 | 
				
			||||||
 | 
					        final TextSecureDataMessage.Builder messageBuilder = TextSecureDataMessage.newBuilder().withBody(messageText);
 | 
				
			||||||
 | 
					        if (attachments != null) {
 | 
				
			||||||
 | 
					            messageBuilder.withAttachments(getTextSecureAttachments(attachments));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        TextSecureDataMessage message = messageBuilder.build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sendMessage(message, recipients);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void sendEndSessionMessage(List<String> recipients) throws IOException, EncapsulatedExceptions {
 | 
				
			||||||
 | 
					        TextSecureDataMessage message = TextSecureDataMessage.newBuilder()
 | 
				
			||||||
 | 
					                .asEndSessionMessage()
 | 
				
			||||||
 | 
					                .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sendMessage(message, recipients);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void sendMessage(TextSecureDataMessage message, Collection<String> recipients)
 | 
				
			||||||
            throws IOException, EncapsulatedExceptions {
 | 
					            throws IOException, EncapsulatedExceptions {
 | 
				
			||||||
        TextSecureMessageSender messageSender = new TextSecureMessageSender(URL, TRUST_STORE, username, password,
 | 
					        TextSecureMessageSender messageSender = new TextSecureMessageSender(URL, TRUST_STORE, username, password,
 | 
				
			||||||
                axolotlStore, USER_AGENT, Optional.<TextSecureMessageSender.EventListener>absent());
 | 
					                axolotlStore, USER_AGENT, Optional.<TextSecureMessageSender.EventListener>absent());
 | 
				
			||||||
@ -310,8 +437,9 @@ class Manager {
 | 
				
			|||||||
                                    TextSecureGroup groupInfo = message.getGroupInfo().get();
 | 
					                                    TextSecureGroup groupInfo = message.getGroupInfo().get();
 | 
				
			||||||
                                    switch (groupInfo.getType()) {
 | 
					                                    switch (groupInfo.getType()) {
 | 
				
			||||||
                                        case UPDATE:
 | 
					                                        case UPDATE:
 | 
				
			||||||
 | 
					                                            try {
 | 
				
			||||||
                                                group = groupStore.getGroup(groupInfo.getGroupId());
 | 
					                                                group = groupStore.getGroup(groupInfo.getGroupId());
 | 
				
			||||||
                                            if (group == null) {
 | 
					                                            } catch (GroupNotFoundException e) {
 | 
				
			||||||
                                                group = new GroupInfo(groupInfo.getGroupId());
 | 
					                                                group = new GroupInfo(groupInfo.getGroupId());
 | 
				
			||||||
                                            }
 | 
					                                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -339,12 +467,16 @@ class Manager {
 | 
				
			|||||||
                                            groupStore.updateGroup(group);
 | 
					                                            groupStore.updateGroup(group);
 | 
				
			||||||
                                            break;
 | 
					                                            break;
 | 
				
			||||||
                                        case DELIVER:
 | 
					                                        case DELIVER:
 | 
				
			||||||
 | 
					                                            try {
 | 
				
			||||||
                                                group = groupStore.getGroup(groupInfo.getGroupId());
 | 
					                                                group = groupStore.getGroup(groupInfo.getGroupId());
 | 
				
			||||||
 | 
					                                            } catch (GroupNotFoundException e) {
 | 
				
			||||||
 | 
					                                            }
 | 
				
			||||||
                                            break;
 | 
					                                            break;
 | 
				
			||||||
                                        case QUIT:
 | 
					                                        case QUIT:
 | 
				
			||||||
 | 
					                                            try {
 | 
				
			||||||
                                                group = groupStore.getGroup(groupInfo.getGroupId());
 | 
					                                                group = groupStore.getGroup(groupInfo.getGroupId());
 | 
				
			||||||
                                            if (group != null) {
 | 
					 | 
				
			||||||
                                                group.members.remove(envelope.getSource());
 | 
					                                                group.members.remove(envelope.getSource());
 | 
				
			||||||
 | 
					                                            } catch (GroupNotFoundException e) {
 | 
				
			||||||
                                            }
 | 
					                                            }
 | 
				
			||||||
                                            break;
 | 
					                                            break;
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
@ -442,7 +574,7 @@ class Manager {
 | 
				
			|||||||
        return new TextSecureAddress(e164number);
 | 
					        return new TextSecureAddress(e164number);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public GroupInfo getGroupInfo(byte[] groupId) {
 | 
					    public GroupInfo getGroupInfo(byte[] groupId) throws GroupNotFoundException {
 | 
				
			||||||
        return groupStore.getGroup(groupId);
 | 
					        return groupStore.getGroup(groupId);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user