<%+header%>
-<script type="application/javascript">//<![CDATA[
- function submitPassword(ev) {
- var pw1 = document.body.querySelector('[name="pw1"]'),
- pw2 = document.body.querySelector('[name="pw2"]');
-
- if (!pw1.value.length || !pw2.value.length)
- return;
-
- if (pw1.value === pw2.value) {
- showModal('<%:Change login password%>',
- E('p', { class: 'spinning' }, '<%:Changing password…%>'));
-
- (new XHR()).post('<%=url("admin/system/admin/password/json")%>',
- { token: '<%=token%>', password: pw1.value },
- function() {
- showModal('<%:Change login password%>', [
- E('div', _('The system password has been successfully changed.')),
- E('div', { 'class': 'right' },
- E('div', { class: 'btn', click: hideModal }, '<%:Dismiss%>'))
- ]);
+<input type="password" aria-hidden="true" style="position:absolute; left:-10000px" />
- pw1.value = pw2.value = '';
- });
- }
- else {
- showModal('<%:Change login password%>', [
- E('div', { class: 'alert-message warning' },
- _('Given password confirmation did not match, password not changed!')),
- E('div', { 'class': 'right' },
- E('div', { class: 'btn', click: hideModal }, '<%:Dismiss%>'))
- ]);
- }
+<script type="text/javascript">
+function checkPassword() {
+ var pw1 = document.body.querySelector('[name="pw1"]');
+ var view = document.getElementById("passstrength");
+
+ var strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$", "g");
+ var mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g");
+ var enoughRegex = new RegExp("(?=.{6,}).*", "g");
+ if (false == enoughRegex.test(pw1.value)) {
+ view.innerHTML = '<%:Password strength%>: <span style="color:red"><%:More Characters%></span>';
+ } else if (strongRegex.test(pw1.value)) {
+ view.innerHTML = '<%:Password strength%>: <span style="color:green"><%:Strong%></span>';
+ } else if (mediumRegex.test(pw1.value)) {
+ view.innerHTML = '<%:Password strength%>: <span style="color:orange"><%:Medium%></span>';
+ } else {
+ view.innerHTML = '<%:Password strength%>: <span style="color:red"><%:Weak%></span>';
}
-//]]></script>
-
-<input type="password" aria-hidden="true" style="position:absolute; left:-10000px" />
+ return true;
+}
+</script>
<div class="cbi-map">
<h2><%:Router Password%></h2>
<div class="cbi-value">
<label class="cbi-value-title" for="image"><%:Password%></label>
<div class="cbi-value-field">
- <input type="password" name="pw1" /><!--
+ <input type="password" name="pw1" onkeyup="checkPassword()"/><!--
--><button class="cbi-button cbi-button-neutral" title="<%:Reveal/hide password%>" aria-label="<%:Reveal/hide password%>" onclick="var e = this.previousElementSibling; e.type = (e.type === 'password') ? 'text' : 'password'">∗</button>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title" for="image"><%:Confirmation%></label>
<div class="cbi-value-field">
- <input type="password" name="pw2" /><!--
+ <input type="password" name="pw2" onkeydown="if (event.keyCode === 13) submitPassword(event)" /><!--
--><button class="cbi-button cbi-button-neutral" title="<%:Reveal/hide password%>" aria-label="<%:Reveal/hide password%>" onclick="var e = this.previousElementSibling; e.type = (e.type === 'password') ? 'text' : 'password'">∗</button>
+ <div id="passstrength" class="cbi-value-description"></div>
</div>
</div>
</div>
<button class="btn cbi-button-apply" onclick="submitPassword(event)"><%:Save%></button>
</div>
+<script type="application/javascript" src="<%=resource%>/view/system/password.js"></script>
+
<%+footer%>