fixed error on username change on own User-Account
This commit is contained in:
parent
981ee1dbfa
commit
c97a2ff02b
11 changed files with 87 additions and 22 deletions
|
@ -16,7 +16,6 @@ import com.fasterxml.jackson.annotation.JsonCreator;
|
|||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||
import ch.ethz.seb.sebserver.gbl.api.POSTMapper;
|
||||
import ch.ethz.seb.sebserver.gbl.model.Domain;
|
||||
|
@ -26,6 +25,8 @@ import ch.ethz.seb.sebserver.gbl.model.GrantEntity;
|
|||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public final class Configuration implements GrantEntity {
|
||||
|
||||
public static final String FOLLOW_UP_VERSION_NAME = "[TIP]";
|
||||
|
||||
public static final String FILTER_ATTR_CONFIGURATION_NODE_ID = "configurationNodeId";
|
||||
public static final String FILTER_ATTR_FROM_DATE = "fromDate";
|
||||
public static final String FILTER_ATTR_FOLLOWUP = "followup";
|
||||
|
@ -87,7 +88,9 @@ public final class Configuration implements GrantEntity {
|
|||
public String getName() {
|
||||
return (this.version != null)
|
||||
? this.version
|
||||
: this.versionDate.toString(Constants.DEFAULT_DISPLAY_DATE_FORMAT);
|
||||
: (this.followup)
|
||||
? FOLLOW_UP_VERSION_NAME
|
||||
: null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -39,7 +39,6 @@ import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
|||
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.PageService;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.impl.PageUtils;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitution;
|
||||
|
@ -249,12 +248,15 @@ public class UserAccountForm implements TemplateComposer {
|
|||
.newAction(ActionDefinition.USER_ACCOUNT_SAVE)
|
||||
.withEntityKey(entityKey)
|
||||
.withExec(action -> {
|
||||
final PageAction saveAction = formHandle.processFormSave(action);
|
||||
if (ownAccount) {
|
||||
currentUser.refresh();
|
||||
pageContext.forwardToMainPage();
|
||||
}
|
||||
return saveAction;
|
||||
return formHandle.handleFormPost(formHandle.doAPIPost()
|
||||
.map(userInfo -> {
|
||||
if (ownAccount) {
|
||||
currentUser.refresh(userInfo);
|
||||
pageContext.forwardToMainPage();
|
||||
}
|
||||
return userInfo;
|
||||
}),
|
||||
action);
|
||||
})
|
||||
.ignoreMoveAwayFromEdit()
|
||||
.publishIf(() -> !readonly)
|
||||
|
|
|
@ -28,8 +28,8 @@ import org.springframework.web.context.WebApplicationContext;
|
|||
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||
import ch.ethz.seb.sebserver.gbl.api.authorization.Privilege;
|
||||
import ch.ethz.seb.sebserver.gbl.api.authorization.PrivilegeType;
|
||||
import ch.ethz.seb.sebserver.gbl.api.authorization.Privilege.RoleTypeKey;
|
||||
import ch.ethz.seb.sebserver.gbl.api.authorization.PrivilegeType;
|
||||
import ch.ethz.seb.sebserver.gbl.model.GrantEntity;
|
||||
import ch.ethz.seb.sebserver.gbl.model.user.UserInfo;
|
||||
import ch.ethz.seb.sebserver.gbl.model.user.UserRole;
|
||||
|
@ -99,7 +99,8 @@ public class CurrentUser {
|
|||
if (loadPrivileges()) {
|
||||
try {
|
||||
final UserInfo userInfo = get();
|
||||
return userInfo.getRoles()
|
||||
return userInfo
|
||||
.getRoles()
|
||||
.stream()
|
||||
.map(roleName -> UserRole.valueOf(roleName))
|
||||
.map(role -> new RoleTypeKey(entityType, role))
|
||||
|
@ -156,8 +157,8 @@ public class CurrentUser {
|
|||
return this.authContext != null && this.authContext.isLoggedIn();
|
||||
}
|
||||
|
||||
public void refresh() {
|
||||
this.authContext.refreshUser();
|
||||
public void refresh(final UserInfo userInfo) {
|
||||
this.authContext.refreshUser(userInfo);
|
||||
}
|
||||
|
||||
private void updateContext() {
|
||||
|
|
|
@ -227,16 +227,23 @@ public class OAuth2AuthorizationContextHolder implements AuthorizationContextHol
|
|||
}
|
||||
|
||||
@Override
|
||||
public void refreshUser() {
|
||||
public void refreshUser(final UserInfo userInfo) {
|
||||
// delete the access-token (and refresh-token) on authentication server side
|
||||
this.restTemplate.delete(this.revokeTokenURI);
|
||||
// delete the access-token within the RestTemplate
|
||||
this.restTemplate.getOAuth2ClientContext().setAccessToken(null);
|
||||
// check if username has changed
|
||||
if (!userInfo.username.equals(getLoggedInUser().get().username)) {
|
||||
// Set new username to be able to request new access token
|
||||
this.resource.setUsername(userInfo.username);
|
||||
}
|
||||
|
||||
// and request new access token
|
||||
this.restTemplate.getAccessToken();
|
||||
// and reset logged in user by getting actual one from webservice
|
||||
this.loggedInUser = null;
|
||||
getLoggedInUser();
|
||||
getLoggedInUser()
|
||||
.getOrThrow();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -50,7 +50,7 @@ public interface SEBServerAuthorizationContext {
|
|||
* @return Result of logged in user data or of an error on fail */
|
||||
Result<UserInfo> getLoggedInUser();
|
||||
|
||||
void refreshUser();
|
||||
void refreshUser(UserInfo userInfo);
|
||||
|
||||
/** Returns true if a current logged in user has the specified role.
|
||||
*
|
||||
|
|
|
@ -13,11 +13,14 @@ import java.util.Collection;
|
|||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.EnumMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.graphics.Rectangle;
|
||||
import org.eclipse.swt.layout.GridData;
|
||||
|
@ -74,6 +77,7 @@ public final class ClientConnectionTable {
|
|||
private int tableWidth;
|
||||
private boolean needsSort = false;
|
||||
private LinkedHashMap<Long, UpdatableTableItem> tableMapping;
|
||||
private final Set<String> sessionIds;
|
||||
|
||||
public ClientConnectionTable(
|
||||
final WidgetFactory widgetFactory,
|
||||
|
@ -121,6 +125,7 @@ public final class ClientConnectionTable {
|
|||
}
|
||||
|
||||
this.tableMapping = new LinkedHashMap<>();
|
||||
this.sessionIds = new HashSet<>();
|
||||
this.table.layout();
|
||||
}
|
||||
|
||||
|
@ -177,7 +182,7 @@ public final class ClientConnectionTable {
|
|||
.forEach(data -> {
|
||||
final UpdatableTableItem tableItem = this.tableMapping.computeIfAbsent(
|
||||
data.getConnectionId(),
|
||||
userIdentifier -> new UpdatableTableItem(data.getConnectionId()));
|
||||
connectionId -> new UpdatableTableItem(connectionId));
|
||||
tableItem.push(data);
|
||||
});
|
||||
}
|
||||
|
@ -243,6 +248,9 @@ public final class ClientConnectionTable {
|
|||
private boolean changed = false;
|
||||
private ClientConnectionData connectionData;
|
||||
private int[] thresholdColorIndices;
|
||||
private boolean duplicateChecked = false;
|
||||
private final boolean duplicateMarked = false;
|
||||
private boolean isDuplicate = false;
|
||||
|
||||
UpdatableTableItem(final Long connectionId) {
|
||||
this.connectionId = connectionId;
|
||||
|
@ -260,6 +268,7 @@ public final class ClientConnectionTable {
|
|||
if (this.connectionData != null) {
|
||||
updateConnectionStatusColor(tableItem);
|
||||
updateIndicatorValues(tableItem);
|
||||
updateDuplicateColor(tableItem);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -275,6 +284,14 @@ public final class ClientConnectionTable {
|
|||
ClientConnectionTable.this.statusData.getStatusColor(this.connectionData));
|
||||
}
|
||||
|
||||
void updateDuplicateColor(final TableItem tableItem) {
|
||||
if (this.isDuplicate && this.duplicateChecked && !this.duplicateMarked) {
|
||||
tableItem.setBackground(0, ClientConnectionTable.this.statusData.color3);
|
||||
} else {
|
||||
tableItem.setBackground(0, null);
|
||||
}
|
||||
}
|
||||
|
||||
void updateIndicatorValues(final TableItem tableItem) {
|
||||
if (this.connectionData == null) {
|
||||
return;
|
||||
|
@ -381,6 +398,15 @@ public final class ClientConnectionTable {
|
|||
}
|
||||
|
||||
this.connectionData = connectionData;
|
||||
|
||||
if (!this.duplicateChecked && StringUtils.isNotBlank(connectionData.clientConnection.userSessionId)) {
|
||||
if (ClientConnectionTable.this.sessionIds.contains(connectionData.clientConnection.userSessionId)) {
|
||||
this.isDuplicate = true;
|
||||
} else {
|
||||
ClientConnectionTable.this.sessionIds.add(connectionData.clientConnection.userSessionId);
|
||||
}
|
||||
this.duplicateChecked = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -29,8 +29,16 @@ public interface UserActivityLogDAO extends
|
|||
* @return Result of the Entity or referring to an Error id happened */
|
||||
public <E extends Entity> Result<E> logCreate(E entity);
|
||||
|
||||
/** Creates a user activity log entry for SEB Exam Configuration save in history action
|
||||
*
|
||||
* @param entity the Entity
|
||||
* @return Result of the Entity or referring to an Error id happened */
|
||||
public <E extends Entity> Result<E> logSaveToHistory(E entity);
|
||||
|
||||
/** Creates a user activity log entry for SEB Exam Configuration undoy action
|
||||
*
|
||||
* @param entity the Entity
|
||||
* @return Result of the Entity or referring to an Error id happened */
|
||||
public <E extends Entity> Result<E> logUndo(E entity);
|
||||
|
||||
/** Create a user activity log entry for the current user of activity type IMPORT
|
||||
|
|
|
@ -212,7 +212,8 @@ class ConfigurationDAOBatchService {
|
|||
oldValRec.getValue()))
|
||||
.forEach(newValRec -> this.batchConfigurationValueRecordMapper.insert(newValRec));
|
||||
|
||||
return newFollowup;
|
||||
return this.batchConfigurationRecordMapper
|
||||
.selectByPrimaryKey(configUpdate.getId());
|
||||
|
||||
})
|
||||
.flatMap(ConfigurationDAOImpl::toDomainModel);
|
||||
|
|
|
@ -90,13 +90,19 @@ public class UserActivityLogDAOImpl implements UserActivityLogDAO {
|
|||
@Override
|
||||
@Transactional
|
||||
public <E extends Entity> Result<E> logSaveToHistory(final E entity) {
|
||||
return log(UserLogActivityType.MODIFY, entity, "SEB Exam Configuration : Save To History");
|
||||
return log(
|
||||
UserLogActivityType.MODIFY,
|
||||
entity,
|
||||
"SEB Exam Configuration : Save To History : " + toMessage(entity));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public <E extends Entity> Result<E> logUndo(final E entity) {
|
||||
return log(UserLogActivityType.MODIFY, entity, "SEB Exam Configuration : Undo");
|
||||
return log(
|
||||
UserLogActivityType.MODIFY,
|
||||
entity,
|
||||
"SEB Exam Configuration : Undo : " + toMessage(entity));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -41,7 +41,7 @@ sebserver.overall.types.entityType.CONFIGURATION_ATTRIBUTE=Configuration Attribu
|
|||
sebserver.overall.types.entityType.CONFIGURATION_VALUE=Configuration Value
|
||||
sebserver.overall.types.entityType.VIEW=Configuration View
|
||||
sebserver.overall.types.entityType.ORIENTATION=Configuration Orientation
|
||||
sebserver.overall.types.entityType.CONFIGURATION=Configuration History Point
|
||||
sebserver.overall.types.entityType.CONFIGURATION=Exam Configuration History
|
||||
sebserver.overall.types.entityType.CONFIGURATION_NODE=Exam Configuration
|
||||
sebserver.overall.types.entityType.EXAM_CONFIGURATION_MAP=Exam Configuration Mapping
|
||||
sebserver.overall.types.entityType.EXAM=Exam
|
||||
|
|
|
@ -15,6 +15,7 @@ import java.util.Collection;
|
|||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
@ -73,6 +74,8 @@ public class HTTPClientBot {
|
|||
private final long runtime;
|
||||
private final int connectionAttempts;
|
||||
|
||||
private final Random random = new Random();
|
||||
|
||||
public HTTPClientBot(final Map<String, String> args) {
|
||||
|
||||
this.webserviceAddress = args.getOrDefault("webserviceAddress", "http://localhost:8080");
|
||||
|
@ -90,12 +93,20 @@ public class HTTPClientBot {
|
|||
this.connectionAttempts = Integer.parseInt(args.getOrDefault("connectionAttempts", "1"));
|
||||
|
||||
for (int i = 0; i < this.numberOfConnections; i++) {
|
||||
this.executorService.execute(new ConnectionBot("connection_" + i));
|
||||
this.executorService.execute(new ConnectionBot("connection_" + getRandomName()));
|
||||
}
|
||||
|
||||
this.executorService.shutdown();
|
||||
}
|
||||
|
||||
private String getRandomName() {
|
||||
final StringBuilder sb = new StringBuilder(String.valueOf(this.random.nextInt(100)));
|
||||
while (sb.length() < 3) {
|
||||
sb.insert(0, "0");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static void main(final String[] args) {
|
||||
final Map<String, String> argsMap = new HashMap<>();
|
||||
if (args.length > 0) {
|
||||
|
|
Loading…
Reference in a new issue