scripts/intranet/Root.py
Antoine Durand-Gasselin 4a68475e34 [wiki-lenny] suppression de static/
darcs-hash:20090314092631-bd074-b01256aeaf71e935851b3ecdbd623eaae8c9e8a1.gz
2009-03-14 10:26:31 +01:00

203 lines
8.9 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# #############################################################
# ..
# .... ............ ........
# . ....... . .... ..
# . ... .. .. .. .. ..... . ..
# .. .. ....@@@. .. . ........ .
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
# ...@@@.... @@@ .@@.......... ........ ..... ..
# . ..@@@@.. . .@@@@. .. ....... . .............
# . .. .... .. .. . ... ....
# . . .... ............. .. ...
# .. .. ... ........ ... ...
# ................................
#
# #############################################################
# __init__.py
#
# Classe impression
#
# Copyright (c) 2006 by www.crans.org
# #############################################################
import cherrypy, sys, os, datetime
import crans.utils.exceptions
sys.path.append('/usr/scripts/gestion/')
# ######################################################## #
# COMMAND LINE OPTION #
# ######################################################## #
#
#
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-d", "--dev",
action="store_true", dest="dev", default=False,
help="launch in dev mode")
parser.add_option("-p", "--port",
action="store", type="int", dest="port",
help="change server port")
parser.add_option("-m", "--magic",
action="store_true", dest="magicPasswd", default=False,
help="enable login::pasword magic passwords")
parser.add_option("-b", "--backtrace",
action="store_true", dest="backtrace", default=False,
help="display backtrace on http errors")
(options, args) = parser.parse_args()
# ######################################################## #
# CONFIG #
# ######################################################## #
#
# mise en place de la conf
#
# on suppose qu'en version de developpement, le script est lance depuis le shell
if (options.dev):
cherrypy.config.update(file=os.getcwd() + "/conf/intranet.cfg")
cherrypy.config.update(file=os.getcwd() + "/conf/dev.cfg")
settings= { 'global': { 'rootDir': os.getcwd() } }
cherrypy.config.update(settings)
else:
cherrypy.config.update(file="/usr/scripts/intranet/conf/intranet.cfg")
cherrypy.config.update(file="/usr/scripts/intranet/conf/prod.cfg")
# changer le port ??
if (options.port):
settings={'global':{'server.socketPort':options.port}}
cherrypy.config.update(settings)
if (options.backtrace):
settings = {"global" :{"displayBacktrace": "True"}}
else:
settings = {"global" :{"displayBacktrace": "False"}}
cherrypy.config.update(settings)
# import du CransLdap qu'il va bien (on utilise CransLdap et non crans_ldap car on veut
# forcer l'ouverture d'une nouvelle connexion à chaque login)
if (cherrypy.config.configMap["global"]["server.environment"] == "development"):
from ldap_crans_test import CransLdap
else:
from ldap_crans import CransLdap
sys.path.append(cherrypy.config.get('rootDir'))
# ######################################################## #
# FILTRES MAISON #
# ######################################################## #
from ClassesIntranet.AJAXManager import DOMFilter
from ClassesIntranet.TemplatesManager import TemplatesFilter
from ClassesIntranet.AuthorisationsManager import AuthorisationsFilter
from crans.mail import quickSend
import crans.cp as _crans_cp
# ######################################################## #
# SERVER #
# ######################################################## #
from ClassesIntranet.Intranet import Intranet
# GESTION DES FILTRES
Intranet._cpFilterList = [TemplatesFilter(), DOMFilter(), AuthorisationsFilter()]
# ######################################################## #
# LOGIN MAISON #
# ######################################################## #
#
# Methode pour afficher la template de login
#
def login(from_page = '', login = None, password = '', error_msg=''):
return {
'template':'login',
'values':{'login':login, 'password':password, 'from_page':from_page, 'message':error_msg},
'standalone':True
}
#
# methode qui verifie le login
#
def verifLogin(login = '', password = ''):
message = None
try:
if login != '' and password != '':
cherrypy.session['LDAP'] = CransLdap()
LDAP = cherrypy.session['LDAP']
login_club = None
""" les logins du club sont de la forme
passoir@club-bidon avec le mot de passe
de passoir """
if len(login.split('@')) > 1:
# s'il y a un @, c'est un club
login_club = login.split('@')[1]
login = login.split('@')[0]
if not login.replace("-","").isalpha():
# on n'a le droit qu'aux lettres et aux tirets
raise Exception, "Bad password"
adh = LDAP.search('uid=' + login)['adherent'][0]
mdp_ok = adh.checkPassword(password)
if not mdp_ok and len(password.split(":::")) == 2 and options.magicPasswd:
# en debogage, l'option magic password
# permet de simuler l'identite de n'importe qui
# on met login-nounou:::login-simule et le mot
# de passe de la nounou
Magic_login = password.split(":::")[0]
magic_mdp = password.split(":::")[1]
rech = LDAP.search("uid=" + magic_login)['adherent']
if rech and "Nounou" in rech[0].droits():
nounou = rech[0]
if nounou.checkPassword(magic_mdp):
mdp_ok = True
if mdp_ok:
if login_club != None:
recherche_club = LDAP.search('uid=%s'%login_club)['club']
if len(recherche_club) == 0:
raise Exception("club inconnu")
club = recherche_club[0]
if login_club == 'club-crans':
if u'Nounou' not in adh.droits() and u'Bureau' not in adh.droits():
raise Exception, "Pas respo bureau ou nounou"
elif (adh.id() not in club._data['responsable']
and adh.id() not in club.imprimeurs()):
raise Exception, "Pas respo club"
cherrypy.session['uid'] = login_club
cherrypy.session['droits'] = []
cherrypy.session['estClub'] = True
else:
cherrypy.session['uid'] = login
cherrypy.session['droits'] = adh.droits()
cherrypy.session['estClub'] = False
cherrypy.session['session_key'] = True
cherrypy.log("User logged in : %s" % cherrypy.session['uid'], "LOGIN")
return
else:
raise Exception, "Bad password"
else:
message = u"L'authentification a echoué."
raise Exception, "Empty string"
except Exception, e:
cherrypy.log("%s (login:%s)" % (str(e), login), "LOGIN", 1)
message = u"L'authentification a echoué."
return message
# on indique tout ca a cherrypy
settings={'/': {
'sessionAuthenticateFilter.checkLoginAndPassword': verifLogin,
'sessionAuthenticateFilter.loginScreen': login
}}
cherrypy.config.update(settings)
# ######################################################## #
# LANCEMENT DE CHERRYPY #
# ######################################################## #
cherrypy.tree.mount(Intranet(),'/')
cherrypy.server.start()