From f7362602f3647a4c6a4efb43a70d583156245043 Mon Sep 17 00:00:00 2001 From: Koen <koen@pop-os.localdomain> Date: Tue, 25 Jul 2023 15:41:59 +0200 Subject: [PATCH] Added serialized support. --- .../java/com/futo/polycentric/core/Models.kt | 10 +++++--- .../com/futo/polycentric/core/SystemState.kt | 2 ++ .../java/com/futo/polycentric/core/Utility.kt | 6 +++-- .../core/serializers/ByteArraySerializer.kt | 25 +++++++++++++++++++ .../core/serializers/ClaimSerializer.kt | 23 +++++++++++++++++ 5 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/futo/polycentric/core/serializers/ByteArraySerializer.kt create mode 100644 app/src/main/java/com/futo/polycentric/core/serializers/ClaimSerializer.kt diff --git a/app/src/main/java/com/futo/polycentric/core/Models.kt b/app/src/main/java/com/futo/polycentric/core/Models.kt index 5edf931..58c96ea 100644 --- a/app/src/main/java/com/futo/polycentric/core/Models.kt +++ b/app/src/main/java/com/futo/polycentric/core/Models.kt @@ -1,5 +1,6 @@ package com.futo.polycentric.core +import com.futo.polycentric.core.serializers.ByteArraySerializer import com.google.protobuf.ByteString import com.google.protobuf.InvalidProtocolBufferException import kotlinx.serialization.Serializable @@ -40,7 +41,8 @@ enum class ClaimType(val value: String) { } class Blob(val mime: String, val content: ByteArray) { } -class Digest(val digestType: Long, val digest: ByteArray) { +@Serializable +class Digest(val digestType: Long, @Serializable(with = ByteArraySerializer::class) val digest: ByteArray) { init { if (digestType != 1L) { throw IllegalArgumentException("unknown digest type") @@ -87,6 +89,7 @@ fun ByteArray.hash(): Digest { return Digest(1L, digest) } +@Serializable data class Pointer( val system: PublicKey, val process: Process, @@ -184,7 +187,7 @@ data class Opinion(val data: ByteArray) { } @Serializable -data class PublicKey(val keyType: Long, val key: ByteArray) { +data class PublicKey(val keyType: Long, @Serializable(with = ByteArraySerializer::class) val key: ByteArray) { init { if (keyType != 1L) { throw IllegalArgumentException("unknown key type") @@ -286,7 +289,8 @@ class PrivateKey(val keyType: Long, val key: ByteArray) { } } -class Process(val process: ByteArray) { +@Serializable +class Process(@Serializable(with = ByteArraySerializer::class) val process: ByteArray) { init { if (process.size != 16) { throw IllegalArgumentException("incorrect process size") diff --git a/app/src/main/java/com/futo/polycentric/core/SystemState.kt b/app/src/main/java/com/futo/polycentric/core/SystemState.kt index b0a453f..129f1d3 100644 --- a/app/src/main/java/com/futo/polycentric/core/SystemState.kt +++ b/app/src/main/java/com/futo/polycentric/core/SystemState.kt @@ -1,7 +1,9 @@ package com.futo.polycentric.core +import kotlinx.serialization.Serializable import userpackage.Protocol +@Serializable class SystemState( val servers: Array<String>, val processes: Array<Process>, diff --git a/app/src/main/java/com/futo/polycentric/core/Utility.kt b/app/src/main/java/com/futo/polycentric/core/Utility.kt index 93ccc2a..e9895b3 100644 --- a/app/src/main/java/com/futo/polycentric/core/Utility.kt +++ b/app/src/main/java/com/futo/polycentric/core/Utility.kt @@ -1,6 +1,8 @@ package com.futo.polycentric.core import android.util.Base64 +import com.futo.polycentric.core.serializers.ClaimSerializer +import kotlinx.serialization.Serializable import userpackage.Protocol import userpackage.Protocol.Claim import userpackage.Protocol.URLInfoSystemLink @@ -29,8 +31,8 @@ fun String.base64ToByteArray(): ByteArray { return Base64.decode(this, Base64.NO_PADDING or Base64.NO_WRAP) } - -data class OwnedClaim(val system: PublicKey, val claim: Claim); +@Serializable +data class OwnedClaim(val system: PublicKey, @Serializable(with = ClaimSerializer::class) val claim: Claim); fun List<SignedEvent>.getValidClaims(): List<OwnedClaim> { val validClaims = arrayListOf<OwnedClaim>(); diff --git a/app/src/main/java/com/futo/polycentric/core/serializers/ByteArraySerializer.kt b/app/src/main/java/com/futo/polycentric/core/serializers/ByteArraySerializer.kt new file mode 100644 index 0000000..dfa040c --- /dev/null +++ b/app/src/main/java/com/futo/polycentric/core/serializers/ByteArraySerializer.kt @@ -0,0 +1,25 @@ +package com.futo.polycentric.core.serializers + +import com.futo.polycentric.core.base64UrlToByteArray +import com.futo.polycentric.core.toBase64Url +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import userpackage.Protocol + +object ByteArraySerializer : KSerializer<ByteArray> { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("com.futo.polycentric.core.serializers.ByteArray", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: ByteArray) { + encoder.encodeString(value.toBase64Url()) + } + + override fun deserialize(decoder: Decoder): ByteArray { + val string = decoder.decodeString() + return string.base64UrlToByteArray() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/futo/polycentric/core/serializers/ClaimSerializer.kt b/app/src/main/java/com/futo/polycentric/core/serializers/ClaimSerializer.kt new file mode 100644 index 0000000..9b411d8 --- /dev/null +++ b/app/src/main/java/com/futo/polycentric/core/serializers/ClaimSerializer.kt @@ -0,0 +1,23 @@ +package com.futo.polycentric.core.serializers + +import com.futo.polycentric.core.base64UrlToByteArray +import com.futo.polycentric.core.toBase64Url +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import userpackage.Protocol + +class ClaimSerializer : KSerializer<Protocol.Claim> { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Claim", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: Protocol.Claim) { + encoder.encodeString(value.toByteArray().toBase64Url()) + } + override fun deserialize(decoder: Decoder): Protocol.Claim { + val value = decoder.decodeString(); + return Protocol.Claim.parseFrom(value.base64UrlToByteArray()); + } +} \ No newline at end of file -- GitLab