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=almazldaps://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:    
