+# -*- coding: utf-8 -*-
+
+import web
+from web import form
+from db import User
+
+def get_user(authuser=''):
+ '''
+ Devuelve el usuario autenticado
+ '''
+ session = web.ctx.session
+ orm = web.ctx.orm
+ user = None
+ if not authuser:
+ authuser = session.get('username', '')
+ if authuser:
+ user = orm.query(User).filter(User.name == authuser).one()
+
+ return user
+
+# decorators
+
+def authenticated(function):
+ '''
+ Si es un usuario autenticado permite el acceso al recurso, sino
+ redirige a /login
+ '''
+ session = web.ctx.session
+ def decorated(*args, **kwargs):
+ if session.get('username', ''):
+ return function(*args, **kwargs)
+ else:
+ raise web.seeother('/login')
+
+ return decorated
+
+
+class Login:
+ vname = form.regexp("\w*$", 'Alphanumeric only')
+ vpass = form.regexp(r".{3,20}", 'Must be between 3 and 20 chars')
+
+ logform = form.Form(
+ form.Textbox("username", vname, description="User"),
+ form.Password("password", vpass, description="Password"),
+ )
+ def GET(self, *args):
+ return web.ctx.render.login(self.logform())
+
+ def POST(self, *args):
+ orm = web.ctx.orm
+ session = web.ctx.session
+
+ lform = self.logform()
+ if not lform.validates():
+ return web.ctx.render.login(lform)
+
+ values = web.input()
+ name = values['username']
+ pwd = values['password']
+
+ query = orm.query(User).filter(User.name == name)
+ # si no existe se crea
+ if not query.count():
+ u = User(name, pwd)
+ orm.add(u)
+
+ user = query.one()
+ if user.auth(pwd):
+ session.username = name
+ raise web.seeother('/index')
+ else:
+ # hack
+ lform.username.note = 'wrong password'
+ return web.ctx.render.login(lform)
+
+
+class Logout:
+ @authenticated
+ def GET(self):
+ web.ctx.session.username = ''
+ raise web.seeother('/index')
+
+