Revision 698016f7

b/snf-astakos-app/astakos/oa2/models.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
import datetime
35
import urlparse
36 35

  
37 36
from django.db import models
38 37
from django.utils.translation import ugettext_lazy as _
......
87 86
        return self.redirecturl_set.get().url
88 87

  
89 88
    def redirect_uri_is_valid(self, uri):
90
        # ignore user specific uri part
91
        parts = list(urlparse.urlsplit(uri))
92
        path = parts[2]
93
        pieces = path.rsplit('/', 3)
94
        parts[2] = '/'.join(pieces[:-3]) if len(pieces) > 3 else path
95
        uri = urlparse.urlunsplit(parts)
96

  
97
        # TODO: handle trailing slashes
98
        return self.redirecturl_set.filter(url=uri).count() > 0
89
        for redirect_uri in self.redirecturl_set.values_list('url', flat=True):
90
            if uri == redirect_uri:
91
                return True
92
            elif uri.startswith(redirect_uri.rstrip('/') + '/'):
93
                return True
94
        return False
99 95

  
100 96
    def get_id(self):
101 97
        return self.identifier
b/snf-astakos-app/astakos/oa2/tests/djangobackend.py
377 377
        self.assertEqual(code4.state, 'csrfstate')
378 378
        self.assertEqual(code4.redirect_uri, self.client3_redirect_uri)
379 379

  
380
        params['redirect_uri'] = '%s/more' % self.client3_redirect_uri
381
        self.client.set_credentials('client3', 'secret')
382
        r = self.client.authorize_code('client3', urlparams=params)
383
        self.assertEqual(r.status_code, 302)
384
        self.assertCount(AuthorizationCode, 5)
385

  
386
        # redirect is valid
387
        redirect5 = self.get_redirect_url(r)
388
        self.assertParam(redirect5, "code")
389
        self.assertParamEqual(redirect5, "state", 'csrfstate')
390
        self.assertNoParam(redirect5, "extra_param")
391
        self.assertHost(redirect5, "server3.com")
392
        self.assertPath(redirect5, "/handle_code/more")
393

  
394
        code4 = AuthorizationCode.objects.get(code=redirect5.params['code'][0])
395
        self.assertEqual(code4.state, 'csrfstate')
396
        self.assertEqual(code4.redirect_uri,
397
                         '%s/more' % self.client3_redirect_uri)
398

  
380 399
    def test_get_token(self):
381 400
        # invalid method
382 401
        r = self.client.get(self.client.token_url)

Also available in: Unified diff