//--------------------------------------------------------Set-, Get- Methods:---------------------------------------------------------\\
        #region --Set-, Get- Methods--


        #endregion
        //--------------------------------------------------------Misc Methods:---------------------------------------------------------------\\
        #region --Misc Methods (Public)--


        #endregion

        #region --Misc Methods (Private)--
        private bool checkUserInput()
        {
            client = accountSelection_asc.getSelectedAccount();
            if (client is null)
            {
                accountSelection_asc.showErrorMessage("No account selected!");
                return(false);
            }
            if (client.getXMPPAccount().getBareJid().Equals(jabberId_tbx.Text))
            {
                accountSelection_asc.showErrorMessage("You can't start a chat with your self!");
                return(false);
            }
            if (!Utils.isBareJid(jabberId_tbx.Text))
            {
                accountSelection_asc.showErrorMessage("Invalid JabberID!");
                return(false);
            }
            jabberId = jabberId_tbx.Text;
            if (ChatDBManager.INSTANCE.doesChatExist(ChatTable.generateId(jabberId, client.getXMPPAccount().getBareJid())))
            {
                accountSelection_asc.showErrorMessage("Chat does already exist!");
                return(false);
            }
            return(true);
        }
        private void C_OmemoSessionBuildError(XMPPClient client, XMPP_API.Classes.Events.OmemoSessionBuildErrorEventArgs args)
        {
            Task.Run(() =>
            {
                ChatTable chat = ChatDBManager.INSTANCE.getChat(ChatTable.generateId(args.CHAT_JID, client.getXMPPAccount().getBareJid()));
                if (!(chat is null))
                {
                    // Add an error chat message:
                    ChatMessageTable msg = new ChatMessageTable()
                    {
                        id       = ChatMessageTable.generateErrorMessageId(AbstractMessage.getRandomId(), chat.id),
                        chatId   = chat.id,
                        date     = DateTime.Now,
                        fromUser = args.CHAT_JID,
                        isImage  = false,
                        message  = "Failed to encrypt and send " + args.MESSAGES.Count + " OMEMO message(s) with:\n" + args.ERROR,
                        state    = MessageState.UNREAD,
                        type     = MessageMessage.TYPE_ERROR
                    };
                    ChatDBManager.INSTANCE.setChatMessage(msg, true, false);

                    // Set chat messages to encrypted failed:
                    setOmemoChatMessagesSendFailed(args.MESSAGES, chat);
                }
            });
        }
        private void C_NewBookmarksResultMessage(XMPPClient client, NewBookmarksResultMessageEventArgs args)
        {
            foreach (ConferenceItem c in args.BOOKMARKS_MESSAGE.STORAGE.CONFERENCES)
            {
                bool   newMUC = false;
                string to     = client.getXMPPAccount().getIdAndDomain();
                string from   = c.jid;
                string id     = ChatTable.generateId(from, to);

                // Create / update chat:
                ChatTable chat = ChatDBManager.INSTANCE.getChat(id);
                if (chat == null)
                {
                    chat = new ChatTable()
                    {
                        id            = id,
                        chatJabberId  = from,
                        userAccountId = to,
                        ask           = null,
                        lastActive    = DateTime.Now,
                        muted         = false,
                        status        = null,
                        subscription  = null
                    };
                    newMUC = true;
                }
                chat.chatType = ChatType.MUC;
                chat.inRoster = true;
                chat.presence = Presence.Unavailable;

                ChatDBManager.INSTANCE.setChat(chat, false, true);

                // Create / update MUC info:
                MUCChatInfoTable info = MUCDBManager.INSTANCE.getMUCInfo(chat.id);
                if (info == null)
                {
                    info = new MUCChatInfoTable
                    {
                        chatId  = chat.id,
                        subject = null
                    };
                    newMUC = true;
                }

                info.autoEnterRoom = c.autoJoin;
                info.name          = c.name;
                info.nickname      = c.nick;
                info.password      = c.password;

                MUCDBManager.INSTANCE.setMUCChatInfo(info, false, true);


                // Enter MUC manually if the MUC is new for this client:
                if (newMUC && info.autoEnterRoom && !Settings.getSettingBoolean(SettingsConsts.DISABLE_AUTO_JOIN_MUC))
                {
                    Task.Run(() => MUCHandler.INSTANCE.enterMUCAsync(client, chat, info));
                }
            }
        }
Beispiel #4
0
        public OmemoFingerprint getFingerprint(SignalProtocolAddress address, string accountId)
        {
            string chatId = ChatTable.generateId(address.getName(), accountId);
            string id     = OmemoFingerprintTable.generateId(chatId, address);
            List <OmemoFingerprintTable> list = dB.Query <OmemoFingerprintTable>(true, "SELECT * FROM " + DBTableConsts.OMEMO_FINGERPRINT_TABLE + " WHERE id = ?;", id);

            return(list.Count <= 0 ? null : list[0].toOmemoFingerprint());
        }
