Revision efaec842 snf-astakos-app/astakos/oa2/backends/djangobackend.py

b/snf-astakos-app/astakos/oa2/backends/djangobackend.py
1
import astakos.oa2.models as oa2_models
2

  
1 3
from astakos.oa2.backends import base as oa2base
2 4
from astakos.oa2.backends import base as errors
3
from astakos.oa2.models import *
4 5

  
5
from django.conf.urls.defaults import patterns, url
6 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.views.decorators.csrf import csrf_exempt
13

  
14
import logging
15
logger = logging.getLogger(__name__)
7 16

  
8 17

  
9 18
class DjangoViewsMixin(object):
10 19

  
11 20
    def auth_view(self, request):
12 21
        oa2request = self.build_request(request)
13
        response = self.authorize(oa2request, accept=False)
14
        return self._build_response(response)
22
        oa2response = self.authorize(oa2request, accept=False)
23
        return self._build_response(oa2response)
15 24

  
25
    @csrf_exempt
16 26
    def token_view(self, request):
17
        return http.HttpResponse("token view")
27
        oa2request = self.build_request(request)
28
        oa2response = self.grant_token(oa2request)
29
        return self._build_response(oa2response)
18 30

  
19 31

  
20 32
class DjangoBackendORMMixin(object):
21 33

  
22 34
    def get_client_by_credentials(self, username, password):
23 35
        try:
24
            return Client.objects.get(identifier=username, secret=password)
25
        except Client.DoesNotExist:
36
            return oa2_models.Client.objects.get(identifier=username,
37
                                                 secret=password)
38
        except oa2_models.Client.DoesNotExist:
26 39
            raise errors.InvalidClientID("No such client found")
27 40

  
28 41
    def get_client_by_id(self, clientid):
29 42
        try:
30
            return Client.objects.get(identifier=clientid)
31
        except Client.DoesNotExist:
43
            return oa2_models.Client.objects.get(identifier=clientid)
44
        except oa2_models.Client.DoesNotExist:
32 45
            raise errors.InvalidClientID("No such client found")
33 46

  
34
    def create_authorization_code(self, client, code, redirect_uri, scope,
35
                                  state, **kwargs):
36
        return AuthorizationCode.objects.create(**{
37
            'code': code,
38
            'client_id': client.get_id(),
39
            'redirect_uri': redirect_uri,
40
            'scope': scope,
41
            'state': state
42
        })
43

  
44
    def create_token(self, value, token_type, client, scope, refresh=False):
45
        params = self._token_params(value, token_type, client, scope)
46
        if refresh:
47
            refresh_token = self.generate_token()
48
            params['refresh_token'] = refresh_token
49
            # TODO: refresh token expires ???
50
        token = self.token_model.create(value, **params)
47
    def get_authorization_code(self, code):
48
        try:
49
            return oa2_models.AuthorizationCode.objects.get(code=code)
50
        except oa2_models.AuthorizationCode.DoesNotExist:
51
            raise errors.OA2Error("No such authorization code")
52

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

  
52 59
    def delete_authorization_code(self, code):
53
        del self.code_model.ENTRIES[code]
60
        code.delete()
61
        logger.info('%r deleted' % code)
62

  
63
    def delete_token(self, token):
64
        token.delete()
65
        logger.info('%r deleted' % token)
66

  
67
    def check_credentials(self, client, username, secret):
68
        if not (username == client.get_id() and secret == client.secret):
69
            raise errors.InvalidAuthorizationRequest("Invalid credentials")
54 70

  
55 71

  
56 72
class DjangoBackend(DjangoBackendORMMixin, oa2base.SimpleBackend,
57 73
                    DjangoViewsMixin):
58 74

  
59
    code_model = AuthorizationCode
75
    code_model = oa2_models.AuthorizationCode.objects
76
    token_model = oa2_models.Token.objects
77
    client_model = oa2_models.Client.objects
60 78

  
61 79
    def _build_response(self, oa2response):
62 80
        response = http.HttpResponse()
......
69 87
    def build_request(self, django_request):
70 88
        params = {
71 89
            'method': django_request.method,
90
            'path': django_request.path,
72 91
            'GET': django_request.GET,
73 92
            'POST': django_request.POST,
74 93
            'META': django_request.META,
75
            'secure': django_request.is_secure(),
94
            'secure': settings.DEBUG or django_request.is_secure(),
95
            #'secure': django_request.is_secure(),
76 96
        }
97
        # TODO: check for valid astakos user
77 98
        if django_request.user.is_authenticated():
78 99
            params['user'] = django_request.user
79 100
        return oa2base.Request(**params)
80 101

  
81 102
    def get_url_patterns(self):
103
        sep = '/' if self.endpoints_prefix else ''
82 104
        _patterns = patterns(
83 105
            '',
84
            url(r'^%s/auth/?$' % self.endpoints_prefix, self.auth_view,
106
            url(r'^%s%sauth/?$' % (self.endpoints_prefix, sep),
107
                self.auth_view,
85 108
                name='%s_authenticate' % self.id),
86
            url(r'^%s/token/?$' % self.endpoints_prefix, self.token_view,
109
            url(r'^%s%stoken/?$' % (self.endpoints_prefix, sep),
110
                self.token_view,
87 111
                name='%s_token' % self.id),
88 112
        )
89 113
        return _patterns
90 114

  
115
    def is_uri(self, string):
116
        validator = URLValidator()
117
        try:
118
            validator(string)
119
        except ValidationError:
120
            return False
121
        else:
122
            return True
123

  
124
    def get_login_uri(self):
125
        return reverse('login')
126

  
91 127

  
92 128
class AstakosBackend(DjangoBackend):
93 129
    pass

Also available in: Unified diff