Mixte CLI/GUI

This commit is contained in:
poka 2020-11-15 09:12:37 +01:00
parent 2a1819e0f3
commit 7b8c0c82bc
2 changed files with 115 additions and 86 deletions

View File

@ -1,25 +1,36 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from tkinter import * from tkinter import *
import pay from pay import *
window = Tk() window = Tk()
title = Label(window, text="Paiement Ḡ1") title = Label(window, text="Paiement Ḡ1")
title.pack() title.pack()
# Issuer input # Recipient input
issuer = StringVar() recipientEntry = Entry()
xIssuer = Entry(window, textvariable=issuer, width=30) # xRecipient = Entry(window, textvariable=recipient, width=30)
xIssuer.pack() recipientEntry.pack()
# Amount input
AmountEntry = Entry()
AmountEntry.pack()
# Comment input # Comment input
comment = StringVar() commentEntry = Entry()
xComment = Entry(window, textvariable=comment, width=30) commentEntry.pack()
xComment.pack()
def ProceedPaiement(): 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 = Button(window, text="Envoyer", command=ProceedPaiement)
sendButton.pack() sendButton.pack()

96
pay.py
View File

@ -17,18 +17,23 @@ if not (dunikey):
# Define Duniter GVA node # Define Duniter GVA node
transport = AIOHTTPTransport(url=node) transport = AIOHTTPTransport(url=node)
client = Client(transport=transport, fetch_schema_from_transport=True) client = Client(transport=transport, fetch_schema_from_transport=True)
issuer = get_privkey(dunikey, "pubsec").pubkey 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 try:
# Build the TX Document recipient = sys.argv[1]
queryBuild = gql( 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( query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!){ genTxs(
amount: $amount amount: $amount
@ -36,29 +41,30 @@ queryBuild = gql(
issuer: $issuer issuer: $issuer
recipient: $recipient recipient: $recipient
) )
} }
""" """
) )
paramsBuild = { paramsBuild = {
"recipient": recipient, "recipient": recipient,
"issuer": issuer, "issuer": issuer,
"amount": amount, "amount": amount,
"comment": comment "comment": comment
} }
# Send TX document # Send TX document
try: try:
txDoc = str(client.execute(queryBuild, variable_values=paramsBuild))[13:-3].replace('\\n','\n') txDoc = str(client.execute(queryBuild, variable_values=paramsBuild))[13:-3].replace('\\n','\n')
except Exception as e: return txDoc
except Exception as e:
#e = json.dumps(str(e)) #e = json.dumps(str(e))
sys.stderr.write("Echec de la génération du document:\n" + str(e) + "\n") sys.stderr.write("Echec de la génération du document:\n" + str(e) + "\n")
sys.exit(1) sys.exit(1)
# Check document
# print(txDoc) # For debug # Check document
docList = txDoc.splitlines() def checkTXDoc(txDoc):
for i, line in enumerate(docList): docList = txDoc.splitlines()
for i, line in enumerate(docList):
if re.search("Issuers:", line): if re.search("Issuers:", line):
issuerRaw = docList[(i + 1) % len(docList)] issuerRaw = docList[(i + 1) % len(docList)]
if re.search("Outputs:", line): if re.search("Outputs:", line):
@ -68,22 +74,26 @@ for i, line in enumerate(docList):
if re.search("Comment:", line): if re.search("Comment:", line):
commentRaw = line.split(': ', 1)[1] commentRaw = line.split(': ', 1)[1]
if issuerRaw != issuer or int(outAmount) != amount or outPubkey != recipient or commentRaw != comment: 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("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.stderr.write(colored(issuerRaw + " envoi " + outAmount + " vers " + outPubkey + " with comment: " + commentRaw + "\n", "yellow"))
sys.exit(1) sys.exit(1)
else: else:
print("Le document généré est conforme.") print("Le document généré est conforme.")
return True
# sys.exit(0) # For debug
# Sign TX document def signDoc(txDoc):
signature = fmt["64"](sign(txDoc.encode(), get_privkey(dunikey, "pubsec"))[:-len(txDoc.encode())]) # Sign TX document
signedDoc = txDoc + signature.decode() signature = fmt["64"](sign(txDoc.encode(), get_privkey(dunikey, "pubsec"))[:-len(txDoc.encode())])
signedDoc = txDoc + signature.decode()
#print(signedDoc) # For debug return signedDoc
querySign = gql(
def sendTXDoc(signedDoc):
# Build TX document
querySign = gql(
""" """
mutation ($signedDoc: String!){ tx( mutation ($signedDoc: String!){ tx(
rawTx: $signedDoc rawTx: $signedDoc
@ -92,21 +102,29 @@ querySign = gql(
issuers issuers
outputs outputs
} }
} }
""" """
) )
paramsSign = { paramsSign = {
"signedDoc": signedDoc "signedDoc": signedDoc
} }
# Send TX Signed document # Send TX Signed document
try: try:
sentTX = client.execute(querySign, variable_values=paramsSign) client.execute(querySign, variable_values=paramsSign)
print(colored("Transaction effectué avec succès !", "green")) print(colored("Transaction effectué avec succès !", "green"))
except Exception as e: except Exception as e:
sys.stderr.write("Echec de la transaction:\n" + str(e) + "\n") sys.stderr.write("Echec de la transaction:\n" + str(e) + "\n")
sys.exit(1) 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 #print(sentTX) #For debug