mirror of https://github.com/jumpserver/jumpserver
commit
188c04c9a6
|
@ -63,9 +63,9 @@ RUN mkdir -p /opt/oracle/ \
|
||||||
WORKDIR /tmp/build
|
WORKDIR /tmp/build
|
||||||
COPY ./requirements ./requirements
|
COPY ./requirements ./requirements
|
||||||
|
|
||||||
ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/
|
ARG PIP_MIRROR=https://pypi.douban.com/simple
|
||||||
ENV PIP_MIRROR=$PIP_MIRROR
|
ENV PIP_MIRROR=$PIP_MIRROR
|
||||||
ARG PIP_JMS_MIRROR=https://mirrors.aliyun.com/pypi/simple/
|
ARG PIP_JMS_MIRROR=https://pypi.douban.com/simple
|
||||||
ENV PIP_JMS_MIRROR=$PIP_JMS_MIRROR
|
ENV PIP_JMS_MIRROR=$PIP_JMS_MIRROR
|
||||||
# 因为以 jms 或者 jumpserver 开头的 mirror 上可能没有
|
# 因为以 jms 或者 jumpserver 开头的 mirror 上可能没有
|
||||||
RUN pip install --upgrade pip==20.2.4 setuptools==49.6.0 wheel==0.34.2 -i ${PIP_MIRROR} \
|
RUN pip install --upgrade pip==20.2.4 setuptools==49.6.0 wheel==0.34.2 -i ${PIP_MIRROR} \
|
||||||
|
|
|
@ -12,6 +12,7 @@ from common.api import CommonGenericViewSet
|
||||||
from orgs.mixins.api import OrgGenericViewSet, OrgBulkModelViewSet, OrgRelationMixin
|
from orgs.mixins.api import OrgGenericViewSet, OrgBulkModelViewSet, OrgRelationMixin
|
||||||
from orgs.utils import current_org
|
from orgs.utils import current_org
|
||||||
from ops.models import CommandExecution
|
from ops.models import CommandExecution
|
||||||
|
from . import filters
|
||||||
from .models import FTPLog, UserLoginLog, OperateLog, PasswordChangeLog
|
from .models import FTPLog, UserLoginLog, OperateLog, PasswordChangeLog
|
||||||
from .serializers import FTPLogSerializer, UserLoginLogSerializer, CommandExecutionSerializer
|
from .serializers import FTPLogSerializer, UserLoginLogSerializer, CommandExecutionSerializer
|
||||||
from .serializers import OperateLogSerializer, PasswordChangeLogSerializer, CommandExecutionHostsRelationSerializer
|
from .serializers import OperateLogSerializer, PasswordChangeLogSerializer, CommandExecutionHostsRelationSerializer
|
||||||
|
@ -126,12 +127,7 @@ class CommandExecutionViewSet(ListModelMixin, OrgGenericViewSet):
|
||||||
class CommandExecutionHostRelationViewSet(OrgRelationMixin, OrgBulkModelViewSet):
|
class CommandExecutionHostRelationViewSet(OrgRelationMixin, OrgBulkModelViewSet):
|
||||||
serializer_class = CommandExecutionHostsRelationSerializer
|
serializer_class = CommandExecutionHostsRelationSerializer
|
||||||
m2m_field = CommandExecution.hosts.field
|
m2m_field = CommandExecution.hosts.field
|
||||||
filterset_fields = {
|
filterset_class = filters.CommandExecutionFilter
|
||||||
'id': ['exact'],
|
|
||||||
'asset': ['exact'],
|
|
||||||
'asset__hostname': ['icontains'],
|
|
||||||
'commandexecution': ['exact'],
|
|
||||||
}
|
|
||||||
search_fields = ('asset__hostname', )
|
search_fields = ('asset__hostname', )
|
||||||
http_method_names = ['options', 'get']
|
http_method_names = ['options', 'get']
|
||||||
rbac_perms = {
|
rbac_perms = {
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
|
from django.db.models import F, Value
|
||||||
|
from django.db.models.functions import Concat
|
||||||
|
from django_filters.rest_framework import CharFilter
|
||||||
from rest_framework import filters
|
from rest_framework import filters
|
||||||
from rest_framework.compat import coreapi, coreschema
|
from rest_framework.compat import coreapi, coreschema
|
||||||
|
|
||||||
from orgs.utils import current_org
|
from orgs.utils import current_org
|
||||||
|
from ops.models import CommandExecution
|
||||||
|
from common.drf.filters import BaseFilterSet
|
||||||
|
|
||||||
|
__all__ = ['CurrentOrgMembersFilter', 'CommandExecutionFilter']
|
||||||
__all__ = ['CurrentOrgMembersFilter']
|
|
||||||
|
|
||||||
|
|
||||||
class CurrentOrgMembersFilter(filters.BaseFilterBackend):
|
class CurrentOrgMembersFilter(filters.BaseFilterBackend):
|
||||||
|
@ -30,3 +34,22 @@ class CurrentOrgMembersFilter(filters.BaseFilterBackend):
|
||||||
else:
|
else:
|
||||||
queryset = queryset.filter(user__in=self._get_user_list())
|
queryset = queryset.filter(user__in=self._get_user_list())
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
class CommandExecutionFilter(BaseFilterSet):
|
||||||
|
hostname_ip = CharFilter(method='filter_hostname_ip')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = CommandExecution.hosts.through
|
||||||
|
fields = (
|
||||||
|
'id', 'asset', 'commandexecution', 'hostname_ip'
|
||||||
|
)
|
||||||
|
|
||||||
|
def filter_hostname_ip(self, queryset, name, value):
|
||||||
|
queryset = queryset.annotate(
|
||||||
|
hostname_ip=Concat(
|
||||||
|
F('asset__hostname'), Value('('),
|
||||||
|
F('asset__ip'), Value(')')
|
||||||
|
)
|
||||||
|
).filter(hostname_ip__icontains=value)
|
||||||
|
return queryset
|
||||||
|
|
|
@ -800,7 +800,8 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser):
|
||||||
def is_password_authenticate(self):
|
def is_password_authenticate(self):
|
||||||
cas = self.Source.cas
|
cas = self.Source.cas
|
||||||
saml2 = self.Source.saml2
|
saml2 = self.Source.saml2
|
||||||
return self.source not in [cas, saml2]
|
oauth2 = self.Source.oauth2
|
||||||
|
return self.source not in [cas, saml2, oauth2]
|
||||||
|
|
||||||
def set_unprovide_attr_if_need(self):
|
def set_unprovide_attr_if_need(self):
|
||||||
if not self.name:
|
if not self.name:
|
||||||
|
|
Loading…
Reference in New Issue