20/04/22 - 12h30

master
ChérifBALDE 2022-04-20 12:52:56 +02:00 committed by cherif
parent d41614d78a
commit 7c6bcd0bf0
3 changed files with 321 additions and 20 deletions

View File

@ -16,6 +16,8 @@ La fonction effectue les operations suivantes :
from pymongo import MongoClient from pymongo import MongoClient
import json import json
from bson import ObjectId from bson import ObjectId
import email_mgt
import email_mgt as mail import email_mgt as mail
from datetime import datetime from datetime import datetime
import prj_common as mycommon import prj_common as mycommon
@ -731,6 +733,10 @@ def change_user_pwd(diction):
return False, "Le mot de passe est vide" return False, "Le mot de passe est vide"
if ( len(str(new_pwd)) <= 0):
mycommon.myprint(str(inspect.stack()[0][3]) + " Le nouveau mot de passe est vide")
return False, "Le nouveau mot de passe est vide"
if (str(new_pwd) != str(conf_new_pwd)): if (str(new_pwd) != str(conf_new_pwd)):
mycommon.myprint(str(inspect.stack()[0][3]) + " - Les mots de passe ne sont pas identiques. nouveau pass :'"+str(new_pwd) +"', la oonfirmation envoyées est "''+str(conf_new_pwd)+"' ") mycommon.myprint(str(inspect.stack()[0][3]) + " - Les mots de passe ne sont pas identiques. nouveau pass :'"+str(new_pwd) +"', la oonfirmation envoyées est "''+str(conf_new_pwd)+"' ")
return False, " Les mots de passe ne sont pas identiques " return False, " Les mots de passe ne sont pas identiques "
@ -776,6 +782,117 @@ def change_user_pwd(diction):
return False, "Impossible de mettre à jour le mot de passe de l'utilisateur" return False, "Impossible de mettre à jour le mot de passe de l'utilisateur"
'''
Changement du mot de passe d'un user
avec un token de reinitialisation '''
def Reset_user_pwd_by_token(diction):
try:
# Dictionnaire des champs utilisables
field_list = ['token', 'new_pwd', 'conf_new_pwd']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(" Le champ '" + val + "' n'est pas autorisé, requete annulée")
return False, " Impossible de recuperer le user account"
'''
Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
On controle que les champs obligatoires sont presents dans la liste
'''
field_list_obligatoire = ['token', 'new_pwd', 'conf_new_pwd']
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(" La valeur '" + val + "' n'est pas presente dans liste ")
return False, " Impossible de mettre à jour le mot de passe"
# recuperation des paramettre
email_value = ""
token_value = ""
pwd = ""
new_pwd = ""
conf_new_pwd = ""
mydata ={}
if ("conf_new_pwd" in diction.keys()):
if diction['conf_new_pwd']:
conf_new_pwd = diction['conf_new_pwd']
if ("token" in diction.keys()):
if diction['token']:
token_value = diction['token']
if ("new_pwd" in diction.keys()):
if diction['new_pwd']:
new_pwd = diction['new_pwd']
mydata['pwd'] = diction['new_pwd']
# Verification de la validité du token/mail dans le cas des user en mode connecté
if ( len(str(token_value)) <= 0):
mycommon.myprint(str(inspect.stack()[0][3]) + " Le token est vide")
return False, "Le token est vide"
if ( len(str(new_pwd)) <= 0):
mycommon.myprint(str(inspect.stack()[0][3]) + " Le mot de passe est vide")
return False, "Le mot de passe est vide"
if (str(new_pwd) != str(conf_new_pwd)):
mycommon.myprint(str(inspect.stack()[0][3]) + " - Les mots de passe ne sont pas identiques. nouveau pass :'"+str(new_pwd) +"', la oonfirmation envoyées est "''+str(conf_new_pwd)+"' ")
return False, " Les mots de passe ne sont pas identiques "
retval = mycommon.check_token_validity("", token_value)
if retval is False:
mycommon.myprint(str(inspect.stack()[0][3]) + " Le token est invalide")
return False, "Le token est invalide"
# Recuperation du recid du user
user_recid = mycommon.get_user_recid_from_token(token_value)
if user_recid is False :
mycommon.myprint(str(inspect.stack()[0][3]) + " Impossible de recuperer le recid du user. Le token envoyé est :"+str(token_value))
return False, " Impossible de mettre à jour le mot de passe"
mydata['date_update'] = str(datetime.now())
client = MongoClient(CONNECTION_STRING)
dbname = client['cherifdb']
coll_name = dbname['user_account']
print(" le recid = "+user_recid+" mydata = "+str(mydata))
ret_val = coll_name.find_one_and_update({'recid': user_recid, 'locked': '0', 'active':'1'},
{"$set": mydata},
return_document=ReturnDocument.AFTER
)
if (ret_val and ret_val['_id']):
# Apres avoir changer le mot passe, desactivation tu token
coll_name = dbname['user_token']
ret_val = coll_name.update_many({'recid': user_recid, 'valide': '1'},
{"$set": {'valide': '0', 'date_update': str(datetime.now())}},
)
if( ret_val.matched_count <= 0 ):
mycommon.myprint(str(inspect.stack()[0][3]) + " WARNING : Attention à la mise à jour du mot de passe de"
" du user avec le recid = "+user_recid)
else:
mycommon.myprint(str(inspect.stack()[0][3]) + " Le mot de passe de l'utilisateur (recid) =" + str(user_recid)+" a été modifié")
return True, "Le mot de passe a bien été mise à jour "
else:
mycommon.myprint(str(inspect.stack()[0][3]) + " Impossible de mettre à jour le password du user : recid = "+str(user_recid))
return False, "Impossible de mettre à jour le password"
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, "Impossible de mettre à jour le mot de passe de l'utilisateur"
@ -1227,9 +1344,9 @@ def InitUserPasswd(diction):
myemail = "" myemail = ""
myquery = {} myquery = {}
if ("email" in diction.keys()): if ("email" in diction.keys()):
if diction['source']: if diction['email']:
myemail = diction['source'] myemail = diction['email']
myquery['email'] = diction['source'] myquery['email'] = diction['email']
myquery['active'] = '1' myquery['active'] = '1'
@ -1238,18 +1355,17 @@ def InitUserPasswd(diction):
coll_name = dbname['user_account'] coll_name = dbname['user_account']
tmp = coll_name.count_documents(myquery) #print(" myquery ="+str(myquery))
tmp = coll_name.count_documents(myquery)
if (tmp <= 0): if (tmp <= 0):
mycommon.myprint(str(inspect.stack()[0][3]) + " Aucun resultat trouvé pour " + str(myquery)) mycommon.myprint(str(inspect.stack()[0][3]) + " Aucun resultat trouvé pour " + str(myquery))
return False, "Impossible de reinitialiser le mot de passe de l'utiilisateur" return True, "La demande de reinitiation à été prise en compte"
RetObject = []
local_id = 0
retVal = coll_name.find(myquery, {"_id": 0, "valide": 0, "user_recid": 0}) retVal = coll_name.find(myquery, {"_id": 0, "valide": 0, "user_recid": 0})
print(" le recid = "+retVal['recid']) #print(" le recid = "+str(retVal[0]['recid']))
''' '''
Desactivation des tocken actifs Desactivation des tocken actifs
@ -1258,37 +1374,93 @@ def InitUserPasswd(diction):
coll_name_token = dbname['user_token'] coll_name_token = dbname['user_token']
ret_val_user_rech = coll_name_token.find_one_and_update( ret_val_user_rech = coll_name_token.update_many(
{'recid': retVal['recid']}, {'recid': retVal[0]['recid']},
{"$set": update_field}, {"$set": update_field}
return_document=ReturnDocument.AFTER
) )
if (ret_val_user_rech is False): if (ret_val_user_rech.matched_count <= 0):
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de mettre à jour la table 'user_token' " mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de desactivier les token actifs dans table 'user_token' ")
return False, "Impossible de reinitialiser le mot de passe de l'utiilisateur " return True, "La demande de reinitiation à été prise en compte"
''' '''
Insertion du nouveau token Insertion du nouveau token
''' '''
new_token = {} new_token = {}
new_token['email'] = retVal['email'] new_token['email'] = retVal[0]['email']
new_token['recid'] = retVal['recid'] new_token['recid'] = retVal[0]['recid']
new_token['date_update'] = str(datetime.now()) new_token['date_update'] = str(datetime.now())
new_token['valide'] = '1' new_token['valide'] = '1'
# Creation du token
mynewtoken = mycommon.create_token_urlsafe()
new_token['token'] = mynewtoken
#print(" new token to insert = "+str(new_token))
ret_val_tmp = coll_name_token.insert_one(new_token) ret_val_tmp = coll_name_token.insert_one(new_token)
if (ret_val_tmp is False): if (ret_val_tmp is False):
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de créer le nouveau toek") mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de créer le nouveau toek")
return False, "Impossible de reinitialiser le mot de passe de l'utiilisateur " return True, "La demande de reinitiation à été prise en compte"
send email a faire # envoi de l'email
email_mgt.send_user_init_pwd_mail(mynewtoken, retVal[0]['email'])
return True, "RetObject" return True, "La demande de reinitiation à été prise en compte"
except Exception as e: except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info() exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno)) mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, "Impossible de reinitialiser le mot de passe de l'utiilisateur" return False, "Impossible de reinitialiser le mot de passe de l'utiilisateur"
'''
Cette fonction verifie si le token d'un utilisateur est valide
'''
def IsUserTokenValide(diction):
try:
'''
# Verification que les champs reçus dans l'API sont bien dans la liste des champs autorisés
# Cela evite le cas ou une entité tierce ajouter les valeurs inconnu dans l'API
# Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste
# field_list.
'''
field_list = ['token']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas autorisé, opération annulée")
return False, "Impossible de reinitialiser le mot de passe de l'utiilisateur"
'''
Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
On controle que les champs obligatoires sont presents dans la liste
'''
field_list_obligatoire = ['token']
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(str(inspect.stack()[0][3]) + " La valeur '" + val + "' n'est pas presente dans liste ")
return False, "Impossible de reinitialiser le mot de passe de l'utiilisateur"
myquery = {}
if ("token" in diction.keys()):
if diction['token']:
myquery['token'] = diction['token']
myquery['valide'] = '1'
coll_name_token = dbname['user_token']
tmp = coll_name_token.count_documents(myquery)
if (tmp <= 0):
mycommon.myprint(str(inspect.stack()[0][3]) + " Aucun resultat trouvé pour " + str(myquery))
return False, "Le token n'est pas valide"
return True, "Le token est valdie"
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, "Impossible de verifier la validité du token"

View File

@ -194,3 +194,95 @@ def send_partner_account_mail(message, account_mail):
'''
Envoie de l'email de reinitialisation du mot de passe du user
'''
def send_user_init_pwd_mail(token, account_mail):
try:
tomorrow = datetime.date.today() + datetime.timedelta(days=1)
tomorrow_day = tomorrow.strftime("%A")
print("debut envoi mail de test ")
# on rentre les renseignements pris sur le site du fournisseur
msg = MIMEMultipart("alternative")
msg['Subject'] = '[MySy Training] : Reinitialisez votre mot de passe'
msg['From'] = 'billardman01@hotmail.com'
msg['To'] = str(account_mail)
html = '''
<!DOCTYPE html>
<html>
<body>
<div style="background-color:#eee;padding:0px;text-align:center;width:100%">
<h2 style="font-family:Georgia, 'Times New Roman', Times, serif;color#454349;">
<img src="http://88.170.110.220/img/MYSY-LOGO-BLUE.png" alt="Mysy Training Logo" width="110px" height="70px"/> </h2>
</div>
<div style="padding:20px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color#454349;font-size:2rem;">
<div style="width:100%">
<div style="text-align:center;">
Bonjour
<div style="padding:20px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color#454349;font-size:1.2rem;">
Nous avons reçu une demande de réinitialisation du mot de passe de votre compte <font color="green">MySy-Training</font>.<br/>
Veuillez cliquer sur le bouton ci-dessous pour le réinitialiser.
. <br/>
<br/>
<div style="background-color:#1962AB;width:20%;text-align:center;margin-left:auto; margin-right:auto;">
<b> <a href="https://dev.mysy-training.com//ResetUserPwd/{objId}" target="_blank" style="color: white;">
Changez de mot de passe
</a>
</b>
</div>
</font>
<br/>
<b>
<a href="http://localhost:3010/ResetUserPwd/{objId}" target="_blank" style="font-size:0.5rem;" >
CLIQUEZ ICI ==> LOCALHOST
</b>
</a>
<p>Cordialement<br>
L'equipe informatique de MySy
</p>
</p>
</div>
</div>
</body>
</html>
'''.format(code=tomorrow_day, objId=token)
html_mime = MIMEText(html, 'html')
# msg.attach(texte_mime)
msg.attach(html_mime)
print("html_mime =" + str(html))
toaddr = str(account_mail)
cc = ['billardman01@hotmail.com']
toaddrs = [toaddr] + cc
# msg.attach(MIMEText(open(filename).read()))
with smtplib.SMTP(smtp_address, port) as server:
server.starttls() # Secure the connection
server.login(user, password)
server.sendmail(sender, toaddrs, msg.as_string())
mycommon.myprint("mail successfully sent to " + str(toaddrs))
return True
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible d'envoyer l'email de notification "

37
main.py
View File

@ -917,6 +917,43 @@ def get_article_avis_alaune():
return jsonify(status=status, message=result) return jsonify(status=status, message=result)
'''
Cette API reinitialise le mot de passe d'un utilisation
depuis le front office'''
@app.route('/myclass/api/InitUserPasswd/', methods=['GET','POST'])
@crossdomain(origin='*')
def InitUserPasswd():
# On recupere le corps (payload) de la requete
payload = request.form.to_dict()
print(" ### payload = ", payload)
status, result = eua.InitUserPasswd(payload)
return jsonify(status=status, message=result)
'''
Cette API verifie la validité d'un token
'''
@app.route('/myclass/api/IsUserTokenValide/', methods=['GET','POST'])
@crossdomain(origin='*')
def IsUserTokenValide():
# On recupere le corps (payload) de la requete
payload = request.form.to_dict()
print(" ### payload = ", payload)
status, result = eua.IsUserTokenValide(payload)
return jsonify(status=status, message=result)
'''
Cette API, modifie le pwd d'un user
en partant d'un token.
l'api est utilisé dans le cas d'un process de reinitialisation du pwd
par le user meme'''
@app.route('/myclass/api/Reset_user_pwd_by_token/', methods=['GET','POST'])
@crossdomain(origin='*')
def Reset_user_pwd_by_token():
# On recupere le corps (payload) de la requete
payload = request.form.to_dict()
print(" ### payload = ", payload)
status, result = eua.Reset_user_pwd_by_token(payload)
return jsonify(status=status, message=result)
if __name__ == '__main__': if __name__ == '__main__':
print(" debut api") print(" debut api")