mirror of https://github.com/jumpserver/jumpserver
				
				
				
			Add proxy log api
							parent
							
								
									7513474366
								
							
						
					
					
						commit
						17ade287ab
					
				| 
						 | 
				
			
			@ -7,16 +7,42 @@ from rest_framework import generics
 | 
			
		|||
import serializers
 | 
			
		||||
 | 
			
		||||
from .models import ProxyLog
 | 
			
		||||
from .hands import IsSuperUserOrTerminalUser, Terminal
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ProxyLogListCreateApi(generics.ListCreateAPIView):
 | 
			
		||||
    """User proxy to backend server need call this api.
 | 
			
		||||
 | 
			
		||||
    params: {
 | 
			
		||||
        "username": "",
 | 
			
		||||
        "name": "",
 | 
			
		||||
        "hostname": "",
 | 
			
		||||
        "ip": "",
 | 
			
		||||
        "terminal", "",
 | 
			
		||||
        "login_type": "",
 | 
			
		||||
        "system_user": "",
 | 
			
		||||
        "was_failed": "",
 | 
			
		||||
        "date_start": ""
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    some params we need generate:  {
 | 
			
		||||
        "log_file", "", # No use now, may be think more about monitor and record
 | 
			
		||||
    }
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    queryset = ProxyLog.objects.all()
 | 
			
		||||
    serializer_class = serializers.ProxyLogSerializer
 | 
			
		||||
    permission_classes = (IsSuperUserOrTerminalUser,)
 | 
			
		||||
 | 
			
		||||
    def perform_create(self, serializer):
 | 
			
		||||
        # Todo: May be save log_file
 | 
			
		||||
        super(ProxyLogListCreateApi, self).perform_create(serializer)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ProxyLogDetailApi(generics.RetrieveUpdateDestroyAPIView):
 | 
			
		||||
    queryset = ProxyLog.objects.all()
 | 
			
		||||
    serializer_class = serializers.ProxyLogSerializer
 | 
			
		||||
    permission_classes = (IsSuperUserOrTerminalUser,)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CommandLogCreateApi(generics.CreateAPIView):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
# ~*~ coding: utf-8 ~*~
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
from users.backends import IsSuperUserOrTerminalUser
 | 
			
		||||
from terminal.models import Terminal
 | 
			
		||||
| 
						 | 
				
			
			@ -17,6 +17,7 @@ class LoginLog(models.Model):
 | 
			
		|||
    username = models.CharField(max_length=20, verbose_name=_('Username'))
 | 
			
		||||
    name = models.CharField(max_length=20, blank=True, verbose_name=_('Name'))
 | 
			
		||||
    login_type = models.CharField(choices=LOGIN_TYPE_CHOICE, max_length=2, verbose_name=_('Login type'))
 | 
			
		||||
    terminal = models.CharField(max_length=32, verbose_name=_('Terminal'))
 | 
			
		||||
    login_ip = models.GenericIPAddressField(verbose_name=_('Login ip'))
 | 
			
		||||
    login_city = models.CharField(max_length=100, blank=True, null=True, verbose_name=_('Login city'))
 | 
			
		||||
    user_agent = models.CharField(max_length=100, blank=True, null=True, verbose_name=_('User agent'))
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +32,8 @@ class LoginLog(models.Model):
 | 
			
		|||
 | 
			
		||||
class ProxyLog(models.Model):
 | 
			
		||||
    LOGIN_TYPE_CHOICE = (
 | 
			
		||||
        ('S', 'ssh'),
 | 
			
		||||
        ('W', 'web'),
 | 
			
		||||
        ('S', 'SSH Terminal'),
 | 
			
		||||
        ('WT', 'Web Terminal'),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    username = models.CharField(max_length=20,  verbose_name=_('Username'))
 | 
			
		||||
| 
						 | 
				
			
			@ -40,11 +41,13 @@ class ProxyLog(models.Model):
 | 
			
		|||
    hostname = models.CharField(max_length=128, blank=True, verbose_name=_('Hostname'))
 | 
			
		||||
    ip = models.GenericIPAddressField(max_length=32, verbose_name=_('IP'))
 | 
			
		||||
    system_user = models.CharField(max_length=20, verbose_name=_('System user'))
 | 
			
		||||
    login_type = models.CharField(choices=LOGIN_TYPE_CHOICE, max_length=1, verbose_name=_('Login type'))
 | 
			
		||||
    login_type = models.CharField(choices=LOGIN_TYPE_CHOICE, max_length=2, blank=True,
 | 
			
		||||
                                  null=True, verbose_name=_('Login type'))
 | 
			
		||||
    terminal = models.CharField(max_length=32, blank=True, null=True, verbose_name=_('Terminal'))
 | 
			
		||||
    log_file = models.CharField(max_length=1000, blank=True, null=True)
 | 
			
		||||
    was_failed = models.BooleanField(default=False, verbose_name=_('Did connect failed'))
 | 
			
		||||
    is_finished = models.BooleanField(default=False, verbose_name=_('Is finished'))
 | 
			
		||||
    date_start = models.DateTimeField(auto_now_add=True, verbose_name=_('Date start'))
 | 
			
		||||
    date_start = models.DateTimeField(verbose_name=_('Date start'))
 | 
			
		||||
    date_finished = models.DateTimeField(null=True, verbose_name=_('Date finished'))
 | 
			
		||||
 | 
			
		||||
    def __unicode__(self):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,6 @@ from django.core import signing
 | 
			
		|||
from django.utils import timezone
 | 
			
		||||
 | 
			
		||||
SECRET_KEY = settings.SECRET_KEY
 | 
			
		||||
SIGNER = TimestampSigner(SECRET_KEY)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def reverse(view_name, urlconf=None, args=None, kwargs=None, current_app=None, external=False):
 | 
			
		||||
| 
						 | 
				
			
			@ -48,15 +47,17 @@ def decrypt(*args, **kwargs):
 | 
			
		|||
        return ''
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def sign(value):
 | 
			
		||||
    return SIGNER.sign(value)
 | 
			
		||||
def sign(value, secret_key=SECRET_KEY):
 | 
			
		||||
    signer = TimestampSigner(secret_key)
 | 
			
		||||
    return signer.sign(value)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def unsign(value, max_age=3600):
 | 
			
		||||
def unsign(value, max_age=3600, secret_key=SECRET_KEY):
 | 
			
		||||
    signer = TimestampSigner(secret_key)
 | 
			
		||||
    try:
 | 
			
		||||
        return SIGNER.unsign(value, max_age=max_age)
 | 
			
		||||
        return signer.unsign(value, max_age=max_age)
 | 
			
		||||
    except (BadSignature, SignatureExpired):
 | 
			
		||||
        return None
 | 
			
		||||
        return ''
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def date_expired_default():
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ except ImportError:
 | 
			
		|||
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
 | 
			
		||||
 | 
			
		||||
# SECURITY WARNING: keep the secret key used in production secret!
 | 
			
		||||
SECRET_KEY = CONFIG.SECRET_KEY or '2vym+ky!997d5kkcc64mnz06y1mmui3lut#(^wd=%s_qj$1%x'
 | 
			
		||||
SECRET_KEY = CONFIG.SECRET_KEY
 | 
			
		||||
 | 
			
		||||
# SECURITY WARNING: don't run with debug turned on in production!
 | 
			
		||||
DEBUG = CONFIG.DEBUG or False
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ class TerminalApi(ListCreateAPIView):
 | 
			
		|||
                else:
 | 
			
		||||
                    return Response(data={'data': {'name': name, 'ip': terminal.ip},
 | 
			
		||||
                                          'msg': 'Need admin accept or active it'},
 | 
			
		||||
                                    status=204)
 | 
			
		||||
                                    status=203)
 | 
			
		||||
 | 
			
		||||
            else:
 | 
			
		||||
                ip = request.META.get('X-Real-IP') or request.META.get('REMOTE_ADDR')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,10 +34,6 @@ class Terminal(models.Model):
 | 
			
		|||
    def is_terminal(self):
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def is_authenticated(self):
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        db_table = 'terminal'
 | 
			
		||||
        ordering = ['name']
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue