From bb25877515fa62c6f5ee842235d813aaae5bde2d Mon Sep 17 00:00:00 2001 From: Brice-W Date: Mon, 3 May 2021 14:15:39 +1000 Subject: [PATCH] light refactor + OpenGroupUrlParser implementation & unit test --- .../messages/control/OpenGroupInvitation.kt | 27 +- .../utilities/OpenGroupUrlParser.kt | 38 ++ .../utilities/OpenGroupUrlParserTest.kt | 65 ++++ libsignal/protobuf/SignalService.proto | 5 +- .../internal/push/SignalServiceProtos.java | 352 +++++++----------- 5 files changed, 251 insertions(+), 236 deletions(-) create mode 100644 libsession/src/main/java/org/session/libsession/utilities/OpenGroupUrlParser.kt create mode 100644 libsession/src/test/java/org/session/libsession/utilities/OpenGroupUrlParserTest.kt diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/OpenGroupInvitation.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/OpenGroupInvitation.kt index e43712d46a..bbb3653719 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/OpenGroupInvitation.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/OpenGroupInvitation.kt @@ -5,39 +5,34 @@ import org.session.libsignal.utilities.logging.Log class OpenGroupInvitation() : ControlMessage() { - var serverAddress: String? = null; - var channelId: Int? = 0; - var serverName: String? = null; + var groupUrl: String? = null; + var groupName: String? = null; companion object { const val TAG = "OpenGroupInvitation" fun fromProto(proto: SignalServiceProtos.Content): OpenGroupInvitation? { val openGroupInvitationProto = if (proto.hasOpenGroupInvitation()) proto.openGroupInvitation else return null - val serverAddress = openGroupInvitationProto.serverAddress - val channelId = openGroupInvitationProto.channelId - val serverName = openGroupInvitationProto.serverName - return OpenGroupInvitation(serverAddress, channelId, serverName) + val serverAddress = openGroupInvitationProto.groupUrl + val serverName = openGroupInvitationProto.groupName + return OpenGroupInvitation(serverAddress, serverName) } } - constructor(serverAddress: String?, channelId: Int, serverName: String?): this() { - this.serverAddress = serverAddress - this.channelId = channelId - this.serverName = serverName + constructor(url: String?, serverName: String?): this() { + this.groupUrl = url + this.groupName = serverName } override fun isValid(): Boolean { if (!super.isValid()) return false - //TODO determine what's required - return (serverAddress != null && channelId != null && serverName != null) + return (groupUrl != null && groupName != null) } override fun toProto(): SignalServiceProtos.Content? { val openGroupInvitationProto = SignalServiceProtos.OpenGroupInvitation.newBuilder() - openGroupInvitationProto.serverAddress = serverAddress - openGroupInvitationProto.channelId = channelId ?: 0 - openGroupInvitationProto.serverName = serverName + openGroupInvitationProto.groupUrl = groupUrl + openGroupInvitationProto.groupName = groupName val proto = SignalServiceProtos.Content.newBuilder() return try { diff --git a/libsession/src/main/java/org/session/libsession/utilities/OpenGroupUrlParser.kt b/libsession/src/main/java/org/session/libsession/utilities/OpenGroupUrlParser.kt new file mode 100644 index 0000000000..ea610fcd4f --- /dev/null +++ b/libsession/src/main/java/org/session/libsession/utilities/OpenGroupUrlParser.kt @@ -0,0 +1,38 @@ +package org.session.libsession.utilities + +import java.net.MalformedURLException +import java.net.URL + +object OpenGroupUrlParser { + + // Error + sealed class Error(val description: String) : Exception(description) { + class MalformedUrl(message: String?) : Error("Malformed URL: $message.") + object NoRoomSpecified : Error("No room specified in the URL.") + object NoPublicKeySpecified : Error("No public key specified in the URL.") + object WrongQuery : Error("'public_key' argument is missing.") + object InvalidPublicKeyProvided : Error("Invalid public key provided.") + } + + private const val pathPrefix = "/" + private const val queryPrefix = "public_key=" + + fun parseUrl(url: String): OpenGroupRoom { + // If the URL is malformed, it will throw an exception + val url = try { URL(url) } catch (e: MalformedURLException) { throw Error.MalformedUrl(e.message) } + + val host = url.host + // Test if the room is specified in the URL + val room = if (!url.path.isNullOrEmpty()) url.path.removePrefix(pathPrefix) else throw Error.NoRoomSpecified + // Test if the query is specified in the URL + val query = if (!url.query.isNullOrEmpty()) url.query else throw Error.NoPublicKeySpecified + // Test if 'public_key' is specified in the URL + val publicKey = if (query.contains(queryPrefix)) url.query.removePrefix(queryPrefix) else throw Error.WrongQuery + // Public key must be 64 characters + if (publicKey.length != 64) throw Error.InvalidPublicKeyProvided + + return OpenGroupRoom(host,room,publicKey) + } +} + +class OpenGroupRoom(val serverHost: String, val room: String, val serverPublicKey: String) {} diff --git a/libsession/src/test/java/org/session/libsession/utilities/OpenGroupUrlParserTest.kt b/libsession/src/test/java/org/session/libsession/utilities/OpenGroupUrlParserTest.kt new file mode 100644 index 0000000000..1d82c849d3 --- /dev/null +++ b/libsession/src/test/java/org/session/libsession/utilities/OpenGroupUrlParserTest.kt @@ -0,0 +1,65 @@ +package org.session.libsession.utilities + +import org.junit.Test +import org.junit.Assert.* + +class OpenGroupUrlParserTest { + + @Test + fun parseUrlTest() { + val inputUrl = "https://sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c" + + val expectedHost = "sessionopengroup.co" + val expectedRoom = "main" + val expectedPublicKey = "658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c" + + val result = OpenGroupUrlParser.parseUrl(inputUrl) + assertEquals(expectedHost, result.serverHost) + assertEquals(expectedRoom, result.room) + assertEquals(expectedPublicKey, result.serverPublicKey) + } + + @Test + fun parseUrlWithIpTest() { + val inputUrl = "https://143.198.213.255:80/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c" + + val expectedHost = "143.198.213.255" + val expectedRoom = "main" + val expectedPublicKey = "658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c" + + val result = OpenGroupUrlParser.parseUrl(inputUrl) + assertEquals(expectedHost, result.serverHost) + assertEquals(expectedRoom, result.room) + assertEquals(expectedPublicKey, result.serverPublicKey) + } + + @Test(expected = OpenGroupUrlParser.Error.MalformedUrl::class) + fun parseUrlMalformedUrlTest() { + val inputUrl = "sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c" + OpenGroupUrlParser.parseUrl(inputUrl) + } + + @Test(expected = OpenGroupUrlParser.Error.NoRoomSpecified::class) + fun parseUrlNoRoomSpecifiedTest() { + val inputUrl = "https://sessionopengroup.comain?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c" + OpenGroupUrlParser.parseUrl(inputUrl) + } + + @Test(expected = OpenGroupUrlParser.Error.NoPublicKeySpecified::class) + fun parseUrlNoPublicKeySpecifiedTest() { + val inputUrl = "https://sessionopengroup.co/main" + OpenGroupUrlParser.parseUrl(inputUrl) + } + + @Test(expected = OpenGroupUrlParser.Error.WrongQuery::class) + fun parseUrlWrongQueryTest() { + val inputUrl = "https://sessionopengroup.co/main?publickey=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c" + OpenGroupUrlParser.parseUrl(inputUrl) + } + + @Test(expected = OpenGroupUrlParser.Error.InvalidPublicKeyProvided::class) + fun parseUrlInvalidPublicKeyProviedTest() { + val inputUrl = "https://sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adff" + OpenGroupUrlParser.parseUrl(inputUrl) + } +} diff --git a/libsignal/protobuf/SignalService.proto b/libsignal/protobuf/SignalService.proto index 24a75efa49..e5f286cca8 100644 --- a/libsignal/protobuf/SignalService.proto +++ b/libsignal/protobuf/SignalService.proto @@ -146,9 +146,8 @@ message DataMessage { } message OpenGroupInvitation { - optional string serverAddress = 1; - optional uint32 channelId = 2; - optional string serverName = 3; + optional string groupUrl = 1; + optional string groupName = 2; } message ConfigurationMessage { diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java index 9a4c126c5c..8f48a9d8d9 100644 --- a/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java @@ -12955,45 +12955,35 @@ public final class SignalServiceProtos { public interface OpenGroupInvitationOrBuilder extends com.google.protobuf.MessageOrBuilder { - // optional string serverAddress = 1; + // optional string groupUrl = 1; /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ - boolean hasServerAddress(); + boolean hasGroupUrl(); /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ - java.lang.String getServerAddress(); + java.lang.String getGroupUrl(); /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ com.google.protobuf.ByteString - getServerAddressBytes(); + getGroupUrlBytes(); - // optional uint32 channelId = 2; + // optional string groupName = 2; /** - * optional uint32 channelId = 2; + * optional string groupName = 2; */ - boolean hasChannelId(); + boolean hasGroupName(); /** - * optional uint32 channelId = 2; + * optional string groupName = 2; */ - int getChannelId(); - - // optional string serverName = 3; + java.lang.String getGroupName(); /** - * optional string serverName = 3; - */ - boolean hasServerName(); - /** - * optional string serverName = 3; - */ - java.lang.String getServerName(); - /** - * optional string serverName = 3; + * optional string groupName = 2; */ com.google.protobuf.ByteString - getServerNameBytes(); + getGroupNameBytes(); } /** * Protobuf type {@code signalservice.OpenGroupInvitation} @@ -13048,17 +13038,12 @@ public final class SignalServiceProtos { } case 10: { bitField0_ |= 0x00000001; - serverAddress_ = input.readBytes(); + groupUrl_ = input.readBytes(); break; } - case 16: { + case 18: { bitField0_ |= 0x00000002; - channelId_ = input.readUInt32(); - break; - } - case 26: { - bitField0_ |= 0x00000004; - serverName_ = input.readBytes(); + groupName_ = input.readBytes(); break; } } @@ -13101,20 +13086,20 @@ public final class SignalServiceProtos { } private int bitField0_; - // optional string serverAddress = 1; - public static final int SERVERADDRESS_FIELD_NUMBER = 1; - private java.lang.Object serverAddress_; + // optional string groupUrl = 1; + public static final int GROUPURL_FIELD_NUMBER = 1; + private java.lang.Object groupUrl_; /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ - public boolean hasServerAddress() { + public boolean hasGroupUrl() { return ((bitField0_ & 0x00000001) == 0x00000001); } /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ - public java.lang.String getServerAddress() { - java.lang.Object ref = serverAddress_; + public java.lang.String getGroupUrl() { + java.lang.Object ref = groupUrl_; if (ref instanceof java.lang.String) { return (java.lang.String) ref; } else { @@ -13122,58 +13107,42 @@ public final class SignalServiceProtos { (com.google.protobuf.ByteString) ref; java.lang.String s = bs.toStringUtf8(); if (bs.isValidUtf8()) { - serverAddress_ = s; + groupUrl_ = s; } return s; } } /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ public com.google.protobuf.ByteString - getServerAddressBytes() { - java.lang.Object ref = serverAddress_; + getGroupUrlBytes() { + java.lang.Object ref = groupUrl_; if (ref instanceof java.lang.String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); - serverAddress_ = b; + groupUrl_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } - // optional uint32 channelId = 2; - public static final int CHANNELID_FIELD_NUMBER = 2; - private int channelId_; + // optional string groupName = 2; + public static final int GROUPNAME_FIELD_NUMBER = 2; + private java.lang.Object groupName_; /** - * optional uint32 channelId = 2; + * optional string groupName = 2; */ - public boolean hasChannelId() { + public boolean hasGroupName() { return ((bitField0_ & 0x00000002) == 0x00000002); } /** - * optional uint32 channelId = 2; + * optional string groupName = 2; */ - public int getChannelId() { - return channelId_; - } - - // optional string serverName = 3; - public static final int SERVERNAME_FIELD_NUMBER = 3; - private java.lang.Object serverName_; - /** - * optional string serverName = 3; - */ - public boolean hasServerName() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional string serverName = 3; - */ - public java.lang.String getServerName() { - java.lang.Object ref = serverName_; + public java.lang.String getGroupName() { + java.lang.Object ref = groupName_; if (ref instanceof java.lang.String) { return (java.lang.String) ref; } else { @@ -13181,22 +13150,22 @@ public final class SignalServiceProtos { (com.google.protobuf.ByteString) ref; java.lang.String s = bs.toStringUtf8(); if (bs.isValidUtf8()) { - serverName_ = s; + groupName_ = s; } return s; } } /** - * optional string serverName = 3; + * optional string groupName = 2; */ public com.google.protobuf.ByteString - getServerNameBytes() { - java.lang.Object ref = serverName_; + getGroupNameBytes() { + java.lang.Object ref = groupName_; if (ref instanceof java.lang.String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); - serverName_ = b; + groupName_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; @@ -13204,9 +13173,8 @@ public final class SignalServiceProtos { } private void initFields() { - serverAddress_ = ""; - channelId_ = 0; - serverName_ = ""; + groupUrl_ = ""; + groupName_ = ""; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -13221,13 +13189,10 @@ public final class SignalServiceProtos { throws java.io.IOException { getSerializedSize(); if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeBytes(1, getServerAddressBytes()); + output.writeBytes(1, getGroupUrlBytes()); } if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeUInt32(2, channelId_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - output.writeBytes(3, getServerNameBytes()); + output.writeBytes(2, getGroupNameBytes()); } getUnknownFields().writeTo(output); } @@ -13240,15 +13205,11 @@ public final class SignalServiceProtos { size = 0; if (((bitField0_ & 0x00000001) == 0x00000001)) { size += com.google.protobuf.CodedOutputStream - .computeBytesSize(1, getServerAddressBytes()); + .computeBytesSize(1, getGroupUrlBytes()); } if (((bitField0_ & 0x00000002) == 0x00000002)) { size += com.google.protobuf.CodedOutputStream - .computeUInt32Size(2, channelId_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(3, getServerNameBytes()); + .computeBytesSize(2, getGroupNameBytes()); } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; @@ -13366,12 +13327,10 @@ public final class SignalServiceProtos { public Builder clear() { super.clear(); - serverAddress_ = ""; + groupUrl_ = ""; bitField0_ = (bitField0_ & ~0x00000001); - channelId_ = 0; + groupName_ = ""; bitField0_ = (bitField0_ & ~0x00000002); - serverName_ = ""; - bitField0_ = (bitField0_ & ~0x00000004); return this; } @@ -13403,15 +13362,11 @@ public final class SignalServiceProtos { if (((from_bitField0_ & 0x00000001) == 0x00000001)) { to_bitField0_ |= 0x00000001; } - result.serverAddress_ = serverAddress_; + result.groupUrl_ = groupUrl_; if (((from_bitField0_ & 0x00000002) == 0x00000002)) { to_bitField0_ |= 0x00000002; } - result.channelId_ = channelId_; - if (((from_bitField0_ & 0x00000004) == 0x00000004)) { - to_bitField0_ |= 0x00000004; - } - result.serverName_ = serverName_; + result.groupName_ = groupName_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -13428,17 +13383,14 @@ public final class SignalServiceProtos { public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.OpenGroupInvitation other) { if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.OpenGroupInvitation.getDefaultInstance()) return this; - if (other.hasServerAddress()) { + if (other.hasGroupUrl()) { bitField0_ |= 0x00000001; - serverAddress_ = other.serverAddress_; + groupUrl_ = other.groupUrl_; onChanged(); } - if (other.hasChannelId()) { - setChannelId(other.getChannelId()); - } - if (other.hasServerName()) { - bitField0_ |= 0x00000004; - serverName_ = other.serverName_; + if (other.hasGroupName()) { + bitField0_ |= 0x00000002; + groupName_ = other.groupName_; onChanged(); } this.mergeUnknownFields(other.getUnknownFields()); @@ -13468,183 +13420,150 @@ public final class SignalServiceProtos { } private int bitField0_; - // optional string serverAddress = 1; - private java.lang.Object serverAddress_ = ""; + // optional string groupUrl = 1; + private java.lang.Object groupUrl_ = ""; /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ - public boolean hasServerAddress() { + public boolean hasGroupUrl() { return ((bitField0_ & 0x00000001) == 0x00000001); } /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ - public java.lang.String getServerAddress() { - java.lang.Object ref = serverAddress_; + public java.lang.String getGroupUrl() { + java.lang.Object ref = groupUrl_; if (!(ref instanceof java.lang.String)) { java.lang.String s = ((com.google.protobuf.ByteString) ref) .toStringUtf8(); - serverAddress_ = s; + groupUrl_ = s; return s; } else { return (java.lang.String) ref; } } /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ public com.google.protobuf.ByteString - getServerAddressBytes() { - java.lang.Object ref = serverAddress_; + getGroupUrlBytes() { + java.lang.Object ref = groupUrl_; if (ref instanceof String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); - serverAddress_ = b; + groupUrl_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ - public Builder setServerAddress( + public Builder setGroupUrl( java.lang.String value) { if (value == null) { throw new NullPointerException(); } bitField0_ |= 0x00000001; - serverAddress_ = value; + groupUrl_ = value; onChanged(); return this; } /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ - public Builder clearServerAddress() { + public Builder clearGroupUrl() { bitField0_ = (bitField0_ & ~0x00000001); - serverAddress_ = getDefaultInstance().getServerAddress(); + groupUrl_ = getDefaultInstance().getGroupUrl(); onChanged(); return this; } /** - * optional string serverAddress = 1; + * optional string groupUrl = 1; */ - public Builder setServerAddressBytes( + public Builder setGroupUrlBytes( com.google.protobuf.ByteString value) { if (value == null) { throw new NullPointerException(); } bitField0_ |= 0x00000001; - serverAddress_ = value; + groupUrl_ = value; onChanged(); return this; } - // optional uint32 channelId = 2; - private int channelId_ ; + // optional string groupName = 2; + private java.lang.Object groupName_ = ""; /** - * optional uint32 channelId = 2; + * optional string groupName = 2; */ - public boolean hasChannelId() { + public boolean hasGroupName() { return ((bitField0_ & 0x00000002) == 0x00000002); } /** - * optional uint32 channelId = 2; + * optional string groupName = 2; */ - public int getChannelId() { - return channelId_; - } - /** - * optional uint32 channelId = 2; - */ - public Builder setChannelId(int value) { - bitField0_ |= 0x00000002; - channelId_ = value; - onChanged(); - return this; - } - /** - * optional uint32 channelId = 2; - */ - public Builder clearChannelId() { - bitField0_ = (bitField0_ & ~0x00000002); - channelId_ = 0; - onChanged(); - return this; - } - - // optional string serverName = 3; - private java.lang.Object serverName_ = ""; - /** - * optional string serverName = 3; - */ - public boolean hasServerName() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional string serverName = 3; - */ - public java.lang.String getServerName() { - java.lang.Object ref = serverName_; + public java.lang.String getGroupName() { + java.lang.Object ref = groupName_; if (!(ref instanceof java.lang.String)) { java.lang.String s = ((com.google.protobuf.ByteString) ref) .toStringUtf8(); - serverName_ = s; + groupName_ = s; return s; } else { return (java.lang.String) ref; } } /** - * optional string serverName = 3; + * optional string groupName = 2; */ public com.google.protobuf.ByteString - getServerNameBytes() { - java.lang.Object ref = serverName_; + getGroupNameBytes() { + java.lang.Object ref = groupName_; if (ref instanceof String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); - serverName_ = b; + groupName_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } /** - * optional string serverName = 3; + * optional string groupName = 2; */ - public Builder setServerName( + public Builder setGroupName( java.lang.String value) { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000004; - serverName_ = value; + bitField0_ |= 0x00000002; + groupName_ = value; onChanged(); return this; } /** - * optional string serverName = 3; + * optional string groupName = 2; */ - public Builder clearServerName() { - bitField0_ = (bitField0_ & ~0x00000004); - serverName_ = getDefaultInstance().getServerName(); + public Builder clearGroupName() { + bitField0_ = (bitField0_ & ~0x00000002); + groupName_ = getDefaultInstance().getGroupName(); onChanged(); return this; } /** - * optional string serverName = 3; + * optional string groupName = 2; */ - public Builder setServerNameBytes( + public Builder setGroupNameBytes( com.google.protobuf.ByteString value) { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000004; - serverName_ = value; + bitField0_ |= 0x00000002; + groupName_ = value; onChanged(); return this; } @@ -21202,38 +21121,37 @@ public final class SignalServiceProtos { "\020\001\022\027\n\023ENCRYPTION_KEY_PAIR\020\003\022\017\n\013NAME_CHAN" + "GE\020\004\022\021\n\rMEMBERS_ADDED\020\005\022\023\n\017MEMBERS_REMOV" + "ED\020\006\022\017\n\013MEMBER_LEFT\020\007\"$\n\005Flags\022\033\n\027EXPIRA" + - "TION_TIMER_UPDATE\020\002\"S\n\023OpenGroupInvitati", - "on\022\025\n\rserverAddress\030\001 \001(\t\022\021\n\tchannelId\030\002" + - " \001(\r\022\022\n\nserverName\030\003 \001(\t\"\316\003\n\024Configurati" + - "onMessage\022E\n\014closedGroups\030\001 \003(\0132/.signal" + - "service.ConfigurationMessage.ClosedGroup" + - "\022\022\n\nopenGroups\030\002 \003(\t\022\023\n\013displayName\030\003 \001(" + - "\t\022\026\n\016profilePicture\030\004 \001(\t\022\022\n\nprofileKey\030" + - "\005 \001(\014\022=\n\010contacts\030\006 \003(\0132+.signalservice." + - "ConfigurationMessage.Contact\032\202\001\n\013ClosedG" + - "roup\022\021\n\tpublicKey\030\001 \001(\014\022\014\n\004name\030\002 \001(\t\0221\n" + - "\021encryptionKeyPair\030\003 \001(\0132\026.signalservice", - ".KeyPair\022\017\n\007members\030\004 \003(\014\022\016\n\006admins\030\005 \003(" + - "\014\032V\n\007Contact\022\021\n\tpublicKey\030\001 \002(\014\022\014\n\004name\030" + - "\002 \002(\t\022\026\n\016profilePicture\030\003 \001(\t\022\022\n\nprofile" + - "Key\030\004 \001(\014\"u\n\016ReceiptMessage\0220\n\004type\030\001 \002(" + - "\0162\".signalservice.ReceiptMessage.Type\022\021\n" + - "\ttimestamp\030\002 \003(\004\"\036\n\004Type\022\014\n\010DELIVERY\020\000\022\010" + - "\n\004READ\020\001\"\354\001\n\021AttachmentPointer\022\n\n\002id\030\001 \002" + - "(\006\022\023\n\013contentType\030\002 \001(\t\022\013\n\003key\030\003 \001(\014\022\014\n\004" + - "size\030\004 \001(\r\022\021\n\tthumbnail\030\005 \001(\014\022\016\n\006digest\030" + - "\006 \001(\014\022\020\n\010fileName\030\007 \001(\t\022\r\n\005flags\030\010 \001(\r\022\r", - "\n\005width\030\t \001(\r\022\016\n\006height\030\n \001(\r\022\017\n\007caption" + - "\030\013 \001(\t\022\013\n\003url\030e \001(\t\"\032\n\005Flags\022\021\n\rVOICE_ME" + - "SSAGE\020\001\"\365\001\n\014GroupContext\022\n\n\002id\030\001 \001(\014\022.\n\004" + - "type\030\002 \001(\0162 .signalservice.GroupContext." + - "Type\022\014\n\004name\030\003 \001(\t\022\017\n\007members\030\004 \003(\t\0220\n\006a" + - "vatar\030\005 \001(\0132 .signalservice.AttachmentPo" + - "inter\022\016\n\006admins\030\006 \003(\t\"H\n\004Type\022\013\n\007UNKNOWN" + - "\020\000\022\n\n\006UPDATE\020\001\022\013\n\007DELIVER\020\002\022\010\n\004QUIT\020\003\022\020\n" + - "\014REQUEST_INFO\020\004BB\n+org.session.libsignal" + - ".service.internal.pushB\023SignalServicePro", - "tos" + "TION_TIMER_UPDATE\020\002\":\n\023OpenGroupInvitati", + "on\022\020\n\010groupUrl\030\001 \001(\t\022\021\n\tgroupName\030\002 \001(\t\"" + + "\316\003\n\024ConfigurationMessage\022E\n\014closedGroups" + + "\030\001 \003(\0132/.signalservice.ConfigurationMess" + + "age.ClosedGroup\022\022\n\nopenGroups\030\002 \003(\t\022\023\n\013d" + + "isplayName\030\003 \001(\t\022\026\n\016profilePicture\030\004 \001(\t" + + "\022\022\n\nprofileKey\030\005 \001(\014\022=\n\010contacts\030\006 \003(\0132+" + + ".signalservice.ConfigurationMessage.Cont" + + "act\032\202\001\n\013ClosedGroup\022\021\n\tpublicKey\030\001 \001(\014\022\014" + + "\n\004name\030\002 \001(\t\0221\n\021encryptionKeyPair\030\003 \001(\0132" + + "\026.signalservice.KeyPair\022\017\n\007members\030\004 \003(\014", + "\022\016\n\006admins\030\005 \003(\014\032V\n\007Contact\022\021\n\tpublicKey" + + "\030\001 \002(\014\022\014\n\004name\030\002 \002(\t\022\026\n\016profilePicture\030\003" + + " \001(\t\022\022\n\nprofileKey\030\004 \001(\014\"u\n\016ReceiptMessa" + + "ge\0220\n\004type\030\001 \002(\0162\".signalservice.Receipt" + + "Message.Type\022\021\n\ttimestamp\030\002 \003(\004\"\036\n\004Type\022" + + "\014\n\010DELIVERY\020\000\022\010\n\004READ\020\001\"\354\001\n\021AttachmentPo" + + "inter\022\n\n\002id\030\001 \002(\006\022\023\n\013contentType\030\002 \001(\t\022\013" + + "\n\003key\030\003 \001(\014\022\014\n\004size\030\004 \001(\r\022\021\n\tthumbnail\030\005" + + " \001(\014\022\016\n\006digest\030\006 \001(\014\022\020\n\010fileName\030\007 \001(\t\022\r" + + "\n\005flags\030\010 \001(\r\022\r\n\005width\030\t \001(\r\022\016\n\006height\030\n", + " \001(\r\022\017\n\007caption\030\013 \001(\t\022\013\n\003url\030e \001(\t\"\032\n\005Fl" + + "ags\022\021\n\rVOICE_MESSAGE\020\001\"\365\001\n\014GroupContext\022" + + "\n\n\002id\030\001 \001(\014\022.\n\004type\030\002 \001(\0162 .signalservic" + + "e.GroupContext.Type\022\014\n\004name\030\003 \001(\t\022\017\n\007mem" + + "bers\030\004 \003(\t\0220\n\006avatar\030\005 \001(\0132 .signalservi" + + "ce.AttachmentPointer\022\016\n\006admins\030\006 \003(\t\"H\n\004" + + "Type\022\013\n\007UNKNOWN\020\000\022\n\n\006UPDATE\020\001\022\013\n\007DELIVER" + + "\020\002\022\010\n\004QUIT\020\003\022\020\n\014REQUEST_INFO\020\004BB\n+org.se" + + "ssion.libsignal.service.internal.pushB\023S" + + "ignalServiceProtos" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -21317,7 +21235,7 @@ public final class SignalServiceProtos { internal_static_signalservice_OpenGroupInvitation_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_OpenGroupInvitation_descriptor, - new java.lang.String[] { "ServerAddress", "ChannelId", "ServerName", }); + new java.lang.String[] { "GroupUrl", "GroupName", }); internal_static_signalservice_ConfigurationMessage_descriptor = getDescriptor().getMessageTypes().get(7); internal_static_signalservice_ConfigurationMessage_fieldAccessorTable = new