From 3855fecc69e4286efc793724460e11b86e88e5fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E5=B9=BF?= Date: Mon, 20 May 2019 12:30:55 +0800 Subject: [PATCH] Password message (#2702) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Update] 密码信封 * [Update] 查看密码 * [Update] 支持查看密码 * [Update] 修改语言翻译 * [Update] 迁移ansible到2.8版本 * [Update] 修改auth book的可连接性 * [Update] 删除不使用的方法 --- apps/assets/models/authbook.py | 2 +- .../assets/_asset_user_view_auth_modal.html | 140 +++++++++ .../templates/assets/admin_user_assets.html | 14 +- .../assets/asset_asset_user_list.html | 34 +- .../templates/assets/system_user_asset.html | 12 +- apps/authentication/api/auth.py | 24 +- apps/authentication/serializers.py | 4 + apps/authentication/urls/api_urls.py | 1 + apps/common/permissions.py | 1 + apps/common/utils/common.py | 1 + apps/jumpserver/conf.py | 2 +- apps/locale/zh/LC_MESSAGES/django.mo | Bin 71420 -> 71684 bytes apps/locale/zh/LC_MESSAGES/django.po | 295 ++++++++++-------- apps/ops/ansible/callback.py | 3 + apps/ops/ansible/runner.py | 38 +-- apps/ops/ansible/test_runner.py | 2 +- apps/ops/inventory.py | 1 - apps/static/js/jumpserver.js | 7 +- .../js/plugins/clipboard/clipboard.min.js | 7 + apps/users/models/user.py | 4 + requirements/requirements.txt | 16 +- 21 files changed, 416 insertions(+), 192 deletions(-) create mode 100644 apps/assets/templates/assets/_asset_user_view_auth_modal.html create mode 100755 apps/static/js/plugins/clipboard/clipboard.min.js diff --git a/apps/assets/models/authbook.py b/apps/assets/models/authbook.py index a040bbd0d..94e4f4cf4 100644 --- a/apps/assets/models/authbook.py +++ b/apps/assets/models/authbook.py @@ -78,7 +78,7 @@ class AuthBook(AssetUser): if host == self.asset.hostname: _connectivity = self.UNREACHABLE - for host in value.get('contacted', {}).keys(): + for host in value.get('contacted', []): if host == self.asset.hostname: _connectivity = self.REACHABLE diff --git a/apps/assets/templates/assets/_asset_user_view_auth_modal.html b/apps/assets/templates/assets/_asset_user_view_auth_modal.html new file mode 100644 index 000000000..07ac34ce5 --- /dev/null +++ b/apps/assets/templates/assets/_asset_user_view_auth_modal.html @@ -0,0 +1,140 @@ +{% extends '_modal.html' %} +{% load i18n %} +{% load static %} +{% block modal_id %}asset_user_auth_view{% endblock %} +{% block modal_title%}{% trans "Asset user auth" %}{% endblock %} +{% block modal_body %} + +
+
+ +
+ + {% trans "Need otp auth for view auth" %} +
+ +
+ +
+ + +{% endblock %} +{% block modal_button %} + +{% endblock %} diff --git a/apps/assets/templates/assets/admin_user_assets.html b/apps/assets/templates/assets/admin_user_assets.html index c893ead80..328b21579 100644 --- a/apps/assets/templates/assets/admin_user_assets.html +++ b/apps/assets/templates/assets/admin_user_assets.html @@ -85,6 +85,7 @@ {% include 'assets/_asset_user_auth_modal.html' %} + {% include 'assets/_asset_user_view_auth_modal.html' %} {% endblock %} {% block custom_foot_js %} {% endblock %} diff --git a/apps/assets/templates/assets/asset_asset_user_list.html b/apps/assets/templates/assets/asset_asset_user_list.html index 9a330ce77..ef192d790 100644 --- a/apps/assets/templates/assets/asset_asset_user_list.html +++ b/apps/assets/templates/assets/asset_asset_user_list.html @@ -2,10 +2,6 @@ {% load common_tags %} {% load static %} {% load i18n %} - -{% block custom_head_css_js %} -{% endblock %} - {% block content %}
@@ -87,6 +83,7 @@
{% include 'assets/_asset_user_auth_modal.html' %} + {% include 'assets/_asset_user_view_auth_modal.html' %} {% endblock %} {% block custom_foot_js %} {% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/system_user_asset.html b/apps/assets/templates/assets/system_user_asset.html index 082e13fd8..f5df32bf5 100644 --- a/apps/assets/templates/assets/system_user_asset.html +++ b/apps/assets/templates/assets/system_user_asset.html @@ -133,6 +133,7 @@ {% include 'assets/_asset_user_auth_modal.html' %} + {% include 'assets/_asset_user_view_auth_modal.html' %} {% endblock %} {% block custom_foot_js %} {% endblock %} diff --git a/apps/authentication/api/auth.py b/apps/authentication/api/auth.py index 2d9cfe367..42c196c51 100644 --- a/apps/authentication/api/auth.py +++ b/apps/authentication/api/auth.py @@ -2,6 +2,7 @@ # import uuid +import time from django.core.cache import cache from django.urls import reverse @@ -10,10 +11,11 @@ from django.utils.translation import ugettext as _ from rest_framework.permissions import AllowAny from rest_framework.response import Response +from rest_framework.generics import CreateAPIView from rest_framework.views import APIView from common.utils import get_logger, get_request_ip -from common.permissions import IsOrgAdminOrAppUser +from common.permissions import IsOrgAdminOrAppUser, IsValidUser from orgs.mixins import RootOrgViewMixin from users.serializers import UserSerializer from users.models import User @@ -23,12 +25,13 @@ from users.utils import ( check_user_valid, check_otp_code, increase_login_failed_count, is_block_login, clean_failed_count ) - +from ..serializers import OtpVerifySerializer from ..signals import post_auth_success, post_auth_failed logger = get_logger(__name__) __all__ = [ 'UserAuthApi', 'UserConnectionTokenApi', 'UserOtpAuthApi', + 'UserOtpVerifyApi', ] @@ -179,3 +182,20 @@ class UserOtpAuthApi(RootOrgViewMixin, APIView): sender=self.__class__, username=username, request=self.request, reason=reason ) + + +class UserOtpVerifyApi(CreateAPIView): + permission_classes = (IsValidUser,) + serializer_class = OtpVerifySerializer + + def create(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + code = serializer.validated_data["code"] + + if request.user.check_otp(code): + request.session["OTP_LAST_VERIFY_TIME"] = int(time.time()) + return Response({"ok": "1"}) + else: + return Response({"error": "Code not valid"}, status=400) + diff --git a/apps/authentication/serializers.py b/apps/authentication/serializers.py index cf4968a56..2033b3e44 100644 --- a/apps/authentication/serializers.py +++ b/apps/authentication/serializers.py @@ -14,3 +14,7 @@ class AccessKeySerializer(serializers.ModelSerializer): model = AccessKey fields = ['id', 'secret'] read_only_fields = ['id', 'secret'] + + +class OtpVerifySerializer(serializers.Serializer): + code = serializers.CharField(max_length=6, min_length=6) diff --git a/apps/authentication/urls/api_urls.py b/apps/authentication/urls/api_urls.py index b22c49884..85f3aa522 100644 --- a/apps/authentication/urls/api_urls.py +++ b/apps/authentication/urls/api_urls.py @@ -16,5 +16,6 @@ urlpatterns = [ path('connection-token/', api.UserConnectionTokenApi.as_view(), name='connection-token'), path('otp/auth/', api.UserOtpAuthApi.as_view(), name='user-otp-auth'), + path('otp/verify/', api.UserOtpVerifyApi.as_view(), name='user-otp-verify'), ] diff --git a/apps/common/permissions.py b/apps/common/permissions.py index 689444131..025d44ba3 100644 --- a/apps/common/permissions.py +++ b/apps/common/permissions.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # +import time from rest_framework import permissions from django.contrib.auth.mixins import UserPassesTestMixin diff --git a/apps/common/utils/common.py b/apps/common/utils/common.py index dcd7daf16..79146c039 100644 --- a/apps/common/utils/common.py +++ b/apps/common/utils/common.py @@ -144,6 +144,7 @@ def is_uuid(seq): def get_request_ip(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR', '').split(',') + if x_forwarded_for and x_forwarded_for[0]: login_ip = x_forwarded_for[0] else: diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index ee6dcdbfd..35254d1ca 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -194,7 +194,7 @@ class Config(dict): filename = os.path.join(self.root_path, filename) try: with open(filename, 'rt', encoding='utf8') as f: - obj = yaml.load(f) + obj = yaml.safe_load(f) except IOError as e: if silent and e.errno in (errno.ENOENT, errno.EISDIR): return False diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 52ca4190e25b6f8f01a33ddea5e4b8414831c36f..4d188c93e46ee615c0be0c00ea39a0646ea361be 100644 GIT binary patch delta 21270 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 delta 21011 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\n" "Language-Team: Jumpserver team\n" @@ -21,15 +21,15 @@ msgstr "" msgid "Please select assets that need to be updated" msgstr "请选择需要更新的资产" -#: assets/api/node.py:58 +#: assets/api/node.py:60 msgid "You can't update the root node name" msgstr "不能修改根节点名称" -#: assets/api/node.py:282 +#: assets/api/node.py:285 msgid "Update node asset hardware information: {}" msgstr "更新节点资产硬件信息: {}" -#: assets/api/node.py:296 +#: assets/api/node.py:299 msgid "Test if the assets under the node are connectable: {}" msgstr "测试节点下资产是否可连接: {}" @@ -45,7 +45,7 @@ msgstr "节点管理" #: assets/models/cluster.py:19 assets/models/user.py:91 #: assets/templates/assets/asset_detail.html:80 templates/_nav.html:24 #: xpack/plugins/cloud/models.py:124 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:67 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:65 #: xpack/plugins/orgs/templates/orgs/org_list.html:18 msgid "Admin user" msgstr "管理用户" @@ -81,8 +81,8 @@ msgstr "网域" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:55 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:15 #: xpack/plugins/cloud/models.py:123 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:63 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:66 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:61 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:64 msgid "Node" msgstr "节点" @@ -136,7 +136,7 @@ msgstr "选择资产" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:13 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:14 #: xpack/plugins/cloud/models.py:187 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:65 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:63 #: xpack/plugins/orgs/templates/orgs/org_list.html:16 msgid "Asset" msgstr "资产" @@ -188,9 +188,9 @@ msgstr "SSH网关,支持代理SSH,RDP和VNC" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:61 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:12 #: xpack/plugins/cloud/models.py:49 xpack/plugins/cloud/models.py:119 -#: xpack/plugins/cloud/templates/cloud/account_detail.html:52 +#: xpack/plugins/cloud/templates/cloud/account_detail.html:50 #: xpack/plugins/cloud/templates/cloud/account_list.html:12 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:55 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:53 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:12 #: xpack/plugins/orgs/templates/orgs/org_detail.html:52 #: xpack/plugins/orgs/templates/orgs/org_list.html:12 @@ -200,9 +200,10 @@ msgstr "名称" #: assets/forms/domain.py:74 assets/forms/user.py:85 assets/forms/user.py:147 #: assets/models/base.py:27 #: assets/templates/assets/_asset_user_auth_modal.html:15 +#: assets/templates/assets/_asset_user_view_auth_modal.html:31 #: assets/templates/assets/admin_user_detail.html:60 #: assets/templates/assets/admin_user_list.html:27 -#: assets/templates/assets/asset_asset_user_list.html:48 +#: assets/templates/assets/asset_asset_user_list.html:44 #: assets/templates/assets/domain_gateway_list.html:71 #: assets/templates/assets/system_user_detail.html:62 #: assets/templates/assets/system_user_list.html:30 audits/models.py:94 @@ -233,6 +234,7 @@ msgstr "密码或密钥密码" #: assets/forms/user.py:26 assets/models/base.py:28 #: assets/serializers/asset_user.py:19 #: assets/templates/assets/_asset_user_auth_modal.html:21 +#: assets/templates/assets/_asset_user_view_auth_modal.html:37 #: authentication/forms.py:13 #: authentication/templates/authentication/login.html:67 #: authentication/templates/authentication/new_login.html:93 @@ -313,6 +315,7 @@ msgstr "IP" #: assets/models/asset.py:75 assets/templates/assets/_asset_list_modal.html:45 #: assets/templates/assets/_asset_user_auth_modal.html:9 +#: assets/templates/assets/_asset_user_view_auth_modal.html:25 #: assets/templates/assets/admin_user_assets.html:48 #: assets/templates/assets/asset_detail.html:60 #: assets/templates/assets/asset_list.html:92 @@ -461,8 +464,8 @@ msgstr "创建者" #: users/templates/users/user_group_detail.html:63 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:105 #: xpack/plugins/cloud/models.py:56 xpack/plugins/cloud/models.py:128 -#: xpack/plugins/cloud/templates/cloud/account_detail.html:68 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:79 +#: xpack/plugins/cloud/templates/cloud/account_detail.html:66 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:77 #: xpack/plugins/orgs/templates/orgs/org_detail.html:60 msgid "Date created" msgstr "创建日期" @@ -495,9 +498,9 @@ msgstr "创建日期" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:117 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:19 #: xpack/plugins/cloud/models.py:54 xpack/plugins/cloud/models.py:125 -#: xpack/plugins/cloud/templates/cloud/account_detail.html:72 +#: xpack/plugins/cloud/templates/cloud/account_detail.html:70 #: xpack/plugins/cloud/templates/cloud/account_list.html:15 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:71 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:69 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:16 #: xpack/plugins/orgs/templates/orgs/org_detail.html:64 #: xpack/plugins/orgs/templates/orgs/org_list.html:22 @@ -513,7 +516,7 @@ msgstr "不可达" #: assets/models/asset.py:118 assets/models/base.py:39 #: assets/templates/assets/admin_user_assets.html:51 #: assets/templates/assets/admin_user_list.html:29 -#: assets/templates/assets/asset_asset_user_list.html:50 +#: assets/templates/assets/asset_asset_user_list.html:46 #: assets/templates/assets/asset_list.html:95 #: assets/templates/assets/system_user_asset.html:53 #: assets/templates/assets/system_user_list.html:34 @@ -584,7 +587,7 @@ msgid "Default" msgstr "默认" #: assets/models/cluster.py:36 assets/models/label.py:14 -#: users/models/user.py:475 +#: users/models/user.py:479 msgid "System" msgstr "系统" @@ -665,7 +668,7 @@ msgstr "每行一个命令" #: assets/models/cmd_filter.py:54 #: assets/templates/assets/admin_user_assets.html:52 #: assets/templates/assets/admin_user_list.html:33 -#: assets/templates/assets/asset_asset_user_list.html:52 +#: assets/templates/assets/asset_asset_user_list.html:48 #: assets/templates/assets/asset_list.html:96 #: assets/templates/assets/cmd_filter_list.html:28 #: assets/templates/assets/cmd_filter_rule_list.html:63 @@ -735,7 +738,7 @@ msgstr "默认资产组" #: terminal/templates/terminal/command_list.html:72 #: terminal/templates/terminal/session_list.html:33 #: terminal/templates/terminal/session_list.html:71 users/forms.py:283 -#: users/models/user.py:36 users/models/user.py:463 +#: users/models/user.py:36 users/models/user.py:467 #: users/templates/users/user_group_detail.html:78 #: users/templates/users/user_group_list.html:13 users/views/user.py:395 #: xpack/plugins/orgs/forms.py:26 @@ -757,7 +760,7 @@ msgstr "分类" msgid "Key" msgstr "键" -#: assets/models/node.py:128 +#: assets/models/node.py:133 msgid "New node" msgstr "新节点" @@ -975,6 +978,61 @@ msgstr "更新资产用户认证信息" msgid "Please input password" msgstr "请输入密码" +#: assets/templates/assets/_asset_user_view_auth_modal.html:5 +msgid "Asset user auth" +msgstr "资产用户信息" + +#: assets/templates/assets/_asset_user_view_auth_modal.html:14 +#: assets/templates/assets/_otp_verify_modal.html:8 audits/models.py:99 +#: audits/templates/audits/login_log_list.html:56 users/forms.py:142 +#: users/models/user.py:83 users/templates/users/first_login.html:45 +msgid "MFA" +msgstr "MFA" + +#: assets/templates/assets/_asset_user_view_auth_modal.html:17 +msgid "Need otp auth for view auth" +msgstr "需要二次认证来查看账号信息" + +#: assets/templates/assets/_asset_user_view_auth_modal.html:20 +#: assets/templates/assets/admin_user_detail.html:100 +#: assets/templates/assets/asset_detail.html:211 +#: assets/templates/assets/asset_list.html:637 +#: assets/templates/assets/cmd_filter_detail.html:106 +#: assets/templates/assets/system_user_asset.html:112 +#: assets/templates/assets/system_user_detail.html:182 +#: assets/templates/assets/system_user_list.html:144 +#: settings/templates/settings/terminal_setting.html:165 +#: templates/_modal.html:23 terminal/templates/terminal/session_detail.html:108 +#: users/templates/users/user_detail.html:388 +#: users/templates/users/user_detail.html:414 +#: users/templates/users/user_detail.html:437 +#: users/templates/users/user_detail.html:482 +#: users/templates/users/user_group_create_update.html:32 +#: users/templates/users/user_group_list.html:90 +#: users/templates/users/user_list.html:215 +#: users/templates/users/user_profile.html:238 +#: xpack/plugins/cloud/templates/cloud/account_create_update.html:34 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create.html:36 +#: xpack/plugins/interface/templates/interface/interface.html:103 +#: xpack/plugins/orgs/templates/orgs/org_create_update.html:33 +msgid "Confirm" +msgstr "确认" + +#: assets/templates/assets/_asset_user_view_auth_modal.html:63 +msgid "Copy success" +msgstr "复制成功" + +#: assets/templates/assets/_asset_user_view_auth_modal.html:79 +msgid "Get auth info error" +msgstr "获取认证信息错误" + +#: assets/templates/assets/_asset_user_view_auth_modal.html:139 +#: assets/templates/assets/_user_asset_detail_modal.html:23 +#: settings/templates/settings/_ldap_list_users_modal.html:96 +#: templates/_modal.html:22 +msgid "Close" +msgstr "关闭" + #: assets/templates/assets/_gateway_test_modal.html:4 msgid "Test gateway test connection" msgstr "测试连接网关" @@ -987,6 +1045,10 @@ msgstr "SSH端口" msgid "If use nat, set the ssh real port" msgstr "如果使用了nat端口映射,请设置为ssh真实监听的端口" +#: assets/templates/assets/_otp_verify_modal.html:4 +msgid "MFA Confirm" +msgstr "确认" + #: assets/templates/assets/_system_user.html:37 #: assets/templates/assets/asset_create.html:16 #: assets/templates/assets/asset_update.html:21 @@ -1088,17 +1150,11 @@ msgid "Submit" msgstr "提交" #: assets/templates/assets/_user_asset_detail_modal.html:11 -#: assets/templates/assets/asset_asset_user_list.html:17 +#: assets/templates/assets/asset_asset_user_list.html:13 #: assets/templates/assets/asset_detail.html:20 assets/views/asset.py:187 msgid "Asset detail" msgstr "资产详情" -#: assets/templates/assets/_user_asset_detail_modal.html:23 -#: settings/templates/settings/_ldap_list_users_modal.html:96 -#: templates/_modal.html:22 -msgid "Close" -msgstr "关闭" - #: assets/templates/assets/admin_user_assets.html:18 #: assets/templates/assets/admin_user_detail.html:18 #: assets/templates/assets/cmd_filter_detail.html:19 @@ -1140,41 +1196,47 @@ msgid "Quick update" msgstr "快速更新" #: assets/templates/assets/admin_user_assets.html:70 -#: assets/templates/assets/asset_asset_user_list.html:71 +#: assets/templates/assets/asset_asset_user_list.html:67 #: assets/templates/assets/asset_detail.html:179 msgid "Test connective" msgstr "测试可连接性" #: assets/templates/assets/admin_user_assets.html:73 -#: assets/templates/assets/admin_user_assets.html:115 -#: assets/templates/assets/asset_asset_user_list.html:74 -#: assets/templates/assets/asset_asset_user_list.html:122 +#: assets/templates/assets/admin_user_assets.html:118 +#: assets/templates/assets/asset_asset_user_list.html:70 +#: assets/templates/assets/asset_asset_user_list.html:119 #: assets/templates/assets/asset_detail.html:182 #: assets/templates/assets/system_user_asset.html:75 -#: assets/templates/assets/system_user_asset.html:165 +#: assets/templates/assets/system_user_asset.html:166 #: assets/templates/assets/system_user_detail.html:151 msgid "Test" msgstr "测试" #: assets/templates/assets/admin_user_assets.html:116 -#: assets/templates/assets/asset_asset_user_list.html:120 -#: assets/templates/assets/system_user_asset.html:167 +#: assets/templates/assets/asset_asset_user_list.html:117 +#: assets/templates/assets/system_user_asset.html:169 msgid "Update auth" msgstr "更新认证" -#: assets/templates/assets/admin_user_assets.html:192 -#: assets/templates/assets/asset_asset_user_list.html:176 +#: assets/templates/assets/admin_user_assets.html:117 +#: assets/templates/assets/asset_asset_user_list.html:118 +#: assets/templates/assets/system_user_asset.html:167 +msgid "View auth" +msgstr "查看认证" + +#: assets/templates/assets/admin_user_assets.html:196 +#: assets/templates/assets/asset_asset_user_list.html:162 #: assets/templates/assets/asset_detail.html:311 -#: assets/templates/assets/system_user_asset.html:351 +#: assets/templates/assets/system_user_asset.html:353 #: users/templates/users/user_detail.html:307 #: users/templates/users/user_detail.html:334 #: xpack/plugins/interface/views.py:34 msgid "Update successfully!" msgstr "更新成功" -#: assets/templates/assets/admin_user_assets.html:195 -#: assets/templates/assets/asset_asset_user_list.html:179 -#: assets/templates/assets/system_user_asset.html:354 +#: assets/templates/assets/admin_user_assets.html:199 +#: assets/templates/assets/asset_asset_user_list.html:165 +#: assets/templates/assets/system_user_asset.html:356 msgid "Update failed!" msgstr "更新失败" @@ -1205,11 +1267,11 @@ msgstr "更新失败" #: users/templates/users/user_profile.html:187 #: users/templates/users/user_profile.html:196 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:29 -#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:54 -#: xpack/plugins/cloud/templates/cloud/account_detail.html:25 -#: xpack/plugins/cloud/templates/cloud/account_list.html:38 +#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:55 +#: xpack/plugins/cloud/templates/cloud/account_detail.html:23 +#: xpack/plugins/cloud/templates/cloud/account_list.html:39 #: xpack/plugins/orgs/templates/orgs/org_detail.html:25 -#: xpack/plugins/orgs/templates/orgs/org_list.html:85 +#: xpack/plugins/orgs/templates/orgs/org_list.html:87 msgid "Update" msgstr "更新" @@ -1239,13 +1301,13 @@ msgstr "更新" #: users/templates/users/user_list.html:91 #: users/templates/users/user_list.html:95 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:33 -#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:56 -#: xpack/plugins/cloud/templates/cloud/account_detail.html:29 -#: xpack/plugins/cloud/templates/cloud/account_list.html:40 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:32 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:54 +#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:57 +#: xpack/plugins/cloud/templates/cloud/account_detail.html:27 +#: xpack/plugins/cloud/templates/cloud/account_list.html:41 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:30 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:55 #: xpack/plugins/orgs/templates/orgs/org_detail.html:29 -#: xpack/plugins/orgs/templates/orgs/org_list.html:87 +#: xpack/plugins/orgs/templates/orgs/org_list.html:89 msgid "Delete" msgstr "删除" @@ -1260,30 +1322,6 @@ msgstr "替换资产的管理员" msgid "Select nodes" msgstr "选择节点" -#: assets/templates/assets/admin_user_detail.html:100 -#: assets/templates/assets/asset_detail.html:211 -#: assets/templates/assets/asset_list.html:637 -#: assets/templates/assets/cmd_filter_detail.html:106 -#: assets/templates/assets/system_user_asset.html:112 -#: assets/templates/assets/system_user_detail.html:182 -#: assets/templates/assets/system_user_list.html:144 -#: settings/templates/settings/terminal_setting.html:165 -#: templates/_modal.html:23 terminal/templates/terminal/session_detail.html:108 -#: users/templates/users/user_detail.html:388 -#: users/templates/users/user_detail.html:414 -#: users/templates/users/user_detail.html:437 -#: users/templates/users/user_detail.html:482 -#: users/templates/users/user_group_create_update.html:32 -#: users/templates/users/user_group_list.html:90 -#: users/templates/users/user_list.html:215 -#: users/templates/users/user_profile.html:238 -#: xpack/plugins/cloud/templates/cloud/account_create_update.html:34 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create.html:36 -#: xpack/plugins/interface/templates/interface/interface.html:103 -#: xpack/plugins/orgs/templates/orgs/org_create_update.html:33 -msgid "Confirm" -msgstr "确认" - #: assets/templates/assets/admin_user_list.html:10 msgid "" "Admin users are asset (charged server) on the root, or have NOPASSWD: ALL " @@ -1313,26 +1351,26 @@ msgstr "创建管理用户" msgid "Ratio" msgstr "比例" -#: assets/templates/assets/asset_asset_user_list.html:20 +#: assets/templates/assets/asset_asset_user_list.html:16 #: assets/templates/assets/asset_detail.html:23 assets/views/asset.py:68 msgid "Asset user list" msgstr "资产用户列表" -#: assets/templates/assets/asset_asset_user_list.html:28 +#: assets/templates/assets/asset_asset_user_list.html:24 msgid "Asset users of" msgstr "资产用户" -#: assets/templates/assets/asset_asset_user_list.html:49 +#: assets/templates/assets/asset_asset_user_list.html:45 msgid "Password version" msgstr "密码版本" -#: assets/templates/assets/asset_asset_user_list.html:51 +#: assets/templates/assets/asset_asset_user_list.html:47 #: assets/templates/assets/cmd_filter_detail.html:73 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:109 msgid "Date updated" msgstr "更新日期" -#: assets/templates/assets/asset_asset_user_list.html:64 +#: assets/templates/assets/asset_asset_user_list.html:60 #: assets/templates/assets/asset_detail.html:148 #: terminal/templates/terminal/session_detail.html:81 #: users/templates/users/user_detail.html:138 @@ -1672,7 +1710,7 @@ msgid "Push system user now" msgstr "立刻推送系统" #: assets/templates/assets/system_user_asset.html:84 -#: assets/templates/assets/system_user_asset.html:163 +#: assets/templates/assets/system_user_asset.html:164 #: assets/templates/assets/system_user_detail.html:142 msgid "Push" msgstr "推送" @@ -1948,12 +1986,6 @@ msgstr "登录城市" msgid "User agent" msgstr "Agent" -#: audits/models.py:99 audits/templates/audits/login_log_list.html:56 -#: users/forms.py:142 users/models/user.py:83 -#: users/templates/users/first_login.html:45 -msgid "MFA" -msgstr "MFA" - #: audits/models.py:100 audits/templates/audits/login_log_list.html:57 #: xpack/plugins/change_auth_plan/models.py:413 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:15 @@ -1965,7 +1997,7 @@ msgstr "原因" #: audits/models.py:101 audits/templates/audits/login_log_list.html:58 #: xpack/plugins/cloud/models.py:171 xpack/plugins/cloud/models.py:188 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:70 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:67 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:65 msgid "Status" msgstr "状态" @@ -2003,7 +2035,7 @@ msgstr "选择用户" #: terminal/templates/terminal/command_list.html:60 #: terminal/templates/terminal/session_list.html:61 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:52 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:50 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:48 msgid "Search" msgstr "搜索" @@ -2013,7 +2045,7 @@ msgstr "搜索" #: ops/templates/ops/task_detail.html:56 #: terminal/templates/terminal/session_list.html:70 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:64 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:62 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:60 msgid "ID" msgstr "ID" @@ -2063,25 +2095,25 @@ msgstr "登录日志" msgid "Command execution log" msgstr "命令执行" -#: authentication/api/auth.py:46 +#: authentication/api/auth.py:49 #: authentication/templates/authentication/login.html:52 #: authentication/templates/authentication/new_login.html:77 msgid "Log in frequently and try again later" msgstr "登录频繁, 稍后重试" -#: authentication/api/auth.py:64 +#: authentication/api/auth.py:67 msgid "The user {} password has expired, please update." msgstr "用户 {} 密码已经过期,请更新。" -#: authentication/api/auth.py:83 +#: authentication/api/auth.py:86 msgid "Please carry seed value and conduct MFA secondary certification" msgstr "请携带seed值, 进行MFA二次认证" -#: authentication/api/auth.py:163 +#: authentication/api/auth.py:166 msgid "Please verify the user name and password first" msgstr "请先进行用户名和密码验证" -#: authentication/api/auth.py:168 +#: authentication/api/auth.py:171 msgid "MFA certification failed" msgstr "MFA认证失败" @@ -2415,7 +2447,7 @@ msgid "Become" msgstr "Become" #: ops/models/adhoc.py:166 users/templates/users/user_group_detail.html:59 -#: xpack/plugins/cloud/templates/cloud/account_detail.html:64 +#: xpack/plugins/cloud/templates/cloud/account_detail.html:62 #: xpack/plugins/orgs/templates/orgs/org_detail.html:56 msgid "Create by" msgstr "创建者" @@ -2661,8 +2693,8 @@ msgstr "版本" #: ops/templates/ops/task_list.html:63 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:137 -#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:52 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:52 +#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:53 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:53 msgid "Run" msgstr "执行" @@ -2828,7 +2860,7 @@ msgstr "创建授权规则" #: perms/templates/perms/asset_permission_list.html:59 #: perms/templates/perms/asset_permission_list.html:73 #: users/templates/users/user_list.html:28 xpack/plugins/cloud/models.py:53 -#: xpack/plugins/cloud/templates/cloud/account_detail.html:60 +#: xpack/plugins/cloud/templates/cloud/account_detail.html:58 #: xpack/plugins/cloud/templates/cloud/account_list.html:14 msgid "Validity" msgstr "有效" @@ -3283,8 +3315,8 @@ msgstr "端点后缀" #: settings/templates/settings/replay_storage_create.html:136 #: xpack/plugins/cloud/models.py:186 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:83 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:64 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:81 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:62 msgid "Region" msgstr "地域" @@ -3999,7 +4031,7 @@ msgstr "复制你的公钥到这里" msgid "Select users" msgstr "选择用户" -#: users/models/user.py:35 users/models/user.py:471 +#: users/models/user.py:35 users/models/user.py:475 msgid "Administrator" msgstr "管理员" @@ -4045,7 +4077,7 @@ msgstr "最后更新密码日期" msgid "User auth from {}, go there change password" msgstr "用户认证源来自 {}, 请去相应系统修改密码" -#: users/models/user.py:474 +#: users/models/user.py:478 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" @@ -4064,7 +4096,7 @@ msgstr "安全令牌验证" #: users/templates/users/_base_otp.html:44 users/templates/users/_user.html:13 #: users/templates/users/user_profile_update.html:51 #: xpack/plugins/cloud/models.py:120 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:59 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:57 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:13 msgid "Account" msgstr "账户" @@ -4947,7 +4979,7 @@ msgid "Run plan manually" msgstr "手动执行计划" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:179 -#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:101 +#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:102 msgid "Execute failed" msgstr "执行失败" @@ -5033,7 +5065,7 @@ msgid "Unavailable" msgstr "无效" #: xpack/plugins/cloud/models.py:50 -#: xpack/plugins/cloud/templates/cloud/account_detail.html:56 +#: xpack/plugins/cloud/templates/cloud/account_detail.html:54 #: xpack/plugins/cloud/templates/cloud/account_list.html:13 msgid "Provider" msgstr "云服务商" @@ -5059,7 +5091,7 @@ msgid "Instances" msgstr "实例" #: xpack/plugins/cloud/models.py:126 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:75 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:73 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:17 msgid "Date last sync" msgstr "最后同步日期" @@ -5078,7 +5110,7 @@ msgstr "" #: xpack/plugins/cloud/models.py:173 xpack/plugins/cloud/models.py:189 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:71 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:68 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:66 msgid "Date sync" msgstr "同步日期" @@ -5095,8 +5127,8 @@ msgid "Sync instance task history" msgstr "同步实例任务历史" #: xpack/plugins/cloud/models.py:185 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:91 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:63 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:89 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:61 msgid "Instance" msgstr "实例" @@ -5116,7 +5148,7 @@ msgstr "AWS (国际)" msgid "Qcloud" msgstr "腾讯云" -#: xpack/plugins/cloud/templates/cloud/account_detail.html:22 +#: xpack/plugins/cloud/templates/cloud/account_detail.html:20 #: xpack/plugins/cloud/views.py:72 msgid "Account detail" msgstr "账户详情" @@ -5134,23 +5166,23 @@ msgstr "加载中..." msgid "Load failed" msgstr "加载失败" -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:22 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:20 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:25 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:23 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:21 #: xpack/plugins/cloud/views.py:122 msgid "Sync task detail" msgstr "同步任务详情" -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:25 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:23 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:28 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:26 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:24 #: xpack/plugins/cloud/views.py:137 msgid "Sync task history" msgstr "同步历史列表" -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:28 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:26 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:31 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:29 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:27 #: xpack/plugins/cloud/views.py:188 msgid "Sync instance list" msgstr "同步实例列表" @@ -5183,7 +5215,7 @@ msgstr "执行次数" msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:92 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:93 msgid "Sync success" msgstr "同步成功" @@ -5267,6 +5299,7 @@ msgid "This will restore default Settings of the interface !!!" msgstr "您确定要恢复默认初始化吗?" #: xpack/plugins/interface/templates/interface/interface.html:107 +#: xpack/plugins/interface/views.py:53 msgid "Restore default successfully." msgstr "恢复默认成功!" @@ -5279,13 +5312,9 @@ msgid "Interface" msgstr "界面" #: xpack/plugins/interface/views.py:49 -msgid "It is already in the default setting state!" +msgid "It is already in the default setting state!" msgstr "当前已经是初始化状态!" -#: xpack/plugins/interface/views.py:53 -msgid "Restore default successfully!" -msgstr "恢复默认成功!" - #: xpack/plugins/license/meta.py:11 xpack/plugins/license/models.py:94 #: xpack/plugins/license/templates/license/license_detail.html:50 #: xpack/plugins/license/templates/license/license_detail.html:55 @@ -5423,6 +5452,22 @@ msgstr "创建组织" msgid "Update org" msgstr "更新组织" +#~ msgid "Monitor" +#~ msgstr "监控" + +#, fuzzy +#~| msgid "Select user" +#~ msgid "Select time" +#~ msgstr "选择用户" + +#, fuzzy +#~| msgid "Select Asset" +#~ msgid "Select host" +#~ msgstr "选择资产" + +#~ msgid "Restore default successfully!" +#~ msgstr "恢复默认成功!" + #~ msgid "Beijing Duizhan Tech, Inc." #~ msgstr "北京堆栈科技有限公司" @@ -5453,9 +5498,6 @@ msgstr "更新组织" #~ "object has no attribute 'keys'" #~ msgstr "导入 {} 个用户成功; 导入 {} 这些用户失败,因为对象没有属性'keys'" -#~ msgid "Monitor" -#~ msgstr "监控" - #~ msgid "Invalid private key" #~ msgstr "ssh密钥不合法" @@ -5549,9 +5591,6 @@ msgstr "更新组织" #~ "Are you sure to remove authentication information for the system user ?" #~ msgstr "你确定清除该系统用户的认证信息吗 ?" -#~ msgid "Clear auth" -#~ msgstr "清除认证信息" - #~ msgid "success" #~ msgstr "成功" diff --git a/apps/ops/ansible/callback.py b/apps/ops/ansible/callback.py index 02004285a..694bb9e27 100644 --- a/apps/ops/ansible/callback.py +++ b/apps/ops/ansible/callback.py @@ -124,6 +124,9 @@ class AdHocResultCallback(CallbackMixin, CallbackModule, CMDCallBackModule): def display_ok_hosts(self): pass + def display_failed_stderr(self): + pass + class CommandResultCallback(AdHocResultCallback): """ diff --git a/apps/ops/ansible/runner.py b/apps/ops/ansible/runner.py index 4c8f87888..5f25ee2c4 100644 --- a/apps/ops/ansible/runner.py +++ b/apps/ops/ansible/runner.py @@ -1,8 +1,11 @@ # ~*~ coding: utf-8 ~*~ import os +import shutil from collections import namedtuple +from ansible import context +from ansible.module_utils.common.collections import ImmutableDict from ansible.executor.task_queue_manager import TaskQueueManager from ansible.vars.manager import VariableManager from ansible.parsing.dataloader import DataLoader @@ -33,29 +36,18 @@ Options = namedtuple('Options', [ def get_default_options(): - options = Options( - listtags=False, - listtasks=False, - listhosts=False, + options = dict( syntax=False, timeout=30, connection='ssh', - module_path='', forks=10, remote_user='root', private_key_file=None, - ssh_common_args="", - ssh_extra_args="", - sftp_extra_args="", - scp_extra_args="", become=None, become_method=None, become_user=None, - verbosity=None, - extra_vars=[], + verbosity=1, check=False, - playbook_path='/etc/ansible/', - passwords=None, diff=False, gathering='implicit', remote_tmp='/tmp/.ansible' @@ -108,9 +100,9 @@ class PlayBookRunner: inventory=self.inventory, variable_manager=self.variable_manager, loader=self.loader, - options=self.options, - passwords=self.passwords + passwords={"conn_pass": self.passwords} ) + context.CLIARGS = ImmutableDict(self.options) if executor._tqm: executor._tqm._stdout_callback = self.results_callback @@ -185,11 +177,10 @@ class AdHocRunner: return cleaned_tasks def update_options(self, options): + _options = {k: v for k, v in self.default_options.items()} if options and isinstance(options, dict): - options = self.__class__.default_options._replace(**options) - else: - options = self.__class__.default_options - return options + _options.update(options) + return _options def run(self, tasks, pattern, play_name='Ansible Ad-hoc', gather_facts='no'): """ @@ -202,6 +193,7 @@ class AdHocRunner: self.check_pattern(pattern) self.results_callback = self.get_result_callback() cleaned_tasks = self.clean_tasks(tasks) + context.CLIARGS = ImmutableDict(self.options) play_source = dict( name=play_name, @@ -220,9 +212,8 @@ class AdHocRunner: inventory=self.inventory, variable_manager=self.variable_manager, loader=self.loader, - options=self.options, stdout_callback=self.results_callback, - passwords=self.options.passwords, + passwords={"conn_pass": self.options.get("password", "")} ) try: tqm.run(play) @@ -230,8 +221,9 @@ class AdHocRunner: except Exception as e: raise AnsibleError(e) finally: - tqm.cleanup() - self.loader.cleanup_all_tmp_files() + if tqm is not None: + tqm.cleanup() + shutil.rmtree(C.DEFAULT_LOCAL_TMP, True) class CommandRunner(AdHocRunner): diff --git a/apps/ops/ansible/test_runner.py b/apps/ops/ansible/test_runner.py index 07c9051f3..e38168a6c 100644 --- a/apps/ops/ansible/test_runner.py +++ b/apps/ops/ansible/test_runner.py @@ -15,7 +15,7 @@ class TestAdHocRunner(unittest.TestCase): host_data = [ { "hostname": "testserver", - "ip": "192.168.244.168", + "ip": "192.168.244.185", "port": 22, "username": "root", "password": "redhat", diff --git a/apps/ops/inventory.py b/apps/ops/inventory.py index e4f11bec1..002b6fbda 100644 --- a/apps/ops/inventory.py +++ b/apps/ops/inventory.py @@ -35,7 +35,6 @@ class JMSBaseInventory(BaseInventory): info["vars"].update({ label.name: label.value }) - info["groups"].append("{}:{}".format(label.name, label.value)) if asset.domain: info["vars"].update({ "domain": asset.domain.name, diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index 50f78187c..b3a2bd35e 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -715,9 +715,12 @@ String.prototype.format = function(args) { return result; }; -function setCookie(key, value) { +function setCookie(key, value, time) { var expires = new Date(); - expires.setTime(expires.getTime() + (24 * 60 * 60 * 1000)); + if (!time) { + time = expires.getTime() + (24 * 60 * 60 * 1000); + } + expires.setTime(time); document.cookie = key + '=' + value + ';expires=' + expires.toUTCString() + ';path=/'; } diff --git a/apps/static/js/plugins/clipboard/clipboard.min.js b/apps/static/js/plugins/clipboard/clipboard.min.js new file mode 100755 index 000000000..4e2a012a6 --- /dev/null +++ b/apps/static/js/plugins/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v1.5.5 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,r){function o(a,c){if(!n[a]){if(!e[a]){var s="function"==typeof require&&require;if(!c&&s)return s(a,!0);if(i)return i(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var l=n[a]={exports:{}};e[a][0].call(l.exports,function(t){var n=e[a][1][t];return o(n?n:t)},l,l.exports,t,e,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;ar;r++)n[r].fn.apply(n[r].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),r=n[t],o=[];if(r&&e)for(var i=0,a=r.length;a>i;i++)r[i].fn!==e&&r[i].fn._!==e&&o.push(r[i]);return o.length?n[t]=o:delete n[t],this}},e.exports=r},{}],8:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}n.__esModule=!0;var i=function(){function t(t,e){for(var n=0;n