|
|
@ -12,9 +12,6 @@ import org.session.libsession.messaging.messages.control.ClosedGroupControlMessa
|
|
|
|
import org.session.libsession.messaging.messages.control.ConfigurationMessage
|
|
|
|
import org.session.libsession.messaging.messages.control.ConfigurationMessage
|
|
|
|
import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate
|
|
|
|
import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate
|
|
|
|
import org.session.libsession.messaging.messages.visible.*
|
|
|
|
import org.session.libsession.messaging.messages.visible.*
|
|
|
|
import org.session.libsession.messaging.sending_receiving.attachments.Attachment as SignalAttachment
|
|
|
|
|
|
|
|
import org.session.libsession.messaging.sending_receiving.linkpreview.LinkPreview as SignalLinkPreview
|
|
|
|
|
|
|
|
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel as SignalQuote
|
|
|
|
|
|
|
|
import org.session.libsession.messaging.opengroups.OpenGroupAPI
|
|
|
|
import org.session.libsession.messaging.opengroups.OpenGroupAPI
|
|
|
|
import org.session.libsession.messaging.opengroups.OpenGroupMessage
|
|
|
|
import org.session.libsession.messaging.opengroups.OpenGroupMessage
|
|
|
|
import org.session.libsession.messaging.threads.Address
|
|
|
|
import org.session.libsession.messaging.threads.Address
|
|
|
@ -24,11 +21,15 @@ import org.session.libsession.snode.SnodeAPI
|
|
|
|
import org.session.libsession.snode.SnodeConfiguration
|
|
|
|
import org.session.libsession.snode.SnodeConfiguration
|
|
|
|
import org.session.libsession.snode.SnodeMessage
|
|
|
|
import org.session.libsession.snode.SnodeMessage
|
|
|
|
import org.session.libsession.utilities.SSKEnvironment
|
|
|
|
import org.session.libsession.utilities.SSKEnvironment
|
|
|
|
|
|
|
|
import org.session.libsignal.service.internal.push.PushTransportDetails
|
|
|
|
import org.session.libsignal.service.internal.push.SignalServiceProtos
|
|
|
|
import org.session.libsignal.service.internal.push.SignalServiceProtos
|
|
|
|
import org.session.libsignal.service.loki.api.crypto.ProofOfWork
|
|
|
|
import org.session.libsignal.service.loki.api.crypto.ProofOfWork
|
|
|
|
import org.session.libsignal.service.loki.utilities.hexEncodedPublicKey
|
|
|
|
import org.session.libsignal.service.loki.utilities.hexEncodedPublicKey
|
|
|
|
import org.session.libsignal.utilities.Base64
|
|
|
|
import org.session.libsignal.utilities.Base64
|
|
|
|
import org.session.libsignal.utilities.logging.Log
|
|
|
|
import org.session.libsignal.utilities.logging.Log
|
|
|
|
|
|
|
|
import org.session.libsession.messaging.sending_receiving.attachments.Attachment as SignalAttachment
|
|
|
|
|
|
|
|
import org.session.libsession.messaging.sending_receiving.linkpreview.LinkPreview as SignalLinkPreview
|
|
|
|
|
|
|
|
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel as SignalQuote
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
object MessageSender {
|
|
|
|
object MessageSender {
|
|
|
@ -76,21 +77,21 @@ object MessageSender {
|
|
|
|
// Set the timestamp, sender and recipient
|
|
|
|
// Set the timestamp, sender and recipient
|
|
|
|
message.sentTimestamp ?: run { message.sentTimestamp = System.currentTimeMillis() } /* Visible messages will already have their sent timestamp set */
|
|
|
|
message.sentTimestamp ?: run { message.sentTimestamp = System.currentTimeMillis() } /* Visible messages will already have their sent timestamp set */
|
|
|
|
message.sender = userPublicKey
|
|
|
|
message.sender = userPublicKey
|
|
|
|
|
|
|
|
val isSelfSend = (message.recipient == userPublicKey)
|
|
|
|
|
|
|
|
// Set the failure handler (need it here already for precondition failure handling)
|
|
|
|
|
|
|
|
fun handleFailure(error: Exception) {
|
|
|
|
|
|
|
|
handleFailedMessageSend(message, error)
|
|
|
|
|
|
|
|
if (destination is Destination.Contact && message is VisibleMessage && !isSelfSend) {
|
|
|
|
|
|
|
|
SnodeConfiguration.shared.broadcaster.broadcast("messageFailed", message.sentTimestamp!!)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
deferred.reject(error)
|
|
|
|
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
when (destination) {
|
|
|
|
when (destination) {
|
|
|
|
is Destination.Contact -> message.recipient = destination.publicKey
|
|
|
|
is Destination.Contact -> message.recipient = destination.publicKey
|
|
|
|
is Destination.ClosedGroup -> message.recipient = destination.groupPublicKey
|
|
|
|
is Destination.ClosedGroup -> message.recipient = destination.groupPublicKey
|
|
|
|
is Destination.OpenGroup -> throw preconditionFailure
|
|
|
|
is Destination.OpenGroup -> throw preconditionFailure
|
|
|
|
}
|
|
|
|
}
|
|
|
|
val isSelfSend = (message.recipient == userPublicKey)
|
|
|
|
|
|
|
|
// Set the failure handler (need it here already for precondition failure handling)
|
|
|
|
|
|
|
|
fun handleFailure(error: Exception) {
|
|
|
|
|
|
|
|
handleFailedMessageSend(message, error)
|
|
|
|
|
|
|
|
if (destination is Destination.Contact && message is VisibleMessage && !isSelfSend) {
|
|
|
|
|
|
|
|
SnodeConfiguration.shared.broadcaster.broadcast("messageFailed", message.sentTimestamp!!)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
deferred.reject(error)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate the message
|
|
|
|
// Validate the message
|
|
|
|
if (!message.isValid()) { throw Error.InvalidMessage }
|
|
|
|
if (!message.isValid()) { throw Error.InvalidMessage }
|
|
|
|
// Stop here if this is a self-send, unless it's:
|
|
|
|
// Stop here if this is a self-send, unless it's:
|
|
|
@ -118,7 +119,7 @@ object MessageSender {
|
|
|
|
// Convert it to protobuf
|
|
|
|
// Convert it to protobuf
|
|
|
|
val proto = message.toProto() ?: throw Error.ProtoConversionFailed
|
|
|
|
val proto = message.toProto() ?: throw Error.ProtoConversionFailed
|
|
|
|
// Serialize the protobuf
|
|
|
|
// Serialize the protobuf
|
|
|
|
val plaintext = proto.toByteArray()
|
|
|
|
val plaintext = PushTransportDetails.getPaddedMessageBody(proto.toByteArray())
|
|
|
|
// Encrypt the serialized protobuf
|
|
|
|
// Encrypt the serialized protobuf
|
|
|
|
val ciphertext: ByteArray
|
|
|
|
val ciphertext: ByteArray
|
|
|
|
when (destination) {
|
|
|
|
when (destination) {
|
|
|
@ -183,15 +184,14 @@ object MessageSender {
|
|
|
|
errorCount += 1
|
|
|
|
errorCount += 1
|
|
|
|
if (errorCount != promiseCount) { return@fail } // Only error out if all promises failed
|
|
|
|
if (errorCount != promiseCount) { return@fail } // Only error out if all promises failed
|
|
|
|
handleFailure(it)
|
|
|
|
handleFailure(it)
|
|
|
|
deferred.reject(it)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}.fail {
|
|
|
|
}.fail {
|
|
|
|
Log.d("Loki", "Couldn't send message due to error: $it.")
|
|
|
|
Log.d("Loki", "Couldn't send message due to error: $it.")
|
|
|
|
deferred.reject(it)
|
|
|
|
handleFailure(it)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (exception: Exception) {
|
|
|
|
} catch (exception: Exception) {
|
|
|
|
deferred.reject(exception)
|
|
|
|
handleFailure(exception)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return promise
|
|
|
|
return promise
|
|
|
|
}
|
|
|
|
}
|
|
|
|