Skip to content
Snippets Groups Projects
Commit 26e4f837 authored by f00wl's avatar f00wl Committed by kaiyou
Browse files

add aud to payload

use claims options
parent 94fa9a81
No related branches found
No related tags found
No related merge requests found
...@@ -2,6 +2,7 @@ from hiboo import models, utils, security ...@@ -2,6 +2,7 @@ from hiboo import models, utils, security
from hiboo.account import blueprint, forms from hiboo.account import blueprint, forms
from flask_babel import lazy_gettext as _ from flask_babel import lazy_gettext as _
from flask import session from flask import session
from authlib.jose import JsonWebToken
import datetime import datetime
import flask_login import flask_login
...@@ -32,6 +33,20 @@ def signout(): ...@@ -32,6 +33,20 @@ def signout():
@blueprint.route("/signup", methods=["GET", "POST"]) @blueprint.route("/signup", methods=["GET", "POST"])
def signup(): def signup():
if not flask.current_app.config['OPEN_SIGNUP']:
token = flask.request.args.get('token') or flask.abort(403)
key = flask.current_app.config["SECRET_KEY"]
jwt = JsonWebToken(['HS512'])
claims_options = {
'exp': {'essential': True, 'value': datetime.datetime.now().timestamp()},
'aud': {'essential': True, 'value': flask.url_for('.signup')}
}
try:
claims = jwt.decode(token, key, claims_options=claims_options)
claims.validate()
except Exception as e:
flask.flash(_("Invalid or expired signup link"), "danger")
return flask.redirect(flask.url_for(".signin"))
form = forms.SignupForm() form = forms.SignupForm()
if form.validate_on_submit(): if form.validate_on_submit():
conflict = models.User.query.filter_by(username=form.username.data).first() conflict = models.User.query.filter_by(username=form.username.data).first()
...@@ -72,4 +87,4 @@ def reset(token_uuid): ...@@ -72,4 +87,4 @@ def reset(token_uuid):
models.db.session.commit() models.db.session.commit()
flask.flash(_("Successfully reset your password"), "success") flask.flash(_("Successfully reset your password"), "success")
return flask.redirect(flask.url_for(".signin")) return flask.redirect(flask.url_for(".signin"))
return flask.render_template("account_reset.html", form=form) return flask.render_template("account_reset.html", form=form)
\ No newline at end of file
...@@ -14,6 +14,7 @@ DEFAULT_CONFIG = { ...@@ -14,6 +14,7 @@ DEFAULT_CONFIG = {
'TEMPLATES_AUTO_RELOAD': False, 'TEMPLATES_AUTO_RELOAD': False,
'MAIL_DOMAIN': 'tedomum.net', 'MAIL_DOMAIN': 'tedomum.net',
'WEBSITE_NAME': 'Hiboo', 'WEBSITE_NAME': 'Hiboo',
'OPEN_SIGNUP': True,
'API_TOKEN': 'changeMe' 'API_TOKEN': 'changeMe'
} }
......
...@@ -24,3 +24,7 @@ ...@@ -24,3 +24,7 @@
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block actions %}
<a href="{{ url_for(".invite") }}" class="btn btn-primary">{% trans %}Sign-up link{% endtrans %}</a>
{% endblock %}
from hiboo.user import blueprint, forms from hiboo.user import blueprint, forms
from hiboo import models, utils, security from hiboo import models, utils, security
from flask_babel import lazy_gettext as _ from flask_babel import lazy_gettext as _
from authlib.jose import jwt
import datetime import datetime
import flask import flask
...@@ -39,4 +40,21 @@ def password_reset(user_uuid): ...@@ -39,4 +40,21 @@ def password_reset(user_uuid):
models.db.session.commit() models.db.session.commit()
reset_link = flask.url_for("account.reset", token_uuid=token.uuid, _external=True) reset_link = flask.url_for("account.reset", token_uuid=token.uuid, _external=True)
flask.flash(_("Reset link: {}").format(reset_link), "success") flask.flash(_("Reset link: {}").format(reset_link), "success")
return flask.redirect(flask.url_for(".details", user_uuid=user.uuid)) return flask.redirect(flask.url_for(".details", user_uuid=user.uuid))
\ No newline at end of file
@blueprint.route("/invite", methods=["GET", "POST"])
@security.admin_required()
@security.confirmation_required("generate a signup link")
def invite():
expired = datetime.datetime.now() + datetime.timedelta(days=1)
payload = {
"exp": int(expired.timestamp()),
"aud": flask.url_for('account.signup')
}
header = {"alg": "HS512"}
key = flask.current_app.config["SECRET_KEY"]
token = jwt.encode(header, payload, key)
signup_link = flask.url_for("account.signup", token=token, _external=True)
flask.flash(_("Signup link: {}").format(signup_link), "success")
return flask.redirect(flask.url_for("user.list"))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment