]> gitweb.pimeys.fr Git - NK2015_Client_Python_Alpha.git/blob - client.py
Nouveau protocole
[NK2015_Client_Python_Alpha.git] / client.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # Définition des fonctions de base de communication du client
5 # Pour l'instant ce script sert essentiellement à les charger en mémoire pour les utiliser à la main
6
7 import os, sys, string, time, random
8 import socket, ssl
9 import threading
10
11 import json
12 import hashlib
13
14 import client_config
15 reload(client_config)
16
17 from pprint import pprint
18
19 sys.path.append(client_config.rsa_path)
20 import monRSA
21
22 class DeadServer(Exception):
23 pass
24
25 def full_read(sock):
26 """Lit sur la socket jusqu'à ce que l'output soit déJSON-izable"""
27 output=""
28 i = 0
29 while True:
30 output+=sock.read()
31 i += 1
32 try:
33 return json.loads(output)
34 except:
35 pass
36 if i==10 and output=="":
37 raise DeadServer
38
39 def connect(sock,where,port=None):
40 if port==None:
41 port=client_config.port
42 try:
43 ip={"ici":"localhost","vent":"vent.crans.org","eva":"eva.crans.org","cerebro":"cerebro.crans.org"}[where]
44 except:
45 ip=where
46 sock.connect((ip,port))
47 return ssl.wrap_socket(sock,ca_certs=client_config.ca_certfile)
48 # cert_reqs=ssl.CERT_NONE,ciphers="AES256-SHA")
49
50 def checkidentity(a):
51 c=a.getpeercert()
52 print c
53 c=dict([i[0] for i in c["subject"]])
54 awaited={'commonName': u'note.crans.org',
55 'countryName': u'FR',
56 'emailAddress': u'legallic@crans.org',
57 'localityName': u'Cachan',
58 'organizationName': u'BDE ENS Cachan',
59 'organizationalUnitName': u'Kfet',
60 'stateOrProvinceName': u'\xc3\x8ele de France'}
61 if all([c[cle]==awaited[cle] for cle in awaited.keys()]):
62 return
63 else:
64 raise KeyboardInterrupt("Imposteur !")
65
66 def hello(socket,version):
67 socket.send('["hello", "%s"]' % (version))
68 return lit(a)
69
70 def login(socket,user,mdp="",typ="bdd"):
71 if user in ["20-100","moibdd","#1"]:
72 a.write('["login", ["#1","plop","bdd",[[],[],false]]]')
73 elif user in ["vincent","moi"]:
74 a.write('["login", ["vincent","plop","special",[]]]')
75 elif user in ["toto"]:
76 a.write('["login", ["toto","plop","bdd",[[],[],false]]]')
77 else:
78 a.write('["login", ["%s","%s","%s",[[],[],false]]]'%(user,mdp,typ))
79 return lit(a)
80
81 def search(socket,term):
82 a.write('["search", %s]' % (term))
83 return lit(a)
84
85 def lit(socket):
86 try:
87 obj=full_read(socket)
88 if obj["retcode"]==0:
89 return obj['msg']
90 else:
91 print obj["errmsg"]
92 return obj["msg"]
93 except ssl.SSLError:
94 print "Rien à lire"
95 except DeadServer:
96 print "Serveur down ?"
97
98 if __name__=="__main__":
99 where=raw_input("quel serveur ?")
100 #port=int(raw_input("port ? "))
101 a=socket.socket()
102 a=connect(a,where)
103 a.settimeout(2)
104 #checkidentity(a)
105 print hello(a,"Python Client alpha")
106 print login(a,"20-100","plop")
107 print "Socket créée dans la variable \"a\""
108