Пример #1
0
        /// <summary>
        /// Retrieve and process any outstanding messages from the server for the device.
        /// </summary>
        private void ProcessMessages()
        {
            var apiClient       = GetApiClient();
            var accountSettings = _model.ServerAccountSettings.Query().First();

            GetMessagesLongpoll.ResponseParams longpollResponse;
            try
            {
                var longpollRequest = new GetMessagesLongpoll();
                _longpollInterrupt = new AutoResetEvent(false);
                longpollRequest.SetInteruptHandle(_longpollInterrupt);
                longpollResponse = longpollRequest.GetResponse(apiClient);
            }
            catch (RequestException)
            {
                return;
            }

            if (!longpollResponse.NewMessages)
            {
                return;
            }

            var getMessagesRequest = new GetMessages();

            GetMessages.ResponseParams messagesResponse;
            try
            {
                messagesResponse = getMessagesRequest.GetResponse(apiClient);
            }
            catch (RequestException)
            {
                return;
            }

            foreach (var messageItem in messagesResponse.Messages)
            {
                var processedSuccessfully = false;
                switch (messageItem.Type)
                {
                case DeviceMessages.Types.ServerLoginRequest:
                    var loginRequestMessageContents = messageItem.GetContent <DeviceMessages.ServerLoginRequest>();
                    processedSuccessfully = ProcessMessageUserLoginRequest(loginRequestMessageContents);
                    break;

                case DeviceMessages.Types.NewDatabase:
                    var newDatabaseMessageContents = messageItem.GetContent <DeviceMessages.NewDatabase>();
                    processedSuccessfully = ProcessMessageConfirmNewLink(newDatabaseMessageContents);
                    break;

                case DeviceMessages.Types.DeviceToDeviceMessage:
                    var messageContents         = messageItem.GetContent <DeviceMessages.DeviceToDeviceMessage>();
                    var linkedDeviceCryptoKeyId = accountSettings.LinkedDeviceCryptoKeyId;
                    var linkedClientCryptoKey   = _model.CryptoKeys.Query().First(r => r.Id == linkedDeviceCryptoKeyId);
                    if (!linkedClientCryptoKey.Trust)
                    {
                        break;
                    }

                    var message = getMessagesRequest.DecryptClientMessage(
                        messageContents.EncryptedMessage, linkedClientCryptoKey.PublicKeyPem);

                    processedSuccessfully = ProcessMessageFromDevice(messageItem, message);

                    break;

                case DeviceMessages.Types.VerifyDeviceKeysRequest:
                    var verifyKeyMessageContents = messageItem.GetContent <DeviceMessages.VerifyDeviceKeysRequest>();
                    processedSuccessfully = ProcessMessageVerifyDeviceKeys(verifyKeyMessageContents);
                    break;

                case DeviceMessages.Types.LinkedDeviceChange:
                    processedSuccessfully = ProcessMessageLinkedDeviceChange();
                    break;
                }

                var request = new SetMessageStatus
                {
                    DeviceMessageIdentifier = messageItem.Identifier,
                    ProcessedSuccess        = processedSuccessfully
                };
                request.GetResponse(apiClient);
            }
        }
Пример #2
0
        /// <summary>
        /// Retrieve and process any outstanding messages from the server for the device.
        /// </summary>
        private void ProcessMessages()
        {
            var apiClient = GetApiClient();
            var accountSettings = _model.ServerAccountSettings.Query().First();

            GetMessagesLongpoll.ResponseParams longpollResponse;
            try
            {
                var longpollRequest = new GetMessagesLongpoll();
                _longpollInterrupt = new AutoResetEvent(false);
                longpollRequest.SetInteruptHandle(_longpollInterrupt);
                longpollResponse = longpollRequest.GetResponse(apiClient);
            }
            catch (RequestException)
            {
                return;
            }

            if (!longpollResponse.NewMessages)
                return;

            var getMessagesRequest = new GetMessages();
            GetMessages.ResponseParams messagesResponse;
            try
            {
                messagesResponse = getMessagesRequest.GetResponse(apiClient);
            }
            catch (RequestException)
            {
                return;
            }

            foreach (var messageItem in messagesResponse.Messages)
            {
                var processedSuccessfully = false;
                switch (messageItem.Type)
                {
                    case DeviceMessages.Types.ServerLoginRequest:
                        var loginRequestMessageContents = messageItem.GetContent<DeviceMessages.ServerLoginRequest>();
                        processedSuccessfully = ProcessMessageUserLoginRequest(loginRequestMessageContents);
                        break;

                    case DeviceMessages.Types.NewDatabase:
                        var newDatabaseMessageContents = messageItem.GetContent<DeviceMessages.NewDatabase>();
                        processedSuccessfully = ProcessMessageConfirmNewLink(newDatabaseMessageContents);
                        break;
                        
                    case DeviceMessages.Types.DeviceToDeviceMessage:
                        var messageContents = messageItem.GetContent<DeviceMessages.DeviceToDeviceMessage>();
                        var linkedDeviceCryptoKeyId = accountSettings.LinkedDeviceCryptoKeyId;
                        var linkedClientCryptoKey = _model.CryptoKeys.Query().First(r => r.Id == linkedDeviceCryptoKeyId);
                        if (!linkedClientCryptoKey.Trust)
                            break;

                        var message = getMessagesRequest.DecryptClientMessage(
                            messageContents.EncryptedMessage, linkedClientCryptoKey.PublicKeyPem);

                        processedSuccessfully = ProcessMessageFromDevice(messageItem, message);

                        break;

                    case DeviceMessages.Types.VerifyDeviceKeysRequest:
                        var verifyKeyMessageContents = messageItem.GetContent<DeviceMessages.VerifyDeviceKeysRequest>();
                        processedSuccessfully = ProcessMessageVerifyDeviceKeys(verifyKeyMessageContents);
                        break;

                    case DeviceMessages.Types.LinkedDeviceChange:
                        processedSuccessfully = ProcessMessageLinkedDeviceChange();
                        break;
                }

                var request = new SetMessageStatus
                {
                    DeviceMessageIdentifier = messageItem.Identifier,
                    ProcessedSuccess = processedSuccessfully
                };
                request.GetResponse(apiClient);
            }
        }
