Support sgnl://signal.group links.

This commit is contained in:
Alan Evans
2020-10-07 13:43:53 -03:00
committed by Greyson Parrelli
parent ab2235fc88
commit adf1674877
7 changed files with 65 additions and 36 deletions

View File

@@ -37,7 +37,11 @@ public final class GroupInviteLinkUrlTest {
givenGroup().withMasterKey("00f7e0c2a71ab064cc3ced4c04f08d7b7ef4b84b2c2206f69833be6cfe34df80")
.andPassword("9b")
.expectUrl("https://signal.group/#CiUKIAD34MKnGrBkzDztTATwjXt-9LhLLCIG9pgzvmz-NN-AEgGb")
.expectUrl("https://signal.group/#CiUKIAD34MKnGrBkzDztTATwjXt-9LhLLCIG9pgzvmz-NN-AEgGb"),
givenGroup().withMasterKey("2ca23c04d7cf60fe04039ae76d1912202c2a463d345d9cd48cf27f260dd37f6f")
.andPassword("2734457c02ce51da71ad0b62f3c222f7")
.expectUrl("sgnl://signal.group/#CjQKICyiPATXz2D-BAOa520ZEiAsKkY9NF2c1IzyfyYN039vEhAnNEV8As5R2nGtC2LzwiL3")
);
}
@@ -49,27 +53,33 @@ public final class GroupInviteLinkUrlTest {
@Test
public void can_extract_group_master_key_from_url() throws GroupInviteLinkUrl.InvalidGroupLinkException, GroupInviteLinkUrl.UnknownGroupLinkVersionException {
assertEquals(groupMasterKey, GroupInviteLinkUrl.fromUrl(expectedUrl).getGroupMasterKey());
assertEquals(groupMasterKey, GroupInviteLinkUrl.fromUri(expectedUrl).getGroupMasterKey());
}
@Test
public void can_extract_group_master_key_from_url_padded() throws GroupInviteLinkUrl.InvalidGroupLinkException, GroupInviteLinkUrl.UnknownGroupLinkVersionException {
assertEquals(groupMasterKey, GroupInviteLinkUrl.fromUrl(expectedUrl + "=").getGroupMasterKey());
assertEquals(groupMasterKey, GroupInviteLinkUrl.fromUri(expectedUrl + "=").getGroupMasterKey());
}
@Test
public void can_extract_password_from_url() throws GroupInviteLinkUrl.InvalidGroupLinkException, GroupInviteLinkUrl.UnknownGroupLinkVersionException {
assertEquals(password, GroupInviteLinkUrl.fromUrl(expectedUrl).getPassword());
assertEquals(password, GroupInviteLinkUrl.fromUri(expectedUrl).getPassword());
}
@Test
public void can_extract_password_from_url_padded() throws GroupInviteLinkUrl.InvalidGroupLinkException, GroupInviteLinkUrl.UnknownGroupLinkVersionException {
assertEquals(password, GroupInviteLinkUrl.fromUrl(expectedUrl + "=").getPassword());
assertEquals(password, GroupInviteLinkUrl.fromUri(expectedUrl + "=").getPassword());
}
@Test
public void can_reconstruct_url() {
assertEquals(expectedUrl, GroupInviteLinkUrl.createUrl(groupMasterKey, password));
String urlToCompare = expectedUrl;
if (urlToCompare.startsWith("sgnl")) {
urlToCompare = urlToCompare.replace("sgnl", "https");
}
assertEquals(urlToCompare, GroupInviteLinkUrl.createUrl(groupMasterKey, password));
}
private static TestBuilder givenGroup() {

View File

@@ -8,7 +8,6 @@ import com.google.protobuf.InvalidProtocolBufferException;
import org.junit.Test;
import org.signal.storageservice.protos.groups.GroupInviteLink;
import org.signal.zkgroup.InvalidInputException;
import org.signal.zkgroup.groups.GroupMasterKey;
import org.whispersystems.util.Base64UrlSafe;
import org.thoughtcrime.securesms.util.Util;
@@ -21,50 +20,55 @@ public final class GroupInviteLinkUrl_InvalidGroupLinkException_Test {
@Test
public void empty_string() throws GroupInviteLinkUrl.InvalidGroupLinkException, GroupInviteLinkUrl.UnknownGroupLinkVersionException {
assertNull(GroupInviteLinkUrl.fromUrl(""));
assertNull(GroupInviteLinkUrl.fromUri(""));
}
@Test
public void not_a_url_string() throws GroupInviteLinkUrl.InvalidGroupLinkException, GroupInviteLinkUrl.UnknownGroupLinkVersionException {
assertNull(GroupInviteLinkUrl.fromUrl("abc"));
assertNull(GroupInviteLinkUrl.fromUri("abc"));
}
@Test
public void wrong_host() throws GroupInviteLinkUrl.InvalidGroupLinkException, GroupInviteLinkUrl.UnknownGroupLinkVersionException {
assertNull(GroupInviteLinkUrl.fromUrl("https://x.signal.org/#CAESNAogpQEzURH6BON1bCS264cmTi37Yi6OHTOReXZUEHdsBIgSEPCLfiL7k4wCXmwVi31USVY"));
assertNull(GroupInviteLinkUrl.fromUri("https://x.signal.org/#CjQKIAD34MKnGrBkzDztTATwjXt-9LhLLCIG9pgzvmz-NN-AEhCbwyTuxDfP2mrluK779H7o"));
}
@Test
public void wrong_scheme() throws GroupInviteLinkUrl.InvalidGroupLinkException, GroupInviteLinkUrl.UnknownGroupLinkVersionException {
assertNull(GroupInviteLinkUrl.fromUri("http://signal.group/#CjQKIAD34MKnGrBkzDztTATwjXt-9LhLLCIG9pgzvmz-NN-AEhCbwyTuxDfP2mrluK779H7o"));
}
@Test
public void has_path() {
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUrl("https://signal.group/not_expected/#CAESNAogpQEzURH6BON1bCS264cmTi37Yi6OHTOReXZUEHdsBIgSEPCLfiL7k4wCXmwVi31USVY"))
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUri("https://signal.group/not_expected/#CjQKIAD34MKnGrBkzDztTATwjXt-9LhLLCIG9pgzvmz-NN-AEhCbwyTuxDfP2mrluK779H7o"))
.isInstanceOf(GroupInviteLinkUrl.InvalidGroupLinkException.class)
.hasMessage("No path was expected in url");
.hasMessage("No path was expected in uri");
}
@Test
public void missing_ref() {
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUrl("https://signal.group/"))
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUri("https://signal.group/"))
.isInstanceOf(GroupInviteLinkUrl.InvalidGroupLinkException.class)
.hasMessage("No reference was in the url");
.hasMessage("No reference was in the uri");
}
@Test
public void empty_ref() {
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUrl("https://signal.group/#"))
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUri("https://signal.group/#"))
.isInstanceOf(GroupInviteLinkUrl.InvalidGroupLinkException.class)
.hasMessage("No reference was in the url");
.hasMessage("No reference was in the uri");
}
@Test
public void bad_base64() {
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUrl("https://signal.group/#CAESNAogpQEzURH6BON1bCS264cmTi37Yi6HTOReXZUEHdsBIgSEPCLfiL7k4wCX;mwVi31USVY"))
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUri("https://signal.group/#CAESNAogpQEzURH6BON1bCS264cmTi37Yi6HTOReXZUEHdsBIgSEPCLfiL7k4wCX;mwVi31USVY"))
.isInstanceOf(GroupInviteLinkUrl.InvalidGroupLinkException.class)
.hasCauseExactlyInstanceOf(IOException.class);
}
@Test
public void bad_protobuf() {
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUrl("https://signal.group/#CAESNAogpQEzURH6BON1bCS264cmTi37Yi6HTOReXZUEHdsBIgSEPCLfiL7k4wCXmwVi31USVY"))
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUri("https://signal.group/#CAESNAogpQEzURH6BON1bCS264cmTi37Yi6HTOReXZUEHdsBIgSEPCLfiL7k4wCXmwVi31USVY"))
.isInstanceOf(GroupInviteLinkUrl.InvalidGroupLinkException.class)
.hasCauseExactlyInstanceOf(InvalidProtocolBufferException.class);
}
@@ -73,7 +77,7 @@ public final class GroupInviteLinkUrl_InvalidGroupLinkException_Test {
public void version_999_url() {
String url = "https://signal.group/#uj4zCiDMSxlNUvF4bQ3z3fYzGyZTFbJ1xEqWbPE3uZSD8bjOrxIP8NxV-0GUz3jpxMLR1rN3";
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUrl(url))
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUri(url))
.isInstanceOf(GroupInviteLinkUrl.UnknownGroupLinkVersionException.class)
.hasMessage("Url contains no known group link content");
}
@@ -87,7 +91,7 @@ public final class GroupInviteLinkUrl_InvalidGroupLinkException_Test {
String url = "https://signal.group/#" + encoding;
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUrl(url))
assertThatThrownBy(() -> GroupInviteLinkUrl.fromUri(url))
.isInstanceOf(GroupInviteLinkUrl.InvalidGroupLinkException.class)
.hasCauseExactlyInstanceOf(InvalidInputException.class);
}