mirror of
https://github.com/clinton-hall/nzbToMedia.git
synced 2025-08-21 05:43:16 -07:00
Added dedicated SiCKRAGE section with API version and SSO login support (#1805)
Added migration code to migrate SickBeard section with fork sickrage-api to new SiCKRAGE section
This commit is contained in:
parent
9d64c2f478
commit
0acf78f196
91 changed files with 13436 additions and 35 deletions
10
libs/common/requests_oauthlib/compliance_fixes/__init__.py
Normal file
10
libs/common/requests_oauthlib/compliance_fixes/__init__.py
Normal file
|
@ -0,0 +1,10 @@
|
|||
from __future__ import absolute_import
|
||||
|
||||
from .facebook import facebook_compliance_fix
|
||||
from .fitbit import fitbit_compliance_fix
|
||||
from .linkedin import linkedin_compliance_fix
|
||||
from .slack import slack_compliance_fix
|
||||
from .instagram import instagram_compliance_fix
|
||||
from .mailchimp import mailchimp_compliance_fix
|
||||
from .weibo import weibo_compliance_fix
|
||||
from .plentymarkets import plentymarkets_compliance_fix
|
17
libs/common/requests_oauthlib/compliance_fixes/douban.py
Normal file
17
libs/common/requests_oauthlib/compliance_fixes/douban.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
import json
|
||||
|
||||
from oauthlib.common import to_unicode
|
||||
|
||||
|
||||
def douban_compliance_fix(session):
|
||||
def fix_token_type(r):
|
||||
token = json.loads(r.text)
|
||||
token.setdefault("token_type", "Bearer")
|
||||
fixed_token = json.dumps(token)
|
||||
r._content = to_unicode(fixed_token).encode("utf-8")
|
||||
return r
|
||||
|
||||
session._client_default_token_placement = "query"
|
||||
session.register_compliance_hook("access_token_response", fix_token_type)
|
||||
|
||||
return session
|
33
libs/common/requests_oauthlib/compliance_fixes/facebook.py
Normal file
33
libs/common/requests_oauthlib/compliance_fixes/facebook.py
Normal file
|
@ -0,0 +1,33 @@
|
|||
from json import dumps
|
||||
|
||||
try:
|
||||
from urlparse import parse_qsl
|
||||
except ImportError:
|
||||
from urllib.parse import parse_qsl
|
||||
|
||||
from oauthlib.common import to_unicode
|
||||
|
||||
|
||||
def facebook_compliance_fix(session):
|
||||
def _compliance_fix(r):
|
||||
# if Facebook claims to be sending us json, let's trust them.
|
||||
if "application/json" in r.headers.get("content-type", {}):
|
||||
return r
|
||||
|
||||
# Facebook returns a content-type of text/plain when sending their
|
||||
# x-www-form-urlencoded responses, along with a 200. If not, let's
|
||||
# assume we're getting JSON and bail on the fix.
|
||||
if "text/plain" in r.headers.get("content-type", {}) and r.status_code == 200:
|
||||
token = dict(parse_qsl(r.text, keep_blank_values=True))
|
||||
else:
|
||||
return r
|
||||
|
||||
expires = token.get("expires")
|
||||
if expires is not None:
|
||||
token["expires_in"] = expires
|
||||
token["token_type"] = "Bearer"
|
||||
r._content = to_unicode(dumps(token)).encode("UTF-8")
|
||||
return r
|
||||
|
||||
session.register_compliance_hook("access_token_response", _compliance_fix)
|
||||
return session
|
25
libs/common/requests_oauthlib/compliance_fixes/fitbit.py
Normal file
25
libs/common/requests_oauthlib/compliance_fixes/fitbit.py
Normal file
|
@ -0,0 +1,25 @@
|
|||
"""
|
||||
The Fitbit API breaks from the OAuth2 RFC standard by returning an "errors"
|
||||
object list, rather than a single "error" string. This puts hooks in place so
|
||||
that oauthlib can process an error in the results from access token and refresh
|
||||
token responses. This is necessary to prevent getting the generic red herring
|
||||
MissingTokenError.
|
||||
"""
|
||||
|
||||
from json import loads, dumps
|
||||
|
||||
from oauthlib.common import to_unicode
|
||||
|
||||
|
||||
def fitbit_compliance_fix(session):
|
||||
def _missing_error(r):
|
||||
token = loads(r.text)
|
||||
if "errors" in token:
|
||||
# Set the error to the first one we have
|
||||
token["error"] = token["errors"][0]["errorType"]
|
||||
r._content = to_unicode(dumps(token)).encode("UTF-8")
|
||||
return r
|
||||
|
||||
session.register_compliance_hook("access_token_response", _missing_error)
|
||||
session.register_compliance_hook("refresh_token_response", _missing_error)
|
||||
return session
|
26
libs/common/requests_oauthlib/compliance_fixes/instagram.py
Normal file
26
libs/common/requests_oauthlib/compliance_fixes/instagram.py
Normal file
|
@ -0,0 +1,26 @@
|
|||
try:
|
||||
from urlparse import urlparse, parse_qs
|
||||
except ImportError:
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
|
||||
from oauthlib.common import add_params_to_uri
|
||||
|
||||
|
||||
def instagram_compliance_fix(session):
|
||||
def _non_compliant_param_name(url, headers, data):
|
||||
# If the user has already specified the token in the URL
|
||||
# then there's nothing to do.
|
||||
# If the specified token is different from ``session.access_token``,
|
||||
# we assume the user intends to override the access token.
|
||||
url_query = dict(parse_qs(urlparse(url).query))
|
||||
token = url_query.get("access_token")
|
||||
if token:
|
||||
# Nothing to do, just return.
|
||||
return url, headers, data
|
||||
|
||||
token = [("access_token", session.access_token)]
|
||||
url = add_params_to_uri(url, token)
|
||||
return url, headers, data
|
||||
|
||||
session.register_compliance_hook("protected_request", _non_compliant_param_name)
|
||||
return session
|
21
libs/common/requests_oauthlib/compliance_fixes/linkedin.py
Normal file
21
libs/common/requests_oauthlib/compliance_fixes/linkedin.py
Normal file
|
@ -0,0 +1,21 @@
|
|||
from json import loads, dumps
|
||||
|
||||
from oauthlib.common import add_params_to_uri, to_unicode
|
||||
|
||||
|
||||
def linkedin_compliance_fix(session):
|
||||
def _missing_token_type(r):
|
||||
token = loads(r.text)
|
||||
token["token_type"] = "Bearer"
|
||||
r._content = to_unicode(dumps(token)).encode("UTF-8")
|
||||
return r
|
||||
|
||||
def _non_compliant_param_name(url, headers, data):
|
||||
token = [("oauth2_access_token", session.access_token)]
|
||||
url = add_params_to_uri(url, token)
|
||||
return url, headers, data
|
||||
|
||||
session._client.default_token_placement = "query"
|
||||
session.register_compliance_hook("access_token_response", _missing_token_type)
|
||||
session.register_compliance_hook("protected_request", _non_compliant_param_name)
|
||||
return session
|
23
libs/common/requests_oauthlib/compliance_fixes/mailchimp.py
Normal file
23
libs/common/requests_oauthlib/compliance_fixes/mailchimp.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
import json
|
||||
|
||||
from oauthlib.common import to_unicode
|
||||
|
||||
|
||||
def mailchimp_compliance_fix(session):
|
||||
def _null_scope(r):
|
||||
token = json.loads(r.text)
|
||||
if "scope" in token and token["scope"] is None:
|
||||
token.pop("scope")
|
||||
r._content = to_unicode(json.dumps(token)).encode("utf-8")
|
||||
return r
|
||||
|
||||
def _non_zero_expiration(r):
|
||||
token = json.loads(r.text)
|
||||
if "expires_in" in token and token["expires_in"] == 0:
|
||||
token["expires_in"] = 3600
|
||||
r._content = to_unicode(json.dumps(token)).encode("utf-8")
|
||||
return r
|
||||
|
||||
session.register_compliance_hook("access_token_response", _null_scope)
|
||||
session.register_compliance_hook("access_token_response", _non_zero_expiration)
|
||||
return session
|
|
@ -0,0 +1,29 @@
|
|||
from json import dumps, loads
|
||||
import re
|
||||
|
||||
from oauthlib.common import to_unicode
|
||||
|
||||
|
||||
def plentymarkets_compliance_fix(session):
|
||||
def _to_snake_case(n):
|
||||
return re.sub("(.)([A-Z][a-z]+)", r"\1_\2", n).lower()
|
||||
|
||||
def _compliance_fix(r):
|
||||
# Plenty returns the Token in CamelCase instead of _
|
||||
if (
|
||||
"application/json" in r.headers.get("content-type", {})
|
||||
and r.status_code == 200
|
||||
):
|
||||
token = loads(r.text)
|
||||
else:
|
||||
return r
|
||||
|
||||
fixed_token = {}
|
||||
for k, v in token.items():
|
||||
fixed_token[_to_snake_case(k)] = v
|
||||
|
||||
r._content = to_unicode(dumps(fixed_token)).encode("UTF-8")
|
||||
return r
|
||||
|
||||
session.register_compliance_hook("access_token_response", _compliance_fix)
|
||||
return session
|
37
libs/common/requests_oauthlib/compliance_fixes/slack.py
Normal file
37
libs/common/requests_oauthlib/compliance_fixes/slack.py
Normal file
|
@ -0,0 +1,37 @@
|
|||
try:
|
||||
from urlparse import urlparse, parse_qs
|
||||
except ImportError:
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
|
||||
from oauthlib.common import add_params_to_uri
|
||||
|
||||
|
||||
def slack_compliance_fix(session):
|
||||
def _non_compliant_param_name(url, headers, data):
|
||||
# If the user has already specified the token, either in the URL
|
||||
# or in a data dictionary, then there's nothing to do.
|
||||
# If the specified token is different from ``session.access_token``,
|
||||
# we assume the user intends to override the access token.
|
||||
url_query = dict(parse_qs(urlparse(url).query))
|
||||
token = url_query.get("token")
|
||||
if not token and isinstance(data, dict):
|
||||
token = data.get("token")
|
||||
|
||||
if token:
|
||||
# Nothing to do, just return.
|
||||
return url, headers, data
|
||||
|
||||
if not data:
|
||||
data = {"token": session.access_token}
|
||||
elif isinstance(data, dict):
|
||||
data["token"] = session.access_token
|
||||
else:
|
||||
# ``data`` is something other than a dict: maybe a stream,
|
||||
# maybe a file object, maybe something else. We can't easily
|
||||
# modify it, so we'll set the token by modifying the URL instead.
|
||||
token = [("token", session.access_token)]
|
||||
url = add_params_to_uri(url, token)
|
||||
return url, headers, data
|
||||
|
||||
session.register_compliance_hook("protected_request", _non_compliant_param_name)
|
||||
return session
|
15
libs/common/requests_oauthlib/compliance_fixes/weibo.py
Normal file
15
libs/common/requests_oauthlib/compliance_fixes/weibo.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
from json import loads, dumps
|
||||
|
||||
from oauthlib.common import to_unicode
|
||||
|
||||
|
||||
def weibo_compliance_fix(session):
|
||||
def _missing_token_type(r):
|
||||
token = loads(r.text)
|
||||
token["token_type"] = "Bearer"
|
||||
r._content = to_unicode(dumps(token)).encode("UTF-8")
|
||||
return r
|
||||
|
||||
session._client.default_token_placement = "query"
|
||||
session.register_compliance_hook("access_token_response", _missing_token_type)
|
||||
return session
|
Loading…
Add table
Add a link
Reference in a new issue