From b82a66c83dff77dc211c6d59376a9274b73597d9 Mon Sep 17 00:00:00 2001 From: BaiJiangJie <32935519+BaiJiangJie@users.noreply.github.com> Date: Thu, 28 Mar 2019 12:50:04 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=20=E4=BC=98=E5=8C=96LDAP=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=20(#2550)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 70888 -> 70261 bytes apps/locale/zh/LC_MESSAGES/django.po | 150 +++++----- apps/settings/api.py | 121 ++++---- apps/settings/models.py | 2 + .../settings/_ldap_list_users_modal.html | 29 +- .../templates/settings/ldap_setting.html | 18 +- apps/settings/urls/api_urls.py | 4 +- apps/settings/utils.py | 262 +++++++++--------- apps/templates/_modal.html | 1 + 9 files changed, 316 insertions(+), 271 deletions(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 5bcb3f572fb8cd096ce16deb94d3346aaa363959..ca378770f5ef9e7b815f5e78d799eb536492b9df 100644 GIT binary patch delta 21027 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�FQKQ_xq3 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 delta 21708 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 Gg8u~{u}iuD diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index f0494f3de..3ac062914 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Jumpserver 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-27 12:48+0800\n" +"POT-Creation-Date: 2019-03-28 12:41+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -165,7 +165,7 @@ msgstr "SSH网关,支持代理SSH,RDP和VNC" #: perms/templates/perms/asset_permission_list.html:53 #: perms/templates/perms/asset_permission_list.html:72 #: perms/templates/perms/asset_permission_user.html:54 settings/models.py:29 -#: settings/templates/settings/_ldap_list_users_modal.html:35 +#: settings/templates/settings/_ldap_list_users_modal.html:38 #: settings/templates/settings/command_storage_create.html:41 #: settings/templates/settings/replay_storage_create.html:44 #: settings/templates/settings/terminal_setting.html:80 @@ -207,7 +207,7 @@ msgstr "名称" #: authentication/templates/authentication/new_login.html:90 #: ops/models/adhoc.py:164 perms/templates/perms/asset_permission_list.html:74 #: perms/templates/perms/asset_permission_user.html:55 -#: settings/templates/settings/_ldap_list_users_modal.html:34 users/forms.py:13 +#: settings/templates/settings/_ldap_list_users_modal.html:37 users/forms.py:13 #: users/models/user.py:52 users/templates/users/_select_user_modal.html:14 #: users/templates/users/user_detail.html:67 #: users/templates/users/user_list.html:24 @@ -1025,8 +1025,8 @@ msgstr "其它" #: settings/templates/settings/basic_setting.html:61 #: settings/templates/settings/command_storage_create.html:79 #: settings/templates/settings/email_setting.html:62 -#: settings/templates/settings/ldap_setting.html:62 -#: settings/templates/settings/replay_storage_create.html:152 +#: settings/templates/settings/ldap_setting.html:61 +#: settings/templates/settings/replay_storage_create.html:151 #: settings/templates/settings/security_setting.html:70 #: settings/templates/settings/terminal_setting.html:68 #: terminal/templates/terminal/terminal_update.html:45 @@ -1061,8 +1061,8 @@ msgstr "重置" #: settings/templates/settings/basic_setting.html:62 #: settings/templates/settings/command_storage_create.html:80 #: settings/templates/settings/email_setting.html:63 -#: settings/templates/settings/ldap_setting.html:63 -#: settings/templates/settings/replay_storage_create.html:153 +#: settings/templates/settings/ldap_setting.html:64 +#: settings/templates/settings/replay_storage_create.html:152 #: settings/templates/settings/security_setting.html:71 #: settings/templates/settings/terminal_setting.html:70 #: terminal/templates/terminal/command_list.html:103 @@ -1087,7 +1087,8 @@ msgid "Asset detail" msgstr "资产详情" #: assets/templates/assets/_user_asset_detail_modal.html:23 -#: templates/_modal.html:21 +#: settings/templates/settings/_ldap_list_users_modal.html:96 +#: templates/_modal.html:22 msgid "Close" msgstr "关闭" @@ -1259,7 +1260,7 @@ msgstr "选择节点" #: assets/templates/assets/system_user_detail.html:182 #: assets/templates/assets/system_user_list.html:143 #: settings/templates/settings/terminal_setting.html:165 -#: templates/_modal.html:22 terminal/templates/terminal/session_detail.html:108 +#: 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 @@ -1392,6 +1393,7 @@ msgid "Create asset" msgstr "创建资产" #: assets/templates/assets/asset_list.html:73 +#: settings/templates/settings/_ldap_list_users_modal.html:97 #: users/templates/users/user_list.html:7 #: xpack/plugins/license/templates/license/license_detail.html:101 msgid "Import" @@ -1611,7 +1613,7 @@ msgstr "创建网关" #: assets/templates/assets/domain_gateway_list.html:99 #: assets/templates/assets/domain_gateway_list.html:101 #: settings/templates/settings/email_setting.html:61 -#: settings/templates/settings/ldap_setting.html:61 +#: settings/templates/settings/ldap_setting.html:62 msgid "Test connection" msgstr "测试连接" @@ -2834,38 +2836,33 @@ msgstr "资产授权用户列表" msgid "Asset permission asset list" msgstr "资产授权资产列表" -#: settings/api.py:23 +#: settings/api.py:26 msgid "Test mail sent to {}, please check" msgstr "邮件已经发送{}, 请检查" -#: settings/api.py:47 +#: settings/api.py:50 msgid "Test ldap success" msgstr "连接LDAP成功" -#: settings/api.py:77 settings/utils.py:23 -msgid "Search no entry matched in ou {}" -msgstr "在ou:{}中没有匹配条目" - -#: settings/api.py:86 +#: settings/api.py:87 msgid "Match {} s users" msgstr "匹配 {} 个用户" -#: settings/api.py:109 -msgid "" -"User is not currently selected, please check the user you want to import" -msgstr "当前无勾选用户,请勾选你想要导入的用户" +#: settings/api.py:120 +msgid "succeed: {} failed: {} total: {}" +msgstr "成功:{} 失败:{} 总数:{}" -#: settings/api.py:139 settings/api.py:175 +#: settings/api.py:142 settings/api.py:178 msgid "" "Error: Account invalid (Please make sure the information such as Access key " "or Secret key is correct)" msgstr "错误:账户无效 (请确保 Access key 或 Secret key 等信息正确)" -#: settings/api.py:145 settings/api.py:181 +#: settings/api.py:148 settings/api.py:184 msgid "Create succeed" msgstr "创建成功" -#: settings/api.py:163 settings/api.py:201 +#: settings/api.py:166 settings/api.py:204 #: settings/templates/settings/terminal_setting.html:151 msgid "Delete succeed" msgstr "删除成功" @@ -3108,24 +3105,28 @@ msgid "" "characters" msgstr "开启后,用户密码修改、重置必须包含特殊字符" -#: settings/models.py:126 users/templates/users/reset_password.html:68 +#: settings/models.py:128 users/templates/users/reset_password.html:68 #: users/templates/users/user_profile.html:20 msgid "Setting" msgstr "设置" #: settings/templates/settings/_ldap_list_users_modal.html:7 -msgid "Ldap users" -msgstr "Ldap 用户列表" +msgid "LDAP user list" +msgstr "LDAP 用户列表" -#: settings/templates/settings/_ldap_list_users_modal.html:36 +#: settings/templates/settings/_ldap_list_users_modal.html:9 +msgid "Please submit the LDAP configuration before import" +msgstr "请先提交LDAP配置再进行导入" + +#: settings/templates/settings/_ldap_list_users_modal.html:39 #: users/models/user.py:56 users/templates/users/user_detail.html:71 #: users/templates/users/user_profile.html:59 msgid "Email" msgstr "邮件" -#: settings/templates/settings/_ldap_list_users_modal.html:37 -msgid "Is imported" -msgstr "是否已经导入" +#: settings/templates/settings/_ldap_list_users_modal.html:40 +msgid "Existing" +msgstr "已存在" #: settings/templates/settings/basic_setting.html:15 #: settings/templates/settings/email_setting.html:15 @@ -3182,8 +3183,13 @@ msgid "Doc type" msgstr "文档类型" #: settings/templates/settings/ldap_setting.html:65 -msgid "Sync User" -msgstr "同步用户" +msgid "Bulk import" +msgstr "一键导入" + +#: settings/templates/settings/ldap_setting.html:116 +msgid "" +"User is not currently selected, please check the user you want to import" +msgstr "当前无勾选用户,请勾选你想要导入的用户" #: settings/templates/settings/replay_storage_create.html:66 msgid "Bucket" @@ -3289,44 +3295,17 @@ msgstr "删除失败" msgid "Are you sure about deleting it?" msgstr "您确定删除吗?" -#: settings/utils.py:30 -msgid "Have user but attr mapping error" -msgstr "有用户但attr映射错误" - -#: settings/utils.py:60 -#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:86 -msgid "No" -msgstr "否" - #: settings/utils.py:69 -#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:84 -msgid "Yes" -msgstr "是" +msgid "User does not exist" +msgstr "用户不存在" -#: settings/utils.py:137 -msgid "" -"Import {} users successfully; import {} users failed, the database already " -"exists with the same name" -msgstr "导入 {} 个用户成功; 导入 {} 这些用户失败,数据库已经存在同名的用户" +#: settings/utils.py:72 +msgid "The user source is not LDAP" +msgstr "用户来源不是LDAP" -#: settings/utils.py:142 -msgid "" -"Import {} users successfully; import {} users failed, the database already " -"exists with the same name; import {}users failed, Because’TypeError' object " -"has no attribute 'keys'" -msgstr "" -"导入 {} 个用户成功; 导入 {} 这些用户失败,数据库已经存在同名的用户; 导入 {} " -"这些用户失败,因为对象没有属性'keys'" - -#: settings/utils.py:148 -msgid "Import {} users successfully" -msgstr "导入 {} 个用户成功" - -#: settings/utils.py:151 -msgid "" -"Import {} users successfully;import {} users failed, Because’TypeError' " -"object has no attribute 'keys'" -msgstr "导入 {} 个用户成功; 导入 {} 这些用户失败,因为对象没有属性'keys'" +#: settings/utils.py:146 +msgid "Search no entry matched in ou {}" +msgstr "在ou:{}中没有匹配条目" #: settings/views.py:18 settings/views.py:44 settings/views.py:70 #: settings/views.py:99 settings/views.py:126 settings/views.py:138 @@ -4920,6 +4899,14 @@ msgstr "更改资产上的用户密码时,将会使用与该资产关联的管 msgid "Length" msgstr "长度" +#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:84 +msgid "Yes" +msgstr "是" + +#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:86 +msgid "No" +msgstr "否" + #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:134 msgid "Run plan manually" msgstr "手动执行计划" @@ -5369,6 +5356,33 @@ msgstr "创建组织" msgid "Update org" msgstr "更新组织" +#~ msgid "Sync User" +#~ msgstr "同步用户" + +#~ msgid "Have user but attr mapping error" +#~ msgstr "有用户但attr映射错误" + +#~ msgid "" +#~ "Import {} users successfully; import {} users failed, the database " +#~ "already exists with the same name" +#~ msgstr "导入 {} 个用户成功; 导入 {} 这些用户失败,数据库已经存在同名的用户" + +#~ msgid "" +#~ "Import {} users successfully; import {} users failed, the database " +#~ "already exists with the same name; import {}users failed, " +#~ "Because’TypeError' object has no attribute 'keys'" +#~ msgstr "" +#~ "导入 {} 个用户成功; 导入 {} 这些用户失败,数据库已经存在同名的用户; 导入 " +#~ "{} 这些用户失败,因为对象没有属性'keys'" + +#~ msgid "Import {} users successfully" +#~ msgstr "导入 {} 个用户成功" + +#~ msgid "" +#~ "Import {} users successfully;import {} users failed, Because’TypeError' " +#~ "object has no attribute 'keys'" +#~ msgstr "导入 {} 个用户成功; 导入 {} 这些用户失败,因为对象没有属性'keys'" + #~ msgid "Monitor" #~ msgstr "监控" diff --git a/apps/settings/api.py b/apps/settings/api.py index ff265c076..a65df113d 100644 --- a/apps/settings/api.py +++ b/apps/settings/api.py @@ -5,18 +5,21 @@ import os import json import jms_storage -from ldap3 import Server, Connection from rest_framework.views import Response, APIView from django.conf import settings from django.core.mail import send_mail from django.utils.translation import ugettext_lazy as _ from .models import Setting -from .utils import get_ldap_users_list, save_user +from .utils import LDAPUtil from common.permissions import IsOrgAdmin, IsSuperUser +from common.utils import get_logger from .serializers import MailTestSerializer, LDAPTestSerializer +logger = get_logger(__file__) + + class MailTestingAPI(APIView): permission_classes = (IsOrgAdmin,) serializer_class = MailTestSerializer @@ -46,78 +49,78 @@ class LDAPTestingAPI(APIView): serializer_class = LDAPTestSerializer success_message = _("Test ldap success") + @staticmethod + def get_ldap_util(serializer): + host = serializer.validated_data["AUTH_LDAP_SERVER_URI"] + bind_dn = serializer.validated_data["AUTH_LDAP_BIND_DN"] + password = serializer.validated_data["AUTH_LDAP_BIND_PASSWORD"] + use_ssl = serializer.validated_data.get("AUTH_LDAP_START_TLS", False) + search_ougroup = serializer.validated_data["AUTH_LDAP_SEARCH_OU"] + search_filter = serializer.validated_data["AUTH_LDAP_SEARCH_FILTER"] + attr_map = serializer.validated_data["AUTH_LDAP_USER_ATTR_MAP"] + try: + attr_map = json.loads(attr_map) + except json.JSONDecodeError: + return Response({"error": "AUTH_LDAP_USER_ATTR_MAP not valid"}, status=401) + + util = LDAPUtil( + use_settings_config=False, server_uri=host, bind_dn=bind_dn, + password=password, use_ssl=use_ssl, + search_ougroup=search_ougroup, search_filter=search_filter, + attr_map=attr_map + ) + return util + def post(self, request): serializer = self.serializer_class(data=request.data) - if serializer.is_valid(): - host = serializer.validated_data["AUTH_LDAP_SERVER_URI"] - bind_dn = serializer.validated_data["AUTH_LDAP_BIND_DN"] - password = serializer.validated_data["AUTH_LDAP_BIND_PASSWORD"] - use_ssl = serializer.validated_data.get("AUTH_LDAP_START_TLS", False) - search_ougroup = serializer.validated_data["AUTH_LDAP_SEARCH_OU"] - search_filter = serializer.validated_data["AUTH_LDAP_SEARCH_FILTER"] - attr_map = serializer.validated_data["AUTH_LDAP_USER_ATTR_MAP"] - - try: - attr_map = json.loads(attr_map) - except json.JSONDecodeError: - return Response({"error": "AUTH_LDAP_USER_ATTR_MAP not valid"}, status=401) - - server = Server(host, use_ssl=use_ssl) - conn = Connection(server, bind_dn, password) - try: - conn.bind() - except Exception as e: - return Response({"error": str(e)}, status=401) - - users = [] - for search_ou in str(search_ougroup).split("|"): - ok = conn.search(search_ou, search_filter % ({"user": "*"}), - attributes=list(attr_map.values())) - if not ok: - return Response({"error": _("Search no entry matched in ou {}").format(search_ou)}, status=401) - - for entry in conn.entries: - user = {} - for attr, mapping in attr_map.items(): - if hasattr(entry, mapping): - user[attr] = getattr(entry, mapping) - users.append(user) - if len(users) > 0: - return Response({"msg": _("Match {} s users").format(len(users))}) - else: - return Response({"error": "Have user but attr mapping error"}, status=401) - else: + if not serializer.is_valid(): return Response({"error": str(serializer.errors)}, status=401) + util = self.get_ldap_util(serializer) -class LDAPSyncAPI(APIView): + try: + users = util.get_search_user_items() + except Exception as e: + return Response({"error": str(e)}, status=401) + + if len(users) > 0: + return Response({"msg": _("Match {} s users").format(len(users))}) + else: + return Response({"error": "Have user but attr mapping error"}, status=401) + + +class LDAPUserListApi(APIView): permission_classes = (IsOrgAdmin,) def get(self, request): - ldap_users_list = get_ldap_users_list() - if not isinstance(ldap_users_list, list): - return Response(ldap_users_list, status=401) - return Response(ldap_users_list) + util = LDAPUtil() + try: + users = util.get_search_user_items() + except Exception as e: + users = [] + logger.error(e, exc_info=True) + else: + users = sorted(users, key=lambda u: (u['existing'], u['username'])) + return Response(users) -class LDAPConfirmSyncAPI(APIView): +class LDAPUserSyncAPI(APIView): permission_classes = (IsOrgAdmin,) def post(self, request): user_names = request.data.get('user_names', '') - if not user_names: - error = _('User is not currently selected, please check the user ' - 'you want to import') - return Response({'error': error}, status=401) - ldap_users_list = get_ldap_users_list(user_names=user_names) - if not isinstance(ldap_users_list, list): - return Response(ldap_users_list, status=401) - - save_result = save_user(ldap_users_list) - if 'error' in save_result.keys(): - return Response(save_result, status=401) - return Response(save_result) + util = LDAPUtil() + try: + result = util.sync_users(username_set=user_names) + except Exception as e: + logger.error(e, exc_info=True) + return Response({'error': str(e)}, status=401) + else: + msg = _("succeed: {} failed: {} total: {}").format( + result['succeed'], result['failed'], result['total'] + ) + return Response({'msg': msg}) class ReplayStorageCreateAPI(APIView): diff --git a/apps/settings/models.py b/apps/settings/models.py index 3364037a3..524fa9349 100644 --- a/apps/settings/models.py +++ b/apps/settings/models.py @@ -79,6 +79,8 @@ class Setting(models.Model): obj.cleaned_value = data else: value = obj.cleaned_value + if value is None: + value = {} value.update(data) obj.cleaned_value = value obj.save() diff --git a/apps/settings/templates/settings/_ldap_list_users_modal.html b/apps/settings/templates/settings/_ldap_list_users_modal.html index 433cfc92e..2009e9b58 100644 --- a/apps/settings/templates/settings/_ldap_list_users_modal.html +++ b/apps/settings/templates/settings/_ldap_list_users_modal.html @@ -4,7 +4,10 @@ {% block modal_class %}modal-lg{% endblock %} {% block modal_id %}ldap_list_users_modal{% endblock %} -{% block modal_title%}{% trans "Ldap users" %}{% endblock %} +{% block modal_title%}{% trans "LDAP user list" %}{% endblock %} + +{% block modal_help_message%}
{% trans 'Please submit the LDAP configuration before import' %}
{% endblock %} + {% block modal_body %} @@ -34,7 +37,7 @@ {% trans 'Username' %} {% trans 'Name' %} {% trans 'Email' %} - {% trans 'Is imported' %} + {% trans 'Existing' %} @@ -47,16 +50,25 @@