mirror of https://github.com/jumpserver/jumpserver
commit
3bd3564b2b
|
@ -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+')
|
||||
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))
|
||||
self.__pattern = re.compile(r'{}'.format('|'.join(regex)))
|
||||
else:
|
||||
self.__pattern = re.compile(r'{0}'.format(self.content))
|
||||
return self.__pattern
|
||||
regex.append(r'\b{0}'.format(cmd))
|
||||
s = r'{}'.format('|'.join(regex))
|
||||
else:
|
||||
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 {
|
||||
|
|
|
@ -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 %}
|
||||
|
|
Loading…
Reference in New Issue