o
    Žõ±jï  ã                   @   s  d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 G dd„ dƒZ
edkr~g d	¢ZeD ]NZed
ƒ eeƒ ze
 e¡Ze ¡ Ze ¡ ZW n# eym Z zd dlZe ¡  ede ƒ eƒ  W Y dZ[q1dZ[ww eeeƒƒ eeeƒƒ eƒ  q1dS dS )é    N)ÚMSLDAPTarget)ÚMSLDAPClient)ÚMSLDAPClientConnection)ÚUniCredentialc                   @   s†   e Zd ZdZdZddedefdd„Zedd	„ ƒZ	d
efdd„Z
d
efdd„Zd
efdd„Zd
efdd„Zedefdd„ƒZdd„ ZdS )ÚLDAPConnectionFactoryz¤
	The URL describes both the connection target and the credentials. This class creates all necessary objects to set up the client.
	
	:param url: 
	:type url: str
	a?	  
	MSLDAP URL Format: <protocol>+<auth>://<username>:<password>@<ip_or_host>:<port>/<tree>/?<param>=<value>
	<protocol> sets the ldap protocol following values supported:
		- ldap
		- ldaps
	<auth> can be omitted if plaintext authentication is to be performed (in that case it default to ntlm-password), otherwise:
		- ntlm-password
		- ntlm-nt
		- kerberos-password (dc option param must be used)
		- kerberos-rc4 / kerberos-nt (dc option param must be used)
		- kerberos-aes (dc option param must be used)
		- kerberos-keytab (dc option param must be used)
		- kerberos-ccache (dc option param must be used)
		- sspi-ntlm (windows only!)
		- sspi-kerberos (windows only!)
		- anonymous
		- plain
		- simple
		- sicily (same format as ntlm-nt but using the SICILY authentication)
	<tree>:
		OPTIONAL. Specifies the root tree of all queries
	<param> can be:
		- timeout : connction timeout in seconds
		- proxytype: currently only socks5 proxy is supported
		- proxyhost: Ip or hostname of the proxy server
		- proxyport: port of the proxy server
		- proxytimeout: timeout in secodns for the proxy connection
		- dc: the IP address of the domain controller, MUST be used for kerberos authentication
		- encrypt: enable encryption. Only for NTLM. DOESNT WORK WITH LDAPS
		- etype: Supported encryption types for Kerberos authentication. Multiple can be specified.
		- rate: LDAP paged search query rate limit. Will sleep for seconds between each new page. Default: 0 (no limit)
		- pagesize: LDAP paged search query size per page. Max: 1000. Default: 1000

	Examples:
	ldap://10.10.10.2 (anonymous bind)
	ldaps://test.corp (anonymous bind)
	ldap+sspi-ntlm://test.corp
	ldap+sspi-kerberos://test.corp
	ldap://TEST\victim:<password>@10.10.10.2 (defaults to SASL GSSAPI NTLM)
	ldap+simple://TEST\victim:<password>@10.10.10.2 (SASL SIMPLE auth)
	ldap+plain://TEST\victim:<password>@10.10.10.2 (SASL SIMPLE auth)
	ldap+ntlm-password://TEST\victim:<password>@10.10.10.2
	ldap+ntlm-nt://TEST\victim:<nthash>@10.10.10.2
	ldap+kerberos-password://TEST\victim:<password>@10.10.10.2
	ldap+kerberos-rc4://TEST\victim:<rc4key>@10.10.10.2
	ldap+kerberos-aes://TEST\victim:<aes>@10.10.10.2
	ldap://TEST\victim:password@10.10.10.2/DC=test,DC=corp/
	ldap://TEST\victim:password@10.10.10.2/DC=test,DC=corp/?timeout=99&proxytype=socks5&proxyhost=127.0.0.1&proxyport=1080&proxytimeout=44
	NÚ
credentialÚtargetc                 C   s   || _ || _d S ©N)r   r   )Úselfr   r   © r   ú‰/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/msldap/commons/factory.pyÚ__init__I   s   
zLDAPConnectionFactory.__init__c                 C   s   t  | ¡}t | ¡}t||ƒS r	   )r   Úfrom_urlr   r   )Úconnection_urlr   r   r   r   r   r   M   s   


zLDAPConnectionFactory.from_urlÚreturnc                 C   ó   t  | j¡S )zb
		Creates a credential object
		
		:return: Credential object
		:rtype: :class:`UniCredential`
		)ÚcopyÚdeepcopyr   ©r
   r   r   r   Úget_credentialS   ó   z$LDAPConnectionFactory.get_credentialc                 C   r   )zY
		Creates a target object
		
		:return: Target object
		:rtype: :class:`MSLDAPTarget`
		)r   r   r   r   r   r   r   Ú
get_target\   r   z LDAPConnectionFactory.get_targetc                 C   ó   |   ¡ }|  ¡ }t||ƒS )z~
		Creates a client that can be used to interface with the server
		
		:return: LDAP client
		:rtype: :class:`MSLDAPClient`
		)r   r   r   ©r
   Úcredr   r   r   r   Ú
get_cliente   ó   
z LDAPConnectionFactory.get_clientc                 C   r   )z�
		Creates a connection that can be used to interface with the server
		
		:return: LDAP connection
		:rtype: :class:`MSLDAPClientConnection`
		)r   r   r   r   r   r   r   Úget_connectionq   r   z$LDAPConnectionFactory.get_connectionÚ
connectionc                 C   s   	 t t | j¡t | j¡ƒS )zPCreates a new LDAPConnectionFactory object from an existing SMBConnection object)r   r   r   r   r   )r   r   r   r   Úfrom_ldapconnection|   s   z)LDAPConnectionFactory.from_ldapconnectionc                 C   sV   d}| j D ]#}| j | }t|tjƒr|}n	t|tjƒr|j}|d|t|ƒf 7 }q|S )Nz!==== LDAPConnectionFactory ====
z%s: %s
)Ú__dict__Ú
isinstanceÚenumÚIntFlagÚEnumÚnameÚstr)r
   ÚtÚkÚvalr   r   r   Ú__str__ƒ   s   

zLDAPConnectionFactory.__str__)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úhelp_epilogr   r   r   Ústaticmethodr   r   r   r   r   r   r   r   r*   r   r   r   r   r      s    2
		r   Ú__main__)zldap://10.10.10.2zldap://10.10.10.2:9999zldap://test:password@10.10.10.2zldap://domain\test@10.10.10.2z+ldap://domain\test:password@10.10.10.2:9999zCldap://domain\test:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@10.10.10.2:9999zldaps+sspi-ntlm://10.10.10.2z ldaps+sspi-kerberos://10.10.10.2z:ldaps+ntlm-password://domain\test:password@10.10.10.2:9999z4ldaps+ntlm-nt://domain\test:password@10.10.10.2:9999z>ldaps+kerberos-password://domain\test:password@10.10.10.2:9999zldaps://10.10.10.2:9999z ldaps://test:password@10.10.10.2zldaps://domain\test@10.10.10.2z,ldaps://domain\test:password@10.10.10.2:9999zTldaps://DOMAIN\test:password@10.10.10.2:9999/?proxytype=socks5&proxyserver=127.0.0.1zsldaps://DOMAIN\test:password@10.10.10.2:9999/?proxytype=socks5&proxyserver=127.0.0.1&proxyuser=admin&proxypass=almaz‡ldaps://DOMAIN\test:password@10.10.10.2:9999/?proxytype=multiplexor&proxyserver=127.0.0.1&proxyport=9999&proxyuser=admin&proxypass=almazldaps://10.10.10.2zldaps://10.10.10.2:6666zK===========================================================================zERROR! Reason: %s)r"   r   Úmsldap.commons.targetr   Úmsldap.clientr   Úmsldap.connectionr   Úasyauth.common.credentialsr   r   r+   Ú	url_testsÚurlÚprintr   Údecr   Úcredsr   r   Ú	ExceptionÚeÚ	tracebackÚ	print_excÚinputr&   r   r   r   r   Ú<module>   s:    
€üÚ