+#!/usr/bin/python
+# -*- coding:utf-8 -*-
+
+# Codé par 20-100
+
+""" Module de Basile pour dialoguer avec la NoteKfet2015 """
+
+import socket
+import json
+import ssl
+
+#: Config de basile
+import config
+
+class NKError(Exception):
+ def __init__(self,msg):
+ Exception.__init__(self)
+ self.msg=msg
+ def __str__(self):
+ return str(self.msg)
+ def __unicode__(self):
+ return unicode(self.msg)
+
+class NKRefused(NKError):
+ pass
+
+class NKHelloFailed(NKError):
+ pass
+
+class NKUnknownError(NKError):
+ pass
+
+def connect():
+ sock=socket.socket()
+ try:
+ # On établit la connexion sur port 4242
+ sock.connect((config.nk_server, config.nk_port))
+ # On passe en SSL
+ sock=ssl.wrap_socket(sock,ca_certs='../keys/ca_.crt')
+ # On fait un hello
+ sock.write('["hello", "Basile"]')
+ # On récupère la réponse du hello
+ out=sock.read()
+ out=json.loads(out)
+ except Exception as exc:
+ # Si on a foiré quelque part, c'est que le serveur est down
+ raise NKRefused(str(exc))
+ if out["retcode"]==0:
+ return sock
+ elif out["retcode"]==11:
+ raise NKHelloFailed(out["errmsg"])
+ else:
+ raise NKUnknownError(out["errmsg"])
+
+
+def login(username,password,typ="bdd"):
+ sock=connect()
+ if typ=="special": # ça c'est pour Basile lui-même
+ masque='[]'
+ elif typ=="bdd":
+ masque='[[], [], true]'
+ try:
+ # Basile a un compte special user
+ commande='["login", [%s,%s,"%s",%s]]'%(json.dumps(username),json.dumps(password),typ,masque)
+ sock.write(commande)
+ out=sock.read()
+ except Exception as exc:
+ # Si on a foiré quelque part, c'est que le serveur est down
+ raise NKRefused(str(exc))
+ # On vérifie ensuite que le login
+ return json.loads(out),sock
+