diff --git a/src/main/scala/de/m7w3/signal/messages/MessageReceiver.scala b/src/main/scala/de/m7w3/signal/messages/MessageReceiver.scala index 6eff69a..f2e6d86 100644 --- a/src/main/scala/de/m7w3/signal/messages/MessageReceiver.scala +++ b/src/main/scala/de/m7w3/signal/messages/MessageReceiver.scala @@ -55,26 +55,24 @@ case class MessageReceiver(cipher: SignalServiceCipher, logger.debug(s"received receipt from ${envelope.getSource}") // not handled yet, just an example, maybe we don't need an event here eventPublisher.publishEvent(ReceiptEvent.fromEnevelope(envelope)) - } else { - if (envelope.isSignalMessage) { - logger.debug(s"got signalmessage from ${envelope.getSourceAddress.getNumber} ${envelope.getSourceDevice}") - // TODO: handle - } + } else if (envelope.isPreKeySignalMessage() || envelope.isSignalMessage()){ + //TODO: check that recipient is not blocked + //TODO: send recipient + val content = cipher.decrypt(envelope) if (content.getDataMessage.isPresent) { messageHandler.handleDataMessage(envelope, content.getDataMessage.get()) } else if (content.getSyncMessage.isPresent) { messageHandler.handleSyncMessage(envelope, content.getSyncMessage.get()) - } else { - logger.debug("no content in received message") - } - - // do this after decryption - if (envelope.isPreKeySignalMessage) { + } else if (envelope.isPreKeySignalMessage) { logger.debug("received prekey signal message") eventPublisher.publishEvent(PreKeyEvent(envelope, content)) + } else { + logger.warn("Got unrecognized message...") } + } else{ + logger.error(s"Received envelope of unknown type: ${envelope.getType()}") } } catch { diff --git a/src/main/scala/de/m7w3/signal/messages/SignalDesktopMessageHandler.scala b/src/main/scala/de/m7w3/signal/messages/SignalDesktopMessageHandler.scala index 9020e3e..6eb2bf4 100644 --- a/src/main/scala/de/m7w3/signal/messages/SignalDesktopMessageHandler.scala +++ b/src/main/scala/de/m7w3/signal/messages/SignalDesktopMessageHandler.scala @@ -7,11 +7,10 @@ import de.m7w3.signal.events.{ContactsSyncedEvent, EventPublisher, GroupsSyncedE import de.m7w3.signal.store.SignalDesktopApplicationStore import org.whispersystems.signalservice.api.SignalServiceMessageReceiver import org.whispersystems.signalservice.api.messages.multidevice._ -import org.whispersystems.signalservice.api.messages.{SignalServiceAttachment, SignalServiceDataMessage, SignalServiceEnvelope} - +import org.whispersystems.signalservice.api.messages.{SignalServiceAttachment, SignalServiceDataMessage, SignalServiceEnvelope, SignalServiceGroup} import scala.annotation.tailrec import scala.collection.JavaConverters.collectionAsScalaIterableConverter - +import de.m7w3.signal.store.model.TextMessage class SignalDesktopMessageHandler(signalDesktopApplicationStore: SignalDesktopApplicationStore, messageReceiver: SignalServiceMessageReceiver, @@ -109,7 +108,57 @@ class SignalDesktopMessageHandler(signalDesktopApplicationStore: SignalDesktopAp } } - override def handleDataMessage(envelope: SignalServiceEnvelope, dataMessage: SignalServiceDataMessage): Unit = { - logger.debug(s"received data message [${dataMessage.getBody} ${dataMessage.getGroupInfo}]") + override def handleDataMessage(envelope: SignalServiceEnvelope, message: SignalServiceDataMessage): Unit = { + logger.debug(s"received data message [${message.getBody} ${message.getGroupInfo}]") + + if (message.isEndSession()) handleEndSessionMessage(envelope, message) + else if (message.isGroupUpdate()) handleGroupMessage(envelope, message) + else if (message.isExpirationUpdate()) handleExpirationUpdate(envelope, message) + else if (message.getAttachments().isPresent()) handleMediaMessage(envelope, message) + else handleTextMessage(envelope, message) + + + //TODO: check the groupDatabase + // if (message.getGroupInfo().isPresent() && groupDatabase.isUnknownGroup(message.getGroupInfo().get().getGroupId())) { + // handleUnknownGroupMessage(envelope, message.getGroupInfo().get()); + // } + } + + def handleEndSessionMessage(envelope: SignalServiceEnvelope, message: SignalServiceDataMessage): Unit = { + logger.debug(s"received endSession message") + } + + def handleGroupMessage(envelope: SignalServiceEnvelope, message: SignalServiceDataMessage): Unit = { + logger.debug(s"received groupUpdate message") + } + + def handleExpirationUpdate(envelope: SignalServiceEnvelope, message: SignalServiceDataMessage): Unit = { + logger.debug(s"received expirationUpdate message") + } + + def handleMediaMessage(envelope: SignalServiceEnvelope, message: SignalServiceDataMessage): Unit = { + logger.debug(s"received mediaMessage message") + } + + def handleTextMessage(envelope: SignalServiceEnvelope, message: SignalServiceDataMessage): Unit = { + logger.debug(s"received textMessage message") + val body = if(message.getBody().isPresent()) message.getBody().get() else "" + val group = message.getGroupInfo() + val groupId = if (group.isPresent()) Some(group.get().getGroupId()) else None + + val textMessage = TextMessage(body, envelope.getSource(), envelope.getSourceDevice(), + message.getTimestamp(), groupId) + // textMessage = new IncomingEncryptedMessage(textMessage, body); + // val insertResult = database.insertMessageInbox(masterSecret, textMessage); + + // if (insertResult.isPresent()) threadId = insertResult.get().getThreadId(); + // else threadId = null; + + // if (smsMessageId.isPresent()) database.deleteMessage(smsMessageId.get()); + + } + + def handleUnknownGroupMessage(envelope: SignalServiceEnvelope, message: SignalServiceGroup): Unit = { + logger.debug(s"received unknownGroupMessage message") } } diff --git a/src/main/scala/de/m7w3/signal/store/model/IncomingTextMessage.scala b/src/main/scala/de/m7w3/signal/store/model/IncomingTextMessage.scala new file mode 100644 index 0000000..f7afa87 --- /dev/null +++ b/src/main/scala/de/m7w3/signal/store/model/IncomingTextMessage.scala @@ -0,0 +1,30 @@ +package de.m7w3.signal.store.model + +import slick.driver.H2Driver.api._ + +case class TextMessage( + val message: String, + val sender: String, + val senderDeviceId: Int, + // val protocol: Int, // seem to be set to 31337 + // val serviceCenterAddress: String, // "GCM" + // val replyPathPresent: Boolean, // true + // val pseudoSubject: String, // "" + val sentTimestampMillis: Long, + val groupId: Option[Array[Byte]] +) + +class TextMessages(tag: Tag) extends Table[Group](tag, "TEXTMESSAGES") { + def pk = column[Int]("pk", O.PrimaryKey) + def message = column[String]("MESSAGE") + def sender = column[String]("SENDER") + def senderDeviceId = column[Int]("SENDERDEVICEID") + def sentTimestampMillis = column[Long]("SENTTIMESTAMPMILLIS") + def groupId = column[Option[Array[Byte]]]("GROUPID") + + override def * = (pk, message, sender, senderDeviceId, sentTimestampMillis, groupId) <> (TextMessage.tupled, TextMessage.unapply) +} + +object TextMessages{ + val TextMessages = TableQuery[TextMessages] +} \ No newline at end of file