-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathapp.py
126 lines (98 loc) · 3.36 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
"""Example oauth-dropins app. Serves the front page and discovery files.
"""
import importlib
import logging
from urllib.parse import urlencode, urlparse
from flask import Flask, render_template, request
import flask
import flask_gae_static
from google.cloud import ndb
from oauth_dropins.webutil import flask_util, util
import requests
from werkzeug.exceptions import HTTPException
from oauth_dropins import bluesky
from oauth_dropins.webutil import appengine_info, appengine_config
logger = logging.getLogger(__name__)
CACHE_CONTROL = {'Cache-Control': 'public, max-age=3600'} # 1 hour
app = Flask(__name__, static_folder=None)
app.json.compact = False
app.config.from_pyfile('config.py')
app.wsgi_app = flask_util.ndb_context_middleware(
app.wsgi_app, client=appengine_config.ndb_client)
if appengine_info.DEBUG or appengine_info.LOCAL_SERVER:
flask_gae_static.init_app(app)
logging.getLogger('requests_oauthlib').setLevel(logging.DEBUG)
util.set_user_agent('oauth-dropins (https://oauth-dropins.appspot.com/)')
SITES = {name: importlib.import_module(f'oauth_dropins.{name}') for name in (
'blogger',
'bluesky',
'disqus',
'dropbox',
'facebook',
'flickr',
'github',
'google_signin',
'indieauth',
'instagram',
'linkedin',
'mastodon',
'medium',
'meetup',
'pixelfed',
'reddit',
'threads',
'tumblr',
'twitter',
'wordpress_rest',
)}
from oauth_dropins import google_signin
google_signin.Start.INCLUDE_GRANTED_SCOPES = False
class BlueskyStart(bluesky.OAuthStart):
CLIENT_METADATA = bluesky._APP_CLIENT_METADATA
class BlueskyCallback(bluesky.OAuthCallback):
CLIENT_METADATA = bluesky._APP_CLIENT_METADATA
for site, module in SITES.items():
start = f'/{site}/start'
callback = f'/{site}/oauth_callback'
if site == 'bluesky':
start_cls = BlueskyStart
callback_cls = BlueskyCallback
else:
start_cls = module.Start
callback_cls = module.Callback
app.add_url_rule(start, view_func=start_cls.as_view(start, callback),
methods=['POST'])
app.add_url_rule(callback, view_func=callback_cls.as_view(callback, '/'))
@app.errorhandler(Exception)
def handle_discovery_errors(e):
"""A Flask exception handler that handles URL discovery errors.
Used to catch Mastodon and IndieAuth connection failures, etc.
"""
if isinstance(e, HTTPException):
return e
if isinstance(e, (ValueError, requests.RequestException)):
logger.warning('', exc_info=True)
return flask.redirect('/?' + urlencode({'error': str(e)}))
return flask_util.handle_exception(e)
@app.route('/')
def home_page():
"""Renders and serves the home page."""
vars = dict(request.args)
vars.update({
site + '_html': module.Start.button_html(
'/%s/start' % site, image_prefix='/static/',
outer_classes='col-md-3 col-sm-4 col-xs-6')
for site, module in SITES.items()
})
key = request.args.get('auth_entity')
if key:
vars['entity'] = ndb.Key(urlsafe=key).get()
from oauth_dropins import get_logins, logout
vars['get_logins'] = get_logins
vars['logout'] = logout
return render_template('index.html', **vars)
@app.get(urlparse(bluesky._APP_CLIENT_METADATA['client_id']).path)
@flask_util.headers(CACHE_CONTROL)
def bluesky_oauth_client_metadata():
"""https://docs.bsky.app/docs/advanced-guides/oauth-client#client-and-server-metadata"""
return bluesky._APP_CLIENT_METADATA