bug4754: started changing admin console permission checking

Change-Id: Id9b1bd290ec1cf46cfd26aada3f2db614bc6fc71
This commit is contained in:
Axel Uhl
2018-09-18 22:20:29 +02:00
parent 4c8214afdb
commit 5a2b3e917f
9 changed files with 98 additions and 85 deletions
@@ -101,7 +101,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
getWidget().fillEvents();
fillLeaderboardGroups();
}
}, getStringMessages().events(), Permission.MANAGE_EVENTS);
}, getStringMessages().events()); // no permissions required; we show those events the user may read
leaderboardGroupsDisplayers.add(eventManagementPanel);
/* REGATTAS */
@@ -114,7 +114,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
fillRegattas();
}
}, getStringMessages().regattas(), Permission.MANAGE_REGATTAS);
}, getStringMessages().regattas()); // no permissions required; we show those regattas the user may read
regattasDisplayers.add(regattaManagementPanel);
/* LEADERBOARDS */
@@ -128,7 +128,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
fillLeaderboards();
}
}, getStringMessages().leaderboards(), Permission.MANAGE_LEADERBOARDS);
}, getStringMessages().leaderboards()); // no permissions required; we show those leaderboard the user may read
regattasDisplayers.add(leaderboardConfigPanel);
leaderboardsDisplayers.add(leaderboardConfigPanel);
@@ -147,7 +147,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
refreshAfterBecomingVisible(); //Refresh to sure that actual data is provided
setupLeaderboardGroups(leaderboardGroupConfigPanel, params);
}
}, getStringMessages().leaderboardGroups(), Permission.MANAGE_LEADERBOARD_GROUPS);
}, getStringMessages().leaderboardGroups()); // no permissions required; we show those leaderboard groups the user may read
regattasDisplayers.add(leaderboardGroupConfigPanel);
leaderboardGroupsDisplayers.add(leaderboardGroupConfigPanel);
leaderboardsDisplayers.add(leaderboardGroupConfigPanel);
@@ -165,7 +165,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
fillRegattas();
}
}, getStringMessages().trackedRaces(), Permission.MANAGE_TRACKED_RACES);
}, getStringMessages().trackedRaces()); // no permissions required; we show those races the user may read
regattasDisplayers.add(trackedRacesManagementPanel);
final CompetitorPanel competitorPanel = new CompetitorPanel(getSailingService(), getStringMessages(), this);
@@ -175,7 +175,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
getWidget().refreshCompetitorList();
}
}, getStringMessages().competitors(), Permission.MANAGE_ALL_COMPETITORS);
}, getStringMessages().competitors()); // no permissions required; we show those competitors the user may read
final BoatPanel boatPanel = new BoatPanel(getSailingService(), getStringMessages(), this);
boatPanel.ensureDebugId("BoatPanel");
@@ -184,17 +184,16 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
getWidget().refreshBoatList();
}
}, getStringMessages().boats(), Permission.MANAGE_ALL_BOATS);
}, getStringMessages().boats()); // no permissions required; we show those boats the user may read
RaceCourseManagementPanel raceCourseManagementPanel = new RaceCourseManagementPanel(getSailingService(), this, this, getStringMessages());
panel.addToTabPanel(racesTabPanel, new DefaultRefreshableAdminConsolePanel<RaceCourseManagementPanel>(raceCourseManagementPanel), getStringMessages().courseLayout(), Permission.MANAGE_COURSE_LAYOUT);
panel.addToTabPanel(racesTabPanel, new DefaultRefreshableAdminConsolePanel<RaceCourseManagementPanel>(raceCourseManagementPanel), getStringMessages().courseLayout());
regattasDisplayers.add(raceCourseManagementPanel);
final AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor();
WindPanel windPanel = new WindPanel(getSailingService(), asyncActionsExecutor, this, this, getStringMessages());
panel.addToTabPanel(racesTabPanel, new DefaultRefreshableAdminConsolePanel<WindPanel>(windPanel), getStringMessages().wind(),
Permission.MANAGE_WIND);
panel.addToTabPanel(racesTabPanel, new DefaultRefreshableAdminConsolePanel<WindPanel>(windPanel), getStringMessages().wind()); // no permissions required; we show those wind the user may read
regattasDisplayers.add(windPanel);
final MediaPanel mediaPanel = new MediaPanel(regattasDisplayers, getSailingService(), this, mediaService, this, getStringMessages());
@@ -203,7 +202,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
getWidget().onShow();
}
}, getStringMessages().mediaPanel(), Permission.MANAGE_MEDIA);
}, getStringMessages().mediaPanel()); // no permissions required; we show those media the user may read
/* RACE COMMITTEE APP */
@@ -211,7 +210,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
final DeviceConfigurationUserPanel deviceConfigurationUserPanel = new DeviceConfigurationUserPanel(getSailingService(),
getUserService(), getStringMessages(), this);
panel.addToTabPanel(raceCommitteeTabPanel, new DefaultRefreshableAdminConsolePanel<DeviceConfigurationUserPanel>(deviceConfigurationUserPanel),
getStringMessages().deviceConfiguration(), Permission.MANAGE_DEVICE_CONFIGURATION);
getStringMessages().deviceConfiguration()); // no permissions required; we show those device configurations the user may read
/* CONNECTORS */
@@ -220,19 +219,19 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
this, this, getStringMessages());
tractracEventManagementPanel.ensureDebugId("TracTracEventManagement");
panel.addToTabPanel(connectorsTabPanel, new DefaultRefreshableAdminConsolePanel<TracTracEventManagementPanel>(tractracEventManagementPanel),
getStringMessages().tracTracEvents(), Permission.MANAGE_TRACKED_RACES);
getStringMessages().tracTracEvents()); // no permissions required; we show those TracTrac connector stuff the user may read
regattasDisplayers.add(tractracEventManagementPanel);
SwissTimingReplayConnectorPanel swissTimingReplayConnectorPanel = new SwissTimingReplayConnectorPanel(
getSailingService(), this, this, getStringMessages());
panel.addToTabPanel(connectorsTabPanel, new DefaultRefreshableAdminConsolePanel<SwissTimingReplayConnectorPanel>(swissTimingReplayConnectorPanel),
getStringMessages().swissTimingArchiveConnector(), Permission.MANAGE_TRACKED_RACES);
getStringMessages().swissTimingArchiveConnector()); // no permissions required; we show those SwissTiming connector stuff the user may read
regattasDisplayers.add(swissTimingReplayConnectorPanel);
SwissTimingEventManagementPanel swisstimingEventManagementPanel = new SwissTimingEventManagementPanel(
getSailingService(), this, this, getStringMessages());
panel.addToTabPanel(connectorsTabPanel, new DefaultRefreshableAdminConsolePanel<SwissTimingEventManagementPanel>(swisstimingEventManagementPanel),
getStringMessages().swissTimingEvents(), Permission.MANAGE_TRACKED_RACES);
getStringMessages().swissTimingEvents()); // no permissions required; we show those SwissTiming connector stuff the user may read
regattasDisplayers.add(swisstimingEventManagementPanel);
final SmartphoneTrackingEventManagementPanel raceLogTrackingEventManagementPanel = new SmartphoneTrackingEventManagementPanel(
@@ -243,7 +242,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
fillLeaderboards();
}
}, getStringMessages().smartphoneTracking(), Permission.MANAGE_TRACKED_RACES);
}, getStringMessages().smartphoneTracking()); // no permissions required; we show those Smartphone connector stuff the user may read
regattasDisplayers.add(raceLogTrackingEventManagementPanel);
leaderboardsDisplayers.add(raceLogTrackingEventManagementPanel);
@@ -259,7 +258,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
expeditionDeviceConfigurationsPanel.refresh();
}
}, getStringMessages().expeditionDeviceConfigurations(), Permission.MANAGE_EXPEDITION_DEVICE_CONFIGURATIONS);
}, getStringMessages().expeditionDeviceConfigurations(), Permission.MANAGE_EXPEDITION_DEVICE_CONFIGURATIONS); // TODO bug4754 use server name as type-relative object identifier
ResultImportUrlsManagementPanel resultImportUrlsManagementPanel = new ResultImportUrlsManagementPanel(getSailingService(), this, getStringMessages());
panel.addToTabPanel(connectorsTabPanel, new DefaultRefreshableAdminConsolePanel<ResultImportUrlsManagementPanel>(resultImportUrlsManagementPanel),
@@ -267,7 +266,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
StructureImportManagementPanel structureImportUrlsManagementPanel = new StructureImportManagementPanel(getSailingService(), this, getStringMessages(), this, eventManagementPanel);
panel.addToTabPanel(connectorsTabPanel, new DefaultRefreshableAdminConsolePanel<StructureImportManagementPanel>(structureImportUrlsManagementPanel),
getStringMessages().manage2Sail() + " " + getStringMessages().regattaStructureImport(), Permission.MANAGE_STRUCTURE_IMPORT_URLS);
getStringMessages().manage2Sail() + " " + getStringMessages().regattaStructureImport(), Permission.MANAGE_STRUCTURE_IMPORT_URLS); // TODO bug4754 use server name as type-relative object identifier
/* ADVANCED */
@@ -279,21 +278,21 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
replicationPanel.updateReplicaList();
}
}, getStringMessages().replication(), Permission.MANAGE_REPLICATION);
}, getStringMessages().replication(), Permission.MANAGE_REPLICATION); // TODO bug4754 use server name as type-relative object identifier
final MasterDataImportPanel masterDataImportPanel = new MasterDataImportPanel(getStringMessages(), getSailingService(),
this, eventManagementPanel, this, this, mediaPanel);
masterDataImportPanel.ensureDebugId("MasterDataImport");
panel.addToTabPanel(advancedTabPanel, new DefaultRefreshableAdminConsolePanel<MasterDataImportPanel>(masterDataImportPanel),
getStringMessages().masterDataImportPanel(), Permission.MANAGE_MASTERDATA_IMPORT);
getStringMessages().masterDataImportPanel(), Permission.MANAGE_MASTERDATA_IMPORT); // TODO bug4754 use server name as type-relative object identifier
RemoteServerInstancesManagementPanel remoteServerInstancesManagementPanel = new RemoteServerInstancesManagementPanel(getSailingService(), this, getStringMessages());
panel.addToTabPanel(advancedTabPanel, new DefaultRefreshableAdminConsolePanel<RemoteServerInstancesManagementPanel>(remoteServerInstancesManagementPanel),
getStringMessages().remoteServerInstances(), Permission.MANAGE_SAILING_SERVER_INSTANCES);
getStringMessages().remoteServerInstances(), Permission.MANAGE_SAILING_SERVER_INSTANCES); // TODO bug4754 use server name as type-relative object identifier
LocalServerManagementPanel localServerInstancesManagementPanel = new LocalServerManagementPanel(getSailingService(), this, getStringMessages());
panel.addToTabPanel(advancedTabPanel, new DefaultRefreshableAdminConsolePanel<LocalServerManagementPanel>(localServerInstancesManagementPanel),
getStringMessages().localServer(), Permission.MANAGE_LOCAL_SERVER_INSTANCE);
getStringMessages().localServer(), Permission.MANAGE_LOCAL_SERVER_INSTANCE); // TODO bug4754 use server name as type-relative object identifier
final UserManagementPanel<AdminConsoleTableResources> userManagementPanel = new UserManagementPanel<>(getUserService(), StringMessages.INSTANCE,
Arrays.<com.sap.sse.security.shared.HasPermissions>asList(Permission.values()), this, tableResources);
@@ -303,7 +302,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
userManagementPanel.updateUsersAndACLs();
}
}, getStringMessages().userManagement(), Permission.MANAGE_USERS);
}, getStringMessages().userManagement()); // no permissions required; we show those users the user may read
final RoleDefinitionsPanel roleManagementPanel = new RoleDefinitionsPanel(StringMessages.INSTANCE, getUserService().getUserManagementService(),
tableResources, this);
@@ -313,7 +312,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
roleManagementPanel.updateRoleDefinitions();
}
}, getStringMessages().roles(), Permission.MANAGE_ROLES);
}, getStringMessages().roles()); // no permissions required; we show those roles the user may read
final UserGroupManagementPanel userGroupManagementPanel = new UserGroupManagementPanel(getUserService(), StringMessages.INSTANCE);
panel.addToTabPanel(advancedTabPanel,
@@ -322,17 +321,15 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
public void refreshAfterBecomingVisible() {
userGroupManagementPanel.updateUserGroupsAndUsers();
}
}, getStringMessages().userGroupManagement(), Permission.MANAGE_USERS);
}, getStringMessages().userGroupManagement()); // no permissions required; we show those user groups the user may read
final FileStoragePanel fileStoragePanel = new FileStoragePanel(getSailingService(), this);
panel.addToTabPanel(advancedTabPanel, new DefaultRefreshableAdminConsolePanel<FileStoragePanel>(fileStoragePanel),
getStringMessages().fileStorage(), Permission.MANAGE_FILE_STORAGE);
getStringMessages().fileStorage(), Permission.MANAGE_FILE_STORAGE); // TODO bug4754 use server name as type-relative object identifier
panel.initUI();
fillRegattas();
fillLeaderboardGroups();
fillLeaderboards();
return panel;
}
@@ -63,6 +63,7 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.http.client.ClientProtocolException;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.UnauthorizedException;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
@@ -578,8 +579,8 @@ import com.sap.sse.replication.impl.ReplicaDescriptor;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.SessionUtils;
import com.sap.sse.security.shared.AccessControlListAnnotation;
import com.sap.sse.security.shared.OwnershipAnnotation;
import com.sap.sse.security.shared.HasPermissions.DefaultModes;
import com.sap.sse.security.shared.OwnershipAnnotation;
import com.sap.sse.security.shared.SecurityUser;
import com.sap.sse.security.shared.UserGroup;
import com.sap.sse.security.ui.server.SecurityDTOFactory;
@@ -3950,26 +3951,31 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
Map<String, String> sailorsInfoWebsiteURLsByLocaleName, Iterable<ImageDTO> images, Iterable<VideoDTO> videos,
Iterable<UUID> leaderboardGroupIds, String tenantOwnerName)
throws MalformedURLException, UnauthorizedException {
SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermission(DefaultModes.CREATE));
final EventDTO result;
UUID eventUuid = UUID.randomUUID();
TimePoint startTimePoint = startDate != null ? new MillisecondsTimePoint(startDate) : null;
TimePoint endTimePoint = endDate != null ? new MillisecondsTimePoint(endDate) : null;
URL officialWebsiteURL = officialWebsiteURLAsString != null ? new URL(officialWebsiteURLAsString) : null;
URL baseURL = baseURLAsString != null ? new URL(baseURLAsString) : null;
Map<Locale, URL> sailorsInfoWebsiteURLs = convertToLocalesAndUrls(sailorsInfoWebsiteURLsByLocaleName);
List<ImageDescriptor> eventImages = convertToImages(images);
List<VideoDescriptor> eventVideos = convertToVideos(videos);
getService().apply(
new CreateEvent(eventName, eventDescription, startTimePoint, endTimePoint, venue, isPublic, eventUuid,
officialWebsiteURL, baseURL, sailorsInfoWebsiteURLs, eventImages, eventVideos, leaderboardGroupIds));
createCourseAreas(eventUuid, courseAreaNames.toArray(new String[courseAreaNames.size()]));
getSecurityService().createAccessControlList(Permission.EVENT.getQualifiedObjectIdentifier(eventUuid.toString()), eventName);
getSecurityService().createOwnership(Permission.EVENT.getQualifiedObjectIdentifier(eventUuid.toString()),
getSecurityService().getUserByName((String) SecurityUtils.getSubject().getPrincipal()),
getSecurityService().getUserGroupByName(tenantOwnerName), eventName);
EventDTO result = getEventById(eventUuid, false);
return result;
try {
SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermissionForObjects(DefaultModes.CREATE, eventUuid.toString()));
TimePoint startTimePoint = startDate != null ? new MillisecondsTimePoint(startDate) : null;
TimePoint endTimePoint = endDate != null ? new MillisecondsTimePoint(endDate) : null;
URL officialWebsiteURL = officialWebsiteURLAsString != null ? new URL(officialWebsiteURLAsString) : null;
URL baseURL = baseURLAsString != null ? new URL(baseURLAsString) : null;
Map<Locale, URL> sailorsInfoWebsiteURLs = convertToLocalesAndUrls(sailorsInfoWebsiteURLsByLocaleName);
List<ImageDescriptor> eventImages = convertToImages(images);
List<VideoDescriptor> eventVideos = convertToVideos(videos);
getService().apply(
new CreateEvent(eventName, eventDescription, startTimePoint, endTimePoint, venue, isPublic, eventUuid,
officialWebsiteURL, baseURL, sailorsInfoWebsiteURLs, eventImages, eventVideos, leaderboardGroupIds));
createCourseAreas(eventUuid, courseAreaNames.toArray(new String[courseAreaNames.size()]));
result = getEventById(eventUuid, false);
return result;
} catch (AuthorizationException e) {
// revert ownership creation, then re-throw
getSecurityService().deleteOwnership(Permission.EVENT.getQualifiedObjectIdentifier(eventUuid.toString()));
throw e;
}
}
@Override
@@ -351,10 +351,9 @@ public class AdminConsolePanel extends HeaderPanel implements HandleTabSelectabl
* that panel
*
* @param requiresAnyOfThesePermissions
* zero or more permissions; if no permissions are provided, the user will never be able to see the
* zero or more permissions; if no permissions are provided, the user will always be able to see the
* widget. Otherwise, if any of these permissions implies any of the permissions the user has, the user
* will be shown the widget. In particular, a "*" wildcard permission will show the widget to all users,
* regardless their actual permissions.
* will be shown the widget.
*/
private void remeberWidgetLocationAndPermissions(VerticalOrHorizontalTabLayoutPanel tabPanel, Widget widgetToAdd,
String tabTitle, HasPermissions... requiresAnyOfThesePermissions) {
@@ -469,12 +468,20 @@ public class AdminConsolePanel extends HeaderPanel implements HandleTabSelectabl
* is also implied.
*/
private boolean userHasPermissionsToSeeWidget(UserDTO user, Widget widget) {
for (HasPermissions requiredStringPermission : permissionsAnyOfWhichIsRequiredToSeeWidget.get(widget)) {
WildcardPermission requiredPermission = requiredStringPermission.getPermission();
if (PermissionChecker.isPermitted(requiredPermission, user, user.getUserGroups(), /* ownership */ null, /* acl */ null)) {
return true;
final Set<HasPermissions> permissionsRequired = permissionsAnyOfWhichIsRequiredToSeeWidget.get(widget);
boolean hasPermission;
if (permissionsRequired.isEmpty()) {
hasPermission = true;
} else {
hasPermission = false;
for (HasPermissions requiredStringPermission : permissionsRequired) {
WildcardPermission requiredPermission = requiredStringPermission.getPermission();
if (PermissionChecker.isPermitted(requiredPermission, user, user.getUserGroups(), /* ownership */ null, /* acl */ null)) {
hasPermission = true;
break;
}
}
}
return false;
return hasPermission;
}
}
@@ -40,7 +40,7 @@ public interface UserManagementService extends RemoteService {
AccessControlList removeFromACL(QualifiedObjectIdentifier idOfAccessControlledObject, String groupOrTenantIdAsString, String action) throws UnauthorizedException;
Collection<UserGroup> getUserGroups() throws UnauthorizedException;
Collection<UserGroup> getUserGroups();
UserGroup getUserGroupByName(String userGroupName) throws UnauthorizedException;
@@ -36,6 +36,9 @@ public interface UserManagementServiceAsync {
void removeFromACL(QualifiedObjectIdentifier idOfAccessControlledObject, String permission, String name, AsyncCallback<AccessControlList> callback);
/**
* Returns those user groups the requesting user can read
*/
void getUserGroups(AsyncCallback<Collection<UserGroup>> callback);
void getUserGroupByName(String userGroupName, AsyncCallback<UserGroup> callback);
@@ -48,6 +51,9 @@ public interface UserManagementServiceAsync {
void removeUserFromUserGroup(String tenantIdAsString, String username, AsyncCallback<Void> asyncCallback);
/**
* Returns those users the requesting user can read
*/
void getUserList(AsyncCallback<Collection<UserDTO>> callback);
void getUserByName(String username, AsyncCallback<UserDTO> callback);
@@ -198,40 +198,38 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U
}
@Override
public Collection<UserGroup> getUserGroups() throws UnauthorizedException {
if (SecurityUtils.getSubject().isPermitted(DefaultPermissions.USER_GROUP.getStringPermission(DefaultModes.READ))) {
List<UserGroup> userGroups = new ArrayList<>();
final Map<SecurityUser, SecurityUser> fromOriginalToStrippedDownUser = new HashMap<>();
final Map<UserGroup, UserGroup> fromOriginalToStrippedDownUserGroup = new HashMap<>();
for (UserGroup g : getSecurityService().getUserGroupList()) {
public Collection<UserGroup> getUserGroups() {
List<UserGroup> userGroups = new ArrayList<>();
final Map<SecurityUser, SecurityUser> fromOriginalToStrippedDownUser = new HashMap<>();
final Map<UserGroup, UserGroup> fromOriginalToStrippedDownUserGroup = new HashMap<>();
for (UserGroup g : getSecurityService().getUserGroupList()) {
if (SecurityUtils.getSubject().isPermitted(DefaultPermissions.USER_GROUP.getStringPermissionForObjects(DefaultModes.READ, g.getId().toString()))) {
UserGroup userGroupDTO = securityDTOFactory.createUserGroupDTOFromUserGroup(g, fromOriginalToStrippedDownUser, fromOriginalToStrippedDownUserGroup);
userGroups.add(userGroupDTO);
}
return userGroups;
} else {
throw new UnauthorizedException("Not permitted to read user groups");
}
return userGroups;
}
@Override
public UserGroup getUserGroupByName(String userGroupName) throws UnauthorizedException {
if (SecurityUtils.getSubject().isPermitted(DefaultPermissions.USER_GROUP.getStringPermission(DefaultModes.READ))) {
final UserGroup userGroup = getSecurityService().getUserGroupByName(userGroupName);
final UserGroup userGroup = getSecurityService().getUserGroupByName(userGroupName);
if (userGroup == null || SecurityUtils.getSubject().isPermitted(DefaultPermissions.USER_GROUP.getStringPermissionForObjects(DefaultModes.READ, userGroup.getId().toString()))) {
final Map<SecurityUser, SecurityUser> fromOriginalToStrippedDownUser = new HashMap<>();
final Map<UserGroup, UserGroup> fromOriginalToStrippedDownUserGroup = new HashMap<>();
return userGroup==null?null:securityDTOFactory.createUserGroupDTOFromUserGroup(userGroup, fromOriginalToStrippedDownUser, fromOriginalToStrippedDownUserGroup);
} else {
throw new UnauthorizedException("Not permitted to read user groups");
throw new UnauthorizedException("Not permitted to read user group "+userGroupName);
}
}
@Override
public UserDTO getUserByName(String username) throws UnauthorizedException {
if (SecurityUtils.getSubject().isPermitted(DefaultPermissions.USER.getStringPermission(DefaultModes.READ))) {
final User user = getSecurityService().getUserByName(username);
final User user = getSecurityService().getUserByName(username);
if (user == null || SecurityUtils.getSubject().isPermitted(DefaultPermissions.USER.getStringPermissionForObjects(DefaultModes.READ, user.getName()))) {
return user==null?null:securityDTOFactory.createUserDTOFromUser(user, getSecurityService());
} else {
throw new UnauthorizedException("Not permitted to read users");
throw new UnauthorizedException("Not permitted to read user "+username);
}
}
@@ -295,16 +293,14 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U
@Override
public Collection<UserDTO> getUserList() throws UnauthorizedException {
if (SecurityUtils.getSubject().isPermitted(DefaultPermissions.USER.getStringPermission(DefaultModes.READ))) {
List<UserDTO> users = new ArrayList<>();
for (User u : getSecurityService().getUserList()) {
List<UserDTO> users = new ArrayList<>();
for (User u : getSecurityService().getUserList()) {
if (SecurityUtils.getSubject().isPermitted(DefaultPermissions.USER.getStringPermissionForObjects(DefaultModes.READ, u.getName()))) {
UserDTO userDTO = securityDTOFactory.createUserDTOFromUser(u, getSecurityService());
users.add(userDTO);
}
return users;
} else {
throw new UnauthorizedException("Not permitted to manage users");
}
return users;
}
@Override
@@ -88,7 +88,7 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
* Same as {@link #createOwnership(String, UserImpl, Tenant, String)}, leaving the display name
* of the object owned undefined.
*/
void createOwnership(QualifiedObjectIdentifier idOfOwnedObject, SecurityUser userOwner, UserGroup tenantOwner);
Ownership createOwnership(QualifiedObjectIdentifier idOfOwnedObject, SecurityUser userOwner, UserGroup tenantOwner);
/**
* @param idOfOwnedObject
@@ -104,7 +104,7 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
* as the object identified by {@link idOfOwnedObject} may change its name without notifying this
* store
*/
void createOwnership(QualifiedObjectIdentifier idOfOwnedObject, SecurityUser userOwner, UserGroup tenantOwner, String displayNameOfOwnedObject);
Ownership createOwnership(QualifiedObjectIdentifier idOfOwnedObject, SecurityUser userOwner, UserGroup tenantOwner, String displayNameOfOwnedObject);
void deleteOwnership(QualifiedObjectIdentifier idOfOwnedObject);
@@ -4,6 +4,7 @@ import java.util.Set;
import java.util.UUID;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.shared.Ownership;
import com.sap.sse.security.shared.QualifiedObjectIdentifier;
import com.sap.sse.security.shared.RoleDefinition;
import com.sap.sse.security.shared.User;
@@ -31,7 +32,7 @@ public interface ReplicableSecurityService extends SecurityService {
Void internalDeleteAcl(QualifiedObjectIdentifier idOfAccessControlledObject);
Void internalCreateOwnership(QualifiedObjectIdentifier idOfOwnedObject, String owningUsername, UUID tenantOwnerId, String displayNameOfOwnedObject);
Ownership internalCreateOwnership(QualifiedObjectIdentifier idOfOwnedObject, String owningUsername, UUID tenantOwnerId, String displayNameOfOwnedObject);
Void internalDeleteOwnership(QualifiedObjectIdentifier idOfOwnedObject);
@@ -92,6 +92,7 @@ import com.sap.sse.security.shared.AccessControlList;
import com.sap.sse.security.shared.AccessControlListAnnotation;
import com.sap.sse.security.shared.Account.AccountType;
import com.sap.sse.security.shared.AdminRole;
import com.sap.sse.security.shared.Ownership;
import com.sap.sse.security.shared.OwnershipAnnotation;
import com.sap.sse.security.shared.QualifiedObjectIdentifier;
import com.sap.sse.security.shared.Role;
@@ -442,12 +443,12 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
}
@Override
public void createOwnership(QualifiedObjectIdentifier idOfOwnedObjectAsString, SecurityUser userOwner, UserGroup tenantOwner) {
createOwnership(idOfOwnedObjectAsString, userOwner, tenantOwner, /* displayNameOfOwnedObject */ null);
public Ownership createOwnership(QualifiedObjectIdentifier idOfOwnedObjectAsString, SecurityUser userOwner, UserGroup tenantOwner) {
return createOwnership(idOfOwnedObjectAsString, userOwner, tenantOwner, /* displayNameOfOwnedObject */ null);
}
@Override
public void createOwnership(QualifiedObjectIdentifier idOfOwnedObjectAsString, SecurityUser userOwner, UserGroup tenantOwner, String displayNameOfOwnedObject) {
public Ownership createOwnership(QualifiedObjectIdentifier idOfOwnedObjectAsString, SecurityUser userOwner, UserGroup tenantOwner, String displayNameOfOwnedObject) {
final UUID tenantId;
if (tenantOwner == null || !tenantOwner.contains(userOwner)) {
tenantId = userOwner == null || userOwner.getDefaultTenant() == null ? null : userOwner.getDefaultTenant().getId();
@@ -455,13 +456,12 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
tenantId = tenantOwner.getId();
}
final String userOwnerName = userOwner == null ? null : userOwner.getName();
apply(s->s.internalCreateOwnership(idOfOwnedObjectAsString, userOwnerName, tenantId, displayNameOfOwnedObject));
return apply(s->s.internalCreateOwnership(idOfOwnedObjectAsString, userOwnerName, tenantId, displayNameOfOwnedObject));
}
@Override
public Void internalCreateOwnership(QualifiedObjectIdentifier idAsString, String userOwnerName, UUID tenantOwnerId, String displayName) {
accessControlStore.createOwnership(idAsString, getUserByName(userOwnerName), getUserGroup(tenantOwnerId), displayName);
return null;
public Ownership internalCreateOwnership(QualifiedObjectIdentifier idAsString, String userOwnerName, UUID tenantOwnerId, String displayName) {
return accessControlStore.createOwnership(idAsString, getUserByName(userOwnerName), getUserGroup(tenantOwnerId), displayName).getAnnotation();
}
@Override