diff --git a/server/www/teleport/static/js/tp-const.js b/server/www/teleport/static/js/tp-const.js old mode 100644 new mode 100755 index 5df2d8b..7a9cdeb --- a/server/www/teleport/static/js/tp-const.js +++ b/server/www/teleport/static/js/tp-const.js @@ -212,6 +212,7 @@ var TPE_CAPTCHA_EXPIRED = 10000; var TPE_CAPTCHA_MISMATCH = 10001; var TPE_OATH_MISMATCH = 10002; var TPE_SYS_MAINTENANCE = 10003; +var TPE_OATH_ALREADY_BIND = 10004; var TPE_USER_LOCKED = 10100; var TPE_USER_DISABLED = 10101; @@ -314,6 +315,10 @@ function tp_error_msg(error_code, message) { case TPE_SYS_MAINTENANCE: msg = '系统维护中'; break; + + case TPE_OATH_ALREADY_BIND: + msg = '该账号已经绑定了身份验证器,如无法使用,请联系管理员重置密码或更换登陆方式'; + break; case TPE_USER_LOCKED: msg = '账号已被锁定'; diff --git a/server/www/teleport/static/js/user/bind-oath.js b/server/www/teleport/static/js/user/bind-oath.js old mode 100644 new mode 100755 index d9f8f42..4e59b8e --- a/server/www/teleport/static/js/user/bind-oath.js +++ b/server/www/teleport/static/js/user/bind-oath.js @@ -182,7 +182,7 @@ $app.on_auth_user = function () { } $app.dom.auth.btn_submit.attr('disabled', 'disabled'); - $tp.ajax_post_json('/user/verify-user', {username: str_username, password: str_password}, + $tp.ajax_post_json('/user/verify-user', {username: str_username, password: str_password, check_bind_oath: true}, function (ret) { $app.dom.auth.btn_submit.removeAttr('disabled'); if (ret.code === TPE_OK) { diff --git a/server/www/teleport/static/js/user/user-list.js b/server/www/teleport/static/js/user/user-list.js old mode 100644 new mode 100755 index 65f0719..fb85bc1 --- a/server/www/teleport/static/js/user/user-list.js +++ b/server/www/teleport/static/js/user/user-list.js @@ -203,6 +203,8 @@ $app.on_table_users_cell_created = function (tbl, row_id, col_key, cell_obj) { $app.dlg_edit_user.show_edit(row_id); } else if (action === 'reset-password') { $app.dlg_reset_password.show_edit(row_id); + } else if (action === 'reset-oath-bind') { + $app._reset_oath_bind(user.id); } else if (action === 'lock') { $app._lock_users([user.id]); } else if (action === 'unlock') { @@ -349,6 +351,7 @@ $app.on_table_users_render_created = function (render) { h.push(''); h.push('
  • 重置密码
  • '); + h.push('
  • 重置身份验证器
  • '); h.push(''); h.push('
  • 删除
  • '); h.push(''); @@ -547,6 +550,21 @@ $app.set_selected_to_role = function (role_id, role_name) { }; +$app._reset_oath_bind = function (users) { + $tp.ajax_post_json('/user/do-unbind-oath', {users: users}, + function (ret) { + if (ret.code === TPE_OK) { + $tp.notify_success('重置身份验证器操作成功!'); + } else { + $tp.notify_error('重置身份验证器操作失败:' + tp_error_msg(ret.code, ret.message)); + } + }, + function () { + $tp.notify_error('网络故障,重置身份验证器操作失败!'); + } + ); +}; + $app._lock_users = function (users) { $tp.ajax_post_json('/user/update-users', {action: 'lock', users: users}, function (ret) { diff --git a/server/www/teleport/webroot/app/const.py b/server/www/teleport/webroot/app/const.py old mode 100644 new mode 100755 index c029c0f..c3c9a5e --- a/server/www/teleport/webroot/app/const.py +++ b/server/www/teleport/webroot/app/const.py @@ -198,6 +198,7 @@ TPE_CAPTCHA_EXPIRED = 10000 TPE_CAPTCHA_MISMATCH = 10001 TPE_OATH_MISMATCH = 10002 TPE_SYS_MAINTENANCE = 10003 +TPE_OATH_ALREADY_BIND = 10004 TPE_USER_LOCKED = 10100 TPE_USER_DISABLED = 10101 diff --git a/server/www/teleport/webroot/app/controller/__init__.py b/server/www/teleport/webroot/app/controller/__init__.py old mode 100644 new mode 100755 index 6f1c56f..d141f5b --- a/server/www/teleport/webroot/app/controller/__init__.py +++ b/server/www/teleport/webroot/app/controller/__init__.py @@ -78,6 +78,8 @@ controllers = [ (r'/user/verify-user', user.DoVerifyUserHandler), # - [json] 绑定身份认证器 (r'/user/do-bind-oath', user.DoBindOathHandler), + # - 取消绑定身份认证器 + (r'/user/do-unbind-oath', user.DoUnBindOathHandler), # # - 用户组管理页面 (r'/user/group', user.GroupListHandler), diff --git a/server/www/teleport/webroot/app/controller/user.py b/server/www/teleport/webroot/app/controller/user.py old mode 100644 new mode 100755 index 6085f70..4704179 --- a/server/www/teleport/webroot/app/controller/user.py +++ b/server/www/teleport/webroot/app/controller/user.py @@ -144,7 +144,12 @@ class DoVerifyUserHandler(TPBaseJsonHandler): except: return self.write_json(TPE_PARAM) - err, user_info = user.login(self, username, password=password) + try: + check_bind_oath = args['check_bind_oath'] + except: + check_bind_oath = False + + err, user_info = user.login(self, username, password=password, check_bind_oath=check_bind_oath) if err != TPE_OK: if err == TPE_NOT_EXISTS: err = TPE_USER_AUTH @@ -190,6 +195,28 @@ class DoBindOathHandler(TPBaseJsonHandler): return self.write_json(TPE_OK) +class DoUnBindOathHandler(TPBaseJsonHandler): + def post(self): + ret = self.check_privilege(TP_PRIVILEGE_USER_DELETE) + if ret != TPE_OK: + return + + args = self.get_argument('args', None) + if args is None: + return self.write_json(TPE_PARAM) + try: + args = json.loads(args) + except: + return self.write_json(TPE_JSON_FORMAT) + + try: + users = args['users'] + except: + return self.write_json(TPE_PARAM) + + # 把oath设置为空就是去掉oath验证 + err = user.update_oath_secret(self, users, '') + self.write_json(err) class OathSecretQrCodeHandler(TPBaseHandler): def get(self): @@ -752,6 +779,11 @@ class DoResetPasswordHandler(TPBaseJsonHandler): if mode == 4 and err == TPE_OK: user.remove_reset_token(token) + # 非用户自行修改密码的情况,都默认重置身份认证 + if mode != 5 and err == TPE_OK: + print("reset oath secret") + user.update_oath_secret(self, user_id, '') + self.write_json(err) else: diff --git a/server/www/teleport/webroot/app/model/user.py b/server/www/teleport/webroot/app/model/user.py old mode 100644 new mode 100755 index 0124d63..24d9d9e --- a/server/www/teleport/webroot/app/model/user.py +++ b/server/www/teleport/webroot/app/model/user.py @@ -49,7 +49,7 @@ def get_by_username(username): return TPE_OK, s.recorder[0] -def login(handler, username, password=None, oath_code=None): +def login(handler, username, password=None, oath_code=None, check_bind_oath=False): sys_cfg = tp_cfg().sys err, user_info = get_by_username(username) @@ -62,6 +62,10 @@ def login(handler, username, password=None, oath_code=None): # 尚未为此用户设置角色 return TPE_PRIVILEGE, None + if check_bind_oath == True and len(user_info['oath_secret']) != 0: + return TPE_OATH_ALREADY_BIND, None + + if user_info['state'] == TP_STATE_LOCKED: # 用户已经被锁定,如果系统配置为一定时间后自动解锁,则更新一下用户信息 if sys_cfg.login.lock_timeout != 0: