mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-14 22:43:57 +00:00
Merge branch 'permission-vertical' into bug4709_pv
This commit is contained in:
commit
d105efdc0f
27 files changed
+324
-227
No files matched your search
+24
-1
@@ -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) {
|
||||
|
||||
+9
-1
@@ -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
|
||||
|
||||
+9
-8
@@ -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());
|
||||
|
||||
|
||||
+8
-5
@@ -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());
|
||||
|
||||
+9
-16
@@ -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);
|
||||
|
||||
|
||||
+8
-14
@@ -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;
|
||||
|
||||
-69
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
-80
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+1
@@ -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;
|
||||
}
|
||||
|
||||
+2
@@ -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);
|
||||
}
|
||||
+9
-1
@@ -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
|
||||
|
||||
+7
@@ -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()));
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -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;
|
||||
+49
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
+18
-14
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+93
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
+2
@@ -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();
|
||||
|
||||
+2
@@ -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
|
||||
|
||||
+2
@@ -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
|
||||
|
||||
+24
-8
@@ -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");
|
||||
}
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+30
-7
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user