mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 05:23:35 +00:00
portico: Explain why password is weak to user.
This commit is contained in:
@@ -2,11 +2,14 @@ add_dependencies({
|
||||
zxcvbn: 'node_modules/zxcvbn/dist/zxcvbn.js',
|
||||
});
|
||||
|
||||
set_global('i18n', global.stub_i18n);
|
||||
|
||||
var common = require("js/common.js");
|
||||
|
||||
(function test_basics() {
|
||||
var accepted;
|
||||
var password;
|
||||
var warning;
|
||||
|
||||
var bar = (function () {
|
||||
var self = {};
|
||||
@@ -60,21 +63,28 @@ var common = require("js/common.js");
|
||||
assert(!accepted);
|
||||
assert.equal(bar.w, '39.7%');
|
||||
assert.equal(bar.added_class, 'bar-danger');
|
||||
|
||||
warning = common.password_warning(password, password_field(10));
|
||||
assert.equal(warning, 'translated: Password should be at least 10 characters long');
|
||||
|
||||
password = 'foo';
|
||||
accepted = common.password_quality(password, bar, password_field(2, 0.001));
|
||||
assert(accepted);
|
||||
assert.equal(bar.w, '10.390277164940581%');
|
||||
assert.equal(bar.added_class, 'bar-success');
|
||||
warning = common.password_warning(password, password_field(2));
|
||||
assert.equal(warning, 'translated: Password is too weak');
|
||||
|
||||
password = 'aaaaaaaa';
|
||||
accepted = common.password_quality(password, bar, password_field(6, 1000));
|
||||
assert(!accepted);
|
||||
assert.equal(bar.added_class, 'bar-danger');
|
||||
warning = common.password_warning(password, password_field(6));
|
||||
assert.equal(warning, 'Repeats like "aaa" are easy to guess');
|
||||
|
||||
delete global.zxcvbn;
|
||||
password = 'aaaaaaaa';
|
||||
accepted = common.password_quality(password, bar, password_field(6, 1000));
|
||||
assert(accepted === undefined);
|
||||
warning = common.password_warning(password, password_field(6));
|
||||
assert(warning === undefined);
|
||||
}());
|
||||
|
||||
@@ -62,6 +62,23 @@ exports.password_quality = function (password, bar, password_field) {
|
||||
return acceptable;
|
||||
};
|
||||
|
||||
exports.password_warning = function (password, password_field) {
|
||||
if (typeof zxcvbn === 'undefined') {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
var min_length = 6;
|
||||
|
||||
if (password_field) {
|
||||
min_length = password_field.data('minLength') || min_length;
|
||||
}
|
||||
|
||||
if (password.length < min_length) {
|
||||
return i18n.t('Password should be at least __length__ characters long', {length: min_length});
|
||||
}
|
||||
return zxcvbn(password).feedback.warning || i18n.t("Password is too weak");
|
||||
};
|
||||
|
||||
return exports;
|
||||
|
||||
}());
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
$(function () {
|
||||
// NB: this file is included on multiple pages. In each context,
|
||||
// some of the jQuery selectors below will return empty lists.
|
||||
var password_field = $('#id_password, #id_new_password1');
|
||||
|
||||
$.validator.addMethod('password_strength', function (value) {
|
||||
return common.password_quality(value, undefined, $('#id_password, #id_new_password1'));
|
||||
}, "Password is too weak.");
|
||||
return common.password_quality(value, undefined, password_field);
|
||||
}, function () {
|
||||
return common.password_warning(password_field.val(), password_field);
|
||||
});
|
||||
|
||||
function highlight(class_to_add) {
|
||||
// Set a class on the enclosing control group.
|
||||
@@ -35,7 +38,7 @@ $(function () {
|
||||
unhighlight: highlight('success'),
|
||||
});
|
||||
|
||||
$('#id_password, #id_new_password1').on('change keyup', function () {
|
||||
password_field.on('change keyup', function () {
|
||||
// Update the password strength bar even if we aren't validating
|
||||
// the field yet.
|
||||
common.password_quality($(this).val(), $('#pw_strength .bar'), $(this));
|
||||
|
||||
Reference in New Issue
Block a user