Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
3bd3564b
Unverified
Commit
3bd3564b
authored
Oct 09, 2019
by
BaiJiangJie
Committed by
GitHub
Oct 09, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #3317 from jumpserver/bugfix
Bugfix
parents
230b3edf
9ee9be33
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
80 additions
and
42 deletions
+80
-42
cmd_filter.py
apps/assets/models/cmd_filter.py
+17
-11
command_execution_create.html
apps/ops/templates/ops/command_execution_create.html
+2
-2
api.py
apps/settings/api.py
+5
-17
utils.py
apps/settings/utils.py
+34
-8
command_list.html
apps/terminal/templates/terminal/command_list.html
+16
-2
session_detail.html
apps/terminal/templates/terminal/session_detail.html
+6
-2
No files found.
apps/assets/models/cmd_filter.py
View file @
3bd3564b
...
...
@@ -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
@
lazy
property
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
)
...
...
apps/ops/templates/ops/command_execution_create.html
View file @
3bd3564b
...
...
@@ -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 %}
apps/settings/api.py
View file @
3bd3564b
...
...
@@ -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
:
...
...
apps/settings/utils.py
View file @
3bd3564b
...
...
@@ -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
,
se
lf
.
search_filter
%
({
"user"
:
"*"
})
,
search_ou
,
se
arch_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
...
...
apps/terminal/templates/terminal/command_list.html
View file @
3bd3564b
...
...
@@ -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
},
],
...
...
apps/terminal/templates/terminal/session_detail.html
View file @
3bd3564b
...
...
@@ -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 %}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment