]> gitweb.pimeys.fr Git - NK2015_Client_Python_Alpha.git/blobdiff - client.py
Fonctions pour batch-(dé)valider des transactions
[NK2015_Client_Python_Alpha.git] / client.py
index 75446e67dbac7502e473e8edd0b16df95317dfe4..1537ba43d4ac9c7f6babdc6a8b9612ef7ddb62af 100755 (executable)
--- a/client.py
+++ b/client.py
@@ -19,10 +19,34 @@ from pprint import pprint
 sys.path.append(client_config.rsa_path)
 import monRSA
 
-def connect(sock,where="cerebro",port=None):
+def full_read(socket):
+    """Lit un message complet sur la socket."""
+    # On récupère d'abord la taille du message
+    length_str = ''
+    char = socket.recv(1)
+    while char != '\n':
+        length_str += char
+        char = socket.recv(1)
+    total = int(length_str)
+    # On utilise une memoryview pour recevoir les données chunk par chunk efficacement
+    view = memoryview(bytearray(total))
+    next_offset = 0
+    while total - next_offset > 0:
+        recv_size = socket.recv_into(view[next_offset:], total - next_offset)
+        next_offset += recv_size
+    try:
+        msg = json.loads(view.tobytes())
+    except (TypeError, ValueError) as e:
+        raise NKNotJson("L'objet reçu n'est pas un JSON")
+    return msg
+
+def connect(sock,where,port=None):
     if port==None:
         port=client_config.port
-    ip={"ici":"localhost","vent":"vent.crans.org","eva":"eva.crans.org","cerebro":"cerebro.crans.org"}[where]
+    try:
+        ip={"ici":"localhost","vent":"vent.crans.org","eva":"eva.crans.org","cerebro":"cerebro.crans.org"}[where]
+    except:
+        ip=where
     sock.connect((ip,port))
     return ssl.wrap_socket(sock,ca_certs=client_config.ca_certfile)
 #              cert_reqs=ssl.CERT_NONE,ciphers="AES256-SHA")
@@ -44,54 +68,64 @@ def checkidentity(a):
         raise KeyboardInterrupt("Imposteur !")
 
 def hello(socket,version):
-    socket.send('hello "%s"'%(version))
+    socket.send('["hello", "%s"]' % (version))
     return lit(a)
 
 def login(socket,user,mdp="",typ="bdd"):
-    if user in ["20-100","moibdd"]:
-        a.write('login ["20-100","plop","bdd",[["all"],["all"],true]]')
+    if user in ["#1", "test"]:
+        a.write('["login", ["#1","plop","bdd",[[],[],false]]]')
     elif user in ["vincent","moi"]:
-        a.write('login ["vincent","plop","special",["all"]]')
+        a.write('["login", ["vincent","plop","special",[]]]')
     elif user in ["toto"]:
-        a.write('login ["toto","plop","bdd"]')
+        a.write('["login", ["toto","plop","bdd",[[],[],false]]]')
     else:
-        a.write('login ["%s","%s","%s"]'%(user,mdp,typ))
+        a.write('["login", ["%s","%s","%s",[[],[],false]]]'%(user,mdp,typ))
+    if mdp == "":
+        import getpass
+        mdp = getpass.getpass()
     return lit(a)
     
 def search(socket,term):
-    a.write("search %s"%(term))
-    return json.loads(a.read())
+    a.write('["search", %s]' % (term))
+    return lit(a)
 
 def lit(socket):
     try:
-        t=a.read(4096)
-        obj=json.loads(t)
+        obj=full_read(socket)
         if obj["retcode"]==0:
           return obj['msg']
         else:
           print obj["errmsg"]
           return obj["msg"]
     except ssl.SSLError:
-        return "Rien à lire"
-    except ValueError:
-        return "Serveur mort ?"
-
-def challenge(a):
-    _,pub=monRSA.litcles(None,client_config.server_rsa_pub_key)
-    chall=str(time.time())
-    chall+="".join(["azertyuiopqsdfghjklmwxcvbn"[random.randrange(0,26)] for i in range(20)])
-    coded=monRSA.crypte(chall,pub)
-    a.send('challenge "%s"'%(coded))
-    a.setblocking(True)
-    result=a.read()
-    a.settimeout(0.5)
-    if json.loads(result)==chall:
-        print "Recognized"
-    elif json.loads(result)==u"Challenge tenté il y a moins de 10 minutes ! =p":
-        print "Top tôt. Réessaye plus tard."
-    else:
-        print "Imposteur !"
-    
+        print "Rien à lire"
+
+def do(stuff):
+    """Dirty, 'cause I'm lazy."""
+    global a
+    a.write(json.dumps(stuff))
+
+
+# Shortcuts
+def _toggle_transactions(l, action="valider"):
+    """(Dé)valide plein de transactions si on lui donne la liste d'ids."""
+    global a
+    for i in l:
+        assert isinstance(i, int)
+        print i,
+        do(["%s_transaction" % (action,), i])
+        out = lit(a)
+        if out:
+            print out
+
+def cancel_transactions(l):
+    """Annule plein de transactions. Mange une liste d'ids de transactions."""
+    _toggle_transactions(l, action="devalider")
+
+def validate_transactions(l):
+    """Valide plein de transactions. Mange une liste d'ids de transactions."""
+    _toggle_transactions(l, action="valider")
+
 if __name__=="__main__":
     where=raw_input("quel serveur ?")
     #port=int(raw_input("port ? "))
@@ -100,6 +134,14 @@ if __name__=="__main__":
     a.settimeout(2)
     #checkidentity(a)
     print hello(a,"Python Client alpha")
-    print login(a,"20-100","plop")
+    try:
+        import secrets
+        user = secrets.user
+        password = secrets.password
+    except ImportError:
+        print "Vous pouvez enregistrer votre mot de passe dans la variable password dans secrets.py !"
+        user = raw_input("username:")
+        import getpass
+        password = getpass.getpass("password:")
+    print login(a, user, password)
     print "Socket créée dans la variable \"a\""
-