| 237 | |
| 238 | @staticmethod |
| 239 | def parse_spec(spec: str) -> tuple[bool, str, int | None, str, str, str, str]: |
| 240 | try: |
| 241 | if spec.count(":") > 4: |
| 242 | ( |
| 243 | security, |
| 244 | url, |
| 245 | port_str, |
| 246 | ldap_user, |
| 247 | ldap_pass, |
| 248 | dn_subtree, |
| 249 | ) = spec.split(":") |
| 250 | port = int(port_str) |
| 251 | else: |
| 252 | security, url, ldap_user, ldap_pass, dn_subtree = spec.split(":") |
| 253 | port = None |
| 254 | |
| 255 | if "?" in dn_subtree: |
| 256 | dn_subtree, search_str = dn_subtree.split("?") |
| 257 | key, value = search_str.split("=") |
| 258 | if key == "search_filter_key": |
| 259 | search_filter_key = value |
| 260 | else: |
| 261 | raise ValueError |
| 262 | else: |
| 263 | search_filter_key = "cn" |
| 264 | |
| 265 | if security == "ldaps": |
| 266 | use_ssl = True |
| 267 | elif security == "ldap": |
| 268 | use_ssl = False |
| 269 | else: |
| 270 | raise ValueError |
| 271 | |
| 272 | return ( |
| 273 | use_ssl, |
| 274 | url, |
| 275 | port, |
| 276 | ldap_user, |
| 277 | ldap_pass, |
| 278 | dn_subtree, |
| 279 | search_filter_key, |
| 280 | ) |
| 281 | except ValueError: |
| 282 | raise exceptions.OptionsError(f"Invalid LDAP specification: {spec}") |
| 283 | |
| 284 | def make_search_filter(self, username: str) -> str: |
| 285 | username = ldap3.utils.conv.escape_filter_chars(username) |