Statistics
| Revision:

gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / resources-plugin / scripting / lib / oauthlib / oauth1 / rfc5849 / utils.py @ 564

History | View | Annotate | Download (2.71 KB)

1
# -*- coding: utf-8 -*-
2
"""
3
oauthlib.utils
4
~~~~~~~~~~~~~~
5

6
This module contains utility methods used by various parts of the OAuth
7
spec.
8
"""
9
from __future__ import absolute_import, unicode_literals
10

    
11
try:
12
    import urllib2
13
except ImportError:
14
    import urllib.request as urllib2
15

    
16
from oauthlib.common import quote, unquote, bytes_type, unicode_type
17

    
18
UNICODE_ASCII_CHARACTER_SET = ('abcdefghijklmnopqrstuvwxyz'
19
                               'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
20
                               '0123456789')
21

    
22

    
23
def filter_params(target):
24
    """Decorator which filters params to remove non-oauth_* parameters
25

26
    Assumes the decorated method takes a params dict or list of tuples as its
27
    first argument.
28
    """
29
    def wrapper(params, *args, **kwargs):
30
        params = filter_oauth_params(params)
31
        return target(params, *args, **kwargs)
32

    
33
    wrapper.__doc__ = target.__doc__
34
    return wrapper
35

    
36

    
37
def filter_oauth_params(params):
38
    """Removes all non oauth parameters from a dict or a list of params."""
39
    is_oauth = lambda kv: kv[0].startswith("oauth_")
40
    if isinstance(params, dict):
41
        return list(filter(is_oauth, list(params.items())))
42
    else:
43
        return list(filter(is_oauth, params))
44

    
45

    
46
def escape(u):
47
    """Escape a unicode string in an OAuth-compatible fashion.
48

49
    Per `section 3.6`_ of the spec.
50

51
    .. _`section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
52

53
    """
54
    if not isinstance(u, unicode_type):
55
        raise ValueError('Only unicode objects are escapable. ' +
56
                         'Got %s of type %s.' % (u, type(u)))
57
    # Letters, digits, and the characters '_.-' are already treated as safe
58
    # by urllib.quote(). We need to add '~' to fully support rfc5849.
59
    return quote(u, safe=b'~')
60

    
61

    
62
def unescape(u):
63
    if not isinstance(u, unicode_type):
64
        raise ValueError('Only unicode objects are unescapable.')
65
    return unquote(u)
66

    
67

    
68
def parse_keqv_list(l):
69
    """A unicode-safe version of urllib2.parse_keqv_list"""
70
    # With Python 2.6, parse_http_list handles unicode fine
71
    return urllib2.parse_keqv_list(l)
72

    
73

    
74
def parse_http_list(u):
75
    """A unicode-safe version of urllib2.parse_http_list"""
76
    # With Python 2.6, parse_http_list handles unicode fine
77
    return urllib2.parse_http_list(u)
78

    
79

    
80
def parse_authorization_header(authorization_header):
81
    """Parse an OAuth authorization header into a list of 2-tuples"""
82
    auth_scheme = 'OAuth '.lower()
83
    if authorization_header[:len(auth_scheme)].lower().startswith(auth_scheme):
84
        items = parse_http_list(authorization_header[len(auth_scheme):])
85
        try:
86
            return list(parse_keqv_list(items).items())
87
        except (IndexError, ValueError):
88
            pass
89
    raise ValueError('Malformed authorization header')