aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-webserver-auth
diff options
context:
space:
mode:
authorDuarte Meneses <duarte.meneses@sonarsource.com>2023-05-15 19:49:00 -0500
committersonartech <sonartech@sonarsource.com>2023-06-01 20:02:59 +0000
commit46effb33d74b5b37f097288d6bac6343a2d06a8c (patch)
treed97ed78ac7d0413214353667dcf2424101f79646 /server/sonar-webserver-auth
parent9bc77e5b117af186e37aff6e22a0ed6da96d5ae5 (diff)
downloadsonarqube-46effb33d74b5b37f097288d6bac6343a2d06a8c.tar.gz
sonarqube-46effb33d74b5b37f097288d6bac6343a2d06a8c.zip
SONAR-18856 Refactor favorites and properties
Diffstat (limited to 'server/sonar-webserver-auth')
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java31
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java12
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java18
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java8
-rw-r--r--server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java19
5 files changed, 85 insertions, 3 deletions
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java
index 818e5de16f1..44ee9a5e252 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java
@@ -28,6 +28,7 @@ import javax.annotation.Nullable;
import org.sonar.api.web.UserRole;
import org.sonar.core.util.stream.MoreCollectors;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto;
@@ -88,7 +89,6 @@ public abstract class AbstractUserSession implements UserSession {
@Override
public boolean hasComponentPermission(String permission, ComponentDto component) {
-
Optional<String> projectUuid1 = componentUuidToProjectUuid(component.uuid());
return projectUuid1
@@ -102,6 +102,11 @@ public abstract class AbstractUserSession implements UserSession {
}
@Override
+ public final boolean hasEntityPermission(String permission, EntityDto entity) {
+ return hasProjectUuidPermission(permission, entity.getUuid());
+ }
+
+ @Override
public final boolean hasProjectPermission(String permission, String projectUuid) {
return hasProjectUuidPermission(permission, projectUuid);
}
@@ -148,6 +153,21 @@ public abstract class AbstractUserSession implements UserSession {
return doKeepAuthorizedProjects(permission, projects);
}
+ @Override
+ public <T extends EntityDto> List<T> keepAuthorizedEntities(String permission, Collection<T> projects) {
+ return doKeepAuthorizedEntities(permission, projects);
+ }
+
+ /**
+ * Naive implementation, to be overridden if needed
+ */
+ protected <T extends EntityDto> List<T> doKeepAuthorizedEntities(String permission, Collection<T> entities) {
+ boolean allowPublicComponent = PUBLIC_PERMISSIONS.contains(permission);
+ return entities.stream()
+ .filter(c -> (allowPublicComponent && !c.isPrivate()) || hasProjectPermission(permission, c.getUuid()))
+ .toList();
+ }
+
/**
* Naive implementation, to be overridden if needed
*/
@@ -202,6 +222,15 @@ public abstract class AbstractUserSession implements UserSession {
}
@Override
+ public UserSession checkEntityPermission(String projectPermission, EntityDto entity) {
+ if (hasEntityPermission(projectPermission, entity)) {
+ return this;
+ }
+
+ throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
+ }
+
+ @Override
public UserSession checkChildProjectsPermission(String projectPermission, ComponentDto component) {
if (!APP.equals(component.qualifier()) || hasChildProjectsPermission(projectPermission, component)) {
return this;
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java
index 020c9e08acb..518b710e5f4 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java
@@ -41,6 +41,7 @@ import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTreeQuery;
import org.sonar.db.component.ComponentTreeQuery.Strategy;
+import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
@@ -195,6 +196,17 @@ public class ServerUserSession extends AbstractUserSession {
.toList();
}
+ @Override
+ public <T extends EntityDto> List<T> keepAuthorizedEntities(String permission, Collection<T> projects) {
+ Set<String> projectsUuids = projects.stream().map(EntityDto::getUuid).collect(Collectors.toSet());
+ // TODO
+ Set<String> authorizedProjectsUuids = keepProjectsUuidsByPermission(permission, projectsUuids);
+
+ return projects.stream()
+ .filter(project -> authorizedProjectsUuids.contains(project.getUuid()))
+ .toList();
+ }
+
private Set<String> keepProjectsUuidsByPermission(String permission, Collection<String> projectsUuids) {
try (DbSession dbSession = dbClient.openSession(false)) {
String userUuid = userDto == null ? null : userDto.getUuid();
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java
index 192cb000789..66b3e060fe5 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java
@@ -24,6 +24,7 @@ import java.util.List;
import java.util.Optional;
import javax.annotation.CheckForNull;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
@@ -129,6 +130,12 @@ public class ThreadLocalUserSession implements UserSession {
}
@Override
+ public UserSession checkEntityPermission(String projectPermission, EntityDto entity) {
+ get().checkEntityPermission(projectPermission, entity);
+ return this;
+ }
+
+ @Override
public UserSession checkProjectPermission(String projectPermission, ProjectDto project) {
get().checkProjectPermission(projectPermission, project);
return this;
@@ -174,6 +181,11 @@ public class ThreadLocalUserSession implements UserSession {
}
@Override
+ public boolean hasEntityPermission(String permission, EntityDto entity) {
+ return get().hasEntityPermission(permission, entity);
+ }
+
+ @Override
public boolean hasProjectPermission(String permission, ProjectDto project) {
return get().hasProjectPermission(permission, project);
}
@@ -209,8 +221,12 @@ public class ThreadLocalUserSession implements UserSession {
}
@Override
+ public <T extends EntityDto> List<T> keepAuthorizedEntities(String permission, Collection<T> entities) {
+ return get().keepAuthorizedEntities(permission, entities);
+ }
+
+ @Override
public List<ProjectDto> keepAuthorizedProjects(String permission, Collection<ProjectDto> projects) {
return get().keepAuthorizedProjects(permission, projects);
}
-
}
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java
index 7f46dc68dea..a49bf480760 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java
@@ -25,7 +25,9 @@ import java.util.List;
import java.util.Optional;
import javax.annotation.CheckForNull;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.portfolio.PortfolioDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
@@ -149,6 +151,8 @@ public interface UserSession {
boolean hasProjectPermission(String permission, ProjectDto project);
+ boolean hasEntityPermission(String permission, EntityDto entity);
+
boolean hasProjectPermission(String permission, String projectUuid);
boolean hasChildProjectsPermission(String permission, ComponentDto component);
@@ -176,6 +180,8 @@ public interface UserSession {
*/
List<ComponentDto> keepAuthorizedComponents(String permission, Collection<ComponentDto> components);
+ <T extends EntityDto> List<T> keepAuthorizedEntities(String permission, Collection<T> components);
+
List<ProjectDto> keepAuthorizedProjects(String permission, Collection<ProjectDto> projects);
/**
@@ -190,6 +196,8 @@ public interface UserSession {
*/
UserSession checkProjectPermission(String projectPermission, ProjectDto project);
+ UserSession checkEntityPermission(String projectPermission, EntityDto entity);
+
/**
* Ensures that {@link #hasChildProjectsPermission(String, ComponentDto)} is {@code true}
* otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
diff --git a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java
index 862eb29455e..9623adc300c 100644
--- a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java
+++ b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java
@@ -30,6 +30,7 @@ import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.portfolio.PortfolioDto;
import org.sonar.db.project.ProjectDto;
@@ -204,7 +205,7 @@ public class UserSessionRule implements TestRule, UserSession {
return this;
}
- public UserSession registerBranches(BranchDto ...branchDtos){
+ public UserSession registerBranches(BranchDto... branchDtos) {
ensureAbstractMockUserSession().registerBranches(branchDtos);
return this;
}
@@ -263,6 +264,11 @@ public class UserSessionRule implements TestRule, UserSession {
}
@Override
+ public boolean hasEntityPermission(String permission, EntityDto entity) {
+ return currentUserSession.hasProjectPermission(permission, entity.getUuid());
+ }
+
+ @Override
public boolean hasProjectPermission(String permission, String projectUuid) {
return currentUserSession.hasProjectPermission(permission, projectUuid);
}
@@ -293,6 +299,11 @@ public class UserSessionRule implements TestRule, UserSession {
}
@Override
+ public <T extends EntityDto> List<T> keepAuthorizedEntities(String permission, Collection<T> entities) {
+ return currentUserSession.keepAuthorizedEntities(permission, entities);
+ }
+
+ @Override
public List<ProjectDto> keepAuthorizedProjects(String permission, Collection<ProjectDto> projects) {
return currentUserSession.keepAuthorizedProjects(permission, projects);
}
@@ -370,6 +381,12 @@ public class UserSessionRule implements TestRule, UserSession {
}
@Override
+ public UserSession checkEntityPermission(String projectPermission, EntityDto entity) {
+ currentUserSession.checkEntityPermission(projectPermission, entity);
+ return this;
+ }
+
+ @Override
public UserSession checkProjectPermission(String projectPermission, ProjectDto project) {
currentUserSession.checkProjectPermission(projectPermission, project);
return this;