Beispiel #1
0
        public async Task <SendMessageResult> SendMessageAsync(Message message)
        {
            try
            {
                Dictionary <string, byte[]> keys = null;
                string text = message.Text;

                await messageRepository.AddMessageAsync(message);

                if (EncryptionEnabled)
                {
                    var deviceIdAndPublicKeyMap = await deviceInfoProvider.GetUserDevicesAndPublicKeys((int)message.Recipient);

                    if (deviceIdAndPublicKeyMap.Count > 0)
                    {
                        //don't forget current user's other devices
                        var myDevices = await deviceInfoProvider.GetUserDevicesAndPublicKeys(Settings.MyId);

                        foreach (var myDevice in myDevices)
                        {
                            if (myDevice.Key != Settings.UserDeviceId && myDevice.Key != Settings.MyId.ToString())
                            {
                                deviceIdAndPublicKeyMap[myDevice.Key] = myDevice.Value;
                            }
                        }
                        text = cryptoService.Encrypt(message.Text, deviceIdAndPublicKeyMap, out keys);
                    }
                }

                var request = new SendMessageRequest
                {
                    ReceiverUserId = message.Recipient,
                    SenderName     = Settings.NickName,
                    MessageType    = ServerClient.Entities.Ws.Requests.MessageType.Text,
                    MessageToken   = message.MessageToken,
                    Thumbnail      = message.Thumbnail,
                    GroupId        = message.GroupId,
                    Message        = text,
                    Keys           = keys,
                };

                var response = await messagingService.SendMessage(request);

                if (response.Error == Errors.SendMessage_ProvideKeysForTheseDevices)
                {
                    foreach (var item in response.MissedDevicesWithPublicKeysToReEncrypt)
                    {
                        await deviceInfoProvider.SavePublicKeyForDeviceId(item.DeviceId, item.UserId, Convert.ToBase64String(item.PublicKey));
                    }
                    //try again
                    return(await SendMessageAsync(message));
                }
                if (response.Error == Errors.SendMessage_ReceiversNotFound)
                {
                    return(SendMessageResult.ReceiverUnknown);
                }
                if (response.Error == Errors.SendMessage_ReceiverAndSenderAreSame)
                {
                    return(SendMessageResult.ReceiverAndSenderAreSame);
                }

                OnMessageSent(message.MessageToken);
                return(SendMessageResult.Ok);
            }
            catch (ConnectionException)
            {
                return(SendMessageResult.ConnectionError);
            }
            catch (Exception ex)
            {
                App.Logger.Report(ex);
                return(SendMessageResult.UnknownError);
            }
        }