Launcher/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/ExitResponse.java

80 lines
3.3 KiB
Java

package pro.gravit.launchserver.socket.response.auth;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import pro.gravit.launcher.base.events.RequestEvent;
import pro.gravit.launcher.base.events.request.ExitRequestEvent;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.core.UserSession;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportExit;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.handlers.WebSocketFrameHandler;
import pro.gravit.launchserver.socket.response.SimpleResponse;
import java.util.HashMap;
public class ExitResponse extends SimpleResponse {
public boolean exitAll;
public String username;
public static void exit(LaunchServer server, WebSocketFrameHandler wsHandler, Channel channel, ExitRequestEvent.ExitReason reason) {
Client chClient = wsHandler.getClient();
Client newCusClient = new Client();
newCusClient.checkSign = chClient.checkSign;
if (chClient.staticProperties != null) {
newCusClient.staticProperties = new HashMap<>(chClient.staticProperties);
}
wsHandler.setClient(newCusClient);
ExitRequestEvent event = new ExitRequestEvent(reason);
event.requestUUID = RequestEvent.eventUUID;
wsHandler.service.sendObject(channel, event);
}
@Override
public String getType() {
return "exit";
}
@Override
public void execute(ChannelHandlerContext ctx, Client client) {
if (username != null && (!client.isAuth || client.permissions == null || !client.permissions.hasPerm("launchserver\\.management\\.kick"))) {
sendError("Permissions denied");
return;
}
if (username == null) {
{
WebSocketFrameHandler handler = ctx.pipeline().get(WebSocketFrameHandler.class);
if (handler == null) {
sendError("Exit internal error");
return;
}
Client newClient = new Client();
newClient.checkSign = client.checkSign;
handler.setClient(newClient);
AuthSupportExit supportExit = client.auth.core.isSupport(AuthSupportExit.class);
if (supportExit != null) {
if (exitAll) {
supportExit.exitUser(client.getUser());
} else {
UserSession session = client.sessionObject;
if (session != null) {
supportExit.deleteSession(session);
}
}
}
sendResult(new ExitRequestEvent(ExitRequestEvent.ExitReason.CLIENT));
}
sendResult(new ExitRequestEvent(ExitRequestEvent.ExitReason.CLIENT));
} else {
service.forEachActiveChannels(((channel, webSocketFrameHandler) -> {
Client client1 = webSocketFrameHandler.getClient();
if (client1 != null && client.isAuth && client.username != null && client1.username.equals(username)) {
exit(server, webSocketFrameHandler, channel, ExitRequestEvent.ExitReason.SERVER);
}
}));
sendResult(new ExitRequestEvent(ExitRequestEvent.ExitReason.NO_EXIT));
}
}
}