aboutsummaryrefslogtreecommitdiff
path: root/pyaggr3g470r/views/api/common.py
blob: 872c4ae1be288f480b7b41c6f94e89a97d19e18a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from functools import wraps
from flask import request, g, session, Response, jsonify
from flask.ext.restful import Resource

from pyaggr3g470r import db
from pyaggr3g470r.models import User


class HttpError(Exception):
    pass


def authenticate(func):
    """
    Decorator for the authentication to the web services.
    """
    @wraps(func)
    def wrapper(*args, **kwargs):
        if not getattr(func, 'authenticated', True):
            return func(*args, **kwargs)

        # authentication based on the session (already logged on the site)
        if 'email' in session or g.user.is_authenticated():
            return func(*args, **kwargs)

        # authentication via HTTP only
        auth = request.authorization
        try:
            email = auth.username
            user = User.query.filter(User.email == email).first()
            if user and user.check_password(auth.password) and user.activation_key == "":
                g.user = user
                return func(*args, **kwargs)
        except AttributeError:
            pass

        return Response('<Authentication required>', 401,
                        {'WWWAuthenticate':'Basic realm="Login Required"'})
    return wrapper


def to_response(func):
    def wrapper(*args, **kwargs):
        try:
            res = func(*args, **kwargs)
        except HttpError, error:
            return Response(*error.args)
        if isinstance(res, tuple):
            response = jsonify(**res[0])
            if len(res) > 1:
                response.status_code = res[1]
            return response
        return res
    return wrapper


class PyAggResource(Resource):
    db_cls = None

    def _get_or_raise(self, obj_id=None):
        if obj_id is None:
            raise HttpError({'message': 'No id given'}, 400)
        obj = self.db_cls.query.filter(self.db_cls.id == obj_id).first()
        if obj is None:
            raise HttpError({'message': 'Article not found'}, 404)
        if obj.user_id != g.user.id:
            raise HttpError({'message': "Unauthorized for %s."
                                    % self.db_cls.__class__.__name__}, 403)
        return obj

    def get(self, id=None):
        return {'result': [self._get_or_raise(id).dump()]}

    def delete(self, id):
        """Delete a feed."""
        feed = self._get_or_raise(id)
        db.session.delete(feed)
        db.session.commit()
        return {"message": "ok"}, 204
bgstack15