LDAP3 вызывает LDAPOpenSocketError в нескольких случаях, в то время как я ожидаю более конкретные исключения - PullRequest
0 голосов
/ 11 июля 2019

Я бы хотел, чтобы пользователи меняли конфигурацию LDAP через графический интерфейс, но перед тем, как сохранить эти параметры вслепую, я хочу убедиться, что они действительны. Итак, я пытаюсь привязать к LDAP и перехватить исключения. Что я заметил, что LDAP3 вызывает исключение LDAPSocketOpenError для нескольких ошибок, хотя я ожидаю, что оно вызовет более конкретные исключения.

    ldap3_tls_ctx = ldap3.Tls(
        validate = ssl.CERT_REQUIRED,
        version = ssl.PROTOCOL_TLSv1,
        ca_certs_file = crt_name,
        valid_names = valid_names
    )

    #: Initialize LDAP server
    ldap_srv = ldap3.Server(
        hostname,
        port = port,
        use_ssl = use_ssl,
        tls = ldap3_tls_ctx,
        connect_timeout = 2
    )

    #: Initiate LDAP connection
    ldap_connection = ldap3.Connection(
        ldap_srv,
        user = username,
        password = password,
        read_only = True,
        client_strategy = ldap3.SYNC,
        authentication = authentication,
        check_names = True,
        raise_exceptions = True
    )

    try:
        #: Try to bind to LDAP server using configured credentials
        ldap_connection.bind()
    except Exception as exception:
        #: Process exceptions
        exception_type = exception.__class__.__name__

Так, во многих случаях, таких как неправильное имя хоста (неразрешимое), или тайм-аут (неправильный порт), или неправильный сертификат (контекст TLS), или отсутствие допустимых имен, LDAP3 вызывает то же исключение - LDAPSocketOpenError. Мой тип_исключения всегда установлен на это значение.

Я ожидал более конкретных исключений, таких как LDAPCertificateError, LDAPInvalidPort и т. Д. Кроме того, я заметил, что LDAPSocketOpenError содержит аргумент 'args', который содержит описание ошибки. Тем не менее, его структура отличается для разных ошибок, и поэтому я не уверен, как проанализировать его, чтобы захватить разные ошибки

Я также пытался отключить объект «Исключения для соединения» (lift_exception = False), но это не помогает для уровня ошибок «Сеть / Соединение» - они по-прежнему вызывают исключения с бессмысленным именем / описанием

Есть ли способ фиксировать различные ошибки для отображения соответствующих сообщений пользователям? Неверный адрес, тайм-аут, недействительный сертификат и т. Д.

высоко ценится

==== Обновление =====

Хорошо, кажется, я задал глупый вопрос :) Я переписал свой код, чтобы записать отдельные исключения, а затем сравнил содержимое строки, чтобы определить проблему. Извините, это был мой первый пост здесь. Код теперь выглядит так

    try:
        #: Try to bind to LDAP server using configured parameters
        ldap_connection.bind()
    except ldap_exceptions.LDAPSocketOpenError as exception:
        exception_msg = str(exception)

        if exception_msg.find("doesn't match any name in") != -1:
            self.LDAP_CERTIFICATE.errors.append("Certificate doesn't match the address of LDAP server!")
            self.LDAP_VALID_NAMES.errors.append("Provide server's real addresses here (as seen in certificate)")
        elif exception_msg.find("socket ssl wrapping error: unknown error") != -1:
            self.LDAP_CERTIFICATE.errors.append("Invalid certificate. Must be X.509 encoded in Base-64 (PEM)")
        else:
            self.LDAP_HOST.errors.append(str(exception))

        return False
...