testing phase
This commit is contained in:
parent
6154bff69b
commit
9fe042df3b
|
@ -1376,6 +1376,10 @@ def setting_authentication():
|
|||
}
|
||||
else:
|
||||
if password_package_enabled is None:
|
||||
for attribute in must_not_contain.split(","):
|
||||
if attribute not in ['firstname','lastname','username','email']:
|
||||
result = {'status': False, 'msg': "Incorrect syntax in 'Must not contain' field"}
|
||||
return render_template('admin_setting_authentication.html', result=result)
|
||||
Setting().set('local_db_enabled', local_db_enabled)
|
||||
Setting().set('signup_enabled', signup_enabled)
|
||||
Setting().set('pwd_min_len', min_len)
|
||||
|
|
|
@ -681,10 +681,18 @@ def password_quality_check(user, password):
|
|||
def rate_password():
|
||||
# print("\n\nGot pass = ", passwd)
|
||||
# result = zxcvbn(pwd, user_inputs=[wordlist])
|
||||
fname = request.form['fname']
|
||||
lname = request.form['lname']
|
||||
email = request.form['email']
|
||||
username = request.form['username']
|
||||
logged_in = request.form['logged_in']
|
||||
if 'logged_in' in request.form and logged_in == 1:
|
||||
fname = current_user.firstname
|
||||
lname = current_user.lastname
|
||||
username = current_user.username
|
||||
email = current_user.email
|
||||
else:
|
||||
fname = request.form['fname']
|
||||
lname = request.form['lname']
|
||||
username = request.form['username']
|
||||
email = request.form['email']
|
||||
|
||||
password = request.form['password']
|
||||
inputs = []
|
||||
for i in [fname, lname, email, username]:
|
||||
|
|
|
@ -89,7 +89,7 @@ def profile():
|
|||
reload_info=False)
|
||||
user.update_profile()
|
||||
|
||||
return render_template('user_profile.html', user_info = current_user.get_user_info_by_username())
|
||||
return render_template('user_profile.html', user_info = current_user.get_user_info_by_username(), zxcvbn_enabled=Setting().get('zxcvbn_enabled'))
|
||||
|
||||
|
||||
@user_bp.route('/qrcode')
|
||||
|
|
|
@ -1,19 +1,18 @@
|
|||
{% macro password_policy(zxcvbn_enabled, pwd_min_len, pwd_min_digits, pwd_min_uppercase, pwd_min_lowercase, pwd_min_special, pwd_must_not_contain) -%}
|
||||
{% macro password_policy(is_logged_in, current_user, zxcvbn_enabled, pwd_min_len, pwd_min_digits, pwd_min_uppercase, pwd_min_lowercase, pwd_min_special, pwd_must_not_contain) -%}
|
||||
{{ caller() }}
|
||||
|
||||
|
||||
var csrftoken = document.getElementsByName('_csrf_token')[0].value; // $('[name=_csrf_token]').val()
|
||||
$.ajaxSetup({
|
||||
beforeSend: function(xhr, settings) {
|
||||
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
|
||||
xhr.setRequestHeader("X-CSRFToken", csrftoken)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
{% if zxcvbn_enabled == false %}
|
||||
// handling password complexity requirements message and password comparison
|
||||
$(':input').on('keyup', function() {
|
||||
var rpass = document.getElementById('rpassword').value;
|
||||
var input = document.getElementById('newpassword');
|
||||
var pass = input.value;
|
||||
if (rpass != pass) {
|
||||
document.getElementById('pwd-submit').disabled = true;
|
||||
document.getElementById('retype-err').innerHTML = 'Password confirmation does not match';
|
||||
}
|
||||
else {
|
||||
document.getElementById('retype-err').innerHTML = '';
|
||||
}
|
||||
function charbased_password_policy(fname, lname, username, email, pass, rpass) {
|
||||
var pwd_len = parseInt("{{ pwd_min_len }}");
|
||||
var n_upper = parseInt("{{ pwd_min_uppercase }}");
|
||||
var n_lower = parseInt("{{ pwd_min_lowercase }}");
|
||||
|
@ -43,14 +42,10 @@ $(':input').on('keyup', function() {
|
|||
if (upper_found < n_upper) msg += 'at least ' + n_upper + ' uppercase character(s)<br>';
|
||||
if (digits_found < n_digits) msg += 'at least ' + n_digits + ' digit(s)<br>';
|
||||
if (special_found < n_special) msg += 'at least ' + n_special + ' special character(s) from [!@#$%^&*()_+<br>';
|
||||
if (msg.length != 0) msg = "Password must have: <br>" + msg;
|
||||
if (msg.length != 0) msg = "Password must contain: <br>" + msg;
|
||||
|
||||
// must not contain
|
||||
must_not_contain_msg = "";
|
||||
var fname = "{{ user_info.firstname }}";
|
||||
var lname = "{{ user_info.lastname }}";
|
||||
var email = "{{ user_info.email }}";
|
||||
var username = "{{ user_info.username }}";
|
||||
if (must_not_contain.search("username") != -1 && pass.search(username) != -1) must_not_contain_msg += " username<br>"
|
||||
if (must_not_contain.search("firstname") != -1 && pass.search(fname) != -1) must_not_contain_msg += " firstname<br>"
|
||||
if (must_not_contain.search("lastname") != -1 && pass.search(lname) != -1) must_not_contain_msg += " lastname<br>"
|
||||
|
@ -58,28 +53,42 @@ $(':input').on('keyup', function() {
|
|||
if (must_not_contain_msg.length != 0) must_not_contain_msg = "Password must not contain: <br>" + must_not_contain_msg
|
||||
var x = document.getElementById('policy-err');
|
||||
x.innerHTML = msg + must_not_contain_msg
|
||||
if (msg != "") {
|
||||
if (msg.length != 0 || must_not_contain_msg.length != 0) {
|
||||
document.getElementById('pwd-submit').disabled = true;
|
||||
}
|
||||
else if (msg.length == 0 && pass.length != 0 && rpass == pass){
|
||||
document.getElementById('pwd-submit').disabled = false;
|
||||
}
|
||||
});
|
||||
else {
|
||||
document.getElementById('pwd-submit').disabled = true;
|
||||
}
|
||||
}
|
||||
{% else %}
|
||||
|
||||
|
||||
|
||||
var timer = null;
|
||||
var is_complex = false;
|
||||
function send_pass() {
|
||||
var fname = document.getElementById('firstname').value;
|
||||
var lname = document.getElementById('lastname').value;
|
||||
var email = document.getElementById('email').value;
|
||||
var username = document.getElementById('username').value;
|
||||
{% if is_logged_in == 0 %}
|
||||
var fname = document.getElementById('firstname').value;
|
||||
var lname = document.getElementById('lastname').value;
|
||||
var email = document.getElementById('email').value;
|
||||
var username = document.getElementById('username').value;
|
||||
{% else %}
|
||||
var fname = '{{current_user.firstname}}';
|
||||
var lname = '{{current_user.lastname}}';
|
||||
var email = '{{current_user.email}}';
|
||||
var username = '{{current_user.username}}';
|
||||
{% endif %}
|
||||
var password = document.getElementById('password').value;
|
||||
|
||||
|
||||
$.ajax({
|
||||
url: "/ratepassword",
|
||||
// headers: { "X-CSRFToken": getCookie("csrftoken") },
|
||||
<!-- headers: { "X-CSRFToken": getCookie("csrftoken") }, -->
|
||||
type: "post",
|
||||
data : {'fname': fname, 'lname': lname, 'email' : email, 'username' : username, 'password': password},
|
||||
data : { 'logged_in' : {{is_logged_in}} ,'fname': fname, 'lname': lname, 'email' : email, 'username' : username, 'password': password},
|
||||
success: function(response) {
|
||||
console.log('Submission was successful.');
|
||||
console.log("Resp = " , response)
|
||||
|
@ -111,14 +120,14 @@ function send_pass() {
|
|||
}
|
||||
var y = document.getElementById('password-text')
|
||||
y.innerHTML = strength;
|
||||
|
||||
var rpass = document.getElementById('rpassword').value;
|
||||
if (response['feedback'] != "") {
|
||||
document.getElementById('register').disabled = true;
|
||||
// $('#pass-feedback').addClass("has-error");
|
||||
}
|
||||
else {
|
||||
document.getElementById('register').disabled = false;
|
||||
// $('#pass-feedback').addClass("has-success");
|
||||
document.getElementById('pwd-submit').disabled = true;
|
||||
} else if(!(rpass != password || password.length == 0 || rpass.length == 0)) {
|
||||
{% if is_logged_in == 1 %}
|
||||
document.getElementById('retype-err').innerHTML = '';
|
||||
{% endif %}
|
||||
document.getElementById('pwd-submit').disabled = false;
|
||||
}
|
||||
|
||||
},
|
||||
|
@ -131,6 +140,17 @@ function send_pass() {
|
|||
// handling password complexity requirements message
|
||||
$(':input').on('keyup', function() {
|
||||
|
||||
var pass = document.getElementById('password').value;
|
||||
|
||||
var rpass = document.getElementById('rpassword').value;
|
||||
if (rpass != pass || pass.length == 0 || rpass.length == 0) {
|
||||
{% if is_logged_in == 1 %}
|
||||
|
||||
document.getElementById('retype-err').innerHTML = 'Password confirmation does not match';
|
||||
{% endif %}
|
||||
document.getElementById('pwd-submit').disabled = true;
|
||||
}
|
||||
|
||||
var seconds = 1;
|
||||
if (timer == null) { // if user typed sth and timer is not running, then start one
|
||||
timer = setTimeout(send_pass, seconds*1000);
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
<title>Register - {{ SITE_NAME }}</title>
|
||||
<link rel="icon" href="{{ url_for('static', filename='img/favicon.png') }}">
|
||||
<!-- Tell the browser to be responsive to screen width -->
|
||||
|
@ -21,6 +20,8 @@
|
|||
<![endif]-->
|
||||
</head>
|
||||
|
||||
{% import 'password_policy_macro.html' as password_policy_macro %}
|
||||
|
||||
<body class="hold-transition register-page">
|
||||
<div class="register-box">
|
||||
<div class="register-logo">
|
||||
|
@ -71,7 +72,7 @@
|
|||
</div>
|
||||
<div class="form-group has-feedback">
|
||||
<input type="password" class="form-control" placeholder="Retype password" name="rpassword"
|
||||
data-match="#password" data-match-error="Password confirmation does not match" required>
|
||||
data-match="#password" id="rpassword" data-match-error="Password confirmation does not match" required>
|
||||
<span class="glyphicon glyphicon-log-in form-control-feedback"></span>
|
||||
<span class="help-block with-errors"></span>
|
||||
</div>
|
||||
|
@ -80,7 +81,7 @@
|
|||
<button type="button" class="btn btn-flat btn-block" id="button_back">Back</button>
|
||||
</div>
|
||||
<div class="col-xs-4 pull-right">
|
||||
<button type="submit" id="register" class="btn btn-flat btn-primary btn-block">Register</button>
|
||||
<button type="submit" id="pwd-submit" class="btn btn-flat btn-primary btn-block">Register</button>
|
||||
</div>
|
||||
<!-- /.col -->
|
||||
</div>
|
||||
|
@ -108,155 +109,45 @@
|
|||
})
|
||||
});
|
||||
|
||||
{% call password_policy_macro.password_policy(0, 0, SETTING.get('zxcvbn_enabled'), SETTING.get('pwd_min_len'), SETTING.get('pwd_min_digits'), SETTING.get('pwd_min_uppercase'), SETTING.get('pwd_min_lowercase'), SETTING.get('pwd_min_special'), SETTING.get('pwd_must_not_contain')) %}
|
||||
{% endcall %}
|
||||
|
||||
{% if SETTING.get('zxcvbn_enabled') == false %}
|
||||
// handling password complexity requirements message
|
||||
$(':input').on('keyup', function() {
|
||||
|
||||
var input = document.getElementById('password');
|
||||
var pass = input.value;
|
||||
var pwd_len = parseInt("{{ SETTING.get('pwd_min_len') }}");
|
||||
var n_upper = parseInt("{{ SETTING.get('pwd_min_uppercase') }}");
|
||||
var n_lower = parseInt("{{ SETTING.get('pwd_min_lowercase') }}");
|
||||
var n_digits = parseInt("{{ SETTING.get('pwd_min_digits') }}");
|
||||
var n_special = parseInt("{{ SETTING.get('pwd_min_special') }}");
|
||||
var must_not_contain = "{{ SETTING.get('pwd_must_not_contain') }}";
|
||||
var pattern = "^(?=(?:.*[0-9]){" + n_digits + ",})(?=(?:.*[a-z]){" + n_lower + ",})(?=(?:.*[A-Z]){" + n_upper + ",})(?=(?:.*[[!@#$%^&*()_+]){" + n_special + ",}).+$";
|
||||
|
||||
var PasswordRegEx = new RegExp(pattern, 'm');
|
||||
var upper_found = 0;
|
||||
var lower_found = 0;
|
||||
var digits_found = 0;
|
||||
var special_found = 0;
|
||||
var lower_pattern = /[a-z]/g;
|
||||
var upper_pattern = /[A-Z]/g;
|
||||
var digits_pattern = /[0-9]/g;
|
||||
var special_pattern = /[[!@#$%^&*()_+]/g;
|
||||
for (var i = 0; i < pass.length; i++) {
|
||||
if (pass[i].match(special_pattern)) special_found++;
|
||||
else if (pass[i].match(lower_pattern)) lower_found++;
|
||||
else if (pass[i].match(upper_pattern)) upper_found++;
|
||||
else if (pass[i].match(digits_pattern)) digits_found++;
|
||||
}
|
||||
var msg = "";
|
||||
if (pass.length < pwd_len) msg += 'at least ' + pwd_len + ' character(s)<br>'
|
||||
if (lower_found < n_lower) msg += 'at least ' + n_lower + ' lowercase character(s)<br>';
|
||||
if (upper_found < n_upper) msg += 'at least ' + n_upper + ' uppercase character(s)<br>';
|
||||
if (digits_found < n_digits) msg += 'at least ' + n_digits + ' digit(s)<br>';
|
||||
if (special_found < n_special) msg += 'at least ' + n_special + ' special character(s) from [!@#$%^&*()_+ <br>';
|
||||
if (msg.length != 0) msg = "Password must have: <br>" + msg;
|
||||
var rpass = document.getElementById('rpassword').value;
|
||||
var pass = input.value;
|
||||
if (rpass != pass || rpass.length == 0 || pass.length == 0) {
|
||||
document.getElementById('pwd-submit').disabled = true;
|
||||
// document.getElementById('retype-err').innerHTML = 'Password confirmation does not match';
|
||||
}
|
||||
// else {
|
||||
// document.getElementById('retype-err').innerHTML = '';
|
||||
// }
|
||||
var fname = document.getElementById('firstname').value;
|
||||
var lname = document.getElementById('lastname').value;
|
||||
var email = document.getElementById('email').value;
|
||||
var username = document.getElementById('username').value;
|
||||
|
||||
charbased_password_policy(fname, lname, username, email, pass, rpass);
|
||||
|
||||
// must not contain
|
||||
must_not_contain_msg = "";
|
||||
var fname = document.getElementById('firstname').value;
|
||||
var lname = document.getElementById('lastname').value;
|
||||
var email = document.getElementById('email').value;
|
||||
var username = document.getElementById('username').value;
|
||||
if (must_not_contain.search("username") != -1 && pass.search(username) != -1) must_not_contain_msg += " username<br>"
|
||||
if (must_not_contain.search("firstname") != -1 && pass.search(fname) != -1) must_not_contain_msg += " firstname<br>"
|
||||
if (must_not_contain.search("lastname") != -1 && pass.search(lname) != -1) must_not_contain_msg += " lastname<br>"
|
||||
if (must_not_contain.search("email") != -1 && pass.search(email) != -1) must_not_contain_msg += " email<br>"
|
||||
if (must_not_contain_msg.length != 0) must_not_contain_msg = "Password must not contain: <br>" + must_not_contain_msg
|
||||
|
||||
|
||||
|
||||
|
||||
var x = document.getElementById('policy-err');
|
||||
x.innerHTML = msg + must_not_contain_msg
|
||||
if (msg != "") {
|
||||
document.getElementById('register').disabled = true;
|
||||
$('#pass-feedback').addClass("has-error");
|
||||
}
|
||||
else if (msg.length == 0 && pass.length != 0){
|
||||
document.getElementById('register').disabled = false;
|
||||
$('#pass-feedback').addClass("has-success");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
{% else %}
|
||||
var csrftoken = $('meta[name=csrf-token]').attr('content')
|
||||
// var csrftoken = $('meta[name=csrf-token]').attr('content')
|
||||
|
||||
$.ajaxSetup({
|
||||
beforeSend: function(xhr, settings) {
|
||||
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
|
||||
xhr.setRequestHeader("X-CSRFToken", csrftoken)
|
||||
}
|
||||
}
|
||||
})
|
||||
var timer = null;
|
||||
function send_pass() {
|
||||
var fname = document.getElementById('firstname').value;
|
||||
var lname = document.getElementById('lastname').value;
|
||||
var email = document.getElementById('email').value;
|
||||
var username = document.getElementById('username').value;
|
||||
var password = document.getElementById('password').value;
|
||||
|
||||
$.ajax({
|
||||
url: "/ratepassword",
|
||||
// headers: { "X-CSRFToken": getCookie("csrftoken") },
|
||||
type: "post",
|
||||
data : {'fname': fname, 'lname': lname, 'email' : email, 'username' : username, 'password': password},
|
||||
success: function(response) {
|
||||
console.log('Submission was successful.');
|
||||
console.log("Resp = " , response)
|
||||
console.log('sccess')
|
||||
var x = document.getElementById('policy-err');
|
||||
// x.innerHTML = response['feedback'];
|
||||
x.innerHTML = "<ul>";
|
||||
for (let i = 0; i < response['feedback'].length; i++) {
|
||||
x.innerHTML += "<li>" + response['feedback'][i] + "</li>";
|
||||
}
|
||||
x.innerHTML += "</ul>"
|
||||
var strength;
|
||||
switch (response['strength']) {
|
||||
case '':
|
||||
strength = ''; // no password was given
|
||||
break;
|
||||
case 'very weak':
|
||||
strength = "<small class='progress-bar bg-danger' style='background-color: #a50021; width: 25%'>Very weak</small>";
|
||||
break;
|
||||
case 'weak':
|
||||
strength = "<small class='progress-bar bg-danger' style='background-color: #f7a73e;width: 50%'>Weak</small>";
|
||||
break;
|
||||
case 'medium':
|
||||
strength = "<small class='progress-bar bg-warning' style='background-color: #a0cb89; width: 75%'>Medium</small>";
|
||||
break;
|
||||
case 'strong':
|
||||
strength = "<small class='progress-bar bg-success' style='background-color: #2e8b57; width: 100%'>Strong</small>";
|
||||
break;
|
||||
}
|
||||
var y = document.getElementById('password-text')
|
||||
y.innerHTML = strength;
|
||||
|
||||
if (response['feedback'] != "") {
|
||||
document.getElementById('register').disabled = true;
|
||||
// $('#pass-feedback').addClass("has-error");
|
||||
}
|
||||
else {
|
||||
document.getElementById('register').disabled = false;
|
||||
// $('#pass-feedback').addClass("has-success");
|
||||
}
|
||||
|
||||
},
|
||||
error: function(xhr) {
|
||||
console.log("Ajax call to rate pass, has failed")
|
||||
}
|
||||
});
|
||||
timer = null; // turn the timer off
|
||||
}
|
||||
// handling password complexity requirements message
|
||||
$(':input').on('keyup', function() {
|
||||
|
||||
var seconds = 1;
|
||||
if (timer == null) { // if user typed sth and timer is not running, then start one
|
||||
timer = setTimeout(send_pass, seconds*1000);
|
||||
}
|
||||
else { // if user typed sth and timer is still up and running,then reset timer
|
||||
clearTimeout(timer);
|
||||
timer = null;
|
||||
timer = setTimeout(send_pass, seconds*1000);
|
||||
}
|
||||
});
|
||||
// $.ajaxSetup({
|
||||
// beforeSend: function(xhr, settings) {
|
||||
// if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
|
||||
// xhr.setRequestHeader("X-CSRFToken", csrftoken)
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
{% endif %}
|
||||
</script>
|
||||
</body>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}<title>My Profile - {{ SITE_NAME }}</title>{% endblock %}
|
||||
{% block dashboard_stat %}
|
||||
|
||||
<!-- Content Header (Page header) -->
|
||||
<section class="content-header">
|
||||
<h1>
|
||||
|
@ -80,13 +81,16 @@
|
|||
<div class="form-group">
|
||||
<label for="password">New Password</label>
|
||||
<input type="password"
|
||||
class="form-control" name="password" id="newpassword" required />
|
||||
class="form-control" name="password" id="password" required />
|
||||
</div>
|
||||
{% if zxcvbn_enabled == true %}
|
||||
<small class="help-block" id="password-text"></small> <br>
|
||||
{% endif %}
|
||||
<div id="policy-err" style='color: #df5948;'></div>
|
||||
<div class="form-group has-feedback">
|
||||
<label for="rpassword">Re-type New Password</label>
|
||||
<input type="password"
|
||||
data-match="#newpassword" data-match-error="Password confirmation does not match"
|
||||
data-match="#password" data-match-error="Password confirmation does not match"
|
||||
class="form-control" name="rpassword" id="rpassword" required />
|
||||
<span class="help-block with-errors"></span>
|
||||
<span class="glyphicon form-control-feedback"></span>
|
||||
|
@ -178,8 +182,36 @@
|
|||
});
|
||||
|
||||
|
||||
{% call password_policy_macro.password_policy(zxcvbn_enabled, SETTING.get('pwd_min_len'), SETTING.get('pwd_min_digits'), SETTING.get('pwd_min_uppercase'), SETTING.get('pwd_min_lowercase'), SETTING.get('pwd_min_special'), SETTING.get('pwd_must_not_contain')) %}
|
||||
document.getElementById('pwd-submit').disabled = true;
|
||||
{% call password_policy_macro.password_policy(1, user_info, zxcvbn_enabled, SETTING.get('pwd_min_len'), SETTING.get('pwd_min_digits'), SETTING.get('pwd_min_uppercase'), SETTING.get('pwd_min_lowercase'), SETTING.get('pwd_min_special'), SETTING.get('pwd_must_not_contain')) %}
|
||||
{% endcall %}
|
||||
|
||||
|
||||
{% if zxcvbn_enabled == false %}
|
||||
|
||||
// handling password complexity requirements message and password comparison
|
||||
$(':input').on('keyup', function() {
|
||||
var rpass = document.getElementById('rpassword').value;
|
||||
var input = document.getElementById('password');
|
||||
var pass = input.value;
|
||||
if (rpass != pass || pass.length == 0 || rpass.length == 0) {
|
||||
document.getElementById('pwd-submit').disabled = true;
|
||||
document.getElementById('retype-err').innerHTML = 'Password confirmation does not match';
|
||||
}
|
||||
else {
|
||||
document.getElementById('retype-err').innerHTML = '';
|
||||
}
|
||||
var fname = "{{ user_info.firstname }}";
|
||||
var lname = "{{ user_info.lastname }}";
|
||||
var email = "{{ user_info.email }}";
|
||||
var username = "{{ user_info.username }}";
|
||||
|
||||
charbased_password_policy(fname, lname, username, email, pass, rpass);
|
||||
|
||||
});
|
||||
{% endif %}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
|
Loading…
Reference in a new issue