CB-4196 add delete user functionality (#2121)

* CB-4196 add delete user functionality

* CB-4196 review fixes

* CB-4196 use div for Text component

* CB-4196 add onDelete callback

* CB-4197 delete user project after deleting user

* CB-4196 add project deletion error to session log

* CB-4196 make a disable dialog slightly larger

* CB-4196 change button styles

* CB-4197 add events for deleting user

* CB-4197 code style fix

---------

Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: Ainur <yagudin10@yandex.ru>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
This commit is contained in:
alex
2023-11-15 23:09:22 +03:00
committed by GitHub
co-authored by Alexey Ainur Evgenia Bezborodova
parent dfd572aa4c
commit a319b1fec3
24 changed files with 389 additions and 7 deletions
@@ -56,6 +56,7 @@ import org.jkiss.utils.Pair;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.text.MessageFormat;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.util.*;
@@ -309,7 +310,8 @@ public class LocalResourceController implements RMController {
RMProject project = makeProjectFromId(projectId, false);
Path targetPath = getProjectPath(projectId);
if (!Files.exists(targetPath)) {
throw new DBException("Project '" + project.getName() + "' doesn't exists");
log.debug(MessageFormat.format("Project folder ''{0}'' is not found", projectId));
return;
}
try {
log.debug("Deleting project '" + projectId + "'");
@@ -167,7 +167,6 @@ public abstract class BaseWebSession extends AbstractSessionPersistent {
public void close() {
super.close();
var sessionExpiredEvent = new WSSessionExpiredEvent();
application.getEventController().addEvent(sessionExpiredEvent);
application.getEventController().addEvent(new WSEventDeleteTempFile(getSessionId()));
synchronized (sessionEventHandlers) {
for (CBWebSessionEventHandler sessionEventHandler : sessionEventHandlers) {
@@ -78,6 +78,9 @@
<eventHandler class="io.cloudbeaver.server.events.WSDeleteTempFileHandler">
<topic id="cb_delete_temp_folder"/>
</eventHandler>
<eventHandler class="io.cloudbeaver.server.events.WSUserDeletedEventHandler">
<topic id="cb_user"/>
</eventHandler>
</extension>
</plugin>
@@ -0,0 +1,29 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2023 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.server.events;
import io.cloudbeaver.server.CBPlatform;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.model.websocket.WSEventHandler;
import org.jkiss.dbeaver.model.websocket.event.WSUserDeletedEvent;
public class WSUserDeletedEventHandler<EVENT extends WSUserDeletedEvent> implements WSEventHandler<EVENT> {
@Override
public void handleEvent(@NotNull EVENT event) {
CBPlatform.getInstance().getSessionManager().closeUserSessions(event.getDeletedUserId());
}
}
@@ -340,4 +340,16 @@ public class WebSessionManager {
}
}
}
public void closeUserSessions(@NotNull String userId) {
synchronized (sessionMap) {
for (Iterator<BaseWebSession> iterator = sessionMap.values().iterator(); iterator.hasNext(); ) {
var session = iterator.next();
if (CommonUtils.equalObjects(session.getUserContext().getUserId(), userId)) {
iterator.remove();
session.close();
}
}
}
}
}
@@ -43,6 +43,9 @@ import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.auth.AuthInfo;
import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.rm.RMProjectType;
import org.jkiss.dbeaver.model.rm.RMUtils;
import org.jkiss.dbeaver.model.security.*;
import org.jkiss.dbeaver.model.security.user.SMTeam;
import org.jkiss.dbeaver.model.security.user.SMUser;
@@ -177,10 +180,16 @@ public class WebServiceAdmin implements DBWServiceAdmin {
webSession.addInfoMessage("Delete user - " + userName);
try {
webSession.getAdminSecurityController().deleteUser(userName);
return true;
} catch (Exception e) {
throw new DBWebException("Error deleting user", e);
}
try {
webSession.getRmController().deleteProject(RMProjectType.USER + "_" + userName);
} catch (DBException e) {
log.error("Error deleting user project", e);
webSession.addSessionError(e);
}
return true;
}
@NotNull
@@ -50,8 +50,10 @@ import org.jkiss.dbeaver.model.security.exception.SMException;
import org.jkiss.dbeaver.model.security.exception.SMRefreshTokenExpiredException;
import org.jkiss.dbeaver.model.security.user.*;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.websocket.event.WSUserDeletedEvent;
import org.jkiss.dbeaver.model.websocket.event.permissions.WSObjectPermissionEvent;
import org.jkiss.dbeaver.model.websocket.event.permissions.WSSubjectPermissionEvent;
import org.jkiss.dbeaver.model.websocket.event.session.WSSessionExpiredEvent;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
import org.jkiss.utils.SecurityUtils;
@@ -211,6 +213,8 @@ public class CBEmbeddedSecurityController<T extends WebAuthApplication>
} catch (SQLException e) {
throw new DBCException("Error deleting user from database", e);
}
var event = new WSUserDeletedEvent(userId);
application.getEventController().addEvent(event);
}
@Override