1- import configparser
2- import json
3- import os
4- import jinja2
51import sys
6- import getpass
72import ldb
3+ import secrets
4+ import string
5+ from samba import samdb
86from samba .auth import system_session
97from samba .credentials import Credentials
10- from samba .dcerpc import security
11- from samba .dcerpc .security import dom_sid
12- from samba .ndr import ndr_pack , ndr_unpack
138from samba .param import LoadParm
149from samba .samdb import SamDB
15- from sys import stdin
1610sys .path .append ('.' )
1711import backend_utils as u
1812__LIFECYLE_DIR__ = "../lifecycle"
@@ -21,37 +15,153 @@ def set_config(config):
2115 u .__CONFIG__ = config
2216
2317def connect_sambaad (url ,user ,password ):
18+ lp = LoadParm ()
2419 creds = Credentials ()
2520 creds .guess (lp )
2621 creds .set_username (user )
2722 creds .set_password (password )
2823 try :
29- samdb = SamDB (url = url , session_info = system_session (), credentials = creds , lp = lp )
30- return (1 )
31- except samdb .error .SamDBError as e :
32- print (u .returncode (1 , e ))
33- return (1 )
24+ samdb = SamDB (url = url , session_info = system_session (),credentials = creds , lp = lp )
25+ result = samdb .search (
26+ base = u .config ('base' ),
27+ scope = ldb .SCOPE_BASE ,
28+ attrs = ["objectClass" ]
29+ )
30+ return samdb
31+ except ldb .LdbError as e :
32+ code , message = e .args
33+ print (u .returncode (1 ,f"Erreur { code } : { message } " ))
34+ return (None )
3435
35- def upsert_entry (l ,entity ):
36- return (1 )
3736
38- def search_entity (l ,entity ):
39- return (1 )
37+ def upsert_entry (samdb ,entity ):
38+ # test si l'entree existe
39+ result = search_entity (samdb ,entity )
40+ if len (result ) == 0 :
41+ entry = u .make_entry_array_without_empty (entity )
42+ pwd = generate_password ()
43+ try :
44+ uid = entry ['uid' ]
45+ samdb .newuser (
46+ username = uid ,
47+ givenname = entry ['givenName' ],
48+ surname = entry ['sn' ],
49+ mailaddress = entry ['mail' ],
50+ password = pwd
51+ )
52+ query = (f"(sAMAccountName={ uid } )" )
53+ samdb .setexpiry (query ,0 ,True )
54+ samdb .disable_account (query )
55+ return (u .returncode (0 ,'Entry added' ))
56+ except ldb .LdbError as e :
57+ code , message = e .args
58+ print (u .returncode (1 , f"Erreur { code } : { message } " ))
59+ return (None )
60+ else :
61+ try :
62+ entry = result [0 ]
63+ msg = ldb .Message ()
64+ msg .dn = entry .dn
65+ msg ["sn" ] = ldb .MessageElement (
66+ entry ['sn' ],
67+ ldb .FLAG_MOD_REPLACE ,
68+ "sn"
69+ )
70+ msg ["givenName" ] = ldb .MessageElement (
71+ entry ['givenName' ],
72+ ldb .FLAG_MOD_REPLACE ,
73+ "givenName"
74+ )
75+ msg ["mail" ] = ldb .MessageElement (
76+ entry ['mail' ],
77+ ldb .FLAG_MOD_REPLACE ,
78+ "mail"
79+ )
80+ samdb .modify (msg )
81+ return (u .returncode (0 , 'Entry modified' ))
82+ except ldb .LdbError as e :
83+ code , message = e .args
84+ print (u .returncode (1 , f"Erreur { code } : { message } " ))
85+ return (None )
4086
41- def delete_entity (l ,entity ):
42- return (1 )
4387
44- def update_entity (l ,entity ):
45- return (1 )
88+ def search_entity (samdb ,entity ):
89+ uid = u .find_key (entity , 'uid' )
90+ query = (f"(sAMAccountName={ uid } )" )
91+ result = samdb .search (u .config ('base' ), expression = query , scope = ldb .SCOPE_SUBTREE )
92+ return (result )
4693
47- def activate_entry (l ,entity ,activate ):
48- return (1 )
94+ def delete_entity (samdb ,entity ):
95+ uid = u .find_key (entity , 'uid' )
96+ try :
97+ samdb .deleteuser (uid )
98+ return (u .returncode (0 , 'Entry deleted' ))
99+ except ldb .LdbError as e :
100+ code , message = e .args
101+ print (u .returncode (1 , f"Erreur { code } : { message } " ))
102+ return (None )
49103
50- def change_entity_password (l ,entity ):
51- return (1 )
104+ def activate_entry (samdb ,entity ,activate ):
105+ uid = u .find_key (entity , 'uid' )
106+ query = (f"(sAMAccountName={ uid } )" )
107+ try :
108+ if activate == True :
109+ samdb .enable_account (query )
110+ return (u .returncode (0 ,'Entry activated' ))
111+ else :
112+ samdb .disable_account (query )
113+ return (u .returncode (0 ,'Entry desactivated' ))
114+ except ldb .LdbError as e :
115+ code , message = e .args
116+ print (u .returncode (1 , f"Erreur { code } : { message } " ))
117+ return (None )
52118
53- def reset_entity_password (l ,entity ):
54- return (1 )
119+ def change_entity_password (samdb ,entity ):
120+ if 'oldPassword' in entity ['payload' ] and 'newPassword' in entity ['payload' ]:
121+ oldPassword = entity ['payload' ]['oldPassword' ]
122+ newPassword = entity ['payload' ]['newPassword' ]
123+ if oldPassword != '' and newPassword != '' :
124+ uid = u .find_key (entity , 'uid' )
125+ # test ancien password
126+ if verify_password (uid ,oldPassword ) == 0 :
127+ try :
128+ query = (f"(sAMAccountName={ uid } )" )
129+ samdb .setpassword (query , newPassword , True )
130+ return u .returncode (0 , "Password for " + uid + " changed" )
131+ except ldb .LdbError as e :
132+ print (u .returncode (1 , "Error entity_change_password" ))
133+ return (None )
134+ return (u .returncode (1 , "Internal Error Error entity_change_password" ))
55135
136+ def reset_entity_password (samdb ,entity ):
137+ if 'newPassword' in entity ['payload' ]:
138+ try :
139+ newPassword = entity ['payload' ]['newPassword' ]
140+ if newPassword != '' :
141+ uid = u .find_key (entity , 'uid' )
142+ query = (f"(sAMAccountName={ uid } )" )
143+ samdb .setpassword (query , newPassword , True )
144+ return u .returncode (0 , "Password for " + uid + " changed" )
145+ except ldb .LdbError as e :
146+ code , message = e .args
147+ print (u .returncode (1 , f"Erreur { code } : { message } " ))
148+ return (None )
149+ return u .returncode (1 , "Unexpected error" )
56150
151+ def generate_password ():
152+ longueur = 16
153+ chars = string .ascii_letters + string .digits + string .punctuation
154+ return ( '' .join (secrets .choice (chars ) for _ in range (longueur )) )
57155
156+ def verify_password (user ,password ):
157+ lp = LoadParm ()
158+ creds = Credentials ()
159+ creds .guess (lp )
160+ creds .set_username (user )
161+ creds .set_password (password )
162+ try :
163+ test = SamDB (url = u .config ('host' ), session_info = system_session (), credentials = creds , lp = lp )
164+ return 0
165+ except ldb .LdbError as e :
166+ code , message = e .args
167+ return (1 )
0 commit comments