Improve catching errors

This commit is contained in:
poka 2020-11-22 03:09:30 +01:00
parent d4ad7928d6
commit 931ed64481
2 changed files with 85 additions and 42 deletions

View File

@ -4,7 +4,7 @@ import argparse, sys, os
from os.path import join, dirname
from shutil import copyfile
from dotenv import load_dotenv
from lib.cesiumMessaging import ReadFromCesium, SendToCesium, DeleteFromCesium
from lib.cesiumMessaging import ReadFromCesium, SendToCesium, DeleteFromCesium, VERSION
# Get varriables environment
if not os.path.isfile('.env'):
@ -21,13 +21,14 @@ if not dunikey or not pod:
# Parse arguments
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--version', action='store_true', help="Affiche la version actuelle du programme")
subparsers = parser.add_subparsers()
read_cmd = subparsers.add_parser('read', help="Lecture des messages")
send_cmd = subparsers.add_parser('send', help="Envoi d'un message")
delete_cmd = subparsers.add_parser('delete', help="Supression d'un message")
if len(sys.argv) <= 1 or not sys.argv[1] in ('read','send','delete'):
if len(sys.argv) <= 1 or not sys.argv[1] in ('read','send','delete','-v','--version'):
sys.stderr.write("Veuillez indiquer une commande valide:\n\n")
parser.print_help()
sys.exit(1)
@ -41,12 +42,15 @@ send_cmd.add_argument('-m', '--message', help="Message à envoyer")
send_cmd.add_argument('-f', '--fichier', help="Envoyer le message contenu dans le fichier 'FICHIER'")
send_cmd.add_argument('-o', '--outbox', action='store_true', help="Envoi le message sur la boite d'envoi")
delete_cmd.add_argument('-i', '--id', required=True, help="ID du message à supprimer")
delete_cmd.add_argument('-i', '--id', action='append', nargs='+', required=True, help="ID(s) du/des message(s) à supprimer")
delete_cmd.add_argument('-o', '--outbox', action='store_true', help="Suppression d'un message envoyé")
args = parser.parse_args()
if args.version:
print(VERSION)
sys.exit(0)
# Build cesiumMessaging class
if sys.argv[1] == "read":
messages = ReadFromCesium(dunikey, pod)
@ -62,10 +66,11 @@ elif sys.argv[1] == "send":
else:
titre = input("Indiquez le titre du message: ")
msg = input("Indiquez le contenu du message: ")
messages = SendToCesium(dunikey, pod, args.destinataire, args.outbox)
messages.send(titre, msg)
elif sys.argv[1] == "delete":
messages = DeleteFromCesium(dunikey, pod, args.outbox)
messages.delete(args.id)
messages.delete(args.id[0])

View File

@ -6,8 +6,16 @@ from hashlib import sha256
from datetime import datetime
from termcolor import colored
VERSION = "0.1-dev"
PUBKEY_REGEX = "(?![OIl])[1-9A-Za-z]{42,45}"
def pp_json(json_thing, sort=True, indents=4):
if type(json_thing) is str:
print(json.dumps(json.loads(json_thing), sort_keys=sort, indent=indents))
else:
print(json.dumps(json_thing, sort_keys=sort, indent=indents))
return None
class ReadFromCesium:
def __init__(self, dunikey, pod):
# Get my pubkey from my private key
@ -69,41 +77,63 @@ class ReadFromCesium:
}
# Send JSON document and get JSON result
result = requests.post('{0}/message/{1}/_search'.format(self.pod, boxType), headers=headers, data=document).json()["hits"]
return result
result = requests.post('{0}/message/{1}/_search'.format(self.pod, boxType), headers=headers, data=document)
if result.status_code == 200:
return result.json()["hits"]
else:
sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + result.text)
# Parse JSON result and display messages
def readMessages(self, msgJSON, nbrMsg):
def readMessages(self, msgJSON, nbrMsg, outbox):
def decrypt(msg):
msg64 = base64.b64decode(msg)
return box_decrypt(msg64, get_privkey(self.dunikey, "pubsec"), self.issuer, nonce).decode()
# Get terminal size
rows = int(os.popen('stty size', 'r').read().split()[1])
self.total = msgJSON["total"]
infoTotal = " Nombre de messages: " + str(nbrMsg) + "/" + str(self.total) + " "
print(colored(infoTotal.center(rows, '#'), "yellow"))
for hits in msgJSON["hits"]:
self.idMsg = hits["_id"]
msgSrc = hits["_source"]
self.issuer = msgSrc["issuer"]
nonce = msgSrc["nonce"]
nonce = base58.b58decode(nonce)
self.title = base64.b64decode(msgSrc["title"])
self.title = box_decrypt(self.title, get_privkey(self.dunikey, "pubsec"), self.issuer, nonce).decode()
self.content = base64.b64decode(msgSrc["content"])
self.content = box_decrypt(self.content, get_privkey(self.dunikey, "pubsec"), self.issuer, nonce).decode()
self.dateS = msgSrc["time"]
date = datetime.fromtimestamp(self.dateS).strftime(", le %d/%m/%Y à %H:%M ")
headerMsg = " De " + self.issuer + date + "(ID: {})".format(self.idMsg) + " "
totalMsg = msgJSON["total"]
if nbrMsg > totalMsg:
nbrMsg = totalMsg
print('-'.center(rows, '-'))
print(colored(headerMsg, "blue").center(rows+9, '-'))
print('-'.center(rows, '-'))
print("Objet: " + self.title)
print(self.content)
if totalMsg == 0:
print(colored("Aucun message à afficher.", 'yellow'))
return True
else:
infoTotal = " Nombre de messages: " + str(nbrMsg) + "/" + str(totalMsg) + " "
print(colored(infoTotal.center(rows, '#'), "yellow"))
for hits in msgJSON["hits"]:
self.idMsg = hits["_id"]
msgSrc = hits["_source"]
self.issuer = msgSrc["issuer"]
nonce = msgSrc["nonce"]
nonce = base58.b58decode(nonce)
self.dateS = msgSrc["time"]
date = datetime.fromtimestamp(self.dateS).strftime(", le %d/%m/%Y à %H:%M ")
if outbox:
startHeader = " À " + msgSrc["recipient"]
else:
startHeader = " De " + self.issuer
headerMsg = startHeader + date + "(ID: {})".format(self.idMsg) + " "
print('-'.center(rows, '-'))
print(colored(headerMsg, "blue").center(rows+9, '-'))
print('-'.center(rows, '-'))
try:
self.title = decrypt(msgSrc["title"])
self.content = decrypt(msgSrc["content"])
except Exception as e:
sys.stderr.write(colored(str(e), 'red') + '\n')
pp_json(hits)
continue
print("Objet: " + self.title)
print(self.content)
# pp_json(hits)
def read(self, nbrMsg, outbox):
jsonMsg = self.sendDocument(nbrMsg, outbox)
self.readMessages(jsonMsg, nbrMsg)
self.readMessages(jsonMsg, nbrMsg, outbox)
@ -181,10 +211,12 @@ class SendToCesium:
sys.stderr.write("Impossible d'envoyer le message:\n" + str(e))
sys.exit(1)
else:
print(colored("Message envoyé avec succès !", "green"))
print("ID: " + result.text)
return result
if result.status_code == 200:
print(colored("Message envoyé avec succès !", "green"))
print("ID: " + result.text)
return result
else:
sys.stderr.write("Erreur inconnue.")
def send(self, title, msg):
finalDoc = self.configDoc(self.encryptMsg(title), self.encryptMsg(msg)) # Configure JSON document to send
@ -239,7 +271,7 @@ class DeleteFromCesium:
return finalDoc
def sendDocument(self, document):
def sendDocument(self, document, idMsg):
headers = {
'Content-type': 'application/json',
}
@ -249,14 +281,20 @@ class DeleteFromCesium:
result = requests.post('{0}/history/delete'.format(self.pod), headers=headers, data=document)
if result.status_code == 404:
raise ValueError("Message introuvable")
elif result.status_code == 403:
raise ValueError("Vous n'êtes pas l'auteur de ce message.")
except Exception as e:
sys.stderr.write("Impossible de supprimer le message:\n" + str(e) + "\n")
sys.exit(1)
sys.stderr.write(colored("Impossible de supprimer le message {0}:\n".format(idMsg), 'red') + str(e) + "\n")
return False
else:
print(colored("Message supprimé avec succès !", "green"))
return result
if result.status_code == 200:
print(colored("Message {0} supprimé avec succès !".format(idMsg), "green"))
return result
else:
sys.stderr.write("Erreur inconnue.")
def delete(self, idMsg):
finalDoc = self.configDoc(idMsg)
self.sendDocument(finalDoc)
def delete(self, idsMsgList):
for idMsg in idsMsgList:
finalDoc = self.configDoc(idMsg)
self.sendDocument(finalDoc, idMsg)