diff --git a/apps/assets/models/domain.py b/apps/assets/models/domain.py index 5deefc35c..9bee7f77e 100644 --- a/apps/assets/models/domain.py +++ b/apps/assets/models/domain.py @@ -75,7 +75,8 @@ class Gateway(AssetUser): pkey=self.private_key_obj) except(paramiko.AuthenticationException, paramiko.BadAuthenticationType, - paramiko.SSHException) as e: + paramiko.SSHException, + paramiko.ssh_exception.NoValidConnectionsError) as e: return False, str(e) try: diff --git a/apps/assets/serializers/cmd_filter.py b/apps/assets/serializers/cmd_filter.py index bd925fd9d..1b90ce439 100644 --- a/apps/assets/serializers/cmd_filter.py +++ b/apps/assets/serializers/cmd_filter.py @@ -35,12 +35,12 @@ class CommandFilterRuleSerializer(BulkOrgResourceModelSerializer): fields = '__all__' list_serializer_class = AdaptedBulkListSerializer - def validate_content(self, content): - tp = self.initial_data.get("type") - if tp == CommandFilterRule.TYPE_REGEX: - return content - if self.invalid_pattern.search(content): - invalid_char = self.invalid_pattern.pattern.replace('\\', '') - msg = _("Content should not be contain: {}").format(invalid_char) - raise serializers.ValidationError(msg) - return content + # def validate_content(self, content): + # tp = self.initial_data.get("type") + # if tp == CommandFilterRule.TYPE_REGEX: + # return content + # if self.invalid_pattern.search(content): + # invalid_char = self.invalid_pattern.pattern.replace('\\', '') + # msg = _("Content should not be contain: {}").format(invalid_char) + # raise serializers.ValidationError(msg) + # return content diff --git a/apps/assets/templates/assets/admin_user_list.html b/apps/assets/templates/assets/admin_user_list.html index 2212fd82f..b49c81b85 100644 --- a/apps/assets/templates/assets/admin_user_list.html +++ b/apps/assets/templates/assets/admin_user_list.html @@ -117,7 +117,7 @@ function initTable() { columns: [ {data: function(){return ""}}, {data: "name"}, {data: "username" }, {data: "assets_amount", orderable: false}, {#{data: "connectivity_amount"}, {data: "connectivity_amount"}, {data: "connectivity_amount"},#} - {data: "comment"}, {data: "id"} + {data: "comment"}, {data: "id", orderable: false} ] }; admin_user_table = jumpserver.initServerSideDataTable(options); diff --git a/apps/assets/templates/assets/cmd_filter_list.html b/apps/assets/templates/assets/cmd_filter_list.html index c7f8e7d3e..b6d46a2c8 100644 --- a/apps/assets/templates/assets/cmd_filter_list.html +++ b/apps/assets/templates/assets/cmd_filter_list.html @@ -62,8 +62,8 @@ function initTable() { ], ajax_url: '{% url "api-assets:cmd-filter-list" %}', columns: [ - {data: "id"}, {data: "name" }, {data: "rules" }, - {data: "system_users" }, {data: "comment"}, {data: "id"} + {data: "id"}, {data: "name" }, {data: "rules", orderable: false}, + {data: "system_users", orderable: false}, {data: "comment"}, {data: "id", orderable: false} ], op_html: $('#actions').html() }; diff --git a/apps/assets/templates/assets/cmd_filter_rule_list.html b/apps/assets/templates/assets/cmd_filter_rule_list.html index 78c3a36d5..e2452c391 100644 --- a/apps/assets/templates/assets/cmd_filter_rule_list.html +++ b/apps/assets/templates/assets/cmd_filter_rule_list.html @@ -90,8 +90,8 @@ function initTable() { ], ajax_url: '{% url "api-assets:cmd-filter-rule-list" filter_pk=object.id %}', columns: [ - {data: "id"}, {data: "type.display" }, {data: 'content'}, {data: 'priority'}, - {data: 'action.display'}, {data: "comment" }, {data: "id"} + {data: "id"}, {data: "type.display", orderable: false }, {data: 'content'}, {data: 'priority'}, + {data: 'action.display', orderable: false}, {data: "comment" }, {data: "id", orderable: false} ], op_html: $('#actions').html() }; diff --git a/apps/assets/templates/assets/domain_detail.html b/apps/assets/templates/assets/domain_detail.html index 06fd0d28d..c05e0ed80 100644 --- a/apps/assets/templates/assets/domain_detail.html +++ b/apps/assets/templates/assets/domain_detail.html @@ -31,7 +31,7 @@
-
+
{{ object.name }} diff --git a/apps/assets/templates/assets/domain_gateway_list.html b/apps/assets/templates/assets/domain_gateway_list.html index eb348141e..f7a9c8d60 100644 --- a/apps/assets/templates/assets/domain_gateway_list.html +++ b/apps/assets/templates/assets/domain_gateway_list.html @@ -106,7 +106,7 @@ function initTable() { ajax_url: '{% url "api-assets:gateway-list" %}?domain={{ object.id }}', columns: [ {data: "id"}, {data: "name" }, {data: 'ip'}, {data: 'port'}, - {data: "protocol"}, {data: "username" }, {data: "comment" }, {data: "id"} + {data: "protocol", orderable: false}, {data: "username" }, {data: "comment" }, {data: "id", orderable: false} ], op_html: $('#actions').html() }; diff --git a/apps/assets/templates/assets/domain_list.html b/apps/assets/templates/assets/domain_list.html index 5cd717535..6a0f36f40 100644 --- a/apps/assets/templates/assets/domain_list.html +++ b/apps/assets/templates/assets/domain_list.html @@ -58,8 +58,8 @@ function initTable() { ], ajax_url: '{% url "api-assets:domain-list" %}', columns: [ - {data: "id"}, {data: "name" }, {data: "asset_count" }, - {data: "gateway_count" }, {data: "comment" }, {data: "id"} + {data: "id"}, {data: "name" }, {data: "asset_count", orderable: false }, + {data: "gateway_count", orderable: false }, {data: "comment" }, {data: "id", orderable: false} ], op_html: $('#actions').html() }; diff --git a/apps/assets/templates/assets/label_list.html b/apps/assets/templates/assets/label_list.html index 3cb90788a..7d780deed 100644 --- a/apps/assets/templates/assets/label_list.html +++ b/apps/assets/templates/assets/label_list.html @@ -44,7 +44,7 @@ function initTable() { ajax_url: '{% url "api-assets:label-list" %}?sort=name', columns: [ {data: "id"}, {data: "name" }, {data: "value" }, - {data: "asset_count" }, {data: "id"} + {data: "asset_count", orderable: false}, {data: "id", orderable: false} ], op_html: $('#actions').html() }; diff --git a/apps/audits/templates/audits/ftp_log_list.html b/apps/audits/templates/audits/ftp_log_list.html index f0d9df753..91ea6c49d 100644 --- a/apps/audits/templates/audits/ftp_log_list.html +++ b/apps/audits/templates/audits/ftp_log_list.html @@ -113,7 +113,8 @@ "searching": false, "paging": false, "bInfo" : false, - "order": [] + "order": [], + "columnDefs": [{"targets": 6, "orderable": false}] }); $('.select2').select2({ dropdownAutoWidth: true, diff --git a/apps/ops/templates/ops/task_adhoc.html b/apps/ops/templates/ops/task_adhoc.html index 34e0797e6..95eb8f471 100644 --- a/apps/ops/templates/ops/task_adhoc.html +++ b/apps/ops/templates/ops/task_adhoc.html @@ -120,8 +120,8 @@ $(document).ready(function () { }} ], ajax_url: '{% url "api-ops:adhoc-list" %}?task={{ object.pk }}', - columns: [{data: function(){return ""}}, {data: "short_id" }, {data: "hosts"}, {data: "pattern"}, - {data: "run_as"}, {data: "become"}, {data: "date_created"}, {data: "id"}] + columns: [{data: function(){return ""}}, {data: "short_id" }, {data: "hosts", orderable:false}, {data: "pattern", orderable:false}, + {data: "run_as"}, {data: "become", orderable:false}, {data: "date_created"}, {data: "id", orderable:false}] }; jumpserver.initDataTable(options); }).on('click', '.celery-task-log', function () { diff --git a/apps/ops/templates/ops/task_history.html b/apps/ops/templates/ops/task_history.html index 9a63acc6a..9aa73c176 100644 --- a/apps/ops/templates/ops/task_history.html +++ b/apps/ops/templates/ops/task_history.html @@ -140,8 +140,8 @@ function initTable() { }} ], ajax_url: '{% url "api-ops:history-list" %}?task={{ object.pk }}', - columns: [{data: function(){return ""}}, {data: "date_start"}, {data: "stat"}, {data: "stat"}, {data: "is_finished"}, - {data: "is_success"}, {data: "timedelta"}, {data: 'adhoc_short_id'}, {data: "id"}] + columns: [{data: function(){return ""}}, {data: "date_start"}, {data: "stat", orderable:false}, {data: "stat", orderable:false}, {data: "is_finished"}, + {data: "is_success"}, {data: "timedelta"}, {data: 'adhoc_short_id'}, {data: "id", orderable:false}] }; jumpserver.initDataTable(options); } diff --git a/apps/ops/templates/ops/task_list.html b/apps/ops/templates/ops/task_list.html index ae8c45043..965c62b8a 100644 --- a/apps/ops/templates/ops/task_list.html +++ b/apps/ops/templates/ops/task_list.html @@ -75,7 +75,13 @@ $(document).ready(function() { "searching": false, "paging": false, "bInfo" : false, - "order": [] + "order": [], + "columnDefs": [ + { "targets": 0, "orderable": false }, + { "targets": 4, "orderable": false }, + { "targets": 5, "orderable": false }, + { "targets": 8, "orderable": false } + ] }); $('.select2').select2({ dropdownAutoWidth : true, diff --git a/apps/perms/api/mixin.py b/apps/perms/api/mixin.py index 17c7c833d..879965d4a 100644 --- a/apps/perms/api/mixin.py +++ b/apps/perms/api/mixin.py @@ -6,6 +6,8 @@ from django.core.cache import cache from django.db.models import Q from django.conf import settings from rest_framework.views import Response +from django.utils.decorators import method_decorator +from django.views.decorators.http import condition from django.utils.translation import ugettext as _ from common.utils import get_logger @@ -14,7 +16,7 @@ from ..utils import ( AssetPermissionUtil ) from .. import const -from ..hands import Asset, Node, SystemUser, Label +from ..hands import Asset, Node, SystemUser from .. import serializers logger = get_logger(__name__) @@ -22,6 +24,17 @@ logger = get_logger(__name__) __all__ = ['UserPermissionCacheMixin', 'GrantAssetsMixin', 'NodesWithUngroupMixin'] +def get_etag(request, *args, **kwargs): + cache_policy = request.GET.get("cache_policy") + if cache_policy != '1': + return None + view = request.parser_context.get("view") + if not view: + return None + etag = view.get_meta_cache_id() + return etag + + class UserPermissionCacheMixin: cache_policy = '0' RESP_CACHE_KEY = '_PERMISSION_RESPONSE_CACHE_V2_{}' @@ -96,6 +109,7 @@ class UserPermissionCacheMixin: cache.set(key, response.data, self.CACHE_TIME) logger.debug("Set response to cache: {}".format(key)) + @method_decorator(condition(etag_func=get_etag)) def get(self, request, *args, **kwargs): self.cache_policy = request.GET.get('cache_policy', '0') diff --git a/apps/perms/api/user_permission.py b/apps/perms/api/user_permission.py index bb7a49726..9632f4caa 100644 --- a/apps/perms/api/user_permission.py +++ b/apps/perms/api/user_permission.py @@ -3,6 +3,7 @@ import uuid from django.shortcuts import get_object_or_404 from rest_framework.views import APIView, Response + from rest_framework.generics import ( ListAPIView, get_object_or_404, RetrieveAPIView ) diff --git a/apps/perms/templates/perms/asset_permission_asset.html b/apps/perms/templates/perms/asset_permission_asset.html index d8cd8ee96..c452111e6 100644 --- a/apps/perms/templates/perms/asset_permission_asset.html +++ b/apps/perms/templates/perms/asset_permission_asset.html @@ -19,17 +19,17 @@
  • - {% trans 'Users and user groups' %} + {% trans 'Users and user groups' %}
  • - {% trans 'Assets and node' %} + {% trans 'Assets and node' %}
  • -
    +
    {% trans 'Asset list of ' %} {{ asset_permission.name }} @@ -64,7 +64,7 @@
    -
    +
    {% trans 'Add asset to this permission' %} diff --git a/apps/perms/templates/perms/asset_permission_detail.html b/apps/perms/templates/perms/asset_permission_detail.html index 9054d57fd..ad0d3a7cd 100644 --- a/apps/perms/templates/perms/asset_permission_detail.html +++ b/apps/perms/templates/perms/asset_permission_detail.html @@ -19,12 +19,12 @@
  • - {% trans 'Users and user groups' %} + {% trans 'Users and user groups' %}
  • - {% trans 'Assets and node' %} + {% trans 'Assets and node' %}
  • {% trans 'Update' %} @@ -37,7 +37,7 @@
  • -
    +
    {{ object.name }} @@ -108,7 +108,7 @@
    -
    +
    {% trans 'Quick update' %} diff --git a/apps/perms/templates/perms/asset_permission_list.html b/apps/perms/templates/perms/asset_permission_list.html index 859ad64c0..3336afe2c 100644 --- a/apps/perms/templates/perms/asset_permission_list.html +++ b/apps/perms/templates/perms/asset_permission_list.html @@ -182,9 +182,9 @@ function initTable() { ], ajax_url: '{% url "api-perms:asset-permission-list" %}?display=1', columns: [ - {data: "id"}, {data: "name"}, {data: "users"}, - {data: "user_groups"}, {data: "assets"}, - {data: "nodes"}, {data: "system_users"}, + {data: "id"}, {data: "name"}, {data: "users", orderable: false}, + {data: "user_groups", orderable: false}, {data: "assets", orderable: false}, + {data: "nodes", orderable: false}, {data: "system_users", orderable: false}, {data: "is_valid", orderable: false}, {data: "id", orderable: false} ], select: {}, diff --git a/apps/perms/templates/perms/asset_permission_user.html b/apps/perms/templates/perms/asset_permission_user.html index d5e8292e1..f06c3409c 100644 --- a/apps/perms/templates/perms/asset_permission_user.html +++ b/apps/perms/templates/perms/asset_permission_user.html @@ -19,17 +19,17 @@
  • - {% trans 'Users and user groups' %} + {% trans 'Users and user groups' %}
  • - {% trans 'Assets and node' %} + {% trans 'Assets and node' %}
  • -
    +
    {% trans 'User list of ' %} {{ asset_permission.name }} @@ -74,7 +74,7 @@
    -
    +
    {% trans 'Add user to asset permission' %} diff --git a/apps/perms/templates/perms/remote_app_permission_detail.html b/apps/perms/templates/perms/remote_app_permission_detail.html index 352e9f17a..d855e71a0 100644 --- a/apps/perms/templates/perms/remote_app_permission_detail.html +++ b/apps/perms/templates/perms/remote_app_permission_detail.html @@ -37,7 +37,7 @@
    -
    +
    {{ object.name }} @@ -100,7 +100,7 @@
    -
    +
    {% trans 'Quick update' %} diff --git a/apps/perms/templates/perms/remote_app_permission_remote_app.html b/apps/perms/templates/perms/remote_app_permission_remote_app.html index 2e705945f..091613317 100644 --- a/apps/perms/templates/perms/remote_app_permission_remote_app.html +++ b/apps/perms/templates/perms/remote_app_permission_remote_app.html @@ -28,7 +28,7 @@
    -
    +
    {% trans 'RemoteApp list of ' %} {{ remote_app_permission.name }} @@ -73,7 +73,7 @@
    -
    +
    {% trans 'Add RemoteApp to this permission' %} diff --git a/apps/perms/templates/perms/remote_app_permission_user.html b/apps/perms/templates/perms/remote_app_permission_user.html index b1fc8e488..e18e4f694 100644 --- a/apps/perms/templates/perms/remote_app_permission_user.html +++ b/apps/perms/templates/perms/remote_app_permission_user.html @@ -28,7 +28,7 @@
    -
    +
    {% trans 'User list of ' %} {{ remote_app_permission.name }} @@ -73,7 +73,7 @@
    -
    +
    {% trans 'Add user to this permission' %} diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index ad1ec17f5..d67c403cf 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -223,7 +223,7 @@ function formSubmit(props) { return } $.each(errors, function (k, v) { - var fieldRef = props.form.find('input[name="' + k + '"]'); + var fieldRef = props.form.find('[name="' + k + '"]'); var formGroupRef = fieldRef.parents('.form-group'); var parentRef = fieldRef.parent(); var helpBlockRef = parentRef.children('.help-block.error'); @@ -237,7 +237,7 @@ function formSubmit(props) { helpBlockRef.html(help_msg); } else { $.each(v, function (kk, vv) { - if (typeof errors === "object") { + if (typeof vv === "object") { $.each(vv, function (kkk, vvv) { noneFieldErrorMsg += " " + vvv + '
    '; }) diff --git a/apps/terminal/templates/terminal/command_list.html b/apps/terminal/templates/terminal/command_list.html index 3c999f0f6..88660a39d 100644 --- a/apps/terminal/templates/terminal/command_list.html +++ b/apps/terminal/templates/terminal/command_list.html @@ -199,8 +199,8 @@ function initTable() { ajax_url: commandListUrl, columns: [ {data: "id"}, {data: "input", orderable: false}, {data: "user", orderable: false}, - {data: "asset"}, {data: "system_user"}, - {data: "session"}, {data: "timestamp", width: "160px"}, + {data: "asset", orderable: false}, {data: "system_user", orderable: false}, + {data: "session", orderable: false}, {data: "timestamp", width: "160px", orderable: false}, ], select: {}, op_html: $('#actions').html(), diff --git a/apps/terminal/templates/terminal/session_list.html b/apps/terminal/templates/terminal/session_list.html index 5dd2e24df..648fc1ea7 100644 --- a/apps/terminal/templates/terminal/session_list.html +++ b/apps/terminal/templates/terminal/session_list.html @@ -155,11 +155,11 @@ function initTable() { ], ajax_url: sessionListUrl, columns: [ - {data: "id"}, {data: "id"}, {data: "user", orderable: false}, - {data: "asset", orderable: false}, {data: "system_user", orderable: false}, - {data: "remote_addr"}, {data: "protocol"}, {data: "login_from_display"}, - {data: "command_amount"}, {data: "date_start"}, - {data: "date_end"}, {data: "id"}, + {data: "id"}, {data: "id", orderable:false}, {data: "user"}, + {data: "asset"}, {data: "system_user"}, + {data: "remote_addr"}, {data: "protocol"}, {data: "login_from_display", orderable:false}, + {data: "command_amount", orderable:false}, {data: "date_start"}, + {data: "date_end", orderable:false}, {data: "id",orderable:false}, ], op_html: $('#actions').html(), fb_html: $("#daterange").html(), diff --git a/apps/terminal/templates/terminal/terminal_list.html b/apps/terminal/templates/terminal/terminal_list.html index 479944c00..6676a26ab 100644 --- a/apps/terminal/templates/terminal/terminal_list.html +++ b/apps/terminal/templates/terminal/terminal_list.html @@ -90,7 +90,7 @@ function initTable() { ], ajax_url: '{% url "api-terminal:terminal-list" %}', columns: [{data: function(){return ""}}, {data: "name" }, {data: "remote_addr" }, - {data: "session_online"}, {data: "is_active" }, {data: 'is_alive'}, {data: "id"}], + {data: "session_online", orderable: false}, {data: "is_active", orderable: false}, {data: 'is_alive'}, {data: "id", orderable: false}], op_html: $('#actions').html() }; jumpserver.initDataTable(options); diff --git a/apps/users/templates/users/user_group_list.html b/apps/users/templates/users/user_group_list.html index 4f83f2e9b..8d3bd3245 100644 --- a/apps/users/templates/users/user_group_list.html +++ b/apps/users/templates/users/user_group_list.html @@ -80,8 +80,8 @@ function initTable() { }} ], ajax_url: '{% url "api-users:user-group-list" %}?display=1', - columns: [{data: function(){return ""}}, {data: "name" }, {data: "users"}, - {data: "comment"}, {data: "id" }], + columns: [{data: function(){return ""}}, {data: "name" }, {data: "users", orderable: false}, + {data: "comment"}, {data: "id", orderable: false }], order: [], op_html: $('#actions').html() };