From 3f0e456002753000c7011ee82122014554bd9b1e Mon Sep 17 00:00:00 2001 From: Brice Date: Mon, 30 Nov 2020 11:23:27 +1100 Subject: [PATCH] SessionRequest unfinished implementation --- .../libsession/messaging/messages/Message.kt | 6 +- .../messages/control/TypingIndicator.kt | 2 + .../messages/control/unused/SessionRequest.kt | 67 ++++++++++++++++++- 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt index 6176cee7c8..3f2c5b0fee 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt @@ -15,9 +15,9 @@ abstract class Message { companion object { @JvmStatic - val ttl = 2 * 24 * 60 * 60 * 1000 + val ttl = 2 * 24 * 60 * 60 * 1000 //TODO not sure about that declaration - //fun fromProto(proto: SignalServiceProtos.Content): Message? {} + //TODO how to declare fromProto? } open fun isValid(): Boolean { @@ -26,8 +26,6 @@ abstract class Message { return sender != null && recipient != null } - - abstract fun toProto(): SignalServiceProtos.Content? } \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt index 005b11d155..ec9ae23358 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt @@ -8,6 +8,8 @@ class TypingIndicator() : ControlMessage() { companion object { const val TAG = "TypingIndicator" + //val ttl: 30 * 1000 //TODO + fun fromProto(proto: SignalServiceProtos.Content): TypingIndicator? { val typingIndicatorProto = proto.typingMessage ?: return null val kind = Kind.fromProto(typingIndicatorProto.action) diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/unused/SessionRequest.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/unused/SessionRequest.kt index 173fb141fc..8a25b5dccc 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/unused/SessionRequest.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/unused/SessionRequest.kt @@ -1,18 +1,81 @@ package org.session.libsession.messaging.messages.control.unused +import com.google.protobuf.ByteString import org.session.libsession.messaging.messages.control.ControlMessage import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate +import org.session.libsession.messaging.messages.control.TypingIndicator +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.libsignal.state.PreKeyBundle import org.session.libsignal.service.internal.push.SignalServiceProtos +import java.security.SecureRandom class SessionRequest() : ControlMessage() { + var preKeyBundle: PreKeyBundle? = null + companion object { + const val TAG = "SessionRequest" + fun fromProto(proto: SignalServiceProtos.Content): SessionRequest? { - TODO("Not yet implemented") + if (proto.nullMessage == null) return null + val preKeyBundleProto = proto.preKeyBundleMessage ?: return null + val registrationID: Int = 0 + //TODO looks like database stuff here + /*iOS code: Configuration.shared.storage.with { transaction in + registrationID = Configuration.shared.storage.getOrGenerateRegistrationID(using: transaction) + }*/ + val preKeyBundle = PreKeyBundle( + registrationID, + 1, + preKeyBundleProto.preKeyId, + null, //TODO preKeyBundleProto.preKey, + 0, //TODO preKeyBundleProto.signedKey, + null, //TODO preKeyBundleProto.signedKeyId, + preKeyBundleProto.signature.toByteArray(), + null, //TODO preKeyBundleProto.identityKey + ) ?: return null + return SessionRequest(preKeyBundle) } } + //constructor + internal constructor(preKeyBundle: PreKeyBundle) : this() { + this.preKeyBundle = preKeyBundle + } + + // validation + override fun isValid(): Boolean { + if (!super.isValid()) return false + return preKeyBundle != null + } + override fun toProto(): SignalServiceProtos.Content? { - TODO("Not yet implemented") + val preKeyBundle = preKeyBundle + if (preKeyBundle == null) { + Log.w(TAG, "Couldn't construct session request proto from: $this") + return null + } + val nullMessageProto = SignalServiceProtos.NullMessage.newBuilder() + val sr = SecureRandom() + val paddingSize = sr.nextInt(512) + val padding = ByteArray(paddingSize) + nullMessageProto.padding = ByteString.copyFrom(padding) + val preKeyBundleProto = SignalServiceProtos.PreKeyBundleMessage.newBuilder() + //TODO preKeyBundleProto.identityKey = preKeyBundle.identityKey + preKeyBundleProto.deviceId = preKeyBundle.deviceId + preKeyBundleProto.preKeyId = preKeyBundle.preKeyId + //TODO preKeyBundleProto.preKey = preKeyBundle.preKeyPublic + preKeyBundleProto.signedKeyId = preKeyBundle.signedPreKeyId + //TODO preKeyBundleProto.signedKey = preKeyBundle.signedPreKeyPublic + preKeyBundleProto.signature = ByteString.copyFrom(preKeyBundle.signedPreKeySignature) + val contentProto = SignalServiceProtos.Content.newBuilder() + try { + contentProto.nullMessage = nullMessageProto.build() + contentProto.preKeyBundleMessage = preKeyBundleProto.build() + return contentProto.build() + } catch (e: Exception) { + Log.w(TAG, "Couldn't construct session request proto from: $this") + return null + } } } \ No newline at end of file