diff --git a/imap-over-tls-example.py b/imap-over-tls-example.py new file mode 100644 index 0000000..9dfcd70 --- /dev/null +++ b/imap-over-tls-example.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +import imaplib +import msal +import pprint + +conf = { + "authority": "https://login.microsoftonline.com/47f02128-acf0-47a7-a3bf-27a3619d4a4f", + "client_id": "4fdf2634-a260-4576-a442-684998f0187b", #AppID + "scope": ['https://outlook.office365.com/.default'], + "secret": "dZD8Q~GmG_PFi.t_uRiyBEzwLeMZeemQGHUFta~J", #Key-Value + "secret-id": "5cae3249-0fc0-43e2-bc0e-d78f41964970", #Key-ID +} + +def generate_auth_string(user, token): + return f"user={user}\x01auth=Bearer {token}\x01\x01" + +if __name__ == "__main__": + app = msal.ConfidentialClientApplication(conf['client_id'], authority=conf['authority'], + client_credential=conf['secret']) + + result = app.acquire_token_silent(conf['scope'], account=None) + + if not result: + print("No suitable token in cache. Get new one.") + result = app.acquire_token_for_client(scopes=conf['scope']) + + if "access_token" in result: + print(result['token_type']) + pprint.pprint(result) + else: + print(result.get("error")) + print(result.get("error_description")) + print(result.get("correlation_id")) + + imap = imaplib.IMAP4('outlook.office365.com') + imap.starttls() + imap.authenticate("XOAUTH2", lambda x: generate_auth_string("polynet-dumas@entreprise-dumas.com", result['access_token']).encode("utf-8")) + + # Print list of mailboxes on server + code, mailboxes = imap.list() + for mailbox in mailboxes: + print(mailbox.decode("utf-8")) + # Select mailbox + imap.select("INBOX") + # Cleanup + imap.close() \ No newline at end of file diff --git a/mondumas/models/utils.py b/mondumas/models/utils.py index 994cad3..04301fd 100644 --- a/mondumas/models/utils.py +++ b/mondumas/models/utils.py @@ -186,6 +186,11 @@ def get_last_devis_client(request, societe, cd_cli): results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() return results +def get_last_proforma_client(request, societe, cd_cli): + query = "SELECT * FROM proforma WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;" + results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() + return results + def get_last_chantier_client(request, societe, cd_cli): query = "SELECT * FROM dem_devis WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() diff --git a/mondumas/views/default.py b/mondumas/views/default.py index 5c3167f..3ee129e 100644 --- a/mondumas/views/default.py +++ b/mondumas/views/default.py @@ -23,6 +23,7 @@ import json import locale import hashlib import imaplib +import msal import email from ..models.default import * @@ -72,34 +73,55 @@ def to_percent(x): """Takes a float and returns a string""" return ("%.2f " % x).replace('.', ',') + "%" +def generate_auth_string(user, token): + return f"user={user}\x01auth=Bearer {token}\x01\x01" + def mailbox_connect(request, societe): # connecter au serveur IMAP de la societe if societe == 'PE': mbx_name = 'peinture-dumas@entreprise-dumas.com' - mbx_pwd = 'S@sdumas69' elif societe == 'ME': mbx_name = 'menuiserie-dumas@entreprise-dumas.com' - mbx_pwd = 'S@sdumas69' elif societe == 'PL': mbx_name = 'versanit-dumas@entreprise-dumas.com' - mbx_pwd = 'S@sdumas69' elif societe == 'PO': mbx_name = 'polynet-dumas@entreprise-dumas.com' - mbx_pwd = 'S@sdumas69' else: request.session.flash("Cette société est inconnue ou non traitée : %s" % societe, 'danger') return None - + + conf = { + "authority": "https://login.microsoftonline.com/47f02128-acf0-47a7-a3bf-27a3619d4a4f", + "client_id": "4fdf2634-a260-4576-a442-684998f0187b", #AppID + "scope": ['https://outlook.office365.com/.default'], + "secret": "dZD8Q~GmG_PFi.t_uRiyBEzwLeMZeemQGHUFta~J", #Key-Value + "secret-id": "5cae3249-0fc0-43e2-bc0e-d78f41964970", #Key-ID + } + + app = msal.ConfidentialClientApplication(conf['client_id'], authority=conf['authority'], + client_credential=conf['secret']) + + result = app.acquire_token_silent(conf['scope'], account=None) + + if not result: + result = app.acquire_token_for_client(scopes=conf['scope']) + + if "access_token" not in result: + request.session.flash("ERREUR de connexion au serveur Exchange : %s" % result.get("error"), 'danger') + return None + + imap = imaplib.IMAP4('outlook.office365.com') + imap.starttls() # import pdb;pdb.set_trace() - conn = imaplib.IMAP4_SSL('imap.entreprise-dumas.com') try: # se connecter à la mailbox - conn.login(mbx_name, mbx_pwd) + imap.authenticate("XOAUTH2", lambda x: generate_auth_string(mbx_name, result['access_token']).encode("utf-8")) except imaplib.IMAP4.error: request.session.flash("ERREUR connexion au compte %s" % mbx_name, 'danger') return None - return conn + # returne la connection + return imap @view_config(route_name='home', renderer='../templates/default/home.pt', permission='view') def home(request): diff --git a/mondumas/views/dossier.py b/mondumas/views/dossier.py index 9354b2b..48ff84e 100644 --- a/mondumas/views/dossier.py +++ b/mondumas/views/dossier.py @@ -987,13 +987,8 @@ def demandes_dl(request): elif 'domus-services.fr' in mbx_search: # extraire les infos de la demmande DOMUS dem_info = get_pdf_infos_domus(extracted_file) - if societe == 'PE': - cd_cli = 8991 - elif societe == 'ME': - cd_cli = 5276 - else: - # VERSANIT - cd_cli = 3209 + # toutes les demandes sont pour la société PE + cd_cli = 8991 # extraction OK ? oui, créer une dem_devis et récupèrer son no_id traite = 0 diff --git a/mondumas/views/utils.py b/mondumas/views/utils.py index dd01af4..aca88ad 100644 --- a/mondumas/views/utils.py +++ b/mondumas/views/utils.py @@ -209,9 +209,9 @@ def batch_test(request): """ # données de + 10 ans until_date = date(TODAY.year - 10, TODAY.month, 1) - purge_mensuelle(request, until_date) + # purge_mensuelle(request, until_date) purge_clients(request) - delete_orphan_attached_files(request) + # delete_orphan_attached_files(request) # update_chantiers_delais(request, date(TODAY.year - 1, TODAY.month, 1)) insert_log(request, 'TEST','- Fin -') @@ -309,29 +309,30 @@ def update_chantiers_delais(request, date): update_chantier_delais(request, societe, item.NO_ID, delai_contact, delai_rdv, delai_devis, delai_facture) def purge_clients(request): + # lire tous les clients clients = get_all_clients(request) for client in clients: dern_operation = None - # lire la facture la + récente - facture = get_last_facture_client(request, client.societe, client.CD_CLI) - if facture: - dern_operation = facture.DATE + # lire le chantier le + récent + chantier = get_last_chantier_client(request, client.societe, client.CD_CLI) + if chantier: + dern_operation = chantier.DATE else: - # lire le réglemnet le + récent - payment = get_last_payment_client(request, client.societe, client.CD_CLI) - if payment: - dern_operation = payment.DATE + # lire le devis le + récent + devis = get_last_devis_client(request, client.societe, client.CD_CLI) + if devis: + dern_operation = devis.DATE else: - # lire le devis le + récent - devis = get_last_devis_client(request, client.societe, client.CD_CLI) - if devis: - dern_operation = devis.DATE + # lire le proforma le + récent + proforma = get_last_proforma_client(request, client.societe, client.CD_CLI) + if proforma: + dern_operation = proforma.DATE else: - # lire le chantier le + récent - chantier = get_last_chantier_client(request, client.societe, client.CD_CLI) - if chantier: - dern_operation = chantier.DATE + # lire la facture la + récente + facture = get_last_facture_client(request, client.societe, client.CD_CLI) + if facture: + dern_operation = facture.DATE # mémoriser dernière opération update_client_dern_operation(request, client.societe, client.CD_CLI, dern_operation)