aboutsummaryrefslogtreecommitdiff
path: root/app/blueprints/api/tokens.py
diff options
context:
space:
mode:
authorrubenwardy <rw@rubenwardy.com>2019-11-22 14:33:22 +0000
committerrubenwardy <rw@rubenwardy.com>2019-11-27 01:06:58 +0000
commit4ce388c8aa5d5502408609983535a9812d41d6d1 (patch)
tree5ad9123949ca2068dfe975284d0f1b3acdf5b437 /app/blueprints/api/tokens.py
parentcb5451fe5d49e0eda379e3cd636c54e8ea1a3f8e (diff)
downloadcheatdb-4ce388c8aa5d5502408609983535a9812d41d6d1.tar.xz
Add API Token creation
Diffstat (limited to 'app/blueprints/api/tokens.py')
-rw-r--r--app/blueprints/api/tokens.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/app/blueprints/api/tokens.py b/app/blueprints/api/tokens.py
new file mode 100644
index 0000000..3f6b151
--- /dev/null
+++ b/app/blueprints/api/tokens.py
@@ -0,0 +1,141 @@
+# Content DB
+# Copyright (C) 2018 rubenwardy
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+
+from flask import render_template, redirect, request, session, url_for
+from flask_user import login_required, current_user
+from . import bp
+from app.models import db, User, APIToken, Package, Permission
+from app.utils import randomString
+from app.querybuilder import QueryBuilder
+
+from flask_wtf import FlaskForm
+from wtforms import *
+from wtforms.validators import *
+from wtforms.ext.sqlalchemy.fields import QuerySelectField
+
+class CreateAPIToken(FlaskForm):
+ name = StringField("Name", [InputRequired(), Length(1, 30)])
+ submit = SubmitField("Save")
+
+
+@bp.route("/users/<username>/tokens/")
+@login_required
+def list_tokens(username):
+ user = User.query.filter_by(username=username).first()
+ if user is None:
+ abort(404)
+
+ if not user.checkPerm(current_user, Permission.CREATE_TOKEN):
+ abort(403)
+
+ return render_template("api/list_tokens.html", user=user)
+
+
+@bp.route("/users/<username>/tokens/new/", methods=["GET", "POST"])
+@bp.route("/users/<username>/tokens/<int:id>/edit/", methods=["GET", "POST"])
+@login_required
+def create_edit_token(username, id=None):
+ user = User.query.filter_by(username=username).first()
+ if user is None:
+ abort(404)
+
+ if not user.checkPerm(current_user, Permission.CREATE_TOKEN):
+ abort(403)
+
+ is_new = id is None
+
+ token = None
+ access_token = None
+ if not is_new:
+ token = APIToken.query.get(id)
+ if token is None:
+ abort(404)
+ elif token.owner != user:
+ abort(403)
+
+ access_token = session.pop("token_" + str(id), None)
+
+ form = CreateAPIToken(formdata=request.form, obj=token)
+ if request.method == "POST" and form.validate():
+ if is_new:
+ token = APIToken()
+ token.owner = user
+ token.access_token = randomString(32)
+
+ form.populate_obj(token)
+ db.session.add(token)
+
+ db.session.commit() # save
+
+ # Store token so it can be shown in the edit page
+ session["token_" + str(token.id)] = token.access_token
+
+ return redirect(url_for("api.create_edit_token", username=username, id=token.id))
+
+ return render_template("api/create_edit_token.html", user=user, form=form, token=token, access_token=access_token)
+
+
+@bp.route("/users/<username>/tokens/<int:id>/reset/", methods=["POST"])
+@login_required
+def reset_token(username, id):
+ user = User.query.filter_by(username=username).first()
+ if user is None:
+ abort(404)
+
+ if not user.checkPerm(current_user, Permission.CREATE_TOKEN):
+ abort(403)
+
+ is_new = id is None
+
+ token = APIToken.query.get(id)
+ if token is None:
+ abort(404)
+ elif token.owner != user:
+ abort(403)
+
+ token.access_token = randomString(32)
+
+ db.session.commit() # save
+
+ # Store token so it can be shown in the edit page
+ session["token_" + str(token.id)] = token.access_token
+
+ return redirect(url_for("api.create_edit_token", username=username, id=token.id))
+
+
+@bp.route("/users/<username>/tokens/<int:id>/delete/", methods=["POST"])
+@login_required
+def delete_token(username, id):
+ user = User.query.filter_by(username=username).first()
+ if user is None:
+ abort(404)
+
+ if not user.checkPerm(current_user, Permission.CREATE_TOKEN):
+ abort(403)
+
+ is_new = id is None
+
+ token = APIToken.query.get(id)
+ if token is None:
+ abort(404)
+ elif token.owner != user:
+ abort(403)
+
+ db.session.delete(token)
+ db.session.commit()
+
+ return redirect(url_for("api.list_tokens", username=username))