jumpserver/apps/perms/utils/asset_permission.py

84 lines
2.5 KiB
Python
Raw Normal View History

2018-04-07 16:16:37 +00:00
from collections import defaultdict
2019-03-26 11:46:04 +00:00
2018-05-31 11:47:57 +00:00
from django.db.models import Q
2016-09-16 01:38:07 +00:00
from common.utils import get_logger
Dev beta (#3048) * [Update] 统一url地址 * [Update] 修改api * [Update] 使用规范的签名 * [Update] 修改url * [Update] 修改swagger * [Update] 添加serializer class避免报错 * [Update] 修改token * [Update] 支持api key * [Update] 支持生成api key * [Update] 修改api重定向 * [Update] 修改翻译 * [Update] 添加说明文档 * [Update] 修复浏览器关闭后session不失效的问题 * [Update] 修改一些内容 * [Update] 修改 jms脚本 * [Update] 修改重定向 * [Update] 修改搜索trim * [Update] 修改搜索trim * [Update] 添加sys log * [Bugfix] 修改登陆错误 * [Update] 优化User操作private_token的接口 (#3091) * [Update] 优化User操作private_token的接口 * [Update] 优化User操作private_token的接口 2 * [Bugfix] 解决授权了一个节点,当移动节点后,被移动的节点下的资产会放到未分组节点下的问题 * [Update] 升级jquery * [Update] 默认使用page * [Update] 修改使用Orgmodel view set * [Update] 支持 nv的硬盘 https://github.com/jumpserver/jumpserver/issues/1804 * [UPdate] 解决命令执行宽度问题 * [Update] 优化节点 * [Update] 修改nodes过多时创建比较麻烦 * [Update] 修改导入 * [Update] 节点获取更新 * [Update] 修改nodes * [Update] nodes显示full value * [Update] 统一使用nodes select2 函数 * [Update] 修改磁盘大小小数 * [Update] 修改 Node service * [Update] 优化授权节点 * [Update] 修改 node permission * [Update] 修改asset permission * [Stash] * [Update] 修改node assets api * [Update] 修改tree service,支持资产数量 * [Update] 修改暂时完成 * [Update] 修改一些bug
2019-08-21 12:27:21 +00:00
from ..models import AssetPermission
from ..hands import Asset, User
from users.models import UserGroup
from perms.models.base import BasePermissionQuerySet
2017-03-09 06:55:33 +00:00
logger = get_logger(__file__)
2016-09-16 01:38:07 +00:00
2018-06-01 07:34:08 +00:00
def get_user_permissions(user, include_group=True):
if include_group:
groups = user.groups.all()
2020-02-15 12:49:20 +00:00
arg = Q(users=user) | Q(user_groups__in=groups)
else:
arg = Q(users=user)
return AssetPermission.get_queryset_with_prefetch().filter(arg)
2018-05-25 09:28:53 +00:00
2018-06-01 07:34:08 +00:00
def get_user_group_permissions(user_group):
2019-06-30 12:10:34 +00:00
return AssetPermission.get_queryset_with_prefetch().filter(
2018-06-01 07:34:08 +00:00
user_groups=user_group
)
2018-05-25 09:28:53 +00:00
2018-06-01 07:34:08 +00:00
def get_asset_permissions(asset, include_node=True):
if include_node:
nodes = asset.get_all_nodes(flat=True)
2020-02-15 12:49:20 +00:00
arg = Q(assets=asset) | Q(nodes__in=nodes)
else:
arg = Q(assets=asset)
return AssetPermission.objects.valid().filter(arg)
2018-05-25 09:28:53 +00:00
2018-04-07 16:16:37 +00:00
2018-06-01 07:34:08 +00:00
def get_node_permissions(node):
2019-06-28 14:07:22 +00:00
return AssetPermission.objects.valid().filter(nodes=node)
2018-04-07 16:16:37 +00:00
2018-06-01 07:34:08 +00:00
def get_system_user_permissions(system_user):
2019-06-28 14:07:22 +00:00
return AssetPermission.objects.valid().filter(
2018-06-01 07:34:08 +00:00
system_users=system_user
)
2018-04-07 16:16:37 +00:00
def get_asset_system_users_id_with_actions(asset_perm_queryset: BasePermissionQuerySet, asset: Asset):
nodes = asset.get_nodes()
node_keys = set()
for node in nodes:
ancestor_keys = node.get_ancestor_keys(with_self=True)
node_keys.update(ancestor_keys)
queryset = asset_perm_queryset.filter(
Q(assets=asset) |
Q(nodes__key__in=node_keys)
2019-07-02 14:08:50 +00:00
)
asset_protocols = asset.protocols_as_dict.keys()
values = queryset.filter(
system_users__protocol__in=asset_protocols
).distinct().values_list('system_users', 'actions')
system_users_actions = defaultdict(int)
for system_user_id, actions in values:
if None in (system_user_id, actions):
continue
system_users_actions[system_user_id] |= actions
return system_users_actions
def get_asset_system_users_id_with_actions_by_user(user: User, asset: Asset):
queryset = AssetPermission.objects.filter(
Q(users=user) | Q(user_groups__users=user)
)
return get_asset_system_users_id_with_actions(queryset, asset)
def get_asset_system_users_id_with_actions_by_group(group: UserGroup, asset: Asset):
queryset = AssetPermission.objects.filter(
user_groups=group
)
return get_asset_system_users_id_with_actions(queryset, asset)