From 7abd1219ad1cd90b26b85af4c68e41ab61bcab2a Mon Sep 17 00:00:00 2001 From: Sivert Kronen Hatteberg <skh@uio.no> Date: Mon, 22 Nov 2021 09:03:35 +0100 Subject: [PATCH] Add the sponsor work-email on login, use the new FEIDE_EMAIL for persons Issue: GREG-121-FEIDE-EMAIL --- gregui/authentication/auth_backends.py | 7 +-- .../tests/authentication/test_user_profile.py | 44 ++++++++++++------- gregui/tests/conftest.py | 10 ++++- 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/gregui/authentication/auth_backends.py b/gregui/authentication/auth_backends.py index 5240629d..ee6f7aac 100644 --- a/gregui/authentication/auth_backends.py +++ b/gregui/authentication/auth_backends.py @@ -428,12 +428,12 @@ class GregOIDCBackend(ValidatingOIDCBackend): def _update_person_email(self, person: Person, new_email: str, source: str): """Add or update a users email.""" - logger.bind(identity_type=Identity.IdentityType.PRIVATE_EMAIL) + logger.bind(identity_type=Identity.IdentityType.FEIDE_EMAIL) # We only look at emails from the same source. emails: list[Identity] = [ x for x in person.identities.filter( - type=Identity.IdentityType.PRIVATE_EMAIL + type=Identity.IdentityType.FEIDE_EMAIL ).all() if x.source == source ] @@ -469,7 +469,7 @@ class GregOIDCBackend(ValidatingOIDCBackend): email_id = Identity( person=person, source=source, - type=Identity.IdentityType.PRIVATE_EMAIL, + type=Identity.IdentityType.FEIDE_EMAIL, value=new_email, verified=Identity.Verified.AUTOMATIC, verified_at=make_aware(datetime.datetime.now()), @@ -528,6 +528,7 @@ class GregOIDCBackend(ValidatingOIDCBackend): if userinfo["auth_type"] == "feide" and sponsor: sponsor.first_name = userinfo["first_name"] sponsor.last_name = userinfo["last_name"] + sponsor.work_email = userinfo["email"] sponsor.save() def _get_or_create_greg_user_profile(self, userinfo: dict, user: UserModel): diff --git a/gregui/tests/authentication/test_user_profile.py b/gregui/tests/authentication/test_user_profile.py index 0ea99b39..a5d60c95 100644 --- a/gregui/tests/authentication/test_user_profile.py +++ b/gregui/tests/authentication/test_user_profile.py @@ -37,7 +37,7 @@ def test_sponsor_first_login(sponsor_foo): @pytest.mark.django_db -def test_sponsor_update_name(sponsor_foo): +def test_sponsor_update(sponsor_foo): auth_request = RequestFactory().get("/foo", {"code": "foo", "state": "bar"}) auth_request.session = {} @@ -47,12 +47,15 @@ def test_sponsor_update_name(sponsor_foo): with pytest.raises(GregUserProfile.DoesNotExist): GregUserProfile.objects.get(sponsor=sponsor_foo) + assert sponsor_foo.first_name == "Sponsor" + assert sponsor_foo.work_email == "foo@example.org" + claims = { "sub": "subsub", "connect-userid_sec": [f"feide:{sponsor_foo.feide_id}"], "dataporten-userid_sec": [f"feide:{sponsor_foo.feide_id}", "nin:12345612345"], "name": f"Baz {sponsor_foo.last_name}", - "email": "foo@example.org", + "email": "baz@example.org", "email_verified": True, "picture": "https://foo.org/p:2192dff7-6989-4244-83cc-ae5e78875bdd", } @@ -63,6 +66,7 @@ def test_sponsor_update_name(sponsor_foo): assert user_profile.sponsor == sponsor_foo assert user_profile.sponsor.first_name == "Baz" + assert user_profile.sponsor.work_email == "baz@example.org" @pytest.mark.django_db @@ -158,7 +162,7 @@ def test_invited_user(invited_person): "connect-userid_sec": [f"feide:{feide_id}"], "dataporten-userid_sec": [f"feide:{feide_id}", f"nin:{nin}"], "name": f"{person.first_name} {person.last_name}", - "email": f"{person.private_email.value}", + "email": f"{feide_id}", "email_verified": True, "picture": "https://foo.org/p:2192dff7-6989-4244-83cc-ae5e78875bdd", } @@ -172,18 +176,25 @@ def test_invited_user(invited_person): person_nins = person.identities.filter( type=Identity.IdentityType.NORWEGIAN_NATIONAL_ID_NUMBER, - verified=Identity.Verified.AUTOMATIC, - ).all() - person_feide_ids = person.identities.filter( - type=Identity.IdentityType.FEIDE_ID, verified=Identity.Verified.AUTOMATIC ).all() assert len(person_nins) == 1 assert person_nins[0].verified == Identity.Verified.AUTOMATIC assert person_nins[0].value == nin + + person_feide_ids = person.identities.filter( + type=Identity.IdentityType.FEIDE_ID, + ).all() assert len(person_feide_ids) == 1 assert person_feide_ids[0].verified == Identity.Verified.AUTOMATIC assert person_feide_ids[0].value == feide_id + person_feide_email = person.identities.filter( + type=Identity.IdentityType.FEIDE_EMAIL + ).all() + assert len(person_feide_email) == 1 + assert person_feide_email[0].value == feide_id + assert person_feide_email[0].verified == Identity.Verified.AUTOMATIC + @pytest.mark.django_db def test_invited_user_no_id(invited_person_no_ids): @@ -224,7 +235,7 @@ def test_invited_user_no_id(invited_person_no_ids): "connect-userid_sec": ["feide:{feide_id}"], "dataporten-userid_sec": [f"feide:{feide_id}", f"nin:{nin}"], "name": f"{person.first_name} {person.last_name}", - "email": f"{person.private_email.value}", + "email": f"{feide_id}", "email_verified": True, "picture": "https://foo.org/p:2192dff7-6989-4244-83cc-ae5e78875bdd", } @@ -236,18 +247,21 @@ def test_invited_user_no_id(invited_person_no_ids): person_nins = person.identities.filter( type=Identity.IdentityType.NORWEGIAN_NATIONAL_ID_NUMBER, - verified=Identity.Verified.AUTOMATIC, - ).all() - person_feide_ids = person.identities.filter( - type=Identity.IdentityType.FEIDE_ID, verified=Identity.Verified.AUTOMATIC ).all() assert len(person_nins) == 1 assert person_nins[0].value == nin assert person_nins[0].verified == Identity.Verified.AUTOMATIC + + person_feide_ids = person.identities.filter( + type=Identity.IdentityType.FEIDE_ID + ).all() assert len(person_feide_ids) == 1 assert person_feide_ids[0].value == feide_id assert person_feide_ids[0].verified == Identity.Verified.AUTOMATIC - -def test_nin_feide(): - pass + person_feide_email = person.identities.filter( + type=Identity.IdentityType.FEIDE_EMAIL + ).all() + assert len(person_feide_email) == 1 + assert person_feide_email[0].value == feide_id + assert person_feide_email[0].verified == Identity.Verified.AUTOMATIC diff --git a/gregui/tests/conftest.py b/gregui/tests/conftest.py index 3132ea8c..79776046 100644 --- a/gregui/tests/conftest.py +++ b/gregui/tests/conftest.py @@ -82,11 +82,12 @@ def role_type_foo() -> RoleType: @pytest.fixture def create_sponsor() -> Callable[[str, str, str, OrganizationalUnit], Sponsor]: - def create_sponsor(feide_id, first_name, last_name, unit): + def create_sponsor(feide_id, first_name, last_name, unit, work_email=None): sponsor = Sponsor( feide_id=feide_id, first_name=first_name, last_name=last_name, + work_email=work_email, ) sponsor.save() @@ -99,7 +100,12 @@ def create_sponsor() -> Callable[[str, str, str, OrganizationalUnit], Sponsor]: @pytest.fixture def sponsor_foo_data() -> dict: - return dict(feide_id="foo@example.org", first_name="Sponsor", last_name="Bar") + return dict( + feide_id="foo@example.org", + first_name="Sponsor", + last_name="Bar", + work_email="foo@example.org", + ) @pytest.fixture -- GitLab