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")
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"]'%(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 ? "))
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\""
-