Compare commits

...

10 Commits

Author SHA1 Message Date
Bai
11d67c6d0e fix: Update v3.0.4 2023-03-09 18:17:56 +08:00
fit2bot
627eb6abb1 feat: Update v3.0.4 2023-03-08 16:03:25 +08:00
Bai
c908b47ccf fix: 修复组织管理员查看活动日志详情时没有对象的问题 2023-03-08 15:58:05 +08:00
Bai
88af33b7c2 fix: 修复组织管理员查看操作日志可以看到 system 组织下的操作问题, 只有系统管理员可以查看任务监控 2023-03-08 15:22:27 +08:00
老广
136537fcfb Merge pull request #9872 from jumpserver/pr@v3.0@fix_su_from_accounts
fix: 修复su-from-accounts API 500问题,Unsubscribe msg error 转成debug
2023-03-08 14:06:36 +08:00
老广
dfd404c549 Merge pull request #9875 from jumpserver/pr@v3.0@fix_operatelog_hide_sth
fix: 操作日志显示用户加密后的密文,及日期格式调整
2023-03-08 14:05:47 +08:00
老广
53886a5abf Merge pull request #9882 from jumpserver/pr@v3.0@perf_email_test_error
perf: 邮箱测试时,不填写'主题前缀'会报错
2023-03-08 14:02:58 +08:00
jiangweidong
50d3125fec perf: 邮箱测试时,不填写'主题前缀'会报错 2023-03-08 13:51:40 +08:00
jiangweidong
1145305f11 fix: 操作日志显示用户加密后的密文,及日期格式调整 2023-03-08 11:24:56 +08:00
feng
433f063142 fix: 修复su-from-accounts API 500问题,Unsubscribe msg error 转成debug 2023-03-08 11:02:05 +08:00
11 changed files with 22 additions and 12 deletions

1
GITSHA Normal file
View File

@@ -0,0 +1 @@
c908b47ccfd7eb906835431371d811118ce6a212

View File

@@ -43,7 +43,7 @@ class AccountViewSet(OrgBulkModelViewSet):
asset = get_object_or_404(Asset, pk=asset_id) asset = get_object_or_404(Asset, pk=asset_id)
accounts = asset.accounts.all() accounts = asset.accounts.all()
else: else:
accounts = [] accounts = Account.objects.none()
accounts = self.filter_queryset(accounts) accounts = self.filter_queryset(accounts)
serializer = serializers.AccountSerializer(accounts, many=True) serializer = serializers.AccountSerializer(accounts, many=True)
return Response(data=serializer.data) return Response(data=serializer.data)

View File

@@ -10,6 +10,7 @@ from rest_framework.permissions import IsAuthenticated
from common.drf.filters import DatetimeRangeFilter from common.drf.filters import DatetimeRangeFilter
from common.plugins.es import QuerySet as ESQuerySet from common.plugins.es import QuerySet as ESQuerySet
from common.utils import is_uuid from common.utils import is_uuid
from common.utils import lazyproperty
from orgs.mixins.api import OrgReadonlyModelViewSet, OrgModelViewSet from orgs.mixins.api import OrgReadonlyModelViewSet, OrgModelViewSet
from orgs.utils import current_org, tmp_to_root_org from orgs.utils import current_org, tmp_to_root_org
from orgs.models import Organization from orgs.models import Organization
@@ -143,13 +144,19 @@ class OperateLogViewSet(OrgReadonlyModelViewSet):
search_fields = ['resource', 'user'] search_fields = ['resource', 'user']
ordering = ['-datetime'] ordering = ['-datetime']
@lazyproperty
def is_action_detail(self):
return self.detail and self.request.query_params.get('type') == 'action_detail'
def get_serializer_class(self): def get_serializer_class(self):
if self.request.query_params.get('type') == 'action_detail': if self.is_action_detail:
return OperateLogActionDetailSerializer return OperateLogActionDetailSerializer
return super().get_serializer_class() return super().get_serializer_class()
def get_queryset(self): def get_queryset(self):
org_q = Q(org_id=Organization.SYSTEM_ID) | Q(org_id=current_org.id) org_q = Q(org_id=current_org.id)
if self.is_action_detail:
org_q |= Q(org_id=Organization.SYSTEM_ID)
with tmp_to_root_org(): with tmp_to_root_org():
qs = OperateLog.objects.filter(org_q) qs = OperateLog.objects.filter(org_q)
es_config = settings.OPERATE_LOG_ELASTICSEARCH_CONFIG es_config = settings.OPERATE_LOG_ELASTICSEARCH_CONFIG

View File

@@ -4,7 +4,6 @@ from django.db import transaction
from django.core.cache import cache from django.core.cache import cache
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from users.models import User
from common.utils import get_request_ip, get_logger from common.utils import get_request_ip, get_logger
from common.utils.timezone import as_current_tz from common.utils.timezone import as_current_tz
from common.utils.encode import Singleton from common.utils.encode import Singleton

