diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/AppsmithRepository.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/AppsmithRepository.java index bbd27a8816..15559ea6dd 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/AppsmithRepository.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/AppsmithRepository.java @@ -22,7 +22,9 @@ public interface AppsmithRepository { Flux queryAll(List criterias, List includeFields, AclPermission permission, Sort sort); - T setUserPermissionsInObject(T obj, Set permissionGroups); + Mono setUserPermissionsInObject(T obj, Set permissionGroups); + + Mono setUserPermissionsInObject(T obj); Mono findByGitSyncIdAndDefaultApplicationId(String defaultApplicationId, String gitSyncId, AclPermission permission); diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/BaseAppsmithRepositoryCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/BaseAppsmithRepositoryCEImpl.java index d483a90b3c..c1a9d856cb 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/BaseAppsmithRepositoryCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/BaseAppsmithRepositoryCEImpl.java @@ -140,7 +140,7 @@ public abstract class BaseAppsmithRepositoryCEImpl { return mongoOperations.query(this.genericDomain) .matching(query) .one() - .map(obj -> (T) setUserPermissionsInObject(obj, permissionGroups)); + .flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups)); }); } @@ -175,7 +175,7 @@ public abstract class BaseAppsmithRepositoryCEImpl { } return findById(id, permission); }) - .map(obj -> (T) setUserPermissionsInObject(obj, permissionGroups)); + .flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups)); }); } @@ -213,7 +213,7 @@ public abstract class BaseAppsmithRepositoryCEImpl { return mongoOperations.query(this.genericDomain) .matching(createQueryWithPermission(criterias, permissionGroups, aclPermission)) .one() - .map(obj -> (T) setUserPermissionsInObject(obj, permissionGroups)); + .flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups)); }); } @@ -226,7 +226,7 @@ public abstract class BaseAppsmithRepositoryCEImpl { return mongoOperations.query(this.genericDomain) .matching(createQueryWithPermission(criterias, permissionGroups, aclPermission)) .first() - .map(obj -> (T) setUserPermissionsInObject(obj, permissionGroups)); + .flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups)); }); } @@ -315,14 +315,22 @@ public abstract class BaseAppsmithRepositoryCEImpl { return mongoOperations.query(this.genericDomain) .matching(query) .all() - .map(obj -> (T) setUserPermissionsInObject(obj, permissionGroups)); + .flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups)); } - public T setUserPermissionsInObject(T obj, Set permissionGroups) { + public Mono setUserPermissionsInObject(T obj) { + return ReactiveSecurityContextHolder.getContext() + .map(ctx -> ctx.getAuthentication()) + .map(auth -> auth.getPrincipal()) + .flatMap(principal -> getAllPermissionGroupsForUser((User) principal)) + .flatMap(permissionGroups -> setUserPermissionsInObject(obj, permissionGroups)); + } + + public Mono setUserPermissionsInObject(T obj, Set permissionGroups) { Set permissions = new HashSet<>(); if (CollectionUtils.isEmpty(obj.getPolicies())) { - return obj; + return Mono.just(obj); } for (Policy policy : obj.getPolicies()) { @@ -339,7 +347,7 @@ public abstract class BaseAppsmithRepositoryCEImpl { } obj.setUserPermissions(permissions); - return obj; + return Mono.just(obj); } public Mono findByGitSyncIdAndDefaultApplicationId(String defaultApplicationId, String gitSyncId, AclPermission permission) { diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomConfigRepositoryCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomConfigRepositoryCEImpl.java index c80b7ae991..b5ccc2da5e 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomConfigRepositoryCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomConfigRepositoryCEImpl.java @@ -40,7 +40,7 @@ public class CustomConfigRepositoryCEImpl extends BaseAppsmithRepositoryImpl setUserPermissionsInObject(obj, permissionGroups)); + .flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups)); }); } } diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/configurations/SeedMongoData.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/configurations/SeedMongoData.java index 7cf9f3bb89..f0fbf75b00 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/configurations/SeedMongoData.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/configurations/SeedMongoData.java @@ -1,11 +1,12 @@ package com.appsmith.server.configurations; +import com.appsmith.external.models.PluginType; import com.appsmith.external.models.Policy; import com.appsmith.server.acl.AppsmithRole; import com.appsmith.server.domains.Application; import com.appsmith.server.domains.Page; +import com.appsmith.server.domains.PermissionGroup; import com.appsmith.server.domains.Plugin; -import com.appsmith.external.models.PluginType; import com.appsmith.server.domains.PricingPlan; import com.appsmith.server.domains.Tenant; import com.appsmith.server.domains.User; @@ -13,15 +14,17 @@ import com.appsmith.server.domains.UserRole; import com.appsmith.server.domains.UserState; import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.WorkspacePlugin; +import com.appsmith.server.dtos.Permission; import com.appsmith.server.dtos.WorkspacePluginStatus; +import com.appsmith.server.helpers.PolicyUtils; import com.appsmith.server.repositories.ApplicationRepository; import com.appsmith.server.repositories.PageRepository; +import com.appsmith.server.repositories.PermissionGroupRepository; import com.appsmith.server.repositories.PluginRepository; import com.appsmith.server.repositories.TenantRepository; import com.appsmith.server.repositories.UserRepository; import com.appsmith.server.repositories.WorkspaceRepository; import com.appsmith.server.services.UserService; - import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationRunner; import org.springframework.context.annotation.Bean; @@ -32,8 +35,10 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -64,7 +69,9 @@ public class SeedMongoData { ReactiveMongoTemplate mongoTemplate, TenantRepository tenantRepository, UserService userService, - CommonConfig commonConfig) { + CommonConfig commonConfig, + PermissionGroupRepository permissionGroupRepository, + PolicyUtils policyUtils) { log.info("Seeding the data"); final String API_USER_EMAIL = "api_user"; @@ -133,10 +140,10 @@ public class SeedMongoData { .build(); Object[][] userData = { - {"user test", TEST_USER_EMAIL, UserState.ACTIVATED, Set.of(readTestUserPolicy, userManageWorkspacePolicy)}, - {"api_user", API_USER_EMAIL, UserState.ACTIVATED, Set.of(userManageWorkspacePolicy, readApiUserPolicy, manageApiUserPolicy)}, - {"admin test", ADMIN_USER_EMAIL, UserState.ACTIVATED, Set.of(readAdminUserPolicy, userManageWorkspacePolicy)}, - {"developer test", DEV_USER_EMAIL, UserState.ACTIVATED, Set.of(readDevUserPolicy, userManageWorkspacePolicy)}, + {"user test", TEST_USER_EMAIL, UserState.ACTIVATED, new HashSet<>(Arrays.asList(readTestUserPolicy, userManageWorkspacePolicy))}, + {"api_user", API_USER_EMAIL, UserState.ACTIVATED, new HashSet<>(Arrays.asList(userManageWorkspacePolicy, readApiUserPolicy, manageApiUserPolicy))}, + {"admin test", ADMIN_USER_EMAIL, UserState.ACTIVATED, new HashSet<>(Arrays.asList(readAdminUserPolicy, userManageWorkspacePolicy))}, + {"developer test", DEV_USER_EMAIL, UserState.ACTIVATED, new HashSet<>(Arrays.asList(readDevUserPolicy, userManageWorkspacePolicy))}, }; Object[][] workspaceData = { {"Spring Test Workspace", "appsmith-spring-test.com", "appsmith.com", "spring-test-workspace", @@ -160,7 +167,7 @@ public class SeedMongoData { {"Not Installed Plugin Name", PluginType.API, "not-installed-plugin"} }; - // Seed the plugin data into the DB + // Seed the plugin data into the DB Flux pluginFlux = Flux.just(pluginData) .map(array -> { log.debug("Creating the plugins"); @@ -266,7 +273,23 @@ public class SeedMongoData { log.debug("Saved the workspace to user. User: {}", u); return u; }); - })); + }) + .flatMap(user -> { + PermissionGroup permissionGroupUser = new PermissionGroup(); + permissionGroupUser.setPermissions(Set.of(new Permission(user.getId(), MANAGE_USERS))); + permissionGroupUser.setName(user.getId() + "User Name"); + permissionGroupUser.setAssignedToUserIds(Set.of(user.getId())); + return permissionGroupRepository.save(permissionGroupUser) + .flatMap(savedPermissionGroup -> { + Map crudUserPolicies = policyUtils.generatePolicyFromPermissionGroupForObject(savedPermissionGroup, + user.getId()); + + User updatedWithPolicies = policyUtils.addPoliciesToExistingObject(crudUserPolicies, user); + + return userRepository.save(updatedWithPolicies); + }); + }) + ); Query workspaceNameQuery = new Query(where("slug").is(workspaceData[0][3])); Mono workspaceByNameMono = mongoTemplate.findOne(workspaceNameQuery, Workspace.class) @@ -308,14 +331,7 @@ public class SeedMongoData { .flatMap(pageRepository::save) ) .blockLast(); - // Create user@appsmith.com using UserService - if(!commonConfig.isSignupDisabled()) { - User newUser = new User(); - newUser.setEmail("user@appsmith.com"); - newUser.setPassword("new-user-test-password"); - userService.create(newUser).block(); - } }; - + } } diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/solutions/ExamplesWorkspaceClonerTests.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/solutions/ExamplesWorkspaceClonerTests.java index c85527ce31..9dea7f2843 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/solutions/ExamplesWorkspaceClonerTests.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/solutions/ExamplesWorkspaceClonerTests.java @@ -1,6 +1,7 @@ package com.appsmith.server.solutions; import com.appsmith.external.models.ActionConfiguration; +import com.appsmith.external.models.ActionDTO; import com.appsmith.external.models.AuthenticationResponse; import com.appsmith.external.models.Connection; import com.appsmith.external.models.DBAuth; @@ -9,6 +10,7 @@ import com.appsmith.external.models.DatasourceConfiguration; import com.appsmith.external.models.Endpoint; import com.appsmith.external.models.OAuth2; import com.appsmith.external.models.PEMCertificate; +import com.appsmith.external.models.PluginType; import com.appsmith.external.models.Property; import com.appsmith.external.models.SSLDetails; import com.appsmith.external.models.UploadedFile; @@ -20,11 +22,9 @@ import com.appsmith.server.domains.Layout; import com.appsmith.server.domains.NewAction; import com.appsmith.server.domains.NewPage; import com.appsmith.server.domains.Plugin; -import com.appsmith.external.models.PluginType; import com.appsmith.server.domains.User; import com.appsmith.server.domains.Workspace; import com.appsmith.server.dtos.ActionCollectionDTO; -import com.appsmith.external.models.ActionDTO; import com.appsmith.server.dtos.DslActionDTO; import com.appsmith.server.dtos.PageDTO; import com.appsmith.server.helpers.MockPluginExecutor; @@ -174,7 +174,7 @@ public class ExamplesWorkspaceClonerTests { } @Test - @WithUserDetails(value = "user@appsmith.com") + @WithUserDetails(value = "api_user") public void cloneEmptyWorkspace() { Workspace newWorkspace = new Workspace(); newWorkspace.setName("Template Workspace"); @@ -188,7 +188,7 @@ public class ExamplesWorkspaceClonerTests { .assertNext(data -> { assertThat(data.workspace).isNotNull(); assertThat(data.workspace.getId()).isNotNull(); - assertThat(data.workspace.getName()).isEqualTo("user's apps"); + assertThat(data.workspace.getName()).isEqualTo("api_user's apps"); assertThat(data.workspace.getPolicies()).isNotEmpty(); assertThat(data.applications).isEmpty(); @@ -200,7 +200,7 @@ public class ExamplesWorkspaceClonerTests { } @Test - @WithUserDetails(value = "user@appsmith.com") + @WithUserDetails(value = "api_user") public void cloneWorkspaceWithItsContents() { Workspace newWorkspace = new Workspace(); newWorkspace.setName("Template Workspace"); @@ -239,7 +239,7 @@ public class ExamplesWorkspaceClonerTests { .assertNext(data -> { assertThat(data.workspace).isNotNull(); assertThat(data.workspace.getId()).isNotNull(); - assertThat(data.workspace.getName()).isEqualTo("user's apps"); + assertThat(data.workspace.getName()).isEqualTo("api_user's apps"); assertThat(data.workspace.getPolicies()).isNotEmpty(); assertThat(data.applications).hasSize(1); @@ -254,7 +254,7 @@ public class ExamplesWorkspaceClonerTests { } @Test - @WithUserDetails(value = "user@appsmith.com") + @WithUserDetails(value = "api_user") public void cloneWorkspaceWithOnlyPublicApplications() { Workspace newWorkspace = new Workspace(); newWorkspace.setName("Template Workspace 2"); @@ -300,7 +300,7 @@ public class ExamplesWorkspaceClonerTests { .assertNext(data -> { assertThat(data.workspace).isNotNull(); assertThat(data.workspace.getId()).isNotNull(); - assertThat(data.workspace.getName()).isEqualTo("user's apps"); + assertThat(data.workspace.getName()).isEqualTo("api_user's apps"); assertThat(data.workspace.getPolicies()).isNotEmpty(); assertThat(data.applications).hasSize(2); @@ -325,7 +325,7 @@ public class ExamplesWorkspaceClonerTests { } @Test - @WithUserDetails(value = "user@appsmith.com") + @WithUserDetails(value = "api_user") public void cloneWorkspaceWithOnlyPrivateApplications() { Workspace newWorkspace = new Workspace(); newWorkspace.setName("Template Workspace 2"); @@ -356,7 +356,7 @@ public class ExamplesWorkspaceClonerTests { .assertNext(data -> { assertThat(data.workspace).isNotNull(); assertThat(data.workspace.getId()).isNotNull(); - assertThat(data.workspace.getName()).isEqualTo("user's apps"); + assertThat(data.workspace.getName()).isEqualTo("api_user's apps"); assertThat(data.workspace.getPolicies()).isNotEmpty(); assertThat(data.applications).isEmpty(); @@ -424,7 +424,7 @@ public class ExamplesWorkspaceClonerTests { } @Test - @WithUserDetails(value = "user@appsmith.com") + @WithUserDetails(value = "api_user") public void cloneWorkspaceWithOnlyDatasources() { Workspace newWorkspace = new Workspace(); newWorkspace.setName("Template Workspace 2"); @@ -465,7 +465,7 @@ public class ExamplesWorkspaceClonerTests { .assertNext(data -> { assertThat(data.workspace).isNotNull(); assertThat(data.workspace.getId()).isNotNull(); - assertThat(data.workspace.getName()).isEqualTo("user's apps"); + assertThat(data.workspace.getName()).isEqualTo("api_user's apps"); assertThat(data.workspace.getPolicies()).isNotEmpty(); assertThat(data.datasources).isEmpty(); @@ -477,7 +477,7 @@ public class ExamplesWorkspaceClonerTests { } @Test - @WithUserDetails(value = "user@appsmith.com") + @WithUserDetails(value = "api_user") public void cloneWorkspaceWithOnlyDatasourcesSpecifiedExplicitly() { Workspace newWorkspace = new Workspace(); newWorkspace.setName("Template Workspace 2"); @@ -525,7 +525,7 @@ public class ExamplesWorkspaceClonerTests { .assertNext(data -> { assertThat(data.workspace).isNotNull(); assertThat(data.workspace.getId()).isNotNull(); - assertThat(data.workspace.getName()).isEqualTo("user's apps"); + assertThat(data.workspace.getName()).isEqualTo("api_user's apps"); assertThat(data.workspace.getPolicies()).isNotEmpty(); assertThat(data.datasources).hasSize(1); @@ -539,7 +539,7 @@ public class ExamplesWorkspaceClonerTests { } @Test - @WithUserDetails(value = "user@appsmith.com") + @WithUserDetails(value = "api_user") public void cloneWorkspaceWithDatasourcesAndApplications() { Workspace newWorkspace = new Workspace(); newWorkspace.setName("Template Workspace 2"); @@ -591,7 +591,7 @@ public class ExamplesWorkspaceClonerTests { .assertNext(data -> { assertThat(data.workspace).isNotNull(); assertThat(data.workspace.getId()).isNotNull(); - assertThat(data.workspace.getName()).isEqualTo("user's apps"); + assertThat(data.workspace.getName()).isEqualTo("api_user's apps"); assertThat(data.workspace.getPolicies()).isNotEmpty(); assertThat(data.applications).hasSize(2); @@ -608,7 +608,7 @@ public class ExamplesWorkspaceClonerTests { } @Test - @WithUserDetails(value = "user@appsmith.com") + @WithUserDetails(value = "api_user") public void cloneWorkspaceWithDatasourcesAndApplicationsAndActionsAndCollections() { Workspace newWorkspace = new Workspace(); newWorkspace.setName("Template Workspace 2"); @@ -739,7 +739,7 @@ public class ExamplesWorkspaceClonerTests { .assertNext(data -> { assertThat(data.workspace).isNotNull(); assertThat(data.workspace.getId()).isNotNull(); - assertThat(data.workspace.getName()).isEqualTo("user's apps"); + assertThat(data.workspace.getName()).isEqualTo("api_user's apps"); assertThat(data.workspace.getPolicies()).isNotEmpty(); assertThat(data.applications).hasSize(2); @@ -779,7 +779,7 @@ public class ExamplesWorkspaceClonerTests { } @Test - @WithUserDetails(value = "user@appsmith.com") + @WithUserDetails(value = "api_user") public void cloneApplicationWithActionsThrice() { Workspace sourceOrg = new Workspace(); sourceOrg.setName("Source Org 2");