def test_associate_with_user_id_collision_raises(self): firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) with self.assertRaisesRegexp(Exception, 'already associated'): firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid'))
def test_associate_existing_auth_id_to_user_id_raises(self): auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('sub', 'uid')) with self.assertRaisesRegexp(Exception, 'already mapped to user_id'): auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('sub', 'uid'))
def test_associate_auth_id_with_user_id_with_collision_raises(self): self.stub.associate_auth_id_with_user_id(auth_domain.AuthIdUserIdPair( 'aid', 'uid')) with self.assertRaisesRegex(Exception, 'already associated'): self.stub.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid'))
def test_get_multi_associations_that_exist(self): self.put_association(auth_domain.AuthIdUserIdPair('sub1', 'uid1')) self.put_association(auth_domain.AuthIdUserIdPair('sub2', 'uid2')) self.put_association(auth_domain.AuthIdUserIdPair('sub3', 'uid3')) self.assertEqual( auth_services.get_multi_user_ids_from_auth_ids( ['sub1', 'sub2', 'sub3']), ['uid1', 'uid2', 'uid3'])
def test_get_multi_associations_when_one_does_not_exist(self): self.put_association(auth_domain.AuthIdUserIdPair('sub1', 'uid1')) # Mapping from sub2 -> uid2 missing. self.put_association(auth_domain.AuthIdUserIdPair('sub3', 'uid3')) self.assertEqual( auth_services.get_multi_user_ids_from_auth_ids( ['sub1', 'sub2', 'sub3']), ['uid1', None, 'uid3'])
def test_associate_with_auth_id_collision_raises(self): firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) # Erase the user_id collision, but leave the auth_id collision. auth_models.UserIdByFirebaseAuthIdModel.delete_by_id('aid') with self.assertRaisesRegexp(Exception, 'already associated'): firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid'))
def test_associate_multi_auth_ids_with_user_ids_with_collision_raises(self): self.stub.associate_auth_id_with_user_id(auth_domain.AuthIdUserIdPair( 'aid1', 'uid1')) with self.assertRaisesRegexp(Exception, 'already associated'): self.stub.associate_multi_auth_ids_with_user_ids( [auth_domain.AuthIdUserIdPair('aid1', 'uid1'), auth_domain.AuthIdUserIdPair('aid2', 'uid2'), auth_domain.AuthIdUserIdPair('aid3', 'uid3')])
def test_associate_auth_id_with_user_id_with_collision_raises( self) -> None: auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) with self.assertRaisesRegex( Exception, 'already associated'): # type: ignore[no-untyped-call] auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid'))
def test_get_multi_associations_with_one_missing(self): firebase_auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('aid1', 'uid1')) # The aid2 <-> uid2 association is missing. firebase_auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('aid3', 'uid3')) self.assertEqual( firebase_auth_services.get_multi_user_ids_from_auth_ids( ['aid1', 'aid2', 'aid3']), ['uid1', None, 'uid3'])
def test_associate_multi_an_existing_auth_id_to_user_id_mapping_raises( self): auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('sub1', 'uid1')) with self.assertRaisesRegexp(Exception, 'associations already exist'): auth_services.associate_multi_auth_ids_to_user_ids([ auth_domain.AuthIdUserIdPair('sub1', 'uid1'), auth_domain.AuthIdUserIdPair('sub2', 'uid2'), auth_domain.AuthIdUserIdPair('sub3', 'uid3'), ])
def test_associate_multi_auth_ids_with_user_ids_without_collisions(self): self.stub.associate_multi_auth_ids_with_user_ids( [auth_domain.AuthIdUserIdPair('aid1', 'uid1'), auth_domain.AuthIdUserIdPair('aid2', 'uid2'), auth_domain.AuthIdUserIdPair('aid3', 'uid3')]) self.assertEqual( [self.stub.get_user_id_from_auth_id('aid1'), self.stub.get_user_id_from_auth_id('aid2'), self.stub.get_user_id_from_auth_id('aid3')], ['uid1', 'uid2', 'uid3'])
def test_associate_multi_with_auth_id_collision_raises(self): gae_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid1', 'uid1')) # Erase the user_id collision, but leave the auth_id collision. auth_models.UserIdentifiersModel.delete_by_id('aid1') with self.assertRaisesRegexp(Exception, 'already associated'): gae_auth_services.associate_multi_auth_ids_with_user_ids( [auth_domain.AuthIdUserIdPair('aid1', 'uid1'), auth_domain.AuthIdUserIdPair('aid2', 'uid2'), auth_domain.AuthIdUserIdPair('aid3', 'uid3')])
def test_associate_multi_without_collisions(self): firebase_auth_services.associate_multi_auth_ids_with_user_ids( [auth_domain.AuthIdUserIdPair('aid1', 'uid1'), auth_domain.AuthIdUserIdPair('aid2', 'uid2'), auth_domain.AuthIdUserIdPair('aid3', 'uid3')]) self.assertEqual( [firebase_auth_services.get_user_id_from_auth_id('aid1'), firebase_auth_services.get_user_id_from_auth_id('aid2'), firebase_auth_services.get_user_id_from_auth_id('aid3')], ['uid1', 'uid2', 'uid3'])
def test_associate_multi_new_auth_ids_to_user_ids(self): auth_services.associate_multi_auth_ids_to_user_ids([ auth_domain.AuthIdUserIdPair('sub1', 'uid1'), auth_domain.AuthIdUserIdPair('sub2', 'uid2'), auth_domain.AuthIdUserIdPair('sub3', 'uid3'), ]) self.assertEqual([ self.get_associated_user_id('sub1'), self.get_associated_user_id('sub2'), self.get_associated_user_id('sub3') ], ['uid1', 'uid2', 'uid3'])
def test_get_multi_associations_with_all_present(self): firebase_auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('aid1', 'uid1')) firebase_auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('aid2', 'uid2')) firebase_auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('aid3', 'uid3')) self.assertEqual( firebase_auth_services.get_multi_user_ids_from_auth_ids( ['aid1', 'aid2', 'aid3']), ['uid1', 'uid2', 'uid3'])
def test_get_multi_associations_with_one_missing(self): self.stub.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid1', 'uid1')) # The aid2 <-> uid2 association is missing. self.stub.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid3', 'uid3')) self.assertEqual( self.stub.get_multi_user_ids_from_auth_ids( ['aid1', 'aid2', 'aid3']), ['uid1', None, 'uid3']) self.assertEqual( self.stub.get_multi_auth_ids_from_user_ids( ['uid1', 'uid2', 'uid3']), ['aid1', None, 'aid3'])
def test_get_multi_associations_with_all_present(self): self.stub.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid1', 'uid1')) self.stub.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid2', 'uid2')) self.stub.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid3', 'uid3')) self.assertEqual( self.stub.get_multi_user_ids_from_auth_ids( ['aid1', 'aid2', 'aid3']), ['uid1', 'uid2', 'uid3']) self.assertEqual( self.stub.get_multi_auth_ids_from_user_ids( ['uid1', 'uid2', 'uid3']), ['aid1', 'aid2', 'aid3'])
def test_present_association_is_not_considered_to_be_deleted(self): firebase_admin.auth.create_user(uid='aid') firebase_auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) self.assertFalse(firebase_auth_services.are_auth_associations_deleted( 'uid'))
def setUp(self): super(FirebaseSpecificAssociationTests, self).setUp() self._uninstall_stub = FirebaseAdminSdkStub.install(self) firebase_admin.auth.create_user(uid=self.AUTH_ID) firebase_auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair(self.AUTH_ID, self.USER_ID))
def setUp(self): super(DeleteAuthAssociationsTests, self).setUp() self.firebase_sdk_stub.create_user(self.AUTH_ID) self.signup(self.EMAIL, self.USERNAME) self.user_id = self.get_user_id_from_email(self.EMAIL) firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair(self.AUTH_ID, self.user_id))
def setUp(self): super(DeleteAuthAssociationsTests, self).setUp() self.firebase_sdk_stub.create_user(self.AUTH_ID) user_settings = user_services.create_new_user(self.AUTH_ID, self.EMAIL) self.user_id = user_settings.user_id firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair(self.AUTH_ID, self.user_id))
def test_present_association_is_not_considered_to_be_deleted(self): self.firebase_sdk_stub.create_user('aid') firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) self.assertFalse( firebase_auth_services. verify_external_auth_associations_are_deleted('uid'))
def test_get_association_that_is_present(self): firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) self.assertEqual( firebase_auth_services.get_user_id_from_auth_id('aid'), 'uid') self.assertEqual( firebase_auth_services.get_auth_id_from_user_id('uid'), 'aid')
def test_associate_without_collision(self): firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) self.assertEqual( firebase_auth_services.get_user_id_from_auth_id('aid'), 'uid') self.assertEqual( firebase_auth_services.get_auth_id_from_user_id('uid'), 'aid')
def reduce(key, values): # The reduce() function must be static, so we manually create a "cls" # variable instead of changing the function into a classmethod. cls = PopulateFirebaseAccountsOneOffJob if key == cls.POPULATED_KEY: yield (cls.AUDIT_KEY, len(values)) return elif key in (cls.SUPER_ADMIN_ACK, cls.SYSTEM_COMMITTER_ACK): yield (key, values) return # NOTE: This is only sorted to make unit testing easier. user_fields = sorted(ast.literal_eval(v) for v in values) user_records = [ firebase_auth.ImportUserRecord( uid=auth_id, email=email, email_verified=True, custom_claims=('{"role":"%s"}' % feconf.FIREBASE_ROLE_SUPER_ADMIN if user_is_super_admin else None)) for auth_id, _, email, user_is_super_admin in user_fields ] # The Firebase Admin SDK places a hard-limit on the number of users that # can be "imported" in a single call. To compensate, we break up the # users into chunks. offsets = python_utils.RANGE( 0, len(user_records), cls.MAX_USERS_FIREBASE_CAN_IMPORT_PER_CALL) results = (cls.populate_firebase( [r for r in record_group if r is not None]) for record_group in utils.grouper( user_records, cls.MAX_USERS_FIREBASE_CAN_IMPORT_PER_CALL)) assocs_to_create = [] for offset, (result, exception) in python_utils.ZIP(offsets, results): if exception is not None: yield (cls.ERROR_KEY, repr(exception)) else: successful_indices = set( python_utils.RANGE(result.success_count + result.failure_count)) for error in result.errors: successful_indices.remove(error.index) debug_info = 'Import user_id=%r failed: %s' % ( user_fields[offset + error.index][1], error.reason) yield (cls.ERROR_KEY, debug_info) assocs_to_create.extend( auth_domain.AuthIdUserIdPair(*user_fields[offset + i][:2]) for i in successful_indices) if assocs_to_create: firebase_auth_services.associate_multi_auth_ids_with_user_ids( assocs_to_create) yield (cls.SUCCESS_KEY, len(assocs_to_create))
def setUp(self): super(FirebaseAccountWipeoutTests, self).setUp() self._uninstall_stub = FirebaseAdminSdkStub.install(self) firebase_admin.auth.create_user(uid=self.AUTH_ID) self.signup(self.EMAIL, self.USERNAME) self.user_id = self.get_user_id_from_email(self.EMAIL) firebase_auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair(self.AUTH_ID, self.user_id)) wipeout_service.pre_delete_user(self.user_id)
def test_delete_association_when_it_is_present(self): # This operation creates the external auth association. self.stub.associate_auth_id_with_user_id(auth_domain.AuthIdUserIdPair( 'aid', 'uid')) self.assertFalse( self.stub.verify_external_auth_associations_are_deleted('uid')) self.stub.delete_external_auth_associations('uid') self.assertTrue( self.stub.verify_external_auth_associations_are_deleted('uid'))
def test_delete_association_when_it_is_present(self): firebase_admin.auth.create_user(uid='aid') firebase_auth_services.associate_auth_id_to_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) self.assertFalse(firebase_auth_services.are_auth_associations_deleted( 'uid')) firebase_auth_services.delete_auth_associations('uid') self.assertTrue(firebase_auth_services.are_auth_associations_deleted( 'uid'))
def test_delete_association_when_it_is_present(self): self.firebase_sdk_stub.create_user('aid') firebase_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) self.assertFalse( firebase_auth_services. verify_external_auth_associations_are_deleted('uid')) firebase_auth_services.delete_external_auth_associations('uid') self.assertTrue( firebase_auth_services. verify_external_auth_associations_are_deleted('uid'))
def test_get_association_that_is_present_and_marked_as_deleted(self): gae_auth_services.associate_auth_id_with_user_id( auth_domain.AuthIdUserIdPair('aid', 'uid')) assoc_by_auth_id_model = auth_models.UserIdentifiersModel.get('aid') assoc_by_auth_id_model.deleted = True assoc_by_auth_id_model.update_timestamps() assoc_by_auth_id_model.put() self.assertEqual(gae_auth_services.get_user_id_from_auth_id('aid'), 'uid') self.assertEqual(gae_auth_services.get_auth_id_from_user_id('uid'), 'aid')