-
Notifications
You must be signed in to change notification settings - Fork 0
/
challenge1
168 lines (148 loc) · 5.19 KB
/
challenge1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# -*- coding: utf-8 -*-
import csv
import subprocess
import string
import random
import sha
from base64 import b64encode
import smtplib
from smtplib import SMTPException
import getpass
import mysql.connector
mydb = mysql.connector.connect (
host="localhost",
user="userdb",
passwd="Meli2019#"
)
def veruid (): #Comprobamos cual fue el ultimo uidNumber
try:
subprocess.call ("ldapsearch -x -LLL uid=*| grep uidNumber >> uid",shell=True)
aux=0
f = open ("uid","r")
f1 = f.readlines()
for x in f1:
aux += 1
return aux
except:
print ("Fallo la verificacion del uidNumber")
def abrircsv (correo,mycursor): #abrimos el archivo .csv
asunto = "Credenciales LDAP"
with open('altas.csv') as csv_file:
body = ""
csv_reader = csv.reader(csv_file, delimiter=',')
line_count = 0
uidN = int (veruid()) + 2001 #todos los UID comienzan en 2000
for row in csv_reader:
if line_count == 0:
line_count += 1
else:
i=1
usr = genuser (row[0],row[1],i)
no=verfexis(usr)
while no==1: #en caso de que el usuario ya existe, se le agrega otra letra del nombre
i+=1
usr = genuser (row[0],row[1],i)
no = verfexis(usr)
psswd = genpass()
hash = genhash(psswd)
body = "Estimado, \nSe creo el usuario: " + usr + "\nLa contraseña es: " + psswd
print (usr,hash)
archivouser(file,usr,uidN,hash,row[1],row[2],row[0]+row[1]) #Se pasan los valores para la generacion del archivo .ldif
sendmail(row[2],correo,body,asunto)
try: #se escribe en la base de datos, el campo contraseña esta encriptado
sql = "INSERT INTO usuarios (username, estado, contraseña) VALUES(%s, %s, AES_ENCRYPT(%s,'LLAVE'))"
var = (usr, "Activo", psswd)
mycursor.execute(sql,var)
mydb.commit()
except:
print ("Fallo la escritura en la base de datos")
uidN+=1
line_count += 1
def genuser (nom,ape,i): #se genera el usuario
try:
usr = nom[0:i] + ape
return usr
except:
print ("Fallo la generacion del usuario")
def verfexis(usr): #se verifica que no exista ese usuario en openldap
try:
subprocess.call("ldapsearch -x -LLL uid="+usr+" >> ldap",shell=True)
aux = 0
f = open ("ldap","r")
f1 = f.readlines()
for x in f1:
aux += 1
if aux == 0:
print (usr + " no existe")
subprocess.call("rm ldap",shell=True)
return 0
else:
print (usr + " ya existe")
subprocess.call("rm ldap",shell=True)
return 1
except:
print ("Fallo la verificacion del usuario")
def genpass(stringLength=8): #se genera la clave random
lettersAndDigits = string.ascii_letters + string.digits
return ''.join(random.choice(lettersAndDigits) for i in range(stringLength))
def genhash (psswd): #se encripa la clave utilizada para enviarsela al ldap
try:
ctx = sha.new(psswd)
hash = "{SHA}" + b64encode(ctx.digest())
return hash
except:
print ("Fallo la generacion del hash")
def sendmail(destinatario,correo,body,asunto): #se envia los correos
try:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
fromaddr = correo #Completar desde la cuenta que se manda
toaddr = destinatario #Hacia que cuenta se manda
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = asunto
msg.attach(MIMEText(body, 'plain'))
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
except:
print ("Fallo el envio de correo")
def credenciales(): #se toma las credenciales desde la cuenta donde se van a enviar los correos
correo = raw_input ("Ingrese la cuenta desde donde se va enviar los mails: ")
passwdmail = getpass.getpass ("Ingrese la contraseña: ")
return correo, passwdmail
def archivouser(file,user,uidN,passwd,apellido,mail,nombre): #se escribe en el archivo ldif
file.write("\ndn: uid=%s,ou=People,dc=mercadolibre,dc=com\n" % (user))
file.write("objectClass: top\n")
file.write("objectClass: posixAccount\n")
file.write("objectClass: inetOrgPerson\n")
file.write("objectClass: person\n")
#file.write("objectClass: pwdPolicy\n") FALTO CREAR EL OBJETO pwdPOLICY
file.write("cn: UsuariosLDAP\n")
file.write("uid: %s\n" % (user))
file.write("uidNumber: %s\n" % (uidN))
file.write("gidNumber: 1001\n")
#file.write("pwdReset: TRUE\n") NO SE UTILIZA
file.write("homeDirectory: /home/users/%s\n" %(user))
file.write("loginShell: /bin/bash\n")
file.write("userPassword: %s\n" % (passwd))
file.write("sn: %s\n" % (apellido))
file.write("mail: %s\n" % (mail))
file.write("givenName: %s\n\n" % (nombre))
print ("Comienzo de ejecucion")
subprocess.call ("rm uid",shell=True) #Se elimina el uid utilizado anterioremente para la verificacion
file = open ("user.ldif","w+")
mycursor = mydb.cursor()
mycursor.execute ("USE usuarios")
correo, passwdmail = credenciales ()
try:
server = smtplib.SMTP ('smtp.gmail.com',587) #conexion con gmail
server.starttls()
server.login(correo, passwdmail)
except smtplib.SMTPException:
print ("Error de logueo")
abrircsv(correo,mycursor)
server.quit() #cierro sesion de smtp
file.close() #se cierra el archivo ldif
subprocess.call ('ldapadd -ZZ -x -W -D "cn=ldapadm,dc=mercadolibre,dc=com" -f user.ldif',shell=True)
print ("Finzalizo la ejecucion")