1# coding=utf-8
2"""oauthlib.oauth1.rfc5849.errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3
4Error used both by OAuth 1 clients and provicers to represent the spec
5defined error responses for all four core grant types.
6"""
7from __future__ import unicode_literals
8
9from oauthlib.common import add_params_to_uri, urlencode
10
11
12class OAuth1Error(Exception):
13  error = None
14  description = ''
15
16  def __init__(self, description=None, uri=None, status_code=400, request=None):
17    """
18        description:    A human-readable ASCII [USASCII] text providing
19                        additional information, used to assist the client
20                        developer in understanding the error that occurred.
21                        Values for the "error_description" parameter MUST NOT
22                        include characters outside the set
23                        x20-21 / x23-5B / x5D-7E.
24
25        uri:    A URI identifying a human-readable web page with information
26                about the error, used to provide the client developer with
27                additional information about the error.  Values for the
28                "error_uri" parameter MUST conform to the URI- Reference
29                syntax, and thus MUST NOT include characters outside the set
30                x21 / x23-5B / x5D-7E.
31
32        state:  A CSRF protection value received from the client.
33
34        request:  Oauthlib Request object
35        """
36    self.description = description or self.description
37    message = '(%s) %s' % (self.error, self.description)
38    if request:
39      message += ' ' + repr(request)
40    super(OAuth1Error, self).__init__(message)
41
42    self.uri = uri
43    self.status_code = status_code
44
45  def in_uri(self, uri):
46    return add_params_to_uri(uri, self.twotuples)
47
48  @property
49  def twotuples(self):
50    error = [('error', self.error)]
51    if self.description:
52      error.append(('error_description', self.description))
53    if self.uri:
54      error.append(('error_uri', self.uri))
55    return error
56
57  @property
58  def urlencoded(self):
59    return urlencode(self.twotuples)
60
61
62class InsecureTransportError(OAuth1Error):
63  error = 'insecure_transport_protocol'
64  description = 'Only HTTPS connections are permitted.'
65
66
67class InvalidSignatureMethodError(OAuth1Error):
68  error = 'invalid_signature_method'
69
70
71class InvalidRequestError(OAuth1Error):
72  error = 'invalid_request'
73
74
75class InvalidClientError(OAuth1Error):
76  error = 'invalid_client'
77