Beispiel #5
0
 public void deleteAllForAccount(string accountId)
 {
     deleteIdentityKey(accountId);
     deletePreKey(accountId);
     deleteSignedPreKey(accountId);
     deleteSessions(accountId);
     deleteFingerprints(ChatTable.generateId(accountId, accountId));
 }
Beispiel #6
0
        public void onMUCRoomSubjectMessage(MUCRoomSubjectMessage mucRoomSubject)
        {
            string to   = Utils.getBareJidFromFullJid(mucRoomSubject.getTo());
            string from = Utils.getBareJidFromFullJid(mucRoomSubject.getFrom());
            string id   = ChatTable.generateId(from, to);

            MUCDBManager.INSTANCE.setMUCSubject(id, mucRoomSubject.SUBJECT, true);
        }
 private void C_NewDeliveryReceipt(XMPPClient client, NewDeliveryReceiptEventArgs args)
 {
     Task.Run(() =>
     {
         string to     = Utils.getBareJidFromFullJid(args.MSG.getTo());
         string from   = Utils.getBareJidFromFullJid(args.MSG.getFrom());
         string chatId = ChatTable.generateId(from, to);
         string msgId  = ChatMessageTable.generateId(args.MSG.RECEIPT_ID, chatId);
         ChatDBManager.INSTANCE.setMessageAsDeliverd(msgId, true);
     });
 }
Beispiel #8
0
        /// <summary>
        /// Tries to add the room.
        /// </summary>
        /// <returns>Returns true if the account got added.</returns>
        private bool addRoom()
        {
            if (checkUserInputAndWarn())
            {
                XMPPClient client = accountSelection_asc.getSelectedAccount();

                string roomJid = roomName_tbx.Text + '@' + server_asbx.Text.ToLower();

                ChatTable muc = new ChatTable()
                {
                    id            = ChatTable.generateId(roomJid, client.getXMPPAccount().getIdAndDomain()),
                    ask           = null,
                    chatJabberId  = roomJid,
                    userAccountId = client.getXMPPAccount().getIdAndDomain(),
                    chatType      = ChatType.MUC,
                    inRoster      = (bool)bookmark_cbx.IsChecked,
                    muted         = false,
                    lastActive    = DateTime.Now,
                    subscription  = "none"
                };
                ChatDBManager.INSTANCE.setChat(muc, false, true);

                MUCChatInfoTable info = new MUCChatInfoTable()
                {
                    chatId        = muc.id,
                    subject       = null,
                    state         = MUCState.DISCONNECTED,
                    name          = null,
                    password      = null,
                    nickname      = nick_tbx.Text,
                    autoEnterRoom = (bool)autoJoin_cbx.IsChecked
                };
                if ((bool)enablePassword_cbx.IsChecked)
                {
                    info.password = password_pwb.Password;
                }
                MUCDBManager.INSTANCE.setMUCChatInfo(info, false, true);

                if (info.autoEnterRoom)
                {
                    Task t = MUCHandler.INSTANCE.enterMUCAsync(client, muc, info);
                }

                if ((bool)bookmark_cbx.IsChecked)
                {
                    List <ConferenceItem> conferenceItems = MUCDBManager.INSTANCE.getXEP0048ConferenceItemsForAccount(client.getXMPPAccount().getIdAndDomain());
                    setBookmarkHelper = client.PUB_SUB_COMMAND_HELPER.setBookmars_xep_0048(conferenceItems, onMessage, onTimeout);
                }

                return(true);
            }
            return(false);
        }
Beispiel #9
0
        private async Task onMUCErrorMessageAsync(XMPPClient client, MUCErrorMessage errorMessage)
        {
            string room = Utils.getBareJidFromFullJid(errorMessage.getFrom());

            if (room != null)
            {
                string    chatId = ChatTable.generateId(room, client.getXMPPAccount().getBareJid());
                ChatTable muc    = ChatDBManager.INSTANCE.getChat(chatId);
                if (muc != null)
                {
                    MUCChatInfoTable info = MUCDBManager.INSTANCE.getMUCInfo(chatId);
                    if (info != null)
                    {
                        Logger.Error("Received an error message for MUC: " + muc.chatJabberId + "\n" + errorMessage.ERROR_MESSAGE);

                        stopMUCJoinHelper(muc);

                        if (info.state != MUCState.DISCONNECTED)
                        {
                            await sendMUCLeaveMessageAsync(client, muc, info);
                        }

                        switch (errorMessage.ERROR_CODE)
                        {
                        // No access - user got baned:
                        case 403:
                            MUCDBManager.INSTANCE.setMUCState(info.chatId, MUCState.BANED, true);
                            addChatInfoMessage(info.chatId, room, "Unable to join room!\nYou are baned from this room.");
                            return;

                        default:
                            MUCDBManager.INSTANCE.setMUCState(info.chatId, MUCState.ERROR, true);
                            break;
                        }

                        // Add an error chat message:
                        ChatMessageTable msg = new ChatMessageTable()
                        {
                            id       = ChatMessageTable.generateErrorMessageId(errorMessage.ID ?? AbstractMessage.getRandomId(), muc.id),
                            chatId   = muc.id,
                            date     = DateTime.Now,
                            fromUser = errorMessage.getFrom(),
                            isImage  = false,
                            message  = "Code: " + errorMessage.ERROR_CODE + "\nType: " + errorMessage.ERROR_TYPE + "\nMessage:\n" + errorMessage.ERROR_MESSAGE,
                            state    = MessageState.UNREAD,
                            type     = MessageMessage.TYPE_ERROR
                        };
                        ChatDBManager.INSTANCE.setChatMessage(msg, true, false);
                    }
                }
            }
        }
        private void C_NewPresence(XMPPClient client, XMPP_API.Classes.Events.NewPresenceMessageEventArgs args)
        {
            string from = Utils.getBareJidFromFullJid(args.PRESENCE_MESSAGE.getFrom());

            // If received a presence message from your own account, ignore it:
            if (string.Equals(from, client.getXMPPAccount().getIdAndDomain()))
            {
                return;
            }

            string    to   = client.getXMPPAccount().getIdAndDomain();
            string    id   = ChatTable.generateId(from, to);
            ChatTable chat = ChatDBManager.INSTANCE.getChat(id);

            switch (args.PRESENCE_MESSAGE.TYPE)
            {
            case "subscribe":
            case "unsubscribed":
                if (chat == null)
                {
                    chat = new ChatTable
                    {
                        id            = id,
                        chatJabberId  = from,
                        userAccountId = to,
                        inRoster      = false,
                        muted         = false,
                        lastActive    = DateTime.Now,
                        ask           = null,
                        status        = null,
                        chatState     = null
                    };
                }
                chat.subscription = args.PRESENCE_MESSAGE.TYPE;
                break;

            default:
                break;
            }

            if (chat != null)
            {
                chat.status   = args.PRESENCE_MESSAGE.STATUS;
                chat.presence = args.PRESENCE_MESSAGE.PRESENCE;
                ChatDBManager.INSTANCE.setChat(chat, false, true);
            }
            else
            {
                Logger.Warn("Received a presence message for an unknown chat from: " + from + ", to: " + to);
            }
        }
Beispiel #11
0
 /// <summary>
 /// Checks if the fingerprint is trusted by the following mechanism:
 /// 1. Does a chat exist for the fingerprint? Yes -> 2. No. -> false
 /// 2. Is "trusted keys only" activated for chats? Yes -> 3. No -> true
 /// 3. Is the key trusted? Yes -> true No -> false
 /// </summary>
 /// <param name="fingerprint">The fingerprint we want to check if it's valid.</param>
 public bool IsFingerprintTrusted(OmemoFingerprint fingerprint)
 {
     // Check for own devices:
     if (string.Equals(fingerprint.ADDRESS.getName(), ACCOUNT.getBareJid()))
     {
         // No trust management for own devices right now.
         return(true);
     }
     // Check for contact devices:
     else
     {
         string    chatId = ChatTable.generateId(fingerprint.ADDRESS.getName(), ACCOUNT.getBareJid());
         ChatTable chat   = ChatDBManager.INSTANCE.getChat(chatId);
         return(!(chat is null) && (!chat.omemoTrustedKeysOnly || fingerprint.trusted));
     }
 }
Beispiel #12
0
 private async void Client_NewChatState(XMPPClient client, XMPP_API.Classes.Network.Events.NewChatStateEventArgs args)
 {
     if (args.Cancel)
     {
         return;
     }
     string chatId = ChatTable.generateId(args.FROM, args.TO);
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
     {
         if (Chat != null && Chat.chatType == ChatType.CHAT && string.Equals(chatId, Chat.id))
         {
             storeChatState(args.STATE);
             args.Cancel = true;
         }
     });
 }
        private async void C_NewPresence(XMPPClient client, XMPP_API.Classes.Events.NewPresenceMessageEventArgs args)
        {
            string from = Utils.getBareJidFromFullJid(args.PRESENCE_MESSAGE.getFrom());

            // If received a presence message from your own account, ignore it:
            if (string.Equals(from, client.getXMPPAccount().getBareJid()))
            {
                return;
            }

            string    to   = client.getXMPPAccount().getBareJid();
            string    id   = ChatTable.generateId(from, to);
            ChatTable chat = ChatDBManager.INSTANCE.getChat(id);

            switch (args.PRESENCE_MESSAGE.TYPE)
            {
            case "subscribe":
            case "unsubscribed":
                if (chat is null)
                {
                    chat = new ChatTable(from, to);
                }
                chat.subscription = args.PRESENCE_MESSAGE.TYPE;
                break;

            // Answer presence probes:
            case "probe":
                await answerPresenceProbeAsync(from, to, chat, client, args.PRESENCE_MESSAGE);

                return;

            default:
                break;
            }

            if (chat != null)
            {
                chat.status   = args.PRESENCE_MESSAGE.STATUS;
                chat.presence = args.PRESENCE_MESSAGE.PRESENCE;
                ChatDBManager.INSTANCE.setChat(chat, false, true);
            }
            else
            {
                Logger.Warn("Received a presence message for an unknown chat from: " + from + ", to: " + to);
            }
        }
