Exemple #1
0
 def setUp(self):
     factory = RequestFactory()
     self.request = factory.get("/")
     self.user = UserProfile(
         airavataInternalUserId=f"testuser@{GATEWAY_ID}",
         userId="testuser",
         gatewayId=GATEWAY_ID,
         emails=["*****@*****.**"],
         firstName="Test",
         lastName="User")
    def test_create_group_sends_user_added_to_group_signal(self):

        url = reverse('django_airavata_api:group-list')
        data = {
            "id":
            None,
            "name":
            "test",
            "description":
            None,
            "members": [
                f"{self.user.username}@{GATEWAY_ID}",  # owner
                f"testuser1@{GATEWAY_ID}"
            ],
            "admins": []
        }
        request = self.factory.post(url, data)
        force_authenticate(request, self.user)

        # Mock api clients
        group_manager_mock = MagicMock(name='group_manager')
        user_profile_mock = MagicMock(name='user_profile')
        request.profile_service = {
            'group_manager': group_manager_mock,
            'user_profile': user_profile_mock,
        }
        request.airavata_client = MagicMock(name="airavata_client")
        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
            gatewayId=GATEWAY_ID,
            adminsGroupId="adminsGroupId",
            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId")
        request.authz_token = "dummy"
        request.session = {}
        group_manager_mock.createGroup.return_value = "abc123"
        user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        user_profile_mock.getUserProfileById.return_value = user_profile

        # Mock signal handler to verify 'user_added_to_group' signal is sent
        user_added_to_group_handler = MagicMock()
        signals.user_added_to_group.connect(user_added_to_group_handler,
                                            sender=views.GroupViewSet)
        group_create = views.GroupViewSet.as_view({'post': 'create'})
        response = group_create(request)
        self.assertEquals(201, response.status_code)
        self.assertEquals("abc123", response.data['id'])
        user_added_to_group_handler.assert_called_once()
        args, kwargs = user_added_to_group_handler.call_args
        self.assertEquals("abc123", kwargs["groups"][0].id)
        self.assertIs(user_profile, kwargs["user"])
