mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-24 04:50:30 +00:00
feat: 查看/下载录像被记录在活动日志中
This commit is contained in:
@@ -8,7 +8,7 @@ from django.db.models import F
|
||||
from django.http import FileResponse
|
||||
from django.shortcuts import get_object_or_404, reverse
|
||||
from django.utils.encoding import escape_uri_path
|
||||
from django.utils.translation import gettext as _
|
||||
from django.utils.translation import gettext_noop, gettext as _
|
||||
from django_filters import rest_framework as filters
|
||||
from rest_framework import generics
|
||||
from rest_framework import viewsets, views
|
||||
@@ -16,14 +16,16 @@ from rest_framework.decorators import action
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
|
||||
from audits.const import ActionChoices
|
||||
from common.api import AsyncApiMixin
|
||||
from common.const.http import GET
|
||||
from common.drf.filters import BaseFilterSet
|
||||
from common.drf.filters import DatetimeRangeFilterBackend
|
||||
from common.drf.renders import PassthroughRenderer
|
||||
from common.storage.replay import ReplayStorageHandler
|
||||
from common.utils import data_to_json, is_uuid
|
||||
from common.utils import data_to_json, is_uuid, i18n_fmt
|
||||
from common.utils import get_logger, get_object_or_none
|
||||
from common.views.mixins import RecordViewLogMixin
|
||||
from orgs.mixins.api import OrgBulkModelViewSet
|
||||
from orgs.utils import tmp_to_root_org, tmp_to_org
|
||||
from rbac.permissions import RBACPermission
|
||||
@@ -70,7 +72,7 @@ class SessionFilterSet(BaseFilterSet):
|
||||
return queryset.filter(terminal__name=value)
|
||||
|
||||
|
||||
class SessionViewSet(OrgBulkModelViewSet):
|
||||
class SessionViewSet(RecordViewLogMixin, OrgBulkModelViewSet):
|
||||
model = Session
|
||||
serializer_classes = {
|
||||
'default': serializers.SessionSerializer,
|
||||
@@ -132,6 +134,15 @@ class SessionViewSet(OrgBulkModelViewSet):
|
||||
filename = escape_uri_path('{}.tar'.format(storage.obj.id))
|
||||
disposition = "attachment; filename*=UTF-8''{}".format(filename)
|
||||
response["Content-Disposition"] = disposition
|
||||
|
||||
detail = i18n_fmt(
|
||||
gettext_noop(f'User %s %s session %s replay'), self.request.user,
|
||||
gettext_noop(ActionChoices.download), str(storage.obj)
|
||||
)
|
||||
self.record_logs(
|
||||
[storage.obj.asset_id], ActionChoices.download, detail,
|
||||
model=Session, resource_display=str(storage.obj)
|
||||
)
|
||||
return response
|
||||
|
||||
def get_queryset(self):
|
||||
@@ -152,7 +163,7 @@ class SessionViewSet(OrgBulkModelViewSet):
|
||||
return super().perform_create(serializer)
|
||||
|
||||
|
||||
class SessionReplayViewSet(AsyncApiMixin, viewsets.ViewSet):
|
||||
class SessionReplayViewSet(AsyncApiMixin, RecordViewLogMixin, viewsets.ViewSet):
|
||||
serializer_class = serializers.ReplaySerializer
|
||||
download_cache_key = "SESSION_REPLAY_DOWNLOAD_{}"
|
||||
session = None
|
||||
@@ -215,6 +226,18 @@ class SessionReplayViewSet(AsyncApiMixin, viewsets.ViewSet):
|
||||
return False
|
||||
return True
|
||||
|
||||
def async_callback(self, *args, **kwargs):
|
||||
session_id = kwargs.get('pk')
|
||||
session = get_object_or_404(Session, id=session_id)
|
||||
detail = i18n_fmt(
|
||||
gettext_noop(f'User %s %s session %s replay'), self.request.user,
|
||||
gettext_noop(ActionChoices.view), str(session)
|
||||
)
|
||||
self.record_logs(
|
||||
[session.asset_id], ActionChoices.download, detail,
|
||||
model=Session, resource_display=str(session)
|
||||
)
|
||||
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
session_id = kwargs.get('pk')
|
||||
session = get_object_or_404(Session, id=session_id)
|
||||
|
Reference in New Issue
Block a user