Skip to content

Commit 6b37b0e

Browse files
authored
Use flask-sqlalchemy (#359)
1 parent 1466205 commit 6b37b0e

25 files changed

+586
-565
lines changed

gramps_webapi/__main__.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
from .api.util import get_db_manager, get_search_indexer, list_trees
3333
from .dbmanager import WebDbManager
3434
from .app import create_app
35-
from .auth import SQLAuth
35+
from .auth import add_user, delete_user, fill_tree, user_db
3636
from .const import ENV_CONFIG_FILE
3737

3838
logging.basicConfig()
@@ -68,7 +68,6 @@ def run(ctx, port, tree):
6868
@click.pass_context
6969
def user(ctx):
7070
app = ctx.obj["app"]
71-
ctx.obj["auth"] = SQLAuth(db_uri=app.config["USER_DB_URI"])
7271

7372

7473
@user.command("add")
@@ -81,39 +80,42 @@ def user(ctx):
8180
@click.pass_context
8281
def user_add(ctx, name, password, fullname, email, role, tree):
8382
"""Add a user."""
84-
LOG.error("Adding user {} ...".format(name))
85-
auth = ctx.obj["auth"]
86-
auth.create_table()
87-
auth.add_user(name, password, fullname, email, role, tree)
83+
LOG.error(f"Adding user {name} ...")
84+
app = ctx.obj["app"]
85+
with app.app_context():
86+
user_db.create_all()
87+
add_user(name, password, fullname, email, role, tree)
8888

8989

9090
@user.command("delete")
9191
@click.argument("name")
9292
@click.pass_context
9393
def user_del(ctx, name):
9494
"""Delete a user."""
95-
LOG.info("Deleting user {} ...".format(name))
96-
auth = ctx.obj["auth"]
97-
auth.delete_user(name)
95+
LOG.info(f"Deleting user {name} ...")
96+
app = ctx.obj["app"]
97+
with app.app_context():
98+
delete_user(name)
9899

99100

100101
@user.command("fill-tree")
101102
@click.argument("tree")
102103
@click.pass_context
103-
def fill_tree(ctx, tree):
104+
def cmd_fill_tree(ctx, tree):
104105
"""Set the Tree ID for users where it is missing."""
105-
auth = ctx.obj["auth"]
106-
auth.fill_tree(tree)
106+
app = ctx.obj["app"]
107+
with app.app_context():
108+
fill_tree(tree)
107109

108110

109111
@user.command("migrate")
110112
@click.pass_context
111113
def migrate_db(ctx):
112114
"""Upgrade the user database schema, if required."""
113-
auth = ctx.obj["auth"]
115+
app = ctx.obj["app"]
114116
cmd = [sys.executable, "-m", "alembic", "upgrade", "head"]
115117
env = os.environ.copy()
116-
env["GRAMPSWEB_USER_DB_URI"] = auth.db_uri
118+
env["GRAMPSWEB_USER_DB_URI"] = app.config["USER_DB_URI"]
117119
subprocess.run(cmd, env=env, check=True)
118120

119121

gramps_webapi/api/resources/config.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from flask import abort, current_app, jsonify
2424
from webargs import fields
2525

26+
from ...auth import config_delete, config_get, config_get_all, config_set
2627
from ...auth.const import PERM_EDIT_SETTINGS, PERM_VIEW_SETTINGS
2728
from ...const import DB_CONFIG_ALLOWED_KEYS
2829
from ..auth import require_permissions
@@ -36,8 +37,7 @@ class ConfigsResource(ProtectedResource):
3637
def get(self):
3738
"""Get all config settings."""
3839
require_permissions([PERM_VIEW_SETTINGS])
39-
auth_provider = current_app.config.get("AUTH_PROVIDER")
40-
return jsonify(auth_provider.config_get_all()), 200
40+
return jsonify(config_get_all()), 200
4141

4242

4343
class ConfigResource(ProtectedResource):
@@ -46,10 +46,9 @@ class ConfigResource(ProtectedResource):
4646
def get(self, key: str):
4747
"""Get a config setting."""
4848
require_permissions([PERM_VIEW_SETTINGS])
49-
auth_provider = current_app.config.get("AUTH_PROVIDER")
5049
if key not in DB_CONFIG_ALLOWED_KEYS:
5150
abort(404)
52-
val = auth_provider.config_get(key)
51+
val = config_get(key)
5352
if val is None:
5453
abort(404)
5554
return jsonify(val), 200
@@ -63,21 +62,19 @@ def get(self, key: str):
6362
def put(self, args, key: str):
6463
"""Update a config setting."""
6564
require_permissions([PERM_EDIT_SETTINGS])
66-
auth_provider = current_app.config.get("AUTH_PROVIDER")
6765
try:
68-
auth_provider.config_set(key=key, value=args["value"])
66+
config_set(key=key, value=args["value"])
6967
except ValueError:
7068
abort(404) # key not allowed
7169
return "", 200
7270

7371
def delete(self, key: str):
7472
"""Delete a config setting."""
7573
require_permissions([PERM_EDIT_SETTINGS])
76-
auth_provider = current_app.config.get("AUTH_PROVIDER")
7774
try:
78-
if auth_provider.config_get(key=key) is None:
75+
if config_get(key=key) is None:
7976
abort(404)
8077
except ValueError:
8178
abort(404)
82-
auth_provider.config_delete(key=key)
79+
config_delete(key=key)
8380
return "", 200

gramps_webapi/api/resources/token.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,13 @@
2929
)
3030
from webargs import fields, validate
3131

