Files
notifications-admin/app/notify_client/invite_api_client.py
T

140 lines
4.7 KiB
Python
Raw Normal View History

2024-11-06 10:48:28 -05:00
import json
2024-10-21 16:41:33 -04:00
import secrets
2024-10-15 16:52:29 -04:00
from urllib.parse import unquote
from flask import current_app, request
2024-10-21 16:41:33 -04:00
from app import redis_client
2025-07-04 17:52:03 -07:00
from app.enums import InvitedUserStatus
from app.notify_client import NotifyAdminAPIClient, _attach_current_user, cache
2021-07-22 14:05:11 +01:00
from app.utils.user_permissions import (
2021-07-22 14:25:22 +01:00
all_ui_permissions,
2021-07-22 14:38:45 +01:00
translate_permissions_from_ui_to_db,
2018-02-28 15:37:49 +00:00
)
from notifications_utils.url_safe_token import generate_token
class InviteApiClient(NotifyAdminAPIClient):
def init_app(self, app):
super().init_app(app)
self.admin_url = app.config["ADMIN_BASE_URL"]
def create_invite(
self,
invite_from_id,
service_id,
email_address,
permissions,
auth_type,
folder_permissions,
):
data = {
"service": service_id,
"email_address": email_address,
"from_user": invite_from_id,
"permissions": ",".join(
sorted(translate_permissions_from_ui_to_db(permissions))
),
"auth_type": auth_type,
"invite_link_host": self.admin_url,
"folder_permissions": folder_permissions,
}
2016-08-11 14:20:43 +01:00
data = _attach_current_user(data)
2024-10-21 16:41:33 -04:00
ttl = 24 * 60 * 60
# make and store the state
state = generate_token(
str(request.remote_addr),
current_app.config["SECRET_KEY"],
current_app.config["DANGEROUS_SALT"],
)
state_key = f"login-state-{unquote(state)}"
redis_client.set(state_key, state, ex=ttl)
2024-10-21 16:41:33 -04:00
# make and store the nonce
nonce = secrets.token_urlsafe()
2024-11-06 10:41:20 -05:00
nonce_key = f"login-nonce-{unquote(nonce)}"
redis_client.set(nonce_key, nonce, ex=ttl) # save the nonce to redis.
2024-11-06 10:41:20 -05:00
2024-10-21 16:41:33 -04:00
data["nonce"] = nonce # This is passed to api for the invite url.
data["state"] = state # This is passed to api for the invite url.
2024-10-21 16:41:33 -04:00
resp = self.post(url=f"/service/{service_id}/invite", data=data)
2024-11-06 14:30:28 -05:00
resp_data = resp["data"]
invite_data_key = f"invitedata-{unquote(state)}"
2024-11-07 08:37:45 -05:00
redis_invite_data = resp["invite"]
redis_invite_data = json.dumps(redis_invite_data)
redis_client.set(invite_data_key, redis_invite_data, ex=ttl)
2024-11-06 14:30:28 -05:00
return resp_data
def get_invites_for_service(self, service_id):
return self.get(f"/service/{service_id}/invite")["data"]
2016-02-29 17:35:21 +00:00
2021-03-08 12:51:35 +00:00
def get_invited_user(self, invited_user_id):
return self.get(f"/invite/service/{invited_user_id}")["data"]
2021-03-08 12:51:35 +00:00
2021-03-05 17:04:35 +00:00
def get_invited_user_for_service(self, service_id, invited_user_id):
return self.get(f"/service/{service_id}/invite/{invited_user_id}")["data"]
def get_count_of_invites_with_permission(self, service_id, permission):
2021-07-22 14:25:22 +01:00
if permission not in all_ui_permissions:
raise TypeError(f"{permission} is not a valid permission")
return len(
[
invited_user
for invited_user in self.get_invites_for_service(service_id)
if invited_user.has_permission_for_service(service_id, permission)
]
)
def check_token(self, token):
return self.get(url=f"/invite/service/check/{token}")["data"]
def cancel_invited_user(self, service_id, invited_user_id):
2025-07-04 17:30:30 -07:00
data = {"status": InvitedUserStatus.CANCELLED}
2016-08-11 14:20:43 +01:00
data = _attach_current_user(data)
2023-12-08 21:44:24 -05:00
self.post(url=f"/service/{service_id}/invite/{invited_user_id}", data=data)
2016-02-29 17:35:21 +00:00
def resend_invite(self, service_id, invited_user_id):
ttl = 24 * 60 * 60
2024-11-01 12:12:04 -04:00
# make and store the state
state = generate_token(
str(request.remote_addr),
current_app.config["SECRET_KEY"],
current_app.config["DANGEROUS_SALT"],
)
state_key = f"login-state-{unquote(state)}"
redis_client.set(state_key, state, ex=ttl)
2024-11-01 12:12:04 -04:00
# make and store the nonce
nonce = secrets.token_urlsafe()
nonce_key = f"login-nonce-{unquote(nonce)}"
redis_client.set(nonce_key, nonce, ex=ttl)
2024-11-01 12:12:04 -04:00
data = {
"nonce": nonce,
"state": state,
}
2024-11-07 09:56:18 -05:00
resp = self.post(
2024-11-01 12:12:04 -04:00
url=f"/service/{service_id}/invite/{invited_user_id}/resend", data=data
)
2024-11-07 09:56:18 -05:00
invite_data_key = f"invitedata-{unquote(state)}"
redis_invite_data = resp["invite"]
redis_invite_data = json.dumps(redis_invite_data)
redis_client.set(invite_data_key, redis_invite_data, ex=ttl)
2024-11-07 09:56:18 -05:00
@cache.delete("service-{service_id}")
@cache.delete("user-{invited_user_id}")
def accept_invite(self, service_id, invited_user_id):
2025-07-04 17:30:30 -07:00
data = {"status": InvitedUserStatus.ACCEPTED}
2023-12-08 21:44:24 -05:00
self.post(url=f"/service/{service_id}/invite/{invited_user_id}", data=data)
2018-10-26 15:39:32 +01:00
invite_api_client = InviteApiClient()