Skip to content

Commit e1a491a

Browse files
committed
Redirect to site base URL after all OOB actions.
1 parent ed1c38b commit e1a491a

File tree

4 files changed

+73
-18
lines changed

4 files changed

+73
-18
lines changed

app/jekylledit/controllers/auth.py

+28-7
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from ..ext.identitytoolkit import Gitkit
1414
from itsdangerous import URLSafeTimedSerializer
1515

16-
from ..model import Account, Challenge, Repository, Roles, Site, Sites, db
16+
from ..model import Account, OobAction, Repository, Roles, Site, Sites, db
1717
from .base import app, mailgun, jsonp
1818

1919

@@ -125,10 +125,10 @@ def widget():
125125
oob_code = parse_qs(url.query).get('oobCode')
126126
if not oob_code or len(oob_code) != 1:
127127
abort(400)
128-
challenge = Challenge.query.get(oob_code[0])
129-
if challenge is None:
128+
action = OobAction.query.get(oob_code[0])
129+
if action is None:
130130
abort(400)
131-
base_url = Sites(challenge.site_id).get_base_url()
131+
base_url = Sites(action.site_id).get_base_url()
132132
if not base_url.endswith('/'):
133133
base_url += '/'
134134
return redirect('{}#sign-in'.format(base_url))
@@ -155,12 +155,11 @@ def sign_in_success(site_id):
155155
db.session.commit()
156156
return render_template('auth/close-window.html', message='You have signed in.')
157157
oob_link = gitkit.get_email_verification_link(email)
158-
challenge = Challenge(
158+
action = OobAction(
159159
oob_code=parse_qs(urlparse(oob_link).query)['oobCode'][0],
160160
site_id=site_id,
161-
account_id=account.id,
162161
moment=datetime.utcnow())
163-
db.session.add(challenge)
162+
db.session.add(action)
164163
db.session.commit()
165164
text = render_template('auth/verify-email.txt', oob_link=oob_link)
166165
send(email, 'Verify email address', text)
@@ -179,7 +178,29 @@ def sign_out():
179178

180179
@blueprint.route('/oob-action', methods={'POST'})
181180
def oob_action():
181+
url_adapter = _request_ctx_stack.top.url_adapter
182+
url = urlparse(request.referrer)
183+
if url.netloc != request.host:
184+
abort(400)
185+
endpoint, __ = url_adapter.match(url.path, 'GET')
186+
if endpoint != 'auth.widget':
187+
abort(400)
188+
next = parse_qs(url.query).get('next')
189+
if not next or len(next) != 1:
190+
abort(400)
191+
url = urlparse(next[0])
192+
if url.netloc != request.host:
193+
abort(400)
194+
endpoint, values = url_adapter.match(url.path, 'GET')
195+
if endpoint != 'auth.sign_in_success':
196+
abort(400)
182197
result = gitkit.get_oob_result()
198+
action = OobAction(
199+
oob_code=parse_qs(urlparse(result['oob_link']).query)['oobCode'][0],
200+
site_id=values['site_id'],
201+
moment=datetime.utcnow())
202+
db.session.add(action)
203+
db.session.commit()
183204
if result['action'] == 'changeEmail':
184205
text = render_template(
185206
'auth/change-email.txt',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""Replace challenge with oob_action.
2+
3+
Revision ID: f95f5c80e730
4+
Revises: 2cf8288266e0
5+
Create Date: 2016-06-15 15:07:04.644101
6+
7+
"""
8+
9+
# revision identifiers, used by Alembic.
10+
revision = 'f95f5c80e730'
11+
down_revision = '2cf8288266e0'
12+
13+
from alembic import op
14+
import sqlalchemy as sa
15+
16+
17+
def upgrade():
18+
op.create_table(
19+
'oob_action',
20+
sa.Column('oob_code', sa.Unicode(), nullable=False),
21+
sa.Column('site_id', sa.Unicode(), nullable=False),
22+
sa.Column('moment', sa.DateTime(), nullable=False),
23+
sa.PrimaryKeyConstraint('oob_code', name=op.f('oob_action_pkey')),
24+
sa.ForeignKeyConstraint(['site_id'], ['site.id'], name=op.f('oob_action_site_id_fkey')),
25+
)
26+
op.execute("""\
27+
INSERT INTO oob_action (oob_code, site_id, moment)
28+
SELECT oob_code, site_id, moment
29+
FROM challenge
30+
""")
31+
op.drop_table('challenge')
32+
33+
34+
def downgrade():
35+
pass

app/jekylledit/model/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# flake8: noqa
22

33
from .base import db, migrate
4-
from .auth import Account, Challenge, Roles, Site
4+
from .auth import Account, OobAction, Roles, Site
55
from .site import Repository, Sites

app/jekylledit/model/auth.py

+9-10
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,19 @@ class Account(UserMixin, db.Model):
2525
roles = db.relationship('Roles')
2626

2727

28-
class Challenge(db.Model):
29-
30-
__tablename__ = 'challenge'
31-
32-
oob_code = db.Column(db.Unicode, primary_key=True)
33-
site_id = db.Column(db.Unicode, db.ForeignKey('site.id'), nullable=False)
34-
account_id = db.Column(db.Unicode, db.ForeignKey('account.id'), nullable=False)
35-
moment = db.Column(db.DateTime, nullable=False)
36-
37-
3828
class Roles(db.Model):
3929

4030
__tablename__ = 'roles'
4131

4232
email = db.Column(db.Unicode, db.ForeignKey('account.email'), primary_key=True)
4333
site_id = db.Column(db.Unicode, db.ForeignKey('site.id'), primary_key=True, index=True)
4434
roles = db.Column(JSON, nullable=False)
35+
36+
37+
class OobAction(db.Model):
38+
39+
__tablename__ = 'oob_action'
40+
41+
oob_code = db.Column(db.Unicode, primary_key=True)
42+
site_id = db.Column(db.Unicode, db.ForeignKey('site.id'), nullable=False)
43+
moment = db.Column(db.DateTime, nullable=False)

0 commit comments

Comments
 (0)