Unverified Commit 3bd3564b authored by BaiJiangJie's avatar BaiJiangJie Committed by GitHub

Merge pull request #3317 from jumpserver/bugfix

Bugfix
parents 230b3edf 9ee9be33
......@@ -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)
......
......@@ -140,6 +140,7 @@
}
function initTree() {
$('#assetTree').html("{% trans 'Loading' %}" + '..');
if (systemUserId) {
url = treeUrl + '&system_user=' + systemUserId
} else {
......@@ -365,4 +366,4 @@
execute()
})
</script>
{% endblock %}
\ No newline at end of file
{% endblock %}
......@@ -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:
......
......@@ -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
......
......@@ -164,11 +164,14 @@ $(document).ready(function () {
detailRows.push(tr.attr('id'));
}
}
})
});
function format(d) {
var output = $("<pre style='border: none; background: none'></pre>");
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("<i class='fa fa-angle-right'></i>");
}},
{targets: 1, createdCell: function (td, cellData) {
var data = htmlEscape(cellData);
var interHtml = $("<span></span>");
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 = '<a href="{% url "terminal:session-detail" pk=DEFAULT_PK %}">{% trans "Goto" %}</a>'
.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},
],
......
......@@ -54,8 +54,12 @@
{% for command in object_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ command.input }}</td>
<td><pre style="border: none;background: none">{{ command.output }}</pre></td>
<td>{{ command.input | truncatechars:40 }}</td>
<td><pre style="border: none;background: none">
$ {{ command.input }}
{{ command.output }}
</pre></td>
<td>{{ command.timestamp|ts_to_date}}</td>
</tr>
{% empty %}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment