From 03114014d267792e695aa90565803ceb8de19e3c Mon Sep 17 00:00:00 2001 From: qo-op Date: Thu, 3 Dec 2020 02:46:55 +0100 Subject: [PATCH] latest gchange messaging --- zen/cesium-messaging/dialog.py | 76 ---- zen/cesium-messaging/gchange-profile.py | 55 --- zen/cesium-messaging/jaklis.py | 5 +- .../lib/__pycache__/cesium.cpython-36.pyc | Bin 12012 -> 13137 bytes .../lib/__pycache__/likes.cpython-36.pyc | Bin 7885 -> 7922 bytes zen/cesium-messaging/lib/cesium.py | 56 ++- zen/cesium-messaging/lib/cesiumMessaging.py | 298 ---------------- zen/cesium-messaging/lib/gchange.py | 324 ------------------ zen/cesium-messaging/lib/likes.py | 7 +- 9 files changed, 62 insertions(+), 759 deletions(-) delete mode 100755 zen/cesium-messaging/dialog.py delete mode 100755 zen/cesium-messaging/gchange-profile.py delete mode 100755 zen/cesium-messaging/lib/cesiumMessaging.py delete mode 100644 zen/cesium-messaging/lib/gchange.py diff --git a/zen/cesium-messaging/dialog.py b/zen/cesium-messaging/dialog.py deleted file mode 100755 index a4c97d5..0000000 --- a/zen/cesium-messaging/dialog.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 - -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, VERSION - -# Get variables environment -if not os.path.isfile('.env'): - copyfile(".env.template", ".env") -dotenv_path = join(dirname(__file__), '.env') -load_dotenv(dotenv_path) - -dunikey = os.getenv('DUNIKEY') -pod = os.getenv('POD') -if not dunikey or not pod: - sys.stderr.write("Please fill the path of your private key (PubSec), and a Cesium ES address in .env file\n") - sys.exit(1) - - -# 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','-v','--version'): - sys.stderr.write("Veuillez indiquer une commande valide:\n\n") - parser.print_help() - sys.exit(1) - -read_cmd.add_argument('-n', '--number',type=int, default=3, help="Affiche les NUMBER derniers messages") -read_cmd.add_argument('-o', '--outbox', action='store_true', help="Lit les messages envoyés") - -send_cmd.add_argument('-d', '--destinataire', required=True, help="Destinataire du message") -send_cmd.add_argument('-t', '--titre', help="Titre du message à envoyer") -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', 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) - messages.read(args.number, args.outbox) -elif sys.argv[1] == "send": - if args.fichier: - with open(args.fichier, 'r') as f: - titre = f.readline() - msg = ''.join(f.read().splitlines(True)[0:]) - elif args.titre and args.message: - titre = args.titre - msg = args.message - 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[0]) - diff --git a/zen/cesium-messaging/gchange-profile.py b/zen/cesium-messaging/gchange-profile.py deleted file mode 100755 index e66c4a3..0000000 --- a/zen/cesium-messaging/gchange-profile.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 - -import argparse, sys, os -from os.path import join, dirname -from shutil import copyfile -from dotenv import load_dotenv -from lib.gchange import ReadLikes, SendLikes, UnLikes - -# Get variables environment -if not os.path.isfile('.env'): - copyfile(".env.template", ".env") -dotenv_path = join(dirname(__file__), '.env') -load_dotenv(dotenv_path) - -dunikey = os.getenv('DUNIKEY') -pod = os.getenv('POD') -if not dunikey or not pod: - sys.stderr.write("Please fill the path of your private key (PubSec), and a Cesium ES address in .env file\n") - sys.exit(1) - - -# Parse arguments -parser = argparse.ArgumentParser() - -subparsers = parser.add_subparsers() -# readLike_cmd = subparsers.add_parser('readlike', help="Lire les likes d'un profile") -like_cmd = subparsers.add_parser('like', help="Voir les likes d'un profile / Liker un profile (option -s NOTE") -unlike_cmd = subparsers.add_parser('unlike', help="Supprimer un like") - -if len(sys.argv) <= 1 or not sys.argv[1] in ('like','unlike'): - sys.stderr.write("Veuillez indiquer une commande valide:\n\n") - parser.print_help() - sys.exit(1) - -# readLike_cmd.add_argument('-p', '--profile', help="Profile cible") - -like_cmd.add_argument('-p', '--profile', help="Profile cible") -like_cmd.add_argument('-s', '--stars', type=int, help="Nombre d'étoile") - -unlike_cmd.add_argument('-p', '--profile', help="Profile à déliker") - -args = parser.parse_args() - -# Build gchange class -if sys.argv[1] == "like": - if args.stars or args.stars == 0: - gchange = SendLikes(dunikey, pod) - gchange.like(args.stars, args.profile) - else: - gchange = ReadLikes(dunikey, pod) - gchange.readLikes(args.profile) -elif sys.argv[1] == "unlike": - gchange = UnLikes(dunikey, pod) - gchange.unLike(args.profile) - diff --git a/zen/cesium-messaging/jaklis.py b/zen/cesium-messaging/jaklis.py index d331632..bd34372 100755 --- a/zen/cesium-messaging/jaklis.py +++ b/zen/cesium-messaging/jaklis.py @@ -37,6 +37,7 @@ if len(sys.argv) <= 1 or not sys.argv[1] in ('read','send','delete','set','get', # Messages management read_cmd.add_argument('-n', '--number',type=int, default=3, help="Affiche les NUMBER derniers messages") +read_cmd.add_argument('-j', '--json', action='store_true', help="Sort au format JSON") read_cmd.add_argument('-o', '--outbox', action='store_true', help="Lit les messages envoyés") send_cmd.add_argument('-d', '--destinataire', required=True, help="Destinataire du message") @@ -100,11 +101,11 @@ if not os.path.isfile(dunikey): # Build cesiumMessaging class if sys.argv[1] == "read": messages = ReadFromCesium(dunikey, pod) - messages.read(args.number, args.outbox) + messages.read(args.number, args.outbox, args.json) elif sys.argv[1] == "send": if args.fichier: with open(args.fichier, 'r') as f: - titre = f.readline() + titre = f.readline().replace('\n','') msg = ''.join(f.read().splitlines(True)[0:]) elif args.titre and args.message: titre = args.titre diff --git a/zen/cesium-messaging/lib/__pycache__/cesium.cpython-36.pyc b/zen/cesium-messaging/lib/__pycache__/cesium.cpython-36.pyc index 12b0bccae3d82c0270893fe691bd4f24aeca3b59..045196ab6047208759f6f0e00f76ab557de758ae 100644 GIT binary patch delta 2440 zcmZuyU2GIp6u$TF?Ck99?rhs_X%{M8s}!d#8<1b65(yP62pGzr)r!l`Y}su)TkcGu z)L9#B`AhsMUVow{ikheo7$N(h#s?pa3BDMOi4PkRH9nw;i7`H!falyPEf6}HZ_m%Y z=gj@iIk$fe{#ejgCldO%n=cyi$N-2B>Hl8J5iA$gA zhxpr|C18v0sAp&?RMC%TdF?Pcf^$83It^C4CKlk8Rseo+K7LmDuyK1H@qmh_9CF{0MrBAp4OXI75k{ zlqOb#)YLgG)kA!JPHvQ*$ed&>vYVqnz4ZdnMS&Lp`6$sJ~iJ`2`;s<^E zcHRfo;Ey4M5wKXi6`>1Z8-U69c9b6v7Zb6&rb=$v* zj~5V-L|}MHjCNs0K>XVVO3HN@`& zox(t%B~%G}Fss z(12cYA1ymu%X~EF1r4{*bpsIM6L?)L5P<_Ka73L=rfxeRhx6_!{8Ld^%IPb;D&G~=wFKe>aWtD zs=qgM(>h)ROD%HL=5Dd<@aIHZqSsv>+29Y5$6g&1YIGxDQpJQcj=jQaPBX#HDO1qPWnMQ7W94 z_9h1xml4Jg@N;=Z^ktTZkAV1v_^~BLkHGoT)oU#ylr5swk;Mo|7N0L&H^&ccTT&+jZoO{EzphYHO>kAY8rYyQl3GSv#Lrew zWpqY|tLNG^wr7Da#mf!3e4Y{hA_lra2+EQ%Y@=ZG=kE@V;rXp>E#FlqOI%Z&9Nbms zaD_m46`&RxE4%!4R3)8~$=6W5iB42sLUMiH{ZLcC`mR+MoG2LO( zH^iqMX6&Xc;BrTJ%V)4H*P3JWJMocuAw7Q|PsX3%7%Q6vy|i9ec8l6DO8q$8n15gqqEln>cL(Emc9ZKn0~y5}+0lb>nsF;Miu? zNkef05iR`y(y9-n(jtl~A$sVgT2AD^Arc^vqH^Hk3j(1=mAF(~5%As?NU_jretIAC z-pu}YX1~w=I;kbSUQKs@^YYibZ)&S5uK9Oa!Z9i!Wu-iS!ec4-tT}yP?74$-SWy%? z!gz*|a?0XyGbPH!aytL4Ii0G{6|%)~_T*m9yQpqVPNnd&_a+{S1oB%bT2W?{3RKj$ z)I|r`P;uCv1C)$1rs!}`SLKs5PaY-cPN}o~@4_kfj9DzuVlu#S8?9^|CM?h}odg9M z0HgjO2psVbxww-&j7`ZPuJ|>dMy>$SBASIyY?mRtp|)9TeupZmu5_tn6f*c-U?Eh6 zT>@N?Z;NwNG-a{^*VoqcBy>7;=z&d4Tae z-U`LQ#NR^i!!_$n+Xlb{mfDBm2&S9;xZ1u4(s;Ko2w!4L%-RYZ>Bxinvtq4p z*$eyTxOSdUb1iy>-e^;?!>yO|X=i~(5jwRs@40rA% z#YQ{(eRi`woZHX1Ctfpt)_Hxao%%oRTp1&8l#Mu+x_W%I;-R}E9$cngKhZD+flf-3 zh>}Xn)}1a*Rfhqq&ZrfLZ@|E&O3re6+T0XEp5pENqXXNvP&3%4hiVjw<8j^l_&J{Q zF5?|S)ln*%a)n)6DO;rX*u76FcHd^4W-Q@XdK8|<4gC+8!`t0DoJU`e?zyiqKGCxd zrseNF$;a+eUkN_I`u-bjqgCi`iV>h|cHe+|J>8{}^1ySYl3Gp|tLh7x8K$ z;JUyC=kSZfqjenr9Dh$-+i!RIh^N)d7*BYRv5gUDJjA%nu#e;?Y&8*d*S#x#i31*1>;`JBkJ)O}l+|3NQ8 Tg#J7BqdHYhG?p4C8z=q(iZ(pc diff --git a/zen/cesium-messaging/lib/__pycache__/likes.cpython-36.pyc b/zen/cesium-messaging/lib/__pycache__/likes.cpython-36.pyc index 570996ca131e203752cf3cd8de4efa1a5adc214c..9f3856654626149b1c842a850b774567ea93e190 100644 GIT binary patch delta 852 zcmYk4OH31C5XZl1x7+PLpoJDn?Ut5Eu)YG+a8Mc&B~~mUATO0SEK19(e3b)n2`1ds z1a(ZjaPe{FVD>=bO)qjG9=w#)0VYcK4MvtYh zYd6@E>pHW&mLW7MIx~wQg-!Hh2j&3M;WU+DrJWKcm7R)wJR(ia1`jPKMr$l@t2 z<>?mh=5R)P0KND_I}aOpQlHX#DJ@C-8g9jEaYwIJOr?fvRA~choGpcvQg5(^86Cjo-s@x#3AYGTf!`*~5po3cA7bR469_urBXNK{j>~E6 ziYA~B=c7H)f^VX$P{3w0A{Xf{$6hn+SrqO?Tr``G|2I#P>j?z{CFLE2MH+F0)BJvl iQ=}c0N9-4y4)6s$Fwcs$hGQ!-tw98~Vi(*}#q=Lo(7BQT delta 870 zcmZvZ%WD%+6vprAWHOVZ}yeB>oadCg=<9zp?d+xd4k}s2< zxW}X2&pw?#yN9ulco6~{P5Tv1VT>ITtMC@5lriO;CHJrt$4#Z-g5@&ZA$HzvDW)!> zE}|M@rblRxrCMx3%2n})mTqa5$MmjCmebskU@ON&R6=aQA@*pNTX?>8#~Ofejx)<4 zTz`TU*@A32*I<;zst3!C?0m6MmW%mfdT~NeXEJ;?lg1^rZ}NSjznH{ZL?}C# z3$rCNU&)o_)qIH;Vh&y_EZ$4LyqsPg%j0`B1xK*U)dIaZ=ZeE#yyL2Osi1-m8dTfQ zTv33-_({t`KMuR&@_;xzhnL+~UDy25U<21h3a@!UyaPG}n(% zdXz9ms3&v~x(Q2kaoxC(SH&u*0^%9fYO`waaopBJ_&Sh;ob9W<4e&)Y)rimQZbBbU z1_yrj|LfX~;1q!E4K;%M1Qk9>Si;V5L(c@sNrHzkMMw$6e0-X8#jnh`QmdVE)CfOK zNE2r8ZrE_1A=!_Q!#fiu$v7cNm?cn6K1aw9vIOG~qNM2Ie%rUJ0bm~6BBx*&Z$t*6 z72iclUHRWTDx-8ffH5;mFxbgx+sipyk)ffci4ZG#Rt(ynCHayZLtdUca>@T fR73Ui9D1Xz;=7a46({|ONNgE(_#(Pn0`JTZm3F|S diff --git a/zen/cesium-messaging/lib/cesium.py b/zen/cesium-messaging/lib/cesium.py index 0d346e3..e9d4978 100644 --- a/zen/cesium-messaging/lib/cesium.py +++ b/zen/cesium-messaging/lib/cesium.py @@ -115,11 +115,63 @@ class ReadFromCesium: print(self.content) print(colored(infoTotal.center(rows, '#'), "yellow")) + + # Parse JSON result and display messages + def jsonMessages(self, msgJSON, nbrMsg, outbox): + def decrypt(msg): + msg64 = base64.b64decode(msg) + return box_decrypt(msg64, get_privkey(self.dunikey, "pubsec"), self.issuer, nonce).decode() + totalMsg = msgJSON["total"] + if nbrMsg > totalMsg: + nbrMsg = totalMsg - def read(self, nbrMsg, outbox): + if totalMsg == 0: + print("Aucun message à afficher") + return True + else: + data = [] + # data.append({}) + # data[0]['total'] = totalMsg + for i, hits in enumerate(msgJSON["hits"]): + self.idMsg = hits["_id"] + msgSrc = hits["_source"] + self.issuer = msgSrc["issuer"] + nonce = msgSrc["nonce"] + nonce = base58.b58decode(nonce) + self.date = msgSrc["time"] + + if outbox: + pubkey = msgSrc["recipient"] + else: + pubkey = self.issuer + + 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 + + data.append(i) + data[i] = {} + data[i]['id'] = self.idMsg + data[i]['date'] = self.date + data[i]['pubkey'] = pubkey + data[i]['title'] = self.title + data[i]['content'] = self.content + + data = json.dumps(data, indent=2) + return data + + def read(self, nbrMsg, outbox, isJSON): jsonMsg = self.sendDocument(nbrMsg, outbox) - self.readMessages(jsonMsg, nbrMsg, outbox) + if isJSON: + jsonFormat = self.jsonMessages(jsonMsg, nbrMsg, outbox) + print(jsonFormat) + else: + self.readMessages(jsonMsg, nbrMsg, outbox) diff --git a/zen/cesium-messaging/lib/cesiumMessaging.py b/zen/cesium-messaging/lib/cesiumMessaging.py deleted file mode 100755 index e27e370..0000000 --- a/zen/cesium-messaging/lib/cesiumMessaging.py +++ /dev/null @@ -1,298 +0,0 @@ -#!/usr/bin/env python3 - -import os, sys, ast, requests, json, base58, base64, time, string, random, re -from lib.natools import fmt, sign, get_privkey, box_decrypt, box_encrypt -from hashlib import sha256 -from datetime import datetime -from termcolor import colored - -VERSION = "0.1.1" -PUBKEY_REGEX = "(?![OIl])[1-9A-Za-z]{42,45}" - -def pp_json(json_thing, sort=True, indents=4): - # Print beautifull JSON - 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 - try: - self.dunikey = dunikey - if not dunikey: - raise ValueError("Dunikey is empty") - except: - sys.stderr.write("Please fill the path to your private key (PubSec)\n") - sys.exit(1) - - self.recipient = get_privkey(dunikey, "pubsec").pubkey - self.pod = pod - - if not re.match(PUBKEY_REGEX, self.recipient) or len(self.recipient) > 45: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - sys.exit(1) - - # Configure JSON document to send - def configDoc(self, nbrMsg, outbox): - boxType = "issuer" if outbox else "recipient" - - data = {} - data['sort'] = { "time": "desc" } - data['from'] = 0 - data['size'] = nbrMsg - data['_source'] = ['issuer','recipient','title','content','time','nonce','read_signature'] - data['query'] = {} - data['query']['bool'] = {} - data['query']['bool']['filter'] = {} - data['query']['bool']['filter']['term'] = {} - data['query']['bool']['filter']['term'][boxType] = self.recipient - - document = json.dumps(data) - return document - - def sendDocument(self, nbrMsg, outbox): - boxType = "outbox" if outbox else "inbox" - - document = self.configDoc(nbrMsg, outbox) - headers = { - 'Content-type': 'application/json', - } - - # Send JSON document and get JSON 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, 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]) - - totalMsg = msgJSON["total"] - if nbrMsg > totalMsg: - nbrMsg = totalMsg - - 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, outbox) - - - - -#################### Sending class #################### - - - - -class SendToCesium: - def __init__(self, dunikey, pod, recipient, outbox): - # Get my pubkey from my private key - try: - self.dunikey = dunikey - if not dunikey: - raise ValueError("Dunikey is empty") - except: - sys.stderr.write("Please fill the path to your private key (PubSec)\n") - sys.exit(1) - - self.issuer = get_privkey(dunikey, "pubsec").pubkey - self.pod = pod - self.recipient = recipient - self.outbox = outbox - - # Generate pseudo-random nonce - nonce=[] - for i in range(32): - nonce.append(random.choice(string.ascii_letters + string.digits)) - self.nonce = base64.b64decode(''.join(nonce)) - - if not re.match(PUBKEY_REGEX, recipient) or len(recipient) > 45: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - sys.exit(1) - - - def encryptMsg(self, msg): - return fmt["64"](box_encrypt(msg.encode(), get_privkey(self.dunikey, "pubsec"), self.recipient, self.nonce)).decode() - - def configDoc(self, title, msg): - b58nonce = base58.b58encode(self.nonce).decode() - - # Get current timestamp - timeSent = int(time.time()) - - # Generate custom JSON - data = {} - data['issuer'] = self.issuer - data['recipient'] = self.recipient - data['title'] = title - data['content'] = msg - data['time'] = timeSent - data['nonce'] = b58nonce - data['version'] = 2 - document = json.dumps(data) - - # Generate hash of document - hashDoc = sha256(document.encode()).hexdigest().upper() - - # Generate signature of document - signature = fmt["64"](sign(hashDoc.encode(), get_privkey(self.dunikey, "pubsec"))[:-len(hashDoc.encode())]).decode() - - # Build final document - finalDoc = '{' + '"hash":"{0}","signature":"{1}",'.format(hashDoc, signature) + document[1:] - - return finalDoc - - - def sendDocument(self, document): - boxType = "outbox" if self.outbox else "inbox" - - headers = { - 'Content-type': 'application/json', - } - - # Send JSON document and get result - try: - result = requests.post('{0}/message/{1}?pubkey={2}'.format(self.pod, boxType, self.recipient), headers=headers, data=document) - except Exception as e: - sys.stderr.write("Impossible d'envoyer le message:\n" + str(e)) - sys.exit(1) - else: - 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:" + '\n') - print(str(pp_json(result.text)) + '\n') - - def send(self, title, msg): - finalDoc = self.configDoc(self.encryptMsg(title), self.encryptMsg(msg)) # Configure JSON document to send - self.sendDocument(finalDoc) # Send final signed document - - - - -#################### Deleting class #################### - - - - -class DeleteFromCesium: - def __init__(self, dunikey, pod, outbox): - # Get my pubkey from my private key - try: - self.dunikey = dunikey - if not dunikey: - raise ValueError("Dunikey is empty") - except: - sys.stderr.write("Please fill the path to your private key (PubSec)\n") - sys.exit(1) - - self.issuer = get_privkey(dunikey, "pubsec").pubkey - self.pod = pod - self.outbox = outbox - - - def configDoc(self, idMsg): - # Get current timestamp - timeSent = int(time.time()) - - boxType = "outbox" if self.outbox else "inbox" - - # Generate document to customize - data = {} - data['version'] = 2 - data['index'] = "message" - data['type'] = boxType - data['id'] = idMsg - data['issuer'] = self.issuer - data['time'] = timeSent - document = json.dumps(data) - - # Generate hash of document - hashDoc = sha256(document.encode()).hexdigest().upper() - - # Generate signature of document - signature = fmt["64"](sign(hashDoc.encode(), get_privkey(self.dunikey, "pubsec"))[:-len(hashDoc.encode())]).decode() - - # Build final document - data = {} - data['hash'] = hashDoc - data['signature'] = signature - signJSON = json.dumps(data) - finalJSON = {**json.loads(signJSON), **json.loads(document)} - finalDoc = json.dumps(finalJSON) - - return finalDoc - - def sendDocument(self, document, idMsg): - headers = { - 'Content-type': 'application/json', - } - - # Send JSON document and get result - try: - 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(colored("Impossible de supprimer le message {0}:\n".format(idMsg), 'red') + str(e) + "\n") - return False - else: - 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, idsMsgList): - for idMsg in idsMsgList: - finalDoc = self.configDoc(idMsg) - self.sendDocument(finalDoc, idMsg) - diff --git a/zen/cesium-messaging/lib/gchange.py b/zen/cesium-messaging/lib/gchange.py deleted file mode 100644 index 2292e89..0000000 --- a/zen/cesium-messaging/lib/gchange.py +++ /dev/null @@ -1,324 +0,0 @@ -#!/usr/bin/env python3 - -import os, sys, ast, requests, json, base58, base64, time, string, random, re -from lib.natools import fmt, sign, get_privkey, box_decrypt, box_encrypt -from time import sleep -from hashlib import sha256 -from datetime import datetime -from termcolor import colored - -PUBKEY_REGEX = "(?![OIl])[1-9A-Za-z]{42,45}" - -class ReadLikes: - def __init__(self, dunikey, pod): - # Get my pubkey from my private key - try: - self.dunikey = dunikey - if not dunikey: - raise ValueError("Dunikey is empty") - except: - sys.stderr.write("Please fill the path to your private key (PubSec)\n") - sys.exit(1) - - self.issuer = get_privkey(dunikey, "pubsec").pubkey - self.pod = pod - - if not re.match(PUBKEY_REGEX, self.issuer) or len(self.issuer) > 45: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - sys.exit(1) - - # Configure JSON document to send - def configDoc(self, profile): - if not profile: profile = self.issuer - # elif len(profile) < 42: - # print(len(profile)) - # gProfile = requests.get('{0}/user/profile/{1}'.format(self.pod, issuer)) - # gProfile = json.loads(gProfile.text)['_source'] - # pseudo = gProfile['title'] - - data = {} - data['query'] = {} - data['query']['bool'] = {} - data['query']['bool']['filter'] = [ - {'term': {'index': 'user'}}, - {'term': {'type': 'profile'}}, - {'term': {'id': profile}}, - {'term': {'kind': 'STAR'}} - ] - # data['query']['bool']['should'] = {'term':{'issuer': self.issuer}} - data['size'] = 5000 - data['_source'] = ['issuer','level'] - data['aggs'] = { - 'level_sum': { - 'sum': { - 'field': 'level' - } - } - } - - return json.dumps(data) - - def sendDocument(self, document): - - headers = { - 'Content-type': 'application/json', - } - - # Send JSON document and get JSON result - result = requests.post('{0}/like/record/_search'.format(self.pod), headers=headers, data=document) - - if result.status_code == 200: - # print(result.text) - return result.text - else: - sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + result.text + '\n') - - def parseResult(self, result): - result = json.loads(result) - totalLikes = result['hits']['total'] - totalValue = result['aggregations']['level_sum']['value'] - if totalLikes: - score = totalValue/totalLikes - else: - score = 0 - raw = result['hits']['hits'] - finalPrint = {} - finalPrint['likes'] = [] - for i in raw: - issuer = i['_source']['issuer'] - gProfile = self.getProfile(issuer) - pseudo = gProfile['title'] - payTo = gProfile['pubkey'] - id = i['_id'] - level = i['_source']['level'] - if issuer == self.issuer: - finalPrint['yours'] = { 'id' : id, 'pseudo' : pseudo, 'level' : level } - else: - finalPrint['likes'].append({ 'issuer' : issuer, 'pseudo' : pseudo, 'payTo' : payTo, 'level' : level }) - finalPrint['score'] = score - - return json.dumps(finalPrint) - - def getProfile(self, profile): - headers = { - 'Content-type': 'application/json', - } - - data = {} - data['query'] = {} - data['query']['bool'] = {} - data['query']['bool']['filter'] = [ - {'term': {'_index': 'user'}}, - {'term': {'_type': 'profile'}}, - {'term': {'_id': profile}} - ] - data['_source'] = ['title','pubkey'] - - data = json.dumps(data) - - result = requests.post('{0}/user/profile/_search'.format(self.pod), headers=headers, data=data) - result = json.loads(result.text)['hits']['hits'][0]['_source'] - - return result - - def readLikes(self, profile=False): - document = self.configDoc(profile) - result = self.sendDocument(document) - result = self.parseResult(result) - - print(result) - return result - - - - -#################### Like class #################### - - - - -class SendLikes: - def __init__(self, dunikey, pod): - # Get my pubkey from my private key - try: - self.dunikey = dunikey - if not dunikey: - raise ValueError("Dunikey is empty") - except: - sys.stderr.write("Please fill the path to your private key (PubSec)\n") - sys.exit(1) - - self.issuer = get_privkey(dunikey, "pubsec").pubkey - self.pod = pod - - if not re.match(PUBKEY_REGEX, self.issuer) or len(self.issuer) > 45: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - sys.exit(1) - - # Configure JSON document to send - def configDoc(self, profile, likes): - if not profile: profile = self.issuer - if likes not in range(0, 6): - sys.stderr.write(colored('Votre like doit être compris entre 0 et 5.\n', 'red')) - return False - - - timeSent = int(time.time()) - - data = {} - data['version'] = 2 - data['index'] = "user" - data['type'] = "profile" - data['id'] = profile - data['kind'] = "STAR" - data['level'] = likes - data['time'] = timeSent - data['issuer'] = self.issuer - - document = json.dumps(data) - - # Generate hash of document - hashDoc = sha256(document.encode()).hexdigest().upper() - - # Generate signature of document - signature = fmt["64"](sign(hashDoc.encode(), get_privkey(self.dunikey, "pubsec"))[:-len(hashDoc.encode())]).decode() - - # Build final document - data = {} - data['hash'] = hashDoc - data['signature'] = signature - signJSON = json.dumps(data) - finalJSON = {**json.loads(signJSON), **json.loads(document)} - finalDoc = json.dumps(finalJSON) - - return finalDoc - - def sendDocument(self, document, pubkey): - - headers = { - 'Content-type': 'application/json', - } - - # Send JSON document and get JSON result - result = requests.post('{0}/user/profile/:id/_like'.format(self.pod), headers=headers, data=document) - - if result.status_code == 200: - print(colored("Profile liké avec succès !", 'green')) - return result.text - elif result.status_code == 400: - resultJson = json.loads(result.text) - if 'DuplicatedDocumentException' in resultJson['error']: - rmLike = UnLikes(self.dunikey, self.pod) - rmLike.unLike(pubkey, True) - sleep(0.5) - self.sendDocument(document, pubkey) - return resultJson['error'] - else: - sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + resultJson['error'] + '\n') - else: - resultJson = json.loads(result.text) - sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + resultJson['error'] + '\n') - - - - - def like(self, stars, profile=False): - document = self.configDoc(profile, stars) - if document: - self.sendDocument(document, profile) - - - - -#################### Unlike class #################### - - - - -class UnLikes: - def __init__(self, dunikey, pod): - # Get my pubkey from my private key - try: - self.dunikey = dunikey - if not dunikey: - raise ValueError("Dunikey is empty") - except: - sys.stderr.write("Please fill the path to your private key (PubSec)\n") - sys.exit(1) - - self.issuer = get_privkey(dunikey, "pubsec").pubkey - self.pod = pod - - if not re.match(PUBKEY_REGEX, self.issuer) or len(self.issuer) > 45: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - sys.exit(1) - - # Check if you liked this profile - def checkLike(self, pubkey): - - readProfileLikes = ReadLikes(self.dunikey, self.pod) - document = readProfileLikes.configDoc(pubkey) - result = readProfileLikes.sendDocument(document) - result = readProfileLikes.parseResult(result) - result = json.loads(result) - - if 'yours' in result: - myLike = result['yours']['id'] - return myLike - else: - sys.stderr.write("Vous n'avez pas liké ce profile\n") - return False - - # Configure JSON document to send - def configDoc(self, idLike): - timeSent = int(time.time()) - - data = {} - data['version'] = 2 - data['index'] = "like" - data['type'] = "record" - data['id'] = idLike - data['issuer'] = self.issuer - data['time'] = timeSent - - document = json.dumps(data) - - # Generate hash of document - hashDoc = sha256(document.encode()).hexdigest().upper() - - # Generate signature of document - signature = fmt["64"](sign(hashDoc.encode(), get_privkey(self.dunikey, "pubsec"))[:-len(hashDoc.encode())]).decode() - - # Build final document - data = {} - data['hash'] = hashDoc - data['signature'] = signature - signJSON = json.dumps(data) - finalJSON = {**json.loads(signJSON), **json.loads(document)} - finalDoc = json.dumps(finalJSON) - - return finalDoc - - def sendDocument(self, document, silent): - - headers = { - 'Content-type': 'application/json', - } - - # Send JSON document and get JSON result - result = requests.post('{0}/history/delete'.format(self.pod), headers=headers, data=document) - - if result.status_code == 200: - if not silent: - print(colored("Like supprimé avec succès !", 'green')) - return result.text - else: - sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + result.text + '\n') - - - def unLike(self, pubkey, silent=False): - idLike = self.checkLike(pubkey) - if idLike: - document = self.configDoc(idLike) - self.sendDocument(document, silent) - diff --git a/zen/cesium-messaging/lib/likes.py b/zen/cesium-messaging/lib/likes.py index cccb994..2571f5b 100644 --- a/zen/cesium-messaging/lib/likes.py +++ b/zen/cesium-messaging/lib/likes.py @@ -88,11 +88,14 @@ class ReadLikes: issuer = i['_source']['issuer'] gProfile = self.getProfile(issuer) pseudo = gProfile['title'] - payTo = gProfile['pubkey'] + try: + payTo = gProfile['pubkey'] + except: + payTo = '' id = i['_id'] level = i['_source']['level'] if issuer == self.issuer: - finalPrint['yours'] = { 'id' : id, 'pseudo' : pseudo, 'level' : level } + finalPrint['yours'] = { 'id' : id, 'pseudo' : pseudo, 'payTo' : payTo, 'level' : level } else: finalPrint['likes'].append({ 'issuer' : issuer, 'pseudo' : pseudo, 'payTo' : payTo, 'level' : level }) finalPrint['score'] = score