95 lines
2.9 KiB
JavaScript
95 lines
2.9 KiB
JavaScript
'use strict';
|
|
'require ui';
|
|
'require form';
|
|
'require rpc';
|
|
|
|
var formData = {
|
|
password: {
|
|
pw1: null,
|
|
pw2: null
|
|
}
|
|
};
|
|
|
|
var callSetPassword = rpc.declare({
|
|
object: 'luci',
|
|
method: 'setPassword',
|
|
params: [ 'username', 'password' ],
|
|
expect: { result: false }
|
|
});
|
|
|
|
return L.view.extend({
|
|
checkPassword: function(section_id, value) {
|
|
var strength = document.querySelector('.cbi-value-description'),
|
|
strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$", "g"),
|
|
mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g"),
|
|
enoughRegex = new RegExp("(?=.{6,}).*", "g");
|
|
|
|
if (strength && value.length) {
|
|
if (false == enoughRegex.test(value))
|
|
strength.innerHTML = '%s: <span style="color:red">%s</span>'.format(_('Password strength'), _('More Characters'));
|
|
else if (strongRegex.test(value))
|
|
strength.innerHTML = '%s: <span style="color:green">%s</span>'.format(_('Password strength'), _('Strong'));
|
|
else if (mediumRegex.test(value))
|
|
strength.innerHTML = '%s: <span style="color:orange">%s</span>'.format(_('Password strength'), _('Medium'));
|
|
else
|
|
strength.innerHTML = '%s: <span style="color:red">%s</span>'.format(_('Password strength'), _('Weak'));
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
render: function() {
|
|
var m, s, o;
|
|
|
|
m = new form.JSONMap(formData, _('Router Password'), _('Changes the administrator password for accessing the device'));
|
|
s = m.section(form.NamedSection, 'password', 'password');
|
|
|
|
o = s.option(form.Value, 'pw1', _('Password'));
|
|
o.password = true;
|
|
o.validate = this.checkPassword;
|
|
|
|
o = s.option(form.Value, 'pw2', _('Confirmation'), ' ');
|
|
o.password = true;
|
|
o.renderWidget = function(/* ... */) {
|
|
var node = form.Value.prototype.renderWidget.apply(this, arguments);
|
|
|
|
node.childNodes[1].addEventListener('keydown', function(ev) {
|
|
if (ev.keyCode == 13 && !ev.currentTarget.classList.contains('cbi-input-invalid'))
|
|
document.querySelector('.cbi-button-save').click();
|
|
});
|
|
|
|
return node;
|
|
};
|
|
|
|
return m.render();
|
|
},
|
|
|
|
handleSave: function() {
|
|
var map = document.querySelector('.cbi-map');
|
|
|
|
return L.dom.callClassMethod(map, 'save').then(function() {
|
|
if (formData.password.pw1 == null || formData.password.pw1.length == 0)
|
|
return;
|
|
|
|
if (formData.password.pw1 != formData.password.pw2) {
|
|
ui.addNotification(null, E('p', _('Given password confirmation did not match, password not changed!')), 'danger');
|
|
return;
|
|
}
|
|
|
|
return callSetPassword('root', formData.password.pw1).then(function(success) {
|
|
if (success)
|
|
ui.addNotification(null, E('p', _('The system password has been successfully changed.')), 'info');
|
|
else
|
|
ui.addNotification(null, E('p', _('Failed to change the system password.')), 'danger');
|
|
|
|
formData.password.pw1 = null;
|
|
formData.password.pw2 = null;
|
|
|
|
L.dom.callClassMethod(map, 'render');
|
|
});
|
|
});
|
|
},
|
|
|
|
handleSaveApply: null,
|
|
handleReset: null
|
|
});
|