/// <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); } }
/// <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); } }
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); } }