• 老广's avatar
    Bugfix (#2831) · 58875d9a
    老广 authored
    * [Update] 修改小问题
    
    * [Update] 添加重传guacamole的脚本
    
    * [Update] 添加debug
    
    * [Update] 优化可连接性
    
    * [Update] 修改connectivity
    
    * [Update] 更改查看认证需要的MFA时间间隔
    
    * [Update] 修改表结构
    
    * [Update] 修改users public_key等字段
    
    * [Update] 修改用户表结构
    
    * [Update] 修改assets users api
    
    * [Update] 修改org mixin
    
    * [Update] 解决连接windows资产出现幽灵会话的问题
    
    * [Update] 优化树结构
    
    * [Update] 修改Permission
    
    * Stash
    
    * [Update] 修改serializer
    
    * [Update] 修改用户有权限的资产
    
    * [Update] 修改upgrouped_node key的获取(解决操作日志中出现coco/gua的问题)
    
    * [Update] 修改一些bug
    
    * [Update] Debug cache
    
    * [Bugfix] 修复用户页面不走cache的bug
    
    * ipython
    
    * [Update] 修改action
    
    * [Bugfix] 修改校验系统用户资产动作权限的API逻辑
    
    * [Update] 去掉原来批量的view
    
    * [Bugfix] 会话/命令列表中获取用户列表排除app用户
    
    * [Update] 修改用户授权资产API返回的queryset
    
    * [Update] 修正migrations
    
    * [Bugfix] 解决进入授权详情页的资产管理页面bug
    
    * [Update] 修改Minxs
    
    * [Update] 修改migrations
    
    * [Update] 资产授权Model模块添加导入
    
    * [Update] 优化命令记录列表
    
    * [Update] 修改command列表
    
    * [Update] 解决用户授权资产/节点为空时,前端构建资产授权树的bug (#2874)
    
    * [Update] 解决用户授权资产/节点为空时,前端构建资产授权树的bug
    
    * [Update] 如果用户授权节点为空,返回时添加空节点
    
    * [Update] 修改command导出和搜索
    
    * [Update] 修改session
    
    * [Update] 修改Permission响应层缓存key
    
    * [Update] 准备优化 asset user
    
    * [Update] 修改去掉一些print
    
    * [Bugfix] 修复initDataTable表格搜索栏位置错乱的问题,显示不友好问题 (#2880)
    
    * [Bugfix] 修复创建用户的View,使用密码创建用户时没有校验密码规则 (#2877)
    
    * [Bugfix] 修复创建用户的View,使用密码创建用户时没有校验密码规则
    
    * [Bugfix]修复小问题
    
    * [Update] 优化创建用户和更新用户密码的校验
    
    * [Update] 优化用户表单校验password逻辑
    
    * [Update] 小问题
    
    * [Update] 修改command搜索
    
    * [Update] 修改user group serialzier
    
    * [Update] 优化资产
    
    * [Update] 优化节点
    
    * [Update] 优化用户组列表用户显示问题 (#2882)
    
    * [Update] 解决select_for_update的错误
    
    * [update] 修改Node无法被删除的bug
    
    * [Update] 添加翻译
    
    * [update] 修改资产导出的permssions
    
    * [Bugfix] 修复删除节点bug (#2883)
    
    * [update] 修改一些性能问题
    Unverified
    58875d9a
permissions.py 5.04 KB
# -*- coding: utf-8 -*-
#
import time

from rest_framework import permissions
from django.contrib.auth.mixins import UserPassesTestMixin
from django.shortcuts import redirect
from django.http.response import HttpResponseForbidden
from django.conf import settings

from orgs.utils import current_org


class IsValidUser(permissions.IsAuthenticated, permissions.BasePermission):
    """Allows access to valid user, is active and not expired"""

    def has_permission(self, request, view):
        return super(IsValidUser, self).has_permission(request, view) \
            and request.user.is_valid


class IsAppUser(IsValidUser):
    """Allows access only to app user """

    def has_permission(self, request, view):
        return super(IsAppUser, self).has_permission(request, view) \
            and request.user.is_app


class IsAuditor(IsValidUser):
    def has_permission(self, request, view):
        return super(IsAuditor, self).has_permission(request, view) \
               and request.user.is_auditor


class IsSuperUser(IsValidUser):
    def has_permission(self, request, view):
        return super(IsSuperUser, self).has_permission(request, view) \
               and request.user.is_superuser


class IsSuperUserOrAppUser(IsSuperUser):
    def has_permission(self, request, view):
        return super(IsSuperUserOrAppUser, self).has_permission(request, view) \
            or request.user.is_app


class IsOrgAdmin(IsValidUser):
    """Allows access only to superuser"""

    def has_permission(self, request, view):
        return super(IsOrgAdmin, self).has_permission(request, view) \
            and current_org.can_admin_by(request.user)


class IsOrgAdminOrAppUser(IsValidUser):
    """Allows access between superuser and app user"""

    def has_permission(self, request, view):
        return super(IsOrgAdminOrAppUser, self).has_permission(request, view) \
            and (current_org.can_admin_by(request.user) or request.user.is_app)


class IsOrgAdminOrAppUserOrUserReadonly(IsOrgAdminOrAppUser):
    def has_permission(self, request, view):
        if IsValidUser.has_permission(self, request, view) \
                and request.method in permissions.SAFE_METHODS:
            return True
        else:
            return IsOrgAdminOrAppUser.has_permission(self, request, view)


class IsCurrentUserOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj == request.user


class LoginRequiredMixin(UserPassesTestMixin):
    def test_func(self):
        if self.request.user.is_authenticated:
            return True
        else:
            return False


class AdminUserRequiredMixin(UserPassesTestMixin):
    def test_func(self):
        if not self.request.user.is_authenticated:
            return False
        elif not current_org.can_admin_by(self.request.user):
            self.raise_exception = True
            return False
        return True

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return super().dispatch(request, *args, **kwargs)

        if not current_org:
            return redirect('orgs:switch-a-org')

        if not current_org.can_admin_by(request.user):
            if request.user.is_org_admin:
                return redirect('orgs:switch-a-org')
            return HttpResponseForbidden()
        return super().dispatch(request, *args, **kwargs)


class SuperUserRequiredMixin(UserPassesTestMixin):
    def test_func(self):
        if self.request.user.is_authenticated and self.request.user.is_superuser:
            return True


class WithBootstrapToken(permissions.BasePermission):
    def has_permission(self, request, view):
        authorization = request.META.get('HTTP_AUTHORIZATION', '')
        if not authorization:
            return False
        request_bootstrap_token = authorization.split()[-1]
        return settings.BOOTSTRAP_TOKEN == request_bootstrap_token


class PermissionsMixin(UserPassesTestMixin):
    permission_classes = []

    def get_permissions(self):
        return self.permission_classes

    def test_func(self):
        permission_classes = self.get_permissions()
        for permission_class in permission_classes:
            if not permission_class().has_permission(self.request, self):
                return False
        return True


class NeedMFAVerify(permissions.BasePermission):
    def has_permission(self, request, view):
        mfa_verify_time = request.session.get('MFA_VERIFY_TIME', 0)
        if time.time() - mfa_verify_time < settings.SECURITY_MFA_VERIFY_TTL:
            return True
        return False


class CanUpdateSuperUser(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in ['GET', 'OPTIONS']:
            return True
        if str(request.user.id) == str(obj.id):
            return False
        if request.user.is_superuser:
            return True
        if hasattr(obj, 'is_superuser') and obj.is_superuser:
            return False
        return True