Skip to content

Commit 4c2d88f

Browse files
committed
Add support for optionally restricting a permalink to a group
1 parent 21e4e61 commit 4c2d88f

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ dependencies = [
1111
"flask-restx~=1.3.0",
1212
"psycopg2~=2.9.9",
1313
"SQLAlchemy~=2.0.29",
14-
"qwc-services-core~=1.4.0"
14+
"qwc-services-core~=1.4.4"
1515
]
1616

1717
[dependency-groups]

src/server.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from qwc_services_core.auth import auth_manager, optional_auth, get_identity, get_username
1212
from qwc_services_core.api import CaseInsensitiveArgument
1313
from qwc_services_core.database import DatabaseEngine
14+
from qwc_services_core.permissions_reader import PermissionsReader
1415
from qwc_services_core.tenant_handler import (
1516
TenantHandler, TenantPrefixMiddleware, TenantSessionInterface)
1617
from qwc_services_core.runtime_config import RuntimeConfig
@@ -41,6 +42,7 @@
4142
# request parser
4243
createpermalink_parser = reqparse.RequestParser(argument_class=CaseInsensitiveArgument)
4344
createpermalink_parser.add_argument('url', required=False)
45+
createpermalink_parser.add_argument('permitted_group', required=False)
4446

4547
resolvepermalink_parser = reqparse.RequestParser(argument_class=CaseInsensitiveArgument)
4648
resolvepermalink_parser.add_argument('key', required=True)
@@ -75,6 +77,7 @@ class CreatePermalink(Resource):
7577

7678
@api.doc('createpermalink')
7779
@api.param('url', 'The URL for which to generate a permalink', 'query')
80+
@api.param('permitted_group', 'Optional, group to which to restrict the permalink', 'query')
7881
@api.param('payload', 'A json document with the state to store in the permalink', 'body')
7982
@api.expect(createpermalink_parser)
8083
@optional_auth
@@ -102,6 +105,7 @@ def post(self):
102105
"query": query,
103106
"state": state
104107
}
108+
permitted_group = args.get('permitted_group', None)
105109

106110
# Insert into databse
107111
db_engine, users_table, permalinks_table, user_permalink_table, user_bookmark_table = db_conn()
@@ -114,15 +118,15 @@ def post(self):
114118
expires = (datetime.date.today() + delta).strftime(r"%Y-%m-%d")
115119

116120
sql = sql_text("""
117-
INSERT INTO {table} (key, data, date, expires)
118-
VALUES (:key, :data, :date, :expires)
121+
INSERT INTO {table} (key, data, date, expires, permitted_group)
122+
VALUES (:key, :data, :date, :expires, :permitted_group)
119123
""".format(table=permalinks_table))
120124

121125
attempts = 0
122126
while attempts < 100:
123127
try:
124128
with db_engine.begin() as connection:
125-
connection.execute(sql, {"key": hexdigest, "data": datastr, "date": date, "expires": expires})
129+
connection.execute(sql, {"key": hexdigest, "data": datastr, "date": date, "expires": expires, "permitted_group": permitted_group})
126130
break
127131
except:
128132
pass
@@ -158,17 +162,29 @@ def get(self):
158162
args = resolvepermalink_parser.parse_args()
159163
key = args['key']
160164
data = {}
165+
permitted_group = None
161166
db_engine, users_table, permalinks_table, user_permalink_table, user_bookmark_table = db_conn()
162167
sql = sql_text("""
163-
SELECT data
168+
SELECT data, permitted_group
164169
FROM {table}
165170
WHERE key = :key AND (expires IS NULL OR expires >= CURRENT_DATE)
166171
""".format(table=permalinks_table))
167172
try:
168173
with db_engine.connect() as connection:
169-
data = json.loads(connection.execute(sql, {"key": key}).mappings().first()["data"])
174+
result = connection.execute(sql, {"key": key}).mappings().first()
175+
data = json.loads(result["data"])
176+
permitted_group = result["permitted_group"]
170177
except:
171178
pass
179+
if permitted_group:
180+
app.logger.debug("Permalink %s is restricted to group %s" % (key, permitted_group))
181+
username = get_username(get_identity())
182+
tenant = tenant_handler.tenant()
183+
reader = PermissionsReader(tenant, app.logger)
184+
groups = reader.permissions['user_groups'].get(username, [])
185+
if permitted_group not in groups:
186+
app.logger.debug("User %s is not in group %s, returning empty response" % (username, permitted_group))
187+
return jsonify({})
172188
return jsonify(data)
173189

174190

uv.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)