diff --git a/apps/assets/models/cmd_filter.py b/apps/assets/models/cmd_filter.py index 38776ff38..91febd40b 100644 --- a/apps/assets/models/cmd_filter.py +++ b/apps/assets/models/cmd_filter.py @@ -7,6 +7,7 @@ from django.db import models from django.core.validators import MinValueValidator, MaxValueValidator from django.utils.translation import ugettext_lazy as _ +from common.utils import lazyproperty from orgs.mixins.models import OrgModelMixin @@ -57,25 +58,30 @@ class CommandFilterRule(OrgModelMixin): date_updated = models.DateTimeField(auto_now=True) created_by = models.CharField(max_length=128, blank=True, default='', verbose_name=_('Created by')) - __pattern = None - class Meta: ordering = ('-priority', 'action') verbose_name = _("Command filter rule") - @property + @lazyproperty def _pattern(self): - if self.__pattern: - return self.__pattern if self.type == 'command': regex = [] - for cmd in self.content.split('\r\n'): - cmd = cmd.replace(' ', '\s+') - regex.append(r'\b{0}\b'.format(cmd)) - self.__pattern = re.compile(r'{}'.format('|'.join(regex))) + content = self.content.replace('\r\n', '\n') + for cmd in content.split('\n'): + cmd = re.escape(cmd) + cmd = cmd.replace('\\ ', '\s+') + if cmd[-1].isalpha(): + regex.append(r'\b{0}\b'.format(cmd)) + else: + regex.append(r'\b{0}'.format(cmd)) + s = r'{}'.format('|'.join(regex)) else: - self.__pattern = re.compile(r'{0}'.format(self.content)) - return self.__pattern + s = r'{0}'.format(self.content) + try: + _pattern = re.compile(s) + except: + _pattern = '' + return _pattern def match(self, data): found = self._pattern.search(data) diff --git a/apps/ops/templates/ops/command_execution_create.html b/apps/ops/templates/ops/command_execution_create.html index 19936154f..e0e96f267 100644 --- a/apps/ops/templates/ops/command_execution_create.html +++ b/apps/ops/templates/ops/command_execution_create.html @@ -140,6 +140,7 @@ } function initTree() { + $('#assetTree').html("{% trans 'Loading' %}" + '..'); if (systemUserId) { url = treeUrl + '&system_user=' + systemUserId } else { @@ -365,4 +366,4 @@ execute() }) -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/apps/settings/api.py b/apps/settings/api.py index 9df77d036..d327bde17 100644 --- a/apps/settings/api.py +++ b/apps/settings/api.py @@ -101,9 +101,11 @@ class LDAPUserListApi(generics.ListAPIView): def get_queryset(self): if hasattr(self, 'swagger_fake_view'): return [] - util = LDAPUtil() + q = self.request.query_params.get('search') try: - users = util.search_user_items() + util = LDAPUtil() + extra_filter = util.construct_extra_filter(util.SEARCH_FIELD_ALL, q) + users = util.search_user_items(extra_filter) except Exception as e: users = [] logger.error(e) @@ -112,20 +114,6 @@ class LDAPUserListApi(generics.ListAPIView): user['id'] = user['username'] return users - def filter_queryset(self, queryset): - search = self.request.query_params.get('search') - if not search: - return queryset - search = search.lower() - queryset = [ - q for q in queryset - if - search in q['username'].lower() - or search in q['name'].lower() - or search in q['email'].lower() - ] - return queryset - def sort_queryset(self, queryset): order_by = self.request.query_params.get('order') if not order_by: @@ -139,7 +127,7 @@ class LDAPUserListApi(generics.ListAPIView): return queryset def list(self, request, *args, **kwargs): - queryset = self.filter_queryset(self.get_queryset()) + queryset = self.get_queryset() queryset = self.sort_queryset(queryset) page = self.paginate_queryset(queryset) if page is not None: diff --git a/apps/settings/utils.py b/apps/settings/utils.py index 657aa4600..9ecd5d286 100644 --- a/apps/settings/utils.py +++ b/apps/settings/utils.py @@ -22,6 +22,9 @@ class LDAPOUGroupException(Exception): class LDAPUtil: _conn = None + SEARCH_FIELD_ALL = 'all' + SEARCH_FIELD_USERNAME = 'username' + def __init__(self, use_settings_config=True, server_uri=None, bind_dn=None, password=None, use_ssl=None, search_ougroup=None, search_filter=None, attr_map=None, auth_ldap=None): @@ -81,9 +84,13 @@ class LDAPUtil: user_item[attr] = value return user_item - def _search_user_items_ou(self, search_ou, cookie=None): + def _search_user_items_ou(self, search_ou, extra_filter=None, cookie=None): + search_filter = self.search_filter % {"user": "*"} + if extra_filter: + search_filter = '(&{}{})'.format(search_filter, extra_filter) + ok = self.connection.search( - search_ou, self.search_filter % ({"user": "*"}), + search_ou, search_filter, attributes=list(self.attr_map.values()), paged_size=self.paged_size, paged_cookie=cookie ) @@ -108,24 +115,43 @@ class LDAPUtil: cookie = self.connection.result['controls']['1.2.840.113556.1.4.319']['value']['cookie'] return cookie - def search_user_items(self): + def search_user_items(self, extra_filter=None): user_items = [] logger.info("Search user items") + for search_ou in str(self.search_ougroup).split("|"): logger.info("Search user search ou: {}".format(search_ou)) - _user_items = self._search_user_items_ou(search_ou) + _user_items = self._search_user_items_ou(search_ou, extra_filter=extra_filter) user_items.extend(_user_items) while self._cookie(): logger.info("Page Search user search ou: {}".format(search_ou)) - _user_items = self._search_user_items_ou(search_ou, self._cookie()) + _user_items = self._search_user_items_ou(search_ou, extra_filter, self._cookie()) user_items.extend(_user_items) logger.info("Search user items end") return user_items + def construct_extra_filter(self, field, q): + if not q: + return None + extra_filter = '' + if field == self.SEARCH_FIELD_ALL: + for attr in self.attr_map.values(): + extra_filter += '({}={})'.format(attr, q) + extra_filter = '(|{})'.format(extra_filter) + return extra_filter + + if field == self.SEARCH_FIELD_USERNAME and isinstance(q, list): + attr = self.attr_map.get('username') + for username in q: + extra_filter += '({}={})'.format(attr, username) + extra_filter = '(|{})'.format(extra_filter) + return extra_filter + def search_filter_user_items(self, username_list): - user_items = self.search_user_items() - if username_list: - user_items = [u for u in user_items if u['username'] in username_list] + extra_filter = self.construct_extra_filter( + self.SEARCH_FIELD_USERNAME, username_list + ) + user_items = self.search_user_items(extra_filter) return user_items @staticmethod diff --git a/apps/terminal/templates/terminal/command_list.html b/apps/terminal/templates/terminal/command_list.html index 3580af03f..1fc6f1d76 100644 --- a/apps/terminal/templates/terminal/command_list.html +++ b/apps/terminal/templates/terminal/command_list.html @@ -164,11 +164,14 @@ $(document).ready(function () { detailRows.push(tr.attr('id')); } } -}) +}); function format(d) { var output = $("
"); + + output.append('$ ', d.input); + output.append('\r\n\r\n'); output.append(d.output); return output } @@ -187,6 +190,17 @@ function initTable() { $(td).addClass("toggle"); $(td).html(""); }}, + {targets: 1, createdCell: function (td, cellData) { + var data = htmlEscape(cellData); + var interHtml = $(""); + if (data.length > 40) { + interHtml.attr('title', data); + data = data.slice(0, 40); + data += ' ...'; + } + interHtml.html(data); + $(td).html(interHtml); + }}, {targets: 5, createdCell: function (td, cellData) { var data = '{% trans "Goto" %}' .replace('{{ DEFAULT_PK }}', cellData); @@ -200,7 +214,7 @@ function initTable() { toggle: true, ajax_url: commandListUrl, columns: [ - {data: "id"}, {data: "input", orderable: false}, {data: "user", orderable: false}, + {data: "id"}, {data: "input", orderable: false, width: "40%"}, {data: "user", orderable: false}, {data: "asset", orderable: false}, {data: "system_user", orderable: false}, {data: "session", orderable: false}, {data: "timestamp", width: "160px", orderable: false}, ], diff --git a/apps/terminal/templates/terminal/session_detail.html b/apps/terminal/templates/terminal/session_detail.html index b54eedec7..1c96e3ee7 100644 --- a/apps/terminal/templates/terminal/session_detail.html +++ b/apps/terminal/templates/terminal/session_detail.html @@ -54,8 +54,12 @@ {% for command in object_list %}{{ command.output }}
+$ {{ command.input }} + +{{ command.output }} +