luci-app-olsr: handle empty result for non-status tables
[oweals/luci.git] / modules / luci-mod-system / luasrc / view / admin_system / password.htm
index 3aff9c981cf0abd10fe4d847b477779a802dd2aa..6ca02a83c118aa3107c26a6280b4889f679f351c 100644 (file)
@@ -1,41 +1,27 @@
 <%+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>
@@ -48,7 +34,7 @@
                <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>
@@ -56,8 +42,9 @@
                <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>
@@ -67,4 +54,6 @@
        <button class="btn cbi-button-apply" onclick="submitPassword(event)"><%:Save%></button>
 </div>
 
+<script type="application/javascript" src="<%=resource%>/view/system/password.js"></script>
+
 <%+footer%>