From a05f5d70ebb435e69827a7b353f33f84ad4ac43e Mon Sep 17 00:00:00 2001
From: Helge Jung <hej@c3pb.de>
Date: Mon, 25 Dec 2023 16:02:10 +0100
Subject: [PATCH] add utils.mail2uuid() for frab-style email-derived user GUID
 generation

---
 src/core/tests/utils.py | 7 ++++++-
 src/core/utils.py       | 6 ++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/core/tests/utils.py b/src/core/tests/utils.py
index 1a7ff7a53..568be24a7 100644
--- a/src/core/tests/utils.py
+++ b/src/core/tests/utils.py
@@ -1,8 +1,9 @@
+import uuid
 from datetime import timedelta
 
 from django.test import TestCase
 
-from ..utils import GitRepo, mask_url, scheme_and_netloc_from_url, str2timedelta
+from ..utils import GitRepo, mail2uuid, mask_url, scheme_and_netloc_from_url, str2timedelta
 
 
 class UtilsTests(TestCase):
@@ -41,6 +42,10 @@ class UtilsTests(TestCase):
         for check in checks:
             self.assertEqual(check[1], scheme_and_netloc_from_url(check[0]))
 
+    def test_mail2uuid(self):
+        expected_uuid = uuid.UUID('c25334d0-9539-55e3-92b4-f559c384522b')
+        self.assertEqual(expected_uuid, mail2uuid('hub@cccv.de'))
+
 
 class GitRepoOfflineTests(TestCase):
     def test_invalid_url_local_path(self):
diff --git a/src/core/utils.py b/src/core/utils.py
index f7a3ca8cb..e69123e00 100644
--- a/src/core/utils.py
+++ b/src/core/utils.py
@@ -4,6 +4,7 @@ import re
 import shutil
 import subprocess
 import tempfile
+import uuid
 from datetime import UTC, datetime, timedelta
 from io import BytesIO
 from pathlib import Path
@@ -223,6 +224,11 @@ def download_from_url(url: str) -> Tuple[str, bytes]:
     return filename, data
 
 
+def mail2uuid(mail: str, prefix: str = 'acct:', suffix: str = '') -> uuid.UUID:
+    uri = prefix + mail + suffix
+    return uuid.uuid5(uuid.NAMESPACE_URL, uri)
+
+
 class GitCloneError(Exception):
     pass
 
-- 
GitLab