Beispiel #14
0
        /// <summary>
        /// Checks if the user input is valid.
        /// </summary>
        /// <returns>Returns whether the user input is valid.</returns>
        private bool checkUserInputAndWarn()
        {
            XMPPClient client = accountSelection_asc.getSelectedAccount();

            if (client == null)
            {
                accountSelection_asc.showErrorMessage("No account selected!");
                return(false);
            }

            if (!client.isConnected())
            {
                accountSelection_asc.showErrorMessage("Account not connected!");
                return(false);
            }

            if (string.IsNullOrWhiteSpace(nick_tbx.Text))
            {
                accountSelection_asc.showErrorMessage("No nickname given!");
                return(false);
            }

            if (string.IsNullOrWhiteSpace(roomName_tbx.Text))
            {
                accountSelection_asc.showErrorMessage("No room name given!");
                return(false);
            }

            if (!Utils.isValidServerAddress(server_asbx.Text))
            {
                accountSelection_asc.showErrorMessage("Invalid server!");
                return(false);
            }

            string roomJid = roomName_tbx.Text + '@' + server_asbx.Text;

            if (ChatDBManager.INSTANCE.doesChatExist(ChatTable.generateId(roomJid, client.getXMPPAccount().getIdAndDomain())))
            {
                accountSelection_asc.showErrorMessage("Chat already exists!");
                return(false);
            }

            accountSelection_asc.hideErrorMessage();
            return(true);
        }
        /// <summary>
        /// Adds and starts a new chat.
        /// </summary>
        /// <param name="client">Which account/client owns this chat?</param>
        /// <param name="bareJid">The bare JID of the opponent.</param>
        /// <param name="addToRoster">Should the chat get added to the users roster?</param>
        /// <param name="requestSubscription">Request a presence subscription?</param>
        private async Task AddChatAsync(XMPPClient client, string bareJid, bool addToRoster, bool requestSubscription)
        {
            if (client is null || string.IsNullOrEmpty(bareJid))
            {
                Logger.Error("Unable to add chat! client ?= " + (client is null) + " bareJid ?=" + (bareJid is null));
                return;
            }

            await Task.Run(async() =>
            {
                ChatTable chat = ChatDBManager.INSTANCE.getChat(ChatTable.generateId(bareJid, client.getXMPPAccount().getBareJid()));

                if (chat is null)
                {
                    chat = new ChatTable(bareJid, client.getXMPPAccount().getBareJid());
                }

                // Set chat active:
                chat.isChatActive = true;
                chat.lastActive   = DateTime.Now;

                // Add to roster:
                if (addToRoster && !chat.inRoster)
                {
                    await client.GENERAL_COMMAND_HELPER.addToRosterAsync(bareJid);
                    chat.inRoster = true;
                }

                // Request presence subscription:
                if (requestSubscription && (string.Equals(chat.subscription, "none") || string.Equals(chat.subscription, "from")) && string.IsNullOrEmpty(chat.subscription))
                {
                    await client.GENERAL_COMMAND_HELPER.requestPresenceSubscriptionAsync(bareJid);
                    chat.subscription = "pending";
                }
                ChatDBManager.INSTANCE.setChat(chat, false, true);
            });
        }
