Modules paths now are resolved with regular expresions.
[kisspi.git] / login.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 '''
5 This controller implements:
6     /login
7     /logout
8     /register
9 '''
10
11 import random
12 import web
13 from web import form
14 from utils import authenticated, templated, flash
15
16 import gecoc.gecolib as gecolib
17
18 session = web.ses
19
20 vname = form.regexp("\w*$", 'Debe ser Alphanumerico')
21 vpass = form.regexp(r".{3,20}", 'Debe estar entre 3 y 20 caracteres')
22
23 form_login = form.Form(
24     form.Textbox("username", vname, description="Usuario"),
25     form.Password("password", vpass, description="Contraseña"),
26 )
27
28 def generate_reg_form(op1, op2):
29     form_reg = form.Form(
30         form.Textbox("rusername", vname, description="Usuario"),
31         form.Password("rpassword", vpass, description="Contraseña"),
32         form.Password("password2", description="Confirmación de contraseña"),
33         form.Textbox("captcha", description="captcha %s + %s = " % (op1, op2)),
34         validators = [
35             form.Validator("Las contraseñas no coinciden",
36                 lambda i: i.rpassword == i.password2),
37             form.Validator("No sabes sumar? Usa la calculadora si eso...",
38                 lambda i: int(i.captcha) == op1 + op2),
39             ])
40     return form_reg
41
42 class login:
43     render = web.template.render('templates')
44
45     @templated(css='style',
46             js='jquery-1.3.1.min login',
47             title='GECO Web Client')
48     def GET(self):
49         lform = form_login()
50         op1 = random.randint(1,10) 
51         op2 = random.randint(1,10)
52         rform = generate_reg_form(op1, op2)
53         session.rform = (op1, op2)
54
55         return self.render.login(lform, rform)
56
57     @templated(css='style', 
58             js='jquery-1.3.1.min login',
59             title='GECO Web Client')
60     def POST(self):
61         lform = form_login()
62         if not lform.validates():
63             return self.render.login(form_login=lform)
64
65         values = web.input()
66         name = values['username']
67         pwd = values['password']
68
69         gso = gecolib.GSO(xmlrpc_server=web.SERVER)
70         gso.auth(name, pwd)
71         
72         if gso.name:
73             session.username = name
74             session.gso = gso.cookie
75         else:
76             flash("Usuario o contraseña incorrectos", "error")
77             raise web.seeother('/login')
78
79         raise web.seeother('/index')
80
81 class logout:
82     @authenticated
83     def GET(self):
84         username = session.get('username', '')
85         session.username = ''
86         cookie = session.get('gso', '')
87         gso = gecolib.GSO(xmlrpc_server=web.SERVER, cookie=cookie)
88         gso.logout()
89         session.gso = ''
90         flash("Usuario desautenticado")
91         raise web.seeother('/index')
92
93 class register:
94     render = web.template.render('templates')
95
96     @templated(css='style', title='GECO Web Client')
97     def POST(self):
98         rform = generate_reg_form(*session.rform)
99         if not rform:
100             raise web.seeother('/login')
101
102         if not rform.validates():
103             return self.render.login(form_reg=rform)
104         else:
105             gso = gecolib.GSO(xmlrpc_server=web.SERVER)
106
107             values = web.input()
108             name = values['rusername']
109             pwd = values['rpassword']
110
111             if gso.check_user_name(name):
112                 errors = [u"%s no está disponible" % name]
113                 flash(errors, 'error')
114                 return self.render.login(form_reg=rform)
115             else:
116                 gso.register(name, pwd)
117
118             flash([u"Registrado con exito %s" % name])
119             raise web.seeother("/login")