Ejemplo n.º 1
0
def signup_post(request):
    dbsession = DBSession()
    settings = request.registry.settings
    form = Form(request, schema=schemas.Signup, obj=User())
    if request.POST and form.validate():
        if not validate_csrf(request):
            return HTTPUnauthorized("Not authorized")
        user = form.bind(User())
        user.username = get_username(user.name, dbsession)
        user.password = func.sha1(user.password)

        cookie = facebook.get_user_from_cookie(
            request.cookies, settings["facebook.app.id"], settings["facebook.app.secret"]
        )
        if cookie:
            graph = facebook.GraphAPI(cookie["access_token"])
            profile = graph.get_object("me")
            user.fb_id = profile["id"]
            user.fb_profile_url = profile["link"]
            user.fb_access_token = cookie["access_token"]

        try:
            dbsession.add(user)
            dbsession.commit()
            headers = remember_me_header(request, user.email)
            redirect_url = route_url("create_profile", request)
            request.response_headerlist = headers
            return {"status": 1, "url": redirect_url}
        except IntegrityError:
            return {"errors": {"form": "Invalid Information"}}

    return {"errors": form.errors}
Ejemplo n.º 2
0
def login(request):
    logged_in = authenticated_userid(request)
    if logged_in:
        return HTTPFound(location=route_url("home", request))
    session = DBSession()
    schema = schemas.Login()
    result = {"_csrf_": request.session.get_csrf_token()}
    errors = []
    if request.POST:
        if not validate_csrf(request):
            return HTTPUnauthorized("Not authorized")
        try:
            form_result = schema.to_python(request.params)
            user = (
                session.query(User)
                .filter(and_(User.email == form_result["email"], User.password == func.sha1(form_result["password"])))
                .first()
            )
            if user:
                headers = remember_me_header(request, user.email)
                return HTTPFound(location=route_url("home", request), headers=headers)
            else:
                errors.append("form")
        except validators.Invalid, e:
            errors = e.error_dict
Ejemplo n.º 3
0
 def set_sequence(self, sequence):
     self._sequence = sequence
     self.sha1 = func.sha1(func.upper(sequence))
Ejemplo n.º 4
0
class User(Resource, mixin.Tablename, mixin.TableArgs):
    '''Represent a user.'''

    userid = Column(
        types.CHAR(36), ForeignKey('resource.id'), primary_key=True
    )

    __mapper_args__ = {
        'polymorphic_identity': 'user',
        'inherit_condition': userid == Resource.id
    }

    username = Column(
        Unicode(255), unique=True, nullable=False,
        default=lambda: u'aaa-NEWUSER' + unicode(uuid.uuid1())
    )
    isactive = Column(Boolean, nullable=False, default=False)

    #: Flag indicating a pending details update requirement.
    require_details_update = Column(Boolean, nullable=False, default=False)

    #: Flag indicating a pending password update requirement.
    require_password_update = Column(Boolean, nullable=False, default=False)

    thumbid = sqlalchemy.Column(
        sqlalchemy.CHAR(36),
        sqlalchemy.ForeignKey('component.id'),
        nullable=True
    )
    thumbnail = sqlalchemy.orm.relationship(Component)

    firstname = Column(Unicode(255), default=u'first')
    lastname = Column(Unicode(255), default=u'last')

    email = Column(Unicode(255))

    fullname = 'Name Placeholder'

    apikey = Column(types.CHAR(36), nullable=False)

    password_hash = Column(Unicode(40), nullable=False)
    password_salt = Column(Unicode(40), nullable=False)

    password = HashedProperty(
        'password_hash', 'password_salt',
        # Optional function to enable generating the hash on the db side
        dbhashfunc=(lambda pw, salt: func.sha1(pw + salt))
    )

    typeid = Column(
        types.CHAR(36), ForeignKey('user_type.typeid'),
        default='ac9fa5aa-4361-11e0-b7cc-0019bb4983d8'
    )

    type = relation('UserType', backref=backref('users'))

    tasks = relation(
        'Task', lazy='dynamic', passive_deletes=True, backref=backref(
            'users'
        ),
        primaryjoin=(
            'and_(Appointment.resource_id == User.userid,'
            'Appointment.type == "assignment")'
        ), secondaryjoin='Appointment.context_id == Task.taskid',
        secondary=Appointment.__table__,
        foreign_keys='[Appointment.resource_id, Appointment.context_id]'
    )

    # Extra eagerloaded relation between users and tasks.
    eagerTasks = relation(
        'Task', primaryjoin=(
            'and_(Appointment.resource_id == User.userid,'
            ' Appointment.type == "assignment")'
        ), secondaryjoin='Appointment.context_id == Task.taskid',
        secondary=Appointment.__table__,
        foreign_keys='[Appointment.resource_id, Appointment.context_id]',
        passive_deletes=True
    )

    groups = association_proxy(
        'user_memberships', 'membership_group',
        creator=lambda group: Membership(
            group_id=group.id
        )
    )

    def __init__(self, *args, **kw):
        '''Initialise user.'''
        super(User, self).__init__(*args, **kw)
        self.password = uuid.uuid4().hex
        self.resetApiKey()

    def __repr__(self):
        '''Return representation.'''
        return '<User("{0}")>'.format(self.userid)

    def resetApiKey(self):
        '''Reset user API key.'''
        self.apikey = str(uuid.uuid4())

    @staticmethod
    def getNameOrDefault(user):
        '''Return *user* full name or default value.'''
        return user.getName() if user else 'Unknown user'

    def getName(self):
        '''Return full name for user.'''
        return str(self.firstname) + ' ' + str(self.lastname)

    def getThumbid(self):
        '''Return thumbid or empty string.'''
        return self.thumbid if self.thumbid else ''

    @validates('isactive')
    def validate_isactive(self, key, isactive):
        '''Check license if user is being activated.'''
        if isactive is True:
            license = License()
            canEnable = license.canEnableMoreUsers()

            if not canEnable:
                return False

        return isactive

    @classmethod
    def getFields(cls):
        '''Return fields for model.'''
        secretFields = (
            'password_hash',
            'password_salt',
            'apikey',
            'require_password_update',
            'require_details_update'
        )

        fields = []
        for key in super(User, cls).getFields():
            if key not in secretFields:
                fields.append(key)

        return fields
Ejemplo n.º 5
0
def getInstanceFromUsernamePassword(username, password):

    from dbModel import DbUser
    from sqlalchemy import func
    import db
    session = db.csdb.session
    db_user = session.query(DbUser).filter(DbUser.username == username).filter(DbUser.password == func.sha1(password)).filter(DbUser.active == 1).one()
    return User(db_user.user_id)
Ejemplo n.º 6
0
 def set_sequence(self, sequence):
     self._sequence = sequence
     self.sha1 = func.sha1(func.upper(sequence))