mirror of
https://github.com/oxen-io/session-android.git
synced 2025-08-12 16:37:41 +00:00
light refactor + OpenGroupUrlParser implementation & unit test
This commit is contained in:
@@ -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 {
|
||||
|
@@ -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) {}
|
@@ -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)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user