private Account checkRecoveryForm(
      NativeWebRequest request, RecoveryConfirmationForm form, BindingResult result) {
    if (isEmpty(form.getEmail())) {
      result.rejectValue("email", "account.register.email.err.blank");
    }

    if (isEmpty(form.getPassword())) {
      result.rejectValue("password", "account.register.pwd.err.blank");
    }

    if (isEmpty(form.getToken())) {
      result.rejectValue(
          "token", "account.recovery.err.token", new Object[] {form.getEmail()}, null);
    }

    if (isEmpty(form.getConfirm())) {
      result.rejectValue("confirm", "account.register.pwd-cfr.err.blank");
    } else if (!form.getPassword().equals(form.getConfirm())) {
      result.rejectValue("confirm", "account.register.pwd-cfr.err.mismatch");
    }

    if (captchaService != null) {
      captchaService.validateCaptcha(request, result);
    }

    Account player = null;
    try {
      player = accountManager.findByEmail(form.getEmail());
      if (player != null) {
        final RecoveryToken token = recoveryTokenManager.getToken(player);
        if (token == null) {
          result.rejectValue(
              "token", "account.recovery.err.expired", new Object[] {form.getEmail()}, null);
        } else if (!token.getToken().equals(form.getToken())) {
          result.rejectValue(
              "token", "account.recovery.err.token", new Object[] {form.getEmail()}, null);
        }
      } else {
        result.rejectValue("email", "account.recovery.err.unknown");
      }
    } catch (Exception ex) {
      result.rejectValue("token", "account.recovery.err.system");
    }
    return player;
  }
  @RequestMapping(value = "request")
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public String recoveryRequestPage(
      HttpSession session,
      Model model,
      @Valid @ModelAttribute("recovery") RecoveryRequestForm form,
      BindingResult result) {
    log.info("Recovery password for {}", form);

    if (form.isRecoveryAccount()) {
      try {
        final Account account = accountManager.findByEmail(form.getEmail());
        if (account != null) {
          final RecoveryToken token = recoveryTokenManager.generateToken(account);
          log.info("Recovery token generated: {}", token);

          final Map<String, Object> mailModel = new HashMap<>();
          mailModel.put("principal", account);
          mailModel.put("recoveryToken", token.getToken());

          final Member member = personalityManager.getMember(account.getId());
          notificationService.raiseNotification(
              "account.recovery", member, NotificationSender.ACCOUNTS, mailModel);
          session.setAttribute(RECOVERING_PLAYER_EMAIL, account.getEmail());
          return "redirect:/account/recovery/confirmation";
        } else {
          result.rejectValue("email", "account.recovery.err.unknown");
        }
      } catch (Exception ex) {
        log.error("Recovery password email can't be delivered", ex);
        result.rejectValue("email", "account.recovery.err.system");
      }
    }
    model.addAttribute("resourceTemplate", "/content/account/recovery/request.ftl");
    return "/content/assistance/help";
  }