Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / oa2 / backends / djangobackend.py @ 2f8a7c0e

History | View | Annotate | Download (4.5 kB)

1
import astakos.oa2.models as oa2_models
2

    
3
from astakos.oa2.backends import base as oa2base
4
from astakos.oa2.backends import base as errors
5

    
6
from django import http
7
from django.conf import settings
8
from django.core.exceptions import ValidationError
9
from django.core.validators import URLValidator
10
from django.core.urlresolvers import reverse
11
from django.conf.urls.defaults import patterns, url
12
from django.http import HttpResponseNotAllowed
13
from django.views.decorators.csrf import csrf_exempt
14

    
15
from synnefo.lib import join_urls
16

    
17
import logging
18
logger = logging.getLogger(__name__)
19

    
20

    
21
class DjangoViewsMixin(object):
22

    
23
    def auth_view(self, request):
24
        oa2request = self.build_request(request)
25
        oa2response = self.authorize(oa2request, accept=False)
26
        return self._build_response(oa2response)
27

    
28
    @csrf_exempt
29
    def token_view(self, request):
30
        if request.method != 'POST':
31
            return HttpResponseNotAllowed(['POST'])
32

    
33
        oa2request = self.build_request(request)
34
        oa2response = self.grant_token(oa2request)
35
        return self._build_response(oa2response)
36

    
37

    
38
class DjangoBackendORMMixin(object):
39

    
40
    def get_client_by_credentials(self, username, password):
41
        try:
42
            return oa2_models.Client.objects.get(identifier=username,
43
                                                 secret=password)
44
        except oa2_models.Client.DoesNotExist:
45
            raise errors.InvalidClientID("No such client found")
46

    
47
    def get_client_by_id(self, clientid):
48
        try:
49
            return oa2_models.Client.objects.get(identifier=clientid)
50
        except oa2_models.Client.DoesNotExist:
51
            raise errors.InvalidClientID("No such client found")
52

    
53
    def get_authorization_code(self, code):
54
        try:
55
            return oa2_models.AuthorizationCode.objects.get(code=code)
56
        except oa2_models.AuthorizationCode.DoesNotExist:
57
            raise errors.OA2Error("No such authorization code")
58

    
59
    def get_token(self, token):
60
        try:
61
            return oa2_models.Token.objects.get(code=token)
62
        except oa2_models.Token.DoesNotExist:
63
            raise errors.OA2Error("No such token")
64

    
65
    def delete_authorization_code(self, code):
66
        code.delete()
67
        logger.info('%r deleted' % code)
68

    
69
    def delete_token(self, token):
70
        token.delete()
71
        logger.info('%r deleted' % token)
72

    
73
    def check_credentials(self, client, username, secret):
74
        if not (username == client.get_id() and secret == client.secret):
75
            raise errors.InvalidAuthorizationRequest("Invalid credentials")
76

    
77

    
78
class DjangoBackend(DjangoBackendORMMixin, oa2base.SimpleBackend,
79
                    DjangoViewsMixin):
80

    
81
    code_model = oa2_models.AuthorizationCode.objects
82
    token_model = oa2_models.Token.objects
83
    client_model = oa2_models.Client.objects
84

    
85
    def _build_response(self, oa2response):
86
        response = http.HttpResponse()
87
        response.status_code = oa2response.status
88
        response.content = oa2response.body
89
        for key, value in oa2response.headers.iteritems():
90
            response[key] = value
91
        return response
92

    
93
    def build_request(self, django_request):
94
        params = {
95
            'method': django_request.method,
96
            'path': django_request.path,
97
            'GET': django_request.GET,
98
            'POST': django_request.POST,
99
            'META': django_request.META,
100
            'secure': settings.DEBUG or django_request.is_secure(),
101
            #'secure': django_request.is_secure(),
102
        }
103
        # TODO: check for valid astakos user
104
        if django_request.user.is_authenticated():
105
            params['user'] = django_request.user
106
        return oa2base.Request(**params)
107

    
108
    def get_url_patterns(self):
109
        _patterns = patterns(
110
            '',
111
            url(r'^%s/?$' % join_urls(self.endpoints_prefix,
112
                                      self.authorization_endpoint.rstrip('/')),
113
                self.auth_view,
114
                name='%s_authenticate' % self.id),
115
            url(r'^%s/?$' % join_urls(self.endpoints_prefix,
116
                                      self.token_endpoint.rstrip('/')),
117
                self.token_view,
118
                name='%s_token' % self.id),
119
        )
120
        return _patterns
121

    
122
    def is_uri(self, string):
123
        validator = URLValidator()
124
        try:
125
            validator(string)
126
        except ValidationError:
127
            return False
128
        else:
129
            return True
130

    
131
    def get_login_uri(self):
132
        return reverse('login')
133

    
134

    
135
class AstakosBackend(DjangoBackend):
136
    pass