mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-20 02:51:27 +00:00
merge: with dev
This commit is contained in:
18
apps/terminal/migrations/0064_sessionsharing_origin.py
Normal file
18
apps/terminal/migrations/0064_sessionsharing_origin.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.10 on 2023-07-26 10:55
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('terminal', '0063_auto_20230621_1133'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='sessionsharing',
|
||||
name='origin',
|
||||
field=models.URLField(blank=True, null=True, verbose_name='Origin'),
|
||||
),
|
||||
]
|
@@ -3,6 +3,7 @@ import datetime
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.utils.functional import cached_property
|
||||
|
||||
from common.db.models import JMSBaseModel
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
@@ -30,10 +31,10 @@ class SessionSharing(JMSBaseModel, OrgModelMixin):
|
||||
default=0, verbose_name=_('Expired time (min)'), db_index=True
|
||||
)
|
||||
users = models.TextField(blank=True, verbose_name=_("User"))
|
||||
|
||||
action_permission = models.CharField(
|
||||
max_length=16, verbose_name=_('Action permission'), default='writable'
|
||||
)
|
||||
origin = models.URLField(blank=True, null=True, verbose_name=_('Origin'))
|
||||
|
||||
class Meta:
|
||||
ordering = ('-date_created',)
|
||||
@@ -45,15 +46,24 @@ class SessionSharing(JMSBaseModel, OrgModelMixin):
|
||||
def __str__(self):
|
||||
return 'Creator: {}'.format(self.creator)
|
||||
|
||||
@cached_property
|
||||
def url(self):
|
||||
return '%s/koko/share/%s/' % (self.origin, self.id)
|
||||
|
||||
@cached_property
|
||||
def users_display(self):
|
||||
if not self.users:
|
||||
return []
|
||||
with tmp_to_root_org():
|
||||
user_ids = self.users.split(',')
|
||||
users = User.objects.filter(id__in=user_ids)
|
||||
users = self.users_queryset
|
||||
users = [str(user) for user in users]
|
||||
return users
|
||||
|
||||
@cached_property
|
||||
def users_queryset(self):
|
||||
user_ids = self.users.split(',')
|
||||
return User.objects.filter(id__in=user_ids)
|
||||
|
||||
@property
|
||||
def date_expired(self):
|
||||
return self.date_created + datetime.timedelta(minutes=self.expired_time)
|
||||
|
@@ -255,3 +255,27 @@ class StorageConnectivityMessage(SystemMessage):
|
||||
'subject': subject,
|
||||
'message': message
|
||||
}
|
||||
|
||||
|
||||
class SessionSharingMessage(UserMessage):
|
||||
message_type_label = _('Session sharing')
|
||||
|
||||
def __init__(self, user, instance):
|
||||
super().__init__(user)
|
||||
self.instance = instance
|
||||
|
||||
def get_html_msg(self) -> dict:
|
||||
instance = self.instance
|
||||
context = {
|
||||
'asset': instance.session.asset,
|
||||
'created_by': instance.created_by,
|
||||
'account': instance.session.account,
|
||||
'url': instance.url,
|
||||
'verify_code': instance.verify_code,
|
||||
'org': instance.org_name,
|
||||
}
|
||||
message = render_to_string('terminal/_msg_session_sharing.html', context)
|
||||
return {
|
||||
'subject': self.message_type_label + ' ' + self.instance.created_by,
|
||||
'message': message
|
||||
}
|
||||
|
@@ -26,7 +26,7 @@ class SessionSharingSerializer(OrgResourceModelSerializerMixin):
|
||||
fields_small = fields_mini + [
|
||||
'verify_code', 'is_active', 'expired_time', 'created_by',
|
||||
'date_created', 'date_updated', 'users', 'users_display',
|
||||
'action_permission'
|
||||
'action_permission', 'origin', 'url',
|
||||
]
|
||||
fields_fk = ['session', 'creator']
|
||||
fields = fields_small + fields_fk
|
||||
|
@@ -1,3 +1,4 @@
|
||||
from .applet import *
|
||||
from .db_port import *
|
||||
from .terminal import *
|
||||
from .session_sharing import *
|
||||
|
13
apps/terminal/signal_handlers/session_sharing.py
Normal file
13
apps/terminal/signal_handlers/session_sharing.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from django.db.models.signals import post_save
|
||||
from django.dispatch import receiver
|
||||
|
||||
from terminal.models import SessionSharing
|
||||
from terminal.notifications import SessionSharingMessage
|
||||
|
||||
|
||||
@receiver(post_save, sender=SessionSharing)
|
||||
def on_session_sharing_created(sender, instance: SessionSharing, created, **kwargs):
|
||||
if not created:
|
||||
return
|
||||
for user in instance.users_queryset:
|
||||
SessionSharingMessage(user, instance).publish_async()
|
16
apps/terminal/templates/terminal/_msg_session_sharing.html
Normal file
16
apps/terminal/templates/terminal/_msg_session_sharing.html
Normal file
@@ -0,0 +1,16 @@
|
||||
{% load i18n %}
|
||||
|
||||
<div>
|
||||
<b>{% trans 'Asset' %}: </b> <span>{{ asset }}</span>
|
||||
<br/>
|
||||
<b>{% trans 'User' %}: </b> <span>{{ created_by }}</span>
|
||||
<br/>
|
||||
<b>{% trans 'Account' %}: </b> <span>{{ account }}</span>
|
||||
<br/>
|
||||
<b>{% trans 'Session sharing URL' %}: </b><a href="{{ url }}" target="_blank">{% trans 'View' %}</a>
|
||||
<br/>
|
||||
<b>{% trans 'Verify code' %}: </b> <span>{{ verify_code }}</span>
|
||||
<br/>
|
||||
<b>{% trans 'Organization' %}: </b> <span>{{ org }}</span>
|
||||
<br/>
|
||||
</div>
|
Reference in New Issue
Block a user