Statistics
| Branch: | Tag: | Revision:

root / snf-django-lib / snf_django / lib / api / urls.py @ aad21b81

History | View | Annotate | Download (2.6 kB)

1 a0a3da60 Kostas Papadimitriou
# Copyright 2012, 2013 GRNET S.A. All rights reserved.
2 a0a3da60 Kostas Papadimitriou
#
3 a0a3da60 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 a0a3da60 Kostas Papadimitriou
# without modification, are permitted provided that the following
5 a0a3da60 Kostas Papadimitriou
# conditions are met:
6 a0a3da60 Kostas Papadimitriou
#
7 a0a3da60 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 a0a3da60 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 a0a3da60 Kostas Papadimitriou
#      disclaimer.
10 a0a3da60 Kostas Papadimitriou
#
11 a0a3da60 Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 a0a3da60 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 a0a3da60 Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 a0a3da60 Kostas Papadimitriou
#      provided with the distribution.
15 a0a3da60 Kostas Papadimitriou
#
16 a0a3da60 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 a0a3da60 Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 a0a3da60 Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 a0a3da60 Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 a0a3da60 Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 a0a3da60 Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 a0a3da60 Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 a0a3da60 Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 a0a3da60 Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 a0a3da60 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 a0a3da60 Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 a0a3da60 Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 a0a3da60 Kostas Papadimitriou
#
29 a0a3da60 Kostas Papadimitriou
# The views and conclusions contained in the software and
30 a0a3da60 Kostas Papadimitriou
# documentation are those of the authors and should not be
31 a0a3da60 Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 a0a3da60 Kostas Papadimitriou
# or implied, of GRNET S.A.
33 a0a3da60 Kostas Papadimitriou
34 a0a3da60 Kostas Papadimitriou
from django.core import urlresolvers
35 a0a3da60 Kostas Papadimitriou
from django.views.decorators import csrf
36 6b256427 Christos Stavrakakis
from django.conf.urls import patterns
37 a0a3da60 Kostas Papadimitriou
38 4691814d Ilias Tsitsimpis
39 a0a3da60 Kostas Papadimitriou
def _patch_pattern(regex_pattern):
40 a0a3da60 Kostas Papadimitriou
    """
41 4691814d Ilias Tsitsimpis
    Patch pattern callback using csrf_exempt. Enforce
42 a0a3da60 Kostas Papadimitriou
    RegexURLPattern callback to get resolved if required.
43 06014b1c Christos Stavrakakis

44 a0a3da60 Kostas Papadimitriou
    """
45 6b256427 Christos Stavrakakis
    regex_pattern._callback = \
46 6b256427 Christos Stavrakakis
        csrf.csrf_exempt(regex_pattern.callback)
47 4691814d Ilias Tsitsimpis
48 a0a3da60 Kostas Papadimitriou
49 a0a3da60 Kostas Papadimitriou
def _patch_resolver(r):
50 a0a3da60 Kostas Papadimitriou
    """
51 a0a3da60 Kostas Papadimitriou
    Patch all patterns found in resolver with _patch_pattern
52 a0a3da60 Kostas Papadimitriou
    """
53 6b256427 Christos Stavrakakis
    if hasattr(r, 'url_patterns'):
54 06014b1c Christos Stavrakakis
        entries = r.url_patterns
55 a0a3da60 Kostas Papadimitriou
    else:
56 a0a3da60 Kostas Papadimitriou
        # first level view in patterns ?
57 a0a3da60 Kostas Papadimitriou
        entries = [r]
58 a0a3da60 Kostas Papadimitriou
59 a0a3da60 Kostas Papadimitriou
    for entry in entries:
60 a0a3da60 Kostas Papadimitriou
        if isinstance(entry, urlresolvers.RegexURLResolver):
61 a0a3da60 Kostas Papadimitriou
            _patch_resolver(entry)
62 a0a3da60 Kostas Papadimitriou
        #if isinstance(entry, urlresolvers.RegexURLPattern):
63 a0a3da60 Kostas Papadimitriou
        # let it break...
64 a0a3da60 Kostas Papadimitriou
        else:
65 a0a3da60 Kostas Papadimitriou
            _patch_pattern(entry)
66 a0a3da60 Kostas Papadimitriou
67 4691814d Ilias Tsitsimpis
68 a0a3da60 Kostas Papadimitriou
def api_patterns(*args, **kwargs):
69 a0a3da60 Kostas Papadimitriou
    """
70 4691814d Ilias Tsitsimpis
    Protect all url patterns from csrf attacks.
71 a0a3da60 Kostas Papadimitriou
    """
72 a0a3da60 Kostas Papadimitriou
    _patterns = patterns(*args, **kwargs)
73 a0a3da60 Kostas Papadimitriou
    for entry in _patterns:
74 a0a3da60 Kostas Papadimitriou
        _patch_resolver(entry)
75 a0a3da60 Kostas Papadimitriou
    return _patterns