light refactor + OpenGroupUrlParser implementation & unit test

This commit is contained in:
Brice-W
2021-05-03 14:15:39 +10:00
parent 9ee167c173
commit bb25877515
5 changed files with 251 additions and 236 deletions

View File

@@ -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 {

View File

@@ -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) {}

View File

@@ -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)
}
}