32-
from ...auth import SQLAuth
32+
from ...auth import (
33+
get_all_user_details,
34+
get_permissions,
35+
get_guid,
36+
authorized,
37+
get_name,
38+
)
3339
from ...auth.const import CLAIM_LIMITED_SCOPE, SCOPE_CREATE_ADMIN
3440
from ..ratelimiter import limiter
3541
from ..util import get_tree_id, use_args
@@ -69,13 +75,12 @@ class TokenResource(Resource):
6975
)
7076
def post(self, args):
7177
"""Post username and password to fetch a token."""
72-
auth_provider = current_app.config.get("AUTH_PROVIDER")
7378
if "username" not in args or "password" not in args:
7479
abort(401)
75-
if not auth_provider.authorized(args.get("username"), args.get("password")):
80+
if not authorized(args.get("username"), args.get("password")):
7681
abort(403)
77-
permissions = auth_provider.get_permissions(args["username"])
78-
user_id = auth_provider.get_guid(args["username"])
82+
permissions = get_permissions(args["username"])
83+
user_id = get_guid(args["username"])
7984
tree_id = get_tree_id(user_id)
8085
return get_tokens(
8186
user_id=user_id,
@@ -91,13 +96,12 @@ class TokenRefreshResource(RefreshProtectedResource):
9196
@limiter.limit("1/second")
9297
def post(self):
9398
"""Fetch a fresh token."""
94-
auth_provider = current_app.config.get("AUTH_PROVIDER")
9599
user_id = get_jwt_identity()
96100
try:
97-
username = auth_provider.get_name(user_id)
101+
username = get_name(user_id)
98102
except ValueError:
99103
abort(401)
100-
permissions = auth_provider.get_permissions(username)
104+
permissions = get_permissions(username)
101105
tree_id = get_tree_id(user_id)
102106
return get_tokens(
103107
user_id=user_id,
@@ -113,8 +117,7 @@ class TokenCreateOwnerResource(Resource):
113117
@limiter.limit("1/second")
114118
def get(self):
115119
"""Get a token."""
116-
auth_provider: SQLAuth = current_app.config.get("AUTH_PROVIDER")
117-
if auth_provider.get_all_user_details(tree=None):
120+
if get_all_user_details(tree=None):
118121
# users already exist!
119122
abort(405)
120123
token = create_access_token(

0 commit comments

Comments
 (0)