Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
l y
Jumpserver
Commits
7d25a6d6
Commit
7d25a6d6
authored
3 years ago
by
xinwen
Browse files
Options
Download
Email Patches
Plain Diff
feat: 个人页面接口
parent
ac9e7e9b
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
apps/audits/api.py
+15
-1
apps/audits/api.py
apps/audits/urls/api_urls.py
+1
-0
apps/audits/urls/api_urls.py
apps/terminal/api/session.py
+60
-5
apps/terminal/api/session.py
apps/terminal/urls/api_urls.py
+2
-0
apps/terminal/urls/api_urls.py
with
78 additions
and
6 deletions
+78
-6
apps/audits/api.py
+
15
-
1
View file @
7d25a6d6
...
...
@@ -3,7 +3,9 @@
from
rest_framework.mixins
import
ListModelMixin
,
CreateModelMixin
from
django.db.models
import
F
,
Value
from
django.db.models.functions
import
Concat
from
rest_framework.permissions
import
IsAuthenticated
from
common.drf.api
import
JMSReadOnlyModelViewSet
from
common.permissions
import
IsOrgAdminOrAppUser
,
IsOrgAuditor
,
IsOrgAdmin
from
common.drf.filters
import
DatetimeRangeFilter
from
common.api
import
CommonGenericViewSet
...
...
@@ -30,7 +32,7 @@ class FTPLogViewSet(CreateModelMixin,
ordering
=
[
'-date_start'
]
class
UserLogin
LogViewSet
(
ListModelMixin
,
CommonGenericViewSet
)
:
class
UserLogin
CommonMixin
:
queryset
=
UserLoginLog
.
objects
.
all
()
permission_classes
=
[
IsOrgAdmin
|
IsOrgAuditor
]
serializer_class
=
UserLoginLogSerializer
...
...
@@ -41,6 +43,9 @@ class UserLoginLogViewSet(ListModelMixin, CommonGenericViewSet):
filterset_fields
=
[
'username'
,
'ip'
,
'city'
,
'type'
,
'status'
,
'mfa'
]
search_fields
=
[
'username'
,
'ip'
,
'city'
]
class
UserLoginLogViewSet
(
UserLoginCommonMixin
,
ListModelMixin
,
CommonGenericViewSet
):
@
staticmethod
def
get_org_members
():
users
=
current_org
.
get_members
().
values_list
(
'username'
,
flat
=
True
)
...
...
@@ -55,6 +60,15 @@ class UserLoginLogViewSet(ListModelMixin, CommonGenericViewSet):
return
queryset
class
MyLoginLogViewSet
(
UserLoginCommonMixin
,
JMSReadOnlyModelViewSet
):
permission_classes
=
[
IsAuthenticated
]
def
get_queryset
(
self
):
qs
=
super
().
get_queryset
()
qs
=
qs
.
filter
(
username
=
self
.
request
.
user
.
username
)
return
qs
class
OperateLogViewSet
(
ListModelMixin
,
OrgGenericViewSet
):
model
=
OperateLog
serializer_class
=
OperateLogSerializer
...
...
This diff is collapsed.
Click to expand it.
apps/audits/urls/api_urls.py
+
1
-
0
View file @
7d25a6d6
...
...
@@ -12,6 +12,7 @@ app_name = "audits"
router
=
DefaultRouter
()
router
.
register
(
r
'ftp-logs'
,
api
.
FTPLogViewSet
,
'ftp-log'
)
router
.
register
(
r
'login-logs/my'
,
api
.
MyLoginLogViewSet
,
'my-login-log'
)
router
.
register
(
r
'login-logs'
,
api
.
UserLoginLogViewSet
,
'login-log'
)
router
.
register
(
r
'operate-logs'
,
api
.
OperateLogViewSet
,
'operate-log'
)
router
.
register
(
r
'password-change-logs'
,
api
.
PasswordChangeLogViewSet
,
'password-change-log'
)
...
...
This diff is collapsed.
Click to expand it.
apps/terminal/api/session.py
+
60
-
5
View file @
7d25a6d6
...
...
@@ -3,19 +3,23 @@
import
os
import
tarfile
from
django.db.models
import
F
,
Max
from
django.shortcuts
import
get_object_or_404
,
reverse
from
django.utils.translation
import
ugettext
as
_
from
django.utils.encoding
import
escape_uri_path
from
django.http
import
FileResponse
,
HttpResponse
from
django.http
import
FileResponse
from
django.core.files.storage
import
default_storage
from
rest_framework
import
viewsets
,
views
from
rest_framework.response
import
Response
from
rest_framework.decorators
import
action
from
rest_framework.permissions
import
IsAuthenticated
from
assets.models
import
Asset
from
common.drf.api
import
JMSReadOnlyModelViewSet
from
common.utils
import
model_to_json
from
..
import
utils
from
common.const.http
import
GET
from
common.utils
import
is_uuid
,
get_logger
,
get_object_or_none
from
common.utils
import
get_logger
,
get_object_or_none
from
common.mixins.api
import
AsyncApiMixin
from
common.permissions
import
IsOrgAdminOrAppUser
,
IsOrgAuditor
,
IsAppUser
from
common.drf.filters
import
DatetimeRangeFilter
...
...
@@ -24,17 +28,18 @@ from orgs.mixins.api import OrgBulkModelViewSet
from
orgs.utils
import
tmp_to_root_org
,
tmp_to_org
from
users.models
import
User
from
..utils
import
find_session_replay_local
,
download_session_replay
from
..hands
import
SystemUser
from
..models
import
Session
from
..
import
serializers
from
assets.serializers
import
AssetSerializer
__all__
=
[
'SessionViewSet'
,
'SessionReplayViewSet'
,
'SessionJoinValidateAPI'
'SessionViewSet'
,
'SessionReplayViewSet'
,
'SessionJoinValidateAPI'
,
'MySessionViewSet'
,
'MySessionAssetViewSet'
,
]
logger
=
get_logger
(
__name__
)
class
Session
ViewSet
(
OrgBulkModelViewSet
)
:
class
Common
Session
Mixin
:
model
=
Session
serializer_classes
=
{
'default'
:
serializers
.
SessionSerializer
,
...
...
@@ -50,6 +55,56 @@ class SessionViewSet(OrgBulkModelViewSet):
]
extra_filter_backends
=
[
DatetimeRangeFilter
]
class
MySessionViewSet
(
CommonSessionMixin
,
JMSReadOnlyModelViewSet
):
queryset
=
Session
.
objects
.
all
()
permission_classes
=
(
IsAuthenticated
,
)
def
get_queryset
(
self
):
user
=
self
.
request
.
user
qs
=
super
().
get_queryset
()
qs
=
qs
.
filter
(
user_id
=
user
.
id
)
return
qs
class
MySessionAssetViewSet
(
JMSReadOnlyModelViewSet
):
queryset
=
Asset
.
objects
.
all
()
permission_classes
=
(
IsAuthenticated
,
)
serializer_class
=
AssetSerializer
def
list
(
self
,
request
,
*
args
,
**
kwargs
):
user
=
self
.
request
.
user
sessions
=
Session
.
objects
.
filter
(
user_id
=
user
.
id
).
values_list
(
'asset_id'
).
annotate
(
max_date_start
=
Max
(
F
(
'date_start'
))
).
order_by
(
'-max_date_start'
).
values_list
(
'asset_id'
,
flat
=
True
)
page
=
self
.
paginate_queryset
(
sessions
)
if
page
is
not
None
:
serializer
=
self
.
_to_serializer
(
page
)
return
self
.
get_paginated_response
(
serializer
.
data
)
serializer
=
self
.
_to_serializer
(
sessions
)
return
Response
(
serializer
.
data
)
def
_to_serializer
(
self
,
asset_ids
):
asset_ids
=
[
i
for
i
in
asset_ids
if
i
!=
''
]
# xrdp bug 没有提交 asset_id,已修复,但要兼容旧数据
self
.
_paginator
.
count
=
len
(
asset_ids
)
assets_qs
=
Asset
.
objects
.
filter
(
id__in
=
asset_ids
)
serializer_cls
=
self
.
get_serializer_class
()
if
hasattr
(
serializer_cls
,
'setup_eager_loading'
):
assets_qs
=
serializer_cls
.
setup_eager_loading
(
assets_qs
)
id_asset_map
=
{
str
(
asset
.
id
):
asset
for
asset
in
assets_qs
}
assets
=
[]
for
i
in
asset_ids
:
assets
.
append
(
id_asset_map
[
i
])
serializer
=
self
.
get_serializer
(
assets
,
many
=
True
)
return
serializer
class
SessionViewSet
(
CommonSessionMixin
,
OrgBulkModelViewSet
):
@
staticmethod
def
prepare_offline_file
(
session
,
local_path
):
replay_path
=
default_storage
.
path
(
local_path
)
...
...
This diff is collapsed.
Click to expand it.
apps/terminal/urls/api_urls.py
+
2
-
0
View file @
7d25a6d6
...
...
@@ -11,6 +11,8 @@ from .. import api
app_name
=
'terminal'
router
=
BulkRouter
()
router
.
register
(
r
'sessions/my'
,
api
.
MySessionViewSet
,
'my-session'
)
router
.
register
(
r
'sessions/asset/my'
,
api
.
MySessionAssetViewSet
,
'my-asset'
)
router
.
register
(
r
'sessions'
,
api
.
SessionViewSet
,
'session'
)
router
.
register
(
r
'terminals/(?P<terminal>[a-zA-Z0-9\-]{36})?/?status'
,
api
.
StatusViewSet
,
'terminal-status'
)
router
.
register
(
r
'terminals/(?P<terminal>[a-zA-Z0-9\-]{36})?/?sessions'
,
api
.
SessionViewSet
,
'terminal-sessions'
)
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
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
Menu
Projects
Groups
Snippets
Help