Я бы хотел, чтобы пользователи меняли конфигурацию 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