Merge branch 'permission-vertical' into bug4709_pv

This commit is contained in:
Thomas Wiese committed 2018-10-25 11:28:29 +02:00
commit d105efdc0f
27 files changed
+324 -227

No files matched your search

@@ -6,10 +6,12 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamClass;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -38,6 +40,7 @@ import com.sap.sse.common.Color;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.DegreeBearingImpl;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.security.shared.NamedDTO;
public abstract class StoredTrackBasedTest extends TrackBasedTest {
private static final String RESOURCES = "resources/";
@@ -74,7 +77,27 @@ public abstract class StoredTrackBasedTest extends TrackBasedTest {
}
public static ObjectInputStream getObjectInputStream(String fileNameWithinResources) throws FileNotFoundException, IOException {
return new ObjectInputStream(new FileInputStream(new File(RESOURCES+fileNameWithinResources)));
return new CustomObjectInputStream(new FileInputStream(new File(RESOURCES+fileNameWithinResources)));
}
/**
* We moved NamedDTO from sailing to sse some time ago. This breaks test cases that deserialize leaderboard DTO
* data. This ensures that this data can correctly be deserialized without the need of manipulating the binary data.
*/
private static class CustomObjectInputStream extends ObjectInputStream {
public CustomObjectInputStream(InputStream in) throws IOException {
super(in);
enableResolveObject(true);
}
@Override
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
final ObjectStreamClass osc = super.readClassDescriptor();
if (osc.getName().equals("com.sap.sailing.domain.common.dto.NamedDTO")) {
return ObjectStreamClass.lookup(NamedDTO.class);
}
return osc;
}
}
private Set<String> getCompetitorNamesOfStoredTracks(String regattaName) {
@@ -8,6 +8,8 @@ import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.sap.sse.common.Util;
import com.sap.sse.security.shared.AccessControlList;
import com.sap.sse.security.shared.Ownership;
import com.sap.sse.security.shared.Role;
import com.sap.sse.security.shared.UserGroup;
import com.sap.sse.security.shared.WildcardPermission;
@@ -41,6 +43,8 @@ public class UserDTO_CustomFieldSerializer extends CustomFieldSerializer<UserDTO
final ArrayList<UserGroup> groupsAsList = new ArrayList<>();
Util.addAll(instance.getUserGroups(), groupsAsList);
streamWriter.writeObject(groupsAsList);
streamWriter.writeObject(instance.getOwnership());
streamWriter.writeObject(instance.getAccessControlList());
}
@Override
@@ -69,7 +73,11 @@ public class UserDTO_CustomFieldSerializer extends CustomFieldSerializer<UserDTO
final List<AccountDTO> accounts = (List<AccountDTO>) streamReader.readObject();
@SuppressWarnings("unchecked")
final ArrayList<UserGroup> groups = (ArrayList<UserGroup>) streamReader.readObject();
return new UserDTO(name, email, fullName, company, locale, emailValidated, accounts, roles, defaultTenant, permissions, groups);
final UserDTO userDTO = new UserDTO(name, email, fullName, company, locale, emailValidated, accounts, roles,
defaultTenant, permissions, groups);
userDTO.setOwnership((Ownership) streamReader.readObject());
userDTO.setAccessControlList((AccessControlList) streamReader.readObject());
return userDTO;
}
@Override
@@ -25,9 +25,9 @@ import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.AbstractCellTable;
import com.google.gwt.safehtml.shared.SafeUri;
import com.google.gwt.safehtml.shared.UriUtils;
import com.google.gwt.user.cellview.client.AbstractCellTable;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
@@ -43,7 +43,6 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.gwt.ui.adminconsole.EditOwnershipDialog.DialogConfig;
import com.sap.sailing.gwt.ui.adminconsole.LeaderboardGroupDialog.LeaderboardGroupDescriptor;
import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory;
import com.sap.sailing.gwt.ui.client.EventsRefresher;
@@ -74,8 +73,11 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
import com.sap.sse.security.ui.client.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog.DialogConfig;
import com.sap.sse.security.ui.client.component.SecuredObjectOwnerColumn;
import com.sap.sse.security.ui.shared.UserDTO;
/**
@@ -359,7 +361,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
final SecuredObjectOwnerColumn<EventDTO> userColumn = SecuredObjectOwnerColumn.getUserOwnerColumn();
final HasPermissions type = SecuredDomainType.EVENT;
final Function<EventDTO, String> idFactory = SecuredObjectUtils::getTypeRelativeObjectIdentifier;
final Function<EventDTO, String> idFactory = event -> event.id.toString();
final AccessControlledActionsColumn<EventDTO, EventConfigImagesBarCell> actionsColumn = new AccessControlledActionsColumn<>(
new EventConfigImagesBarCell(stringMessages), userService, type, idFactory);
actionsColumn.addAction(UPDATE.name(), UPDATE, this::openEditEventDialog);
@@ -369,8 +371,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
}
});
final DialogConfig<EventDTO> config = EditOwnershipDialog.create(userService.getUserManagementService(), type,
idFactory, event -> updateEvent(event, event),
event -> errorReporter.reportError(stringMessages.errorUpdatingOwnership(event.getName())));
idFactory, event -> updateEvent(event, event), stringMessages);
actionsColumn.addAction(CHANGE_OWNERSHIP.name(), CHANGE_OWNERSHIP, config::openDialog);
eventNameColumn.setSortable(true);
@@ -395,8 +396,8 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
table.addColumn(leaderboardGroupsColumn, stringMessages.leaderboardGroups());
table.addColumn(imagesColumn, stringMessages.images());
table.addColumn(videosColumn, stringMessages.videos());
table.addColumn(groupColumn, SecuredObjectUtils.SECURITY_MESSAGES.group());
table.addColumn(userColumn, SecuredObjectUtils.SECURITY_MESSAGES.user());
table.addColumn(groupColumn, stringMessages.group());
table.addColumn(userColumn, stringMessages.user());
table.addColumn(actionsColumn, stringMessages.actions());
table.setSelectionModel(eventSelectionCheckboxColumn.getSelectionModel(), eventSelectionCheckboxColumn.getSelectionManager());
@@ -59,7 +59,6 @@ import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardSettingsDialogComponent;
import com.sap.sailing.gwt.settings.client.leaderboard.MetaLeaderboardPerspectiveLifecycle;
import com.sap.sailing.gwt.ui.adminconsole.DisablableCheckboxCell.IsEnabled;
import com.sap.sailing.gwt.ui.adminconsole.EditOwnershipDialog.DialogConfig;
import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory;
import com.sap.sailing.gwt.ui.client.LeaderboardsDisplayer;
import com.sap.sailing.gwt.ui.client.LeaderboardsRefresher;
@@ -89,8 +88,11 @@ import com.sap.sse.gwt.client.shared.components.LinkWithSettingsGenerator;
import com.sap.sse.gwt.client.shared.components.SettingsDialogForLinkSharing;
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.ui.client.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog.DialogConfig;
import com.sap.sse.security.ui.client.component.SecuredObjectOwnerColumn;
public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel implements SelectedLeaderboardProvider, RegattasDisplayer,
TrackedRaceChangedListener, LeaderboardsDisplayer {
@@ -322,7 +324,7 @@ TrackedRaceChangedListener, LeaderboardsDisplayer {
});
final HasPermissions type = SecuredDomainType.LEADERBOARD;
final Function<StrippedLeaderboardDTO, String> idFactory = SecuredObjectUtils::getTypeRelativeObjectIdentifier;
final Function<StrippedLeaderboardDTO, String> idFactory = StrippedLeaderboardDTO::getName;
final AccessControlledActionsColumn<StrippedLeaderboardDTO, LeaderboardConfigImagesBarCell> leaderboardActionColumn = new AccessControlledActionsColumn<>(
new LeaderboardConfigImagesBarCell(stringMessages), userService, type, idFactory);
@@ -376,8 +378,7 @@ TrackedRaceChangedListener, LeaderboardsDisplayer {
leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_PRINT_PAIRINGLIST, this::openPairingListEntryPoint);
final DialogConfig<StrippedLeaderboardDTO> config = EditOwnershipDialog.create(userService.getUserManagementService(), type,
idFactory, leaderboardDTO -> reloadLeaderboardForTable(leaderboardDTO.getName()),
leaderboardDTO -> errorReporter.reportError(stringMessages.errorUpdatingOwnership(leaderboardDTO.getName())));
idFactory, leaderboardDTO -> reloadLeaderboardForTable(leaderboardDTO.getName()), stringMessages);
leaderboardActionColumn.addAction(CHANGE_OWNERSHIP.name(), CHANGE_OWNERSHIP, config::openDialog);
leaderboardTable.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader());
@@ -388,6 +389,8 @@ TrackedRaceChangedListener, LeaderboardsDisplayer {
leaderboardTable.addColumn(leaderboardTypeColumn, stringMessages.type());
leaderboardTable.addColumn(scoringSystemColumn, stringMessages.scoringSystem());
leaderboardTable.addColumn(courseAreaColumn, stringMessages.courseArea());
SecuredObjectOwnerColumn.configureOwnerColumns(leaderboardTable, leaderboardColumnListHandler,
com.sap.sse.security.ui.client.i18n.StringMessages.INSTANCE);
leaderboardTable.addColumn(leaderboardActionColumn, stringMessages.actions());
leaderboardTable.addColumnSortHandler(leaderboardColumnListHandler);
leaderboardTable.setSelectionModel(selectionCheckboxColumn.getSelectionModel(), selectionCheckboxColumn.getSelectionManager());
@@ -20,9 +20,9 @@ import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.user.cellview.client.AbstractCellTable;
import com.google.gwt.safehtml.shared.SafeUri;
import com.google.gwt.safehtml.shared.UriUtils;
import com.google.gwt.user.cellview.client.AbstractCellTable;
import com.google.gwt.user.cellview.client.CellTable.Resources;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
@@ -41,7 +41,6 @@ import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.gwt.settings.client.raceboard.RaceBoardPerspectiveOwnSettings;
import com.sap.sailing.gwt.ui.adminconsole.EditOwnershipDialog.DialogConfig;
import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorCell;
import com.sap.sailing.gwt.ui.adminconsole.LeaderboardGroupDialog.LeaderboardGroupDescriptor;
import com.sap.sailing.gwt.ui.client.AbstractRegattaPanel;
@@ -71,8 +70,11 @@ import com.sap.sse.gwt.client.celltable.SelectionCheckboxColumn;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.ui.client.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog.DialogConfig;
import com.sap.sse.security.ui.client.component.SecuredObjectOwnerColumn;
public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements LeaderboardGroupsDisplayer, LeaderboardsDisplayer {
@@ -605,16 +607,8 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
}
});
final SecuredObjectOwnerColumn<LeaderboardGroupDTO> groupColumn = SecuredObjectOwnerColumn
.getGroupOwnerColumn();
groupColumn.setSortable(true);
leaderboardGroupsListHandler.setComparator(groupColumn, groupColumn.getComparator());
final SecuredObjectOwnerColumn<LeaderboardGroupDTO> userColumn = SecuredObjectOwnerColumn.getUserOwnerColumn();
userColumn.setSortable(true);
leaderboardGroupsListHandler.setComparator(userColumn, userColumn.getComparator());
final HasPermissions type = SecuredDomainType.LEADERBOARD_GROUP;
final Function<LeaderboardGroupDTO, String> idFactory = SecuredObjectUtils::getTypeRelativeObjectIdentifier;
final Function<LeaderboardGroupDTO, String> idFactory = leaderboardGroup -> leaderboardGroup.getId().toString();
final AccessControlledActionsColumn<LeaderboardGroupDTO, LeaderboardGroupConfigImagesBarCell> actionsColumn = new AccessControlledActionsColumn<>(
new LeaderboardGroupConfigImagesBarCell(stringMessages), userService, type, idFactory);
actionsColumn.addAction(UPDATE.name(), UPDATE, this::openEditLeaderboardGroupDialog);
@@ -630,10 +624,9 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
group.isHasOverallLeaderboard(), group.getOverallLeaderboardDiscardThresholds(),
group.getOverallLeaderboardScoringSchemeType());
updateGroup(group.getName(), group, descriptor);
}, group -> errorReporter.reportError(stringMessages.errorUpdatingOwnership(group.getName())));
}, stringMessages);
actionsColumn.addAction(CHANGE_OWNERSHIP.name(), CHANGE_OWNERSHIP, config::openDialog);
SelectionCheckboxColumn<LeaderboardGroupDTO> leaderboardTableSelectionColumn =
new SelectionCheckboxColumn<LeaderboardGroupDTO>(
tableResources.cellTableStyle().cellTableCheckboxSelected(),
@@ -656,8 +649,8 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
groupsTable.addColumn(groupDescriptionColumn, stringMessages.description());
groupsTable.addColumn(groupDisplayNameColumn, stringMessages.displayName());
groupsTable.addColumn(hasOverallLeaderboardColumn, stringMessages.useOverallLeaderboard());
groupsTable.addColumn(groupColumn, SecuredObjectUtils.SECURITY_MESSAGES.group());
groupsTable.addColumn(userColumn, SecuredObjectUtils.SECURITY_MESSAGES.user());
SecuredObjectOwnerColumn.configureOwnerColumns(groupsTable, leaderboardGroupsListHandler,
com.sap.sse.security.ui.client.i18n.StringMessages.INSTANCE);
groupsTable.addColumn(actionsColumn, stringMessages.actions());
groupsTable.addColumnSortHandler(leaderboardGroupsListHandler);
@@ -32,7 +32,6 @@ import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.gwt.ui.adminconsole.EditOwnershipDialog.DialogConfig;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.RegattasDisplayer;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -54,8 +53,11 @@ import com.sap.sse.gwt.client.celltable.SelectionCheckboxColumn;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.ui.client.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog.DialogConfig;
import com.sap.sse.security.ui.client.component.SecuredObjectOwnerColumn;
/**
* A composite showing the list of all regattas
@@ -249,15 +251,8 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
}
});
final SecuredObjectOwnerColumn<RegattaDTO> groupColumn = SecuredObjectOwnerColumn.getGroupOwnerColumn();
groupColumn.setSortable(true);
columnSortHandler.setComparator(groupColumn, groupColumn.getComparator());
final SecuredObjectOwnerColumn<RegattaDTO> userColumn = SecuredObjectOwnerColumn.getUserOwnerColumn();
userColumn.setSortable(true);
columnSortHandler.setComparator(userColumn, userColumn.getComparator());
final HasPermissions type = SecuredDomainType.REGATTA;
final Function<RegattaDTO, String> idFactory = SecuredObjectUtils::getTypeRelativeObjectIdentifier;
final Function<RegattaDTO, String> idFactory = RegattaDTO::getName;
final AccessControlledActionsColumn<RegattaDTO, RegattaConfigImagesBarCell> actionsColumn = new AccessControlledActionsColumn<>(
new RegattaConfigImagesBarCell(stringMessages), userService, type, idFactory);
actionsColumn.addAction(UPDATE.name(), UPDATE, this::editRegatta);
@@ -267,8 +262,7 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
}
});
final DialogConfig<RegattaDTO> config = EditOwnershipDialog.create(userService.getUserManagementService(), type,
idFactory, this::commitEditedRegatta,
regatta -> errorReporter.reportError(stringMessages.errorUpdatingOwnership(regatta.getName())));
idFactory, this::commitEditedRegatta, stringMessages);
actionsColumn.addAction(CHANGE_OWNERSHIP.name(), CHANGE_OWNERSHIP, config::openDialog);
table.addColumn(regattaSelectionCheckboxColumn, regattaSelectionCheckboxColumn.getHeader());
@@ -278,8 +272,8 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
table.addColumn(startEndDateColumn, stringMessages.from() + "/" + stringMessages.to());
table.addColumn(regattaBoatClassColumn, stringMessages.boatClass());
table.addColumn(rankingMetricColumn, stringMessages.rankingMetric());
table.addColumn(groupColumn, SecuredObjectUtils.SECURITY_MESSAGES.group());
table.addColumn(userColumn, SecuredObjectUtils.SECURITY_MESSAGES.user());
SecuredObjectOwnerColumn.configureOwnerColumns(table, columnSortHandler,
com.sap.sse.security.ui.client.i18n.StringMessages.INSTANCE);
table.addColumn(actionsColumn, stringMessages.actions());
table.setSelectionModel(regattaSelectionCheckboxColumn.getSelectionModel(), regattaSelectionCheckboxColumn.getSelectionManager());
return table;
@@ -1,69 +0,0 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Comparator;
import java.util.Optional;
import java.util.function.Function;
import com.google.gwt.user.cellview.client.TextColumn;
import com.sap.sse.common.Named;
import com.sap.sse.security.shared.NamedSecuredObjectDTO;
import com.sap.sse.security.shared.Ownership;
/**
* {@link TextColumn Text column} extension which can be used to show {@link Ownership ownership} information of
* {@link NamedSecuredObjectDTO secured object} table entries, if any. This column also {@link #getComparator()
* provides} a suitable {@link Comparator comparator} which can be used for sorting purposes, if required.
*
* @param table
* {@link AbstractCellTable table} to add the column to
* @param columnSortHandler
* {@link ListHandler handler} to register the column's sort {@link Comparator comparator}
*/
/**
* @author bbarth
*
* @param <T>
*/
public class SecuredObjectOwnerColumn<T extends NamedSecuredObjectDTO> extends TextColumn<T> {
private final Function<T, Named> ownerResolver;
/**
* Creates a new {@link SecuredObjectOwnerColumn} instance used the provided {@link Function resolver} to determine
* the {@link Named owner reference} who's name will be shown in this column.
*
* @param ownerResolver
* {@link Function} to resolve the owner reference
*/
public SecuredObjectOwnerColumn(final Function<Ownership, Named> ownerResolver) {
final Function<T, Ownership> ownershipResolver = NamedSecuredObjectDTO::getOwnership;
this.ownerResolver = ownershipResolver.andThen(ownerResolver);
}
@Override
public final String getValue(final T object) {
return Optional.ofNullable(ownerResolver.apply(object)).map(Named::getName).orElse("");
}
/**
* @return a suitable {@link Comparator comparator} for this column
*/
public Comparator<T> getComparator() {
return Comparator.comparing(this::getValue);
}
/**
* @return {@link SecuredObjectOwnerColumn} instance showing the {@link Ownership#getTenantOwner() tenant owner}
*/
public static <T extends NamedSecuredObjectDTO> SecuredObjectOwnerColumn<T> getGroupOwnerColumn() {
return new SecuredObjectOwnerColumn<>(Ownership::getTenantOwner);
}
/**
* @return {@link SecuredObjectOwnerColumn} instance showing the {@link Ownership#getUserOwner() user owner}
*/
public static <T extends NamedSecuredObjectDTO> SecuredObjectOwnerColumn<T> getUserOwnerColumn() {
return new SecuredObjectOwnerColumn<>(Ownership::getUserOwner);
}
}
@@ -1,80 +0,0 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Comparator;
import java.util.Optional;
import java.util.function.Function;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.user.cellview.client.AbstractCellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.TextColumn;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.common.Named;
import com.sap.sse.security.shared.NamedSecuredObjectDTO;
import com.sap.sse.security.shared.Ownership;
import com.sap.sse.security.ui.client.i18n.StringMessages;
public class SecuredObjectUtils {
public static final StringMessages SECURITY_MESSAGES = GWT.create(StringMessages.class);
public static String getTypeRelativeObjectIdentifier(final EventDTO securedObject) {
return securedObject.id.toString();
}
public static String getTypeRelativeObjectIdentifier(final RegattaDTO securedObject) {
return securedObject.getName();
}
public static String getTypeRelativeObjectIdentifier(final LeaderboardGroupDTO securedObject) {
return securedObject.getId().toString();
}
public static String getTypeRelativeObjectIdentifier(final StrippedLeaderboardDTO securedObject) {
return securedObject.getName();
}
/**
* Adds sort-able {@link Column column}s to the provided {@link AbstractCellTable cell table} showing group owner
* and user owner information of secured object table entries, if any. The {@link Comparator comparator}s used for
* sorting will be set on the provided {@link ListHandler list handler}.
*
* @param table
* {@link AbstractCellTable table} to add the column to
* @param columnSortHandler
* {@link ListHandler handler} to register the column's sort {@link Comparator comparator}
*/
public static <T extends NamedSecuredObjectDTO> void configureOwnerColumns(final AbstractCellTable<T> table,
final ListHandler<T> columnSortHandler) {
final OwnerColumn<T> groupColumn = new OwnerColumn<>(Ownership::getTenantOwner);
table.addColumn(groupColumn, SECURITY_MESSAGES.group());
columnSortHandler.setComparator(groupColumn, groupColumn.getComparator());
final OwnerColumn<T> userColumn = new OwnerColumn<>(Ownership::getUserOwner);
table.addColumn(userColumn, SECURITY_MESSAGES.user());
columnSortHandler.setComparator(userColumn, userColumn.getComparator());
}
private static class OwnerColumn<T extends NamedSecuredObjectDTO> extends TextColumn<T> {
private final Function<T, String> ownerNameResolver;
private OwnerColumn(Function<Ownership, Named> ownerResolver) {
final Function<T, Ownership> ownershipResolver = NamedSecuredObjectDTO::getOwnership;
this.ownerNameResolver = ownershipResolver.andThen(ownerResolver).andThen(Named::getName);
}
@Override
public final String getValue(T object) {
return Optional.ofNullable(ownerNameResolver.apply(object)).orElse("");
}
private Comparator<T> getComparator() {
return Comparator.comparing(this::getValue);
}
}
}
@@ -11,6 +11,7 @@ import com.sap.sse.gwt.client.DefaultRule_1_0n;
@DefaultLocale("en")
public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
com.sap.sse.security.ui.client.i18n.StringMessages,
com.sap.sse.gwt.adminconsole.StringMessages, CommonStringMessages {
public static final StringMessages INSTANCE = GWT.create(StringMessages.class);
Binary file not shown.

After

Width:  |  Height:  |  Size: 788 B

@@ -8,6 +8,9 @@ public interface IconResources extends ClientBundle {
public static final IconResources INSTANCE = GWT.create(IconResources.class);
@Source("images/change-ownership.png")
ImageResource changeOwnershipIcon();
@Source("images/remove.png")
ImageResource removeIcon();
@@ -40,18 +40,26 @@ public abstract class ImagesBarCell extends AbstractSafeHtmlCell<String> {
private final AbstractImagePrototype imagePrototype;
private final String actionName;
private final String tooltip;
public ImageSpec(String actionName, String tooltip, ImageResource imageResource) {
this(actionName, tooltip, AbstractImagePrototype.create(imageResource));
}
public ImageSpec(String actionName, String tooltip, AbstractImagePrototype imagePrototype) {
super();
this.imagePrototype = imagePrototype;
this.actionName = actionName;
this.tooltip = tooltip;
}
public AbstractImagePrototype getImagePrototype() {
return imagePrototype;
}
public String getActionName() {
return actionName;
}
public String getTooltip() {
return tooltip;
}
@@ -27,10 +27,12 @@ public class NamedSecuredObjectDTO extends NamedDTO implements SecuredObject {
return ownership;
}
@Override
public final void setAccessControlList(final AccessControlList accessControlList) {
this.accessControlList = accessControlList;
}
@Override
public final void setOwnership(final Ownership ownership) {
this.ownership = ownership;
}
@@ -8,9 +8,10 @@ package com.sap.sse.security.shared;
*/
public interface SecuredObject {
AccessControlList getAccessControlList();
Ownership getOwnership();
void setAccessControlList(AccessControlList createAccessControlListDTO);
void setOwnership(Ownership createOwnershipDTO);
}
@@ -8,6 +8,8 @@ import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.sap.sse.common.Util;
import com.sap.sse.security.shared.AccessControlList;
import com.sap.sse.security.shared.Ownership;
import com.sap.sse.security.shared.Role;
import com.sap.sse.security.shared.UserGroup;
import com.sap.sse.security.shared.WildcardPermission;
@@ -41,6 +43,8 @@ public class UserDTO_CustomFieldSerializer extends CustomFieldSerializer<UserDTO
final ArrayList<UserGroup> groupsAsList = new ArrayList<>();
Util.addAll(instance.getUserGroups(), groupsAsList);
streamWriter.writeObject(groupsAsList);
streamWriter.writeObject(instance.getOwnership());
streamWriter.writeObject(instance.getAccessControlList());
}
@Override
@@ -69,7 +73,11 @@ public class UserDTO_CustomFieldSerializer extends CustomFieldSerializer<UserDTO
final List<AccountDTO> accounts = (List<AccountDTO>) streamReader.readObject();
@SuppressWarnings("unchecked")
final ArrayList<UserGroup> groups = (ArrayList<UserGroup>) streamReader.readObject();
return new UserDTO(name, email, fullName, company, locale, emailValidated, accounts, roles, defaultTenant, permissions, groups);
final UserDTO userDTO = new UserDTO(name, email, fullName, company, locale, emailValidated, accounts, roles,
defaultTenant, permissions, groups);
userDTO.setOwnership((Ownership) streamReader.readObject());
userDTO.setAccessControlList((AccessControlList) streamReader.readObject());
return userDTO;
}
@Override
@@ -432,4 +432,11 @@ public class UserService {
return PermissionChecker.hasUserAnyPermission(permissionToCheck, allKnownHasPermissions, getCurrentUser(),
anonymousUser, ownership);
}
public boolean hasCurrentUserPermissionToCreateObjectOfType(HasPermissions type) {
// TODO: Additional check required
// return hasPermission(SecuredSecurityTypes.SERVER.getPermissionForObjects(ServerActions.CREATE_OBJECT, oid));
return this.hasCurrentUserAnyPermission(type.getPermission(DefaultActions.CREATE),
new OwnershipImpl(currentUser, getCurrentTenant()));
}
}
@@ -1,4 +1,4 @@
package com.sap.sse.security.ui.client;
package com.sap.sse.security.ui.client.component;
import java.util.ArrayList;
import java.util.HashMap;
@@ -12,6 +12,7 @@ import com.sap.sse.gwt.client.celltable.ImagesBarColumn;
import com.sap.sse.security.shared.AccessControlList;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.shared.HasPermissions.Action;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.shared.Ownership;
import com.sap.sse.security.shared.SecuredObject;
import com.sap.sse.security.shared.WildcardPermission;
@@ -0,0 +1,49 @@
package com.sap.sse.security.ui.client.component;
import java.util.Arrays;
import com.sap.sse.gwt.client.IconResources;
import com.sap.sse.gwt.client.celltable.ImagesBarCell;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
import com.sap.sse.security.ui.client.i18n.StringMessages;
public class DefaultActionsImagesBarCell extends ImagesBarCell {
public static final String ACTION_DELETE = DefaultActions.DELETE.name();
public static final String ACTION_UPDATE = DefaultActions.UPDATE.name();
public static final String ACTION_CHANGE_OWNERSHIP = DefaultActions.CHANGE_OWNERSHIP.name();
private final StringMessages stringMessages;
public DefaultActionsImagesBarCell(final StringMessages stringMessages) {
this.stringMessages = stringMessages;
}
@Override
protected Iterable<ImageSpec> getImageSpecs() {
return Arrays.asList(getUpdateImageSpec(), getDeleteImageSpec(), getChangeOwnershipImageSpec());
}
/**
* @return {@link ImageSpec} for {@link DefaultActions#UPDATE update} action
*/
protected ImageSpec getUpdateImageSpec() {
return new ImageSpec(ACTION_DELETE, stringMessages.actionEdit(), IconResources.INSTANCE.editIcon());
}
/**
* @return {@link ImageSpec} for {@link DefaultActions#DELETE delete} action
*/
protected ImageSpec getDeleteImageSpec() {
return new ImageSpec(ACTION_DELETE, stringMessages.actionRemove(), IconResources.INSTANCE.removeIcon());
}
/**
* @return {@link ImageSpec} for {@link DefaultActions#CHANGE_OWNERSHIP change ownership} action
*/
protected ImageSpec getChangeOwnershipImageSpec() {
return new ImageSpec(ACTION_CHANGE_OWNERSHIP, stringMessages.actionChangeOwnership(),
IconResources.INSTANCE.changeOwnershipIcon());
}
}
@@ -1,4 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole;
package com.sap.sse.security.ui.client.component;
import static com.sap.sse.gwt.client.Notification.NotificationType.ERROR;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -9,18 +11,19 @@ import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.gwt.ui.adminconsole.EditOwnershipDialog.OwnershipDialogResult;
import com.sap.sse.common.Named;
import com.sap.sse.gwt.client.Notification;
import com.sap.sse.gwt.client.Notification.NotificationType;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.shared.NamedSecuredObjectDTO;
import com.sap.sse.security.shared.Ownership;
import com.sap.sse.security.shared.QualifiedObjectIdentifier;
import com.sap.sse.security.shared.SecuredObject;
import com.sap.sse.security.shared.SecurityUser;
import com.sap.sse.security.shared.UserGroup;
import com.sap.sse.security.shared.impl.OwnershipImpl;
import com.sap.sse.security.ui.client.UserManagementServiceAsync;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog.OwnershipDialogResult;
import com.sap.sse.security.ui.client.i18n.StringMessages;
import com.sap.sse.security.ui.shared.UserDTO;
@@ -164,7 +167,7 @@ public class EditOwnershipDialog extends DataEntryDialog<OwnershipDialogResult>
/**
* Creates a new {@link DialogConfig dialog configuration} instance which be (re-)used to
* {@link DialogConfig#openDialog(NamedSecuredObjectDTO) open} a {@link EditOwnershipDialog dialog}.
* {@link DialogConfig#openDialog(Named) open} a {@link EditOwnershipDialog dialog}.
*
* @param userManagementService
* {@link UserManagementServiceAsync} to use to the secured object's ownership
@@ -177,37 +180,38 @@ public class EditOwnershipDialog extends DataEntryDialog<OwnershipDialogResult>
* @param errorCallback
* {@link Consumer callback} to execute when the dialog is confirmed and ownership update fails
*/
public static <T extends NamedSecuredObjectDTO> DialogConfig<T> create(
public static <T extends Named & SecuredObject> DialogConfig<T> create(
final UserManagementServiceAsync userManagementService, final HasPermissions type,
final Function<T, String> typeRelativeIdFactory, final Consumer<T> updateCallback,
final Consumer<T> errorCallback) {
return new DialogConfig<>(userManagementService, type, typeRelativeIdFactory, updateCallback, errorCallback);
final StringMessages stringMessages) {
return new DialogConfig<>(userManagementService, type, typeRelativeIdFactory, updateCallback, stringMessages);
}
public static class DialogConfig<T extends NamedSecuredObjectDTO> {
public static class DialogConfig<T extends Named & SecuredObject> {
private final UserManagementServiceAsync userManagementService;
private final Consumer<T> updateCallback, errorCallback;
private final Consumer<T> updateCallback;
private final Function<T, QualifiedObjectIdentifier> identifierFactory;
private final StringMessages stringMessages;
private DialogConfig(final UserManagementServiceAsync userManagementService, final HasPermissions type,
final Function<T, String> idFactory, final Consumer<T> updateCallback,
final Consumer<T> errorCallback) {
final StringMessages stringMessages) {
this.userManagementService = userManagementService;
this.identifierFactory = idFactory.andThen(type::getQualifiedObjectIdentifier);
this.updateCallback = updateCallback;
this.errorCallback = errorCallback;
this.stringMessages = stringMessages;
}
/**
* Opens a {@link EditOwnershipDialog dialog} to edit ownerships for the provided secured object instance.
*
* @param securedObject
* {@link NamedSecuredObjectDTO secured object} instance to edit ownerships for
* {@link Named} {@link SecuredObject} instance to edit ownerships for
*/
public void openDialog(final T securedObject) {
new EditOwnershipDialog(userManagementService, securedObject.getOwnership(),
SecuredObjectUtils.SECURITY_MESSAGES, new EditOwnershipDialogCallback(securedObject)).show();
StringMessages.INSTANCE, new EditOwnershipDialogCallback(securedObject)).show();
}
private class EditOwnershipDialogCallback implements DialogCallback<OwnershipDialogResult> {
@@ -245,7 +249,7 @@ public class EditOwnershipDialog extends DataEntryDialog<OwnershipDialogResult>
@Override
public final void onFailure(Throwable caught) {
errorCallback.accept(securedObject);
Notification.notify(stringMessages.errorUpdatingOwnership(securedObject.getName()), ERROR);
}
}
}
@@ -0,0 +1,93 @@
package com.sap.sse.security.ui.client.component;
import java.util.Comparator;
import java.util.Optional;
import java.util.function.Function;
import com.google.gwt.user.cellview.client.AbstractCellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.TextColumn;
import com.sap.sse.common.Named;
import com.sap.sse.security.shared.Ownership;
import com.sap.sse.security.shared.SecuredObject;
import com.sap.sse.security.ui.client.i18n.StringMessages;
/**
* {@link TextColumn Text column} extension which can be used to show {@link Ownership ownership} information of
* {@link SecuredObject secured object} table entries, if any. This column also {@link #getComparator() provides} a
* suitable {@link Comparator comparator} which can be used for sorting purposes, if required.
*
* @param table
* {@link AbstractCellTable table} to add the column to
* @param columnSortHandler
* {@link ListHandler handler} to register the column's sort {@link Comparator comparator}
*
* @param <T>
* the actual {@link SecuredObject} sub-type
*/
public class SecuredObjectOwnerColumn<T extends SecuredObject> extends TextColumn<T> {
private final Function<T, Named> ownerResolver;
/**
* Creates a new {@link SecuredObjectOwnerColumn} instance used the provided {@link Function resolver} to determine
* the {@link Named owner reference} who's name will be shown in this column.
*
* @param ownerResolver
* {@link Function} to resolve the owner reference
*/
public SecuredObjectOwnerColumn(final Function<Ownership, Named> ownerResolver) {
final Function<T, Ownership> ownershipResolver = SecuredObject::getOwnership;
this.ownerResolver = ownershipResolver.andThen(ownerResolver);
}
@Override
public final String getValue(final T object) {
return Optional.ofNullable(ownerResolver.apply(object)).map(Named::getName).orElse("");
}
/**
* @return a suitable {@link Comparator comparator} for this column
*/
public Comparator<T> getComparator() {
return Comparator.comparing(this::getValue);
}
/**
* @return {@link SecuredObjectOwnerColumn} instance showing the {@link Ownership#getTenantOwner() tenant owner}
*/
public static <T extends SecuredObject> SecuredObjectOwnerColumn<T> getGroupOwnerColumn() {
return new SecuredObjectOwnerColumn<>(Ownership::getTenantOwner);
}
/**
* @return {@link SecuredObjectOwnerColumn} instance showing the {@link Ownership#getUserOwner() user owner}
*/
public static <T extends SecuredObject> SecuredObjectOwnerColumn<T> getUserOwnerColumn() {
return new SecuredObjectOwnerColumn<>(Ownership::getUserOwner);
}
/**
* Adds sort-able {@link Column column}s to the provided {@link AbstractCellTable cell table} showing group owner
* and user owner information of secured object table entries, if any. The {@link Comparator comparator}s used for
* sorting will be set on the provided {@link ListHandler list handler}.
*
* @param table
* {@link AbstractCellTable table} to add the column to
* @param columnSortHandler
* {@link ListHandler handler} to register the column's sort {@link Comparator comparator}
* @param stringMessages
* {@link StringMessages} to use for the column header texts
*/
public static <T extends SecuredObject> void configureOwnerColumns(final AbstractCellTable<T> table,
final ListHandler<T> columnSortHandler, final StringMessages stringMessages) {
final SecuredObjectOwnerColumn<T> groupColumn = getGroupOwnerColumn();
table.addColumn(groupColumn, stringMessages.group());
columnSortHandler.setComparator(groupColumn, groupColumn.getComparator());
final SecuredObjectOwnerColumn<T> userColumn = getUserOwnerColumn();
table.addColumn(userColumn, stringMessages.user());
columnSortHandler.setComparator(userColumn, userColumn.getComparator());
}
}
@@ -120,6 +120,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages {
String actions();
String actionEdit();
String actionRemove();
String actionChangeOwnership();
String errorUpdatingOwnership(String name);
String doYouReallyWantToRemoveRole(String name);
String errorTryingToDeleteRole(String rolename, String message);
String pleaseEnterARoleName();
@@ -125,6 +125,8 @@ filterRoles=Filter roles
actions=Actions
actionEdit=Edit
actionRemove=Remove
actionChangeOwnership=Change ownership
errorUpdatingOwnership=Error updating ownership of object {0}
doYouReallyWantToRemoveRole=Do you really want to remove role(s) "{0}"?
errorTryingToDeleteRole=Error trying to delete role "{0}": {1}
pleaseEnterARoleName=Please enter a role name
@@ -125,6 +125,8 @@ filterRoles=Rollen filtern
actions=Aktionen
actionEdit=Bearbeiten
actionRemove=Löschen
actionChangeOwnership=Besitzer wechseln
errorUpdatingOwnership=Fehler beim Setzen des Eigners für Objekt {0}
doYouReallyWantToRemoveRole=Rolle(n) "{0}" wirklich löschen?
errorTryingToDeleteRole=Fehler beim Löschen der Rolle "{0}": {1}
pleaseEnterARoleName=Bitte einen Rollennamen eingeben
@@ -1,11 +1,19 @@
package com.sap.sse.security.ui.client.usermanagement;
import static com.sap.sse.security.shared.HasPermissions.DefaultActions.CHANGE_OWNERSHIP;
import static com.sap.sse.security.shared.HasPermissions.DefaultActions.DELETE;
import static com.sap.sse.security.shared.HasPermissions.DefaultActions.UPDATE;
import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP;
import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCell.ACTION_DELETE;
import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCell.ACTION_UPDATE;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.function.Function;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.core.client.Callback;
@@ -32,15 +40,17 @@ import com.sap.sse.gwt.client.celltable.TableWrapper;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
import com.sap.sse.security.shared.Role;
import com.sap.sse.security.shared.UserGroup;
import com.sap.sse.security.shared.WildcardPermission;
import com.sap.sse.security.shared.impl.SecuredSecurityTypes;
import com.sap.sse.security.ui.client.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.UserManagementServiceAsync;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.component.EditAndRemoveImagesBarCell;
import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn;
import com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCell;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog;
import com.sap.sse.security.ui.client.component.EditOwnershipDialog.DialogConfig;
import com.sap.sse.security.ui.client.component.SecuredObjectOwnerColumn;
import com.sap.sse.security.ui.client.i18n.StringMessages;
import com.sap.sse.security.ui.shared.SuccessInfo;
import com.sap.sse.security.ui.shared.UserDTO;
@@ -146,11 +156,13 @@ extends TableWrapper<UserDTO, S, StringMessages, TR> {
return new NaturalComparator().compare(r1.getRoles().toString(), r2.getRoles().toString());
}
});
final AccessControlledActionsColumn<UserDTO, EditAndRemoveImagesBarCell> userActionColumn = new AccessControlledActionsColumn<>(
new EditAndRemoveImagesBarCell(stringMessages), userService, SecuredSecurityTypes.USER, UserDTO::getName);
userActionColumn.addAction(EditAndRemoveImagesBarCell.ACTION_EDIT, DefaultActions.UPDATE,
user -> editUser(user, additionalPermissions));
userActionColumn.addAction(EditAndRemoveImagesBarCell.ACTION_REMOVE, DefaultActions.DELETE, user -> {
final HasPermissions type = SecuredSecurityTypes.USER;
final Function<UserDTO, String> idFactory = UserDTO::getName;
final AccessControlledActionsColumn<UserDTO, DefaultActionsImagesBarCell> userActionColumn = new AccessControlledActionsColumn<>(
new DefaultActionsImagesBarCell(stringMessages), userService, type, idFactory);
userActionColumn.addAction(ACTION_UPDATE, UPDATE, user -> editUser(user, additionalPermissions));
userActionColumn.addAction(ACTION_DELETE, DELETE, user -> {
if (Window.confirm(stringMessages.doYouReallyWantToRemoveUser(user.getName()))) {
getUserManagementService().deleteUser(user.getName(), new AsyncCallback<SuccessInfo>() {
@Override
@@ -173,6 +185,9 @@ extends TableWrapper<UserDTO, S, StringMessages, TR> {
});
}
});
final DialogConfig<UserDTO> config = EditOwnershipDialog.create(userService.getUserManagementService(), type,
idFactory, user -> Window.alert("TODO Updating user ownership ..."), stringMessages);
userActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openDialog);
filterField = new LabeledAbstractFilterablePanel<UserDTO>(new Label(stringMessages.filterUsers()),
new ArrayList<UserDTO>(), dataProvider) {
@@ -204,6 +219,7 @@ extends TableWrapper<UserDTO, S, StringMessages, TR> {
table.addColumn(groupsColumn, stringMessages.groups());
table.addColumn(rolesColumn, stringMessages.roles());
table.addColumn(permissionsColumn, stringMessages.permissions());
SecuredObjectOwnerColumn.configureOwnerColumns(table, userColumnListHandler, stringMessages);
table.addColumn(userActionColumn, stringMessages.actions());
table.ensureDebugId("UsersTable");
}
@@ -77,7 +77,7 @@ public class SecurityDTOFactory {
fromOriginalToStrippedDownUser, fromOriginalToStrippedDownUserGroup));
fromOriginalToStrippedDownUser.put(user, userDTO);
userDTO.setDefaultTenant(createUserGroupDTOFromUserGroup(user.getDefaultTenant(), fromOriginalToStrippedDownUser, fromOriginalToStrippedDownUserGroup));
SecurityDTOUtil.addSecurityInformation(securityService, userDTO, user.getIdentifier());
SecurityDTOUtil.addSecurityInformation(this, securityService, userDTO, user.getIdentifier());
return userDTO;
}
@@ -14,7 +14,8 @@ import com.sap.sse.security.shared.SecuredObject;
import com.sap.sse.security.shared.SecurityUser;
import com.sap.sse.security.shared.UserGroup;
public class SecurityDTOUtil {
public abstract class SecurityDTOUtil {
private SecurityDTOUtil() {
}
@@ -23,22 +24,44 @@ public class SecurityDTOUtil {
* {@link QualifiedObjectIdentifier qualified object identifier} to the provided {@link NamedSecuredObjectDTO
* secured object DTO}.
*
* @param dto
* @param securityService
* the {@link SecurityService} to determine access control list and ownership
* @param securedObject
* the {@link NamedSecuredObjectDTO} to add security information to
* @param objectId
* the {@link QualifiedObjectIdentifier} to get security information for
*/
public static void addSecurityInformation(SecurityService securityService, final SecuredObject dto,
public static void addSecurityInformation(final SecurityService securityService, final SecuredObject securedObject,
final QualifiedObjectIdentifier objectId) {
addSecurityInformation(new SecurityDTOFactory(), securityService, securedObject, objectId);
}
/**
* Adds {@link AccessControlList access control list} and {@link Ownership ownership} information for the given
* {@link QualifiedObjectIdentifier qualified object identifier} to the provided {@link NamedSecuredObjectDTO
* secured object DTO}.
*
* @param securityService
* the {@link SecurityService} to determine access control list and ownership
* @param securityDTOFactory
* the {@link SecurityDTOFactory} to use for DTO creation
* @param securedObject
* the {@link NamedSecuredObjectDTO} to add security information to
* @param objectId
* the {@link QualifiedObjectIdentifier} to get security information for
*/
public static void addSecurityInformation(final SecurityDTOFactory securityDTOFactory,
final SecurityService securityService, final SecuredObject securedObject,
final QualifiedObjectIdentifier objectId) {
final SecurityDTOFactory securityDTOFactory = new SecurityDTOFactory();
final Map<SecurityUser, SecurityUser> fromOriginalToStrippedDownUser = new HashMap<>();
final Map<UserGroup, UserGroup> fromOriginalToStrippedDownUserGroup = new HashMap<>();
final AccessControlListAnnotation accessControlList = securityService.getAccessControlList(objectId);
dto.setAccessControlList(securityDTOFactory.createAccessControlListDTO(
securedObject.setAccessControlList(securityDTOFactory.createAccessControlListDTO(
accessControlList == null ? null : accessControlList.getAnnotation(), fromOriginalToStrippedDownUser,
fromOriginalToStrippedDownUserGroup));
final OwnershipAnnotation ownership = securityService.getOwnership(objectId);
dto.setOwnership(securityDTOFactory.createOwnershipDTO(ownership == null ? null : ownership.getAnnotation(),
fromOriginalToStrippedDownUser, fromOriginalToStrippedDownUserGroup));
securedObject.setOwnership(
securityDTOFactory.createOwnershipDTO(ownership == null ? null : ownership.getAnnotation(),
fromOriginalToStrippedDownUser, fromOriginalToStrippedDownUserGroup));
}
}
@@ -107,10 +107,12 @@ public class UserDTO extends SecurityUserImpl implements IsSerializable, Secured
return ownership;
}
@Override
public final void setAccessControlList(final AccessControlList accessControlList) {
this.accessControlList = accessControlList;
}
@Override
public final void setOwnership(final Ownership ownership) {
this.ownership = ownership;
}