|
| 1 | +from email.mime.text import MIMEText |
| 2 | +import smtplib |
1 | 3 | from typing import Union, Any, List, Dict |
2 | 4 | import os |
3 | 5 | import requests |
|
13 | 15 | logger.setLevel(logging.DEBUG) |
14 | 16 |
|
15 | 17 | KRATOS_ADMIN_URL = os.getenv("KRATOS_ADMIN_URL") |
| 18 | +SMTP_HOST = os.getenv("SMTP_HOST") |
| 19 | +SMTP_PORT = os.getenv("SMTP_PORT") |
| 20 | +SMTP_USER = os.getenv("SMTP_USER") |
| 21 | +SMTP_PASSWORD = os.getenv("SMTP_PASSWORD") |
16 | 22 |
|
17 | 23 | # user_id -> {"identity" -> full identity, "simple" -> {"id": str, "mail": str, "firstName": str, "lastName": str}} |
18 | 24 | # "collected" -> timestamp |
@@ -156,7 +162,7 @@ def resolve_user_name_by_id(user_id: str) -> Dict[str, str]: |
156 | 162 | i = __get_identity(user_id, False) |
157 | 163 | if i: |
158 | 164 | i = i["identity"] |
159 | | - return i["traits"]["name"] |
| 165 | + return i["traits"]["name"] if "name" in i["traits"] else None |
160 | 166 | return None |
161 | 167 |
|
162 | 168 |
|
@@ -191,3 +197,69 @@ def resolve_user_name_and_email_by_id(user_id: str) -> dict: |
191 | 197 | if i and "traits" in i and i["traits"]: |
192 | 198 | return i["traits"]["name"], i["traits"]["email"] |
193 | 199 | return None |
| 200 | + |
| 201 | + |
| 202 | +def create_user_kratos(email: str, provider: str = None): |
| 203 | + payload_registration = { |
| 204 | + "schema_id": "default", |
| 205 | + "traits": {"email": email}, |
| 206 | + } |
| 207 | + if provider: |
| 208 | + payload_registration["metadata_public"] = { |
| 209 | + "registration_scope": { |
| 210 | + "provider_id": provider, |
| 211 | + "invitation_sso": True, |
| 212 | + } |
| 213 | + } |
| 214 | + response_create = requests.post( |
| 215 | + f"{KRATOS_ADMIN_URL}/identities", |
| 216 | + json=payload_registration, |
| 217 | + ) |
| 218 | + return response_create.json() if response_create.ok else None |
| 219 | + |
| 220 | + |
| 221 | +def delete_user_kratos(user_id: str) -> bool: |
| 222 | + response_delete = requests.delete(f"{KRATOS_ADMIN_URL}/identities/{user_id}") |
| 223 | + if response_delete.ok: |
| 224 | + del KRATOS_IDENTITY_CACHE[user_id] |
| 225 | + return True |
| 226 | + return False |
| 227 | + |
| 228 | + |
| 229 | +def get_recovery_link(user_id: str) -> str: |
| 230 | + payload_recovery_link = { |
| 231 | + "expires_in": "48h", |
| 232 | + "identity_id": user_id, |
| 233 | + } |
| 234 | + response_link = requests.post( |
| 235 | + f"{KRATOS_ADMIN_URL}/recovery/link", json=payload_recovery_link |
| 236 | + ) |
| 237 | + return response_link.json() if response_link.ok else None |
| 238 | + |
| 239 | + |
| 240 | +def email_with_link(to_email: str, recovery_link: str) -> None: |
| 241 | + msg = MIMEText( |
| 242 | + f"Welcome! Click the link to complete your account setup:\n\n{recovery_link}" |
| 243 | + ) |
| 244 | + msg["Subject"] = "You're invited to our app!" |
| 245 | + |
| 246 | + msg["To"] = to_email |
| 247 | + |
| 248 | + with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as server: |
| 249 | + if SMTP_USER and SMTP_PASSWORD: |
| 250 | + server.ehlo() |
| 251 | + server.starttls() |
| 252 | + server.login(SMTP_USER, SMTP_PASSWORD) |
| 253 | + server.send_message(msg) |
| 254 | + |
| 255 | + |
| 256 | +def check_user_exists(email: str) -> bool: |
| 257 | + request = requests.get( |
| 258 | + f"{KRATOS_ADMIN_URL}/identities?preview_credentials_identifier_similar={quote(email)}" |
| 259 | + ) |
| 260 | + if request.ok: |
| 261 | + identities = request.json() |
| 262 | + for i in identities: |
| 263 | + if i["traits"]["email"].lower() == email.lower(): |
| 264 | + return True |
| 265 | + return False |
0 commit comments