Exemple #3
0
    def update(self, instance, validated_data):
        # Compute lists of ids to grant/revoke READ/WRITE
        existing_user_permissions = {
            user['user'].airavataInternalUserId: user['permissionType']
            for user in instance['userPermissions']
        }
        new_user_permissions = {
            user['user']['airavataInternalUserId']: user['permissionType']
            for user in validated_data['userPermissions']
        }

        (user_grant_read_permission, user_grant_write_permission,
         user_revoke_read_permission, user_revoke_write_permission) = \
            self._compute_all_revokes_and_grants(existing_user_permissions,
                                                 new_user_permissions)

        existing_group_permissions = {
            group['group'].id: group['permissionType']
            for group in instance['groupPermissions']
        }
        new_group_permissions = {
            group['group']['id']: group['permissionType']
            for group in validated_data['groupPermissions']
        }

        (group_grant_read_permission, group_grant_write_permission,
         group_revoke_read_permission, group_revoke_write_permission) = \
            self._compute_all_revokes_and_grants(existing_group_permissions,
                                                 new_group_permissions)

        instance['_user_grant_read_permission'] = user_grant_read_permission
        instance['_user_grant_write_permission'] = user_grant_write_permission
        instance['_user_revoke_read_permission'] = user_revoke_read_permission
        instance[
            '_user_revoke_write_permission'] = user_revoke_write_permission
        instance['_group_grant_read_permission'] = group_grant_read_permission
        instance[
            '_group_grant_write_permission'] = group_grant_write_permission
        instance[
            '_group_revoke_read_permission'] = group_revoke_read_permission
        instance[
            '_group_revoke_write_permission'] = group_revoke_write_permission
        instance['userPermissions'] = [{
            'user': UserProfile(**data['user']),
            'permissionType': data['permissionType']
        } for data in validated_data.get('userPermissions',
                                         instance['userPermissions'])]
        instance['groupPermissions'] = [{
            'group':
            GroupModel(**data['group']),
            'permissionType':
            data['permissionType']
        } for data in validated_data.get('groupPermissions',
                                         instance['groupPermissions'])]
        return instance
    def test_update_group_sends_user_added_to_group_signal(self):
        url = reverse('django_airavata_api:group-detail',
                      kwargs={'group_id': 'abc123'})
        data = {
            "id":
            "abc123",
            "name":
            "test",
            "description":
            None,
            "members": [
                f"{self.user.username}@{GATEWAY_ID}",  # owner
                f"testuser1@{GATEWAY_ID}",  # existing member
                f"testuser3@{GATEWAY_ID}"
            ],  # new member
            "admins": []
        }
        request = self.factory.put(url, data)
        force_authenticate(request, self.user)

        # Mock api clients
        group_manager_mock = MagicMock(name='group_manager')
        user_profile_mock = MagicMock(name='user_profile')
        request.profile_service = {
            'group_manager': group_manager_mock,
            'user_profile': user_profile_mock,
        }
        request.airavata_client = MagicMock(name="airavata_client")
        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
            gatewayId=GATEWAY_ID,
            adminsGroupId="adminsGroupId",
            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId")
        request.authz_token = "dummy"
        request.session = {}

        # mock getGroup
        group = GroupModel(
            id="abc123",
            name="My Group",
            ownerId=f"{self.user.username}@{GATEWAY_ID}",
            members=[
                f"{self.user.username}@{GATEWAY_ID}",  # owner
                f"testuser1@{GATEWAY_ID}",  # existing member
                f"testuser2@{GATEWAY_ID}",  # new member
            ],
            admins=[])
        group_manager_mock.getGroup.return_value = group

        # Only user added is testuser3, so getUserProfileById will be called
        # for that user
        user_profile = UserProfile(
            airavataInternalUserId=f"testuser3@{GATEWAY_ID}",
            userId="testuser3",
            firstName="Test",
            lastName="User3",
            emails=["*****@*****.**"])
        user_profile_mock.getUserProfileById.return_value = user_profile

        # Mock signal handler to verify 'user_added_to_group' signal is sent
        user_added_to_group_handler = MagicMock()
        signals.user_added_to_group.connect(user_added_to_group_handler,
                                            sender=views.GroupViewSet)
        group_update = views.GroupViewSet.as_view({'put': 'update'})
        response = group_update(request, group_id="abc123")
        self.assertEquals(200, response.status_code)
        self.assertEquals("abc123", response.data['id'])

        # verify addUsersToGroup
        group_manager_mock.addUsersToGroup.assert_called_once()
        args, kwargs = group_manager_mock.addUsersToGroup.call_args
        self.assertEqual(args[1], [f"testuser3@{GATEWAY_ID}"])

        # verify removeUsersFromGroup
        group_manager_mock.removeUsersFromGroup.assert_called_once()
        args, kwargs = group_manager_mock.removeUsersFromGroup.call_args
        self.assertEqual(args[1], [f"testuser2@{GATEWAY_ID}"])

        # verify updateGroup
        group_manager_mock.updateGroup.assert_called_once()

        user_added_to_group_handler.assert_called_once()
        args, kwargs = user_added_to_group_handler.call_args
        self.assertEquals("abc123", kwargs["groups"][0].id)
        self.assertIs(user_profile, kwargs["user"])
    def test_update_that_does_not_add_user_to_groups(self, iam_admin_client):

        username = "******"
        url = reverse('django_airavata_api:iam-user-profile-detail',
                      kwargs={'user_id': username})
        data = {
            "airavataInternalUserId": f"{username}@{GATEWAY_ID}",
            "userId": username,
            "gatewayId": GATEWAY_ID,
            "email": "*****@*****.**",
            "firstName": "Test",
            "lastName": "User1",
            "airavataUserProfileExists": True,
            "enabled": True,
            "emailVerified": True,
            "groups": [
                {
                    "id": "group1",
                    "name": "Group 1"
                },
            ]
        }
        request = self.factory.put(url, data)
        force_authenticate(request, self.user)
        request.is_gateway_admin = True

        # Mock api clients
        iam_user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        iam_admin_client.get_user.return_value = iam_user_profile
        group_manager_mock = MagicMock(name='group_manager')
        user_profile_mock = MagicMock(name='user_profile')
        request.profile_service = {
            'group_manager': group_manager_mock,
            'user_profile': user_profile_mock,
        }
        request.authz_token = "dummy"
        user_profile_mock.doesUserExist.return_value = True
        user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        user_profile_mock.getUserProfileById.return_value = user_profile
        group_manager_mock.getAllGroupsUserBelongs.return_value = [
            GroupModel(id="group1")
        ]

        request.airavata_client = MagicMock(name="airavata_client")
        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
            gatewayId=GATEWAY_ID,
            adminsGroupId="adminsGroupId",
            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId")
        request.session = {}

        # Mock signal handler to verify 'user_added_to_group' signal is sent
        user_added_to_group_handler = MagicMock(
            name="user_added_to_group_handler")
        signals.user_added_to_group.connect(user_added_to_group_handler,
                                            sender=views.IAMUserViewSet)
        iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
        response = iam_user_update(request, user_id=username)
        self.assertEquals(200, response.status_code)

        user_profile_mock.doesUserExist.assert_called_once()
        group_manager_mock.getAllGroupsUserBelongs.assert_called_once()

        # Since user wasn't added to a group, these all should not have been
        # called
        user_profile_mock.getUserProfileById.assert_not_called()
        group_manager_mock.getGroup.assert_not_called()
        group_manager_mock.addUsersToGroup.assert_not_called()
        user_added_to_group_handler.assert_not_called()
    def test_update_that_adds_user_to_multiple_groups(self, iam_admin_client):

        username = "******"
        url = reverse('django_airavata_api:iam-user-profile-detail',
                      kwargs={'user_id': username})
        data = {
            "airavataInternalUserId":
            f"{username}@{GATEWAY_ID}",
            "userId":
            username,
            "gatewayId":
            GATEWAY_ID,
            "email":
            "*****@*****.**",
            "firstName":
            "Test",
            "lastName":
            "User1",
            "airavataUserProfileExists":
            True,
            "enabled":
            True,
            "emailVerified":
            True,
            "groups": [
                {
                    "id": "group1",
                    "name": "Group 1"
                },
                {
                    "id": "group2",
                    "name": "Group 2"
                },
                {
                    "id": "group3",
                    "name": "Group 3"
                },
            ]
        }
        request = self.factory.put(url, data)
        force_authenticate(request, self.user)
        request.is_gateway_admin = True

        # Mock api clients
        iam_user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        iam_admin_client.get_user.return_value = iam_user_profile
        group_manager_mock = MagicMock(name='group_manager')
        user_profile_mock = MagicMock(name='user_profile')
        request.profile_service = {
            'group_manager': group_manager_mock,
            'user_profile': user_profile_mock,
        }
        request.authz_token = "dummy"
        user_profile_mock.doesUserExist.return_value = True
        user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        user_profile_mock.getUserProfileById.return_value = user_profile
        group_manager_mock.getAllGroupsUserBelongs.return_value = [
            GroupModel(id="group1")
        ]

        def side_effect(authz_token, group_id):
            if group_id == "group2":
                return GroupModel(id="group2", name="Group 2")
            elif group_id == "group3":
                return GroupModel(id="group3", name="Group 3")
            else:
                raise Exception("Unexpected group id: " + group_id)

        group_manager_mock.getGroup.side_effect = side_effect
        request.airavata_client = MagicMock(name="airavata_client")
        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
            gatewayId=GATEWAY_ID,
            adminsGroupId="adminsGroupId",
            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId")
        request.session = {}

        # Mock signal handler to verify 'user_added_to_group' signal is sent
        user_added_to_group_handler = MagicMock(
            name="user_added_to_group_handler")
        signals.user_added_to_group.connect(user_added_to_group_handler,
                                            sender=views.IAMUserViewSet)
        iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
        response = iam_user_update(request, user_id=username)
        self.assertEquals(200, response.status_code)

        user_profile_mock.doesUserExist.assert_called_once()
        group_manager_mock.getAllGroupsUserBelongs.assert_called_once()

        user_profile_mock.getUserProfileById.assert_called_once()
        args, kwargs = user_profile_mock.getUserProfileById.call_args
        self.assertSequenceEqual(
            args, [request.authz_token, "testuser1", GATEWAY_ID])

        group_manager_mock.getGroup.assert_has_calls([
            call(request.authz_token, "group2"),
            call(request.authz_token, "group3")
        ],
                                                     any_order=True)

        group_manager_mock.addUsersToGroup.assert_has_calls([
            call(request.authz_token, [f"testuser1@{GATEWAY_ID}"], "group2"),
            call(request.authz_token, [f"testuser1@{GATEWAY_ID}"], "group3"),
        ],
                                                            any_order=True)

        # user_added_to_group signal should only be called once, with both
        # groups passed to it
        user_added_to_group_handler.assert_called_once()
        args, kwargs = user_added_to_group_handler.call_args
        self.assertEqual(kwargs["sender"], views.IAMUserViewSet)
        self.assertEqual(kwargs["user"], user_profile)
        self.assertSetEqual({"group2", "group3"},
                            {g.id
                             for g in kwargs["groups"]})
def add_user_profile():
    try:
        profile = UserProfile()
        profile.gatewayId = "default"
        profile.userId = "default-admin"
        profile.emails = ['*****@*****.**']
        profile.airavataInternalUserId = "default-admin"
        profile.userModelVersion = "1.0.0"
        profile.firstName = "Isuru"
        profile.lastName = "Ranawaka"
        profile.creationTime = 1576103354
        profile.lastAccessTime = 1576103296
        profile.validUntil = 1607725696
        profile.State = Status.ACTIVE
        added_profile = client.add_user_profile(token, profile)
        print("Add user proflile", added_profile)
    except TException:
        logger.exception("Error Occurred")