public async Task <Models.ServiceResult> EmailAllUsernames(string email) { var site = await _siteLookupService.GetByIdAsync(GetCurrentSiteId()); var lookupEmail = email.Trim(); var usernames = await _userRepository.GetUserIdAndUsernames(lookupEmail); if (usernames?.Data.Any() != true) { return(new Models.ServiceResult { Status = Models.ServiceResultStatus.Error, Message = "There are no usernames associated with the email address: {0}.", Arguments = new[] { lookupEmail } }); } var sb = new StringBuilder(); foreach (string username in usernames.Data) { sb.Append("- ").AppendLine(username); } var directEmailDetails = new DirectEmailDetails(site.Name) { DirectEmailSystemId = "UsernameRecovery", LanguageId = await _languageService .GetLanguageIdAsync(CultureInfo.CurrentUICulture.Name), SendingUserId = await _userRepository.GetSystemUserId(), ToUserId = usernames.Id }; directEmailDetails.Tags.Add("Email", lookupEmail); directEmailDetails.Tags.Add("Content", sb.ToString()); var siteLink = await _siteLookupService.GetSiteLinkAsync(site.Id); directEmailDetails.Tags.Add("Sitelink", siteLink.AbsoluteUri); var result = new Models.ServiceResult(); try { var history = await _emailService.SendDirectAsync(directEmailDetails); result.Status = history?.Successful == true ? Models.ServiceResultStatus.Success : Models.ServiceResultStatus.Error; } catch (GraException ex) { if (ex?.InnerException is MimeKit.ParseException) { result.Status = Models.ServiceResultStatus.Error; result.Message = Annotations.Validate.EmailAddressInvalid; result.Arguments = new[] { email }; } } return(result); }
public async Task <Models.ServiceResult> GenerateTokenAndEmail(string username, string recoveryUrl) { string trimmedUsername = username.Trim(); var user = await _userRepository.GetByUsernameAsync(trimmedUsername); if (user == null) { _logger.LogInformation("Username {Username} doesn't exist so can't create a recovery token.", trimmedUsername); return(new Models.ServiceResult { Status = Models.ServiceResultStatus.Error, Message = Annotations.Validate.Username, Arguments = new[] { trimmedUsername } }); } if (string.IsNullOrEmpty(user.Email)) { _logger.LogInformation("User {Username} ({UserId}) doesn't have an email address configured so cannot send a recovery token.", user?.Username, user?.Id); return(new Models.ServiceResult { Status = Models.ServiceResultStatus.Error, Message = Annotations.Validate.EmailConfigured, Arguments = new[] { trimmedUsername } }); } // clear any existing tokens var existingRequests = await _recoveryTokenRepository.GetByUserIdAsync(user.Id); foreach (var request in existingRequests) { await _recoveryTokenRepository.RemoveSaveAsync(-1, request.Id); } string tokenString = _tokenGenerator.Generate().ToUpperInvariant().Trim(); // insert new token await _recoveryTokenRepository.AddSaveAsync(-1, new RecoveryToken { Token = tokenString.ToLowerInvariant(), UserId = user.Id }); _logger.LogInformation("Cleared {Existing} existing recovery tokens and inserted a new one for {Username} ({UserId})", existingRequests.Count(), user?.Username, user.Id); var site = await _siteLookupService.GetByIdAsync(GetCurrentSiteId()); var directEmailDetails = new DirectEmailDetails(site.Name) { DirectEmailSystemId = "PasswordRecovery", LanguageId = await _languageService .GetLanguageIdAsync(CultureInfo.CurrentUICulture.Name), SendingUserId = await _userRepository.GetSystemUserId(), ToUserId = user.Id }; directEmailDetails.Tags.Add("RecoveryLink", $"{recoveryUrl}?username={trimmedUsername}&token={tokenString}"); directEmailDetails.Tags.Add("RecoveryBaseLink", recoveryUrl); directEmailDetails.Tags.Add("Username", trimmedUsername); directEmailDetails.Tags.Add("Token", tokenString); var siteLink = await _siteLookupService.GetSiteLinkAsync(site.Id); directEmailDetails.Tags.Add("Sitelink", siteLink.AbsoluteUri); var result = new Models.ServiceResult(); try { var history = await _emailService.SendDirectAsync(directEmailDetails); result.Status = history?.Successful == true ? Models.ServiceResultStatus.Success : Models.ServiceResultStatus.Error; } catch (GraException ex) { if (ex?.InnerException is MimeKit.ParseException) { result.Status = Models.ServiceResultStatus.Error; result.Message = Annotations.Validate.AssociatedEmailAddressInvalid; result.Arguments = new[] { username }; } } return(result); }