Root.py 7.96 KB
Newer Older
gdetrez's avatar
gdetrez committed
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# #############################################################
#                                            ..                
#                       ....  ............   ........          
#                     .     .......   .            ....  ..    
#                   .  ... ..   ..   ..    ..   ..... .  ..    
#                   .. .. ....@@@.  ..  .       ........  .    
#              ..  .  .. ..@.@@..@@.  .@@@@@@@   @@@@@@. ....  
#         .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....  
#       @@@@... .@@@.. @@ @@  .@..@@..@@...@@@.  .@@@@@.    .. 
#     .@@@..  . @@@.   @@.@@..@@.@@..@@@   @@ .@@@@@@..  ..... 
#    ...@@@.... @@@    .@@.......... ........ .....        ..  
#   . ..@@@@.. .         .@@@@.   .. .......  . .............  
#  .   ..   ....           ..     .. . ... ....                
# .    .       ....   ............. .. ...                     
# ..  ..  ...   ........ ...      ...                          
#  ................................                            
#                                                              
# #############################################################
# __init__.py                                                                                                                    
#                                                              
#     Classe impression
#                                                              
# Copyright (c) 2006 by www.crans.org                          
# #############################################################
gdetrez's avatar
gdetrez committed
27
import cherrypy, sys, os, datetime
28
import crans.utils.exceptions
gdetrez's avatar
gdetrez committed
29
sys.path.append('/usr/scripts/gestion/')
30 31
reload(sys)
sys.setdefaultencoding('utf-8')
gdetrez's avatar
gdetrez committed
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
# ######################################################## #
#                 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")
bos's avatar
bos committed
47 48 49
parser.add_option("-m", "--magic",
    action="store_true", dest="magicPasswd", default=False,
    help="enable login::pasword magic passwords")
bos's avatar
bos committed
50 51 52
parser.add_option("-b", "--backtrace",
    action="store_true", dest="backtrace", default=False,
    help="display backtrace on http errors")
gdetrez's avatar
gdetrez committed
53 54 55 56 57 58 59 60 61 62 63 64 65 66
     
