539 lines
20 KiB
Python
539 lines
20 KiB
Python
'''
|
|
Ce fichier est tout ce qui est lié à la session de connexion
|
|
- check login/pass
|
|
- creation et gestion token de session
|
|
- etc.
|
|
'''
|
|
import secrets
|
|
from pymongo import MongoClient
|
|
import json
|
|
from bson import ObjectId
|
|
from datetime import datetime
|
|
import logging
|
|
import prj_common as mycommon
|
|
from pymongo import ReturnDocument
|
|
import inspect
|
|
import sys, os
|
|
import GlobalVariable as MYSY_GV
|
|
|
|
TOKEN_SIZE = 25
|
|
|
|
class JSONEncoder(json.JSONEncoder):
|
|
def default(self, o):
|
|
if isinstance(o, ObjectId):
|
|
return str(o)
|
|
return json.JSONEncoder.default(self, o)
|
|
|
|
|
|
|
|
def create_token_urlsafe():
|
|
return secrets.token_urlsafe(TOKEN_SIZE)
|
|
|
|
|
|
'''
|
|
Lorsqu'un user se logue, on recupere son RecId,
|
|
puis on enregiste dans table des token :
|
|
- le recid,
|
|
- le token
|
|
|
|
'''
|
|
def login(diction):
|
|
try:
|
|
# Dictionnaire des champs utilisables
|
|
field_list = ['email', 'pwd', 'type']
|
|
incom_keys = diction.keys()
|
|
|
|
'''
|
|
# 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.
|
|
'''
|
|
for val in incom_keys:
|
|
if str(val).lower() not in str(field_list).lower():
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" Le champ '" + val + "' n'existe pas, MAJ annulée")
|
|
return False, " Impossible de se connecter, merci de contacter le support technique", False
|
|
|
|
'''
|
|
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 = ['email', 'pwd']
|
|
for val in field_list_obligatoire:
|
|
if str(val).lower() not in diction:
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
|
|
return False, " Impossible de se connecter, merci de contacter le support technique", False
|
|
|
|
query = {}
|
|
# recuperation des paramettre
|
|
if ("email" in diction.keys()):
|
|
if diction['email']:
|
|
email = diction['email']
|
|
query['email'] = diction['email']
|
|
|
|
|
|
if ("pwd" in diction.keys()):
|
|
if diction['pwd']:
|
|
pwd = diction['pwd']
|
|
query['pwd'] = diction['pwd']
|
|
|
|
if ("type" in diction.keys()):
|
|
if diction['type']:
|
|
type = diction['type']
|
|
query['type'] = diction['type']
|
|
|
|
query['active'] = '1'
|
|
query['locked'] = '0'
|
|
|
|
# Recuperation du RecId du user connecté
|
|
coll_name = MYSY_GV.dbname['user_account']
|
|
|
|
|
|
#print(" on recherche ici " + email)
|
|
|
|
# Verification si ce user existe (controle : login et passwd)
|
|
|
|
|
|
tmp = coll_name.count_documents(query)
|
|
|
|
if (tmp != 1):
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" Login/mot de passe invalide " + str(query)+ " my_user.count() = "+str(tmp))
|
|
return False, " Login/mot de passe invalide, merci de verifier votre saisie. ", False
|
|
|
|
my_user = coll_name.find(query)
|
|
|
|
#recuperation du recid du user
|
|
user_recid = my_user[0]['recid']
|
|
|
|
user_firstconnexion = ""
|
|
if( "firstconnexion" in my_user[0].keys() ):
|
|
user_firstconnexion = my_user[0]['firstconnexion']
|
|
|
|
|
|
#print("#### user_recid = "+user_recid)
|
|
# A ce niveau le login et passe sont ok.
|
|
# il faut donc créer le token et renvoyer le token.
|
|
my_token = create_token_urlsafe()
|
|
|
|
# Enregistrement du token
|
|
token_collection = MYSY_GV.dbname['partner_token']
|
|
|
|
tokenfield = {}
|
|
tokenfield['token'] = my_token
|
|
tokenfield['email'] = email
|
|
tokenfield['recid'] = user_recid
|
|
tokenfield['update_date'] = str(datetime.now())
|
|
tokenfield['start_date'] = str(datetime.now())
|
|
tokenfield['valide'] = '1'
|
|
tokenfield['locked'] = '0'
|
|
tokenfield['type'] = 'user'
|
|
|
|
|
|
'''
|
|
Si il y a un token en cours de validité, il est mis à jour pr prolonger la durée
|
|
de vie du token
|
|
s'il n'y a pas de token valide, aloes on insert un.
|
|
'''
|
|
ret_val = token_collection.find_one_and_update({'recid': str(user_recid), 'valide': '1'},
|
|
{"$set": tokenfield},
|
|
upsert=True,
|
|
return_document=ReturnDocument.AFTER
|
|
)
|
|
|
|
|
|
if ret_val and ret_val['_id']:
|
|
mycommon.myprint(" Ajout Token OK, _id = "+str(ret_val['_id']))
|
|
|
|
now = str(datetime.now())
|
|
|
|
"""
|
|
Mise à jour du compte du partenaie
|
|
avec les info de last connexion et de token
|
|
"""
|
|
partner_update_data = {}
|
|
partner_update_data['lastconnexion'] = str(datetime.now())
|
|
partner_update_data['firstconnexion'] = "0"
|
|
partner_update_data['token'] = str(my_token)
|
|
|
|
|
|
partner_key_secrete_key = ""
|
|
|
|
# Verification que les informations sont juste
|
|
coll_name = MYSY_GV.dbname['user_account']
|
|
|
|
|
|
ret_val = coll_name.find_one_and_update(
|
|
{'email': str(email), 'pwd': str(pwd), 'active': '1', 'locked': '0'},
|
|
{"$set": partner_update_data},
|
|
upsert=False,
|
|
return_document=ReturnDocument.AFTER
|
|
)
|
|
|
|
if ("_id" not in ret_val.keys()):
|
|
mycommon.myprint(
|
|
str(inspect.stack()[0][3]) + " Impossible de récupérer les données de l'utilisateur (2)")
|
|
return False, " Impossible de récupérer les données de l'utilisateur (2) ", False
|
|
|
|
|
|
return True, str(my_token), str(user_firstconnexion)
|
|
else:
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" Impossible d'enregistrer le token " + my_token)
|
|
return False, " Impossible de se connecter, merci de contacter le support technique", False
|
|
|
|
|
|
except Exception as e:
|
|
exc_type, exc_obj, exc_tb = sys.exc_info()
|
|
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
|
|
return False, "Impossible de se connecter, merci de contacter le support technique", False
|
|
|
|
|
|
"""
|
|
Login d'un client de l'intranet
|
|
"""
|
|
def login_intranet_client(diction):
|
|
try:
|
|
# Dictionnaire des champs utilisables
|
|
field_list = ['email', 'pwd', 'type']
|
|
incom_keys = diction.keys()
|
|
|
|
'''
|
|
# 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.
|
|
'''
|
|
for val in incom_keys:
|
|
if str(val).lower() not in str(field_list).lower():
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" Le champ '" + val + "' n'existe pas, MAJ annulée")
|
|
return False, " Impossible de se connecter, merci de contacter le support technique", False, False
|
|
|
|
'''
|
|
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 = ['email', 'pwd']
|
|
for val in field_list_obligatoire:
|
|
if str(val).lower() not in diction:
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
|
|
return False, " Impossible de se connecter, merci de contacter le support technique", False, False
|
|
|
|
query = {}
|
|
# recuperation des paramettre
|
|
if ("email" in diction.keys()):
|
|
if diction['email']:
|
|
email = diction['email']
|
|
query['email'] = diction['email']
|
|
|
|
|
|
if ("pwd" in diction.keys()):
|
|
if diction['pwd']:
|
|
pwd = diction['pwd']
|
|
query['pwd'] = diction['pwd']
|
|
|
|
if ("type" in diction.keys()):
|
|
if diction['type']:
|
|
type = diction['type']
|
|
query['type'] = diction['type']
|
|
|
|
query['active'] = '1'
|
|
query['locked'] = '0'
|
|
|
|
# Recuperation du RecId du user connecté
|
|
coll_name = MYSY_GV.dbname['user_account']
|
|
|
|
|
|
#print(" on recherche ici " + email)
|
|
|
|
# Verification si ce user existe (controle : login et passwd)
|
|
|
|
|
|
tmp = coll_name.count_documents(query)
|
|
|
|
if (tmp != 1):
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" Login/mot de passe invalide " + str(query)+ " my_user.count() = "+str(tmp))
|
|
return False, " Login/mot de passe invalide, merci de verifier votre saisie. ", False, False
|
|
|
|
my_user = coll_name.find(query)
|
|
|
|
#recuperation du recid du user
|
|
user_recid = my_user[0]['recid']
|
|
|
|
user_firstconnexion = ""
|
|
if( "firstconnexion" in my_user[0].keys() ):
|
|
user_firstconnexion = my_user[0]['firstconnexion']
|
|
|
|
|
|
#print("#### user_recid = "+user_recid)
|
|
# A ce niveau le login et passe sont ok.
|
|
# il faut donc créer le token et renvoyer le token.
|
|
my_token = create_token_urlsafe()
|
|
|
|
# Enregistrement du token
|
|
token_collection = MYSY_GV.dbname['partner_token']
|
|
|
|
tokenfield = {}
|
|
tokenfield['token'] = my_token
|
|
tokenfield['email'] = email
|
|
tokenfield['recid'] = user_recid
|
|
tokenfield['update_date'] = str(datetime.now())
|
|
tokenfield['start_date'] = str(datetime.now())
|
|
tokenfield['valide'] = '1'
|
|
tokenfield['locked'] = '0'
|
|
tokenfield['type'] = 'user'
|
|
|
|
|
|
'''
|
|
Si il y a un token en cours de validité, il est mis à jour pr prolonger la durée
|
|
de vie du token
|
|
s'il n'y a pas de token valide, aloes on insert un.
|
|
'''
|
|
ret_val = token_collection.find_one_and_update({'recid': str(user_recid), 'valide': '1'},
|
|
{"$set": tokenfield},
|
|
upsert=True,
|
|
return_document=ReturnDocument.AFTER
|
|
)
|
|
|
|
|
|
if ret_val and ret_val['_id']:
|
|
mycommon.myprint(" Ajout Token OK, _id = "+str(ret_val['_id']))
|
|
|
|
now = str(datetime.now())
|
|
|
|
"""
|
|
Mise à jour du compte du partenaie
|
|
avec les info de last connexion et de token
|
|
"""
|
|
partner_update_data = {}
|
|
partner_update_data['lastconnexion'] = str(datetime.now())
|
|
partner_update_data['firstconnexion'] = "0"
|
|
partner_update_data['token'] = str(my_token)
|
|
|
|
|
|
partner_key_secrete_key = ""
|
|
|
|
# Verification que les informations sont juste
|
|
coll_name = MYSY_GV.dbname['user_account']
|
|
|
|
|
|
ret_val = coll_name.find_one_and_update(
|
|
{'email': str(email), 'pwd': str(pwd), 'active': '1', 'locked': '0'},
|
|
{"$set": partner_update_data},
|
|
upsert=False,
|
|
return_document=ReturnDocument.AFTER
|
|
)
|
|
|
|
if ("_id" not in ret_val.keys()):
|
|
mycommon.myprint(
|
|
str(inspect.stack()[0][3]) + " Impossible de récupérer les données de l'utilisateur (2)")
|
|
return False, " Impossible de récupérer les données de l'utilisateur (2) ", False, False
|
|
|
|
|
|
return True, str(my_token), str(user_firstconnexion), str(ret_val['_id'])
|
|
else:
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" Impossible d'enregistrer le token " + my_token)
|
|
return False, " Impossible de se connecter, merci de contacter le support technique", False, False
|
|
|
|
|
|
except Exception as e:
|
|
exc_type, exc_obj, exc_tb = sys.exc_info()
|
|
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
|
|
return False, "Impossible de se connecter, merci de contacter le support technique", False, False
|
|
|
|
|
|
|
|
|
|
|
|
'''
|
|
Lorsqu'un user se logue, on recupere son RecId,
|
|
puis on enregiste dans table des token :
|
|
- le recid,
|
|
- le token
|
|
'''
|
|
def Ent_Student_login(diction):
|
|
try:
|
|
# Dictionnaire des champs utilisables
|
|
field_list = ['email', 'pwd', 'type']
|
|
incom_keys = diction.keys()
|
|
|
|
'''
|
|
# 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.
|
|
'''
|
|
for val in incom_keys:
|
|
if str(val).lower() not in str(field_list).lower():
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" Le champ '" + val + "' n'existe pas, MAJ annulée")
|
|
return False, " Impossible de se connecter, merci de contacter le support technique", False, False, False, False, False
|
|
|
|
'''
|
|
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 = ['email', 'pwd']
|
|
for val in field_list_obligatoire:
|
|
if str(val).lower() not in diction:
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
|
|
return False, " Impossible de se connecter, merci de contacter le support technique", False, False, False, False, False
|
|
|
|
query = {}
|
|
# recuperation des paramettre
|
|
if ("email" in diction.keys()):
|
|
if diction['email']:
|
|
email = diction['email']
|
|
query['email'] = diction['email']
|
|
|
|
|
|
if ("pwd" in diction.keys()):
|
|
if diction['pwd']:
|
|
pwd = diction['pwd']
|
|
query['pwd'] = diction['pwd']
|
|
|
|
|
|
query['active'] = '1'
|
|
query['locked'] = '0'
|
|
|
|
filter_type = {}
|
|
if ("type" in diction.keys()):
|
|
if diction['type']:
|
|
if( diction['type'] == "student"):
|
|
filter_type = {'$or':[{'type':'student'}, {'type':'tuteur'}]}
|
|
else:
|
|
filter_type = {'type': str(diction['type'])}
|
|
|
|
|
|
find_qry = {'$and': [
|
|
query,
|
|
filter_type, ]}
|
|
|
|
#print(' ## find_qry = ', find_qry)
|
|
|
|
# Recuperation du RecId du user connecté
|
|
coll_name = MYSY_GV.dbname['user_account']
|
|
|
|
|
|
#print(" on recherche ici " + email)
|
|
|
|
# Verification si ce user existe (controle : login et passwd)
|
|
|
|
|
|
tmp = coll_name.count_documents(find_qry)
|
|
|
|
if (tmp != 1):
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" Login/mot de passe invalide " + str(query)+ " my_user.count() = "+str(tmp))
|
|
return False, " Login/mot de passe invalide, merci de verifier votre saisie. ", False, False, False, False, False
|
|
|
|
my_user = coll_name.find(query)
|
|
|
|
#recuperation du recid du user
|
|
user_recid = my_user[0]['partner_owner_recid']
|
|
|
|
user_firstconnexion = ""
|
|
if( "firstconnexion" in my_user[0].keys() ):
|
|
user_firstconnexion = my_user[0]['firstconnexion']
|
|
|
|
|
|
#print("#### user_recid = "+user_recid)
|
|
# A ce niveau le login et passe sont ok.
|
|
# il faut donc créer le token et renvoyer le token.
|
|
my_token = create_token_urlsafe()
|
|
|
|
# Enregistrement du token
|
|
token_collection = MYSY_GV.dbname['partner_token']
|
|
|
|
tokenfield = {}
|
|
tokenfield['token'] = my_token
|
|
tokenfield['email'] = email
|
|
tokenfield['recid'] = user_recid
|
|
tokenfield['update_date'] = str(datetime.now())
|
|
tokenfield['start_date'] = str(datetime.now())
|
|
tokenfield['valide'] = '1'
|
|
tokenfield['locked'] = '0'
|
|
tokenfield['type'] = 'user'
|
|
|
|
|
|
'''
|
|
Si il y a un token en cours de validité, il est mis à jour pr prolonger la durée
|
|
de vie du token
|
|
s'il n'y a pas de token valide, aloes on insert un.
|
|
'''
|
|
ret_val = token_collection.find_one_and_update({'recid': str(user_recid), 'valide': '1'},
|
|
{"$set": tokenfield},
|
|
upsert=True,
|
|
return_document=ReturnDocument.AFTER
|
|
)
|
|
|
|
|
|
if ret_val and ret_val['_id']:
|
|
mycommon.myprint(" Ajout Token OK, _id = "+str(ret_val['_id']))
|
|
|
|
now = str(datetime.now())
|
|
|
|
"""
|
|
Mise à jour du compte du partenaie
|
|
avec les info de last connexion et de token
|
|
"""
|
|
partner_update_data = {}
|
|
partner_update_data['lastconnexion'] = str(datetime.now())
|
|
partner_update_data['firstconnexion'] = "0"
|
|
partner_update_data['token'] = str(my_token)
|
|
|
|
|
|
partner_key_secrete_key = ""
|
|
|
|
# Verification que les informations sont juste
|
|
coll_name = MYSY_GV.dbname['user_account']
|
|
|
|
|
|
ret_val = coll_name.find_one_and_update(
|
|
{'email': str(email), 'pwd': str(pwd), 'active': '1', 'locked': '0'},
|
|
{"$set": partner_update_data},
|
|
upsert=False,
|
|
return_document=ReturnDocument.AFTER
|
|
)
|
|
|
|
if ("_id" not in ret_val.keys()):
|
|
mycommon.myprint(
|
|
str(inspect.stack()[0][3]) + " Impossible de récupérer les données de l'utilisateur (2)")
|
|
return False, " Impossible de récupérer les données de l'utilisateur (2) ", False, False, False, False, False
|
|
|
|
returned_id = ""
|
|
type_connexion = ""
|
|
tab_apprenant_tutored = []
|
|
|
|
if( "apprenant_id" in ret_val.keys() and ret_val['apprenant_id']):
|
|
returned_id = ret_val['apprenant_id']
|
|
type_connexion = "apprenant"
|
|
|
|
elif ("rh_id" in ret_val.keys() and ret_val['rh_id']):
|
|
returned_id = ret_val['rh_id']
|
|
type_connexion = "tuteur"
|
|
|
|
"""
|
|
Recuperer la liste des apprenants tutoré
|
|
"""
|
|
|
|
inscrit_tmp = MYSY_GV.dbname['ressource_humaine'].find_one({'_id':ObjectId(str(ret_val['rh_id'])),
|
|
'partner_recid':str(ret_val['partner_owner_recid'])}, {'tab_inscription_id':1,
|
|
'partner_recid':1})
|
|
|
|
if( inscrit_tmp and "tab_inscription_id" in inscrit_tmp.keys()):
|
|
for tutored in inscrit_tmp['tab_inscription_id']:
|
|
local_inscription_data = MYSY_GV.dbname['inscription'].find_one({'_id':ObjectId(str(tutored['inscription_id'])),
|
|
'partner_owner_recid':str(inscrit_tmp['partner_recid'])}, {'apprenant_id':1})
|
|
|
|
if(local_inscription_data and 'apprenant_id' in local_inscription_data.keys()):
|
|
tab_apprenant_tutored.append(str(local_inscription_data['apprenant_id']))
|
|
|
|
|
|
|
|
return True, str(my_token), str(user_firstconnexion), str(returned_id), str(ret_val['_id']), str(type_connexion), str(tab_apprenant_tutored)
|
|
else:
|
|
mycommon.myprint(str(inspect.stack()[0][3])+" Impossible d'enregistrer le token " + my_token)
|
|
return False, " Impossible de se connecter, merci de contacter le support technique", False, False, False, False, False
|
|
|
|
|
|
except Exception as e:
|
|
exc_type, exc_obj, exc_tb = sys.exc_info()
|
|
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
|
|
return False, "Impossible de se connecter, merci de contacter le support technique", False, False, False, False |