View File

@@ -2,7 +2,7 @@
# #
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
from audits.backends.db import OperateLogStore from audits.backends.db import OperateLogStore
from common.serializers.fields import LabeledChoiceField from common.serializers.fields import LabeledChoiceField
from common.utils import reverse, i18n_trans from common.utils import reverse, i18n_trans
@@ -78,7 +78,7 @@ class OperateLogActionDetailSerializer(serializers.ModelSerializer):
return data return data
class OperateLogSerializer(serializers.ModelSerializer): class OperateLogSerializer(BulkOrgResourceModelSerializer):
action = LabeledChoiceField(choices=ActionChoices.choices, label=_("Action")) action = LabeledChoiceField(choices=ActionChoices.choices, label=_("Action"))
resource = serializers.SerializerMethodField(label=_("Resource")) resource = serializers.SerializerMethodField(label=_("Resource"))
resource_type = serializers.SerializerMethodField(label=_('Resource Type')) resource_type = serializers.SerializerMethodField(label=_('Resource Type'))

View File

@@ -1,13 +1,15 @@
import codecs import codecs
import copy import copy
import csv import csv
from itertools import chain from itertools import chain
from datetime import datetime
from django.db import models from django.db import models
from django.http import HttpResponse from django.http import HttpResponse
from common.utils.timezone import as_current_tz
from common.utils import validate_ip, get_ip_city, get_logger from common.utils import validate_ip, get_ip_city, get_logger
from settings.serializers import SettingsSerializer
from .const import DEFAULT_CITY from .const import DEFAULT_CITY
logger = get_logger(__name__) logger = get_logger(__name__)
@@ -70,6 +72,8 @@ def _get_instance_field_value(
f.verbose_name = 'id' f.verbose_name = 'id'
elif isinstance(value, (list, dict)): elif isinstance(value, (list, dict)):
value = copy.deepcopy(value) value = copy.deepcopy(value)
elif isinstance(value, datetime):
value = as_current_tz(value).strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(f, models.OneToOneField) and isinstance(value, models.Model): elif isinstance(f, models.OneToOneField) and isinstance(value, models.Model):
nested_data = _get_instance_field_value( nested_data = _get_instance_field_value(
value, include_model_fields, model_need_continue_fields, ('id',) value, include_model_fields, model_need_continue_fields, ('id',)

View File

@@ -2,4 +2,3 @@ from __future__ import absolute_import
# This will make sure the app is always imported when # This will make sure the app is always imported when
# Django starts so that shared_task will use this app. # Django starts so that shared_task will use this app.

View File

@@ -1,7 +1,7 @@
from werkzeug.local import Local from werkzeug.local import Local
thread_local = Local() thread_local = Local()
encrypted_field_set = set() encrypted_field_set = {'password'}
def _find(attr): def _find(attr):

View File

@@ -108,7 +108,7 @@ class Subscription:
try: try:
self.sub.close() self.sub.close()
except Exception as e: except Exception as e:
logger.error('Unsubscribe msg error: {}'.format(e)) logger.debug('Unsubscribe msg error: {}'.format(e))
def retry(self, _next, error, complete): def retry(self, _next, error, complete):
logger.info('Retry subscribe channel: {}'.format(self.ch)) logger.info('Retry subscribe channel: {}'.format(self.ch))

View File

@@ -135,7 +135,7 @@ only_system_permissions = (
('xpack', 'license', '*', '*'), ('xpack', 'license', '*', '*'),
('settings', 'setting', '*', '*'), ('settings', 'setting', '*', '*'),
('tickets', '*', '*', '*'), ('tickets', '*', '*', '*'),
('ops', 'task', 'view', 'taskmonitor'), ('ops', 'celerytask', 'view', 'taskmonitor'),
('terminal', 'terminal', '*', '*'), ('terminal', 'terminal', '*', '*'),
('terminal', 'commandstorage', '*', '*'), ('terminal', 'commandstorage', '*', '*'),
('terminal', 'replaystorage', '*', '*'), ('terminal', 'replaystorage', '*', '*'),

View File

@@ -42,7 +42,7 @@ class MailTestingAPI(APIView):
# if k.startswith('EMAIL'): # if k.startswith('EMAIL'):
# setattr(settings, k, v) # setattr(settings, k, v)
try: try:
subject = settings.EMAIL_SUBJECT_PREFIX + "Test" subject = settings.EMAIL_SUBJECT_PREFIX or '' + "Test"
message = "Test smtp setting" message = "Test smtp setting"
email_from = email_from or email_host_user email_from = email_from or email_host_user
email_recipient = email_recipient or email_from email_recipient = email_recipient or email_from