This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch cc/11633-part2a in repository https://gitbox.apache.org/repos/asf/allura.git
commit 78f81e334bc743a62111ee92f2381b39bd06eeb9 Author: Carlos Cruz <[email protected]> AuthorDate: Wed May 13 10:53:46 2026 -0600 [#8606] Add encrypted field for email from the EmailAddress model --- Allura/allura/model/auth.py | 18 +++++++++++++++++- Allura/allura/tests/model/test_auth.py | 8 ++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py index 8fdbcc600..22eee8722 100644 --- a/Allura/allura/model/auth.py +++ b/Allura/allura/model/auth.py @@ -38,7 +38,7 @@ from tg import tmpl_context as c, app_globals as g from tg import request from ming import schema as S -from ming.odm import session, state +from ming.odm import session, state, MapperExtension from ming.odm import FieldProperty, RelationProperty, ForeignIdProperty from ming.odm.declarative import MappedClass from ming.odm.odmsession import ThreadLocalODMSession @@ -74,6 +74,20 @@ def __init__(self, **kwargs): super().__init__(User, allow_none=True, **kwargs) +class EmailAddressMapperExtension(MapperExtension): + + def before_insert(self, instance, state, sess): + self._set_email_encrypted(instance, state) + + def before_update(self, instance, state, sess): + self._set_email_encrypted(instance, state) + + @staticmethod + def _set_email_encrypted(instance, state): + email = state.document.get('email') + state.document['email_encrypted'] = instance.encr(email) + + class EmailAddress(MappedClass): re_format = re.compile(r'^.*\s+<(.*)>\s*$') @@ -82,11 +96,13 @@ class __mongometa__: session = main_orm_session indexes = ['nonce', ] unique_indexes = [('email', 'claimed_by_user_id'), ] + extensions = [EmailAddressMapperExtension] query: Query[EmailAddress] _id = FieldProperty(S.ObjectId) email = FieldProperty(str) + email_encrypted = FieldProperty(S.Binary) claimed_by_user_id = FieldProperty(S.ObjectId, if_missing=None) confirmed = FieldProperty(bool, if_missing=False) confirmed_date = FieldProperty(datetime) diff --git a/Allura/allura/tests/model/test_auth.py b/Allura/allura/tests/model/test_auth.py index 2496c8ab1..839b9912e 100644 --- a/Allura/allura/tests/model/test_auth.py +++ b/Allura/allura/tests/model/test_auth.py @@ -64,6 +64,14 @@ def test_email_address(self): c.user.claim_address('[email protected]') assert '[email protected]' in c.user.email_addresses + def test_email_address_stores_encrypted_email(self): + addr = M.EmailAddress.create('[email protected]') + direct_addr = M.EmailAddress(email='[email protected]') + ThreadLocalODMSession.flush_all() + + assert addr.email_encrypted == M.EmailAddress.encr('[email protected]') + assert direct_addr.email_encrypted == M.EmailAddress.encr('[email protected]') + def selftest_email_address_lookup_helpers(): addr = M.EmailAddress.create('[email protected]') nobody = M.EmailAddress.create('[email protected]')
