diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2013-07-03 14:49:39 +0200 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2013-07-03 15:08:06 +0200 |
commit | 5ccbb39d22b649cf47b0082b1b198783596b417e (patch) | |
tree | b58770fb8e1882c4108d0bfe4462d068edc56a00 | |
parent | bd9e609162e5c0420a7ac7c2d7c06580020db59d (diff) | |
download | sonarqube-5ccbb39d22b649cf47b0082b1b198783596b417e.tar.gz sonarqube-5ccbb39d22b649cf47b0082b1b198783596b417e.zip |
Refator permissions to share same constants between Ruby and Java
19 files changed, 293 insertions, 198 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/user/Permission.java b/sonar-core/src/main/java/org/sonar/core/user/Permission.java new file mode 100644 index 00000000000..be5fb50a755 --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/user/Permission.java @@ -0,0 +1,64 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.core.user; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * + * Holds the constants representing the various global permissions that can be assigned to users & groups + * + * @since 3.7 + */ +public class Permission { + + public static final Permission SYSTEM_ADMIN = new Permission("admin"); + public static final Permission QUALITY_PROFILE_ADMIN = new Permission("profileadmin"); + public static final Permission DASHBOARD_SHARING = new Permission("shareDashboard"); + public static final Permission SCAN_EXECUTION = new Permission("scan"); + public static final Permission DRY_RUN_EXECUTION = new Permission("dryRunScan"); + + private final String key; + // Use linked hash map to preserve order + private static Map<String, Permission> allGlobal = new LinkedHashMap<String, Permission>(); + + static { + allGlobal.put(SYSTEM_ADMIN.key, SYSTEM_ADMIN); + allGlobal.put(QUALITY_PROFILE_ADMIN.key, QUALITY_PROFILE_ADMIN); + allGlobal.put(DASHBOARD_SHARING.key, DASHBOARD_SHARING); + allGlobal.put(SCAN_EXECUTION.key, SCAN_EXECUTION); + allGlobal.put(DRY_RUN_EXECUTION.key, DRY_RUN_EXECUTION); + } + + private Permission(String key) { + this.key = key; + } + + public String key() { + return key; + } + + public static Map<String, Permission> allGlobal() { + return allGlobal; + } + +} diff --git a/sonar-core/src/main/java/org/sonar/core/user/Permissions.java b/sonar-core/src/main/java/org/sonar/core/user/Permissions.java deleted file mode 100644 index db6ad9d6e09..00000000000 --- a/sonar-core/src/main/java/org/sonar/core/user/Permissions.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2013 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -package org.sonar.core.user; - -/** - * - * Holds the constants representing the various permissions that can be assigned to users & groups - * - * @since 3.7 - */ -public interface Permissions { - - String SYSTEM_ADMIN = "admin"; - String QUALITY_PROFILE_ADMIN = "profileadmin"; - String DASHBOARD_SHARING = "shareDashboard"; - String SCAN_EXECUTION = "scan"; - String DRY_RUN_EXECUTION = "dryRunScan"; -} diff --git a/sonar-core/src/test/java/org/sonar/core/user/RoleDaoTest.java b/sonar-core/src/test/java/org/sonar/core/user/RoleDaoTest.java index 33eae64cf56..582616cc5a6 100644 --- a/sonar-core/src/test/java/org/sonar/core/user/RoleDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/user/RoleDaoTest.java @@ -34,8 +34,8 @@ public class RoleDaoTest extends AbstractDaoTestCase { RoleDao dao = new RoleDao(getMyBatis()); - assertThat(dao.selectUserPermissions("admin_user")).containsOnly(Permissions.SYSTEM_ADMIN, Permissions.QUALITY_PROFILE_ADMIN); - assertThat(dao.selectUserPermissions("profile_admin_user")).containsOnly(Permissions.QUALITY_PROFILE_ADMIN); + assertThat(dao.selectUserPermissions("admin_user")).containsOnly(Permission.SYSTEM_ADMIN.key(), Permission.QUALITY_PROFILE_ADMIN.key()); + assertThat(dao.selectUserPermissions("profile_admin_user")).containsOnly(Permission.QUALITY_PROFILE_ADMIN.key()); } @Test @@ -44,18 +44,18 @@ public class RoleDaoTest extends AbstractDaoTestCase { RoleDao dao = new RoleDao(getMyBatis()); - assertThat(dao.selectGroupPermissions("sonar-administrators")).containsOnly(Permissions.SYSTEM_ADMIN, Permissions.QUALITY_PROFILE_ADMIN, - Permissions.DASHBOARD_SHARING, Permissions.DRY_RUN_EXECUTION, Permissions.SCAN_EXECUTION); - assertThat(dao.selectGroupPermissions("sonar-users")).containsOnly(Permissions.DASHBOARD_SHARING, Permissions.DRY_RUN_EXECUTION, - Permissions.SCAN_EXECUTION); - assertThat(dao.selectGroupPermissions(DefaultGroups.ANYONE)).containsOnly(Permissions.DRY_RUN_EXECUTION, Permissions.SCAN_EXECUTION); + assertThat(dao.selectGroupPermissions("sonar-administrators")).containsOnly(Permission.SYSTEM_ADMIN.key(), Permission.QUALITY_PROFILE_ADMIN.key(), + Permission.DASHBOARD_SHARING.key(), Permission.DRY_RUN_EXECUTION.key(), Permission.SCAN_EXECUTION.key()); + assertThat(dao.selectGroupPermissions("sonar-users")).containsOnly(Permission.DASHBOARD_SHARING.key(), Permission.DRY_RUN_EXECUTION.key(), + Permission.SCAN_EXECUTION.key()); + assertThat(dao.selectGroupPermissions(DefaultGroups.ANYONE)).containsOnly(Permission.DRY_RUN_EXECUTION.key(), Permission.SCAN_EXECUTION.key()); } @Test public void should_delete_user_global_permission() throws Exception { setupData("userPermissions"); - UserRoleDto userRoleToDelete = new UserRoleDto().setUserId(200L).setRole(Permissions.QUALITY_PROFILE_ADMIN); + UserRoleDto userRoleToDelete = new UserRoleDto().setUserId(200L).setRole(Permission.QUALITY_PROFILE_ADMIN.key()); RoleDao dao = new RoleDao(getMyBatis()); dao.deleteUserRole(userRoleToDelete); @@ -67,7 +67,7 @@ public class RoleDaoTest extends AbstractDaoTestCase { public void should_delete_group_global_permission() throws Exception { setupData("groupPermissions"); - GroupRoleDto groupRoleToDelete = new GroupRoleDto().setGroupId(100L).setRole(Permissions.QUALITY_PROFILE_ADMIN); + GroupRoleDto groupRoleToDelete = new GroupRoleDto().setGroupId(100L).setRole(Permission.QUALITY_PROFILE_ADMIN.key()); RoleDao dao = new RoleDao(getMyBatis()); dao.deleteGroupRole(groupRoleToDelete); diff --git a/sonar-server/src/main/java/org/sonar/server/issue/IssueFilterService.java b/sonar-server/src/main/java/org/sonar/server/issue/IssueFilterService.java index 5db8808b18a..d44359a58cf 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/IssueFilterService.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/IssueFilterService.java @@ -35,7 +35,7 @@ import org.sonar.core.issue.db.IssueFilterDto; import org.sonar.core.issue.db.IssueFilterFavouriteDao; import org.sonar.core.issue.db.IssueFilterFavouriteDto; import org.sonar.core.user.AuthorizationDao; -import org.sonar.core.user.Permissions; +import org.sonar.core.user.Permission; import org.sonar.server.user.UserSession; import javax.annotation.CheckForNull; @@ -57,7 +57,7 @@ public class IssueFilterService implements ServerComponent { private final IssueFilterSerializer serializer; public IssueFilterService(IssueFilterDao filterDao, IssueFilterFavouriteDao favouriteDao, IssueFinder finder, AuthorizationDao authorizationDao, - IssueFilterSerializer serializer) { + IssueFilterSerializer serializer) { this.filterDao = filterDao; this.favouriteDao = favouriteDao; this.finder = finder; @@ -97,7 +97,7 @@ public class IssueFilterService implements ServerComponent { String login = getLoggedLogin(userSession); IssueFilterDto existingFilterDto = findIssueFilterDto(issueFilter.id(), login); verifyCurrentUserCanModifyFilter(existingFilterDto.toIssueFilter(), login); - if(!existingFilterDto.getUserLogin().equals(issueFilter.user())) { + if (!existingFilterDto.getUserLogin().equals(issueFilter.user())) { verifyCurrentUserCanChangeFilterOwnership(login); } validateFilter(issueFilter); @@ -106,7 +106,7 @@ public class IssueFilterService implements ServerComponent { return issueFilter; } - private void deleteOtherFavoriteFiltersIfFilterBecomeUnshared(IssueFilterDto existingFilterDto, DefaultIssueFilter issueFilter){ + private void deleteOtherFavoriteFiltersIfFilterBecomeUnshared(IssueFilterDto existingFilterDto, DefaultIssueFilter issueFilter) { if (existingFilterDto.isShared() && !issueFilter.shared()) { for (IssueFilterFavouriteDto favouriteDto : selectFavouriteFilters(existingFilterDto.getId())) { if (!favouriteDto.getUserLogin().equals(issueFilter.user())) { @@ -217,7 +217,7 @@ public class IssueFilterService implements ServerComponent { } private void verifyCurrentUserCanChangeFilterOwnership(String user) { - if(!isAdmin(user)) { + if (!isAdmin(user)) { // TODO throw unauthorized throw new IllegalStateException("User is not authorized to change the owner of this filter"); } @@ -252,16 +252,16 @@ public class IssueFilterService implements ServerComponent { return favouriteDao.selectByFilterId(filterId); } - private List<IssueFilterDto> selectUserIssueFilters(String user){ + private List<IssueFilterDto> selectUserIssueFilters(String user) { return filterDao.selectByUser(user); } - private List<IssueFilterDto> selectSharedFilters(){ + private List<IssueFilterDto> selectSharedFilters() { return filterDao.selectSharedFilters(); } @CheckForNull - private IssueFilterDto findFilterWithSameName(List<IssueFilterDto> dtos, final String name){ + private IssueFilterDto findFilterWithSameName(List<IssueFilterDto> dtos, final String name) { return Iterables.find(dtos, new Predicate<IssueFilterDto>() { @Override public boolean apply(IssueFilterDto input) { @@ -272,8 +272,8 @@ public class IssueFilterService implements ServerComponent { private void addFavouriteIssueFilter(Long issueFilterId, String user) { IssueFilterFavouriteDto issueFilterFavouriteDto = new IssueFilterFavouriteDto() - .setIssueFilterId(issueFilterId) - .setUserLogin(user); + .setIssueFilterId(issueFilterId) + .setUserLogin(user); favouriteDao.insert(issueFilterFavouriteDto); } @@ -302,7 +302,7 @@ public class IssueFilterService implements ServerComponent { } private boolean isAdmin(String user) { - return authorizationDao.selectGlobalPermissions(user).contains(Permissions.SYSTEM_ADMIN); + return authorizationDao.selectGlobalPermissions(user).contains(Permission.SYSTEM_ADMIN.key()); } private IssueFilterResult createIssueFilterResult(IssueQueryResult issueQueryResult, IssueQuery issueQuery) { diff --git a/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java b/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java index e2973b61a47..7fca7e17a37 100644 --- a/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java +++ b/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java @@ -24,8 +24,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.ServerComponent; import org.sonar.api.security.DefaultGroups; -import org.sonar.core.user.*; -import org.sonar.server.exceptions.BadRequestException; +import org.sonar.core.user.GroupRoleDto; +import org.sonar.core.user.Permission; +import org.sonar.core.user.RoleDao; +import org.sonar.core.user.UserDao; +import org.sonar.core.user.UserRoleDto; import org.sonar.server.user.UserSession; import java.util.List; @@ -58,19 +61,14 @@ public class InternalPermissionService implements ServerComponent { } private void changePermission(String permissionChange, Map<String, Object> params) { - UserSession.get().checkPermission(Permissions.SYSTEM_ADMIN); + UserSession.get().checkGlobalPermission(Permission.SYSTEM_ADMIN); PermissionChangeQuery permissionChangeQuery = PermissionChangeQuery.buildFromParams(params); - if(permissionChangeQuery.isValid()) { - applyPermissionChange(permissionChange, permissionChangeQuery); - } else { - String errorMsg = String.format("Request '%s permission %s' is invalid", permissionChange, permissionChangeQuery.getRole()); - LOG.error(errorMsg); - throw new IllegalArgumentException(errorMsg); - } + permissionChangeQuery.validate(); + applyPermissionChange(permissionChange, permissionChangeQuery); } private void applyPermissionChange(String operation, PermissionChangeQuery permissionChangeQuery) { - if(permissionChangeQuery.targetsUser()) { + if (permissionChangeQuery.targetsUser()) { applyUserPermissionChange(operation, permissionChangeQuery); } else { applyGroupPermissionChange(operation, permissionChangeQuery); @@ -79,13 +77,13 @@ public class InternalPermissionService implements ServerComponent { private void applyGroupPermissionChange(String operation, PermissionChangeQuery permissionChangeQuery) { List<String> existingPermissions = roleDao.selectGroupPermissions(permissionChangeQuery.getGroup()); - if(shouldSkipPermissionChange(operation, existingPermissions, permissionChangeQuery.getRole())) { + if (shouldSkipPermissionChange(operation, existingPermissions, permissionChangeQuery.getRole())) { LOG.info("Skipping permission change '{} {}' for group {} as it matches the current permission scheme", - new String[]{operation, permissionChangeQuery.getRole(), permissionChangeQuery.getGroup()}); + new String[] {operation, permissionChangeQuery.getRole(), permissionChangeQuery.getGroup()}); } else { Long targetedGroup = getTargetedGroup(permissionChangeQuery.getGroup()); GroupRoleDto groupRole = new GroupRoleDto().setRole(permissionChangeQuery.getRole()).setGroupId(targetedGroup); - if(ADD.equals(operation)) { + if (ADD.equals(operation)) { roleDao.insertGroupRole(groupRole); } else { roleDao.deleteGroupRole(groupRole); @@ -95,13 +93,13 @@ public class InternalPermissionService implements ServerComponent { private void applyUserPermissionChange(String operation, PermissionChangeQuery permissionChangeQuery) { List<String> existingPermissions = roleDao.selectUserPermissions(permissionChangeQuery.getUser()); - if(shouldSkipPermissionChange(operation, existingPermissions, permissionChangeQuery.getRole())) { + if (shouldSkipPermissionChange(operation, existingPermissions, permissionChangeQuery.getRole())) { LOG.info("Skipping permission change '{} {}' for user {} as it matches the current permission scheme", - new String[]{operation, permissionChangeQuery.getRole(), permissionChangeQuery.getUser()}); + new String[] {operation, permissionChangeQuery.getRole(), permissionChangeQuery.getUser()}); } else { Long targetedUser = getTargetedUser(permissionChangeQuery.getUser()); UserRoleDto userRole = new UserRoleDto().setRole(permissionChangeQuery.getRole()).setUserId(targetedUser); - if(ADD.equals(operation)) { + if (ADD.equals(operation)) { roleDao.insertUserRole(userRole); } else { roleDao.deleteUserRole(userRole); @@ -114,7 +112,7 @@ public class InternalPermissionService implements ServerComponent { } private Long getTargetedGroup(String group) { - if(DefaultGroups.isAnyone(group)) { + if (DefaultGroups.isAnyone(group)) { return null; } return userDao.selectGroupByName(group).getId(); diff --git a/sonar-server/src/main/java/org/sonar/server/permission/PermissionChangeQuery.java b/sonar-server/src/main/java/org/sonar/server/permission/PermissionChangeQuery.java index d9ffc2cdf88..cc9175229fb 100644 --- a/sonar-server/src/main/java/org/sonar/server/permission/PermissionChangeQuery.java +++ b/sonar-server/src/main/java/org/sonar/server/permission/PermissionChangeQuery.java @@ -21,7 +21,7 @@ package org.sonar.server.permission; import org.apache.commons.lang.StringUtils; -import org.sonar.core.user.Permissions; +import org.sonar.core.user.Permission; import java.util.Map; @@ -42,11 +42,22 @@ public class PermissionChangeQuery { } public static PermissionChangeQuery buildFromParams(Map<String, Object> params) { - return new PermissionChangeQuery((String)params.get(USER_KEY), (String)params.get(GROUP_KEY), (String)params.get(ROLE_KEY)); + return new PermissionChangeQuery((String) params.get(USER_KEY), (String) params.get(GROUP_KEY), (String) params.get(ROLE_KEY)); } - public boolean isValid() { - return StringUtils.isNotBlank(role) && isValidPermissionReference(role) && (StringUtils.isNotBlank(user) ^ StringUtils.isNotBlank(group)); + public void validate() { + if (StringUtils.isBlank(role)) { + throw new IllegalArgumentException("Missing role parameter"); + } + if (StringUtils.isBlank(user) && StringUtils.isBlank(group)) { + throw new IllegalArgumentException("Missing user or group parameter"); + } + if (StringUtils.isNotBlank(user) && StringUtils.isNotBlank(group)) { + throw new IllegalArgumentException("Only one of user or group parameter should be provided"); + } + if (!Permission.allGlobal().keySet().contains(role)) { + throw new IllegalArgumentException("Invalid role key " + role); + } } public boolean targetsUser() { @@ -64,12 +75,4 @@ public class PermissionChangeQuery { public String getRole() { return role; } - - private boolean isValidPermissionReference(String role) { - return Permissions.SYSTEM_ADMIN.equals(role) - || Permissions.QUALITY_PROFILE_ADMIN.equals(role) - || Permissions.DASHBOARD_SHARING.equals(role) - || Permissions.SCAN_EXECUTION.equals(role) - || Permissions.DRY_RUN_EXECUTION.equals(role); - } } diff --git a/sonar-server/src/main/java/org/sonar/server/user/DefaultUserService.java b/sonar-server/src/main/java/org/sonar/server/user/DefaultUserService.java index fa34039c69d..b807e92952f 100644 --- a/sonar-server/src/main/java/org/sonar/server/user/DefaultUserService.java +++ b/sonar-server/src/main/java/org/sonar/server/user/DefaultUserService.java @@ -25,12 +25,13 @@ import org.sonar.api.user.RubyUserService; import org.sonar.api.user.User; import org.sonar.api.user.UserFinder; import org.sonar.api.user.UserQuery; -import org.sonar.api.web.UserRole; +import org.sonar.core.user.Permission; import org.sonar.core.user.UserDao; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.util.RubyUtils; import javax.annotation.CheckForNull; + import java.util.List; import java.util.Map; @@ -61,7 +62,7 @@ public class DefaultUserService implements RubyUserService { builder.includeDeactivated(); } builder.logins(RubyUtils.toStrings(params.get("logins"))); - builder.searchText((String)params.get("s")); + builder.searchText((String) params.get("s")); return builder.build(); } @@ -70,7 +71,7 @@ public class DefaultUserService implements RubyUserService { throw new BadRequestException("Login is missing"); } UserSession userSession = UserSession.get(); - userSession.checkPermission(/* TODO replaced with permission constant */UserRole.ADMIN); + userSession.checkGlobalPermission(Permission.SYSTEM_ADMIN); if (Objects.equal(userSession.login(), login)) { throw new BadRequestException("Self-deactivation is not possible"); } diff --git a/sonar-server/src/main/java/org/sonar/server/user/UserSession.java b/sonar-server/src/main/java/org/sonar/server/user/UserSession.java index 81509c4346e..f0e67d36e3a 100644 --- a/sonar-server/src/main/java/org/sonar/server/user/UserSession.java +++ b/sonar-server/src/main/java/org/sonar/server/user/UserSession.java @@ -21,7 +21,10 @@ package org.sonar.server.user; import com.google.common.base.Objects; import com.google.common.base.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.sonar.core.user.AuthorizationDao; +import org.sonar.core.user.Permission; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.UnauthorizedException; import org.sonar.server.platform.Platform; @@ -29,6 +32,7 @@ import org.sonar.server.platform.Platform; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -39,11 +43,12 @@ public class UserSession { private static final ThreadLocal<UserSession> THREAD_LOCAL = new ThreadLocal<UserSession>(); public static final UserSession ANONYMOUS = new UserSession(); + private static final Logger LOG = LoggerFactory.getLogger(UserSession.class); private Integer userId; private String login; private Locale locale = Locale.ENGLISH; - List<String> permissions = null; + List<Permission> permissions = null; UserSession() { } @@ -91,8 +96,8 @@ public class UserSession { /** * Ensures that user implies the specified permission. If not a {@link org.sonar.server.exceptions.ForbiddenException} is thrown. */ - public UserSession checkPermission(String permission) { - if (!hasPermission(permission)) { + public UserSession checkGlobalPermission(Permission permission) { + if (!hasGlobalPermission(permission)) { throw new ForbiddenException(); } return this; @@ -101,13 +106,23 @@ public class UserSession { /** * Does the user have the given permission ? */ - public boolean hasPermission(String permission) { - return permissions().contains(permission); + public boolean hasGlobalPermission(Permission permission) { + return globalPermissions().contains(permission); } - List<String> permissions() { + List<Permission> globalPermissions() { if (permissions == null) { - permissions = authorizationDao().selectGlobalPermissions(login); + List<String> permissionKeys = authorizationDao().selectGlobalPermissions(login); + permissions = new ArrayList<Permission>(); + for (String permissionKey : permissionKeys) { + Permission perm = Permission.allGlobal().get(permissionKey); + if (perm == null) { + LOG.warn("Ignoring unknow permission {} for user {}", permissionKey, login); + } + else { + permissions.add(perm); + } + } } return permissions; } @@ -132,4 +147,3 @@ public class UserSession { return THREAD_LOCAL.get() != null; } } - diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/batch_bootstrap_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/batch_bootstrap_controller.rb index 77b709dec77..d5bbe8aa0ae 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/batch_bootstrap_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/batch_bootstrap_controller.rb @@ -26,7 +26,7 @@ class BatchBootstrapController < Api::ApiController # GET /batch_bootstrap/db?project=<key or id> def db - has_dryrun_role = has_role?(:dryRunScan) + has_dryrun_role = has_role?(Java::OrgSonarCoreUser::Permission::DRY_RUN_EXECUTION) return render_unauthorized("You're not authorized to execute a dry run analysis. Please contact your SonarQube administrator.") if !has_dryrun_role project = load_project() return render_unauthorized("You're not authorized to access to project '" + project.name + "', please contact your SonarQube administrator") if project && !has_role?(:user, project) @@ -38,8 +38,8 @@ class BatchBootstrapController < Api::ApiController # GET /batch_bootstrap/properties?[project=<key or id>][&dryRun=true|false] def properties dryRun = params[:dryRun].present? && params[:dryRun] == "true" - has_dryrun_role = has_role?(:dryRunScan) - has_scan_role = has_role?(:scan) + has_dryrun_role = has_role?(Java::OrgSonarCoreUser::Permission::DRY_RUN_EXECUTION) + has_scan_role = has_role?(Java::OrgSonarCoreUser::Permission::SCAN_EXECUTION) return render_unauthorized("You're not authorized to execute any SonarQube analysis. Please contact your SonarQube administrator.") if (!has_dryrun_role && !has_scan_role) return render_unauthorized("You're only authorized to execute a local (dry run) SonarQube analysis without pushing the results to the SonarQube server. Please contact your SonarQube administrator.") if (!dryRun && !has_scan_role) @@ -49,7 +49,7 @@ class BatchBootstrapController < Api::ApiController # project properties root_project = load_project() - return render_unauthorized("You're not authorized to access to project '" + root_project.name + "', please contact your SonarQube administrator") if root_project && !has_role?(:scan) && !has_role?(:user, root_project) + return render_unauthorized("You're not authorized to access to project '" + root_project.name + "', please contact your SonarQube administrator") if root_project && !has_scan_role && !has_role?(:user, root_project) if root_project # bottom-up projects diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/roles/global.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/roles/global.html.erb index 13d24888669..b21cb27ef4d 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/roles/global.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/roles/global.html.erb @@ -9,18 +9,18 @@ </tr> </thead> <tbody> - <% ['admin', 'profileadmin', 'shareDashboard', 'scan', 'dryRunScan'].each do |global_permission| %> + <% Java::OrgSonarCoreUser::Permission::allGlobal.keySet.each do |global_permission_key| %> <tr class="<%= cycle('even', 'odd', :name => 'global_permission') -%>" > <td valign="top"> - <b><%= message('global_permissions.' + global_permission) -%></b><br/> - <span class="small gray"><%= message('global_permissions.' + global_permission + '.desc') -%></span></td> + <b><%= message('global_permissions.' + global_permission_key) -%></b><br/> + <span class="small gray"><%= message('global_permissions.' + global_permission_key + '.desc') -%></span></td> <td valign="top" style="word-break:break-all;width:30%;"> - <span><%= users(global_permission).map(&:name).join(', ') -%></span> - (<%= link_to "select", {:action => 'edit_users', :role => global_permission, :redirect => 'global'}, :class => 'link-action', :id => "select-users-#{global_permission}" -%>) + <span><%= users(global_permission_key).map(&:name).join(', ') -%></span> + (<%= link_to "select", {:action => 'edit_users', :role => global_permission_key, :redirect => 'global'}, :class => 'link-action', :id => "select-users-#{global_permission_key}" -%>) </td> <td valign="top" style="word-break:break-all;width:30%;"> - <span><%= groups(global_permission).map{|g| group_name(g)}.join(', ') %></span> - (<%= link_to "select", {:action => 'edit_groups', :role => global_permission, :redirect => 'global'}, :class => 'link-action', :id => "select-groups-#{global_permission}" -%>) + <span><%= groups(global_permission_key).map{|g| group_name(g)}.join(', ') %></span> + (<%= link_to "select", {:action => 'edit_groups', :role => global_permission_key, :redirect => 'global'}, :class => 'link-action', :id => "select-groups-#{global_permission_key}" -%>) </td> </tr> <% end %> diff --git a/sonar-server/src/main/webapp/WEB-INF/db/migrate/414_add_scan_and_dry_run_permissions.rb b/sonar-server/src/main/webapp/WEB-INF/db/migrate/414_add_scan_and_dry_run_permissions.rb index cd00678468f..a11a15f72a3 100644 --- a/sonar-server/src/main/webapp/WEB-INF/db/migrate/414_add_scan_and_dry_run_permissions.rb +++ b/sonar-server/src/main/webapp/WEB-INF/db/migrate/414_add_scan_and_dry_run_permissions.rb @@ -34,11 +34,11 @@ class AddScanAndDryRunPermissions < ActiveRecord::Migration def self.up # -- Role scan -- # Anyone - GroupRole.create(:group_id => nil, :role => 'scan', :resource_id => nil) + GroupRole.create(:group_id => nil, :role => Java::OrgSonarCoreUser::Permission::SCAN_EXECUTION.key, :resource_id => nil) # -- Role dryRunScan -- # Anyone - GroupRole.create(:group_id => nil, :role => 'dryRunScan', :resource_id => nil) + GroupRole.create(:group_id => nil, :role => Java::OrgSonarCoreUser::Permission::DRY_RUN_EXECUTION.key, :resource_id => nil) end end diff --git a/sonar-server/src/main/webapp/WEB-INF/lib/need_authorization.rb b/sonar-server/src/main/webapp/WEB-INF/lib/need_authorization.rb index bd4d7cee724..78ce1114ffd 100644 --- a/sonar-server/src/main/webapp/WEB-INF/lib/need_authorization.rb +++ b/sonar-server/src/main/webapp/WEB-INF/lib/need_authorization.rb @@ -57,10 +57,11 @@ module NeedAuthorization # has_role?(:admin, [30,45,7]) checks if the user is administrator of the projects 30, 40 and 7. It returns an array of 3 booleans. # def has_role?(role, objects=nil) + role = role.key if role.java_kind_of?(Java::OrgSonarCoreUser::Permission) + role = role.to_s if objects.nil? - role_symbol=role.to_sym - if role_symbol==:admin || role_symbol==:profileadmin || role_symbol==:shareDashboard || role_symbol==:scan || role_symbol==:dryRunScan - AuthorizerFactory.authorizer.has_role?(self, role_symbol) + if Java::OrgSonarCoreUser::Permission::allGlobal.keySet.include?(role) + AuthorizerFactory.authorizer.has_role?(self, role.to_sym) else # There's no concept of global users or global codeviewers. # Someone is considered as user if diff --git a/sonar-server/src/test/java/org/sonar/server/issue/IssueFilterServiceTest.java b/sonar-server/src/test/java/org/sonar/server/issue/IssueFilterServiceTest.java index 6350e37a414..256b7871a03 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/IssueFilterServiceTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/IssueFilterServiceTest.java @@ -37,7 +37,7 @@ import org.sonar.core.issue.db.IssueFilterDto; import org.sonar.core.issue.db.IssueFilterFavouriteDao; import org.sonar.core.issue.db.IssueFilterFavouriteDto; import org.sonar.core.user.AuthorizationDao; -import org.sonar.core.user.Permissions; +import org.sonar.core.user.Permission; import org.sonar.server.user.MockUserSession; import org.sonar.server.user.UserSession; @@ -50,7 +50,15 @@ import static com.google.common.collect.Maps.newHashMap; import static org.fest.assertions.Assertions.assertThat; import static org.fest.assertions.Fail.fail; import static org.mockito.Matchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.anyMap; +import static org.mockito.Matchers.argThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; public class IssueFilterServiceTest { @@ -213,7 +221,7 @@ public class IssueFilterServiceTest { @Test public void should_not_save_shared_filter_if_name_already_used_by_shared_filter() { - when(issueFilterDao.selectByUser(eq("john"))).thenReturn(Collections.<IssueFilterDto>emptyList()); + when(issueFilterDao.selectByUser(eq("john"))).thenReturn(Collections.<IssueFilterDto> emptyList()); when(issueFilterDao.selectSharedFilters()).thenReturn(newArrayList(new IssueFilterDto().setId(1L).setName("My Issue").setUserLogin("henry").setShared(true))); DefaultIssueFilter issueFilter = new DefaultIssueFilter().setName("My Issue").setShared(true); try { @@ -264,7 +272,7 @@ public class IssueFilterServiceTest { @Test public void should_update_other_shared_filter_if_admin() { - when(authorizationDao.selectGlobalPermissions("john")).thenReturn(newArrayList(UserRole.ADMIN)); + when(authorizationDao.selectGlobalPermissions("john")).thenReturn(newArrayList(Permission.SYSTEM_ADMIN.key())); when(issueFilterDao.selectById(1L)).thenReturn(new IssueFilterDto().setId(1L).setName("My Old Filter").setUserLogin("arthur").setShared(true)); DefaultIssueFilter result = service.update(new DefaultIssueFilter().setId(1L).setName("My New Filter"), userSession); @@ -335,7 +343,7 @@ public class IssueFilterServiceTest { IssueFilterDto sharedFilter = new IssueFilterDto().setId(1L).setName("My filter").setUserLogin("former.owner").setShared(true); IssueFilterDto expectedDto = new IssueFilterDto().setName("My filter").setUserLogin("new.owner").setShared(true); - when(authorizationDao.selectGlobalPermissions(currentUser)).thenReturn(newArrayList(Permissions.SYSTEM_ADMIN)); + when(authorizationDao.selectGlobalPermissions(currentUser)).thenReturn(newArrayList(Permission.SYSTEM_ADMIN.key())); when(issueFilterDao.selectById(1L)).thenReturn(sharedFilter); when(issueFilterDao.selectSharedFilters()).thenReturn(Lists.newArrayList(sharedFilter)); @@ -350,7 +358,7 @@ public class IssueFilterServiceTest { String currentUser = "dave.loper"; IssueFilterDto sharedFilter = new IssueFilterDto().setId(1L).setName("My filter").setUserLogin(currentUser).setShared(true); - when(authorizationDao.selectGlobalPermissions(currentUser)).thenReturn(newArrayList(Permissions.DRY_RUN_EXECUTION)); + when(authorizationDao.selectGlobalPermissions(currentUser)).thenReturn(newArrayList(Permission.DRY_RUN_EXECUTION.key())); when(issueFilterDao.selectById(1L)).thenReturn(sharedFilter); try { @@ -399,7 +407,7 @@ public class IssueFilterServiceTest { @Test public void should_delete_shared_filter_if_user_is_admin() { - when(authorizationDao.selectGlobalPermissions("john")).thenReturn(newArrayList(UserRole.ADMIN)); + when(authorizationDao.selectGlobalPermissions("john")).thenReturn(newArrayList(Permission.SYSTEM_ADMIN.key())); when(issueFilterDao.selectById(1L)).thenReturn(new IssueFilterDto().setId(1L).setName("My Issues").setUserLogin("arthur").setShared(true)); service.delete(1L, userSession); @@ -409,7 +417,7 @@ public class IssueFilterServiceTest { @Test public void should_not_delete_not_shared_filter_if_user_is_admin() { - when(authorizationDao.selectGlobalPermissions("john")).thenReturn(newArrayList(UserRole.ADMIN)); + when(authorizationDao.selectGlobalPermissions("john")).thenReturn(newArrayList(Permission.SYSTEM_ADMIN.key())); when(issueFilterDao.selectById(1L)).thenReturn(new IssueFilterDto().setId(1L).setName("My Issues").setUserLogin("arthur").setShared(false)); try { @@ -482,9 +490,9 @@ public class IssueFilterServiceTest { @Test public void should_find_shared_issue_filter() { when(issueFilterDao.selectSharedFilters()).thenReturn(newArrayList( - new IssueFilterDto().setId(1L).setName("My Issue").setUserLogin("john").setShared(true), - new IssueFilterDto().setId(2L).setName("Project Issues").setUserLogin("arthur").setShared(true) - )); + new IssueFilterDto().setId(1L).setName("My Issue").setUserLogin("john").setShared(true), + new IssueFilterDto().setId(2L).setName("Project Issues").setUserLogin("arthur").setShared(true) + )); List<DefaultIssueFilter> results = service.findSharedFiltersWithoutUserFilters(userSession); assertThat(results).hasSize(1); @@ -516,7 +524,7 @@ public class IssueFilterServiceTest { public void should_add_favourite_issue_filter_id() { when(issueFilterDao.selectById(1L)).thenReturn(new IssueFilterDto().setId(1L).setName("My Issues").setUserLogin("john").setData("componentRoots=struts")); // The filter is not in the favorite list --> add to favorite - when(issueFilterFavouriteDao.selectByFilterId(1L)).thenReturn(Collections.<IssueFilterFavouriteDto>emptyList()); + when(issueFilterFavouriteDao.selectByFilterId(1L)).thenReturn(Collections.<IssueFilterFavouriteDto> emptyList()); ArgumentCaptor<IssueFilterFavouriteDto> issueFilterFavouriteDtoCaptor = ArgumentCaptor.forClass(IssueFilterFavouriteDto.class); service.toggleFavouriteIssueFilter(1L, userSession); @@ -531,7 +539,7 @@ public class IssueFilterServiceTest { public void should_add_favourite_on_shared_filter() { when(issueFilterDao.selectById(1L)).thenReturn(new IssueFilterDto().setId(1L).setName("My Issues").setUserLogin("arthur").setShared(true)); // The filter is not in the favorite list --> add to favorite - when(issueFilterFavouriteDao.selectByFilterId(1L)).thenReturn(Collections.<IssueFilterFavouriteDto>emptyList()); + when(issueFilterFavouriteDao.selectByFilterId(1L)).thenReturn(Collections.<IssueFilterFavouriteDto> emptyList()); ArgumentCaptor<IssueFilterFavouriteDto> issueFilterFavouriteDtoCaptor = ArgumentCaptor.forClass(IssueFilterFavouriteDto.class); service.toggleFavouriteIssueFilter(1L, userSession); @@ -599,7 +607,7 @@ public class IssueFilterServiceTest { @Override public boolean matches(Object o) { - if(o != null && o instanceof IssueFilterDto) { + if (o != null && o instanceof IssueFilterDto) { IssueFilterDto otherFilter = (IssueFilterDto) o; return ObjectUtils.equals(referenceFilter.isShared(), otherFilter.isShared()) && ObjectUtils.equals(referenceFilter.getUserLogin(), otherFilter.getUserLogin()) diff --git a/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceTest.java b/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceTest.java index 633ff89b982..c0a2434b78f 100644 --- a/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceTest.java +++ b/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceTest.java @@ -30,14 +30,24 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.api.security.DefaultGroups; -import org.sonar.core.user.*; +import org.sonar.core.user.GroupDto; +import org.sonar.core.user.GroupRoleDto; +import org.sonar.core.user.Permission; +import org.sonar.core.user.RoleDao; +import org.sonar.core.user.UserDao; +import org.sonar.core.user.UserDto; +import org.sonar.core.user.UserRoleDto; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.user.MockUserSession; import java.util.Map; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.argThat; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.sonar.server.permission.InternalPermissionServiceTest.MatchesGroupRole.matchesRole; import static org.sonar.server.permission.InternalPermissionServiceTest.MatchesUserRole.matchesRole; @@ -53,7 +63,7 @@ public class InternalPermissionServiceTest { @Before public void setUpCommonStubbing() { - MockUserSession.set().setLogin("admin").setPermissions(Permissions.SYSTEM_ADMIN); + MockUserSession.set().setLogin("admin").setPermissions(Permission.SYSTEM_ADMIN); UserDto targetedUser = new UserDto().setId(2L).setLogin("user").setActive(true); GroupDto targetedGroup = new GroupDto().setId(2L).setName("group"); @@ -69,9 +79,9 @@ public class InternalPermissionServiceTest { @Test public void should_add_user_permission() throws Exception { - params = buildParams("user", null, Permissions.DASHBOARD_SHARING); - setUpUserPermissions("user", Permissions.QUALITY_PROFILE_ADMIN); - UserRoleDto roleToInsert = new UserRoleDto().setUserId(2L).setRole(Permissions.DASHBOARD_SHARING); + params = buildParams("user", null, Permission.DASHBOARD_SHARING); + setUpUserPermissions("user", Permission.QUALITY_PROFILE_ADMIN.key()); + UserRoleDto roleToInsert = new UserRoleDto().setUserId(2L).setRole(Permission.DASHBOARD_SHARING.key()); service.addPermission(params); @@ -80,9 +90,9 @@ public class InternalPermissionServiceTest { @Test public void should_remove_user_permission() throws Exception { - params = buildParams("user", null, Permissions.QUALITY_PROFILE_ADMIN); - setUpUserPermissions("user", Permissions.QUALITY_PROFILE_ADMIN); - UserRoleDto roleToRemove = new UserRoleDto().setUserId(2L).setRole(Permissions.QUALITY_PROFILE_ADMIN); + params = buildParams("user", null, Permission.QUALITY_PROFILE_ADMIN); + setUpUserPermissions("user", Permission.QUALITY_PROFILE_ADMIN.key()); + UserRoleDto roleToRemove = new UserRoleDto().setUserId(2L).setRole(Permission.QUALITY_PROFILE_ADMIN.key()); service.removePermission(params); @@ -91,9 +101,9 @@ public class InternalPermissionServiceTest { @Test public void should_add_group_permission() throws Exception { - params = buildParams(null, "group", Permissions.DASHBOARD_SHARING); - setUpGroupPermissions("group", Permissions.QUALITY_PROFILE_ADMIN); - GroupRoleDto roleToInsert = new GroupRoleDto().setGroupId(2L).setRole(Permissions.DASHBOARD_SHARING); + params = buildParams(null, "group", Permission.DASHBOARD_SHARING); + setUpGroupPermissions("group", Permission.QUALITY_PROFILE_ADMIN.key()); + GroupRoleDto roleToInsert = new GroupRoleDto().setGroupId(2L).setRole(Permission.DASHBOARD_SHARING.key()); service.addPermission(params); @@ -102,9 +112,9 @@ public class InternalPermissionServiceTest { @Test public void should_remove_group_permission() throws Exception { - params = buildParams(null, "group", Permissions.QUALITY_PROFILE_ADMIN); - setUpGroupPermissions("group", Permissions.QUALITY_PROFILE_ADMIN); - GroupRoleDto roleToRemove = new GroupRoleDto().setGroupId(2L).setRole(Permissions.QUALITY_PROFILE_ADMIN); + params = buildParams(null, "group", Permission.QUALITY_PROFILE_ADMIN); + setUpGroupPermissions("group", Permission.QUALITY_PROFILE_ADMIN.key()); + GroupRoleDto roleToRemove = new GroupRoleDto().setGroupId(2L).setRole(Permission.QUALITY_PROFILE_ADMIN.key()); service.removePermission(params); @@ -113,8 +123,8 @@ public class InternalPermissionServiceTest { @Test public void should_skip_redundant_permission_change() throws Exception { - params = buildParams("user", null, Permissions.QUALITY_PROFILE_ADMIN); - setUpUserPermissions("user", Permissions.QUALITY_PROFILE_ADMIN); + params = buildParams("user", null, Permission.QUALITY_PROFILE_ADMIN); + setUpUserPermissions("user", Permission.QUALITY_PROFILE_ADMIN.key()); service.addPermission(params); @@ -124,7 +134,7 @@ public class InternalPermissionServiceTest { @Test public void should_fail_on_invalid_request() throws Exception { throwable.expect(IllegalArgumentException.class); - params = buildParams("user", "group", Permissions.QUALITY_PROFILE_ADMIN); + params = buildParams("user", "group", Permission.QUALITY_PROFILE_ADMIN); service.addPermission(params); } @@ -132,9 +142,9 @@ public class InternalPermissionServiceTest { @Test public void should_fail_on_insufficient_rights() throws Exception { throwable.expect(ForbiddenException.class); - params = buildParams("user", null, Permissions.QUALITY_PROFILE_ADMIN); + params = buildParams("user", null, Permission.QUALITY_PROFILE_ADMIN); - MockUserSession.set().setLogin("unauthorized").setPermissions(Permissions.QUALITY_PROFILE_ADMIN); + MockUserSession.set().setLogin("unauthorized").setPermissions(Permission.QUALITY_PROFILE_ADMIN); service.addPermission(params); } @@ -142,7 +152,7 @@ public class InternalPermissionServiceTest { @Test public void should_fail_on_anonymous_access() throws Exception { throwable.expect(ForbiddenException.class); - params = buildParams("user", null, Permissions.QUALITY_PROFILE_ADMIN); + params = buildParams("user", null, Permission.QUALITY_PROFILE_ADMIN); MockUserSession.set(); @@ -151,8 +161,8 @@ public class InternalPermissionServiceTest { @Test public void should_add_permission_to_anyone_group() throws Exception { - params = buildParams(null, DefaultGroups.ANYONE, Permissions.QUALITY_PROFILE_ADMIN); - GroupRoleDto roleToInsert = new GroupRoleDto().setRole(Permissions.QUALITY_PROFILE_ADMIN); + params = buildParams(null, DefaultGroups.ANYONE, Permission.QUALITY_PROFILE_ADMIN); + GroupRoleDto roleToInsert = new GroupRoleDto().setRole(Permission.QUALITY_PROFILE_ADMIN.key()); service.addPermission(params); @@ -161,9 +171,9 @@ public class InternalPermissionServiceTest { @Test public void should_remove_permission_from_anyone_group() throws Exception { - params = buildParams(null, DefaultGroups.ANYONE, Permissions.QUALITY_PROFILE_ADMIN); - setUpGroupPermissions(DefaultGroups.ANYONE, Permissions.QUALITY_PROFILE_ADMIN); - GroupRoleDto roleToDelete = new GroupRoleDto().setRole(Permissions.QUALITY_PROFILE_ADMIN); + params = buildParams(null, DefaultGroups.ANYONE, Permission.QUALITY_PROFILE_ADMIN); + setUpGroupPermissions(DefaultGroups.ANYONE, Permission.QUALITY_PROFILE_ADMIN.key()); + GroupRoleDto roleToDelete = new GroupRoleDto().setRole(Permission.QUALITY_PROFILE_ADMIN.key()); service.removePermission(params); @@ -184,7 +194,7 @@ public class InternalPermissionServiceTest { @Override public boolean matches(Object o) { - if(o != null && o instanceof UserRoleDto) { + if (o != null && o instanceof UserRoleDto) { UserRoleDto otherDto = (UserRoleDto) o; return ObjectUtils.equals(referenceDto.getResourceId(), otherDto.getResourceId()) && ObjectUtils.equals(referenceDto.getRole(), otherDto.getRole()) && @@ -212,7 +222,7 @@ public class InternalPermissionServiceTest { @Override public boolean matches(Object o) { - if(o != null && o instanceof GroupRoleDto) { + if (o != null && o instanceof GroupRoleDto) { GroupRoleDto otherDto = (GroupRoleDto) o; return ObjectUtils.equals(referenceDto.getResourceId(), otherDto.getResourceId()) && ObjectUtils.equals(referenceDto.getRole(), otherDto.getRole()) && @@ -226,11 +236,11 @@ public class InternalPermissionServiceTest { } } - private Map<String, Object> buildParams(String login, String group, String role) { + private Map<String, Object> buildParams(String login, String group, Permission perm) { Map<String, Object> params = Maps.newHashMap(); params.put("user", login); params.put("group", group); - params.put("permission", role); + params.put("permission", perm.key()); return params; } diff --git a/sonar-server/src/test/java/org/sonar/server/permission/PermissionChangeQueryTest.java b/sonar-server/src/test/java/org/sonar/server/permission/PermissionChangeQueryTest.java index ff0cd284340..5e4515590a2 100644 --- a/sonar-server/src/test/java/org/sonar/server/permission/PermissionChangeQueryTest.java +++ b/sonar-server/src/test/java/org/sonar/server/permission/PermissionChangeQueryTest.java @@ -21,30 +21,33 @@ package org.sonar.server.permission; import com.google.common.collect.Maps; +import org.junit.Rule; import org.junit.Test; -import org.sonar.core.user.Permissions; +import org.junit.rules.ExpectedException; +import org.sonar.core.user.Permission; import java.util.Map; import static org.fest.assertions.Assertions.assertThat; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; public class PermissionChangeQueryTest { + @Rule + public ExpectedException thrown = ExpectedException.none(); + @Test public void should_populate_from_params() throws Exception { Map<String, Object> params = Maps.newHashMap(); params.put("user", "my_login"); params.put("group", "my_group"); - params.put("permission", Permissions.SYSTEM_ADMIN); + params.put("permission", Permission.SYSTEM_ADMIN.key()); PermissionChangeQuery query = PermissionChangeQuery.buildFromParams(params); assertThat(query.getUser()).isEqualTo("my_login"); assertThat(query.getGroup()).isEqualTo("my_group"); - assertThat(query.getRole()).isEqualTo(Permissions.SYSTEM_ADMIN); + assertThat(query.getRole()).isEqualTo(Permission.SYSTEM_ADMIN.key()); } @Test @@ -52,10 +55,10 @@ public class PermissionChangeQueryTest { Map<String, Object> validUserParams = Maps.newHashMap(); validUserParams.put("user", "my_login"); - validUserParams.put("permission", Permissions.SYSTEM_ADMIN); + validUserParams.put("permission", Permission.SYSTEM_ADMIN.key()); PermissionChangeQuery query = PermissionChangeQuery.buildFromParams(validUserParams); - assertTrue(query.isValid()); + query.validate(); } @Test @@ -63,10 +66,10 @@ public class PermissionChangeQueryTest { Map<String, Object> validGroupParams = Maps.newHashMap(); validGroupParams.put("group", "my_group"); - validGroupParams.put("permission", Permissions.SYSTEM_ADMIN); + validGroupParams.put("permission", Permission.SYSTEM_ADMIN.key()); PermissionChangeQuery query = PermissionChangeQuery.buildFromParams(validGroupParams); - assertTrue(query.isValid()); + query.validate(); } @Test @@ -75,19 +78,37 @@ public class PermissionChangeQueryTest { Map<String, Object> inconsistentParams = Maps.newHashMap(); inconsistentParams.put("user", "my_login"); inconsistentParams.put("group", "my_group"); - inconsistentParams.put("permission", Permissions.SYSTEM_ADMIN); + inconsistentParams.put("permission", Permission.SYSTEM_ADMIN.key()); PermissionChangeQuery query = PermissionChangeQuery.buildFromParams(inconsistentParams); - assertFalse(query.isValid()); + + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("Only one of user or group parameter should be provided"); + query.validate(); } @Test - public void should_detect_missing_parameters() throws Exception { - Map<String, Object> validGroupParams = Maps.newHashMap(); - validGroupParams.put("permission", "admin"); + public void should_detect_missing_user_or_group() throws Exception { + Map<String, Object> inconsistentParams = Maps.newHashMap(); + inconsistentParams.put("permission", "admin"); - PermissionChangeQuery query = PermissionChangeQuery.buildFromParams(validGroupParams); - assertFalse(query.isValid()); + PermissionChangeQuery query = PermissionChangeQuery.buildFromParams(inconsistentParams); + + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("Missing user or group parameter"); + query.validate(); + } + + @Test + public void should_detect_missing_permission() throws Exception { + Map<String, Object> inconsistentParams = Maps.newHashMap(); + inconsistentParams.put("user", "my_login"); + + PermissionChangeQuery query = PermissionChangeQuery.buildFromParams(inconsistentParams); + + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("Missing role parameter"); + query.validate(); } @Test @@ -97,6 +118,9 @@ public class PermissionChangeQueryTest { inconsistentParams.put("permission", "invalid_role"); PermissionChangeQuery query = PermissionChangeQuery.buildFromParams(inconsistentParams); - assertFalse(query.isValid()); + + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("Invalid role key invalid_role"); + query.validate(); } } diff --git a/sonar-server/src/test/java/org/sonar/server/user/DefaultUserServiceTest.java b/sonar-server/src/test/java/org/sonar/server/user/DefaultUserServiceTest.java index 37d4545c1c3..194de223491 100644 --- a/sonar-server/src/test/java/org/sonar/server/user/DefaultUserServiceTest.java +++ b/sonar-server/src/test/java/org/sonar/server/user/DefaultUserServiceTest.java @@ -27,7 +27,7 @@ import org.junit.rules.ExpectedException; import org.mockito.ArgumentMatcher; import org.sonar.api.user.UserFinder; import org.sonar.api.user.UserQuery; -import org.sonar.api.web.UserRole; +import org.sonar.core.user.Permission; import org.sonar.core.user.UserDao; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.ForbiddenException; @@ -35,7 +35,11 @@ import org.sonar.server.exceptions.ForbiddenException; import static org.fest.assertions.Assertions.assertThat; import static org.fest.assertions.Fail.fail; import static org.mockito.Matchers.argThat; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; public class DefaultUserServiceTest { @@ -48,11 +52,11 @@ public class DefaultUserServiceTest { @Test public void parse_query() throws Exception { - service.find(ImmutableMap.<String, Object>of( - "logins", "simon,loic", - "includeDeactivated", "true", - "s", "sim" - )); + service.find(ImmutableMap.<String, Object> of( + "logins", "simon,loic", + "includeDeactivated", "true", + "s", "sim" + )); verify(finder, times(1)).find(argThat(new ArgumentMatcher<UserQuery>() { @Override @@ -67,13 +71,13 @@ public class DefaultUserServiceTest { @Test public void test_empty_query() throws Exception { - service.find(Maps.<String, Object>newHashMap()); + service.find(Maps.<String, Object> newHashMap()); verify(finder, times(1)).find(argThat(new ArgumentMatcher<UserQuery>() { @Override public boolean matches(Object o) { UserQuery query = (UserQuery) o; - return !query.includeDeactivated() && query.logins() == null && query.searchText()==null; + return !query.includeDeactivated() && query.logins() == null && query.searchText() == null; } })); } @@ -81,7 +85,7 @@ public class DefaultUserServiceTest { @Test public void self_deactivation_is_not_possible() throws Exception { try { - MockUserSession.set().setLogin("simon").setPermissions(UserRole.ADMIN); + MockUserSession.set().setLogin("simon").setPermissions(Permission.SYSTEM_ADMIN); service.deactivate("simon"); fail(); } catch (BadRequestException e) { @@ -93,7 +97,7 @@ public class DefaultUserServiceTest { @Test public void user_deactivation_requires_admin_permission() throws Exception { try { - MockUserSession.set().setLogin("simon").setPermissions(UserRole.USER); + MockUserSession.set().setLogin("simon").setPermissions(Permission.QUALITY_PROFILE_ADMIN); service.deactivate("julien"); fail(); } catch (ForbiddenException e) { @@ -103,14 +107,14 @@ public class DefaultUserServiceTest { @Test public void deactivate_user() throws Exception { - MockUserSession.set().setLogin("simon").setPermissions(UserRole.ADMIN); + MockUserSession.set().setLogin("simon").setPermissions(Permission.SYSTEM_ADMIN); service.deactivate("julien"); verify(dao).deactivateUserByLogin("julien"); } @Test public void fail_to_deactivate_when_blank_login() throws Exception { - MockUserSession.set().setLogin("simon").setPermissions(UserRole.ADMIN); + MockUserSession.set().setLogin("simon").setPermissions(Permission.SYSTEM_ADMIN); try { service.deactivate(""); fail(); diff --git a/sonar-server/src/test/java/org/sonar/server/user/MockUserSession.java b/sonar-server/src/test/java/org/sonar/server/user/MockUserSession.java index 91f3a42bf36..d7dd2de8cbd 100644 --- a/sonar-server/src/test/java/org/sonar/server/user/MockUserSession.java +++ b/sonar-server/src/test/java/org/sonar/server/user/MockUserSession.java @@ -19,7 +19,10 @@ */ package org.sonar.server.user; +import org.sonar.core.user.Permission; + import javax.annotation.Nullable; + import java.util.Arrays; import java.util.Collections; import java.util.Locale; @@ -55,8 +58,8 @@ public class MockUserSession extends UserSession { return this; } - public MockUserSession setPermissions(String... s) { - permissions = Arrays.asList(s); + public MockUserSession setPermissions(Permission... perm) { + permissions = Arrays.asList(perm); return this; } } diff --git a/sonar-server/src/test/java/org/sonar/server/user/MockUserSessionTest.java b/sonar-server/src/test/java/org/sonar/server/user/MockUserSessionTest.java index 00932f3c2e9..5f99865391f 100644 --- a/sonar-server/src/test/java/org/sonar/server/user/MockUserSessionTest.java +++ b/sonar-server/src/test/java/org/sonar/server/user/MockUserSessionTest.java @@ -30,7 +30,7 @@ public class MockUserSessionTest { UserSession mock = UserSession.get(); assertThat(mock.login()).isEqualTo("simon"); - assertThat(mock.permissions()).isEmpty(); + assertThat(mock.globalPermissions()).isEmpty(); assertThat(mock.isLoggedIn()).isTrue(); } } diff --git a/sonar-server/src/test/java/org/sonar/server/user/UserSessionTest.java b/sonar-server/src/test/java/org/sonar/server/user/UserSessionTest.java index 4b3ceded23c..a5890d3d7e1 100644 --- a/sonar-server/src/test/java/org/sonar/server/user/UserSessionTest.java +++ b/sonar-server/src/test/java/org/sonar/server/user/UserSessionTest.java @@ -21,6 +21,7 @@ package org.sonar.server.user; import org.junit.Test; import org.sonar.core.user.AuthorizationDao; +import org.sonar.core.user.Permission; import org.sonar.server.exceptions.ForbiddenException; import java.util.Arrays; @@ -62,11 +63,11 @@ public class UserSessionTest { AuthorizationDao authorizationDao = mock(AuthorizationDao.class); UserSession session = new SpyUserSession("marius", authorizationDao); - when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("shareIssueFilter", "admin")); + when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("profileadmin", "admin")); - assertThat(session.hasPermission("shareIssueFilter")).isTrue(); - assertThat(session.hasPermission("admin")).isTrue(); - assertThat(session.hasPermission("shareDashboard")).isFalse(); + assertThat(session.hasGlobalPermission(Permission.QUALITY_PROFILE_ADMIN)).isTrue(); + assertThat(session.hasGlobalPermission(Permission.SYSTEM_ADMIN)).isTrue(); + assertThat(session.hasGlobalPermission(Permission.DASHBOARD_SHARING)).isFalse(); } @Test @@ -81,9 +82,9 @@ public class UserSessionTest { AuthorizationDao authorizationDao = mock(AuthorizationDao.class); UserSession session = new SpyUserSession("marius", authorizationDao); - when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("shareIssueFilter", "admin")); + when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("profileadmin", "admin")); - session.checkPermission("shareIssueFilter"); + session.checkGlobalPermission(Permission.QUALITY_PROFILE_ADMIN); } @Test(expected = ForbiddenException.class) @@ -91,9 +92,9 @@ public class UserSessionTest { AuthorizationDao authorizationDao = mock(AuthorizationDao.class); UserSession session = new SpyUserSession("marius", authorizationDao); - when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("shareIssueFilter", "admin")); + when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("profileadmin", "admin")); - session.checkPermission("shareDashboard"); + session.checkGlobalPermission(Permission.DASHBOARD_SHARING); } static class SpyUserSession extends UserSession { |