Merge branch 'feature/search' of github.com:eomsoft/teleport into feature/search
						commit
						f0715736a2
					
				| 
						 | 
				
			
			@ -28,8 +28,10 @@
 | 
			
		|||
    <file url="file://$PROJECT_DIR$/tp_core/core/ts_session.h" charset="GBK" />
 | 
			
		||||
    <file url="file://$PROJECT_DIR$/tp_core/core/ts_web_rpc.cpp" charset="GBK" />
 | 
			
		||||
    <file url="file://$PROJECT_DIR$/tp_core/core/ts_web_rpc.h" charset="GBK" />
 | 
			
		||||
    <file url="file://$PROJECT_DIR$/tp_core/protocol/rdp/rdp_conn.cpp" charset="GBK" />
 | 
			
		||||
    <file url="file://$PROJECT_DIR$/tp_core/protocol/rdp/rdp_conn.h" charset="GBK" />
 | 
			
		||||
    <file url="file://$PROJECT_DIR$/tp_core/protocol/rdp/rdp_package.cpp" charset="GBK" />
 | 
			
		||||
    <file url="file://$PROJECT_DIR$/tp_core/protocol/rdp/rdp_package.h" charset="GBK" />
 | 
			
		||||
    <file url="file://$PROJECT_DIR$/tp_core/protocol/rdp/rdp_proxy.cpp" charset="GBK" />
 | 
			
		||||
    <file url="file://$PROJECT_DIR$/tp_core/protocol/rdp/rdp_session.cpp" charset="GBK" />
 | 
			
		||||
    <file url="file://$PROJECT_DIR$/tp_core/protocol/ssh/ssh_proxy.cpp" charset="GBK" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,9 @@
 | 
			
		|||
