diff --git a/pay-gui.py b/pay-gui.py index c173d42..3749616 100755 --- a/pay-gui.py +++ b/pay-gui.py @@ -1,25 +1,36 @@ #!/usr/bin/env python3 from tkinter import * -import pay +from pay import * window = Tk() title = Label(window, text="Paiement Ḡ1") title.pack() -# Issuer input -issuer = StringVar() -xIssuer = Entry(window, textvariable=issuer, width=30) -xIssuer.pack() +# Recipient input +recipientEntry = Entry() +# xRecipient = Entry(window, textvariable=recipient, width=30) +recipientEntry.pack() + + +# Amount input +AmountEntry = Entry() +AmountEntry.pack() # Comment input -comment = StringVar() -xComment = Entry(window, textvariable=comment, width=30) -xComment.pack() +commentEntry = Entry() +commentEntry.pack() def ProceedPaiement(): - print("Paiement en cours ...") + recipient = str(recipientEntry.get()) + amount = int(AmountEntry.get()) + comment = str(commentEntry.get()) + print("Paiement en cours ... " + recipient) + returnGen = sendGenDoc(recipient, amount, comment) + checkTXDoc(returnGen) + returnSigned = signDoc(returnGen) + sendTXDoc(returnSigned) sendButton = Button(window, text="Envoyer", command=ProceedPaiement) sendButton.pack() diff --git a/pay.py b/pay.py index 58a170f..acc73af 100755 --- a/pay.py +++ b/pay.py @@ -17,95 +17,113 @@ if not (dunikey): # Define Duniter GVA node transport = AIOHTTPTransport(url=node) client = Client(transport=transport, fetch_schema_from_transport=True) - issuer = get_privkey(dunikey, "pubsec").pubkey -recipient = sys.argv[1] -amount = int(sys.argv[2]) -if len(sys.argv) > 3: - comment = sys.argv[3] -else: - comment = "" -## GraphQL queries -# Build the TX Document -queryBuild = gql( - """ - query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!){ genTxs( - amount: $amount - comment: $comment - issuer: $issuer - recipient: $recipient - ) -} -""" -) -paramsBuild = { - "recipient": recipient, - "issuer": issuer, - "amount": amount, - "comment": comment -} - -# Send TX document try: - txDoc = str(client.execute(queryBuild, variable_values=paramsBuild))[13:-3].replace('\\n','\n') -except Exception as e: - #e = json.dumps(str(e)) - sys.stderr.write("Echec de la génération du document:\n" + str(e) + "\n") - sys.exit(1) + recipient = sys.argv[1] + amount = int(sys.argv[2]) + if len(sys.argv) > 3: + comment = sys.argv[3] + else: + comment = "" + graphic = False +except: + graphic = True + + +def sendGenDoc(recipient, amount, comment): + # Build TX generation document + queryBuild = gql( + """ + query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!){ genTxs( + amount: $amount + comment: $comment + issuer: $issuer + recipient: $recipient + ) + } + """ + ) + paramsBuild = { + "recipient": recipient, + "issuer": issuer, + "amount": amount, + "comment": comment + } + + # Send TX document + try: + txDoc = str(client.execute(queryBuild, variable_values=paramsBuild))[13:-3].replace('\\n','\n') + return txDoc + except Exception as e: + #e = json.dumps(str(e)) + sys.stderr.write("Echec de la génération du document:\n" + str(e) + "\n") + sys.exit(1) + # Check document +def checkTXDoc(txDoc): + docList = txDoc.splitlines() + for i, line in enumerate(docList): + if re.search("Issuers:", line): + issuerRaw = docList[(i + 1) % len(docList)] + if re.search("Outputs:", line): + outputRaw = docList[(i + 1) % len(docList)].split(":") + outAmount = outputRaw[0] + outPubkey = outputRaw[2].split("SIG(")[1].replace(')','') + if re.search("Comment:", line): + commentRaw = line.split(': ', 1)[1] -# print(txDoc) # For debug -docList = txDoc.splitlines() -for i, line in enumerate(docList): - if re.search("Issuers:", line): - issuerRaw = docList[(i + 1) % len(docList)] - if re.search("Outputs:", line): - outputRaw = docList[(i + 1) % len(docList)].split(":") - outAmount = outputRaw[0] - outPubkey = outputRaw[2].split("SIG(")[1].replace(')','') - if re.search("Comment:", line): - commentRaw = line.split(': ', 1)[1] + if issuerRaw != issuer or int(outAmount) != amount or outPubkey != recipient or commentRaw != comment: + sys.stderr.write(colored("Le document généré est corrompu !\nNe fait plus confiance au noeud " + node + "\n", 'red')) + sys.stderr.write(colored(issuerRaw + " envoi " + outAmount + " vers " + outPubkey + " with comment: " + commentRaw + "\n", "yellow")) + sys.exit(1) + else: + print("Le document généré est conforme.") + return True -if issuerRaw != issuer or int(outAmount) != amount or outPubkey != recipient or commentRaw != comment: - sys.stderr.write(colored("Le document généré est corrompu !\nNe fait plus confiance au noeud " + node + "\n", 'red')) - sys.stderr.write(colored(issuerRaw + " envoi " + outAmount + " vers " + outPubkey + " with comment: " + commentRaw + "\n", "yellow")) - sys.exit(1) -else: - print("Le document généré est conforme.") -# sys.exit(0) # For debug +def signDoc(txDoc): + # Sign TX document + signature = fmt["64"](sign(txDoc.encode(), get_privkey(dunikey, "pubsec"))[:-len(txDoc.encode())]) + signedDoc = txDoc + signature.decode() -# Sign TX document -signature = fmt["64"](sign(txDoc.encode(), get_privkey(dunikey, "pubsec"))[:-len(txDoc.encode())]) -signedDoc = txDoc + signature.decode() + return signedDoc -#print(signedDoc) # For debug -querySign = gql( - """ - mutation ($signedDoc: String!){ tx( - rawTx: $signedDoc - ) { - version - issuers - outputs - } -} -""" -) -paramsSign = { - "signedDoc": signedDoc -} +def sendTXDoc(signedDoc): + # Build TX document + querySign = gql( + """ + mutation ($signedDoc: String!){ tx( + rawTx: $signedDoc + ) { + version + issuers + outputs + } + } + """ + ) + paramsSign = { + "signedDoc": signedDoc + } -# Send TX Signed document -try: - sentTX = client.execute(querySign, variable_values=paramsSign) - print(colored("Transaction effectué avec succès !", "green")) -except Exception as e: - sys.stderr.write("Echec de la transaction:\n" + str(e) + "\n") - sys.exit(1) + # Send TX Signed document + try: + client.execute(querySign, variable_values=paramsSign) + print(colored("Transaction effectué avec succès !", "green")) + except Exception as e: + sys.stderr.write("Echec de la transaction:\n" + str(e) + "\n") + sys.exit(1) + + +# Execute workflow +if not graphic: + returnGen = sendGenDoc(recipient, amount, comment) + docIsOK = checkTXDoc(returnGen) + returnSigned = signDoc(returnGen) + sendTXDoc(returnSigned) #print(sentTX) #For debug