X-Git-Url: http://gitweb.pimeys.fr/?p=NK2015_Client_Python_Alpha.git;a=blobdiff_plain;f=client.py;h=1537ba43d4ac9c7f6babdc6a8b9612ef7ddb62af;hp=50da2402fc4a8b22c2c6b0625c6d79e8f0aaaca9;hb=HEAD;hpb=6127ae01609030b226eacc3f1aa72ee0a817e99d diff --git a/client.py b/client.py index 50da240..1537ba4 100755 --- a/client.py +++ b/client.py @@ -19,15 +19,26 @@ from pprint import pprint sys.path.append(client_config.rsa_path) import monRSA -def full_read(sock): - """Lit sur la socket jusqu'à ce que l'output soit déJSON-izable""" - output="" - while True: - output+=sock.read() - try: - return json.loads(output) - except: - pass +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: @@ -57,22 +68,25 @@ 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",[["all"],["all"],true]]') + a.write('["login", ["toto","plop","bdd",[[],[],false]]]') else: - a.write('login ["%s","%s","%s",[["all"],["all"],true]]'%(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)) + a.write('["search", %s]' % (term)) return lit(a) def lit(socket): @@ -84,9 +98,33 @@ def lit(socket): print obj["errmsg"] return obj["msg"] except ssl.SSLError: - return "Rien à lire" - except ValueError: - return "Serveur mort ?" + 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 ?") @@ -96,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\"" -