private static async Task ProcessChallengeAsync(ImapEnvelope envelope, ImapMailbox mailbox) { var bytes = await mailbox.FetchMessageBodyAsync(envelope.Uid); var message = new MailMessageReader(bytes); var token = string.Empty; var nonce = string.Empty; var publicKey = string.Empty; const string pattern = @"\s|\t|\n|\r"; var xHeaders = message.Headers.UnknownHeaders; for (var i = 0; i < xHeaders.Keys.Count; i++) { var key = xHeaders.Keys[i]; var values = xHeaders.GetValues(i); if (values == null) { throw new NullReferenceException(Resources.ChallengeCorruptException); } if (string.Compare(key, ParanoiaHeaderKeys.Token, StringComparison.InvariantCultureIgnoreCase) == 0) { token = values.FirstOrDefault() ?? string.Empty; token = Regex.Replace(token, pattern, string.Empty); continue; } if (string.Compare(key, ParanoiaHeaderKeys.Nonce, StringComparison.InvariantCultureIgnoreCase) == 0) { nonce = values.FirstOrDefault() ?? string.Empty; nonce = Regex.Replace(nonce, pattern, string.Empty); continue; } if (string.Compare(key, ParanoiaHeaderKeys.PublicKey, StringComparison.InvariantCultureIgnoreCase) == 0) { publicKey = values.FirstOrDefault() ?? string.Empty; publicKey = Regex.Replace(publicKey, pattern, string.Empty); } } if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(nonce) || string.IsNullOrEmpty(publicKey)) { throw new InvalidDataException(Resources.ChallengeCorruptException); } var data = App.Context.KeyContainer.DecryptWithPrivateKey( Convert.FromBase64String(token), Convert.FromBase64String(publicKey), Convert.FromBase64String(nonce)); await RespondToChallengeAsync(Encoding.UTF8.GetString(data)); }
public static MailMessageModel ToMailMessage(this ImapEnvelope envelope, MailType type) { return(new MailMessageModel { EntryDate = envelope.InternalDate.HasValue ? envelope.InternalDate.Value : DateTime.Now, Subject = envelope.Subject, Flags = string.Join(";", envelope.Flags), Size = envelope.Size, Uid = envelope.Uid, MessageId = envelope.MessageId, FromAddress = envelope.From.Any() ? envelope.From.First().Address : string.Empty, FromName = envelope.From.Any() ? envelope.From.First().DisplayName : string.Empty, Type = type }); }