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.core.validators import MinValueValidator, MaxValueValidator
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
from common.utils import lazyproperty
|
||||||
from orgs.mixins.models import OrgModelMixin
|
from orgs.mixins.models import OrgModelMixin
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,25 +58,30 @@ class CommandFilterRule(OrgModelMixin):
|
||||||
date_updated = models.DateTimeField(auto_now=True)
|
date_updated = models.DateTimeField(auto_now=True)
|
||||||
created_by = models.CharField(max_length=128, blank=True, default='', verbose_name=_('Created by'))
|
created_by = models.CharField(max_length=128, blank=True, default='', verbose_name=_('Created by'))
|
||||||
|
|
||||||
__pattern = None
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ('-priority', 'action')
|
ordering = ('-priority', 'action')
|
||||||
verbose_name = _("Command filter rule")
|
verbose_name = _("Command filter rule")
|
||||||
|
|
||||||
@property
|
@lazyproperty
|
||||||
def _pattern(self):
|
def _pattern(self):
|
||||||
if self.__pattern:
|
|
||||||
return self.__pattern
|
|
||||||
if self.type == 'command':
|
if self.type == 'command':
|
||||||
regex = []
|
regex = []
|
||||||
for cmd in self.content.split('\r\n'):
|
content = self.content.replace('\r\n', '\n')
|
||||||
cmd = cmd.replace(' ', '\s+')
|
for cmd in content.split('\n'):
|
||||||
regex.append(r'\b{0}\b'.format(cmd))
|
cmd = re.escape(cmd)
|
||||||
self.__pattern = re.compile(r'{}'.format('|'.join(regex)))
|
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:
|
else:
|
||||||
self.__pattern = re.compile(r'{0}'.format(self.content))
|
s = r'{0}'.format(self.content)
|
||||||
return self.__pattern
|
try:
|
||||||
|
_pattern = re.compile(s)
|
||||||
|
except:
|
||||||
|
_pattern = ''
|
||||||
|
return _pattern
|
||||||
|
|
||||||
def match(self, data):
|
def match(self, data):
|
||||||
found = self._pattern.search(data)
|
found = self._pattern.search(data)
|
||||||
|
|
|
@ -140,6 +140,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function initTree() {
|
function initTree() {
|
||||||
|
$('#assetTree').html("{% trans 'Loading' %}" + '..');
|
||||||
if (systemUserId) {
|
if (systemUserId) {
|
||||||
url = treeUrl + '&system_user=' + systemUserId
|
url = treeUrl + '&system_user=' + systemUserId
|
||||||
} else {
|
} else {
|
||||||
|
@ -365,4 +366,4 @@
|
||||||
execute()
|
execute()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -101,9 +101,11 @@ class LDAPUserListApi(generics.ListAPIView):
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
if hasattr(self, 'swagger_fake_view'):
|
if hasattr(self, 'swagger_fake_view'):
|
||||||
return []
|
return []
|
||||||
util = LDAPUtil()
|
q = self.request.query_params.get('search')
|
||||||
try:
|
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:
|
except Exception as e:
|
||||||
users = []
|
users = []
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
|
@ -112,20 +114,6 @@ class LDAPUserListApi(generics.ListAPIView):
|
||||||
user['id'] = user['username']
|
user['id'] = user['username']
|
||||||
return users
|
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):
|
def sort_queryset(self, queryset):
|
||||||
order_by = self.request.query_params.get('order')
|
order_by = self.request.query_params.get('order')
|
||||||
if not order_by:
|
if not order_by:
|
||||||
|
@ -139,7 +127,7 @@ class LDAPUserListApi(generics.ListAPIView):
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
queryset = self.filter_queryset(self.get_queryset())
|
queryset = self.get_queryset()
|
||||||
queryset = self.sort_queryset(queryset)
|
queryset = self.sort_queryset(queryset)
|
||||||
page = self.paginate_queryset(queryset)
|
page = self.paginate_queryset(queryset)
|
||||||
if page is not None:
|
if page is not None:
|
||||||
|
|
|
@ -22,6 +22,9 @@ class LDAPOUGroupException(Exception):
|
||||||
class LDAPUtil:
|
class LDAPUtil:
|
||||||
_conn = None
|
_conn = None
|
||||||
|
|
||||||
|
SEARCH_FIELD_ALL = 'all'
|
||||||
|
SEARCH_FIELD_USERNAME = 'username'
|
||||||
|
|
||||||
def __init__(self, use_settings_config=True, server_uri=None, bind_dn=None,
|
def __init__(self, use_settings_config=True, server_uri=None, bind_dn=None,
|
||||||
password=None, use_ssl=None, search_ougroup=None,
|
password=None, use_ssl=None, search_ougroup=None,
|
||||||
search_filter=None, attr_map=None, auth_ldap=None):
|
search_filter=None, attr_map=None, auth_ldap=None):
|
||||||
|
@ -81,9 +84,13 @@ class LDAPUtil:
|
||||||
user_item[attr] = value
|
user_item[attr] = value
|
||||||
return user_item
|
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(
|
ok = self.connection.search(
|
||||||
search_ou, self.search_filter % ({"user": "*"}),
|
search_ou, search_filter,
|
||||||
attributes=list(self.attr_map.values()),
|
attributes=list(self.attr_map.values()),
|
||||||
paged_size=self.paged_size, paged_cookie=cookie
|
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']
|
cookie = self.connection.result['controls']['1.2.840.113556.1.4.319']['value']['cookie']
|
||||||
return cookie
|
return cookie
|
||||||
|
|
||||||
def search_user_items(self):
|
def search_user_items(self, extra_filter=None):
|
||||||
user_items = []
|
user_items = []
|
||||||
logger.info("Search user items")
|
logger.info("Search user items")
|
||||||
|
|
||||||
for search_ou in str(self.search_ougroup).split("|"):
|
for search_ou in str(self.search_ougroup).split("|"):
|
||||||
logger.info("Search user search ou: {}".format(search_ou))
|
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)
|
user_items.extend(_user_items)
|
||||||
while self._cookie():
|
while self._cookie():
|
||||||
logger.info("Page Search user search ou: {}".format(search_ou))
|
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)
|
user_items.extend(_user_items)
|
||||||
logger.info("Search user items end")
|
logger.info("Search user items end")
|
||||||
return user_items
|
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):
|
def search_filter_user_items(self, username_list):
|
||||||
user_items = self.search_user_items()
|
extra_filter = self.construct_extra_filter(
|
||||||
if username_list:
|
self.SEARCH_FIELD_USERNAME, username_list
|
||||||
user_items = [u for u in user_items if u['username'] in username_list]
|
)
|
||||||
|
user_items = self.search_user_items(extra_filter)
|
||||||
return user_items
|
return user_items
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
|
@ -164,11 +164,14 @@ $(document).ready(function () {
|
||||||
detailRows.push(tr.attr('id'));
|
detailRows.push(tr.attr('id'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
|
|
||||||
function format(d) {
|
function format(d) {
|
||||||
var output = $("<pre style='border: none; background: none'></pre>");
|
var output = $("<pre style='border: none; background: none'></pre>");
|
||||||
|
|
||||||
|
output.append('$ ', d.input);
|
||||||
|
output.append('\r\n\r\n');
|
||||||
output.append(d.output);
|
output.append(d.output);
|
||||||
return output
|
return output
|
||||||
}
|
}
|
||||||
|
@ -187,6 +190,17 @@ function initTable() {
|
||||||
$(td).addClass("toggle");
|
$(td).addClass("toggle");
|
||||||
$(td).html("<i class='fa fa-angle-right'></i>");
|
$(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) {
|
{targets: 5, createdCell: function (td, cellData) {
|
||||||
var data = '<a href="{% url "terminal:session-detail" pk=DEFAULT_PK %}">{% trans "Goto" %}</a>'
|
var data = '<a href="{% url "terminal:session-detail" pk=DEFAULT_PK %}">{% trans "Goto" %}</a>'
|
||||||
.replace('{{ DEFAULT_PK }}', cellData);
|
.replace('{{ DEFAULT_PK }}', cellData);
|
||||||
|
@ -200,7 +214,7 @@ function initTable() {
|
||||||
toggle: true,
|
toggle: true,
|
||||||
ajax_url: commandListUrl,
|
ajax_url: commandListUrl,
|
||||||
columns: [
|
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: "asset", orderable: false}, {data: "system_user", orderable: false},
|
||||||
{data: "session", orderable: false}, {data: "timestamp", width: "160px", orderable: false},
|
{data: "session", orderable: false}, {data: "timestamp", width: "160px", orderable: false},
|
||||||
],
|
],
|
||||||
|
|
|
@ -54,8 +54,12 @@
|
||||||
{% for command in object_list %}
|
{% for command in object_list %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ forloop.counter }}</td>
|
<td>{{ forloop.counter }}</td>
|
||||||
<td>{{ command.input }}</td>
|
<td>{{ command.input | truncatechars:40 }}</td>
|
||||||
<td><pre style="border: none;background: none">{{ command.output }}</pre></td>
|
<td><pre style="border: none;background: none">
|
||||||
|
$ {{ command.input }}
|
||||||
|
|
||||||
|
{{ command.output }}
|
||||||
|
</pre></td>
|
||||||
<td>{{ command.timestamp|ts_to_date}}</td>
|
<td>{{ command.timestamp|ts_to_date}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% empty %}
|
{% empty %}
|
||||||
|
|
Loading…
Reference in New Issue