$app.on_init = function (cb_stack) {
 | 
			
		||||
    $app.dom = {
 | 
			
		||||
        // assist_ver: $('#tp-assist-ver'),
 | 
			
		||||
        btn_sel_group: $('#btn-sel-group button'),
 | 
			
		||||
        group_list_for_sel: $('#btn-sel-group ul'),
 | 
			
		||||
 | 
			
		||||
        btn_refresh_host: $('#btn-refresh-host'),
 | 
			
		||||
        btn_add_host: $('#btn-add-host'),
 | 
			
		||||
        chkbox_host_select_all: $('#table-host-select-all'),
 | 
			
		||||
| 
						 | 
				
			
			@ -19,6 +22,27 @@ $app.on_init = function (cb_stack) {
 | 
			
		|||
        upload_file_message: $('#upload-file-message')
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    console.log($app.options.host_groups);
 | 
			
		||||
    // var i = 0;
 | 
			
		||||
    // var html = [];
 | 
			
		||||
    // html.push('<optioin value="0">所有分组</optioin>');
 | 
			
		||||
    // html.push('<optioin value="-1">----------</optioin>');
 | 
			
		||||
    // for(i = 0; i < $app.options.host_groups.length; ++i) {
 | 
			
		||||
    //     html.push('<optioin value="'+$app.options.host_groups[i].id+'">'+$app.options.host_groups[i].name+'</optioin>');
 | 
			
		||||
    // }
 | 
			
		||||
    // $app.dom.sel_host_group.ap
 | 
			
		||||
 | 
			
		||||
    var html = [];
 | 
			
		||||
    $.each($app.options.host_groups, function (i, item) {
 | 
			
		||||
        html.push('<li><a href="javascript:;" data-tp-selector="' + item.id + '" data-name="' + item.name + '"><i class="fa fa-caret-right fa-fw"></i> ' + item.name + '</a></li>');
 | 
			
		||||
    });
 | 
			
		||||
    $app.dom.group_list_for_sel.append($(html.join('')));
 | 
			
		||||
    $app.dom.group_list_for_sel.find('a[data-tp-selector]').click(function () {
 | 
			
		||||
        var obj = $(this);
 | 
			
		||||
        //$app.set_selected_to_role(parseInt(obj.attr('data-tp-selector')), obj.attr('data-name'));
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // $tp.assist_checked = function () {
 | 
			
		||||
    //     console.log("---------");
 | 
			
		||||
    //     if ($tp.assist.running) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1537,9 +1561,9 @@ $app.create_dlg_edit_account = function () {
 | 
			
		|||
            dlg.dom.block_sshkey.hide();
 | 
			
		||||
            if (dlg.field_protocol === TP_PROTOCOL_TYPE_TELNET) {
 | 
			
		||||
                dlg.dom.block_prompt.show();
 | 
			
		||||
                if(dlg.dom.prompt_username.val().length === 0 && dlg.account.username_prompt.length === 0)
 | 
			
		||||
                if (dlg.dom.prompt_username.val().length === 0 && dlg.account.username_prompt.length === 0)
 | 
			
		||||
                    dlg.dom.prompt_username.val('ogin:');
 | 
			
		||||
                if(dlg.dom.prompt_password.val().length === 0 && dlg.account.password_prompt.length === 0)
 | 
			
		||||
                if (dlg.dom.prompt_password.val().length === 0 && dlg.account.password_prompt.length === 0)
 | 
			
		||||
                    dlg.dom.prompt_password.val('assword:');
 | 
			
		||||
            }
 | 
			
		||||
        } else if (dlg.field_auth === TP_AUTH_TYPE_PRIVATE_KEY) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,11 +6,16 @@
 | 
			
		|||
<%inherit file="../page_base.mako"/>
 | 
			
		||||
 | 
			
		||||
<%block name="extend_js_file">
 | 
			
		||||
##     <script type="text/javascript" src="${ static_url('js/tp-assist.js') }"></script>
 | 
			
		||||
    <script type="text/javascript" src="${ static_url('js/asset/host-list.js') }"></script>
 | 
			
		||||
    <script type="text/javascript" src="${ static_url('plugins/jquery/ajaxfileupload.js') }"></script>
 | 
			
		||||
</%block>
 | 
			
		||||
 | 
			
		||||
<%block name="embed_js">
 | 
			
		||||
    <script type="text/javascript">
 | 
			
		||||
        $app.add_options(${page_param});
 | 
			
		||||
    </script>
 | 
			
		||||
</%block>
 | 
			
		||||
 | 
			
		||||
<%block name="embed_css">
 | 
			
		||||
    <style>
 | 
			
		||||
    </style>
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +23,7 @@
 | 
			
		|||
 | 
			
		||||
<%block name="breadcrumb_extra">
 | 
			
		||||
    <ol class="breadcrumb breadcrumb-list">
 | 
			
		||||
##         <li><i class="fa fa-clock-o"></i> 服务器时间:<span id="tp-timer">-</span></li>
 | 
			
		||||
        ##         <li><i class="fa fa-clock-o"></i> 服务器时间:<span id="tp-timer">-</span></li>
 | 
			
		||||
##         <li><i class="fa fa-bolt"></i> 助手版本:<span id="tp-assist-ver"></span></li>
 | 
			
		||||
    </ol>
 | 
			
		||||
</%block>
 | 
			
		||||
| 
						 | 
				
			
			@ -29,9 +34,20 @@
 | 
			
		|||
 | 
			
		||||
    <!-- begin box -->
 | 
			
		||||
    <div class="box">
 | 
			
		||||
 | 
			
		||||
        <p>filter goes here...</p>
 | 
			
		||||
        <div class="btn-group dropdown" id="btn-sel-group">
 | 
			
		||||
            <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"><i class="fa fa-edit fa-fw"></i> 所有分组 <i class="fa fa-caret-right"></i></button>
 | 
			
		||||
            <ul class="dropdown-menu  dropdown-menu-sm"></ul>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <hr/>
 | 
			
		||||
 | 
			
		||||
        <div class="table-prefix-area">
 | 
			
		||||
            <div class="table-extend-cell">
 | 
			
		||||
                <span class="table-name"><i class="fa fa-list fa-fw"></i> 主机列表</span>
 | 
			
		||||
 | 
			
		||||
                <button id="btn-refresh-host" class="btn btn-sm btn-default"><i class="fa fa-redo fa-fw"></i> 刷新列表</button>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="table-extend-cell table-extend-cell-right group-actions">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,7 +71,7 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
            <div class="table-extend-cell group-actions">
 | 
			
		||||
                <div class="btn-group" role="group">
 | 
			
		||||
                <div class="btn-group">
 | 
			
		||||
                    <div class="btn-group dropup" id="btn-set-role" role="group">
 | 
			
		||||
                        <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"><i class="fa fa-edit fa-fw"></i> 设置角色 <i class="fa fa-caret-right"></i></button>
 | 
			
		||||
                        <ul class="dropdown-menu  dropdown-menu-sm"></ul>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,13 @@ class HostListHandler(TPBaseHandler):
 | 
			
		|||
        ret = self.check_privilege(TP_PRIVILEGE_ASSET_CREATE | TP_PRIVILEGE_ASSET_DELETE | TP_PRIVILEGE_ASSET_GROUP)
 | 
			
		||||
        if ret != TPE_OK:
 | 
			
		||||
            return
 | 
			
		||||
        self.render('asset/host-list.mako')
 | 
			
		||||
 | 
			
		||||
        err, groups = group.get_host_groups_for_user(self.current_user['id'], self.current_user['privilege'])
 | 
			
		||||
        param = {
 | 
			
		||||
            'host_groups': groups
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        self.render('asset/host-list.mako', page_param=json.dumps(param))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DoGetHostsHandler(TPBaseJsonHandler):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -711,10 +711,8 @@ class DoResetPasswordHandler(TPBaseJsonHandler):
 | 
			
		|||
        if mode == 1 or mode == 3:
 | 
			
		||||
            err, email, token = user.generate_reset_password_token(self, user_id)
 | 
			
		||||
 | 
			
		||||
            # 生成一个密码重置链接,24小时有效
 | 
			
		||||
            # token = tp_generate_random(16)
 | 
			
		||||
            # generate an URL for reset password, valid in 24hr.
 | 
			
		||||
            reset_url = '{}://{}/user/reset-password?token={}'.format(self.request.protocol, self.request.host, token)
 | 
			
		||||
            # reset_url = 'http://127.0.0.1/user/validate-password-reset-token?token=G66LXH0EOJ47OXTH7O5KBQ0PHXRSBXBVVFALI6JBJ8HNWUALWI35QECPJ8UV8DEQ'
 | 
			
		||||
 | 
			
		||||
            err, msg = yield mail.tp_send_mail(
 | 
			
		||||
                email,
 | 
			
		||||
| 
						 | 
				
			
			@ -793,159 +791,6 @@ class DoUpdateUsersHandler(TPBaseJsonHandler):
 | 
			
		|||
        self.write_json(err)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# class DoRemoveGroupHandler(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:
 | 
			
		||||
#             group_list = args['group_list']
 | 
			
		||||
#         except:
 | 
			
		||||
#             return self.write_json(TPE_PARAM)
 | 
			
		||||
#
 | 
			
		||||
#         err = user.remove_group(self, group_list)
 | 
			
		||||
#         self.write_json(err)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# class AuthHandler(TPBaseAdminAuthHandler):
 | 
			
		||||
#     def get(self, user_name):
 | 
			
		||||
#         group_list = host.get_group_list()
 | 
			
		||||
#         cert_list = host.get_cert_list()
 | 
			
		||||
#         self.render('user/auth.mako',
 | 
			
		||||
#                     group_list=group_list,
 | 
			
		||||
#                     cert_list=cert_list, user_name=user_name)
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# class GetListHandler(TPBaseAdminAuthJsonHandler):
 | 
			
		||||
#     def post(self):
 | 
			
		||||
#         user_list = user.get_user_list(with_admin=False)
 | 
			
		||||
#         ret = dict()
 | 
			
		||||
#         ret['page_index'] = 10
 | 
			
		||||
#         ret['total'] = len(user_list)
 | 
			
		||||
#         ret['data'] = user_list
 | 
			
		||||
#         self.write_json(0, data=ret)
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# class DeleteUser(TPBaseUserAuthJsonHandler):
 | 
			
		||||
#     def post(self):
 | 
			
		||||
#         args = self.get_argument('args', None)
 | 
			
		||||
#         if args is not None:
 | 
			
		||||
#             args = json.loads(args)
 | 
			
		||||
#         else:
 | 
			
		||||
#             return self.write_json(-1, 'invalid param')
 | 
			
		||||
#
 | 
			
		||||
#         user_id = args['user_id']
 | 
			
		||||
#         try:
 | 
			
		||||
#             ret = user.delete_user(user_id)
 | 
			
		||||
#             if ret:
 | 
			
		||||
#                 return self.write_json(0)
 | 
			
		||||
#             else:
 | 
			
		||||
#                 return self.write_json(-2, 'database op failed.')
 | 
			
		||||
#         except:
 | 
			
		||||
#             log.e('delete user failed.\n')
 | 
			
		||||
#             return self.write_json(-3, 'got exception.')
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# class ModifyUser(TPBaseUserAuthJsonHandler):
 | 
			
		||||
#     def post(self):
 | 
			
		||||
#         args = self.get_argument('args', None)
 | 
			
		||||
#         if args is not None:
 | 
			
		||||
#             args = json.loads(args)
 | 
			
		||||
#         else:
 | 
			
		||||
#             return self.write_json(-1, 'invalid param.')
 | 
			
		||||
#
 | 
			
		||||
#         user_id = args['user_id']
 | 
			
		||||
#         user_desc = args['user_desc']
 | 
			
		||||
#
 | 
			
		||||
#         try:
 | 
			
		||||
#             ret = user.modify_user(user_id, user_desc)
 | 
			
		||||
#             if ret:
 | 
			
		||||
#                 self.write_json(0)
 | 
			
		||||
#             else:
 | 
			
		||||
#                 self.write_json(-2, 'database op failed.')
 | 
			
		||||
#             return
 | 
			
		||||
#         except:
 | 
			
		||||
#             log.e('modify user failed.\n')
 | 
			
		||||
#             self.write_json(-3, 'got exception.')
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# class AddUser(TPBaseUserAuthJsonHandler):
 | 
			
		||||
#     def post(self):
 | 
			
		||||
#         args = self.get_argument('args', None)
 | 
			
		||||
#         if args is not None:
 | 
			
		||||
#             args = json.loads(args)
 | 
			
		||||
#         else:
 | 
			
		||||
#             return self.write_json(-1, 'invalid param.')
 | 
			
		||||
#
 | 
			
		||||
#         user_name = args['user_name']
 | 
			
		||||
#         user_pwd = '123456'
 | 
			
		||||
#         user_desc = args['user_desc']
 | 
			
		||||
#         if user_desc is None:
 | 
			
		||||
#             user_desc = ''
 | 
			
		||||
#         try:
 | 
			
		||||
#             ret = user.add_user(user_name, user_pwd, user_desc)
 | 
			
		||||
#             if 0 == ret:
 | 
			
		||||
#                 return self.write_json(0)
 | 
			
		||||
#             else:
 | 
			
		||||
#                 return self.write_json(ret, 'database op failed. errcode={}'.format(ret))
 | 
			
		||||
#         except:
 | 
			
		||||
#             log.e('add user failed.\n')
 | 
			
		||||
#             return self.write_json(-3, 'got exception.')
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# class LockUser(TPBaseUserAuthJsonHandler):
 | 
			
		||||
#     def post(self):
 | 
			
		||||
#         args = self.get_argument('args', None)
 | 
			
		||||
#         if args is not None:
 | 
			
		||||
#             args = json.loads(args)
 | 
			
		||||
#         else:
 | 
			
		||||
#             return self.write_json(-1, 'invalid param.')
 | 
			
		||||
#
 | 
			
		||||
#         user_id = args['user_id']
 | 
			
		||||
#         lock_status = args['lock_status']
 | 
			
		||||
#
 | 
			
		||||
#         try:
 | 
			
		||||
#             ret = user.lock_user(user_id, lock_status)
 | 
			
		||||
#             if ret:
 | 
			
		||||
#                 return self.write_json(0)
 | 
			
		||||
#             else:
 | 
			
		||||
#                 return self.write_json(-2, 'database op failed.')
 | 
			
		||||
#         except:
 | 
			
		||||
#             log.e('lock user failed.\m')
 | 
			
		||||
#             return self.write_json(-3, 'got exception.')
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# class ResetUser(TPBaseUserAuthJsonHandler):
 | 
			
		||||
#     def post(self):
 | 
			
		||||
#         args = self.get_argument('args', None)
 | 
			
		||||
#         if args is not None:
 | 
			
		||||
#             args = json.loads(args)
 | 
			
		||||
#         else:
 | 
			
		||||
#             return self.write_json(-1, 'invalid param.')
 | 
			
		||||
#
 | 
			
		||||
#         user_id = args['user_id']
 | 
			
		||||
#         # lock_status = args['lock_status']
 | 
			
		||||
#
 | 
			
		||||
#         try:
 | 
			
		||||
#             ret = user.reset_user(user_id)
 | 
			
		||||
#             if ret:
 | 
			
		||||
#                 return self.write_json(0)
 | 
			
		||||
#             else:
 | 
			
		||||
#                 return self.write_json(-2, 'database op failed.')
 | 
			
		||||
#         except:
 | 
			
		||||
#             log.e('reset user failed.\n')
 | 
			
		||||
#             return self.write_json(-3, 'got exception.')
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
class DoGetGroupWithMemberHandler(TPBaseJsonHandler):
 | 
			
		||||
    def post(self):
 | 
			
		||||
        ret = self.check_privilege(TP_PRIVILEGE_USER_GROUP)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -361,9 +361,49 @@ def get_groups(sql_filter, sql_order, sql_limit, sql_restrict, sql_exclude):
 | 
			
		|||
    return err, s.total_count, s.page_index, s.recorder
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_host_groups_for_user(handler):
 | 
			
		||||
    # 获取当前用户能查看的主机分组列表
 | 
			
		||||
    pass
 | 
			
		||||
def get_host_groups_for_user(user_id, user_privilege):
 | 
			
		||||
    # get all host-groups for current logged in user.
 | 
			
		||||
 | 
			
		||||
    db = get_db()
 | 
			
		||||
 | 
			
		||||
    # step 0. return all host-groups if user have all host-group access privilege
 | 
			
		||||
    if (user_privilege & (TP_PRIVILEGE_ASSET_CREATE | TP_PRIVILEGE_ASSET_DELETE | TP_PRIVILEGE_ASSET_GROUP)) != 0:
 | 
			
		||||
        s = SQL(get_db())
 | 
			
		||||
        s.select_from('group', ['id', 'name'], alt_name='g')
 | 
			
		||||
        s.where('g.type={}'.format(TP_GROUP_HOST))
 | 
			
		||||
        s.order_by('g.name')
 | 
			
		||||
        err = s.query()
 | 
			
		||||
 | 
			
		||||
        return err, s.recorder
 | 
			
		||||
 | 
			
		||||
    # step 1. get all hosts which could be access by this user.
 | 
			
		||||
    sql = 'SELECT `h_id` FROM `{dbtp}ops_map` WHERE `u_id`={dbph} GROUP BY `h_id`;'.format(dbtp=db.table_prefix, dbph=db.place_holder)
 | 
			
		||||
    db_ret = db.query(sql, (user_id, ))
 | 
			
		||||
    if db_ret is None or len(db_ret) == 0:
 | 
			
		||||
        return TPE_NOT_EXISTS, None
 | 
			
		||||
 | 
			
		||||
    hosts = []
 | 
			
		||||
    for db_item in db_ret:
 | 
			
		||||
        hosts.append(str(db_item[0]))
 | 
			
		||||
 | 
			
		||||
    # step 2. get groups which include those hosts.
 | 
			
		||||
    sql = 'SELECT `gid` FROM `{dbtp}group_map` WHERE (`type`={dbph} AND `mid` IN ({dbph})) GROUP BY `gid`;'.format(dbtp=db.table_prefix, dbph=db.place_holder, hosts=','.join(hosts))
 | 
			
		||||
    db_ret = db.query(sql, (TP_GROUP_HOST, ','.join(hosts)))
 | 
			
		||||
    if db_ret is None or len(db_ret) == 0:
 | 
			
		||||
        return TPE_NOT_EXISTS, None
 | 
			
		||||
 | 
			
		||||
    groups = []
 | 
			
		||||
    for db_item in db_ret:
 | 
			
		||||
        groups.append(str(db_item[0]))
 | 
			
		||||
 | 
			
		||||
    # step 3. get those groups id and name.
 | 
			
		||||
    s = SQL(get_db())
 | 
			
		||||
    s.select_from('group', ['id', 'name'], alt_name='g')
 | 
			
		||||
    s.where('g.id IN ({})'.format(','.join(groups)))
 | 
			
		||||
    s.order_by('g.name')
 | 
			
		||||
    err = s.query()
 | 
			
		||||
 | 
			
		||||
    return err, s.recorder
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_acc_groups_for_user(handler):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue