Пример #1
0
        private void handleEndSessionMessage(SignalServiceEnvelope envelope,
                                             SignalServiceDataMessage message,
                                             May <long> smsMessageId)
        {
            var smsDatabase         = DatabaseFactory.getTextMessageDatabase();//getEncryptingSmsDatabase(context);
            var incomingTextMessage = new IncomingTextMessage(envelope.getSource(),
                                                              envelope.getSourceDevice(),
                                                              message.getTimestamp(),
                                                              "", May <SignalServiceGroup> .NoValue);

            long threadId;

            if (!smsMessageId.HasValue)
            {
                IncomingEndSessionMessage incomingEndSessionMessage = new IncomingEndSessionMessage(incomingTextMessage);
                Pair <long, long>         messageAndThreadId        = smsDatabase.InsertMessageInbox(incomingEndSessionMessage);

                threadId = messageAndThreadId.second();
            }
            else
            {
                var messageId = smsMessageId.ForceGetValue();
                smsDatabase.MarkAsEndSession(messageId);
                threadId = smsDatabase.GetThreadIdForMessage(messageId);
            }

            SessionStore sessionStore = new TextSecureAxolotlStore();

            sessionStore.DeleteAllSessions(envelope.getSource());

            //SecurityEvent.broadcastSecurityUpdateEvent(context, threadId);
            //MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), threadId);
        }
Пример #2
0
        /*private void handleGroupMessage(@NonNull MasterSecretUnion masterSecret,
         *                              @NonNull TextSecureEnvelope envelope,
         *                              @NonNull TextSecureDataMessage message,
         *                              @NonNull Optional<Long> smsMessageId)
         * {
         *  GroupMessageProcessor.process(context, masterSecret, envelope, message);
         *
         *  if (smsMessageId.isPresent())
         *  {
         *      DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
         *  }
         * }
         *
         * private void handleSynchronizeSentMessage(@NonNull MasterSecretUnion masterSecret,
         *                                        @NonNull SentTranscriptMessage message,
         *                                        @NonNull Optional<Long> smsMessageId)
         * throws MmsException
         * {
         * if (message.getMessage().getAttachments().isPresent()) {
         *      handleSynchronizeSentMediaMessage(masterSecret, message, smsMessageId);
         *  } else {
         *      handleSynchronizeSentTextMessage(masterSecret, message, smsMessageId);
         *  }
         * }
         *
         * private void handleSynchronizeRequestMessage(@NonNull MasterSecretUnion masterSecret,
         *                                           @NonNull RequestMessage message)
         * {
         *  if (message.isContactsRequest())
         *  {
         *      ApplicationContext.getInstance(context)
         *                        .getJobManager()
         *                        .add(new MultiDeviceContactUpdateJob(getContext()));
         *  }
         *
         *  if (message.isGroupsRequest())
         *  {
         *      ApplicationContext.getInstance(context)
         *                        .getJobManager()
         *                        .add(new MultiDeviceGroupUpdateJob(getContext()));
         *  }
         * }
         *
         * private void handleMediaMessage(@NonNull MasterSecretUnion masterSecret,
         *                              @NonNull TextSecureEnvelope envelope,
         *                              @NonNull TextSecureDataMessage message,
         *                              @NonNull Optional<Long> smsMessageId)
         * throws MmsException
         * {
         *  MmsDatabase database     = DatabaseFactory.getMmsDatabase(context);
         *  String localNumber  = TextSecurePreferences.getLocalNumber(context);
         *  IncomingMediaMessage mediaMessage = new IncomingMediaMessage(masterSecret, envelope.getSource(),
         *                                                       localNumber, message.getTimestamp(),
         *                                                       Optional.fromNullable(envelope.getRelay()),
         *                                                       message.getBody(),
         *                                                       message.getGroupInfo(),
         *                                                       message.getAttachments());
         *
         *  Pair<Long, Long> messageAndThreadId =  database.insertSecureDecryptedMessageInbox(masterSecret, mediaMessage, -1);
         *
         *  ApplicationContext.getInstance(context)
         *            .getJobManager()
         *            .add(new AttachmentDownloadJob(context, messageAndThreadId.first));
         *
         * if (smsMessageId.isPresent()) {
         *      DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
         *  }
         *
         *  MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
         * }
         *
         * private void handleSynchronizeSentMediaMessage(@NonNull MasterSecretUnion masterSecret,
         *                                             @NonNull SentTranscriptMessage message,
         *                                             @NonNull Optional<Long> smsMessageId)
         * throws MmsException
         * {
         *  MmsDatabase database     = DatabaseFactory.getMmsDatabase(context);
         *  Recipients recipients   = getSyncMessageDestination(message);
         *  OutgoingMediaMessage mediaMessage = new OutgoingMediaMessage(context, masterSecret, recipients,
         *                                                        message.getMessage().getAttachments().get(),
         *                                                        message.getMessage().getBody().orNull());
         *
         *  mediaMessage = new OutgoingSecureMediaMessage(mediaMessage);
         *
         *  long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients);
         *  long messageId = database.insertMessageOutbox(masterSecret, mediaMessage, threadId, false, message.getTimestamp());
         *
         *  database.markAsSent(messageId, "push".getBytes(), 0);
         *  database.markAsPush(messageId);
         *
         *  ApplicationContext.getInstance(context)
         *                    .getJobManager()
         *                    .add(new AttachmentDownloadJob(context, messageId));
         *
         *  if (smsMessageId.isPresent())
         *  {
         *      DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
         *  }
         *  }
         */
        private void handleTextMessage(/*@NonNull MasterSecretUnion masterSecret,*/
            TextSecureEnvelope envelope,
            TextSecureDataMessage message /*,
                                           * @NonNull Optional<Long> smsMessageId*/)
        {
            MessageDatabase database = DatabaseFactory.getMessageDatabase();
            String          body     = message.getBody().HasValue ? message.getBody().ForceGetValue() : "";

            /*Pair<Long, Long> messageAndThreadId;
             *
             * if (smsMessageId.hasValue)
             * {
             *  messageAndThreadId = database.updateBundleMessageBody(masterSecret, smsMessageId.get(), body);
             * }
             * else
             * {*/
            IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(),
                                                                      envelope.getSourceDevice(),
                                                                      (long)message.getTimestamp(), body,
                                                                      message.getGroupInfo());

            textMessage = new IncomingEncryptedMessage(textMessage, body);
            /*messageAndThreadId = */ database.insertMessageInbox(/*masterSecret, */ textMessage);

            /*}
             *
             * MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);*/
        }
Пример #3
0
        private Pair <long, long> insertPlaceholder(SignalServiceEnvelope envelope)
        {
            var database = DatabaseFactory.getTextMessageDatabase(); //getEncryptingSmsDatabase(context);
            IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(), envelope.getSourceDevice(),
                                                                      envelope.getTimestamp(), "",
                                                                      May <SignalServiceGroup> .NoValue);

            textMessage = new IncomingEncryptedMessage(textMessage, "");
            return(database.InsertMessageInbox(textMessage));
        }
Пример #4
0
        private void handleTextMessage(/*@NonNull MasterSecretUnion masterSecret,*/
            SignalServiceEnvelope envelope,
            SignalServiceDataMessage message,
            May <long> smsMessageId)
        {
            var    textMessageDatabase = DatabaseFactory.getTextMessageDatabase();
            String body = message.getBody().HasValue ? message.getBody().ForceGetValue() : "";


            IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(),
                                                                      envelope.getSourceDevice(),
                                                                      message.getTimestamp(), body,
                                                                      message.getGroupInfo());

            textMessage = new IncomingEncryptedMessage(textMessage, body);
            var messageAndThreadId = textMessageDatabase.InsertMessageInbox(textMessage);

            ToastHelper.NotifyNewMessage(messageAndThreadId.second(), DatabaseFactory.getDirectoryDatabase().GetForNumber(envelope.getSource()).Name, body);
        }
