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
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
78 additions
and
39 deletions
+78
-39
cmd_filter.py
apps/assets/models/cmd_filter.py
+16
-10
command_execution_create.html
apps/ops/templates/ops/command_execution_create.html
+1
-0
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
...
@@ -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):
...
@@ -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
@
lazy
property
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
'
):
cmd
=
re
.
escape
(
cmd
)
cmd
=
cmd
.
replace
(
'
\\
'
,
'
\
s+'
)
if
cmd
[
-
1
]
.
isalpha
():
regex
.
append
(
r'\b{0}\b'
.
format
(
cmd
))
regex
.
append
(
r'\b{0}\b'
.
format
(
cmd
))
self
.
__pattern
=
re
.
compile
(
r'{}'
.
format
(
'|'
.
join
(
regex
)))
else
:
else
:
self
.
__pattern
=
re
.
compile
(
r'{0}'
.
format
(
self
.
content
))
regex
.
append
(
r'\b{0}'
.
format
(
cmd
))
return
self
.
__pattern
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
):
def
match
(
self
,
data
):
found
=
self
.
_pattern
.
search
(
data
)
found
=
self
.
_pattern
.
search
(
data
)
...
...
apps/ops/templates/ops/command_execution_create.html
View file @
3bd3564b
...
@@ -140,6 +140,7 @@
...
@@ -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
{
...
...
apps/settings/api.py
View file @
3bd3564b
...
@@ -101,9 +101,11 @@ class LDAPUserListApi(generics.ListAPIView):
...
@@ -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):
...
@@ -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):
...
@@ -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
:
...
...
apps/settings/utils.py
View file @
3bd3564b
...
@@ -22,6 +22,9 @@ class LDAPOUGroupException(Exception):
...
@@ -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:
...
@@ -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
,
se
lf
.
search_filter
%
({
"user"
:
"*"
})
,
search_ou
,
se
arch_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:
...
@@ -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
...
...
apps/terminal/templates/terminal/command_list.html
View file @
3bd3564b
...
@@ -164,11 +164,14 @@ $(document).ready(function () {
...
@@ -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() {
...
@@ -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() {
...
@@ -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
},
],
],
...
...
apps/terminal/templates/terminal/session_detail.html
View file @
3bd3564b
...
@@ -54,8 +54,12 @@
...
@@ -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 %}
...
...
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