Пример #3
0
        private void ProcessMessages()
        {
            var apiClient = GetApiClient();
            var serverAccount = Model.ServerAccounts.Get(_serverAccountId);

            CryptoKey linkedDeviceCryptoKey = null;
            if (serverAccount.LinkedDeviceCryptoKeyId != 0)
                linkedDeviceCryptoKey = Model.CryptoKeys.Get(serverAccount.LinkedDeviceCryptoKeyId);
            
            GetMessagesLongpoll.ResponseParams longpollResponse;
            try
            {
                var longpollRequest = new GetMessagesLongpoll();
                _longpollInterrupt = new AutoResetEvent(false);
                longpollRequest.SetInteruptHandle(_longpollInterrupt);
                longpollResponse = longpollRequest.GetResponse(apiClient);
            }
            catch (NetworkErrorException)
            {
                Logger.Info("Network error attempting to obtain images.");
                _requestErrors++;
                return;
            }
            catch (RequestException)
            {
                return;
            }

            _requestErrors = 0;

            if (!longpollResponse.NewMessages)
                return;

            var getMessagesRequest = new GetMessages();
            GetMessages.ResponseParams messagesResponse;
            try
            {
                messagesResponse = getMessagesRequest.GetResponse(apiClient);
            }
            catch (RequestException)
            {
                return;
            }
            
            foreach (var messageItem in messagesResponse.Messages)
            {
                if (_stopSyncLoop)
                    return;

                var processedSucessfully = false;

                if (messageItem.Type == DeviceMessages.Types.DeviceToDeviceMessage)
                {
                    if (linkedDeviceCryptoKey == null)
                        continue;

                    var messageContents = messageItem.GetContent<DeviceMessages.DeviceToDeviceMessage>();

                    //if (!string.IsNullOrEmpty(messageContents.LinkIdentifier))
                    //{
                        var message = getMessagesRequest.DecryptClientMessage(
                            messageContents.EncryptedMessage, linkedDeviceCryptoKey.PublicKeyPem);

                        switch (message.Type)
                        {
                            case DeviceToDeviceMessages.Types.SendEntrySecrets:
                                if (SendSecretShareMessageReceived == null)
                                    break;
                                var args = new SendEntrySecretsMessageReceivedEventArgs(
                                    (DeviceToDeviceMessages.SendEntrySecrets)message.Message);
                                SendSecretShareMessageReceived.Invoke(this, args);
                                processedSucessfully = args.MessageHandledSuccessfully;
                                break;
                    }
                    //}
                }
                else
                {
                    switch (messageItem.Type)
                    {
                        case DeviceMessages.Types.VerifyDeviceKeysResponse:
                            if (VerifyDeviceKeysResponseReceived == null)
                                break;
                            var args = new VerifyDeviceKeysResponseReceivedEventArgs(
                                messageItem.GetContent<DeviceMessages.VerifyDeviceKeysResponse>());
                            VerifyDeviceKeysResponseReceived.Invoke(this, args);
                            processedSucessfully = args.MessageHandledSuccessfully;
                            break;
                    }
                }
                
                var processedRequest = new SetMessageStatus
                {
                    DeviceMessageIdentifier = messageItem.Identifier,
                    ProcessedSuccess = processedSucessfully
                };
                processedRequest.GetResponse(apiClient);
            }
        }