From b37c8b09bf5787f7e0b68be8d3c9d9be99c881fc Mon Sep 17 00:00:00 2001 From: xinwen Date: Thu, 13 May 2021 16:01:59 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E7=BF=BB=E8=AF=91&=E4=BF=AE=E6=AD=A3=E5=AD=97?= =?UTF-8?q?=E6=AE=B5WECOM=5FSECRET?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/authentication/views/wecom.py | 4 +- apps/jumpserver/conf.py | 2 +- apps/jumpserver/settings/auth.py | 2 +- apps/locale/zh/LC_MESSAGES/django.mo | Bin 74427 -> 74036 bytes apps/locale/zh/LC_MESSAGES/django.po | 424 +++++++++++++------------ apps/settings/api/wecom.py | 2 +- apps/settings/serializers/settings.py | 6 +- apps/static/img/login_dingtalk_log.png | Bin 5062 -> 1518 bytes 8 files changed, 223 insertions(+), 217 deletions(-) diff --git a/apps/authentication/views/wecom.py b/apps/authentication/views/wecom.py index 5dc683f87..6d9592c8a 100644 --- a/apps/authentication/views/wecom.py +++ b/apps/authentication/views/wecom.py @@ -119,7 +119,7 @@ class WeComQRBindCallbackView(WeComQRMixin, View): wecom = WeCom( corpid=settings.WECOM_CORPID, - corpsecret=settings.WECOM_CORPSECRET, + corpsecret=settings.WECOM_SECRET, agentid=settings.WECOM_AGENTID ) wecom_userid, __ = wecom.get_user_id_by_code(code) @@ -177,7 +177,7 @@ class WeComQRLoginCallbackView(AuthMixin, WeComQRMixin, View): wecom = WeCom( corpid=settings.WECOM_CORPID, - corpsecret=settings.WECOM_CORPSECRET, + corpsecret=settings.WECOM_SECRET, agentid=settings.WECOM_AGENTID ) wecom_userid, __ = wecom.get_user_id_by_code(code) diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 57c754942..7bb8dd095 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -219,7 +219,7 @@ class Config(dict): 'AUTH_WECOM': False, 'WECOM_CORPID': '', 'WECOM_AGENTID': '', - 'WECOM_CORPSECRET': '', + 'WECOM_SECRET': '', 'AUTH_DINGTALK': False, 'DINGTALK_AGENTID': '', diff --git a/apps/jumpserver/settings/auth.py b/apps/jumpserver/settings/auth.py index 4fb77cb47..28f65a643 100644 --- a/apps/jumpserver/settings/auth.py +++ b/apps/jumpserver/settings/auth.py @@ -105,7 +105,7 @@ AUTH_SSO_AUTHKEY_TTL = CONFIG.AUTH_SSO_AUTHKEY_TTL AUTH_WECOM = CONFIG.AUTH_WECOM WECOM_CORPID = CONFIG.WECOM_CORPID WECOM_AGENTID = CONFIG.WECOM_AGENTID -WECOM_CORPSECRET = CONFIG.WECOM_CORPSECRET +WECOM_SECRET = CONFIG.WECOM_SECRET # DingDing auth AUTH_DINGTALK = CONFIG.AUTH_DINGTALK diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index c7bd94308a579bcb334dd636c31e63416167f69f..71f503ed789d16541a18dac7a8b752eb08da0f96 100644 GIT binary patch delta 21034 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 ehF?2Li?Hj=yRU@AKo*Gk)9{iCerF#e4E|@ zBwgXwdXBl8_#yJGY4-;C^|a|pz7OdWUk`p8p}rdVUDPiljV8a9`V_oM`5g6$lqZok zyL}qE@Mj3Ym!wzM3^M0PJLq_Uj`#7^RopVY@H^uCt;|_Yn_%zG1`(cEBFk(fKk`qk zbq8WoC{HK7LH=XXC#2J))Wk+I!V1z9%DE}mdo>;YKFAZ-9p>9K&=}ekf`9Hz}0zXTF96xjf__62I)t)F?8f3^`q| z<8IOwZ@EU1e#O0SHHuC*j+PsVUGolY6zysEk1;OM<0EzBDn%O295<<-Noqm5?5p87 z6XN_ku~UVl>nU}^urcMWxRCN1tW3Kvtj&+)buFR%Gxc_PBO9ml{Uz@U3nWojm9~#5 zHzSpxJkQ3MhG(f;OZ*z~U%agwM|d)lt4kymH4Vt8(CR(RKulME(s9cBeI<56J3rE^ zD;ISYDHkTt2oKq8dlaMYG7cy9fP7PuuCL73Qt^1LunwyDf{Ib3St{5ykn#`)sY|mpm z45{lZaa|u^Gtw5~OR3Lk@hX(}kwz2SM{GKFC9NZ!BK>OZ#*v>z(zS;6rTv{YzW=vC zdm22Yq7W&Zd|J1S(-+5*4$$~>{FVBPcpaliy0TN(&?dO!hMcA5N$=4&!lJy?cBb_U zqWx)o-C8@umU;b}hQ;P0nueq+lxSaCl&1VWZXo^PE!{LBe*(EZq{Sp%lW92K)ZIx^6zAUNz&oNXrJKTEuG7A{l=m-5_1JdFzpnqiq}R}Hsx;9O8x;c zTwc$PtQnPgb$Q1(&-3rV|7y{=RrLSU;-}_$|J~x~j_`j6F7C+T?b#yX-@ytkV*eem zR%!oxalM*{dt>&b_5SvD{C|Qh@IQrYtxEo<@UI${{eRT3-2bCyZmS0Ws&UWER*_Pm z**ktI^IA0XPf7L8!b~Y^yT0L{64gC8Fm=1`9h3T{L?yNMPZ{2?R;n)NYlOw*1Xk~;QFIXo~|hLjg0DrEQ8p1mV;(twUhF}*t`b?TMWqg~Gq9a944)CtIv z)T3+9cHLt-^y)$Iy%^uH-ahlAQaa7w8\n" "Language-Team: JumpServer team\n" @@ -25,7 +25,7 @@ msgstr "" #: orgs/models.py:23 perms/models/base.py:49 settings/models.py:29 #: terminal/models/storage.py:23 terminal/models/storage.py:90 #: terminal/models/task.py:16 terminal/models/terminal.py:100 -#: users/forms/profile.py:32 users/models/group.py:15 users/models/user.py:555 +#: users/forms/profile.py:32 users/models/group.py:15 users/models/user.py:558 #: users/templates/users/_select_user_modal.html:13 #: users/templates/users/user_asset_permission.html:37 #: users/templates/users/user_asset_permission.html:154 @@ -61,7 +61,7 @@ msgstr "激活中" #: orgs/models.py:26 perms/models/base.py:57 settings/models.py:34 #: terminal/models/storage.py:29 terminal/models/storage.py:96 #: terminal/models/terminal.py:114 tickets/models/ticket.py:73 -#: users/models/group.py:16 users/models/user.py:588 +#: users/models/group.py:16 users/models/user.py:591 #: xpack/plugins/change_auth_plan/models.py:77 xpack/plugins/cloud/models.py:35 #: xpack/plugins/cloud/models.py:98 xpack/plugins/gathered_user/models.py:26 msgid "Comment" @@ -99,7 +99,7 @@ msgstr "动作" #: terminal/backends/command/models.py:18 #: terminal/backends/command/serializers.py:12 terminal/models/session.py:38 #: tickets/models/comment.py:17 users/models/user.py:184 -#: users/models/user.py:743 users/models/user.py:769 +#: users/models/user.py:746 users/models/user.py:772 #: users/serializers/group.py:20 #: users/templates/users/user_asset_permission.html:38 #: users/templates/users/user_asset_permission.html:64 @@ -180,7 +180,7 @@ msgstr "格式为逗号分隔的字符串, * 表示匹配所有. " #: applications/serializers/attrs/application_type/vmware_client.py:26 #: assets/models/base.py:251 assets/models/gathered_user.py:15 #: audits/models.py:100 authentication/forms.py:15 authentication/forms.py:17 -#: ops/models/adhoc.py:148 users/forms/profile.py:31 users/models/user.py:553 +#: ops/models/adhoc.py:148 users/forms/profile.py:31 users/models/user.py:556 #: users/templates/users/_select_user_modal.html:14 #: xpack/plugins/change_auth_plan/models.py:47 #: xpack/plugins/change_auth_plan/models.py:278 @@ -483,7 +483,7 @@ msgstr "标签管理" #: assets/models/cluster.py:28 assets/models/cmd_filter.py:26 #: assets/models/cmd_filter.py:67 assets/models/group.py:21 #: common/db/models.py:70 common/mixins/models.py:49 orgs/models.py:24 -#: orgs/models.py:422 perms/models/base.py:55 users/models/user.py:596 +#: orgs/models.py:422 perms/models/base.py:55 users/models/user.py:599 #: users/serializers/group.py:35 xpack/plugins/change_auth_plan/models.py:81 #: xpack/plugins/cloud/models.py:104 xpack/plugins/gathered_user/models.py:30 msgid "Created by" @@ -497,7 +497,7 @@ msgstr "创建者" #: assets/models/label.py:25 common/db/models.py:72 common/mixins/models.py:50 #: ops/models/adhoc.py:38 ops/models/command.py:29 orgs/models.py:25 #: orgs/models.py:420 perms/models/base.py:56 users/models/group.py:18 -#: users/models/user.py:770 xpack/plugins/cloud/models.py:107 +#: users/models/user.py:773 xpack/plugins/cloud/models.py:107 msgid "Date created" msgstr "创建日期" @@ -543,7 +543,7 @@ msgstr "带宽" msgid "Contact" msgstr "联系人" -#: assets/models/cluster.py:22 users/models/user.py:574 +#: assets/models/cluster.py:22 users/models/user.py:577 msgid "Phone" msgstr "手机" @@ -569,7 +569,7 @@ msgid "Default" msgstr "默认" #: assets/models/cluster.py:36 assets/models/label.py:14 -#: users/models/user.py:755 +#: users/models/user.py:758 msgid "System" msgstr "系统" @@ -814,11 +814,11 @@ msgid "Backend" msgstr "后端" #: assets/serializers/asset_user.py:80 users/forms/profile.py:160 -#: users/models/user.py:585 users/templates/users/user_password_update.html:48 +#: users/models/user.py:588 users/templates/users/user_password_update.html:48 msgid "Public key" msgstr "SSH公钥" -#: assets/serializers/asset_user.py:84 users/models/user.py:582 +#: assets/serializers/asset_user.py:84 users/models/user.py:585 msgid "Private key" msgstr "ssh私钥" @@ -1127,7 +1127,7 @@ msgstr "用户代理" #: audits/models.py:105 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: authentication/templates/authentication/login_otp.html:6 -#: users/forms/profile.py:64 users/models/user.py:577 +#: users/forms/profile.py:64 users/models/user.py:580 #: users/serializers/profile.py:104 msgid "MFA" msgstr "多因子认证" @@ -1206,10 +1206,14 @@ msgstr "" #: audits/signals_handler.py:60 #: authentication/templates/authentication/login.html:210 -#: notifications/models.py:16 msgid "WeCom" msgstr "企业微信" +#: audits/signals_handler.py:61 +#: authentication/templates/authentication/login.html:215 +msgid "DingTalk" +msgstr "钉钉" + #: authentication/api/mfa.py:60 msgid "Code is invalid" msgstr "Code无效" @@ -1310,7 +1314,7 @@ msgid "ACL is not allowed" msgstr "ACL 不被允许" #: authentication/errors.py:36 -msgid "Wecom login only for local user" +msgid "Only local users are allowed" msgstr "" #: authentication/errors.py:46 @@ -1370,15 +1374,15 @@ msgstr "来源 IP 不被允许登录" msgid "SSO auth closed" msgstr "SSO 认证关闭了" -#: authentication/errors.py:273 authentication/views/login.py:227 +#: authentication/errors.py:273 authentication/mixins.py:271 msgid "Your password is too simple, please change it for security" msgstr "你的密码过于简单,为了安全,请修改" -#: authentication/errors.py:282 authentication/views/login.py:242 +#: authentication/errors.py:282 authentication/mixins.py:278 msgid "You should to change your password before login" msgstr "登录完成前,请先修改密码" -#: authentication/errors.py:291 authentication/views/login.py:258 +#: authentication/errors.py:291 authentication/mixins.py:285 msgid "Your password has expired, please reset before logging in" msgstr "您的密码已过期,先修改再登录" @@ -1395,6 +1399,10 @@ msgstr "{} 天内自动登录" msgid "MFA code" msgstr "多因子认证验证码" +#: authentication/mixins.py:261 +msgid "Please change your password" +msgstr "请修改密码" + #: authentication/models.py:40 msgid "Private Token" msgstr "SSH密钥" @@ -1417,7 +1425,7 @@ msgstr "文档" #: authentication/templates/authentication/_access_key_modal.html:31 msgid "Secret" -msgstr "密文" +msgstr "秘钥" #: authentication/templates/authentication/_access_key_modal.html:33 msgid "Date" @@ -1467,7 +1475,6 @@ msgid "Need MFA for view auth" msgstr "需要多因子认证来查看账号信息" #: authentication/templates/authentication/_mfa_confirm_modal.html:20 -#: authentication/views/login.py:246 authentication/views/login.py:262 #: templates/_modal.html:23 users/templates/users/user_password_verify.html:20 msgid "Confirm" msgstr "确认" @@ -1503,11 +1510,6 @@ msgstr "OpenID" msgid "CAS" msgstr "" -#: authentication/templates/authentication/login.html:215 -#: notifications/models.py:18 -msgid "DingTalk" -msgstr "钉钉" - #: authentication/templates/authentication/login_otp.html:17 msgid "One-time password" msgstr "一次性密码" @@ -1538,7 +1540,6 @@ msgid "Copy link" msgstr "复制链接" #: authentication/templates/authentication/login_wait_confirm.html:51 -#: templates/flash_message_standalone.html:38 msgid "Return" msgstr "返回" @@ -1587,11 +1588,19 @@ msgstr "" msgid "Binding DingTalk failed" msgstr "" -#: authentication/views/login.py:55 +#: authentication/views/login.py:59 +msgid "Redirecting" +msgstr "" + +#: authentication/views/login.py:60 +msgid "Redirecting to {} authentication" +msgstr "" + +#: authentication/views/login.py:84 msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" -#: authentication/views/login.py:173 +#: authentication/views/login.py:202 msgid "" "Wait for {} confirm, You also can copy link to her/him
\n" " Don't close this page" @@ -1599,23 +1608,18 @@ msgstr "" "等待 {} 确认, 你也可以复制链接发给他/她
\n" " 不要关闭本页面" -#: authentication/views/login.py:178 +#: authentication/views/login.py:207 msgid "No ticket found" msgstr "没有发现工单" -#: authentication/views/login.py:210 +#: authentication/views/login.py:239 msgid "Logout success" msgstr "退出登录成功" -#: authentication/views/login.py:211 +#: authentication/views/login.py:240 msgid "Logout success, return login page" msgstr "退出登录成功,返回到登录页面" -#: authentication/views/login.py:226 authentication/views/login.py:241 -#: authentication/views/login.py:257 -msgid "Please change your password" -msgstr "请修改密码" - #: authentication/views/wecom.py:75 msgid "WeCom is already bound" msgstr "" @@ -1764,7 +1768,7 @@ msgstr "JumpServer 开源堡垒机" msgid "

Flow service unavailable, check it

" msgstr "" -#: jumpserver/views/other.py:27 +#: jumpserver/views/other.py:25 msgid "" "
Luna is a separately deployed program, you need to deploy Luna, koko, " "configure nginx for url distribution,
If you see this page, " @@ -1773,11 +1777,11 @@ msgstr "" "
Luna是单独部署的一个程序,你需要部署luna,koko,
如果你看到了" "这个页面,证明你访问的不是nginx监听的端口,祝你好运
" -#: jumpserver/views/other.py:71 +#: jumpserver/views/other.py:69 msgid "Websocket server run on port: {}, you should proxy it on nginx" msgstr "Websocket 服务运行在端口: {}, 请检查nginx是否代理是否设置" -#: jumpserver/views/other.py:85 +#: jumpserver/views/other.py:83 msgid "" "
Koko is a separately deployed program, you need to deploy Koko, " "configure nginx for url distribution,
If you see this page, " @@ -1787,20 +1791,6 @@ msgstr "" "div>
如果你看到了这个页面,证明你访问的不是nginx监听的端口,祝你好运" -#: notifications/models.py:17 users/forms/profile.py:101 -#: users/models/user.py:557 -msgid "Email" -msgstr "邮件" - -#: notifications/models.py:67 templates/_nav.html:110 terminal/apps.py:9 -#: terminal/serializers/session.py:40 -msgid "Terminal" -msgstr "终端" - -#: notifications/models.py:68 ops/apps.py:9 -msgid "Operations" -msgstr "运维" - #: ops/api/celery.py:61 ops/api/celery.py:76 msgid "Waiting task start" msgstr "等待任务开始" @@ -1809,6 +1799,10 @@ msgstr "等待任务开始" msgid "Not has host {} permission" msgstr "没有该主机 {} 权限" +#: ops/apps.py:9 +msgid "Operations" +msgstr "运维" + #: ops/mixin.py:29 ops/mixin.py:92 ops/mixin.py:160 msgid "Cycle perform" msgstr "周期执行" @@ -1936,18 +1930,10 @@ msgstr "任务开始" msgid "Command `{}` is forbidden ........" msgstr "命令 `{}` 不允许被执行 ......." -#: ops/models/command.py:115 +#: ops/models/command.py:113 msgid "Task end" msgstr "任务结束" -#: ops/notifications.py:10 -msgid "Server performance" -msgstr "服务器性能" - -#: ops/notifications.py:17 -msgid "Disk used more than 80%: {} => {}" -msgstr "磁盘使用率超过 80%: {} => {}" - #: ops/tasks.py:71 msgid "Clean task history period" msgstr "定期清除任务历史" @@ -1964,6 +1950,10 @@ msgstr "任务列表" msgid "Update task content: {}" msgstr "更新任务内容: {}" +#: ops/utils.py:74 +msgid "Disk used more than 80%: {} => {}" +msgstr "磁盘使用率超过 80%: {} => {}" + #: orgs/api.py:76 #, python-brace-format msgid "Have `{model._meta.verbose_name}` exists, Please delete" @@ -1991,7 +1981,7 @@ msgstr "组织审计员" msgid "GLOBAL" msgstr "全局组织" -#: orgs/models.py:419 users/models/user.py:565 +#: orgs/models.py:419 users/models/user.py:568 #: users/templates/users/_select_user_modal.html:15 msgid "Role" msgstr "角色" @@ -2063,7 +2053,7 @@ msgid "Favorite" msgstr "收藏夹" #: perms/models/base.py:51 templates/_nav.html:21 users/models/group.py:31 -#: users/models/user.py:561 users/templates/users/_select_user_modal.html:16 +#: users/models/user.py:564 users/templates/users/_select_user_modal.html:16 #: users/templates/users/user_asset_permission.html:39 #: users/templates/users/user_asset_permission.html:67 #: users/templates/users/user_database_app_permission.html:38 @@ -2076,7 +2066,7 @@ msgstr "用户组" #: tickets/serializers/ticket/meta/ticket_type/apply_application.py:77 #: tickets/serializers/ticket/meta/ticket_type/apply_asset.py:43 #: tickets/serializers/ticket/meta/ticket_type/apply_asset.py:81 -#: users/models/user.py:593 +#: users/models/user.py:596 msgid "Date expired" msgstr "失效日期" @@ -2473,16 +2463,16 @@ msgid "Multiple user using , split" msgstr "多个用户,使用 , 分割" #: settings/serializers/settings.py:193 -msgid "Corporation ID" +msgid "Corporation ID(corpid)" msgstr "企业 ID(CorpId)" #: settings/serializers/settings.py:194 -msgid "Agent ID" +msgid "Agent ID(agentid)" msgstr "应用 ID(AgentId)" #: settings/serializers/settings.py:195 -msgid "Corporation Secret" -msgstr "凭证密钥(Secret)" +msgid "Secret(secret)" +msgstr "秘钥(secret)" #: settings/serializers/settings.py:196 msgid "Enable WeCom Auth" @@ -2810,6 +2800,11 @@ msgstr "Web终端" msgid "File manager" msgstr "文件管理" +#: templates/_nav.html:110 terminal/apps.py:9 +#: terminal/serializers/session.py:40 +msgid "Terminal" +msgstr "终端" + #: templates/_nav.html:121 msgid "Job Center" msgstr "作业中心" @@ -2895,6 +2890,14 @@ msgstr "确认删除" msgid "Are you sure delete" msgstr "您确定删除吗?" +#: templates/flash_message_standalone.html:28 +msgid "Cancel" +msgstr "取消" + +#: templates/flash_message_standalone.html:37 +msgid "Go" +msgstr "" + #: templates/index.html:11 msgid "Total users" msgstr "用户总数" @@ -3224,89 +3227,6 @@ msgstr "命令存储" msgid "Replay storage" msgstr "录像存储" -#: terminal/notifications.py:29 -msgid "Terminal command alert" -msgstr "终端命令告警" - -#: terminal/notifications.py:38 -#, python-format -msgid "" -"\n" -" Command: %(command)s\n" -"
\n" -" Asset: %(host_name)s (%(host_ip)s)\n" -"
\n" -" User: %(user)s\n" -"
\n" -" Level: %(risk_level)s\n" -"
\n" -" Session: session " -"detail\n" -"
\n" -" " -msgstr "" -"\n" -" 命令: %(command)s\n" -"
\n" -" 资产: %(host_name)s (%(host_ip)s)\n" -"
\n" -" 用户: %(user)s\n" -"
\n" -" 等级: %(risk_level)s\n" -"
\n" -" 会话: 会话详情\n" -"
\n" -" " - -#: terminal/notifications.py:73 -#, python-format -msgid "" -"Insecure Command Alert: [%(name)s->%(login_from)s@%(remote_addr)s] $" -"%(command)s" -msgstr "危险命令告警: [%(name)s->%(login_from)s@%(remote_addr)s] $%(command)s" - -#: terminal/notifications.py:90 -msgid "Batch command alert" -msgstr "批量命令告警" - -#: terminal/notifications.py:101 -#, python-format -msgid "" -"\n" -"
\n" -" Assets: %(assets)s\n" -"
\n" -" User: %(user)s\n" -"
\n" -" Level: %(risk_level)s\n" -"
\n" -"\n" -" ----------------- Commands ---------------- " -"
\n" -" %(command)s
\n" -" ----------------- Commands ---------------- " -"
\n" -" " -msgstr "" -"\n" -"
\n" -" 资产: %(assets)s\n" -"
\n" -" 用户: %(user)s\n" -"
\n" -" 等级: %(risk_level)s\n" -"
\n" -"\n" -" ----------------- 命令 ----------------
\n" -" %(command)s
\n" -" ----------------- 命令 ----------------
\n" -" " - -#: terminal/notifications.py:127 -#, python-format -msgid "Insecure Web Command Execution Alert: [%(name)s]" -msgstr "Web页面-> 命令执行 告警: [%(name)s]" - #: terminal/serializers/session.py:33 msgid "User ID" msgstr "用户 ID" @@ -3400,6 +3320,78 @@ msgstr "忽略证书认证" msgid "Not found" msgstr "没有发现" +#: terminal/utils.py:78 +#, python-format +msgid "" +"Insecure Command Alert: [%(name)s->%(login_from)s@%(remote_addr)s] $" +"%(command)s" +msgstr "危险命令告警: [%(name)s->%(login_from)s@%(remote_addr)s] $%(command)s" + +#: terminal/utils.py:86 +#, python-format +msgid "" +"\n" +" Command: %(command)s\n" +"
\n" +" Asset: %(host_name)s (%(host_ip)s)\n" +"
\n" +" User: %(user)s\n" +"
\n" +" Level: %(risk_level)s\n" +"
\n" +" Session: session detail\n" +"
\n" +" " +msgstr "" +"\n" +" 命令: %(command)s\n" +"
\n" +" 资产: %(host_name)s (%(host_ip)s)\n" +"
\n" +" 用户: %(user)s\n" +"
\n" +" 等级: %(risk_level)s\n" +"
\n" +" 会话: 会话详情\n" +"
\n" +" " + +#: terminal/utils.py:113 +#, python-format +msgid "Insecure Web Command Execution Alert: [%(name)s]" +msgstr "Web页面-> 命令执行 告警: [%(name)s]" + +#: terminal/utils.py:121 +#, python-format +msgid "" +"\n" +"
\n" +" Assets: %(assets)s\n" +"
\n" +" User: %(user)s\n" +"
\n" +" Level: %(risk_level)s\n" +"
\n" +"\n" +" ----------------- Commands ----------------
\n" +" %(command)s
\n" +" ----------------- Commands ----------------
\n" +" " +msgstr "" +"\n" +"
\n" +" 资产: %(assets)s\n" +"
\n" +" 用户: %(user)s\n" +"
\n" +" 等级: %(risk_level)s\n" +"
\n" +"\n" +" ----------------- 命令 ----------------
\n" +" %(command)s
\n" +" ----------------- 命令 ----------------
\n" +" " + #: tickets/const.py:8 msgid "General" msgstr "一般" @@ -3560,8 +3552,6 @@ msgid "Applied from command filter rules" msgstr "申请来自命令过滤规则" #: tickets/handler/command_confirm.py:30 -#, fuzzy -#| msgid "Applied from command filter rules" msgid "Applied from command filter" msgstr "申请来自命令过滤规则" @@ -3727,8 +3717,6 @@ msgid "From cmd filter rule" msgstr "来自命令过滤规则" #: tickets/serializers/ticket/meta/ticket_type/command_confirm.py:22 -#, fuzzy -#| msgid "From cmd filter rule" msgid "From cmd filter" msgstr "来自命令过滤规则" @@ -3836,6 +3824,10 @@ msgstr "确认密码" msgid "Password does not match" msgstr "密码不一致" +#: users/forms/profile.py:101 users/models/user.py:560 +msgid "Email" +msgstr "邮件" + #: users/forms/profile.py:108 msgid "Old password" msgstr "原来密码" @@ -3885,27 +3877,27 @@ msgstr "强制启用" msgid "Local" msgstr "数据库" -#: users/models/user.py:568 +#: users/models/user.py:571 msgid "Avatar" msgstr "头像" -#: users/models/user.py:571 +#: users/models/user.py:574 msgid "Wechat" msgstr "微信" -#: users/models/user.py:601 +#: users/models/user.py:604 msgid "Source" msgstr "用户来源" -#: users/models/user.py:605 +#: users/models/user.py:608 msgid "Date password last updated" msgstr "最后更新密码日期" -#: users/models/user.py:751 +#: users/models/user.py:754 msgid "Administrator" msgstr "管理员" -#: users/models/user.py:754 +#: users/models/user.py:757 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" @@ -4293,7 +4285,7 @@ msgstr "" "
\n" " " -#: users/utils.py:116 users/views/profile/reset.py:80 +#: users/utils.py:116 users/views/profile/reset.py:126 msgid "Reset password success" msgstr "重置密码成功" @@ -4522,7 +4514,7 @@ msgstr "多因子认证禁用成功,返回登录页面" msgid "Password update" msgstr "密码更新" -#: users/views/profile/password.py:60 users/views/profile/reset.py:127 +#: users/views/profile/password.py:60 users/views/profile/reset.py:105 msgid "* Your password does not meet the requirements" msgstr "* 您的密码不符合要求" @@ -4534,41 +4526,41 @@ msgstr "用户名或密码无效" msgid "Public key update" msgstr "密钥更新" -#: users/views/profile/reset.py:46 +#: users/views/profile/reset.py:40 +msgid "Send reset password message" +msgstr "发送重置密码邮件" + +#: users/views/profile/reset.py:41 +msgid "Send reset password mail success, login your mail box and follow it " +msgstr "" +"发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)" + +#: users/views/profile/reset.py:52 msgid "Email address invalid, please input again" msgstr "邮箱地址错误,重新输入" -#: users/views/profile/reset.py:52 +#: users/views/profile/reset.py:58 msgid "" "The user is from {}, please go to the corresponding system to change the " "password" msgstr "用户来自 {} 请去相应系统修改密码" -#: users/views/profile/reset.py:66 -msgid "Send reset password message" -msgstr "发送重置密码邮件" - -#: users/views/profile/reset.py:67 -msgid "Send reset password mail success, login your mail box and follow it " -msgstr "" -"发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)" - -#: users/views/profile/reset.py:81 -msgid "Reset password success, return to login page" -msgstr "重置密码成功,返回到登录页面" - -#: users/views/profile/reset.py:105 users/views/profile/reset.py:115 +#: users/views/profile/reset.py:83 users/views/profile/reset.py:93 msgid "Token invalid or expired" msgstr "Token错误或失效" -#: users/views/profile/reset.py:120 +#: users/views/profile/reset.py:98 msgid "User auth from {}, go there change password" msgstr "用户认证源来自 {}, 请去相应系统修改密码" -#: users/views/profile/reset.py:133 +#: users/views/profile/reset.py:111 msgid "* The new password cannot be the last {} passwords" msgstr "* 新密码不能是最近 {} 次的密码" +#: users/views/profile/reset.py:127 +msgid "Reset password success, return to login page" +msgstr "重置密码成功,返回到登录页面" + #: xpack/plugins/change_auth_plan/meta.py:9 #: xpack/plugins/change_auth_plan/models.py:89 #: xpack/plugins/change_auth_plan/models.py:184 @@ -5045,20 +5037,35 @@ msgstr "旗舰版" msgid "Community edition" msgstr "社区版" +#, fuzzy +#~| msgid "Agent Secret" +#~ msgid "WeCom Secret" +#~ msgstr "凭证密钥(secret)" + +#~ msgid "Server performance" +#~ msgstr "服务器性能" + +#~ msgid "Corporation Secret" +#~ msgstr "凭证密钥(Secret)" + +#~ msgid "Terminal command alert" +#~ msgstr "终端命令告警" + #, python-format #~ msgid "" #~ "\n" -#~ " Command: %(command)s\n" -#~ "
\n" -#~ " Asset: %(host_name)s (%(host_ip)s)\n" -#~ "
\n" -#~ " User: %(user)s\n" -#~ "
\n" -#~ " Level: %(risk_level)s\n" -#~ "
\n" -#~ " Session: session detail\n" -#~ "
\n" -#~ " " +#~ " Command: %(command)s\n" +#~ "
\n" +#~ " Asset: %(host_name)s (%(host_ip)s)\n" +#~ "
\n" +#~ " User: %(user)s\n" +#~ "
\n" +#~ " Level: %(risk_level)s\n" +#~ "
\n" +#~ " Session: session detail\n" +#~ "
\n" +#~ " " #~ msgstr "" #~ "\n" #~ " 命令: %(command)s\n" @@ -5073,21 +5080,26 @@ msgstr "社区版" #~ "
\n" #~ " " +#~ msgid "Batch command alert" +#~ msgstr "批量命令告警" + #, python-format #~ msgid "" #~ "\n" -#~ "
\n" -#~ " Assets: %(assets)s\n" -#~ "
\n" -#~ " User: %(user)s\n" -#~ "
\n" -#~ " Level: %(risk_level)s\n" -#~ "
\n" +#~ "
\n" +#~ " Assets: %(assets)s\n" +#~ "
\n" +#~ " User: %(user)s\n" +#~ "
\n" +#~ " Level: %(risk_level)s\n" +#~ "
\n" #~ "\n" -#~ " ----------------- Commands ----------------
\n" -#~ " %(command)s
\n" -#~ " ----------------- Commands ----------------
\n" -#~ " " +#~ " ----------------- Commands ---------------- " +#~ "
\n" +#~ " %(command)s
\n" +#~ " ----------------- Commands ---------------- " +#~ "
\n" +#~ " " #~ msgstr "" #~ "\n" #~ "
\n" @@ -5109,9 +5121,6 @@ msgstr "社区版" #~ msgid "Command Alert" #~ msgstr "命令告警" -#~ msgid "Agent Secret" -#~ msgstr "凭证密钥(secret)" - #~ msgid "APP key" #~ msgstr "APPKEY" @@ -5190,9 +5199,6 @@ msgstr "社区版" #~ msgid "This will reset the user password and send a reset mail" #~ msgstr "将失效用户当前密码,并发送重设密码邮件到用户邮箱" -#~ msgid "Cancel" -#~ msgstr "取消" - #~ msgid "" #~ "The reset-ssh-public-key E-mail has been sent successfully. Please inform " #~ "the user to update his new ssh public key." diff --git a/apps/settings/api/wecom.py b/apps/settings/api/wecom.py index 0fda33c61..3087efd1f 100644 --- a/apps/settings/api/wecom.py +++ b/apps/settings/api/wecom.py @@ -20,7 +20,7 @@ class WeComTestingAPI(GenericAPIView): wecom_corpid = serializer.validated_data['WECOM_CORPID'] wecom_agentid = serializer.validated_data['WECOM_AGENTID'] - wecom_corpsecret = serializer.validated_data['WECOM_CORPSECRET'] + wecom_corpsecret = serializer.validated_data['WECOM_SECRET'] try: params = {'corpid': wecom_corpid, 'corpsecret': wecom_corpsecret} diff --git a/apps/settings/serializers/settings.py b/apps/settings/serializers/settings.py index 5d33a1d83..3aca30c10 100644 --- a/apps/settings/serializers/settings.py +++ b/apps/settings/serializers/settings.py @@ -190,9 +190,9 @@ class SecuritySettingSerializer(serializers.Serializer): class WeComSettingSerializer(serializers.Serializer): - WECOM_CORPID = serializers.CharField(max_length=256, required=True, label=_('Corporation ID')) - WECOM_AGENTID = serializers.CharField(max_length=256, required=True, label=_("Agent ID")) - WECOM_CORPSECRET = serializers.CharField(max_length=256, required=False, label=_("Corporation Secret"), write_only=True) + WECOM_CORPID = serializers.CharField(max_length=256, required=True, label=_('Corporation ID(corpid)')) + WECOM_AGENTID = serializers.CharField(max_length=256, required=True, label=_("Agent ID(agentid)")) + WECOM_SECRET = serializers.CharField(max_length=256, required=True, label=_("Secret(secret)"), write_only=True) AUTH_WECOM = serializers.BooleanField(default=False, label=_('Enable WeCom Auth')) diff --git a/apps/static/img/login_dingtalk_log.png b/apps/static/img/login_dingtalk_log.png index 998f730ad056a13c1e9b06036be3851055524550..61ef4e4d4f016223e8780806b8fb36cc48383870 100644 GIT binary patch delta 1391 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