diff -r eb04ac3a8327 -r 3f4bdea2abbf iro/model/user.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/model/user.py Thu Sep 27 17:15:46 2012 +0200 @@ -0,0 +1,74 @@ +# Copyright (c) 2012 netzguerilla.net +# +# This file is part of Iro. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# #Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from twisted.internet import defer +try: + from inspect import getcallargs +except ImportError: + from ..inspect_getcallargs import getcallargs + +from decorator import decorator + +from .schema import User +from .dbdefer import dbdefer + +from ..validate import validate, vHash +from ..error import UserNotFound, InterfaceException + + +@validate(kwd="apikey", func=vHash, minlength=15, maxlength=15) +@dbdefer +def getuser(session, apikey): + """Returns a valid user object. + + :param session: a valid session object (is created by decorator :func:`iro.model.dbdefer.dbdefer`) + :param string apikey: a vaild apikey (only [0-9a-f] is allowed) + :return: a :class:`iro.model.schema.User` object + :raises: :exc:`iro.error.UserNotFound` + """ + user = session.query(User).filter_by(apikey=apikey).first() + if user is None: + raise UserNotFound() + else: + return user + +@decorator +def vUser(f,*args,**kargs): + """A Decorator to verify the apikey and execute the function with a valid :class:`iro.model.schema.User` instead of the apikey. + + The decorator expect the apikey in the **user** parameter. + + :return: a defer + """ + kp=getcallargs(f,*args,**kargs) + try: + apikey = kp["user"] + except KeyError: + raise InterfaceException() + + def _gotResult(_user): + kp["user"]=_user + e = defer.maybeDeferred(f,**kp) + return e + d = defer.maybeDeferred(getuser, apikey=apikey) + return d.addCallback(_gotResult) + +