From 0d7235468086d6d3ddaf0efe8a96aee1dc08d1df Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Fri, 22 Dec 2017 00:12:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=88=96=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=97=B6=EF=BC=8C=E5=A6=82=E6=9E=9C=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E9=85=8D=E7=BD=AE=E4=BA=86SMTP=EF=BC=8C=E4=B8=94?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=9C=89=E8=AE=BE=E7=BD=AEemail=EF=BC=8C?= =?UTF-8?q?=E5=88=99=E8=87=AA=E5=8A=A8=E5=8F=91=E9=80=81=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E5=87=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../www/teleport/static/js/user/user-list.js | 16 +- .../teleport/webroot/app/base/core_server.py | 1 - server/www/teleport/webroot/app/base/utils.py | 30 +++- .../teleport/webroot/app/controller/user.py | 162 ++++++++---------- server/www/teleport/webroot/app/model/user.py | 33 ++-- 5 files changed, 130 insertions(+), 112 deletions(-) diff --git a/server/www/teleport/static/js/user/user-list.js b/server/www/teleport/static/js/user/user-list.js index 09e2aab..8951c9e 100644 --- a/server/www/teleport/static/js/user/user-list.js +++ b/server/www/teleport/static/js/user/user-list.js @@ -440,14 +440,11 @@ $app.on_btn_do_upload_click = function () { .html(' 正在导入,请稍候...') .show(); - - console.log('xxx'); - var param = {}; $.ajaxFileUpload({ url: "/user/upload-import",// 需要链接到服务器地址 fileElementId: "file-selector", // 文件选择框的id属性 - timeout: 60000, + timeout: 120000, secureuri: false, dataType: 'text', data: param, @@ -888,7 +885,7 @@ $app.create_dlg_edit_user = function () { if (dlg.dom.btn_auth_username_password_oath.hasClass('tp-selected')) dlg.field_auth_type |= TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH; - if(dlg.field_auth_type === 0) { + if (dlg.field_auth_type === 0) { $tp.notify_error('请设置用户登录时身份验证方式!'); return false; } @@ -902,6 +899,7 @@ $app.create_dlg_edit_user = function () { return; var action = (dlg.field_id === -1) ? '创建' : '更新'; + var timeout = (dlg.field_id === -1) ? 60000 : 3000; // 如果id为-1表示创建,否则表示更新 $tp.ajax_post_json('/user/update-user', { @@ -918,7 +916,10 @@ $app.create_dlg_edit_user = function () { }, function (ret) { if (ret.code === TPE_OK) { - $tp.notify_success('用户账号' + action + '成功!'); + if (ret.message.length > 0) + $tp.notify_success(ret.message); + else + $tp.notify_success('用户账号' + action + '成功!'); $app.table_users.load_data(); dlg.dom.dialog.modal('hide'); } else { @@ -927,7 +928,8 @@ $app.create_dlg_edit_user = function () { }, function () { $tp.notify_error('网络故障,用户账号' + action + '失败!'); - } + }, + timeout ); }; diff --git a/server/www/teleport/webroot/app/base/core_server.py b/server/www/teleport/webroot/app/base/core_server.py index 567d9df..c8e9540 100644 --- a/server/www/teleport/webroot/app/base/core_server.py +++ b/server/www/teleport/webroot/app/base/core_server.py @@ -38,7 +38,6 @@ def core_service_async_post_http(post_data): @tornado.gen.coroutine def core_service_async_enc(data): - # url = 'http://{}:{}/rpc'.format(ts_server_rpc_ip, ts_server_rpc_port) req = {'method': 'enc', 'param': {'p': data}} _yr = core_service_async_post_http(req) diff --git a/server/www/teleport/webroot/app/base/utils.py b/server/www/teleport/webroot/app/base/utils.py index 5d7f50f..8f4eeb4 100644 --- a/server/www/teleport/webroot/app/base/utils.py +++ b/server/www/teleport/webroot/app/base/utils.py @@ -6,6 +6,7 @@ import time import datetime import hashlib import threading +import random __all__ = ['AttrDict', 'tp_make_dir'] @@ -170,7 +171,7 @@ def tp_timestamp_utc_now(): def tp_utc_timestamp_ms(): - return int(datetime.datetime.utcnow().timestamp()*1000) + return int(datetime.datetime.utcnow().timestamp() * 1000) def tp_bytes2string(b, encode='utf8'): @@ -199,6 +200,33 @@ def tp_md5file(file_name): return m.hexdigest() +def tp_gen_password(length=8): + random.seed() + + # 生成一个随机密码 + _chars = ['ABCDEFGHJKMNPQRSTWXYZ', 'abcdefhijkmnprstwxyz', '2345678'] # 默认去掉了容易混淆的字符oO,Ll,9gq,Vv,Uu,I1 + + have_CHAR = False + have_char = False + have_num = False + while True: + ret = [] + for i in range(length): + idx = random.randint(0, len(_chars) - 1) + if idx == 0: + have_CHAR = True + elif idx == 1: + have_char = True + else: + have_num = True + ret.append(random.choice(_chars[idx])) + + if have_CHAR and have_char and have_num: + break + + return ''.join(ret) + + def tp_check_strong_password(p): s = 0 if len(p) < 8: diff --git a/server/www/teleport/webroot/app/controller/user.py b/server/www/teleport/webroot/app/controller/user.py index 445eaf1..2bb1eac 100644 --- a/server/www/teleport/webroot/app/controller/user.py +++ b/server/www/teleport/webroot/app/controller/user.py @@ -11,14 +11,14 @@ from app.base.configs import tp_cfg from app.base.controller import TPBaseHandler, TPBaseJsonHandler from app.base.logger import * from app.base.session import tp_session -from app.base.utils import tp_check_strong_password -from app.base.utils import tp_timestamp_utc_now +from app.base.utils import tp_check_strong_password, tp_gen_password +# from app.base.utils import tp_timestamp_utc_now from app.logic.auth.oath import tp_oath_verify_code from app.const import * from app.logic.auth.oath import tp_oath_generate_secret, tp_oath_generate_qrcode from app.logic.auth.password import tp_password_generate_secret, tp_password_verify from app.model import group -from app.model import syslog +# from app.model import syslog from app.model import user @@ -401,6 +401,8 @@ class DoImportHandler(TPBaseHandler): u['wechat'] = csv_recorder[self.IDX_WECHAT].strip() u['desc'] = csv_recorder[self.IDX_DESC].strip() + u['password'] = tp_gen_password(8) + # fix if len(u['surname']) == 0: u['surname'] = _username @@ -455,15 +457,47 @@ class DoImportHandler(TPBaseHandler): group.make_group_map(TP_GROUP_USER, gm) + # 对于创建成功的用户,发送密码邮件函 + sys_smtp_password = tp_cfg().sys_smtp_password + if len(sys_smtp_password) > 0: + web_url = '{}://{}'.format(self.request.protocol, self.request.host) + for u in user_list: + if u['_id'] == 0 or len(u['email']) == 0: + continue + err, msg = yield mail.tp_send_mail( + u['email'], + '{surname} 您好!\n\n已为您创建teleport系统用户账号,现在可以使用以下信息登录teleport系统:\n\n' + '登录用户名:{username}\n' + '密码:{password}\n' + '地址:{web_url}\n\n\n\n' + '[本邮件由teleport系统自动发出,请勿回复]' + '\n\n' + ''.format(surname=u['surname'], username=u['username'], password=u['password'], web_url=web_url), + subject='用户密码函' + ) + if err != TPE_OK: + failed.append({'line': u['_line'], 'error': '无法发送密码函到邮箱 {},错误:{}。'.format(u['email'], msg)}) + + # 统计结果 + total_success = 0 + total_failed = 0 + for u in user_list: + if u['_id'] == 0: + total_failed += 1 + else: + total_success += 1 + + # 生成最终结果信息 if len(failed) == 0: ret['code'] = TPE_OK - ret['message'] = '所有 {} 个用户账号均已导入!'.format(len(success)) + ret['message'] = '共导入 {} 个用户账号!'.format(total_success) return self.write(json.dumps(ret).encode('utf8')) else: ret['code'] = TPE_FAILED - if len(success) > 0: - ret['message'] = '{} 个用户账号导入成功,'.format(len(success)) - ret['message'] += '{} 个用户账号未能导入!'.format(len(failed)) + if total_success > 0: + ret['message'] = '{} 个用户账号导入成功,'.format(total_success) + if total_failed > 0: + ret['message'] += '{} 个用户账号未能导入!'.format(total_failed) ret['data'] = failed return self.write(json.dumps(ret).encode('utf8')) @@ -474,8 +508,8 @@ class DoImportHandler(TPBaseHandler): ret['message'] += '{} 个用户账号导入后发生异常!'.format(len(success)) else: ret['message'] = '发生异常!' - if len(failed) > 0: - ret['data'] = failed + + ret['data'] = failed return self.write(json.dumps(ret).encode('utf8')) finally: @@ -484,6 +518,7 @@ class DoImportHandler(TPBaseHandler): class DoUpdateUserHandler(TPBaseJsonHandler): + @tornado.gen.coroutine def post(self): ret = self.check_privilege(TP_PRIVILEGE_USER_CREATE) if ret != TPE_OK: @@ -511,15 +546,37 @@ class DoUpdateUserHandler(TPBaseJsonHandler): except: return self.write_json(TPE_PARAM) - if len(args['username']) == 0: # or len(args['email']) == 0: + if len(args['username']) == 0: return self.write_json(TPE_PARAM) if args['id'] == -1: - err, info = user.create_user(self, args) + args['password'] = tp_gen_password(8) + err, _ = user.create_user(self, args) + if err == TPE_OK: + # 对于创建成功的用户,发送密码邮件函 + sys_smtp_password = tp_cfg().sys_smtp_password + if len(sys_smtp_password) > 0: + web_url = '{}://{}'.format(self.request.protocol, self.request.host) + err, msg = yield mail.tp_send_mail( + args['email'], + '{surname} 您好!\n\n已为您创建teleport系统用户账号,现在可以使用以下信息登录teleport系统:\n\n' + '登录用户名:{username}\n' + '密码:{password}\n' + '地址:{web_url}\n\n\n\n' + '[本邮件由teleport系统自动发出,请勿回复]' + '\n\n' + ''.format(surname=args['surname'], username=args['username'], password=args['password'], web_url=web_url), + subject='用户密码函' + ) + if err != TPE_OK: + return self.write_json(TPE_OK, '用户账号创建成功,但发送密码函失败:{}'.format(msg)) + else: + return self.write_json(TPE_OK) + else: + return self.write_json(err) else: err = user.update_user(self, args) - info = {} - self.write_json(err, data=info) + self.write_json(err) class DoSetRoleForUsersHandler(TPBaseJsonHandler): @@ -945,85 +1002,6 @@ class DoGetGroupWithMemberHandler(TPBaseJsonHandler): self.write_json(err, data=ret) -# class DoAddGroupMemberHandler(TPBaseJsonHandler): -# def post(self): -# ret = self.check_privilege(TP_PRIVILEGE_USER_GROUP) -# 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: -# gid = args['group_id'] -# members = args['members'] -# except: -# return self.write_json(TPE_PARAM) -# -# err = user.add_group_members(gid, members) -# self.write_json(err) - - -# class DoRemoveGroupMemberHandler(TPBaseJsonHandler): -# def post(self): -# ret = self.check_privilege(TP_PRIVILEGE_USER_GROUP) -# 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: -# gid = args['group_id'] -# members = args['members'] -# except: -# return self.write_json(TPE_PARAM) -# -# err = user.remove_group_members(gid, members) -# self.write_json(err) - - -# class DoUpdateGroupHandler(TPBaseJsonHandler): -# def post(self): -# ret = self.check_privilege(TP_PRIVILEGE_USER_GROUP) -# 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: -# args['id'] = int(args['id']) -# args['name'] = args['name'].strip() -# args['desc'] = args['desc'].strip() -# except: -# return self.write_json(TPE_PARAM) -# -# if len(args['name']) == 0: -# return self.write_json(TPE_PARAM) -# -# if args['id'] == -1: -# err, _ = user.create_group(self, args) -# else: -# err = user.update_group(self, args) -# self.write_json(err) - - class DoGetRoleListHandler(TPBaseJsonHandler): def post(self): err, role_list = user.get_role_list() diff --git a/server/www/teleport/webroot/app/model/user.py b/server/www/teleport/webroot/app/model/user.py index c86d718..2853823 100644 --- a/server/www/teleport/webroot/app/model/user.py +++ b/server/www/teleport/webroot/app/model/user.py @@ -9,7 +9,7 @@ from app.base.utils import tp_timestamp_utc_now, tp_generate_random from app.const import * from app.model import syslog from app.base.stats import tp_stats -from app.logic.auth.password import tp_password_verify +from app.logic.auth.password import tp_password_verify, tp_password_generate_secret from app.logic.auth.oath import tp_oath_verify_code @@ -191,10 +191,12 @@ def create_users(handler, user_list, success, failed): failed.append({'line': user['_line'], 'error': '账号 `{}` 已经存在'.format(user['username'])}) continue - sql = 'INSERT INTO `{}user` (`type`, `auth_type`, `username`, `surname`, `role_id`, `state`, `email`, `creator_id`, `create_time`, `last_login`, `last_chpass`, `desc`) VALUES ' \ - '(1, 0, "{username}", "{surname}", 0, {state}, "{email}", {creator_id}, {create_time}, {last_login}, {last_chpass}, "{desc}");' \ + _password = tp_password_generate_secret(user['password']) + + sql = 'INSERT INTO `{}user` (`type`, `auth_type`, `password`, `username`, `surname`, `role_id`, `state`, `email`, `creator_id`, `create_time`, `last_login`, `last_chpass`, `desc`) VALUES ' \ + '(1, 0, "{password}", "{username}", "{surname}", 0, {state}, "{email}", {creator_id}, {create_time}, {last_login}, {last_chpass}, "{desc}");' \ ''.format(db.table_prefix, - username=user['username'], surname=user['surname'], state=TP_STATE_NORMAL, email=user['email'], + username=user['username'], surname=user['surname'], password=_password, state=TP_STATE_NORMAL, email=user['email'], creator_id=operator['id'], create_time=_time_now, last_login=0, last_chpass=0, desc=user['desc']) db_ret = db.exec(sql) if not db_ret: @@ -206,7 +208,7 @@ def create_users(handler, user_list, success, failed): user['_id'] = db.last_insert_id() if len(name_list) > 0: - syslog.sys_log(operator, handler.request.remote_ip, TPE_OK, "创建用户:{}".format(','.join(name_list))) + syslog.sys_log(operator, handler.request.remote_ip, TPE_OK, "批量导入方式创建用户:{}".format(','.join(name_list))) tp_stats().user_counter_change(len(name_list)) @@ -230,10 +232,11 @@ def create_user(handler, args): # db_ret = db.query(sql) # if db_ret is not None and len(db_ret) > 0: # return TPE_EXISTS, 0 + _password = tp_password_generate_secret(args['password']) - sql = 'INSERT INTO `{}user` (`type`, `auth_type`, `username`, `surname`, `role_id`, `state`, `email`, `creator_id`, `create_time`, `last_login`, `last_chpass`, `desc`) VALUES ' \ - '(1, {auth_type}, "{username}", "{surname}", {role}, {state}, "{email}", {creator_id}, {create_time}, {last_login}, {last_chpass}, "{desc}");' \ - ''.format(db.table_prefix, auth_type=args['auth_type'], + sql = 'INSERT INTO `{}user` (`type`, `auth_type`, `password`, `username`, `surname`, `role_id`, `state`, `email`, `creator_id`, `create_time`, `last_login`, `last_chpass`, `desc`) VALUES ' \ + '(1, {auth_type}, "{password}", "{username}", "{surname}", {role}, {state}, "{email}", {creator_id}, {create_time}, {last_login}, {last_chpass}, "{desc}");' \ + ''.format(db.table_prefix, auth_type=args['auth_type'], password=_password, username=args['username'], surname=args['surname'], role=args['role'], state=TP_STATE_NORMAL, email=args['email'], creator_id=operator['id'], create_time=_time_now, last_login=0, last_chpass=0, desc=args['desc']) @@ -256,14 +259,22 @@ def update_user(handler, args): db = get_db() # 1. 判断此账号是否已经存在 - sql = 'SELECT id FROM {}user WHERE id="{}";'.format(db.table_prefix, args['id']) + sql = 'SELECT `username` FROM {}user WHERE id={};'.format(db.table_prefix, args['id']) db_ret = db.query(sql) if db_ret is None or len(db_ret) == 0: return TPE_NOT_EXISTS - sql = 'UPDATE `{}user` SET `surname`="{surname}", `auth_type`={auth_type}, `role_id`={role}, `email`="{email}", `mobile`="{mobile}", `qq`="{qq}", `wechat`="{wechat}", `desc`="{desc}" WHERE `id`={user_id};' \ + old_username = db_ret[0][0] + if old_username == args['username']: + # 如果要更新用户登录名,则需要判断是否已经存在了 + sql = 'SELECT `id` FROM {}user WHERE username="{}";'.format(db.table_prefix, args['username']) + db_ret = db.query(sql) + if db_ret is not None and len(db_ret) > 0: + return TPE_EXISTS + + sql = 'UPDATE `{}user` SET `username`="{username}", `surname`="{surname}", `auth_type`={auth_type}, `role_id`={role}, `email`="{email}", `mobile`="{mobile}", `qq`="{qq}", `wechat`="{wechat}", `desc`="{desc}" WHERE `id`={user_id};' \ ''.format(db.table_prefix, - surname=args['surname'], auth_type=args['auth_type'], role=args['role'], email=args['email'], + username=args['username'], surname=args['surname'], auth_type=args['auth_type'], role=args['role'], email=args['email'], mobile=args['mobile'], qq=args['qq'], wechat=args['wechat'], desc=args['desc'], user_id=args['id'] )