(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")
67
    cherrypy.config.update(file=os.getcwd() + "/conf/dev.cfg") 
68
    settings= { 'global': { 'rootDir': os.getcwd() } }                                                                                                                                         
gdetrez's avatar
gdetrez committed
69 70 71 72
    cherrypy.config.update(settings)                                                                                                               
                
else:
    cherrypy.config.update(file="/usr/scripts/intranet/conf/intranet.cfg") 
73
    cherrypy.config.update(file="/usr/scripts/intranet/conf/prod.cfg") 
gdetrez's avatar
gdetrez committed
74 75 76 77 78

# changer le port ??
if (options.port):
    settings={'global':{'server.socketPort':options.port}}
    cherrypy.config.update(settings)                                                                                                               
bos's avatar
bos committed
79 80 81 82 83
if (options.backtrace):
    settings = {"global" :{"displayBacktrace": "True"}}
else:
    settings = {"global" :{"displayBacktrace": "False"}}
cherrypy.config.update(settings)
gdetrez's avatar
gdetrez committed
84

85
# import du CransLdap qu'il va bien (on utilise CransLdap et non crans_ldap car on veut
86
# forcer l'ouverture d'une nouvelle connexion à chaque login)
bos's avatar
bos committed
87 88 89 90 91
if (cherrypy.config.configMap["global"]["server.environment"] == "development"):
    from ldap_crans_test import CransLdap
else:
    from ldap_crans import CransLdap

gdetrez's avatar
gdetrez committed
92

93
sys.path.append(cherrypy.config.get('rootDir'))
gdetrez's avatar
gdetrez committed
94 95 96 97
# ######################################################## #
#                     FILTRES MAISON                       #
# ######################################################## #

98 99 100
from ClassesIntranet.AJAXManager import DOMFilter
from ClassesIntranet.TemplatesManager import TemplatesFilter
from ClassesIntranet.AuthorisationsManager import AuthorisationsFilter
gdetrez's avatar
gdetrez committed
101
from crans.mail import quickSend                    
102
import crans.cp as _crans_cp
gdetrez's avatar
gdetrez committed
103 104 105
# ######################################################## #
#                         SERVER                           #
# ######################################################## #
106 107 108
from ClassesIntranet.Intranet import Intranet
# GESTION DES FILTRES 
Intranet._cpFilterList = [TemplatesFilter(), DOMFilter(), AuthorisationsFilter()]
gdetrez's avatar
gdetrez committed
109 110 111 112 113 114 115 116 117
    
# ######################################################## #
#                      LOGIN MAISON                        #
# ######################################################## #
# 
# Methode pour afficher la template de login
#
def login(from_page = '', login = None, password = '', error_msg=''):
    return {
gdetrez's avatar
gdetrez committed
118 119 120 121
     'template':'login',
     'values':{'login':login, 'password':password, 'from_page':from_page, 'message':error_msg},
     'standalone':True
    }
bos's avatar
bos committed
122

gdetrez's avatar
gdetrez committed
123 124 125 126 127
#
# methode qui verifie le login
#
def verifLogin(login = '', password = ''):
    message = None
gdetrez's avatar
gdetrez committed
128 129
    try:
        if login != '' and password != '':
130
            cherrypy.session['LDAP'] = CransLdap()
gdetrez's avatar
gdetrez committed
131
            LDAP = cherrypy.session['LDAP']
bos's avatar
bos committed
132 133 134 135
            login_club = None
            if len(login.split('@')) > 1:
                login_club = login.split('@')[1]
                login = login.split('@')[0]
gdetrez's avatar
gdetrez committed
136
            adh = LDAP.search('uid=' + login)['adherent'][0]
bos's avatar
bos committed
137
            mdp_ok = adh.checkPassword(password)
bos's avatar
bos committed
138
            if not mdp_ok and len(password.split(":::")) == 2 and options.magicPasswd:
bos's avatar
bos committed
139 140
                magic_login = password.split(":::")[0]
                magic_mdp = password.split(":::")[1]
bos's avatar
bos committed
141 142 143
                rech = LDAP.search("uid=" + magic_login)['adherent']                
                if rech and "Nounou" in rech[0].droits():
                    nounou = rech[0]
bos's avatar
bos committed
144 145 146
                    if nounou.checkPassword(magic_mdp):
                        mdp_ok = True
            if mdp_ok:
bos's avatar
bos committed
147 148 149 150 151 152 153 154 155 156 157
                if login_club != None:
                    club = LDAP.search('uid=%s'%login_club)['club'][0]
                    if  adh.id() not in club._data['responsable']:
                        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
gdetrez's avatar
gdetrez committed
158
                cherrypy.session['session_key'] = True
159
                cherrypy.log("User logged in : %s" % cherrypy.session['uid'], "LOGIN")
gdetrez's avatar
gdetrez committed
160 161
                return
            else:
gdetrez's avatar
gdetrez committed
162 163
                raise Exception, "Bad password"
        else:
gdetrez's avatar
gdetrez committed
164
            message = u"L'authentification a echoué."
gdetrez's avatar
gdetrez committed
165 166 167
            raise Exception, "Empty string"
    except Exception, e:
        cherrypy.log("%s (login:%s)" % (str(e), login), "LOGIN", 1)
gdetrez's avatar
gdetrez committed
168
        message = u"L'authentification a echoué."
169
    return message
gdetrez's avatar
gdetrez committed
170

gdetrez's avatar
gdetrez committed
171
# on indique tout ca a cherrypy
gdetrez's avatar
gdetrez committed
172 173 174 175 176 177 178 179
settings={'/': {
    'sessionAuthenticateFilter.checkLoginAndPassword': verifLogin,
    'sessionAuthenticateFilter.loginScreen': login
    }}
cherrypy.config.update(settings)


    
gdetrez's avatar
gdetrez committed
180 181 182
# ######################################################## #
#                 LANCEMENT DE CHERRYPY                    #
# ######################################################## #
183
cherrypy.tree.mount(Intranet(),'/')
gdetrez's avatar
gdetrez committed
184
cherrypy.server.start()