Пример #5
0
        private void handleUntrustedIdentityMessage(SignalServiceEnvelope envelope, May <long> smsMessageId)
        {
            try
            {
                var                 database       = DatabaseFactory.getTextMessageDatabase(); //getEncryptingSmsDatabase(context);
                Recipients          recipients     = RecipientFactory.getRecipientsFromString(envelope.getSource(), false);
                long                recipientId    = recipients.getPrimaryRecipient().getRecipientId();
                PreKeySignalMessage whisperMessage = new PreKeySignalMessage(envelope.getLegacyMessage());
                IdentityKey         identityKey    = whisperMessage.getIdentityKey();
                String              encoded        = Base64.encodeBytes(envelope.getLegacyMessage());
                IncomingTextMessage textMessage    = new IncomingTextMessage(envelope.getSource(), envelope.getSourceDevice(),
                                                                             envelope.getTimestamp(), encoded,
                                                                             May <SignalServiceGroup> .NoValue);

                if (!smsMessageId.HasValue)
                {
                    IncomingPreKeyBundleMessage bundleMessage      = new IncomingPreKeyBundleMessage(textMessage, encoded);
                    Pair <long, long>           messageAndThreadId = database.InsertMessageInbox(bundleMessage);

                    database.SetMismatchedIdentity(messageAndThreadId.first(), recipientId, identityKey);
                    //MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
                }
                else
                {
                    var messageId = smsMessageId.ForceGetValue();
                    database.UpdateMessageBody(messageId, encoded);
                    database.MarkAsPreKeyBundle(messageId);
                    database.SetMismatchedIdentity(messageId, recipientId, identityKey);
                }
            }
            catch (InvalidMessageException e)
            {
                throw new InvalidOperationException(e.Message);
            }
            catch (InvalidVersionException e)
            {
                throw new InvalidOperationException(e.Message);
            }
        }
        public IncomingEndSessionMessage(IncomingTextMessage parent, string newBody)
            : base(parent, newBody)
        {

        }
 public IncomingEndSessionMessage(IncomingTextMessage parent)
     : this(parent, parent.getMessageBody())
 {
 }
Пример #8
0
 public IncomingEndSessionMessage(IncomingTextMessage parent, string newBody)
     : base(parent, newBody)
 {
 }
Пример #9
0
 public IncomingEndSessionMessage(IncomingTextMessage parent)
     : this(parent, parent.getMessageBody())
 {
 }
Пример #10
0
 public Pair <long, long> insertMessageInbox(IncomingTextMessage message)
 {
     return(insertMessageInbox(message, MessageTypes.BASE_INBOX_TYPE));
 }
Пример #11
0
        /*protected Pair<long, long> updateMessageBodyAndType(long messageId, String body, long maskOff, long maskOn)
         * {
         *  SQLiteDatabase db = databaseHelper.getWritableDatabase();
         *  db.execSQL("UPDATE " + TABLE_NAME + " SET " + BODY + " = ?, " +
         *                 TYPE + " = (" + TYPE + " & " + (MessageTypes.TOTAL_MASK - maskOff) + " | " + maskOn + ") " +
         *                 "WHERE " + ID + " = ?",
         *             new String[] { body, messageId + "" });
         *
         *  long threadId = getThreadIdForMessage(messageId);
         *
         *  DatabaseFactory.getThreadDatabase().update(threadId);
         *  notifyConversationListeners(threadId);
         *  //notifyConversationListListeners();
         *
         *  return new Pair<long, long>(messageId, threadId);
         * }
         *
         * public Pair<long, long> copyMessageInbox(long messageId)
         * {
         *  Reader reader = readerFor(getMessage(messageId));
         *  SmsMessageRecord record = reader.getNext();
         *
         *  ContentValues contentValues = new ContentValues();
         *  contentValues.put(TYPE, (record.getType() & ~MessageTypes.BASE_TYPE_MASK) | MessageTypes.BASE_INBOX_TYPE);
         *  contentValues.put(ADDRESS, record.getIndividualRecipient().getNumber());
         *  contentValues.put(ADDRESS_DEVICE_ID, record.getRecipientDeviceId());
         *  contentValues.put(DATE_RECEIVED, System.currentTimeMillis());
         *  contentValues.put(DATE_SENT, record.getDateSent());
         *  contentValues.put(PROTOCOL, 31337);
         *  contentValues.put(READ, 0);
         *  contentValues.put(BODY, record.getBody().getBody());
         *  contentValues.put(THREAD_ID, record.getThreadId());
         *
         *  SQLiteDatabase db = databaseHelper.getWritableDatabase();
         *  long newMessageId = db.insert(TABLE_NAME, null, contentValues);
         *
         *  DatabaseFactory.getThreadDatabase(context).update(record.getThreadId());
         *  notifyConversationListeners(record.getThreadId());
         *
         *  jobManager.add(new TrimThreadJob(context, record.getThreadId()));
         *  reader.close();
         *
         *  return new Pair<>(newMessageId, record.getThreadId());
         * }
         */
        protected Pair <long, long> insertMessageInbox(IncomingTextMessage message, long type)
        {
            if (message.isPreKeyBundle())
            {
                type |= MessageTypes.KEY_EXCHANGE_BIT | MessageTypes.KEY_EXCHANGE_BUNDLE_BIT;
            }
            else if (message.isSecureMessage())
            {
                type |= MessageTypes.SECURE_MESSAGE_BIT;
            }

            /*else if (message.isGroup()) TODO: GROUP enable
             * {
             *  type |= MessageTypes.SECURE_MESSAGE_BIT;
             *  if (((IncomingGroupMessage)message).isUpdate()) type |= MessageTypes.GROUP_UPDATE_BIT;
             *  else if (((IncomingGroupMessage)message).isQuit()) type |= MessageTypes.GROUP_QUIT_BIT;
             * }*/
            else if (message.isEndSession())
            {
                type |= MessageTypes.SECURE_MESSAGE_BIT;
                type |= MessageTypes.END_SESSION_BIT;
            }

            if (message.isPush())
            {
                type |= MessageTypes.PUSH_MESSAGE_BIT;
            }

            Recipients recipients;

            if (message.getSender() != null)
            {
                recipients = RecipientFactory.getRecipientsFromString(message.getSender(), true);
            }
            else
            {
                //Log.w(TAG, "Sender is null, returning unknown recipient");
                recipients = new Recipients(Recipient.getUnknownRecipient());
            }

            Recipients groupRecipients;

            if (message.getGroupId() == null)
            {
                groupRecipients = null;
            }
            else
            {
                groupRecipients = RecipientFactory.getRecipientsFromString(message.getGroupId(), true);
            }

            bool unread = /*org.thoughtcrime.securesms.util.Util.isDefaultSmsProvider() ||*/
                          message.isSecureMessage() || message.isPreKeyBundle();

            long threadId;

            if (groupRecipients == null)
            {
                threadId = DatabaseFactory.getThreadDatabase().GetThreadIdForRecipients(recipients);                          // TODO CHECK
            }
            else
            {
                threadId = DatabaseFactory.getThreadDatabase().GetThreadIdForRecipients(groupRecipients);
            }

            /*ContentValues values = new ContentValues(6);
             * values.put(ADDRESS, message.getSender());
             * values.put(ADDRESS_DEVICE_ID, message.getSenderDeviceId());
             * values.put(DATE_RECEIVED, System.currentTimeMillis());
             * values.put(DATE_SENT, message.getSentTimestampMillis());
             * values.put(PROTOCOL, message.getProtocol());
             * values.put(READ, unread ? 0 : 1);
             *
             * if (!TextUtils.isEmpty(message.getPseudoSubject()))
             *  values.put(SUBJECT, message.getPseudoSubject());
             *
             * values.put(REPLY_PATH_PRESENT, message.isReplyPathPresent());
             * values.put(SERVICE_CENTER, message.getServiceCenterAddress());
             * values.put(BODY, message.getMessageBody());
             * values.put(TYPE, type);
             * values.put(THREAD_ID, threadId);*/

            var insert = new Message()
            {
                Address         = message.getSender(),
                AddressDeviceId = message.getSenderDeviceId(),
                DateReceived    = TimeUtil.GetDateTimeMillis(), // force precision to millis not to ticks
                DateSent        = TimeUtil.GetDateTime(message.getSentTimestampMillis()),
                Read            = !unread,
                Body            = message.getMessageBody(),
                Type            = type,
                ThreadId        = threadId
            };

            long rows = conn.Insert(insert);

            long messageId = insert.MessageId;

            if (unread)
            {
                DatabaseFactory.getThreadDatabase().SetUnread(threadId);
            }

            DatabaseFactory.getThreadDatabase().Refresh(threadId);
            notifyConversationListeners(threadId);
            //jobManager.add(new TrimThreadJob(context, threadId)); // TODO

            return(new Pair <long, long>(messageId, threadId));
        }