jumpserver/apps/terminal/models/sharing.py
fit2bot e259d2a9e9
fix: fix rbac to dev (#7636)
* feat: 添加 RBAC 应用模块

* feat: 添加 RBAC Model、API

* feat: 添加 RBAC Model、API 2

* feat: 添加 RBAC Model、API 3

* feat: 添加 RBAC Model、API 4

* feat: RBAC

* feat: RBAC

* feat: RBAC

* feat: RBAC

* feat: RBAC

* feat: RBAC 整理权限位

* feat: RBAC 整理权限位2

* feat: RBAC 整理权限位2

* feat: RBAC 整理权限位

* feat: RBAC 添加默认角色

* feat: RBAC 添加迁移文件;迁移用户角色->用户角色绑定

* feat: RBAC 添加迁移文件;迁移用户角色->用户角色绑定

* feat: RBAC 修改用户模块API

* feat: RBAC 添加组织模块迁移文件 & 修改组织模块API

* feat: RBAC 添加组织模块迁移文件 & 修改组织模块API

* feat: RBAC 修改用户角色属性的使用

* feat: RBAC No.1

* xxx

* perf: 暂存

* perf: ...

* perf(rbac): 添加 perms 到 profile serializer 中

* stash

* perf: 使用init

* perf: 修改migrations

* perf: rbac

* stash

* stash

* pref: 修改rbac

* stash it

* stash: 先去修复其他bug

* perf: 修改 role 添加 users

* pref: 修改 RBAC Model

* feat: 添加权限的 tree api

* stash: 暂存一下

* stash: 暂存一下

* perf: 修改 model verbose name

* feat: 添加model各种 verbose name

* perf: 生成 migrations

* perf: 优化权限位

* perf: 添加迁移脚本

* feat: 添加组织角色迁移

* perf: 添加迁移脚本

* stash

* perf: 添加migrateion

* perf: 暂存一下

* perf: 修改rbac

* perf: stash it

* fix: 迁移冲突

* fix: 迁移冲突

* perf: 暂存一下

* perf: 修改 rbac 逻辑

* stash: 暂存一下

* perf: 修改内置角色

* perf: 解决 root 组织的问题

* perf: stash it

* perf: 优化 rbac

* perf: 优化 rolebinding 处理

* perf: 完成用户离开组织的问题

* perf: 暂存一下

* perf: 修改翻译

* perf: 去掉了 IsSuperUser

* perf: IsAppUser 去掉完成

* perf: 修改 connection token 的权限

* perf: 去掉导入的问题

* perf: perms define 格式,修改 app 用户 的全新啊

* perf: 修改 permission

* perf: 去掉一些 org admin

* perf: 去掉部分 org admin

* perf: 再去掉点 org admin role

* perf: 再去掉部分 org admin

* perf: user 角色搜索

* perf: 去掉很多 js

* perf: 添加权限位

* perf: 修改权限

* perf: 去掉一个 todo

* merge: with dev

* fix: 修复冲突

Co-authored-by: Bai <bugatti_it@163.com>
Co-authored-by: Michael Bai <baijiangjie@gmail.com>
Co-authored-by: ibuler <ibuler@qq.com>
2022-02-17 20:13:31 +08:00

132 lines
3.9 KiB
Python

import datetime
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from common.mixins import CommonModelMixin
from orgs.mixins.models import OrgModelMixin
from .session import Session
__all__ = ['SessionSharing', 'SessionJoinRecord']
class SessionSharing(CommonModelMixin, OrgModelMixin):
session = models.ForeignKey(
'terminal.Session', on_delete=models.CASCADE, verbose_name=_('Session')
)
# creator / created_by
creator = models.ForeignKey(
'users.User', on_delete=models.CASCADE, blank=True, null=True,
verbose_name=_('Creator')
)
verify_code = models.CharField(max_length=16, verbose_name=_('Verify code'))
is_active = models.BooleanField(
default=True, verbose_name=_('Active'), db_index=True
)
expired_time = models.IntegerField(
default=0, verbose_name=_('Expired time (min)'), db_index=True
)
class Meta:
ordering = ('-date_created', )
verbose_name = _('Session sharing')
permissions = [
('add_supersessionsharing', _("Can add super session sharing"))
]
def __str__(self):
return 'Creator: {}'.format(self.creator)
@property
def date_expired(self):
return self.date_created + datetime.timedelta(minutes=self.expired_time)
@property
def is_expired(self):
if timezone.now() > self.date_expired:
return False
return True
def can_join(self):
if not self.is_active:
return False, _('Link not active')
if not self.is_expired:
return False, _('Link expired')
return True, ''
class SessionJoinRecord(CommonModelMixin, OrgModelMixin):
LOGIN_FROM = Session.LOGIN_FROM
session = models.ForeignKey(
'terminal.Session', on_delete=models.CASCADE, verbose_name=_('Session')
)
verify_code = models.CharField(max_length=16, verbose_name=_('Verify code'))
sharing = models.ForeignKey(
SessionSharing, on_delete=models.CASCADE,
verbose_name=_('Session sharing')
)
joiner = models.ForeignKey(
'users.User', on_delete=models.CASCADE, blank=True, null=True,
verbose_name=_('Joiner')
)
date_joined = models.DateTimeField(
auto_now_add=True, verbose_name=_("Date joined"), db_index=True,
)
date_left = models.DateTimeField(
verbose_name=_("Date left"), null=True, db_index=True
)
remote_addr = models.CharField(
max_length=128, verbose_name=_("Remote addr"), blank=True, null=True,
db_index=True
)
login_from = models.CharField(
max_length=2, choices=LOGIN_FROM.choices, default="WT",
verbose_name=_("Login from")
)
is_success = models.BooleanField(
default=True, db_index=True, verbose_name=_('Success')
)
reason = models.CharField(
max_length=1024, default='-', blank=True, null=True,
verbose_name=_('Reason')
)
is_finished = models.BooleanField(
default=False, db_index=True, verbose_name=_('Finished')
)
class Meta:
ordering = ('-date_joined', )
verbose_name = _("Session join record")
def __str__(self):
return 'Joiner: {}'.format(self.joiner)
@property
def joiner_display(self):
return str(self.joiner)
def can_join(self):
# sharing
sharing_can_join, reason = self.sharing.can_join()
if not sharing_can_join:
return False, reason
# self
if self.verify_code != self.sharing.verify_code:
return False, _('Invalid verification code')
return True, ''
def join_failed(self, reason):
self.is_success = False
self.reason = reason[:1024]
self.save()
def finished(self):
if self.is_finished:
return
self.date_left = timezone.now()
self.is_finished = True
self.save()