Beispiel #16
0
 /// <summary>
 /// Adds a new chat to the chatsList and the DB.
 /// </summary>
 /// <param name="client">Which account/client owns this chat?</param>
 /// <param name="jID">The JID if the new chat.</param>
 /// <param name="addToRoster">Should the chat get added to the users roster?</param>
 /// <param name="requestSubscription">Request a presence subscription?</param>
 private async Task addChatAsync(XMPPClient client, string jID, bool addToRoster, bool requestSubscription)
 {
     if (client == null || jID == null)
     {
         string errorMessage = "Unable to add chat! client ?= " + (client == null) + " jabberId ?=" + (jID == null);
         Logger.Error(errorMessage);
         MessageDialog messageDialog = new MessageDialog("Error")
         {
             Content = errorMessage
         };
         await messageDialog.ShowAsync();
     }
     else
     {
         if (addToRoster)
         {
             await client.addToRosterAsync(jID);
         }
         if (requestSubscription)
         {
             await client.requestPresenceSubscriptionAsync(jID);
         }
         ChatDBManager.INSTANCE.setChat(new ChatTable()
         {
             id            = ChatTable.generateId(jID, client.getXMPPAccount().getIdAndDomain()),
             chatJabberId  = jID,
             userAccountId = client.getXMPPAccount().getIdAndDomain(),
             ask           = null,
             inRoster      = addToRoster,
             lastActive    = DateTime.Now,
             muted         = false,
             presence      = Presence.Unavailable,
             status        = null,
             subscription  = requestSubscription ? "pending" : null
         }, false, true);
     }
 }
        private async void C_NewChatMessage(XMPPClient client, XMPP_API.Classes.Network.Events.NewChatMessageEventArgs args)
        {
            MessageMessage msg = args.getMessage();

            // Handel MUC room subject messages:
            if (msg is MUCRoomSubjectMessage)
            {
                MUCHandler.INSTANCE.onMUCRoomSubjectMessage(msg as MUCRoomSubjectMessage);
                return;
            }

            string from = Utils.getBareJidFromFullJid(msg.getFrom());
            string to   = Utils.getBareJidFromFullJid(msg.getTo());
            string id;

            if (msg.CC_TYPE == CarbonCopyType.SENT)
            {
                id = ChatTable.generateId(to, from);
            }
            else
            {
                id = ChatTable.generateId(from, to);
            }

            // Check if device id is valid and if, decrypt the OMEMO messages:
            if (msg is OmemoMessageMessage omemoMessage)
            {
                OmemoHelper helper = client.getOmemoHelper();
                if (helper is null)
                {
                    C_OmemoSessionBuildError(client, new OmemoSessionBuildErrorEventArgs(id, OmemoSessionBuildError.KEY_ERROR, new List <OmemoMessageMessage> {
                        omemoMessage
                    }));
                    Logger.Error("Failed to decrypt OMEMO message - OmemoHelper is null");
                    return;
                }
                else if (!client.getXMPPAccount().checkOmemoKeys())
                {
                    C_OmemoSessionBuildError(client, new OmemoSessionBuildErrorEventArgs(id, OmemoSessionBuildError.KEY_ERROR, new List <OmemoMessageMessage> {
                        omemoMessage
                    }));
                    Logger.Error("Failed to decrypt OMEMO message - keys are corrupted");
                    return;
                }
                else if (!await omemoMessage.decryptAsync(client.getOmemoHelper(), client.getXMPPAccount().omemoDeviceId))
                {
                    return;
                }
            }

            ChatTable chat        = ChatDBManager.INSTANCE.getChat(id);
            bool      chatChanged = false;

            // Spam detection:
            if (Settings.getSettingBoolean(SettingsConsts.SPAM_DETECTION_ENABLED))
            {
                if (Settings.getSettingBoolean(SettingsConsts.SPAM_DETECTION_FOR_ALL_CHAT_MESSAGES) || chat is null)
                {
                    if (SpamDBManager.INSTANCE.isSpam(msg.MESSAGE))
                    {
                        Logger.Warn("Received spam message from " + from);
                        return;
                    }
                }
            }

            if (chat is null)
            {
                chatChanged = true;
                chat        = new ChatTable(from, to)
                {
                    lastActive = msg.getDelay(),
                    chatType   = string.Equals(msg.TYPE, MessageMessage.TYPE_GROUPCHAT) ? ChatType.MUC : ChatType.CHAT
                };
            }

            ChatMessageTable message = new ChatMessageTable(msg, chat);

            // Handle MUC invite messages:
            if (msg is DirectMUCInvitationMessage)
            {
                DirectMUCInvitationMessage inviteMessage = msg as DirectMUCInvitationMessage;
                bool doesRoomExist = ChatDBManager.INSTANCE.doesMUCExist(ChatTable.generateId(inviteMessage.ROOM_JID, msg.getTo()));
                bool doesOutstandingInviteExist = ChatDBManager.INSTANCE.doesOutstandingMUCInviteExist(id, inviteMessage.ROOM_JID);

                if (doesRoomExist && doesOutstandingInviteExist)
                {
                    return;
                }

                MUCDirectInvitationTable inviteTable = new MUCDirectInvitationTable(inviteMessage, message.id);
                ChatDBManager.INSTANCE.setMUCDirectInvitation(inviteTable);
            }

            bool             isMUCMessage     = string.Equals(MessageMessage.TYPE_GROUPCHAT, message.type);
            ChatMessageTable existingMessage  = ChatDBManager.INSTANCE.getChatMessageById(message.id);
            bool             doesMessageExist = existingMessage != null;

            if (isMUCMessage)
            {
                MUCChatInfoTable mucInfo = MUCDBManager.INSTANCE.getMUCInfo(chat.id);
                if (mucInfo != null)
                {
                    if (Equals(message.fromUser, mucInfo.nickname))
                    {
                        // Filter MUC messages that already exist:
                        // ToDo: Allow MUC messages being edited and detect it
                        if (doesMessageExist)
                        {
                            return;
                        }
                        else
                        {
                            message.state = MessageState.SEND;
                        }
                    }
                    else
                    {
                        if (doesMessageExist)
                        {
                            message.state = existingMessage.state;
                        }
                    }
                }
            }

            if (chat.lastActive.CompareTo(msg.getDelay()) < 0)
            {
                chatChanged     = true;
                chat.lastActive = msg.getDelay();
            }

            if (chatChanged)
            {
                ChatDBManager.INSTANCE.setChat(chat, false, true);
            }

            // Send XEP-0184 (Message Delivery Receipts) reply:
            if (msg.RECIPT_REQUESTED && id != null && !Settings.getSettingBoolean(SettingsConsts.DONT_SEND_CHAT_MESSAGE_RECEIVED_MARKERS))
            {
                await Task.Run(async() =>
                {
                    DeliveryReceiptMessage receiptMessage = new DeliveryReceiptMessage(client.getXMPPAccount().getFullJid(), from, msg.ID);
                    await client.sendAsync(receiptMessage);
                });
            }

            ChatDBManager.INSTANCE.setChatMessage(message, !doesMessageExist, doesMessageExist && !isMUCMessage);

            // Show toast:
            if (!doesMessageExist && !chat.muted)
            {
                await Task.Run(() =>
                {
                    try
                    {
                        switch (msg.TYPE)
                        {
                        case MessageMessage.TYPE_GROUPCHAT:
                        case MessageMessage.TYPE_CHAT:
                            if (!message.isCC)
                            {
                                if (message.isImage)
                                {
                                    ToastHelper.showChatTextImageToast(message, chat);
                                }
                                else
                                {
                                    ToastHelper.showChatTextToast(message, chat);
                                }
                            }
                            break;

                        default:
                            break;
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Error("Failed to send toast notification!", e);
                    }
                });
            }
        }
        private void C_NewRoosterMessage(IMessageSender sender, NewValidMessageEventArgs args)
        {
            if (args.MESSAGE is RosterResultMessage msg && sender is XMPPClient client)
            {
                string to   = client.getXMPPAccount().getBareJid();
                string type = msg.TYPE;

                if (string.Equals(type, IQMessage.RESULT))
                {
                    ChatDBManager.INSTANCE.setAllNotInRoster(client.getXMPPAccount().getBareJid());
                }
                else if (!string.Equals(type, IQMessage.SET))
                {
                    // No roster result or set => return
                    return;
                }

                foreach (RosterItem item in msg.ITEMS)
                {
                    string    from = item.JID;
                    string    id   = ChatTable.generateId(from, to);
                    ChatTable chat = ChatDBManager.INSTANCE.getChat(id);
                    if (chat != null)
                    {
                        chat.inRoster = !string.Equals(item.SUBSCRIPTION, "remove");
                    }
                    else if (!string.Equals(item.SUBSCRIPTION, "remove"))
                    {
                        chat = new ChatTable(from, to)
                        {
                            inRoster = true,
                            chatType = ChatType.CHAT
                        };
                    }
                    else
                    {
                        continue;
                    }

                    // Only update the subscription state, if not set to subscribe:
                    if (!string.Equals(chat.subscription, "subscribe"))
                    {
                        chat.subscription = item.SUBSCRIPTION;
                    }
                    chat.subscriptionRequested = string.Equals(item.ASK, "subscribe");

                    switch (chat.subscription)
                    {
                    case "unsubscribe":
                    case "from":
                    case "none":
                    case "pending":
                    case null:
                        chat.presence = Presence.Unavailable;
                        break;

                    default:
                        break;
                    }

                    ChatDBManager.INSTANCE.setChat(chat, false, true);
                }
            }
        }
        private void C_NewRoosterMessage(IMessageSender sender, NewValidMessageEventArgs args)
        {
            XMPPClient client = sender as XMPPClient;

            if (args.MESSAGE is RosterMessage)
            {
                RosterMessage msg  = args.MESSAGE as RosterMessage;
                string        to   = client.getXMPPAccount().getIdAndDomain();
                string        type = msg.TYPE;

                if (string.Equals(type, IQMessage.RESULT))
                {
                    ChatDBManager.INSTANCE.setAllNotInRoster(client.getXMPPAccount().getIdAndDomain());
                }
                else if (type == null || !string.Equals(type, IQMessage.SET))
                {
                    // No roster result or set => return
                    return;
                }

                foreach (RosterItem item in msg.ITEMS)
                {
                    string    from = item.JID;
                    string    id   = ChatTable.generateId(from, to);
                    ChatTable chat = ChatDBManager.INSTANCE.getChat(id);
                    if (chat != null)
                    {
                        chat.subscription = item.SUBSCRIPTION;
                        chat.inRoster     = !item.SUBSCRIPTION.Equals("remove");
                        chat.ask          = item.ASK;
                    }
                    else if (!Equals(item.SUBSCRIPTION, "remove"))
                    {
                        chat = new ChatTable()
                        {
                            id            = id,
                            chatJabberId  = from,
                            userAccountId = to,
                            subscription  = item.SUBSCRIPTION,
                            lastActive    = DateTime.Now,
                            muted         = false,
                            inRoster      = true,
                            ask           = item.ASK,
                            chatType      = ChatType.CHAT
                        };
                    }
                    else
                    {
                        continue;
                    }

                    switch (chat.subscription)
                    {
                    case "unsubscribe":
                    case "from":
                    case "none":
                    case "pending":
                    case null:
                        chat.presence = Presence.Unavailable;
                        break;

                    default:
                        break;
                    }

                    ChatDBManager.INSTANCE.setChat(chat, false, true);
                }
            }
        }
Beispiel #20
0
        //--------------------------------------------------------Events:---------------------------------------------------------------------\\
        #region --Events--
        private void C_NewMUCMemberPresenceMessage(XMPPClient client, XMPP_API.Classes.Network.Events.NewMUCMemberPresenceMessageEventArgs args)
        {
            Task.Run(() =>
            {
                MUCMemberPresenceMessage msg = args.mucMemberPresenceMessage;
                string roomJid = Utils.getBareJidFromFullJid(msg.getFrom());
                if (roomJid is null)
                {
                    return;
                }
                string chatId = ChatTable.generateId(roomJid, client.getXMPPAccount().getBareJid());

                MUCOccupantTable member = MUCDBManager.INSTANCE.getMUCOccupant(chatId, msg.FROM_NICKNAME);
                if (member is null)
                {
                    member = new MUCOccupantTable
                    {
                        id       = MUCOccupantTable.generateId(chatId, msg.FROM_NICKNAME),
                        nickname = msg.FROM_NICKNAME,
                        chatId   = chatId
                    };
                }

                member.affiliation = msg.AFFILIATION;
                member.role        = msg.ROLE;
                member.jid         = msg.JID;

                bool isUnavailable = Equals(msg.TYPE, "unavailable");
                if (isUnavailable)
                {
                    if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.PRESENCE_SELFE_REFERENCE))
                    {
                        // Nickname got changed by user or room:
                        if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_NICK_CHANGED) || msg.STATUS_CODES.Contains(MUCPresenceStatusCode.ROOM_NICK_CHANGED))
                        {
                            // Update MUC info:
                            MUCDBManager.INSTANCE.setMUCInfoNickname(chatId, msg.NICKNAME, true);

                            // Add new member:
                            MUCDBManager.INSTANCE.setMUCOccupant(new MUCOccupantTable
                            {
                                id          = MUCOccupantTable.generateId(chatId, msg.NICKNAME),
                                nickname    = msg.NICKNAME,
                                chatId      = member.chatId,
                                affiliation = member.affiliation,
                                role        = member.role,
                                jid         = member.jid,
                            }, false, true);
                        }
                        // Occupant got kicked:
                        else if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_KICKED))
                        {
                            // Update MUC state:
                            MUCDBManager.INSTANCE.setMUCState(chatId, MUCState.KICKED, true);
                        }
                        else if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_BANED))
                        {
                            // Update MUC state:
                            MUCDBManager.INSTANCE.setMUCState(chatId, MUCState.BANED, true);
                        }
                        else
                        {
                            // Update MUC state:
                            MUCDBManager.INSTANCE.setMUCState(chatId, MUCState.DISCONNECTED, true);
                        }
                    }


                    if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_KICKED))
                    {
                        // Add kicked chat message:
                        addOccupantKickedMessage(chatId, roomJid, member.nickname);
                    }

                    if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_BANED))
                    {
                        // Add baned chat message:
                        addOccupantBanedMessage(chatId, roomJid, member.nickname);
                    }
                }

                // If the type equals 'unavailable', a user left the room:
                MUCDBManager.INSTANCE.setMUCOccupant(member, isUnavailable, true);
            });
        }
