diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py
index 39ad7713e..8b132b350 100644
--- a/apps/assets/forms/asset.py
+++ b/apps/assets/forms/asset.py
@@ -48,7 +48,7 @@ class AssetCreateForm(OrgModelForm):
'root or other NOPASSWD sudo privilege user existed in asset,'
'If asset is windows or other set any one, more see admin user left menu'
),
- 'platform': _("* required Must set exact system platform, Windows, Linux ..."),
+ # 'platform': _("* required Must set exact system platform, Windows, Linux ..."),
'domain': _("If your have some network not connect with each other, you can set domain")
}
@@ -88,7 +88,7 @@ class AssetUpdateForm(OrgModelForm):
'root or other NOPASSWD sudo privilege user existed in asset,'
'If asset is windows or other set any one, more see admin user left menu'
),
- 'platform': _("* required Must set exact system platform, Windows, Linux ..."),
+ # 'platform': _("* required Must set exact system platform, Windows, Linux ..."),
'domain': _("If your have some network not connect with each other, you can set domain")
}
diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py
index be7a98ebf..646b7204f 100644
--- a/apps/assets/models/user.py
+++ b/apps/assets/models/user.py
@@ -119,6 +119,8 @@ class SystemUser(AssetUser):
shell = models.CharField(max_length=64, default='/bin/bash', verbose_name=_('Shell'))
login_mode = models.CharField(choices=LOGIN_MODE_CHOICES, default=AUTO_LOGIN, max_length=10, verbose_name=_('Login mode'))
+ cache_key = "__SYSTEM_USER_CACHED_{}"
+
def __str__(self):
return '{0.name}({0.username})'.format(self)
@@ -155,6 +157,24 @@ class SystemUser(AssetUser):
else:
return False
+ def set_cache(self):
+ cache.set(self.cache_key.format(self.id), self, 3600)
+
+ def expire_cache(self):
+ cache.delete(self.cache_key.format(self.id))
+
+ @classmethod
+ def get_system_user_by_id_or_cached(cls, sid):
+ cached = cache.get(cls.cache_key.format(sid))
+ if cached:
+ return cached
+ try:
+ system_user = cls.objects.get(id=sid)
+ system_user.set_cache()
+ return system_user
+ except cls.DoesNotExist:
+ return None
+
class Meta:
ordering = ['name']
unique_together = [('name', 'org_id')]
diff --git a/apps/assets/templates/assets/asset_create.html b/apps/assets/templates/assets/asset_create.html
index 55e233d0d..2a3d62b3d 100644
--- a/apps/assets/templates/assets/asset_create.html
+++ b/apps/assets/templates/assets/asset_create.html
@@ -15,10 +15,10 @@
{% csrf_token %}
{% trans 'Basic' %}
{% bootstrap_field form.hostname layout="horizontal" %}
- {% bootstrap_field form.platform layout="horizontal" %}
{% bootstrap_field form.ip layout="horizontal" %}
{% bootstrap_field form.protocol layout="horizontal" %}
{% bootstrap_field form.port layout="horizontal" %}
+ {% bootstrap_field form.platform layout="horizontal" %}
{% bootstrap_field form.public_ip layout="horizontal" %}
{% bootstrap_field form.domain layout="horizontal" %}
diff --git a/apps/common/forms.py b/apps/common/forms.py
index a11420498..8667aa128 100644
--- a/apps/common/forms.py
+++ b/apps/common/forms.py
@@ -181,7 +181,7 @@ class SecuritySettingForm(BaseForm):
)
# limit login count
SECURITY_LOGIN_LIMIT_COUNT = forms.IntegerField(
- initial=3, min_value=3,
+ initial=7, min_value=3,
label=_("Limit the number of login failures")
)
# limit login time
diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py
index 5d60f7a15..ff69c9621 100644
--- a/apps/jumpserver/settings.py
+++ b/apps/jumpserver/settings.py
@@ -411,7 +411,7 @@ TERMINAL_REPLAY_STORAGE = {
DEFAULT_PASSWORD_MIN_LENGTH = 6
-DEFAULT_LOGIN_LIMIT_COUNT = 3
+DEFAULT_LOGIN_LIMIT_COUNT = 7
DEFAULT_LOGIN_LIMIT_TIME = 30
# Django bootstrap3 setting, more see http://django-bootstrap3.readthedocs.io/en/latest/settings.html
diff --git a/apps/terminal/api.py b/apps/terminal/api.py
index 2e7778514..175ccd580 100644
--- a/apps/terminal/api.py
+++ b/apps/terminal/api.py
@@ -4,7 +4,6 @@ from collections import OrderedDict
import logging
import os
import uuid
-import copy
from django.core.cache import cache
from django.shortcuts import get_object_or_404, redirect
@@ -16,12 +15,13 @@ from django.conf import settings
import jms_storage
-from rest_framework import viewsets, serializers
+from rest_framework import viewsets
from rest_framework.views import APIView, Response
from rest_framework.permissions import AllowAny
from rest_framework_bulk import BulkModelViewSet
-from common.utils import get_object_or_none
+from common.utils import get_object_or_none, is_uuid
+from .hands import SystemUser
from .models import Terminal, Status, Session, Task
from .serializers import TerminalSerializer, StatusSerializer, \
SessionSerializer, TaskSerializer, ReplaySerializer
@@ -186,8 +186,13 @@ class SessionViewSet(viewsets.ModelViewSet):
return self.queryset
def perform_create(self, serializer):
- if self.request.user.terminal:
+ if hasattr(self.request.user, 'terminal'):
serializer.validated_data["terminal"] = self.request.user.terminal
+ sid = serializer.validated_data["system_user"]
+ if is_uuid(sid):
+ _system_user = SystemUser.get_system_user_by_id_or_cached(sid)
+ if _system_user:
+ serializer.validated_data["system_user"] = _system_user.name
return super().perform_create(serializer)
diff --git a/apps/terminal/templates/terminal/session_list.html b/apps/terminal/templates/terminal/session_list.html
index 6961c99b9..c27b2f8a7 100644
--- a/apps/terminal/templates/terminal/session_list.html
+++ b/apps/terminal/templates/terminal/session_list.html
@@ -58,7 +58,7 @@
diff --git a/apps/terminal/templatetags/terminal_tags.py b/apps/terminal/templatetags/terminal_tags.py
index c5643c67b..e8ba23186 100644
--- a/apps/terminal/templatetags/terminal_tags.py
+++ b/apps/terminal/templatetags/terminal_tags.py
@@ -1,6 +1,7 @@
# ~*~ coding: utf-8 ~*~
from django import template
+
from ..backends import get_multi_command_storage
register = template.Library()
@@ -10,3 +11,4 @@ command_store = get_multi_command_storage()
@register.filter
def get_session_command_amount(session_id):
return command_store.count(session=session_id)
+
diff --git a/utils/2018_07_15_set_win_protocol_to_ssh.sh b/utils/2018_07_15_set_win_protocol_to_ssh.sh
new file mode 100644
index 000000000..6d8596244
--- /dev/null
+++ b/utils/2018_07_15_set_win_protocol_to_ssh.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+#
+
+python ../apps/manage.py shell << EOF
+from assets.models import Asset
+
+Asset.objects.filter(platform__startswith='Win').update(protocol='rdp')
+
+EOF
diff --git a/utils/unblock_all_user.sh b/utils/unblock_all_user.sh
new file mode 100644
index 000000000..6fe4e3356
--- /dev/null
+++ b/utils/unblock_all_user.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+#
+
+python ../apps/manage.py shell << EOF
+from django.core.cache import cache
+
+cache.delete_pattern('_LOGIN_BLOCK_*')
+cache.delete_pattern('_LOGIN_LIMIT_*')
+
+EOF