
    b/                     `   d Z dZdZdZddlZddlZddlZddlmZ ddlm	Z
 ddlmZ d	 Zd
 Z G d de          Z G d de          ZdZdZdZdZdZ G d de          Z G d de          ZdZdZ G d de          Z G d de          Zd Z G d de          Z G d d e          ZdS )!z'Support for reading Samba 3 data files.restructuredTexts   SAMBA_REGVAL       N)passdb)param)	get_bytesc                     	 | |         }n# t           $ r Y d S w xY wt          |          dk    sJ t          j        d|          d         S )N   <Lr   KeyErrorlenstructunpackdbkeydatas      7/usr/lib/python3/dist-packages/samba/samba3/__init__.pyfetch_uint32r   !   ^    #w   ttt99>>>>=t$$Q''    
c                     	 | |         }n# t           $ r Y d S w xY wt          |          dk    sJ t          j        d|          d         S )Nr	   z<lr   r   r   s      r   fetch_int32r   *   r   r   c                   $    e Zd ZdZd Zd Zd ZdS )
DbDatabasez#Simple Samba 3 TDB database reader.c                 ~    t          j        |dz   t          j                  | _        |                                  dS )z^Open a file.

        :param file: Path of the file to open, appending .tdb or .ntdb.
        z.tdb)flagsN)tdbTdbosO_RDONLYr   _check_version)selffiles     r   __init__zDbDatabase.__init__5   s8    
 '$-r{;;;    c                     d S N r#   s    r   r"   zDbDatabase._check_version=       r&   c                 8    | j                                          dS )z,Close resources associated with this object.N)r   closer*   s    r   r-   zDbDatabase.close@   s    r&   N)__name__
__module____qualname____doc__r%   r"   r-   r)   r&   r   r   r   3   sG        --        r&   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )Registrya3  Simple read-only support for reading the Samba3 registry.

    :note: This object uses the same syntax for registry key paths as
        Samba 3. This particular format uses forward slashes for key path
        separators and abbreviations for the predefined key names.
        e.g.: HKLM/Software/Bar.
    c                 D    t          |                                           S )zReturn the number of keys.)r   keysr*   s    r   __len__zRegistry.__len__M   s    499;;r&   c                 $    d | j         D             S )zReturn list with all the keys.c                 l    g | ]1}|                     t                    |                    d           2S )    )
startswithREGISTRY_VALUE_PREFIXrstrip).0ks     r   
<listcomp>z!Registry.keys.<locals>.<listcomp>S   s6    ^^^a!,,G\:]:]^!!^^^r&   )r   r*   s    r   r5   zRegistry.keysQ   s    ^^47^^^^r&   c                 .   | j                             |dz             }|g S t          j        d|dd                   \  }|dd                             d          }|d         dk    sJ |                                 t          |          |k    sJ |S )zxRetrieve the subkeys for the specified key.

        :param key: Key path.
        :return: list with key names
        r9   Nr
   r   r	   r&   )r   getr   r   splitpopr   )r#   r   r   numr5   s        r   subkeyszRegistry.subkeysU   s     w{{3=))<I-d1Q3i00ABBx~~e$$Bx3


4yyCr&   c                    | j                             t          dz   |z   dz             }|i S i }t          j        d|dd                   \  }|dd         }t          |          D ]}|                    dd          \  }}t          j        d|dd                   \  }|dd         }t          j        d|dd                   \  }|dd         }||d|         f||<   ||d         }|S )zReturn a dictionary with the values set for a specific key.

        :param key: Key to retrieve values for.
        :return: Dictionary with value names as key, tuple with type and
            data as value.   /r9   Nr
   r   r	   r   )r   rB   r;   r   r   rangerC   )	r#   r   r   retrE   inametype	value_lens	            r   valueszRegistry.valuese   s    w{{047#=GHH<I-d1Q3i00ABBxs 
	$ 
	$A::eQ//LT4}T4!955HT8D"M$QqS	::MY8DtJYJ/0CI	

#DD
r&   N)r.   r/   r0   r1   r6   r5   rF   rO   r)   r&   r   r3   r3   E   s]              _ _ _       r&   r3   s
   GROUP HWM s	   USER HWM s   GID s   UID    c                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )IdmapDatabasezSamba 3 ID map database reader.c                 F    t          | j        d          t          k    sJ d S )Ns   IDMAP_VERSION )r   r   IDMAP_VERSION_V2r*   s    r   r"   zIdmapDatabase._check_version   s'    47$677;KKKKKKKr&   c              #   .  K   | j         D ]}|                    t                    r*|                    d                              d          V  |                    t
                    r*|                    d                              d          V  dS )z,Retrieve a list of all ids in this database.r9       N)r   r:   IDMAP_USER_PREFIXr<   rC   IDMAP_GROUP_PREFIXr#   r>   s     r   idszIdmapDatabase.ids   s       	2 	2A||-.. 2hhuoo++D11111||.// 2hhuoo++D11111		2 	2r&   c              #      K   | j         D ]Z}|                    t                    r>t          |t	          t                    d                             d                    V  [dS )z-Retrieve a list of all uids in this database.Nr9   )r   r:   rW   intr   r<   rY   s     r   uidszIdmapDatabase.uids   sr       	D 	DA||-.. D!C 122334;;EBBCCCCC	D 	Dr&   c              #      K   | j         D ]Z}|                    t                    r>t          |t	          t                    d                             d                    V  [dS )z-Retrieve a list of all gids in this database.Nr9   )r   r:   rX   r\   r   r<   rY   s     r   gidszIdmapDatabase.gids   sr       	E 	EA||.// E!C 233445<<UCCDDDDD	E 	Er&   c           	          | j                             t          |dt          |          d                    }||S |                    d          S )zRetrive SID associated with a particular id and type.

        :param xid: UID or GID to retrieve SID for.
        :param id_type: Type of id specified - 'UID' or 'GID'
          )r   rB   r   strr<   )r#   xidid_typer   s       r   get_sidzIdmapDatabase.get_sid   sN     w{{9'''3s8888%DEEFF<K{{4   r&   c                     | j                             t          t          |                                          z   dz             }||S |                    d          S )zRetrieve the SID associated with a particular uid.

        :param uid: UID to retrieve SID for.
        :return: A SID or None if no mapping was found.
        r9   )r   rB   rW   rc   encoder<   )r#   uidr   s      r   get_user_sidzIdmapDatabase.get_user_sid   sN     w{{,s3xx/@/@@5HII<K{{5!!!r&   c                     | j                             t          t          |                                          z   dz             }||S |                    d          S )Nr9   )r   rB   rX   rc   rh   r<   )r#   gidr   s      r   get_group_sidzIdmapDatabase.get_group_sid   sL    w{{-C0A0AAEIJJ<K{{5!!!r&   c                 6    t          | j        t                    S )z Obtain the user high-water mark.)r   r   IDMAP_HWM_USERr*   s    r   get_user_hwmzIdmapDatabase.get_user_hwm   s    DG^444r&   c                 6    t          | j        t                    S )z!Obtain the group high-water mark.)r   r   IDMAP_HWM_GROUPr*   s    r   get_group_hwmzIdmapDatabase.get_group_hwm   s    DG_555r&   N)r.   r/   r0   r1   r"   rZ   r]   r_   rf   rj   rm   rp   rs   r)   r&   r   rR   rR      s        ))L L L2 2 2D D DE E E	! 	! 	!	" 	" 	"" " "5 5 56 6 6 6 6r&   rR   c                   r    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd ZdS )SecretsDatabasez Samba 3 Secrets database reader.c                 6    | j                             d          S )Ns   SECRETS/AUTH_PASSWORDr   rB   r*   s    r   get_auth_passwordz!SecretsDatabase.get_auth_password   s    w{{3444r&   c                 6    | j                             d          S )Ns   SECRETS/AUTH_DOMAINrw   r*   s    r   get_auth_domainzSecretsDatabase.get_auth_domain   s    w{{1222r&   c                 6    | j                             d          S )Ns   SECRETS/AUTH_USERrw   r*   s    r   get_auth_userzSecretsDatabase.get_auth_user   s    w{{/000r&   c                 <    | j                             d|z            S )Ns   SECRETS/DOMGUID/%srw   r#   hosts     r   get_domain_guidzSecretsDatabase.get_domain_guid   s    w{{047888r&   c              #      K   | j         D ]C}|                    d          r,|t          d          d                              d          V  Dd S )NzSECRETS/LDAP_BIND_PW/rb   r   r:   r   r<   rY   s     r   ldap_dnszSecretsDatabase.ldap_dns   sj       	D 	DA||344 D344556==dCCCCC	D 	Dr&   c              #      K   | j         D ]C}|                    d          r,|t          d          d                             d          V  DdS )zvIterate over domains in this database.

        :return: Iterator over the names of domains in this database.
        zSECRETS/SID/Nrb   r   rY   s     r   domainszSecretsDatabase.domains   se      
  	; 	;A||N++ ;N++,,-44T:::::	; 	;r&   c                 V    | j                             t          d|z                      S )NzSECRETS/LDAP_BIND_PW/%sr   rB   r   r~   s     r   get_ldap_bind_pwz SecretsDatabase.get_ldap_bind_pw   $    w{{9%>%EFFGGGr&   c                 V    | j                             t          d|z                      S )NzSECRETS/AFS_KEYFILE/%sr   r~   s     r   get_afs_keyfilezSecretsDatabase.get_afs_keyfile   s$    w{{9%=%DEEFFFr&   c                 L    t          | j        t          d|z                      S )Nz#SECRETS/MACHINE_SEC_CHANNEL_TYPE/%s)r   r   r   r~   s     r   get_machine_sec_channel_typez,SecretsDatabase.get_machine_sec_channel_type   s#    DGY/TW[/[%\%\]]]r&   c                 2    t          | j        d|z            S )Nz#SECRETS/MACHINE_LAST_CHANGE_TIME/%s)r   r   r~   s     r   get_machine_last_change_timez,SecretsDatabase.get_machine_last_change_time   s    DG%JT%QRRRr&   c                 V    | j                             t          d|z                      S )NzSECRETS/MACHINE_PASSWORD/%sr   r~   s     r   get_machine_passwordz$SecretsDatabase.get_machine_password   s$    w{{9%BT%IJJKKKr&   c                 V    | j                             t          d|z                      S )NzSECRETS/$MACHINE.ACC/%sr   r~   s     r   get_machine_acczSecretsDatabase.get_machine_acc   r   r&   c                 V    | j                             t          d|z                      S )NzSECRETS/$DOMTRUST.ACC/%sr   r~   s     r   get_domtrust_accz SecretsDatabase.get_domtrust_acc   s$    w{{9%?$%FGGHHHr&   c              #      K   | j         D ]C}|                    d          r,|t          d          d                              d          V  Dd S )NzSECRETS/$DOMTRUST.ACC/rb   r   rY   s     r   trusted_domainszSecretsDatabase.trusted_domains   sj       	E 	EA||455 E455667>>tDDDDD	E 	Er&   c                 6    | j                             d          S )Ns   INFO/random_seedrw   r*   s    r   get_random_seedzSecretsDatabase.get_random_seed  s    w{{.///r&   c                 z    | j                             t          d|                                z                      S )NzSECRETS/SID/%s)r   rB   r   upperr~   s     r   rf   zSecretsDatabase.get_sid  s,    w{{9%5

%DEEFFFr&   N)r.   r/   r0   r1   rx   rz   r|   r   r   r   r   r   r   r   r   r   r   r   r   rf   r)   r&   r   ru   ru      s*       **5 5 53 3 31 1 19 9 9D D D
; ; ;H H HG G G^ ^ ^S S SL L LH H HI I IE E E
0 0 0G G G G Gr&   ru   c                       e Zd ZdZd Zd ZdS )ShareInfoDatabasez#Samba 3 Share Info database reader.c                 P    t          | j        d          t          t          fv sJ d S )NzINFO/version )r   r   SHARE_DATABASE_VERSION_V1SHARE_DATABASE_VERSION_V2r*   s    r   r"   z ShareInfoDatabase._check_version  s-    47$455:SUn9ooooooor&   c                 Z    | j                             t          d|z                      }|S )zfObtain the security descriptor on a particular share.

        :param name: Name of the share
        z
SECDESC/%sr   )r#   rL   secdescs      r   get_secdesczShareInfoDatabase.get_secdesc  s)    
 '++it(;<<==r&   N)r.   r/   r0   r1   r"   r   r)   r&   r   r   r     s;        --p p p    r&   r   c                   $    e Zd ZdZd Zd Zd ZdS )ShareszContainer for share objects.c                 "    || _         || _        d S r(   )lp	shareinfo)r#   r   r   s      r   r%   zShares.__init__  s    "r&   c                 0    t          | j                  dz
  S )zNumber of shares.r   )r   r   r*   s    r   r6   zShares.__len__"  s    47||ar&   c                 4    | j                                         S )zIterate over the share names.)r   __iter__r*   s    r   r   zShares.__iter__&  s    w!!!r&   N)r.   r/   r0   r1   r%   r6   r   r)   r&   r   r   r     sG        &&# # #     " " " " "r&   r   c                     t                      }d}d}| D ]5}|dk    r| }|dv r |s|dk    r|                    |           d}0||z  }6|dk    r|                    |           |S )zVery simple shell-like line splitting.

    :param text: Text to split.
    :return: List with parts of the line as strings.
    F ")	
ra   )listappend)textrJ   inquotescurrentcs        r   
shellsplitr   +  s     &&CHG  99#|HH###H#"}}

7###GGqLGG"}}

7Jr&   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	WinsDatabasezSamba 3 WINS database reader.c                 n   i | _         t          |d          }|                                                    d          dk    sJ |                                D ]}|d         dk    rt          |                    d                    }|d         }t          |d                   }d}g }d||         v r*|                    ||                    |dz  }d||         v *t          ||         d d	         d
          }	|| j         vsJ d|z              |||	f| j         |<   |                                 d S )Nrr   zVERSION 1 0r   #r   rP   .rA      zName %s exists twice)	entriesopenreadliner<   	readlinesr   r\   r   r-   )
r#   r$   flr   rL   ttlrK   ipsnb_flagss
             r   r%   zWinsDatabase.__init__D  sA   sOOzz||""4((M9999 	6 	6Ats{{ $00G1:Dgaj//CAC##

71:&&&Q ## 71:crc?B//Ht|+++-Cd-J+++"%sH!5DL						r&   c                     | j         |         S r(   )r   )r#   rL   s     r   __getitem__zWinsDatabase.__getitem__X  s    |D!!r&   c                 *    t          | j                  S r(   )r   r   r*   s    r   r6   zWinsDatabase.__len__[  s    4<   r&   c                 *    t          | j                  S r(   )iterr   r*   s    r   r   zWinsDatabase.__iter__^  s    DL!!!r&   c                 4    | j                                         S )z)Return the entries in this WINS database.)r   itemsr*   s    r   r   zWinsDatabase.itemsa  s    |!!###r&   c                     d S r(   r)   r*   s    r   r-   zWinsDatabase.closee  r+   r&   N)
r.   r/   r0   r1   r%   r   r6   r   r   r-   r)   r&   r   r   r   B  st        ''  (" " "! ! !" " "$ $ $    r&   r   c                   V    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd ZdS )Samba3z,Samba 3 configuration and state data reader.Nc                     || _         |r	|| _        dS t          j                    | _        | j                            |           dS )zOpen the configuration and data for a Samba 3 installation.

        :param smbconfpath: Path to the smb.conf file.
        :param s3_lp_ctx: Samba3 Loadparm context
        N)smbconfpathr   s3paramget_contextload)r#   r   	s3_lp_ctxs      r   r%   zSamba3.__init__l  sI     ' 	&DGGG)++DGGLL%%%%%r&   c                     |d         dk    s|d         dk    r|S t           j                            | j                            d          |          S )Nr   /r   zstate directoryr    pathjoinr   rB   r#   r   s     r   statedir_pathzSamba3.statedir_pathy  sE    7c>>T!W^^Kw||DGKK(9::DAAAr&   c                     |d         dk    s|d         dk    r|S t           j                            | j                            d          |          S )Nr   r   r   zprivate dirr   r   s     r   privatedir_pathzSamba3.privatedir_path~  sD    7c>>T!W^^Kw||DGKK66===r&   c                     | j         S r(   )r   r*   s    r   get_confzSamba3.get_conf  s	    wr&   c                 Z    t          j        | j                            d                    S )Nzpassdb backend)r   PDBr   rB   r*   s    r   
get_sam_dbzSamba3.get_sam_db  s!    z$'++&677888r&   c                 F    t          |                     d                    S )Nregistry)r3   r   r*   s    r   get_registryzSamba3.get_registry  s    **:66777r&   c                 F    t          |                     d                    S )Nsecrets)ru   r   r*   s    r   get_secrets_dbzSamba3.get_secrets_db  s    t33I>>???r&   c                 F    t          |                     d                    S )N
share_info)r   r   r*   s    r   get_shareinfo_dbzSamba3.get_shareinfo_db  s     !3!3L!A!ABBBr&   c                 F    t          |                     d                    S )Nwinbindd_idmap)rR   r   r*   s    r   get_idmap_dbzSamba3.get_idmap_db  s    T//0@AABBBr&   c                 F    t          |                     d                    S )Nzwins.dat)r   r   r*   s    r   get_wins_dbzSamba3.get_wins_db  s    D..z::;;;r&   c                 j    t          |                                 |                                           S r(   )r   r   r   r*   s    r   
get_shareszSamba3.get_shares  s&    dmmoot'<'<'>'>???r&   r(   )r.   r/   r0   r1   r%   r   r   r   r   r   r   r   r   r   r   r)   r&   r   r   r   i  s        66& & & &B B B
> > >
  9 9 98 8 8@ @ @C C CC C C< < <@ @ @ @ @r&   r   ) r1   __docformat__r;   REGISTRY_DB_VERSIONr    r   r   samba.samba3r   r   r   samba.commonr   r   r   objectr   r3   rr   ro   rX   rW   rT   rR   ru   r   r   r   r   r   r   r   r)   r&   r   <module>r      s:  $ . -"'   				  



       ) ) ) ) ) ) " " " " " "( ( (( ( (       $8 8 8 8 8z 8 8 8x !    <6 <6 <6 <6 <6J <6 <6 <6~;G ;G ;G ;G ;Gj ;G ;G ;G|       
    " " " " "V " " "  .$ $ $ $ $6 $ $ $N0@ 0@ 0@ 0@ 0@V 0@ 0@ 0@ 0@ 0@r&   