Beispiel #21
0
        public IEnumerable <OmemoFingerprint> LoadFingerprints(string bareJid)
        {
            string chat = ChatTable.generateId(bareJid, ACCOUNT.getBareJid());

            return(OmemoSignalKeyDBManager.INSTANCE.getFingerprints(chat));
        }
        private void C_NewChatMessage(XMPPClient client, XMPP_API.Classes.Network.Events.NewChatMessageEventArgs args)
        {
            MessageMessage msg = args.getMessage();

            // Handel MUC room subject messages:
            if (msg is MUCRoomSubjectMessage)
            {
                MUCHandler.INSTANCE.onMUCRoomSubjectMessage(msg as MUCRoomSubjectMessage);
                return;
            }

            string from = Utils.getBareJidFromFullJid(msg.getFrom());

            // Check if device id is valid and if, decrypt the OMEMO messages:
            if (msg is OmemoMessageMessage omemoMessage)
            {
                // Decryption failed:
                if (!omemoMessage.decrypt(client.getOmemoHelper(), client.getXMPPAccount().omemoDeviceId))
                {
                    return;
                }
            }

            string to = Utils.getBareJidFromFullJid(msg.getTo());
            string id;

            if (msg.CC_TYPE == CarbonCopyType.SENT)
            {
                id = ChatTable.generateId(to, from);
            }
            else
            {
                id = ChatTable.generateId(from, to);
            }


            ChatTable chat        = ChatDBManager.INSTANCE.getChat(id);
            bool      chatChanged = false;

            if (chat == null)
            {
                chatChanged = true;
                chat        = new ChatTable()
                {
                    id            = id,
                    chatJabberId  = from,
                    userAccountId = to,
                    ask           = null,
                    inRoster      = false,
                    lastActive    = msg.getDelay(),
                    muted         = false,
                    presence      = Presence.Unavailable,
                    status        = null,
                    subscription  = null,
                    chatType      = Equals(msg.TYPE, MessageMessage.TYPE_GROUPCHAT) ? ChatType.MUC : ChatType.CHAT,
                };
            }

            ChatMessageTable message = new ChatMessageTable(msg, chat);

            // Handle MUC invite messages:
            if (msg is DirectMUCInvitationMessage)
            {
                DirectMUCInvitationMessage inviteMessage = msg as DirectMUCInvitationMessage;
                bool doesRoomExist = ChatDBManager.INSTANCE.doesMUCExist(ChatTable.generateId(inviteMessage.ROOM_JID, msg.getTo()));
                bool doesOutstandingInviteExist = ChatDBManager.INSTANCE.doesOutstandingMUCInviteExist(id, inviteMessage.ROOM_JID);

                if (doesRoomExist && doesOutstandingInviteExist)
                {
                    return;
                }

                MUCDirectInvitationTable inviteTable = new MUCDirectInvitationTable(inviteMessage, message.id);
                ChatDBManager.INSTANCE.setMUCDirectInvitation(inviteTable);
            }

            bool             isMUCMessage     = string.Equals(MessageMessage.TYPE_GROUPCHAT, message.type);
            ChatMessageTable existingMessage  = ChatDBManager.INSTANCE.getChatMessageById(message.id);
            bool             doesMessageExist = existingMessage != null;

            if (isMUCMessage)
            {
                MUCChatInfoTable mucInfo = MUCDBManager.INSTANCE.getMUCInfo(chat.id);
                if (mucInfo != null)
                {
                    if (Equals(message.fromUser, mucInfo.nickname))
                    {
                        // Filter MUC messages that already exist:
                        // ToDo: Allow MUC messages being edited and detect it
                        if (doesMessageExist)
                        {
                            return;
                        }
                        else
                        {
                            message.state = MessageState.SEND;
                        }
                    }
                    else
                    {
                        if (doesMessageExist)
                        {
                            message.state = existingMessage.state;
                        }
                    }
                }
            }

            if (chat.lastActive.CompareTo(msg.getDelay()) < 0)
            {
                chatChanged     = true;
                chat.lastActive = msg.getDelay();
            }

            if (chatChanged)
            {
                ChatDBManager.INSTANCE.setChat(chat, false, true);
            }

            // Send XEP-0184 (Message Delivery Receipts) reply:
            if (msg.RECIPT_REQUESTED && id != null && !Settings.getSettingBoolean(SettingsConsts.DONT_SEND_CHAT_MESSAGE_RECEIVED_MARKERS))
            {
                Task.Run(async() =>
                {
                    DeliveryReceiptMessage receiptMessage = new DeliveryReceiptMessage(client.getXMPPAccount().getIdDomainAndResource(), from, msg.ID);
                    await client.sendAsync(receiptMessage, true);
                });
            }

            ChatDBManager.INSTANCE.setChatMessage(message, !doesMessageExist, doesMessageExist && !isMUCMessage);

            // Show toast:
            if (!doesMessageExist && !chat.muted)
            {
                Task.Run(() =>
                {
                    try
                    {
                        if (!msg.toasted)
                        {
                            switch (msg.TYPE)
                            {
                            case MessageMessage.TYPE_GROUPCHAT:
                            case MessageMessage.TYPE_CHAT:
                                if (!message.isCC)
                                {
                                    if (message.isEncrypted)
                                    {
                                        ToastHelper.showChatTextEncryptedToast(message, chat);
                                    }
                                    else if (message.isImage)
                                    {
                                        ToastHelper.showChatTextImageToast(message, chat);
                                    }
                                    else
                                    {
                                        ToastHelper.showChatTextToast(message, chat);
                                    }
                                }
                                break;

                            default:
                                break;
                            }
                            msg.setToasted();
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Error("Failed to send toast notification!", e);
                    }
                });
            }
        }
Beispiel #23
0
        public void setFingerprint(OmemoFingerprint fingerprint, string accountId)
        {
            string chatId = ChatTable.generateId(fingerprint.ADDRESS.getName(), accountId);

            dB.InsertOrReplace(new OmemoFingerprintTable(fingerprint, chatId));
        }