From b8614400a6912ed6f4ee46f09d25adb89ac0f9ef Mon Sep 17 00:00:00 2001 From: qo-op Date: Sun, 28 Feb 2021 23:42:39 +0100 Subject: [PATCH] remove old jaklis --- zen/jaklis.old/.env | 5 - zen/jaklis.old/.env.template | 6 - zen/jaklis.old/README.md | 76 ----- zen/jaklis.old/jaklis.py | 226 ------------- .../lib/__pycache__/cesium.cpython-36.pyc | Bin 3287 -> 0 bytes .../lib/__pycache__/cesium.cpython-38.pyc | Bin 3330 -> 0 bytes .../__pycache__/cesiumCommon.cpython-36.pyc | Bin 1725 -> 0 bytes .../__pycache__/cesiumCommon.cpython-38.pyc | Bin 1744 -> 0 bytes .../lib/__pycache__/gva.cpython-36.pyc | Bin 1890 -> 0 bytes .../lib/__pycache__/gvaPay.cpython-36.pyc | Bin 5834 -> 0 bytes .../lib/__pycache__/likes.cpython-36.pyc | Bin 6049 -> 0 bytes .../lib/__pycache__/likes.cpython-38.pyc | Bin 5933 -> 0 bytes .../lib/__pycache__/messaging.cpython-36.pyc | Bin 6763 -> 0 bytes .../lib/__pycache__/messaging.cpython-38.pyc | Bin 6705 -> 0 bytes .../lib/__pycache__/natools.cpython-36.pyc | Bin 9296 -> 0 bytes .../lib/__pycache__/natools.cpython-38.pyc | Bin 9410 -> 0 bytes .../lib/__pycache__/profiles.cpython-36.pyc | Bin 3044 -> 0 bytes .../lib/__pycache__/profiles.cpython-38.pyc | Bin 3101 -> 0 bytes zen/jaklis.old/lib/cesium.py | 93 ------ zen/jaklis.old/lib/cesiumCommon.py | 51 --- zen/jaklis.old/lib/crypt.py | 31 -- zen/jaklis.old/lib/gva.py | 59 ---- zen/jaklis.old/lib/gvaBalance.py | 50 --- zen/jaklis.old/lib/gvaHistory.py | 209 ------------ zen/jaklis.old/lib/gvaPay.py | 172 ---------- zen/jaklis.old/lib/likes.py | 242 -------------- zen/jaklis.old/lib/messaging.py | 236 -------------- zen/jaklis.old/lib/natools.py | 297 ------------------ zen/jaklis.old/lib/profiles.py | 125 -------- zen/jaklis.old/paiements.py | 94 ------ zen/jaklis.old/requirements.txt | 7 - zen/jaklis.old/setup.sh | 12 - 32 files changed, 1991 deletions(-) delete mode 100644 zen/jaklis.old/.env delete mode 100644 zen/jaklis.old/.env.template delete mode 100644 zen/jaklis.old/README.md delete mode 100755 zen/jaklis.old/jaklis.py delete mode 100644 zen/jaklis.old/lib/__pycache__/cesium.cpython-36.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/cesium.cpython-38.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/cesiumCommon.cpython-36.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/cesiumCommon.cpython-38.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/gva.cpython-36.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/gvaPay.cpython-36.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/likes.cpython-36.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/likes.cpython-38.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/messaging.cpython-36.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/messaging.cpython-38.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/natools.cpython-36.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/natools.cpython-38.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/profiles.cpython-36.pyc delete mode 100644 zen/jaklis.old/lib/__pycache__/profiles.cpython-38.pyc delete mode 100644 zen/jaklis.old/lib/cesium.py delete mode 100644 zen/jaklis.old/lib/cesiumCommon.py delete mode 100755 zen/jaklis.old/lib/crypt.py delete mode 100644 zen/jaklis.old/lib/gva.py delete mode 100644 zen/jaklis.old/lib/gvaBalance.py delete mode 100644 zen/jaklis.old/lib/gvaHistory.py delete mode 100644 zen/jaklis.old/lib/gvaPay.py delete mode 100644 zen/jaklis.old/lib/likes.py delete mode 100644 zen/jaklis.old/lib/messaging.py delete mode 100755 zen/jaklis.old/lib/natools.py delete mode 100644 zen/jaklis.old/lib/profiles.py delete mode 100755 zen/jaklis.old/paiements.py delete mode 100644 zen/jaklis.old/requirements.txt delete mode 100755 zen/jaklis.old/setup.sh diff --git a/zen/jaklis.old/.env b/zen/jaklis.old/.env deleted file mode 100644 index ea6bd51..0000000 --- a/zen/jaklis.old/.env +++ /dev/null @@ -1,5 +0,0 @@ -DUNIKEY="/.zen/secret.dunikey" # Chemin du fichier de trousseau Ḡ1 de l'émetteur, au format PubSec -POD="https://data.gchange.fr" # Noeud Gchange utilisé pour l'envoi du message -#POD="https://g1.data.duniter.fr" # Noeud Cecium+ utilisé pour l'envoi du message -#POD="https://g1.data.le-sou.org" # Adresse du pod Cesium de secours -#POD="https://g1.data.e-is.pro" diff --git a/zen/jaklis.old/.env.template b/zen/jaklis.old/.env.template deleted file mode 100644 index dd81446..0000000 --- a/zen/jaklis.old/.env.template +++ /dev/null @@ -1,6 +0,0 @@ -DUNIKEY="" # Chemin de la clé privé Ḡ1 de l'émetteur, au format PubSec -#POD="https://g1.data.duniter.fr" # Adresse du pod Cesium ou Gchange à utiliser -POD="https://g1.data.le-sou.org" # Adresse du pod Cesium de secours -#POD="https://data.gchange.fr" # Adresse du pod ḠChange à utiliser - -NODE="https://g1.librelois.fr/gva" diff --git a/zen/jaklis.old/README.md b/zen/jaklis.old/README.md deleted file mode 100644 index 59f1e61..0000000 --- a/zen/jaklis.old/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# Client CLI for Cesium+/Ḡchange pod -## Installation - -Linux: -``` -bash setup.sh -``` - -Autre: -``` -Débrouillez-vous. -``` - -## Utilisation - -Renseignez optionnellement le fichier **.env** (Généré lors de la première tentative d'execution, ou à copier depuis .env.template). - -``` -./jaklis.py -h -``` - -``` -usage: jaklis.py [-h] [-v] [-k KEY] [-n NODE] {read,send,delete,get,set,erase,like,unlike,pay,history,balance} ... - -Client CLI pour Cesium+ et Ḡchange - -optional arguments: - -h, --help show this help message and exit - -v, --version Affiche la version actuelle du programme - -k KEY, --key KEY Chemin vers mon trousseau de clé (PubSec) - -n NODE, --node NODE Adresse du noeud Cesium+, Gchange ou Duniter à utiliser - -Commandes de jaklis: - {read,send,delete,get,set,erase,like,unlike,pay,history,balance} - read Lecture des messages - send Envoi d'un message - delete Supression d'un message - get Voir un profile Cesium+ - set Configurer son profile Cesium+ - erase Effacer son profile Cesium+ - like Voir les likes d'un profile / Liker un profile (option -s NOTE) - unlike Supprimer un like - pay Payer en Ḡ1 - history Voir l'historique des transactions d'un compte Ḡ1 - balance Voir le solde d'un compte Ḡ1 - -``` - -Utilisez `./jaklis CMD -h` où `CMD` est la commande souhaité pour obtenir l'aide détaillé de cette commande. - -### Exemples: - -Lire les 10 derniers messages de mon compte indiqué dans le fichier `.env` (par defaut 3 messages): -``` -./jaklis read -n10 -``` - -Envoyer un message à la clé publique `Do99s6wQR2JLfhirPdpAERSjNbmjjECzGxHNJMiNKT3P` avec un fichier de trousseau particulier: -``` -./jaklis.py -k /home/saucisse/mon_fichier_de_trousseau.dunikey send -d Do99s6wQR2JLfhirPdpAERSjNbmjjECzGxHNJMiNKT3P -t "Objet du message" -m "Corps de mon message" -``` - -Noter 4 étoiles le profile `S9EJbjbaGPnp26VuV6fKjR7raE1YkNhUGDgoydHvAJ1` sur gchange: -``` -./jaklis.py -n https://data.gchange.fr like -p S9EJbjbaGPnp26VuV6fKjR7raE1YkNhUGDgoydHvAJ1 -s 4 -``` - -Paramétrer mon profile Cesium+: -``` -./jaklis.py set -n "Sylvain Durif" -v "Bugarach" -a "42 route de Vénus" -d "Christ cosmique" -pos 48.539927 2.6608169 -s https://www.creationmonetaire.info -A mon_avatar.png -``` - -Effacer mon profile Gchange: -``` -./jaklis.py -n https://data.gchange.fr erase -``` diff --git a/zen/jaklis.old/jaklis.py b/zen/jaklis.old/jaklis.py deleted file mode 100755 index 0f40166..0000000 --- a/zen/jaklis.old/jaklis.py +++ /dev/null @@ -1,226 +0,0 @@ -#!/usr/bin/env python3 - -import argparse, sys, os, getpass, string, random -from os.path import join, dirname -from shutil import copyfile -from dotenv import load_dotenv -from duniterpy.key import SigningKey - -__version__ = "0.0.2" - -MY_PATH = os.path.realpath(os.path.dirname(sys.argv[0])) + '/' - -# Get variables environment -if not os.path.isfile(MY_PATH + '.env'): - copyfile(MY_PATH + ".env.template",MY_PATH + ".env") -dotenv_path = join(dirname(__file__),MY_PATH + '.env') -load_dotenv(dotenv_path) - -# Parse arguments -parser = argparse.ArgumentParser(description="Client CLI pour Cesium+ et Ḡchange") -parser.add_argument('-v', '--version', action='store_true', help="Affiche la version actuelle du programme") -parser.add_argument('-k', '--key', help="Chemin vers mon trousseau de clé (PubSec)") -parser.add_argument('-n', '--node', help="Adresse du noeud Cesium+, Gchange ou Duniter à utiliser") - -subparsers = parser.add_subparsers(title="Commandes de jaklis", dest="cmd") -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") -getProfile_cmd = subparsers.add_parser('get', help="Voir un profile Cesium+") -setProfile_cmd = subparsers.add_parser('set', help="Configurer son profile Cesium+") -eraseProfile_cmd = subparsers.add_parser('erase', help="Effacer son profile Cesium+") -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") -pay_cmd = subparsers.add_parser('pay', help="Payer en Ḡ1") -history_cmd = subparsers.add_parser('history', help="Voir l'historique des transactions d'un compte Ḡ1") -balance_cmd = subparsers.add_parser('balance', help="Voir le solde d'un compte Ḡ1") - -# 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") -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é") - -# Profiles management -setProfile_cmd.add_argument('-n', '--name', help="Nom du profile") -setProfile_cmd.add_argument('-d', '--description', help="Description du profile") -setProfile_cmd.add_argument('-v', '--ville', help="Ville du profile") -setProfile_cmd.add_argument('-a', '--adresse', help="Adresse du profile") -setProfile_cmd.add_argument('-pos', '--position', nargs=2, help="Points géographiques (lat + lon)") -setProfile_cmd.add_argument('-s', '--site', help="Site web du profile") -setProfile_cmd.add_argument('-A', '--avatar', help="Chemin vers mon avatar en PNG") - -getProfile_cmd.add_argument('-p', '--profile', help="Nom du profile") -getProfile_cmd.add_argument('-a', '--avatar', action='store_true', help="Récupérer également l'avatar au format raw base64") - -# Likes management -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") - -# GVA usage -pay_cmd.add_argument('-p', '--pubkey', help="Destinataire du paiement") -pay_cmd.add_argument('-a', '--amount', type=float, help="Montant de la transaction") -pay_cmd.add_argument('-c', '--comment', default="", help="Commentaire de la transaction") -pay_cmd.add_argument('-m', '--mempool', action='store_true', help="Utilise les sources en Mempool") -pay_cmd.add_argument('-v', '--verbose', action='store_true', help="Affiche le résultat JSON de la transaction") - -history_cmd.add_argument('-p', '--pubkey', help="Clé publique du compte visé") -history_cmd.add_argument('-j', '--json', action='store_true', help="Affiche le résultat en format JSON") -history_cmd.add_argument('--nocolors', action='store_true', help="Affiche le résultat en noir et blanc") - -balance_cmd.add_argument('-p', '--pubkey', help="Clé publique du compte visé") -balance_cmd.add_argument('-m', '--mempool', action='store_true', help="Utilise les sources en Mempool") - - -args = parser.parse_args() -cmd = args.cmd - -if args.version: - print(__version__) - sys.exit(0) - -if not cmd: - parser.print_help() - sys.exit(1) - -def createTmpDunikey(): - # Generate pseudo-random nonce - nonce=[] - for _ in range(32): - nonce.append(random.choice(string.ascii_letters + string.digits)) - nonce = ''.join(nonce) - keyPath = "/tmp/secret.dunikey-" + nonce - - key = SigningKey.from_credentials(getpass.getpass("Identifiant: "), getpass.getpass("Mot de passe: "), None) - key.save_pubsec_file(keyPath) - - return keyPath - -# Check if we need dunikey -try: - pubkey = args.pubkey -except: - pubkey = False -try: - profile = args.profile -except: - profile = False - -if cmd in ('history','balance','get') and (pubkey or profile): - noNeedDunikey = True - keyPath = False - try: - dunikey = args.pubkey - except: - dunikey = args.profile -else: - noNeedDunikey = False - if args.key: - dunikey = args.key - keyPath = False - else: - dunikey = os.getenv('DUNIKEY') - if not dunikey: - keyPath = createTmpDunikey() - dunikey = keyPath - else: - keyPath = False - if not os.path.isfile(dunikey): - HOME = os.getenv("HOME") - dunikey = HOME + dunikey - if not os.path.isfile(dunikey): - sys.stderr.write('Le fichier de trousseau {0} est introuvable.\n'.format(dunikey)) - sys.exit(1) - - -# Construct CesiumPlus object -if cmd in ("read","send","delete","set","get","erase","like","unlike"): - from lib.cesium import CesiumPlus - - if args.node: - pod = args.node - else: - pod = os.getenv('POD') - if not pod: - pod="https://g1.data.le-sou.org" - - cesium = CesiumPlus(dunikey, pod, noNeedDunikey) - - # Messaging - if cmd == "read": - cesium.read(args.number, args.outbox, args.json) - elif cmd == "send": - if args.fichier: - with open(args.fichier, 'r') as f: - msgT = f.read() - titre = msgT.splitlines(True)[0].replace('\n', '') - msg = ''.join(msgT.splitlines(True)[1:]) - if args.titre: - titre = args.titre - msg = msgT - 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: ") - - cesium.send(titre, msg, args.destinataire, args.outbox) - - elif cmd == "delete": - cesium.delete(args.id[0], args.outbox) - - # Profiles - elif cmd == "set": - cesium.set(args.name, args.description, args.ville, args.adresse, args.position, args.site, args.avatar) - elif cmd == "get": - cesium.get(args.profile, args.avatar) - elif cmd == "erase": - cesium.erase() - - # Likes - elif cmd == "like": - if args.stars or args.stars == 0: - cesium.like(args.stars, args.profile) - else: - cesium.readLikes(args.profile) - elif cmd == "unlike": - cesium.unLike(args.profile) - -# Construct GVA object -elif cmd in ("pay","history","balance"): - from lib.gva import GvaApi - - if args.node: - node = args.node - else: - node = os.getenv('NODE') - if not node: - node="https://g1.librelois.fr/gva" - - if args.pubkey: - destPubkey = args.pubkey - else: - destPubkey = False - - gva = GvaApi(dunikey, node, destPubkey, noNeedDunikey) - - if cmd == "pay": - gva.pay(args.amount, args.comment, args.mempool, args.verbose) - if cmd == "history": - gva.history(args.json, args.nocolors) - if cmd == "balance": - gva.balance(args.mempool) - - -if keyPath: - os.remove(keyPath) diff --git a/zen/jaklis.old/lib/__pycache__/cesium.cpython-36.pyc b/zen/jaklis.old/lib/__pycache__/cesium.cpython-36.pyc deleted file mode 100644 index 08355fcf90d13f720aade39c9885b41a02edf266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3287 zcmZ`*OOG745pMRodwOOc-bjuhAc}1u9s|)LwzCcp#ZaPG;MfyEvSGP_WH8(0u6ni~ zBeKVl7CooYpUDr(h1Z;P%Q>ff#h#sqBKIzfMY4LDRrS?Je%9~D|GD+A@wI_v{oC4l zTI^4OUA5ffO-FFo)UuZvC%M) z^wT=v^9td3rJY&Lb)pcH`*k)iMb)IqRMpitLaE6);^oa`PLmQ5yqX*a+Et=BOa1Cp zexuH{U(cJ<`eo|p>Z_-J9i=f@cdn&@`8jo-#-u!~WjSg7X~{!u_J<@ zLrJ@mI$z%SzVpw=g52-iz<_^W(~3_!4%do zlKZq5ugRN2Xs5*db=u(pL>d!dx;V=Z$c&A3c$Qa_0>5Qa+llvR4N$505i~`=NV)PI z%GFJFXur>P@mhb z$nrxP8c%)WX&UET!TYas#MC&Ma6>997<)OV*!+rKBkXQD=y!&{#H$VZFX)j__dQ3QMV^p?1(vA|% z(3iv>8#mKro#LmWG5*RuSPXkzdfjSL3f<#EWip>NIhfb`F)xtuV8SIhK)gfPz2M{XMylCDEk^BVTq^4pBg1|MF*deZ)JYRk?QwSD$~zov5oD;Y06H{VswgL6i|u!6XY*6y zRa*+}f$6g6lJKmZLR4GHc(h7J8qFqB2_nrdFJYILVAdU8@;CJP7++q6I`vdm&xHKc z%y+>yZ-0h~x1;`B%#op@>a*A(DAH#)m~Xo_5hloTJO21c#>fy4#h&(U(0LomCjN*S zYZ-E2Eo}6NsKKKHJUZ*>0gs-LV4wd-Ce7A+VXR4 zxGo=Z^{3P47{WyIkV;%9z9h2Qc#uZfbCF%p zm2ZGYL!&d`~lXexBWDC~z(9L9S_`eq$h5ISGwO%gXq`~o7~$DQkTwsk9)R7!@=(mt(~ z=8}jDh`CgD*BDA*n$YTs!jxgmG@_{v@}_DGx=ey-hws|D4)1h9`I1=4#Q7H6XGdVJ GBl~|aXYQc@ diff --git a/zen/jaklis.old/lib/__pycache__/cesium.cpython-38.pyc b/zen/jaklis.old/lib/__pycache__/cesium.cpython-38.pyc deleted file mode 100644 index 87af3c1597182d5e995ed7e2f11ec181435866b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3330 zcmZ`*TW{RP73T0ximO``$4yhfMO&boq7sk_?gdGj#bYMNo!mSVn17#%XNU++wFp z(!`9tqF3&wyX9WGSMI0#%z9*Tp9gO&9tiKsNe?(Xv-;s%eBB!KZJpc`Dxa43>awgW zojiW}MG9X^)z^SlrW zZ%6d@*ZE7KbVM(9!{BLU1{rN(vjmuYfvWzAMpy&~pkUm7V*v_>yXal+aUZ?M-{&EZ z-mui?w|LBVFba6Wdw3S|5BMJ6$4bO+^8v+Sm5XYaMwPbGP-(iZk;Yul27Ov#MRJ`^$9- z%$fB)8}tK7pV9%JR)FQTb|y8~i2^qF>ug$zs!5XzRaf5#rAA}m=1pWyixNmK7yE&B zl_;L4eswOtQDg1b)8@SXF7PPL0!;1`lglj+*Z+`5w0M-_w&9 zbtz6pvYe{sE3=)|>C4?zd)+-o_Jq7Gmw74O{ox?gG(w25;}+``YRs zO4_09QG;x?bRgfFLDHmDIg?2CMywYA(S9m?j>gstuM%dF>RGEA|X%I@ehfVY& zc|d#dn!G85c1o<@rX3!lNn>J5hqL?{nX#b`pXb%6z;BtjcFhqz15YYWBejo)V&yw7 z;`Jdrv~RPmc#&o1kkz92=vRqwipf^IkOU?|ZtEZ+++{+TWH3m-IwaCd;z-|<^kZw7 z<{E}WH>TbB`cZNU3stVD-Njrp#mj@eU z>}&>^F(4xpqA+pN@bOa&w)_j*uuF9Ck`ml+gX>@xVbyITPP~ed>@g*K8$(d+fp(N= z`o1KNuU$=(RiMvAV|)GMP`B93t#}n-_?CFyaz2AappXRc@ZR z=!ucvj+&7qCNvAR)gfQ#2Y4#fv}kU?B!7i(evGQj@dP5=VhM1%+}%J4zqiEzLTkl< z3X?TLkVEInnSllBBaGb{YrMJN1js#Go;G2N4Cd^mEC0YDnw85PNT)N8Ae6)vhs1Lp zw;l&qWWPrQ zG3y=N=50!no4DV_8vTHxEVS4mq|#@%nQyx`2`5BzGXnTX#>j9{=(M0}IC_l1Is!P1 zSj*x32CdBRJj`quEeo+~<=1xZEtqAuHhhATgJbp_K4AnOaj3d90@K{3mz~Ch zlIXflJo#Iiu7oDtF;RZfC5OpC&-f|n^V%!un(}|Wq;p|$mH7(hizGT^G5y(>M;qR* z47XBg%i$jc(lH{6Fd`Xn!;l|ij-EudONFJ3l3s1NxbhAP+Z`DS!k~;x@^i8!j^3c8 zcFET#ll37?8!*{z<=A0V7Ut5wY7p1&en7Nw<5sH_YC0;qC-QyTT%Q_}Rim$xfRU6C@{iO|TF5V{ zS)W;EL|P!}{Gqc#(RmlTVHEblC=TO2)B5H)E-1ez+n-SLV`}c8N%wIhJI*#P?vj$r zs9f5kXQjD6;(B84o82XcLYOA>bRlfY=x7?zQb&K2L55={K(xbmZC!_-cA$JtT4iv) M!}i$`cywg{54J(|yZ`_I diff --git a/zen/jaklis.old/lib/__pycache__/cesiumCommon.cpython-36.pyc b/zen/jaklis.old/lib/__pycache__/cesiumCommon.cpython-36.pyc deleted file mode 100644 index d6fd2d221c4056edc528b1bd5f6a3661e50c1cc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1725 zcmZuxOOG5i5VqaV>6r}yHjpSNY62)}#O{c&iG&m&kZd9z+C(J4rlY9U+xG7CY`wxfbhQb<38w{#7bA^nKW8z6krh^H$2P?^t8hv;c1thzN4rL;5- zgjzxDQ&m^S;ceL{;}mtuRb<5hY7;%ls~tEUI5OVChk8QfaftEnkH(X_6yt3v`1oNh zcU6;SVw{5K&8E3IQLXxnKs!&^;&goC|J5rsc1V3$0ovF(iCLLst_vyb&Dz*vs@=iyl z=*zE;=|M-iJ!exN=Q@}U^$1q|IU5o6qh9J|%AH+XK7Q)eeco$dK5t`o{90S(P`fZ! zp(q=@H@k4F5UCR3c3u>ro`|qX^(54FxL3C_MB1fVglKa9R=aguWKnQP;he^8+ASrr z!xfmc?*e?4hFS63lMwVp{-70MbxtS^{#2N@;Z|LR+qEoHy&6QvjMdcKELHV}5d3LO z#^a0NOz>@5v|?S#S^}q#Xi9S-fm;t{u7$D1qg?j^KwQ$nXqXhn0q5DojBb7N*_Z2g zldsortZy2t5LILY*+j7|Pr>}w_9RskGr(si)vXlKlEmPRE2^yK!VD(j5zlv^jK*o321Hm2BY7GI86sc`On**z vq56czLy%S>$8}w(7jt+PZSZyKJ^tV3#=pFX`D46!DgZbM{99%=3;cfoN~opo diff --git a/zen/jaklis.old/lib/__pycache__/cesiumCommon.cpython-38.pyc b/zen/jaklis.old/lib/__pycache__/cesiumCommon.cpython-38.pyc deleted file mode 100644 index cc67099471a71b6e5bc344c58a6090a37f412f79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1744 zcmZuy-EZ7P5Z_&|eZG&B0x7g=g-ijpMkFVyv=XR5p-n3aN-Nqz>Z-Dw+fB}iKd!rL zXby)5E&a1EOZErkAC|*{?jAm zFI*fQ4lJ&~tJi@DB4|dU`Aj3)tXafhW|@=oh*Q)#nVWl&m$#x;?ngezc+?hM(GvbX zjXF1oXp7E15uFK(x`N&zVebIEleLgqPY;s|7cYg5bvAQjxlXqV+uf2T9;x)(9l1L` zeg2a-AKdypdl)`=f9Zoym!f28{P6pg3-7I5+`D_g!OsALJ{-tHV&p2k`U((3YBHgQ z?)d7wVaD0!#+kY`nbDfoOwga538kc1oa<_GR4NDr%ho~`wRNdX4Do2|rG=1%2|dfr z?nqik8)aPxw}AM!by-+fRQX6-H!BmNLnrE>G&aMu*n$kfk!{U==qE%ShZz6)us8z z?A6_xY@;u~IA+>46@0?BeO#N)v}<~x^=C}|U>1;@P~q-y^~+PA-t#`24z||D$FEgI z3hfJ09msrScE=ZPXEM<;*i5r5Fhd!P5;F`;8SIvo3J`sXkpY^Vzg=zIk%O>vKp{)( zjj9bT2M0^AsNMzgWfBasKb{02&(cSg42pA78}O%tqzX35BG@cdo|xrMc+5JZQrLx} zT$55fjmfseJUH9=I>{=zs#K`}R){rigj4{p?^J4}Rt2b8Ht&_&J0gq$ZA0-r#~zk9v#& z<+KO1M~^d3JM0)c1N`{JQB*7+S`QeQ9}Yz0Gj#030?r|w(ixn^DVve0Gb4M_owOp7E#_QeLZ@Efpu2h21!iLgay#o^S4r$ZOnc=5T8JpCLl*z2K-?JbgA z#&emu;YnF60*ArTO9V(X_!=i z1WRC>JmIct3L15RTZS5!Wu{-O;aRl7d#dsHf16wX@;v5`@$_l@eVqghE;7zK{=XC2 BsjvV5 diff --git a/zen/jaklis.old/lib/__pycache__/gva.cpython-36.pyc b/zen/jaklis.old/lib/__pycache__/gva.cpython-36.pyc deleted file mode 100644 index 54293452d4ca80a4935d7c7660563c28446d1e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1890 zcmb7FPjB2r6rUOYU9WeGD*mYwVc}44C9+6dP=ye*O@cxR5iKS4#qxS4i8ubUo$;pH z$a|^tVd#zTz&C)KuZTm%H{is3V>eC11;&~;Z{Ccb=l$mQoOfD;wlq=uxsmxXqn& z!kvbNLrx!%z{w;ISmbNa_gLgCinGuXlQYl55Qt` z56(1d?VZ#3>qWYqSiMIauR*^HUHt~4Hfs`*nu4S?1IcPrPHHkoi&2a#v!izx+2ZoIu#tUT80tGbNH2pFo7m0L1-xl4QR=pMX6}pDe|s z_(-T~vWV3rUQT9ZF*z({9#@;oTmNUb7mV9cQSJ%B?=6cIZoGAPub4&2MT;i^vt;15 z^*DTVUmIE`MQgzqlVfS(nvsd3^&Z99Qfx_C%GOXT)!M4!Ldw>9D$_~?R%KFLxw&C=QQ=rrD3tXemU(ju** z$c48QMop-#ACr1)%uMPsmod6QeX#m4d!?UU>v*;K(#HkAY;c1PHNS3yQjv~JbKn;6 z1vzHaX5*}_+M1gUumMJ^AMJj08oWok7q}8L;8M6Fn1=R|DDIU>=q1M@IeB=1x}(w~ zZ5$|3aBT~0`4((%?Km%&Mb$b={9OgdIqnJhw0-3@mU z`LnLH>g4)YB>m#&;6b5(Lf?c)E+Xicp|WoWYd`uZmz-m^3c+HeAOWYHQ%j>$n5K4Tq4pn?+m!X_YP| zp@$Y=?S8!Kas-hL$Gx?`X-%68WB-HcK*Wz;I*dM>roH<`7t)s$c4+Ru0ojk;Xa4}! CnYUa3 diff --git a/zen/jaklis.old/lib/__pycache__/gvaPay.cpython-36.pyc b/zen/jaklis.old/lib/__pycache__/gvaPay.cpython-36.pyc deleted file mode 100644 index e1fdfb5cd918060d5231e85ad7b75f44f5386815..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5834 zcmcgw&2JmW72nxiE|*K{!?G-YCC<8W6S0lyd^KohH}`6lJSL(?dzj zo7wrEx9|7fZ}x?;F|YcMKQ+ESViXUC6yvW_# z26wm3`T@=sjB4pV);H#>EGstSFqVQ>t;|~PsLW1UD^XTn5vtLZt@SmrSv50jU z=fjqW6vj-xe)*j@7Z_3Hc2oqqZC)AitV@A`)?KL5;% zKiF#0Qait)0+vuC3_5h()KvIE9Pdz8)_V(@suf3>ajEGJHc&!7iF6(*`3pp!^^Jznw;-7^ z`!;9O#x~Vi{Q{(|3Vp`SZL{s*sn{p!_KT3Ez6t4Z8d=_aN>$opYP@f4n-wFup(apb z++MR~TTSx9Hv5=eGooY6pualMo@yWD&NgGl$Hsd`WG)$-Gqi_xam|#UVMKA?5$@;+ zHQhIP=?>d+)uF!2Jzl;;JDTAJG*Fqp&vClU>83Xl(Y$p3G@jBb#M^=24Da3b(Ga$7 zroxY&7K!q^LE;Cge?)4&;97)dyT6X-?+GxS)qtB@7*9w#YHJ&nOVtZ zk~xXuLdvXgOSY7dWS+99S8wJhD*=fjT$W_4@+gS|Bo308CUKYq{EHzcAnqFSyT~3? z&#cBBab_8aK65LUYe_d~iZktCEo>!c!q$y5E9=3PV6)cU%-lw!6}42OF@}K&y$gdm z_>T_~l^xS$$5;iW3Ue)!c{^p>W4-ASjMa7~YciS$Khot8X}`k*tlN+?igCi3(FQ)Y zO<=(Wy4V&F*9P9&jsmvYuye=~lEtmh3R~vpvnYG*GSF&r`;N&AM=@Wcf?7kaD(YR~ z&QTzj(K?j{!#32|nkTrNesc$Hq0_ z5l$APKC+fHGBuvO`CfU~4(5VaaZJx2`2k6C)1N&xG_g5zC+GAuj{~T;j1kuUrhyIF)7B^=1EWI<=sl2eKZ8-7H5_?*A_BGhxp0<&L z>>g@QkKG+E#HnnGWX?aeTeqicb@;S3EL97+NzcGG98u|8tVj|q+ZY` zmtxbZpQk>Ln<*iC&dZorJ*e@L6%g3S z1td!5C~{~A8eV!YQ+qe`q+U^Mh-RvQakX(FZf2#68%@#G(Zvc9l~qE5aS%2Hwkv&_ z;UtOgK;WRKkkvhHBj?gq$m`{9AcIb#A2KE+d1j5^T+q2P2Pei_&!C*p1cvDtlg#uS z%Vsunkv!WpXP9FUWGC4an`XVKQBdX+3?b=Z4stRSgpn$fP4R=6;~<>OG}58LDF$sI z7dSbef%YhzYb~JH;lt1aJ)wLAWqVLQisxg484mH|L=vKDoaZrpp2z7t^adB;z(4{{ z%=g^OI*286_X#*X_nlOAQp2>iBZTms#71*ZO=*qJV znvW*8jb3%scnQ{Pi%UR2?UgWY24QlxHXPNf5!D!=+i%8^qOk6#ARIdM=gg11LQ}`* z#sBgg*8b;^Kcwxy4DrZOZ_WGl0RFqGe?DtE{Ztt9Q_ zG0sQBZfKBX_&L2JH!q)nsCs$0DCN=lYH+Jwic|Hv=Bm1QCA|THTK5L}L66J^782Z# z;^x~e#5Jf88+ z4h*Gzy=4-oMliLw**9Bk%icTz6`G3flN2B=gb(WuR7~o?Ep!>&*a0{G4Y+Xu-1se3 zY$K@maZ9B;E4ZtN zF291D*rwP}QIqPxZWu>>MSi0uDa1143fl3S=+gw4_CJRl(I5OesmeLs?5W{f8XcqoYTEl6t*d>{lT@NhygWnVSrX5Y@JS5WY<}k?MThg@U7@l`rzc0ZnYtao z^U<0UiejA9x`A5F%s9#Hb`nP#a`>(#WJiCL)p*Lv_-a$b_cVM0NOmJr9+5PHDLm8< w;R|g|?R*id1+92hsc!yV>2X?<_P5{0GxwETIcF*A>Buw-m`wv#71K8V1+fraY5)KL diff --git a/zen/jaklis.old/lib/__pycache__/likes.cpython-36.pyc b/zen/jaklis.old/lib/__pycache__/likes.cpython-36.pyc deleted file mode 100644 index ad140ef85144a9fc5b66567a504270aa57e89257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6049 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 diff --git a/zen/jaklis.old/lib/__pycache__/likes.cpython-38.pyc b/zen/jaklis.old/lib/__pycache__/likes.cpython-38.pyc deleted file mode 100644 index 107a43bc56b5404878ad797f75f76366865d2f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5933 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 diff --git a/zen/jaklis.old/lib/__pycache__/natools.cpython-38.pyc b/zen/jaklis.old/lib/__pycache__/natools.cpython-38.pyc deleted file mode 100644 index 043f07808a6fcc07596ddd99c7498e844ec7b0b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9410 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 QvL8~|4Nd(%e!Ua?4~41kO#lD@ diff --git a/zen/jaklis.old/lib/__pycache__/profiles.cpython-38.pyc b/zen/jaklis.old/lib/__pycache__/profiles.cpython-38.pyc deleted file mode 100644 index 1ab12f7748fe6e6176b2f290a9b72278487864cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3101 zcmZ`*OLH7a5w7a4eoSlhSXr{xO8{a6);kU}vk=A*gw|^i3K1+Jyoe>tT!vOxX{P0# z>Dj6tuQl#D*}-kE5JdPeI&$H6@Ehs`0T=xQI3T|4*2vli-BFcUS40rS4Fdy0GqmO_3 z;ok3hzuw#5dz{eN>yL}ZLlko#m11-*oQX^4CBvDPr6>KD9H$Co2#Y5hGJ^Ewl59c- zQs4wDHhiS><1|wy39-!LX+oj(cTvnu&RD?;{(`;WvoK||M#=SCB`@(6JFIl{JEa5N zfiCp-O99=5?&=4n3td3>^fBf|r6;{xtc;{jHW^fU2tC5M2Bfd&eFi;(j`|jxJ1INk z@aIz9runi-Bd@iW(GK+A3%3m9$_r;M&e$v{yt!WnXM7$|E2Z^TX&gzcv9`nH8<+Yz z>>>0UknDuC4fJk8-rQl;dA4>~(U{|uXMDC)viVZEbVfJ$=7IH!w8)fQl5n9;$3=>Z z3t}m?GRBG|ElxH3hbzhA;`~y>kg%`vM|nCbY+&*vjWg4AKUGIS!s%F9ccL@v=p*aL zPvauiHtZ$&s8FL~+DM0SUvobF#!QqxuNuKqr41cO6mj3Qn%2dJ zm*e8`SdF9=IfNBj#nSpmu~GN$*~ZcRduo*AQdwWBT8<}2Pt>UuCkD%TaxxqnoILH1 zewHU#SQwQZTQQ1GKBFjOy7p# zKleL>e5g9H9!^ZrX;0Ot6PrRmK1$}xpV}tebe#5as6$oI z_U0if#v?~?!NSiME_f3!tSBpd4X=P)L94b$&_XA2rkjf>XjK7ul$);usJV1fYUF1!1C5X0tRNuo6M*Nm>tTo~tUuQ3IDKaQ<5XqRw4CaT^(MwvpgxzRkr%#j>C>f4 zP`3f(ZZiSAC@_A5tM4|4YIp=(?&cGKk({N8jQh_w{<{B<>B|pVt`!rbbXSZ4bnEqX zJ{h-seHVkejX~NUWGH~ovCfA8UOH7a=$U+?6V+W#M>0*6=~W+q1Al|o|0b$dpuYuS zgG;zr&m_Qpx6xO{PpTlRe5Suc6W*bUfLK@W(!|%$+E>LLSj-M824MM)5Ds@76z(wR zLR>f(PT(;A!udC}3um?J`7i7qX&XE`_rLblu)^92vBcsba9uI+Z_&77Vh%m#NDtD73?KnCV%fr-qX%Gd!DL?PR!kNh)V$!NQm%M9!eE}e}F<6F{N*XPo6mXZ7JsDBTjxgLr9M9keAT&Bk9*Y z@QfI3kk4TKr3_zN3-?4IzqttC#%J!#E4>p>Mi`YrL*Ny`NjPsHSE03qJhfHlE{2d? zKA1LlYYP7^vGsHf1e~Qw6&Ia~Rb8WsY5Vzmvkt+3L2Dn>%=`ZH@69^B$rzleu9>V0 z_)hOECf%iwxm!idV*XtX2G_FFGb+}}z

2Jzb|MgVYqcKJ7@Ase=ALf&uaXVzauj z^S{A;)9t-vpptE=wzJ!6^fXVm%bg$EmI1u`)OvLG@* zVV6u17ZU?6LS7MtdWON~)L7pX*iu{XQ=Q@vevO+d0xNQOfKzm7v5$zFtdGPx$%-#U zr$IIY?N?dk_n2bdLdD!F9=(vS14R|FJ8MV={&h;fJ~JUaFCM}X#b1S`M^Gx73`-NA`(#u6^#Qc25DjH2%@;R zZVwT74_Zyh92p&vhs58!g#Y%_RH~L+#hdlAJeH;=IIku+7nf7t0J1v#?j5J2IQyc% z8sk_S^^3z_9Zay7SwY3%B!L`A8F9s#u3v@Q)zHfXaL@|zL(-#U-|N|^*Bj2;s^c6p(>c>=lNYx=#ubH*dh+Z{0n}XL+G6 45: - scope = 'title' - else: - scope = '_id' - - document = getProfile.configDocGet(profile, scope, avatar) - resultJSON = getProfile.sendDocument(document, 'get') - result = getProfile.parseJSON(resultJSON) - - print(result) - - def erase(self): - eraseProfile = Profiles(self.dunikey, self.pod) - document = eraseProfile.configDocErase() - result = eraseProfile.sendDocument(document,'erase') - - print(result) - - #################### Likes #################### - - def readLikes(self, profile=False): - likes = ReadLikes(self.dunikey, self.pod, self.noNeedDunikey) - document = likes.configDoc(profile) - result = likes.sendDocument(document) - result = likes.parseResult(result) - - print(result) - - def like(self, stars, profile=False): - likes = SendLikes(self.dunikey, self.pod) - document = likes.configDoc(profile, stars) - if document: - likes.sendDocument(document, profile) - - def unLike(self, pubkey, silent=False): - likes = UnLikes(self.dunikey, self.pod) - idLike = likes.checkLike(pubkey) - if idLike: - document = likes.configDoc(idLike) - likes.sendDocument(document, silent) diff --git a/zen/jaklis.old/lib/cesiumCommon.py b/zen/jaklis.old/lib/cesiumCommon.py deleted file mode 100644 index b68337d..0000000 --- a/zen/jaklis.old/lib/cesiumCommon.py +++ /dev/null @@ -1,51 +0,0 @@ -import sys, re, json -from hashlib import sha256 -from lib.natools import fmt, sign, get_privkey - -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 CesiumCommon: - def __init__(self, dunikey, pod, noNeedDunikey=False): - self.pod = pod - self.noNeedDunikey = noNeedDunikey - # 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) - - if noNeedDunikey: - self.pubkey = self.dunikey - else: - self.pubkey = get_privkey(dunikey, "pubsec").pubkey - - if not re.match(PUBKEY_REGEX, self.pubkey) or len(self.pubkey) > 45: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - sys.exit(1) - - def signDoc(self, document): - # 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)} - - return json.dumps(finalJSON) diff --git a/zen/jaklis.old/lib/crypt.py b/zen/jaklis.old/lib/crypt.py deleted file mode 100755 index ee4cfb2..0000000 --- a/zen/jaklis.old/lib/crypt.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 - -import base64, base58, sys, string, random -from natools import get_privkey, box_decrypt, box_encrypt, fmt - -def getargv(arg:str, default:str="", n:int=1, args:list=sys.argv) -> str: - if arg in args and len(args) > args.index(arg)+n: - return args[args.index(arg)+n] - else: - return default - -cmd = sys.argv[1] - -dunikey = getargv("-k", "private.dunikey") -msg = getargv("-m", "test") -pubkey = getargv("-p") - -def decrypt(msg): - msg64 = base64.b64decode(msg) - return box_decrypt(msg64, get_privkey(dunikey, "pubsec"), pubkey).decode() - -def encrypt(msg): - return fmt["64"](box_encrypt(msg.encode(), get_privkey(dunikey, "pubsec"), pubkey)).decode() - -if cmd == 'decrypt': - clear = decrypt(msg) - print(clear) -elif cmd == 'encrypt': - clear = encrypt(msg) - print(clear) - diff --git a/zen/jaklis.old/lib/gva.py b/zen/jaklis.old/lib/gva.py deleted file mode 100644 index eaf22fd..0000000 --- a/zen/jaklis.old/lib/gva.py +++ /dev/null @@ -1,59 +0,0 @@ -import sys, re -from lib.natools import get_privkey -from lib.gvaPay import Transaction, PUBKEY_REGEX -from lib.gvaHistory import History -from lib.gvaBalance import Balance - -class GvaApi(): - def __init__(self, dunikey, node, pubkey, noNeedDunikey=False): - self.noNeedDunikey = noNeedDunikey - self.dunikey = dunikey - self.node = node - if noNeedDunikey: - self.pubkey = self.dunikey - else: - self.pubkey = get_privkey(dunikey, "pubsec").pubkey - - if pubkey: - self.destPubkey = pubkey - else: - self.destPubkey = self.pubkey - - try: - if not re.match(PUBKEY_REGEX, self.pubkey) or len(self.pubkey) > 45: - raise ValueError("La clé publique n'est pas au bon format.") - except: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - raise - - try: - if not re.match(PUBKEY_REGEX, self.destPubkey) or len(self.destPubkey) > 45: - raise ValueError("La clé publique n'est pas au bon format.") - except: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - raise - - #################### Payments #################### - - def pay(self, amount, comment, mempool, verbose): - gva = Transaction(self.dunikey, self.node, self.destPubkey, amount, comment, mempool, verbose) - gva.genDoc() - gva.checkTXDoc() - gva.signDoc() - return gva.sendTXDoc() - - def history(self, isJSON=False, noColors=False): - gva = History(self.dunikey, self.node, self.destPubkey) - gva.sendDoc() - transList = gva.parseHistory() - - if isJSON: - transJson = gva.jsonHistory(transList) - print(transJson) - else: - gva.printHistory(transList, noColors) - - def balance(self, useMempool): - gva = Balance(self.dunikey, self.node, self.destPubkey, useMempool) - balanceValue = gva.sendDoc() - print(balanceValue) diff --git a/zen/jaklis.old/lib/gvaBalance.py b/zen/jaklis.old/lib/gvaBalance.py deleted file mode 100644 index b148e7e..0000000 --- a/zen/jaklis.old/lib/gvaBalance.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 - -import sys, re, os.path, json, ast -from termcolor import colored -from lib.natools import fmt, sign, get_privkey -from gql import gql, Client -from gql.transport.aiohttp import AIOHTTPTransport - -PUBKEY_REGEX = "(?![OIl])[1-9A-Za-z]{42,45}" - -class Balance: - - def __init__(self, dunikey, node, pubkey, useMempool=False): - self.dunikey = dunikey - self.pubkey = pubkey if pubkey else get_privkey(dunikey, "pubsec").pubkey - self.useMempool = useMempool - if not re.match(PUBKEY_REGEX, self.pubkey) or len(self.pubkey) > 45: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - sys.exit(1) - - # Define Duniter GVA node - transport = AIOHTTPTransport(url=node) - self.client = Client(transport=transport, fetch_schema_from_transport=True) - - def sendDoc(self): - # Build balance generation document - queryBuild = gql( - """ - query ($pubkey: String!){ - balance(script: $pubkey) { - amount - } - } - """ - ) - paramsBuild = { - "pubkey": self.pubkey - } - - # Send balance document - try: - balanceResult = self.client.execute(queryBuild, variable_values=paramsBuild) - except Exception as e: - message = ast.literal_eval(str(e))["message"] - sys.stderr.write("Echec de récupération du solde:\n" + message + "\n") - sys.exit(1) - - balanceValue = balanceResult['balance']['amount']/100 - # print(balanceValue) - return balanceValue diff --git a/zen/jaklis.old/lib/gvaHistory.py b/zen/jaklis.old/lib/gvaHistory.py deleted file mode 100644 index a4f6400..0000000 --- a/zen/jaklis.old/lib/gvaHistory.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env python3 - -import sys, re, os.path, json, ast, time -from datetime import datetime -from termcolor import colored -from lib.natools import fmt, sign, get_privkey -from gql import gql, Client -from gql.transport.aiohttp import AIOHTTPTransport - -PUBKEY_REGEX = "(?![OIl])[1-9A-Za-z]{42,45}" - -class History: - - def __init__(self, dunikey, node, pubkey): - self.dunikey = dunikey - self.pubkey = pubkey if pubkey else get_privkey(dunikey, "pubsec").pubkey - self.node = node - if not re.match(PUBKEY_REGEX, self.pubkey) or len(self.pubkey) > 45: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - sys.exit(1) - - # Define Duniter GVA node - transport = AIOHTTPTransport(url=node) - self.client = Client(transport=transport, fetch_schema_from_transport=True) - - def sendDoc(self): - # Build history generation document - queryBuild = gql( - """ - query ($pubkey: String!){ - transactionsHistory(pubkey: $pubkey) { - received { - writtenTime - issuers - outputs - comment - } - sent { - writtenTime - issuers - outputs - comment - } - receiving { - issuers - outputs - comment - } - sending { - issuers - outputs - comment - } - } - balance(script: $pubkey) { - amount - base - } - node { - peer { - currency - } - } - currentUd { - amount - base - } - } - """ - ) - paramsBuild = { - "pubkey": self.pubkey - } - - # Send history document - try: - self.historyDoc = self.client.execute(queryBuild, variable_values=paramsBuild) - except Exception as e: - message = ast.literal_eval(str(e))["message"] - sys.stderr.write("Echec de récupération de l'historique:\n" + message + "\n") - sys.exit(1) - - - def parseHistory(self): - trans = [] - i = 0 - - currentBase = int(self.historyDoc['currentUd']['base']) - self.UD = self.historyDoc['currentUd']['amount']/100 - - for sens in 'received','sent','receiving','sending': - res = self.historyDoc['transactionsHistory'][sens] - for bloc in res: - output = bloc['outputs'][0] - outPubkey = output.split("SIG(")[1].replace(')','') - if sens in ('received','receiving') or self.pubkey != outPubkey: - trans.append(i) - trans[i] = [] - trans[i].append(sens) - if sens in ('receiving','sending'): - trans[i].append(int(time.time())) - else: - trans[i].append(bloc['writtenTime']) - if sens in ('sent','sending'): - trans[i].append(outPubkey) - amount = int('-' + output.split(':')[0]) - else: - trans[i].append(bloc['issuers'][0]) - amount = int(output.split(':')[0]) - base = int(output.split(':')[1]) - applyBase = base-currentBase - amount = round(amount*pow(10,applyBase)/100, 2) - # if referential == 'DU': amount = round(amount/UD, 2) - trans[i].append(amount) - trans[i].append(round(amount/self.UD, 2)) - trans[i].append(bloc['comment']) - trans[i].append(base) - i += 1 - - # Order transactions by date - trans.sort(key=lambda x: x[1]) - - # Keep only base if there is base change - lastBase = 0 - for i in trans: - if i[6] == lastBase: i[6] = None - else: lastBase = i[6] - - return trans - - def printHistory(self, trans, noColors): - # Get balance - balance = self.historyDoc['balance']['amount']/100 - balanceUD = round(balance/self.UD, 2) - - # Get currency - currency = self.historyDoc['node']['peer']['currency'] - if currency == 'g1': currency = 'Ḡ1' - elif currency == 'g1-test': currency = 'GT' - # if referential == 'DU': currency = 'DU/' + currency.lower() - - # Get terminal size - rows = int(os.popen('stty size', 'r').read().split()[1]) - - # Display history - print('+', end='') - print('-'.center(rows-1, '-')) - if noColors: isBold = isBoldEnd = '' - else: - isBold = '\033[1m' - isBoldEnd = '\033[0m' - print(isBold + "|{: <19} | {: <12} | {: <7} | {: <7} | {: <30}".format(" Date"," De / À"," {0}".format(currency)," DU/{0}".format(currency.lower()),"Commentaire") + isBoldEnd) - print('|', end='') - for t in trans: - if t[0] == "received": color = "green" - elif t[0] == "receiving": color = "yellow" - elif t[0] == "sending": color = "red" - else: color = "blue" - if noColors: - color = None - if t[0] in ('receiving','sending'): - comment = '(EN ATTENTE) ' + t[5] - else: - comment = t[5] - else: - comment = t[5] - - date = datetime.fromtimestamp(t[1]).strftime("%d/%m/%Y à %H:%M") - print('-'.center(rows-1, '-')) - if t[6]: - print('|', end='') - print(' Changement de base : {0} '.format(t[6]).center(rows-1, '#')) - print('|', end='') - print('-'.center(rows-1, '-')) - print('|', end='') - printKey = t[2][0:8] + '\u2026' + t[2][-3:] - if noColors: - print(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, printKey, t[3], t[4], comment)) - else: - print(colored(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, printKey, t[3], t[4], comment), color)) - print('|', end='') - print('-'.center(rows-1, '-')) - print('|', end='') - print(isBold + 'Solde du compte: {0} {1} ({2} DU/{3})'.format(balance, currency, balanceUD, currency.lower()).center(rows-1, ' ') + isBoldEnd) - print('+', end='') - print(''.center(rows-1, '-')) - if not noColors: - print(colored('Reçus', 'green'), '-', colored('En cours de réception', 'yellow'), '-', colored('Envoyé', 'blue'), '-', colored("En cours d'envoi", 'red')) - - return trans - - def jsonHistory(self, transList): - dailyJSON = [] - for i, trans in enumerate(transList): - dailyJSON.append(i) - dailyJSON[i] = {} - dailyJSON[i]['date'] = trans[1] - dailyJSON[i]['pubkey'] = trans[2] - dailyJSON[i]['amount'] = trans[3] - dailyJSON[i]['amountUD'] = trans[4] - dailyJSON[i]['comment'] = trans[5] - - dailyJSON = json.dumps(dailyJSON, indent=2) - # If we want to write JSON to a file - #jsonFile = open("history-{0}.json".format(self.pubkey[0:8]), "w") - #jsonFile.writelines(dailyJSON + '\n') - #jsonFile.close() - return dailyJSON - diff --git a/zen/jaklis.old/lib/gvaPay.py b/zen/jaklis.old/lib/gvaPay.py deleted file mode 100644 index e017c88..0000000 --- a/zen/jaklis.old/lib/gvaPay.py +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env python3 - -import sys, re, os.path, json, ast -from termcolor import colored -from lib.natools import fmt, sign, get_privkey -from gql import gql, Client -from gql.transport.aiohttp import AIOHTTPTransport - -PUBKEY_REGEX = "(?![OIl])[1-9A-Za-z]{42,45}" - -class Transaction: - - def __init__(self, dunikey, node, recipient, amount, comment='', useMempool=False, verbose=False): - self.dunikey = dunikey - self.recipient = recipient - self.amount = int(amount*100) - self.comment = comment - self.issuer = get_privkey(dunikey, "pubsec").pubkey - self.useMempool = useMempool - self.verbose = verbose - self.node = node - self._isChange = False - - try: - if not re.match(PUBKEY_REGEX, recipient) or len(recipient) > 45: - raise ValueError("La clé publique n'est pas au bon format.") - except: - sys.stderr.write("La clé publique n'est pas au bon format.\n") - raise - - - try: - if recipient == self.issuer: - raise ValueError('Le destinataire ne peut pas être vous même.') - except: - sys.stderr.write("Le destinataire ne peut pas être vous même.\n") - raise - - - # Define Duniter GVA node - transport = AIOHTTPTransport(url=node) - self.client = Client(transport=transport, fetch_schema_from_transport=True) - - def genDoc(self): - # Build TX generation document - if self.verbose: print("useMempool:", str(self.useMempool)) - queryBuild = gql( - """ - query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!, $useMempool: Boolean!){ genTx( - amount: $amount - comment: $comment - issuer: $issuer - recipient: $recipient - useMempoolSources: $useMempool - ) - } - """ - ) - paramsBuild = { - "recipient": self.recipient, - "issuer": self.issuer, - "amount": int(self.amount), - "comment": self.comment, - "useMempool": self.useMempool - } - - # Send TX document - try: - # self.txDoc = [] - self.txDoc = self.client.execute(queryBuild, variable_values=paramsBuild)['genTx'] - if self.verbose: print(self.txDoc[0]) - return self.txDoc - except Exception as e: - message = ast.literal_eval(str(e))["message"] - sys.stderr.write("Echec de la génération du document:\n" + message + "\n") - raise - - - # Check document - def checkTXDoc(self): - issuerRaw=[];outAmount=[];outPubkey=[];commentRaw=[] - for docs in self.txDoc: - docList = docs.splitlines() - for i, line in enumerate(docList): - if re.search("Issuers:", line): - issuerRaw.append(docList[(i + 1) % len(docList)]) - if re.search("Outputs:", line): - outputRaw = docList[(i + 1) % len(docList)].split(":") - outAmount.append(int(outputRaw[0])) - outPubkey.append(outputRaw[2].split("SIG(")[1].replace(')','')) - if re.search("Comment:", line): - commentRaw.append(line.split(': ', 1)[1]) - - # Check if it's only a change transaction - if all(i == self.issuer for i in outPubkey): - print("Le document contient une transaction de change") - self.isChange = True - # Check validity of the document - elif all(i != self.issuer for i in issuerRaw) or sum(outAmount) != self.amount or all(i != self.recipient for i in outPubkey) or all(i != self.comment for i in commentRaw): - sys.stderr.write(colored("Le document généré est corrompu !\nLe noeud " + self.node + "a peut être un dysfonctionnement.\n", 'red')) - sys.stderr.write(colored(issuerRaw[0] + " envoi " + str(outAmount[0]) + " vers " + outPubkey[0] + " with comment: " + commentRaw[0] + "\n", "yellow")) - raise ValueError('Le document généré est corrompu !') - else: - print("Le document généré est conforme.") - self.isChange = False - return self.txDoc - - def signDoc(self): - # Sign TX documents - signature=[] - self.signedDoc=[] - for i, docs in enumerate(self.txDoc): - signature.append(fmt["64"](sign(docs.encode(), get_privkey(self.dunikey, "pubsec"))[:-len(docs.encode())])) - self.signedDoc.append(docs + signature[i].decode()) - return self.signedDoc - - - def sendTXDoc(self): - # Build TX documents - txResult=[] - for docs in self.signedDoc: - querySign = gql( - """ - mutation ($signedDoc: String!){ tx( - rawTx: $signedDoc - ) { - version - issuers - outputs - } - } - """ - ) - paramsSign = { - "signedDoc": docs - } - - # Send TX Signed document - try: - txResult.append(str(self.client.execute(querySign, variable_values=paramsSign))) - except Exception as e: - message = ast.literal_eval(str(e))["message"] - sys.stderr.write("Echec de la transaction:\n" + message + "\n") - if self.verbose: - sys.stderr.write("Document final:\n" + docs) - raise ValueError(message) - else: - if self.isChange: - self.send() - else: - print(colored("Transaction effectué avec succès !", "green")) - if self.verbose: - print(docs) - break - - return txResult - - def _getIsChange(self): - return self._isChange - def _setIsChange(self, newChange): - if self.verbose: print("_setIsChange: ", str(newChange)) - self._isChange = newChange - if newChange: self.useMempool == True - isChange = property(_getIsChange, _setIsChange) - - def send(self): - result = self.genDoc() - result = self.checkTXDoc() - result = self.signDoc() - result = self.sendTXDoc() - return result - diff --git a/zen/jaklis.old/lib/likes.py b/zen/jaklis.old/lib/likes.py deleted file mode 100644 index 5eee339..0000000 --- a/zen/jaklis.old/lib/likes.py +++ /dev/null @@ -1,242 +0,0 @@ -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 -from lib.cesiumCommon import CesiumCommon, PUBKEY_REGEX - -class ReadLikes(CesiumCommon): - # Configure JSON document to send - def configDoc(self, profile): - if not profile: profile = self.pubkey - - 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'] - # print(issuer) - gProfile = self.getProfile(issuer) - try: - pseudo = gProfile['title'] - except: - pseudo = '' - try: - payTo = gProfile['pubkey'] - except: - payTo = '' - id = i['_id'] - level = i['_source']['level'] - if issuer == self.pubkey: - 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 - - 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'] - for i in result: - return i['_source'] - - -#################### Like class #################### - - -class SendLikes(CesiumCommon): - # Configure JSON document to send - def configDoc(self, profile, likes): - if not profile: profile = self.pubkey - 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.pubkey - - 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) - idLike = rmLike.checkLike(pubkey) - if idLike: - document = rmLike.configDoc(idLike) - rmLike.sendDocument(document, 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') - - -#################### Unlike class #################### - - -class UnLikes(CesiumCommon): - # 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.pubkey - 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') diff --git a/zen/jaklis.old/lib/messaging.py b/zen/jaklis.old/lib/messaging.py deleted file mode 100644 index 2165182..0000000 --- a/zen/jaklis.old/lib/messaging.py +++ /dev/null @@ -1,236 +0,0 @@ -import os, sys, ast, requests, json, base58, base64 -from time import time -from datetime import datetime -from termcolor import colored -from lib.natools import fmt, get_privkey, box_decrypt, box_encrypt -from lib.cesiumCommon import CesiumCommon, pp_json, PUBKEY_REGEX - - -#################### Reading class #################### - - -class ReadFromCesium(CesiumCommon): - # 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.pubkey - - 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('\033[1m' + self.title + '\033[0m') - 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 - - 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 - - -#################### Sending class #################### - - -class SendToCesium(CesiumCommon): - 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()) - - # Generate custom JSON - data = {} - data['issuer'] = self.pubkey - data['recipient'] = self.recipient - data['title'] = title - data['content'] = msg - data['time'] = timeSent - data['nonce'] = b58nonce - data['version'] = 2 - document = json.dumps(data) - - return self.signDoc(document) - - - def sendDocument(self, document, outbox): - boxType = "outbox" if 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') - - -#################### Deleting class #################### - - -class DeleteFromCesium(CesiumCommon): - def configDoc(self, idMsg, outbox): - # Get current timestamp - timeSent = int(time()) - - boxType = "outbox" if outbox else "inbox" - - # Generate document to customize - data = {} - data['version'] = 2 - data['index'] = "message" - data['type'] = boxType - data['id'] = idMsg - data['issuer'] = self.pubkey - data['time'] = timeSent - document = json.dumps(data) - - return self.signDoc(document) - - 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.") diff --git a/zen/jaklis.old/lib/natools.py b/zen/jaklis.old/lib/natools.py deleted file mode 100755 index 18f06d1..0000000 --- a/zen/jaklis.old/lib/natools.py +++ /dev/null @@ -1,297 +0,0 @@ -#!/usr/bin/env python3 - -""" - CopyLeft 2020 Pascal Engélibert - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -""" - -__version__ = "1.3.1" - -import os, sys, duniterpy.key, libnacl, base58, base64, getpass - -def getargv(arg:str, default:str="", n:int=1, args:list=sys.argv) -> str: - if arg in args and len(args) > args.index(arg)+n: - return args[args.index(arg)+n] - else: - return default - -def read_data(data_path, b=True): - if data_path == "-": - if b: - return sys.stdin.buffer.read() - else: - return sys.stdin.read() - else: - return open(os.path.expanduser(data_path), "rb" if b else "r").read() - -def write_data(data, result_path): - if result_path == "-": - os.fdopen(sys.stdout.fileno(), 'wb').write(data) - else: - open(os.path.expanduser(result_path), "wb").write(data) - -def encrypt(data, pubkey): - return duniterpy.key.PublicKey(pubkey).encrypt_seal(data) - -def decrypt(data, privkey): - return privkey.decrypt_seal(data) - -def box_encrypt(data, privkey, pubkey, nonce=None, attach_nonce=False): - signer = libnacl.sign.Signer(privkey.seed) - sk = libnacl.public.SecretKey(libnacl.crypto_sign_ed25519_sk_to_curve25519(signer.sk)) - verifier = libnacl.sign.Verifier(base58.b58decode(pubkey).hex()) - pk = libnacl.public.PublicKey(libnacl.crypto_sign_ed25519_pk_to_curve25519(verifier.vk)) - box = libnacl.public.Box(sk.sk, pk.pk) - data = box.encrypt(data, nonce) if nonce else box.encrypt(data) - return data if attach_nonce else data[24:] - -def box_decrypt(data, privkey, pubkey, nonce=None): - signer = libnacl.sign.Signer(privkey.seed) - sk = libnacl.public.SecretKey(libnacl.crypto_sign_ed25519_sk_to_curve25519(signer.sk)) - verifier = libnacl.sign.Verifier(base58.b58decode(pubkey).hex()) - pk = libnacl.public.PublicKey(libnacl.crypto_sign_ed25519_pk_to_curve25519(verifier.vk)) - box = libnacl.public.Box(sk.sk, pk.pk) - return box.decrypt(data, nonce) if nonce else box.decrypt(data) - -def sign(data, privkey): - return privkey.sign(data) - -def verify(data, pubkey): - try: - ret = libnacl.sign.Verifier(duniterpy.key.PublicKey(pubkey).hex_pk()).verify(data) - sys.stderr.write("Signature OK!\n") - return ret - except ValueError: - sys.stderr.write("Bad signature!\n") - exit(1) - -def get_privkey(privkey_path, privkey_format): - if privkey_format == "pubsec": - if privkey_path == "*": - privkey_path = "privkey.pubsec" - return duniterpy.key.SigningKey.from_pubsec_file(privkey_path) - - elif privkey_format == "cred": - if privkey_path == "*": - privkey_path = "-" - if privkey_path == "-": - return duniterpy.key.SigningKey.from_credentials(getpass.getpass("Password: "), getpass.getpass("Salt: ")) - else: - return duniterpy.key.SigningKey.from_credentials_file(privkey_path) - - elif privkey_format == "seedh": - if privkey_path == "*": - privkey_path = "authfile.seedhex" - return duniterpy.key.SigningKey.from_seedhex(read_data(privkey_path, False)) - - elif privkey_format == "wif": - if privkey_path == "*": - privkey_path = "authfile.wif" - return duniterpy.key.SigningKey.from_wif_or_ewif_file(privkey_path) - - elif privkey_format == "wifh": - if privkey_path == "*": - privkey_path = "authfile.wif" - return duniterpy.key.SigningKey.from_wif_or_ewif_hex(privkey_path) - - elif privkey_format == "ssb": - if privkey_path == "*": - privkey_path = "secret" - return duniterpy.key.SigningKey.from_ssb_file(privkey_path) - - elif privkey_format == "key": - if privkey_path == "*": - privkey_path = "authfile.key" - return duniterpy.key.SigningKey.from_private_key(privkey_path) - - print("Error: unknown privkey format") - -def fill_pubkey(pubkey, length=32): - while pubkey[0] == 0: - pubkey = pubkey[1:] - return b"\x00"*(length-len(pubkey)) + pubkey - -def pubkey_checksum(pubkey, length=32, clength=3): - return base58.b58encode(libnacl.crypto_hash_sha256(libnacl.crypto_hash_sha256(fill_pubkey(base58.b58decode(pubkey), length)))).decode()[:clength] - -# returns (pubkey:bytes|None, deprecated_length:bool) -def check_pubkey(pubkey): - if ":" in pubkey: - parts = pubkey.split(":") - if len(parts[1]) < 3 or len(parts[1]) > 32: - return (None, False) - for i in range(32, 0, -1): - if pubkey_checksum(parts[0], i, len(parts[1])) == parts[1]: - return (parts[0], i < 32) - return (None, False) - return (pubkey, False) - -fmt = { - "raw": lambda data: data, - "16": lambda data: data.hex().encode(), - "32": lambda data: base64.b32encode(data), - "58": lambda data: base58.b58encode(data), - "64": lambda data: base64.b64encode(data), - "64u": lambda data: base64.urlsafe_b64encode(data), - "85": lambda data: base64.b85encode(data), -} - -defmt = { - "raw": lambda data: data, - "16": lambda data: bytes.fromhex(data), - "32": lambda data: base64.b32decode(data), - "58": lambda data: base58.b58decode(data), - "64": lambda data: base64.b64decode(data), - "85": lambda data: base64.b85decode(data), -} - -def show_help(): - print("""Usage: -python3 natools.py [options] - -Commands: - encrypt Encrypt data - decrypt Decrypt data - box-encrypt Encrypt data (NaCl box) - box-decrypt Decrypt data (NaCl box) - sign Sign data - verify Verify data - pubkey Display pubkey - pk Display b58 pubkey shorthand - -Options: - -c Display pubkey checksum - -f Private key format (default: cred) - key cred pubsec seedh ssb wif wifh - -i Input file path (default: -) - -I Input format: raw 16 32 58 64 85 (default: raw) - -k Privkey file path (* for auto) (default: *) - -n Nonce (b64, 24 bytes) (for NaCl box) - -N Attach nonce to output (for NaCl box encryption) - --noinc Do not include msg after signature - -o Output file path (default: -) - -O Output format: raw 16 32 58 64 64u 85 (default: raw) - -p Pubkey (base58) - - --help Show help - --version Show version - --debug Debug mode (display full errors) - -Note: "-" means stdin or stdout. -""") - -if __name__ == "__main__": - - if "--help" in sys.argv: - show_help() - exit() - - if "--version" in sys.argv: - print(__version__) - exit() - - privkey_format = getargv("-f", "cred") - data_path = getargv("-i", "-") - privkey_path = getargv("-k", "*") - pubkey = getargv("-p") - result_path = getargv("-o", "-") - output_format = getargv("-O", "raw") - input_format = getargv("-I", "raw") - - if pubkey: - pubkey, len_deprecated = check_pubkey(pubkey) - if not pubkey: - print("Invalid pubkey checksum! Please check spelling.") - exit(1) - if len(base58.b58decode(pubkey)) > 32: - print("Invalid pubkey: too long!") - exit(1) - if len_deprecated: - print("Warning: valid pubkey checksum, but deprecated format (truncating zeros)") - - try: - if sys.argv[1] == "encrypt": - if not pubkey: - print("Please provide pubkey!") - exit(1) - write_data(fmt[output_format](encrypt(defmt[input_format](read_data(data_path)), pubkey)), result_path) - - elif sys.argv[1] == "decrypt": - write_data(fmt[output_format](decrypt(defmt[input_format](read_data(data_path)), get_privkey(privkey_path, privkey_format))), result_path) - - elif sys.argv[1] == "box-encrypt": - if not pubkey: - print("Please provide pubkey!") - exit(1) - nonce = getargv("-n", None) - if nonce: - nonce = base64.b64decode(nonce) - attach_nonce = "-N" in sys.argv - write_data(fmt[output_format](box_encrypt(defmt[input_format](read_data(data_path)), get_privkey(privkey_path, privkey_format), pubkey, nonce, attach_nonce)), result_path) - - elif sys.argv[1] == "box-decrypt": - if not pubkey: - print("Please provide pubkey!") - exit(1) - nonce = getargv("-n", None) - if nonce: - nonce = base64.b64decode(nonce) - write_data(fmt[output_format](box_decrypt(defmt[input_format](read_data(data_path)), get_privkey(privkey_path, privkey_format), pubkey, nonce)), result_path) - - elif sys.argv[1] == "sign": - data = defmt[input_format](read_data(data_path)) - signed = sign(data, get_privkey(privkey_path, privkey_format)) - - if "--noinc" in sys.argv: - signed = signed[:len(signed)-len(data)] - - write_data(fmt[output_format](signed), result_path) - - elif sys.argv[1] == "verify": - if not pubkey: - print("Please provide pubkey!") - exit(1) - write_data(fmt[output_format](verify(defmt[input_format](read_data(data_path)), pubkey)), result_path) - - elif sys.argv[1] == "pubkey": - if pubkey: - if "-c" in sys.argv and output_format == "58": - write_data("{}:{}".format(pubkey, pubkey_checksum(pubkey)).encode(), result_path) - else: - write_data(fmt[output_format](base58.b58decode(pubkey)), result_path) - else: - pubkey = get_privkey(privkey_path, privkey_format).pubkey - if "-c" in sys.argv and output_format == "58": - write_data("{}:{}".format(pubkey, pubkey_checksum(pubkey)).encode(), result_path) - else: - write_data(fmt[output_format](base58.b58decode(pubkey)), result_path) - - elif sys.argv[1] == "pk": - if not pubkey: - pubkey = get_privkey(privkey_path, privkey_format).pubkey - if "-c" in sys.argv: - print("{}:{}".format(pubkey, pubkey_checksum(pubkey))) - else: - print(pubkey) - - else: - show_help() - - except Exception as e: - if "--debug" in sys.argv: - 0/0 # DEBUG MODE (raise error when handling error to display backtrace) - sys.stderr.write("Error: {}\n".format(e)) - show_help() - exit(1) diff --git a/zen/jaklis.old/lib/profiles.py b/zen/jaklis.old/lib/profiles.py deleted file mode 100644 index 5386c89..0000000 --- a/zen/jaklis.old/lib/profiles.py +++ /dev/null @@ -1,125 +0,0 @@ -import sys, re, json, requests, base64 -from time import time -from lib.cesiumCommon import CesiumCommon, PUBKEY_REGEX - - -class Profiles(CesiumCommon): - # Configure JSON document SET to send - def configDocSet(self, name, description, city, address, pos, socials, avatar): - timeSent = int(time()) - - data = {} - if name: data['title'] = name - if description: data['description'] = description - if address: data['address'] = address - if city: data['city'] = city - if pos: - geoPoint = {} - geoPoint['lat'] = pos[0] - geoPoint['lon'] = pos[1] - data['geoPoint'] = geoPoint - if socials: - data['socials'] = [] - data['socials'].append({}) - data['socials'][0]['type'] = "web" - data['socials'][0]['url'] = socials - if avatar: - avatar = open(avatar, 'rb').read() - avatar = base64.b64encode(avatar).decode() - data['avatar'] = {} - data['avatar']['_content'] = avatar - data['avatar']['_content_type'] = "image/png" - data['time'] = timeSent - data['issuer'] = self.pubkey - data['version'] = 2 - data['tags'] = [] - - document = json.dumps(data) - - return self.signDoc(document) - - # Configure JSON document GET to send - def configDocGet(self, profile, scope='title', getAvatar=None): - - if getAvatar: - avatar = "avatar" - else: - avatar = "avatar._content_type" - - data = { - "query": { - "bool": { - "should":[ - { - "match":{ - scope:{ - "query": profile,"boost":2 - } - } - },{ - "prefix": {scope: profile} - } - ] - } - },"highlight": { - "fields": { - "title":{}, - "tags":{} - } - },"from":0, - "size":100, - "_source":["title", avatar,"description","city","address","socials.url","creationTime","membersCount","type"], - "indices_boost":{"user":100,"page":1,"group":0.01 - } - } - - document = json.dumps(data) - - return document - - # Configure JSON document SET to send - def configDocErase(self): - timeSent = int(time()) - - data = {} - data['time'] = timeSent - data['id'] = self.pubkey - data['issuer'] = self.pubkey - data['version'] = 2 - data['index'] = "user" - data['type'] = "profile" - - document = json.dumps(data) - - return self.signDoc(document) - - def sendDocument(self, document, type): - - headers = { - 'Content-type': 'application/json', - } - - # Send JSON document and get JSON result - if type == 'set': - reqQuery = '{0}/user/profile?pubkey={1}/_update?pubkey={1}'.format(self.pod, self.pubkey) - elif type == 'get': - reqQuery = '{0}/user,page,group/profile,record/_search'.format(self.pod) - elif type == 'erase': - reqQuery = '{0}/history/delete'.format(self.pod) - - result = requests.post(reqQuery, 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...\n" + result.text + '\n') - - def parseJSON(self, doc): - doc = json.loads(doc)['hits']['hits'] - if doc: - pubkey = { "pubkey": doc[0]['_id'] } - rest = doc[0]['_source'] - final = {**pubkey, **rest} - return json.dumps(final, indent=2) - else: - return 'Profile vide' diff --git a/zen/jaklis.old/paiements.py b/zen/jaklis.old/paiements.py deleted file mode 100755 index dde58da..0000000 --- a/zen/jaklis.old/paiements.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python3 - -""" -ZetCode Tkinter tutorial - -In this example, we use the pack -manager to create a review example. - -Author: Jan Bodnar -Website: www.zetcode.com -""" - -import PySimpleGUI as sg -from lib.gva import GvaApi -import sys, os, threading -from shutil import copyfile -from os.path import join, dirname -from dotenv import load_dotenv -from lib.natools import get_privkey -import requests - -class StdoutRedirector(object): - def __init__(self, text_widget): - self.text_widget = text_widget - - def write(self, s): - self.text_widget.insert('end', s) - self.text_widget.see('end') - - def flush(self): - pass - - -MY_PATH = os.path.realpath(os.path.dirname(sys.argv[0])) + '/' - -# Get variables environment -if not os.path.isfile(MY_PATH + '.env'): - copyfile(MY_PATH + ".env.template",MY_PATH + ".env") -dotenv_path = join(dirname(__file__),MY_PATH + '.env') -load_dotenv(dotenv_path) - -dunikey = os.getenv('DUNIKEY') -if not os.path.isfile(dunikey): - HOME = os.getenv("HOME") - dunikey = HOME + dunikey - if not os.path.isfile(dunikey): - sys.stderr.write('Le fichier de trousseau {0} est introuvable.\n'.format(dunikey)) - sys.exit(1) -node = os.getenv('NODE') -issuer = get_privkey(dunikey, "pubsec").pubkey - - -def ProceedPaiement(recipient, amount, comment): - if not recipient: - raise ValueError("Veuillez indiquer un destinataire de paiement") - elif not amount: - raise ValueError("Veuillez indiquer le montant de la transaction") - - amount = int(float(amount.replace(',','.'))*100) - print("Paiement en cours vers", recipient) - gva = GvaApi(dunikey, node, recipient) - gva.pay(amount, comment, False, False) - - recipient = amount = comment = None - - -sg.theme('DarkGrey2') -layout = [ [sg.Text('Noeud utilisé: ' + node)], - [sg.Text('Votre clé publique: ' + issuer)], - [sg.Text('')], - [sg.Text('Destinataire: '), sg.InputText(size=(55, None),default_text=issuer)], - [sg.Text('Montant: '), sg.InputText(size=(7, None)), sg.Text('Ḡ1')], - [sg.Text('Commentaire:'), sg.InputText(size=(55, None))], - [sg.Button('Envoyer')] ] - -# Create the Window -window = sg.Window('Paiement Ḡ1 - GVA', layout) -# availablePubkeys = requests.get('https://g1-stats.axiom-team.fr/data/wallets-g1.txt') -while True: - try: - event, values = window.read() - if event == sg.WIN_CLOSED: - break - if event == 'Envoyer': - ProceedPaiement(values[0], values[1], values[2]) - except Exception as e: - loc = window.CurrentLocation() - sg.popup(e, title="ERREUR", button_color=('black','red'), location=(loc)) - else: - loc = window.CurrentLocation() - sg.popup(f'Transaction effectué avec succès !', title="Envoyé", location=(loc)) - - -window.close() diff --git a/zen/jaklis.old/requirements.txt b/zen/jaklis.old/requirements.txt deleted file mode 100644 index e6b5711..0000000 --- a/zen/jaklis.old/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -wheel -base58 -pybase64 -duniterpy -termcolor -python-dotenv -gql diff --git a/zen/jaklis.old/setup.sh b/zen/jaklis.old/setup.sh deleted file mode 100755 index 222e4ba..0000000 --- a/zen/jaklis.old/setup.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -for i in gcc python3-pip python3-setuptools libpq-dev python3-dev python3-wheel; do - if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then - [[ ! $j ]] && sudo apt update - sudo apt install -y $i - j=1 - fi -done - -pip3 install -r requirements.txt -chmod u+x jaklis.py