Commit 573798c2 authored by Vincent Le gallic's avatar Vincent Le gallic

On conserve les sockets de connexion au serveur NK2015 dans keep_alive, qui...

On conserve les sockets de connexion au serveur NK2015 dans keep_alive, qui fonctionne grâce à la magie noire de django et la fonction django.utils.importlib.import_module.
parent 352bf33d
......@@ -31,7 +31,8 @@ import os, shutil
import base64
import threading
from django.utils.importlib import import_module
keep_alive = import_module('keep_alive')
"""Génération d'erreurs/warnings/success messages.
......@@ -174,14 +175,12 @@ def login_NK(request, username, password, masque=[[], [], False]):
"full_link": "/note/%s/" % p[1],
})
request.session["pages"] = save_pages
# on récupère un cookie pour pouvoir "rouvrir" cette connexion plus tard
sock.write(json.dumps(["get_cookie"]))
out = full_read(sock)
request.session["cookie"] = out["msg"]
sock.write(json.dumps(["whoami"]))
out = full_read(sock)
whoami = out["msg"]
request.session["whoami"] = whoami
# On conserve la connexion au serveur NK2015
keep_alive.CONNS[whoami["idbde"]] = sock
return HttpResponseRedirect('/note/index/')
else:
_add_error(request, errmsg)
......@@ -191,25 +190,36 @@ def login_NK(request, username, password, masque=[[], [], False]):
pass
return render_to_response('note/login.html', {'form': form}, context_instance=RequestContext(request))
def login_NK_cookie(request, cookie):
"""Ouvre une connection au serveur NK2015, et récupère les droits
de la session grâce au cookie.
En cas de réussite, renvoie (True, <la socket de connexion>).
En cas d'échec, renvoie (False, <un objet HttpResponse prêt à l'emploi>)."""
form = LoginForm(label_suffix=" :")
def _get_socket(request, idbde):
"""Récupère la socket dans keep_alive ou bien renvoie un redirect de fallback."""
if keep_alive.CONNS.has_key(idbde):
return (True, keep_alive.CONNS[idbde])
else:
_add_error(request, settings.ERRMSG_NOSOCKET)
return (MyHttpResponseRedirect(settings.NOTE_LOGIN_URL), None)
def socket_still_alive(request):
"""Récupère dans keep_alive la socket de communication avec le serveur NK2015
et vérifie que la session est toujours active.
* En cas de réussite, renvoie ``(True, <la socket de connexion>)``.
* En cas d'échec, renvoie ``(False, <un objet HttpResponse prêt à l'emploi>)``."""
idbde = request.session["whoami"]["idbde"]
gotit, sock = _get_socket(request, idbde)
try:
sock = connect_NK()
sock.write(json.dumps(["connect_cookie", cookie]))
sock.write(json.dumps(["mayi", "alive"]))
out = full_read(sock)
except NKError as exc:
return (False, _gerer_NKError(request, exc, form))
retcode = out["retcode"]
retcode, still_alive = out["retcode"], out["msg"]
if retcode == 0:
# Tout s'est bien passé
return (True, sock)
elif retcode == 1001:
_add_error(request, settings.ERRMSG_NK2015_SESSION_EXPIRED)
return (False, render_to_response('note/login.html', {'form': form}, context_instance=RequestContext(request)))
if still_alive:
return (True, sock)
else:
_add_error(request, settings.ERRMSG_NK2015_SESSION_EXPIRED)
else:
_add_error(request, out["errmsg"])
form = LoginForm(label_suffix=" :")
return (False, render_to_response('note/login.html', {'form': form}, context_instance=RequestContext(request)))
......@@ -244,8 +254,8 @@ def _get_activites(sock, isadmin, request, fallback='/note/index/', computecande
# On détermine si il est possible de supprimer l'activité
# (indépendamment du fait qu'elle contient peut-être des invités, ça ce sera vérifié plus tard)
# On peut supprimer si (on en est respo ET elle est pas validée) OU (on est admin)
liste_activites[i]["candelete"] = isadmin or (liste_activites[i]["responsable"] == whoami["idbde"]
and liste_activites[i]["validepar"] == -100)
liste_activites[i]["candelete"] = isadmin or (liste_activites[i]["responsable"] == whoami["idbde"] and
liste_activites[i]["validepar"] == -100)
return (True, liste_activites)
else:
_add_error(request, out["errmsg"])
......@@ -268,8 +278,8 @@ def _get_activite(sock, idact, request, fallback='/note/activites/', computecand
# On détermine si il est possible de supprimer l'activité
# (indépendamment du fait qu'elle contient peut-être des invités, ça ce sera vérifié plus tard)
# On peut supprimer si (on en est respo ET elle est pas validée) OU (on est admin)
activite["candelete"] = isadmin or (activite["responsable"] == whoami["idbde"]
and activite[i]["validepar"] == -100)
activite["candelete"] = isadmin or (activite["responsable"] == whoami["idbde"] and
activite[i]["validepar"] == -100)
return (True, out["msg"])
def _get_invites(sock, idact, isadmin, request, fallback='/note/activites/'):
......@@ -548,11 +558,11 @@ def login_page(request):
return render_to_response('note/login.html', {'form': form}, context_instance=RequestContext(request))
def standard_page(request, socket=False):
"""Fonction appelées pour générer quasiment toutes les pages (pas login).
Elle établit la communcation avec le serveur NK2015 et fait l'authentification par cookie.
"""Fonction appelée pour générer quasiment toutes les pages (pas login).
Elle récupère la socket dnas keep_alive et vérifie que la session NK2015 n'a pas timeout.
Elle renvoie un booléen de succès puis <la socket avec le seuveur>, <un dico avec déjà des variables pour le template>)
ou un None, <render_to_response d'erreur>
Si socket=False, on n'établit la communication et on renvoie None à la place de la socket."""
Si socket=False, on ne se soucie pas de la socket et on renvoie None à sa place."""
if request.session.get("logged", "no") == "ok":
# Le login a réussi
whoami = request.session["whoami"]
......@@ -560,12 +570,7 @@ def standard_page(request, socket=False):
'whoami': whoami,
}
if socket:
try:
cookie = request.session["cookie"]
except:
_add_error(request, settings.ERRMSG_NOCOOKIE)
return (False, HttpResponseRedirect("/note/"), {})
success, sock_ou_response = login_NK_cookie(request, cookie)
success, sock_ou_response = socket_still_alive(request)
if success:
return (True, sock_ou_response, donnees_standard)
else:
......@@ -1590,10 +1595,18 @@ def inscriptions(request, preid=None, delete=None):
def logout(request):
"""Fonction de déconnexion"""
# on enlève logged du cookie
# on enlève logged du cookie Django
request.session["logged"] = "no"
if request.session.has_key("cookie"):
del request.session["cookie"]
# Il faut fermer la socket
idbde = request.session["whoami"]["idbde"]
gotit, sock = _get_socket(request, idbde)
if not gotit:
# Si on n'a pas récupéré la socket, pas besoin de la fermer
# gotit est en fait un MyHttpResponseRedirect de fallback
return gotit
sock.write(json.dumps(["exit"]))
sock.close()
del keep_alive.CONNS[idbde]
# on renvoit sur la page de login
_add_success(request, settings.SUCCMSG_LOGOUT)
return HttpResponseRedirect("/note/")
......@@ -1621,11 +1634,7 @@ def quick_search(request):
asked = request.POST["asked"]
except:
return HttpResponse("")
try:
cookie = request.session["cookie"]
except:
return HttpResponseRedirect("/note/")
success, sock_ou_response = login_NK_cookie(request, cookie)
success, sock_ou_response = socket_still_alive(request)
if success:
sock = sock_ou_response
data = [asked]
......@@ -1647,11 +1656,7 @@ def search(request):
asked = request.POST["asked"]
except:
return HttpResponse("")
try:
cookie = request.session["cookie"]
except:
return HttpResponseRedirect("/note/")
success, sock_ou_response = login_NK_cookie(request, cookie)
success, sock_ou_response = socket_still_alive(request)
if success:
sock = sock_ou_response
flags = "bi" # dans la recherche de base on ne cherhe pas sur les alias et les historiques
......@@ -1674,11 +1679,7 @@ def get_boutons(request):
categorie = request.POST["categorie"]
except:
return HttpResponse("")
try:
cookie = request.session["cookie"]
except:
return HttpResponseRedirect("/note/")
success, sock_ou_response = login_NK_cookie(request, cookie)
success, sock_ou_response = socket_still_alive(request)
if success:
sock = sock_ou_response
data = ["", categorie]
......@@ -1700,11 +1701,7 @@ def do_conso(request):
consodata = [[int(i) for i in triplet.split(",")] for triplet in consodata[1:-1].split("),(")]
except:
return HttpResponse(u'"Bad request"')
try:
cookie = request.session["cookie"]
except:
return HttpResponse(u'"Cookie expiré"')
success, sock_ou_response = login_NK_cookie(request, cookie)
success, sock_ou_response = socket_still_alive(request)
if success:
sock = sock_ou_response
sock.write(json.dumps(["consos", consodata]))
......
......@@ -13,6 +13,7 @@ ADMINS = (
)
NOTE_ROOT_URL = r'/note/'
NOTE_LOGIN_URL = NOTE_ROOT_URL
ROOT_PATH = "/home/note/Django_Client/"
......@@ -176,8 +177,8 @@ LOGGING = {
}
}
# ttl des cookies en secondes
SESSION_COOKIE_AGE=60*100 # 100 minutes
# ttl des cookies Django en secondes
SESSION_COOKIE_AGE = 60*100 # 100 minutes
# Taille max autorisée pour les photos
MAX_PHOTO_SIZE = 870000 # en bytes (850KB)
......@@ -222,8 +223,8 @@ ERRMSG_PREID_INVALID = u'''"%s" n'est pas un identifiant de préinscription vali
ERRMSG_PREID_FAIL = u"La préinscription n°%s n'existe pas."
ERRMSG_DJANGO_SESSION_EXPIRED = u"Ta session Django a expiré, reconnecte-toi."
ERRMSG_NOCOOKIE = u"Ton cookie est inexistant ou invalide."
ERRMSG_NK2015_SESSION_EXPIRED = u"Ton cookie NK2015 est invalide ou a expiré, reconnecte-toi."
ERRMSG_NOSOCKET = u"La connexion avec le serveur NK2015 a été perdue, reconnecte-toi."
ERRMSG_NK2015_SESSION_EXPIRED = u"Ta session NK2015 est invalide ou a expiré, reconnecte-toi."
ERRMSG_PASSWORD_NEGATIVE_IDBDE = u"Mais oui bien sûr…"
ERRMSG_NO_ACL_CHGPASS = u"Tu n'as pas le droit de changer le mot de passe d'un autre compte que le tien."
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment