[FEATURE] Хуки авторизации

This commit is contained in:
Gravit 2019-05-03 21:34:10 +07:00
parent 6ec3211450
commit dd596805e1
No known key found for this signature in database
GPG key ID: 061981E1E85D3216
9 changed files with 59 additions and 82 deletions

View file

@ -6,6 +6,7 @@
import ru.gravit.launchserver.auth.provider.AuthProvider; import ru.gravit.launchserver.auth.provider.AuthProvider;
import ru.gravit.launchserver.socket.Client; import ru.gravit.launchserver.socket.Client;
import ru.gravit.launchserver.websocket.json.auth.AuthResponse; import ru.gravit.launchserver.websocket.json.auth.AuthResponse;
import ru.gravit.utils.HookException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -18,7 +19,7 @@ public void preInit(LaunchServer launchServer) {
@Override @Override
public void init(LaunchServer launchServer) { public void init(LaunchServer launchServer) {
launchServer.authHookManager.registerPreHook(this::preAuthHook); launchServer.authHookManager.preHook.registerHook(this::preAuthHook);
} }
@Override @Override
@ -26,10 +27,11 @@ public void postInit(LaunchServer launchServer) {
} }
public void preAuthHook(AuthResponse.AuthContext context, Client client) throws AuthException { public boolean preAuthHook(AuthResponse.AuthContext context, Client client) {
if (isLimit(context.ip)) { if (isLimit(context.ip)) {
AuthProvider.authError(message); throw new HookException(message);
} }
return false;
} }
static class AuthEntry { static class AuthEntry {

View file

@ -1,75 +1,16 @@
package ru.gravit.launchserver.manangers.hook; package ru.gravit.launchserver.manangers.hook;
import ru.gravit.launchserver.auth.AuthException;
import ru.gravit.launchserver.socket.Client; import ru.gravit.launchserver.socket.Client;
import ru.gravit.launchserver.websocket.json.auth.AuthResponse; import ru.gravit.launchserver.websocket.json.auth.AuthResponse;
import ru.gravit.launchserver.websocket.json.auth.CheckServerResponse;
import java.util.HashSet; import ru.gravit.launchserver.websocket.json.auth.JoinServerResponse;
import java.util.Set; import ru.gravit.launchserver.websocket.json.auth.SetProfileResponse;
import ru.gravit.utils.BiHookSet;
public class AuthHookManager { public class AuthHookManager {
private Set<AuthPreHook> PRE_HOOKS = new HashSet<>(); public BiHookSet<AuthResponse.AuthContext, Client> preHook = new BiHookSet<>();
private Set<AuthPostHook> POST_HOOKS = new HashSet<>(); public BiHookSet<AuthResponse.AuthContext, Client> postHook = new BiHookSet<>();
private Set<CheckServerHook> CHECKSERVER_HOOKS = new HashSet<>(); public BiHookSet<CheckServerResponse, Client> checkServerHook = new BiHookSet<>();
private Set<JoinServerHook> JOINSERVER_HOOKS = new HashSet<>(); public BiHookSet<JoinServerResponse, Client> joinServerHook = new BiHookSet<>();
public BiHookSet<SetProfileResponse, Client> setProfileHook = new BiHookSet<>();
@FunctionalInterface
public interface AuthPreHook {
void preAuthHook(AuthResponse.AuthContext context, Client client) throws AuthException;
}
@FunctionalInterface
public interface AuthPostHook {
void postAuthHook(AuthResponse.AuthContext context, Client client) throws AuthException;
}
@FunctionalInterface
public interface CheckServerHook {
void checkServerHook(String username, String serverID) throws AuthException;
}
@FunctionalInterface
public interface JoinServerHook {
void joinServerHook(String username, String accessToken, String serverID) throws AuthException;
}
public void registerPostHook(AuthPostHook hook) {
POST_HOOKS.add(hook);
}
public void registerJoinServerHook(JoinServerHook hook) {
JOINSERVER_HOOKS.add(hook);
}
public void registerCheckServerHook(CheckServerHook hook) {
CHECKSERVER_HOOKS.add(hook);
}
public void registerPreHook(AuthPreHook hook) {
PRE_HOOKS.add(hook);
}
public void preHook(AuthResponse.AuthContext context, Client client) throws AuthException {
for (AuthPreHook preHook : PRE_HOOKS) {
preHook.preAuthHook(context, client);
}
}
public void checkServerHook(String username, String serverID) throws AuthException {
for (CheckServerHook hook : CHECKSERVER_HOOKS) {
hook.checkServerHook(username, serverID);
}
}
public void joinServerHook(String username, String accessToken, String serverID) throws AuthException {
for (JoinServerHook hook : JOINSERVER_HOOKS) {
hook.joinServerHook(username, accessToken, serverID);
}
}
public void postHook(AuthResponse.AuthContext context, Client client) throws AuthException {
for (AuthPostHook postHook : POST_HOOKS) {
postHook.postAuthHook(context, client);
}
}
} }

View file

@ -4,6 +4,7 @@
import ru.gravit.launcher.OshiHWID; import ru.gravit.launcher.OshiHWID;
import ru.gravit.launcher.events.request.AuthRequestEvent; import ru.gravit.launcher.events.request.AuthRequestEvent;
import ru.gravit.launcher.profiles.ClientProfile; import ru.gravit.launcher.profiles.ClientProfile;
import ru.gravit.launcher.request.RequestException;
import ru.gravit.launchserver.LaunchServer; import ru.gravit.launchserver.LaunchServer;
import ru.gravit.launchserver.auth.AuthException; import ru.gravit.launchserver.auth.AuthException;
import ru.gravit.launchserver.auth.AuthProviderPair; import ru.gravit.launchserver.auth.AuthProviderPair;
@ -13,6 +14,7 @@
import ru.gravit.launchserver.socket.Client; import ru.gravit.launchserver.socket.Client;
import ru.gravit.launchserver.websocket.json.SimpleResponse; import ru.gravit.launchserver.websocket.json.SimpleResponse;
import ru.gravit.launchserver.websocket.json.profile.ProfileByUUIDResponse; import ru.gravit.launchserver.websocket.json.profile.ProfileByUUIDResponse;
import ru.gravit.utils.HookException;
import ru.gravit.utils.helper.IOHelper; import ru.gravit.utils.helper.IOHelper;
import ru.gravit.utils.helper.LogHelper; import ru.gravit.utils.helper.LogHelper;
import ru.gravit.utils.helper.SecurityHelper; import ru.gravit.utils.helper.SecurityHelper;
@ -84,7 +86,7 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti
else pair = LaunchServer.server.config.getAuthProviderPair(auth_id); else pair = LaunchServer.server.config.getAuthProviderPair(auth_id);
AuthContext context = new AuthContext(0, login, password.length(), customText, client, ip, null, false); AuthContext context = new AuthContext(0, login, password.length(), customText, client, ip, null, false);
AuthProvider provider = pair.provider; AuthProvider provider = pair.provider;
LaunchServer.server.authHookManager.preHook(context, clientData); LaunchServer.server.authHookManager.preHook.hook(context, clientData);
provider.preAuth(login, password, customText, ip); provider.preAuth(login, password, customText, ip);
AuthProviderResult aresult = provider.auth(login, password, ip); AuthProviderResult aresult = provider.auth(login, password, ip);
if (!VerifyHelper.isValidUsername(aresult.username)) { if (!VerifyHelper.isValidUsername(aresult.username)) {
@ -105,7 +107,7 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti
//} //}
if (authType == ConnectTypes.CLIENT) if (authType == ConnectTypes.CLIENT)
LaunchServer.server.config.hwidHandler.check(hwid, aresult.username); LaunchServer.server.config.hwidHandler.check(hwid, aresult.username);
LaunchServer.server.authHookManager.postHook(context, clientData); LaunchServer.server.authHookManager.postHook.hook(context, clientData);
clientData.isAuth = true; clientData.isAuth = true;
clientData.permissions = aresult.permissions; clientData.permissions = aresult.permissions;
clientData.auth_id = auth_id; clientData.auth_id = auth_id;
@ -125,7 +127,7 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti
LogHelper.debug("Auth: %s accessToken %s uuid: %s", login, result.accessToken, uuid.toString()); LogHelper.debug("Auth: %s accessToken %s uuid: %s", login, result.accessToken, uuid.toString());
} }
sendResult(result); sendResult(result);
} catch (AuthException | HWIDException e) { } catch (AuthException | HWIDException | HookException e) {
sendError(e.getMessage()); sendError(e.getMessage());
} }
} }

View file

@ -7,6 +7,7 @@
import ru.gravit.launchserver.socket.Client; import ru.gravit.launchserver.socket.Client;
import ru.gravit.launchserver.websocket.json.SimpleResponse; import ru.gravit.launchserver.websocket.json.SimpleResponse;
import ru.gravit.launchserver.websocket.json.profile.ProfileByUUIDResponse; import ru.gravit.launchserver.websocket.json.profile.ProfileByUUIDResponse;
import ru.gravit.utils.HookException;
import ru.gravit.utils.helper.LogHelper; import ru.gravit.utils.helper.LogHelper;
public class CheckServerResponse extends SimpleResponse { public class CheckServerResponse extends SimpleResponse {
@ -23,11 +24,12 @@ public String getType() {
public void execute(ChannelHandlerContext ctx, Client pClient) { public void execute(ChannelHandlerContext ctx, Client pClient) {
CheckServerRequestEvent result = new CheckServerRequestEvent(); CheckServerRequestEvent result = new CheckServerRequestEvent();
try { try {
server.authHookManager.checkServerHook.hook(this, pClient);
result.uuid = pClient.auth.handler.checkServer(username, serverID); result.uuid = pClient.auth.handler.checkServer(username, serverID);
if (result.uuid != null) if (result.uuid != null)
result.playerProfile = ProfileByUUIDResponse.getProfile(LaunchServer.server, result.uuid, username, client, pClient.auth.textureProvider); result.playerProfile = ProfileByUUIDResponse.getProfile(LaunchServer.server, result.uuid, username, client, pClient.auth.textureProvider);
LogHelper.debug("checkServer: %s uuid: %s serverID: %s", result.playerProfile.username, result.uuid.toString(), serverID); LogHelper.debug("checkServer: %s uuid: %s serverID: %s", result.playerProfile.username, result.uuid.toString(), serverID);
} catch (AuthException e) { } catch (AuthException | HookException e) {
sendError(e.getMessage()); sendError(e.getMessage());
return; return;
} catch (Exception e) { } catch (Exception e) {

View file

@ -6,6 +6,7 @@
import ru.gravit.launchserver.auth.AuthException; import ru.gravit.launchserver.auth.AuthException;
import ru.gravit.launchserver.socket.Client; import ru.gravit.launchserver.socket.Client;
import ru.gravit.launchserver.websocket.json.SimpleResponse; import ru.gravit.launchserver.websocket.json.SimpleResponse;
import ru.gravit.utils.HookException;
import ru.gravit.utils.helper.LogHelper; import ru.gravit.utils.helper.LogHelper;
public class JoinServerResponse extends SimpleResponse { public class JoinServerResponse extends SimpleResponse {
@ -17,11 +18,11 @@ public class JoinServerResponse extends SimpleResponse {
public String getType() { public String getType() {
return "joinServer"; return "joinServer";
} }
@Override @Override
public void execute(ChannelHandlerContext ctx, Client client) { public void execute(ChannelHandlerContext ctx, Client client) {
boolean success; boolean success;
try { try {
server.authHookManager.joinServerHook.hook(this, client);
if(client.auth == null) if(client.auth == null)
{ {
LogHelper.warning("Client auth is null. Using default."); LogHelper.warning("Client auth is null. Using default.");
@ -29,7 +30,7 @@ public void execute(ChannelHandlerContext ctx, Client client) {
} }
else success = client.auth.handler.joinServer(username, accessToken, serverID); else success = client.auth.handler.joinServer(username, accessToken, serverID);
LogHelper.debug("joinServer: %s accessToken: %s serverID: %s", username, accessToken, serverID); LogHelper.debug("joinServer: %s accessToken: %s serverID: %s", username, accessToken, serverID);
} catch (AuthException e) { } catch (AuthException | HookException e) {
sendError(e.getMessage()); sendError(e.getMessage());
return; return;
} catch (Exception e) { } catch (Exception e) {

View file

@ -6,6 +6,7 @@
import ru.gravit.launchserver.LaunchServer; import ru.gravit.launchserver.LaunchServer;
import ru.gravit.launchserver.socket.Client; import ru.gravit.launchserver.socket.Client;
import ru.gravit.launchserver.websocket.json.SimpleResponse; import ru.gravit.launchserver.websocket.json.SimpleResponse;
import ru.gravit.utils.HookException;
import java.util.Collection; import java.util.Collection;
@ -23,6 +24,12 @@ public void execute(ChannelHandlerContext ctx, Client client) {
sendError("Access denied"); sendError("Access denied");
return; return;
} }
try {
server.authHookManager.setProfileHook.hook(this, client);
} catch (HookException e)
{
sendError(e.getMessage());
}
Collection<ClientProfile> profiles = LaunchServer.server.getProfiles(); Collection<ClientProfile> profiles = LaunchServer.server.getProfiles();
for (ClientProfile p : profiles) { for (ClientProfile p : profiles) {
if (p.getTitle().equals(this.client)) { if (p.getTitle().equals(this.client)) {

View file

@ -8,7 +8,7 @@ public class BiHookSet<V,R> {
@FunctionalInterface @FunctionalInterface
public interface Hook<V, R> public interface Hook<V, R>
{ {
boolean hook(V object, R context); boolean hook(V object, R context) throws HookException;
} }
public void registerHook(Hook<V, R> hook) public void registerHook(Hook<V, R> hook)
{ {
@ -18,11 +18,11 @@ public boolean unregisterHook(Hook<V, R> hook)
{ {
return list.remove(hook); return list.remove(hook);
} }
public boolean hook(V object, R context) public boolean hook(V context, R object) throws HookException
{ {
for(Hook<V, R> hook : list) for(Hook<V, R> hook : list)
{ {
if(hook.hook(object, context)) return true; if(hook.hook(context, object)) return true;
} }
return false; return false;
} }

View file

@ -0,0 +1,22 @@
package ru.gravit.utils;
public class HookException extends RuntimeException {
public HookException() {
}
public HookException(String message) {
super(message);
}
public HookException(String message, Throwable cause) {
super(message, cause);
}
public HookException(Throwable cause) {
super(cause);
}
public HookException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}

View file

@ -8,7 +8,7 @@ public class HookSet<R> {
@FunctionalInterface @FunctionalInterface
public interface Hook<R> public interface Hook<R>
{ {
boolean hook(R context); boolean hook(R context) throws HookException;
} }
public void registerHook(Hook<R> hook) public void registerHook(Hook<R> hook)
{ {
@ -18,7 +18,7 @@ public boolean unregisterHook(Hook<R> hook)
{ {
return list.remove(hook); return list.remove(hook);
} }
public boolean hook(R context) public boolean hook(R context) throws HookException
{ {
for(Hook<R> hook : list) for(Hook<R> hook : list)
{ {