packages feed

yesod-auth-simple-1.1.0: templates/password-field-zxcvbn.julius

var yas__extraWordsEl = document.getElementById("yas__extra-words");
var yas__extraWords = [];
if (yas__extraWordsEl) {
  var str = yas__extraWordsEl.getAttribute("data-extra-words");
  if (Boolean(str)) { yas__extraWords = str.split(" "); }
}

var yas__passwordFeedback = document.getElementById("yas--password-feedback");
var yas__passwordMeter = yas__passwordFeedback.querySelector(".yas--password-meter");
var yas__passwordErrors = yas__passwordFeedback.querySelector(".yas--password-errors");

function yas_showError() {
  var warningEl = yas__passwordErrors.querySelector(".yas--password-warning");
  warningEl.appendChild(document.createTextNode("Error requesting password strength"));
}

function yas_updateFeedback (password, strength) {
  var gotScore = typeof strength.score === "number";
  var score, feedback, jsResult;
  if (!gotScore || strength.score <= 2 || strength.score < #{toJSON $ fromEnum minStren}) {
    jsResult = zxcvbn(password, yas__extraWords);
    feedback = jsResult.feedback;
  }

  if (gotScore) { score = strength.score; }
  else {          score = jsResult.score; }

  yas__passwordMeter.classList.add("yas--strength-" + score);
  yas__passwordMeter.classList.remove("yas--strength-init");
  for (var i=0; i<5; i++) {
    if (i !== score) {
      yas__passwordMeter.classList.remove("yas--strength-" + i);
    }
  }

  var warningEl = yas__passwordErrors.querySelector(".yas--password-warning");
  while (warningEl.firstChild) { warningEl.removeChild(warningEl.firstChild); }

  var tips = yas__passwordErrors.querySelector(".yas--password-suggestions");
  while (tips && tips.firstChild) { tips.removeChild(tips.firstChild); }

  if (Boolean(password) && score < #{toJSON $ fromEnum minStren}) {
    var warning;
    if (Boolean(strength.error)) {
      warning = strength.error;
    } else {
      warning = "The password is not strong enough";
    }
    if (Boolean(feedback.warning)) {
      warning = warning + ". " + feedback.warning;
    }
    warningEl.appendChild(document.createTextNode(warning));

    if (feedback.suggestions.length > 0) {
      var suggestionList = document.createElement("ul");
      for (var i=0; i<feedback.suggestions.length; i++) {
        var li = document.createElement("li");
        var txt = document.createTextNode(feedback.suggestions[i]);
        li.classList.add("yas--suggestion");
        li.appendChild(txt);
        suggestionList.appendChild(li);
      }
      tips.appendChild(suggestionList);
    }
  }
}

var yas_currentReq = 0;
function yas_getPasswordStrength(password) {
  var req = new XMLHttpRequest();
  var reqNum = yas_currentReq + 1;
  req.onreadystatechange = function(resp) {
    if (req.readyState === XMLHttpRequest.DONE) {
      if (req.status === 200) {
        var resp = JSON.parse(req.responseText);
        if (reqNum <= yas_currentReq) {
          yas_updateFeedback(password, resp);
        }
      } else {
        yas_updateFeedback("", #{toJSON blankPasswordScore});
        yas_showError();
      }
    }
  };
  req.open("POST", "@{toParent passwordStrengthR}", true);
  req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  req.send(#{defaultCsrfParamName} + "=" + #{fromMaybe "no-csrf-token" mCsrfToken}
           + "&password=" + encodeURIComponent(password));
  yas_currentReq += 1;
}

function yas_debounce(delay, fn) {
  var timeout;
  return function () {
    if (timeout) { clearTimeout(timeout); }
    timeout = setTimeout(fn.apply.bind(fn, this, arguments), delay);
  };
}

var yas_getPasswordStrengthDeb = yas_debounce(200, yas_getPasswordStrength);

function yas_onPasswordChange(e) {
  if (Boolean(e.target.value) && e.target.value.length < #{toJSON maxPasswordLength}) {
      yas_getPasswordStrengthDeb(e.target.value);
  } else if (!Boolean(e.target.value)) {
    yas_updateFeedback("", #{toJSON blankPasswordScore});
  }
}

document.getElementById("password").addEventListener("input", yas_onPasswordChange);