private bool ProcessMessageNewSecretShare(DeviceToDeviceMessages.IMessage message)
        {
            var messageContents = (DeviceToDeviceMessages.NewSecret)message;

            var link = _model.Links.Query().FirstOrDefault(r => r.Identifier == messageContents.LinkIdentifier);

            if (link == null)
            {
                return(false);
            }

            var entry =
                _model.Entries.Query()
                .FirstOrDefault(r => r.LinkId == link.Id && r.Identifier == messageContents.EntryIdentifier);

            if (entry == null)
            {
                var entryId =
                    _model.Entries.Create(new Entry {
                    Identifier = messageContents.EntryIdentifier, LinkId = link.Id
                });
                entry = _model.Entries.Query().First(r => r.Id == entryId);
            }

            var secretKey = messageContents.SecretIdentifier;
            var secret    = messageContents.Secret;

            var existingEntryShares =
                _model.EntriesSharedSecrets.Query()
                .Where(r => r.EntryId == entry.Id && r.SecretIdentifier == secretKey).ToList();

            foreach (var existingEntryShare in existingEntryShares)
            {
                _model.EntriesSharedSecrets.Delete(existingEntryShare.Id);
            }

            var newSecretDataId = _model.EntriesSharedSecretsData.Create(new EntrySharedSecretData
            {
                ShareType = "EncDataKey",
                Secret    = secret
            });

            var newSecretId = _model.EntriesSharedSecrets.Create(new EntrySharedSecret
            {
                EntryId           = entry.Id,
                SecretIdentifier  = secretKey,
                EntrySecretDataId = newSecretDataId
            });

            _controller.SetEntrySecretAsModified(_appServerAccountId, newSecretId);

            return(true);
        }
        private bool ProcessMessageDeleteSecret(DeviceToDeviceMessages.IMessage message)
        {
            var messageContent = (DeviceToDeviceMessages.DeleteSecret)message;

            var secret =
                _model.EntriesSharedSecrets.Query()
                .FirstOrDefault(r => r.SecretIdentifier == messageContent.SecretIdentifier);

            if (secret == null)
            {
                return(false);
            }

            // Mark the secret as deleted. The sync process will handle it.
            _model.EntriesSharedSecrets.Update(secret.Id, new EntrySharedSecret {
                ToBeDeleted = true
            });
            _controller.SetEntrySecretAsModified(_appServerAccountId, secret.Id);

            return(true);
        }
        private bool ProcessMessageRequestEntrySecrets(
            GetMessages.ResponseParamsMessage messageItem, DeviceToDeviceMessages.IMessage message)
        {
            var messageContents = (DeviceToDeviceMessages.RequestEntrySecrets)message;

            var accountSettings = _model.ServerAccountSettings.Query().First();

            var entry = _model.Entries.Query().FirstOrDefault(r => r.Identifier == messageContents.EntryIdentifier);

            if (entry == null)
            {
                return(false);
            }

            var linkedDeviceCryptoKeyId = accountSettings.LinkedDeviceCryptoKeyId;
            var linkedDeviceCryptoKey   = _model.CryptoKeys.Query().First(r => r.Id == linkedDeviceCryptoKeyId);

            var entrySecrets = new Dictionary <string, string>();

            foreach (var secretIdentifier in messageContents.SecretIdentifiers)
            {
                var entrySecretsResult = _model.EntriesSharedSecrets.Query()
                                         .FirstOrDefault(r => r.EntryId == entry.Id && r.SecretIdentifier == secretIdentifier);

                if (entrySecretsResult == null)
                {
                    continue;
                }

                var entrySecretData = _model.EntriesSharedSecretsData.Query().First(r => r.Id == entrySecretsResult.EntrySecretDataId);
                entrySecrets.Add(entrySecretsResult.SecretIdentifier, entrySecretData.Secret);
            }

            if (entrySecrets.Count != messageContents.SecretIdentifiers.Count)
            {
                // We don't appear to have all the requested secrets.
                return(false);
            }

            var requestConfirmed = _controller.PromptSecretShareRequestSafe();

            var apiRequest = new SendLinkedDeviceMessage
            {
                //LinkIdentifier = link.Identifier,
                SecondsValidFor = 30
            };

            if (!requestConfirmed)
            {
                var deniedMessage = new DeviceToDeviceMessages.SendEntrySecrets
                {
                    OriginalMessageIdentifier = messageItem.Identifier,
                    RequestAccepted           = false
                };
                apiRequest.SetMessage(deniedMessage, linkedDeviceCryptoKey.PublicKeyPem);
                apiRequest.GetResponse(GetApiClient());
                return(true);
            }

            var acceptedMessage = new DeviceToDeviceMessages.SendEntrySecrets
            {
                OriginalMessageIdentifier = messageItem.Identifier,
                RequestAccepted           = true,
                Secrets = entrySecrets
            };

            apiRequest.SetMessage(acceptedMessage, linkedDeviceCryptoKey.PublicKeyPem);
            apiRequest.GetResponse(GetApiClient());

            return(true);
        }
Beispiel #4
0
 public void SetMessage(DeviceToDeviceMessages.IMessage message, string receiverPublicKeyPem)
 {
     _message = message;
     _receiverPublicKeyPem = receiverPublicKeyPem;
 }