[FEATURE] AuthDetails support

This commit is contained in:
Gravita 2021-04-13 19:30:06 +07:00
parent 40e4949c47
commit d1e671a935
12 changed files with 118 additions and 5 deletions

View file

@ -8,6 +8,7 @@
import pro.gravit.launcher.modules.events.PreConfigPhase; import pro.gravit.launcher.modules.events.PreConfigPhase;
import pro.gravit.launcher.profiles.optional.actions.OptionalAction; import pro.gravit.launcher.profiles.optional.actions.OptionalAction;
import pro.gravit.launcher.request.auth.AuthRequest; import pro.gravit.launcher.request.auth.AuthRequest;
import pro.gravit.launcher.request.auth.GetAvailabilityAuthRequest;
import pro.gravit.launchserver.auth.handler.AuthHandler; import pro.gravit.launchserver.auth.handler.AuthHandler;
import pro.gravit.launchserver.auth.protect.ProtectHandler; import pro.gravit.launchserver.auth.protect.ProtectHandler;
import pro.gravit.launchserver.auth.protect.hwid.HWIDProvider; import pro.gravit.launchserver.auth.protect.hwid.HWIDProvider;
@ -233,6 +234,7 @@ public static void registerAll() {
WebSocketService.registerResponses(); WebSocketService.registerResponses();
DaoProvider.registerProviders(); DaoProvider.registerProviders();
AuthRequest.registerProviders(); AuthRequest.registerProviders();
GetAvailabilityAuthRequest.registerProviders();
HWIDProvider.registerProviders(); HWIDProvider.registerProviders();
OptionalAction.registerProviders(); OptionalAction.registerProviders();
SessionStorage.registerProviders(); SessionStorage.registerProviders();

View file

@ -2,11 +2,14 @@
import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent; import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent;
import pro.gravit.launcher.request.auth.AuthRequest; import pro.gravit.launcher.request.auth.AuthRequest;
import pro.gravit.launcher.request.auth.details.AuthPasswordDetails;
import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.AuthException; import pro.gravit.launchserver.auth.AuthException;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.utils.ProviderMap; import pro.gravit.utils.ProviderMap;
import java.io.IOException; import java.io.IOException;
import java.util.List;
public abstract class AuthProvider implements AutoCloseable { public abstract class AuthProvider implements AutoCloseable {
public static final ProviderMap<AuthProvider> providers = new ProviderMap<>("AuthProvider"); public static final ProviderMap<AuthProvider> providers = new ProviderMap<>("AuthProvider");
@ -31,14 +34,20 @@ public static void registerProviders() {
} }
} }
@Deprecated
public GetAvailabilityAuthRequestEvent.AuthAvailability.AuthType getFirstAuthType() { public GetAvailabilityAuthRequestEvent.AuthAvailability.AuthType getFirstAuthType() {
return GetAvailabilityAuthRequestEvent.AuthAvailability.AuthType.PASSWORD; return GetAvailabilityAuthRequestEvent.AuthAvailability.AuthType.PASSWORD;
} }
@Deprecated
public GetAvailabilityAuthRequestEvent.AuthAvailability.AuthType getSecondAuthType() { public GetAvailabilityAuthRequestEvent.AuthAvailability.AuthType getSecondAuthType() {
return GetAvailabilityAuthRequestEvent.AuthAvailability.AuthType.NONE; return GetAvailabilityAuthRequestEvent.AuthAvailability.AuthType.NONE;
} }
public List<GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails> getDetails(Client client) {
return List.of(new AuthPasswordDetails());
}
/** /**
* Verifies the username and password * Verifies the username and password
* *

View file

@ -19,7 +19,7 @@ public String getType() {
public void execute(ChannelHandlerContext ctx, Client client) { public void execute(ChannelHandlerContext ctx, Client client) {
List<GetAvailabilityAuthRequestEvent.AuthAvailability> list = new ArrayList<>(); List<GetAvailabilityAuthRequestEvent.AuthAvailability> list = new ArrayList<>();
for (AuthProviderPair pair : server.config.auth.values()) { for (AuthProviderPair pair : server.config.auth.values()) {
list.add(new GetAvailabilityAuthRequestEvent.AuthAvailability(pair.name, pair.displayName, pair.provider.getFirstAuthType(), pair.provider.getSecondAuthType())); list.add(new GetAvailabilityAuthRequestEvent.AuthAvailability(pair.name, pair.displayName, pair.provider.getDetails(client)));
} }
sendResult(new GetAvailabilityAuthRequestEvent(list)); sendResult(new GetAvailabilityAuthRequestEvent(list));
} }

View file

@ -17,6 +17,7 @@
import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.Request;
import pro.gravit.launcher.request.RequestException; import pro.gravit.launcher.request.RequestException;
import pro.gravit.launcher.request.auth.AuthRequest; import pro.gravit.launcher.request.auth.AuthRequest;
import pro.gravit.launcher.request.auth.GetAvailabilityAuthRequest;
import pro.gravit.launcher.request.auth.RestoreSessionRequest; import pro.gravit.launcher.request.auth.RestoreSessionRequest;
import pro.gravit.launcher.request.websockets.StdWebSocketService; import pro.gravit.launcher.request.websockets.StdWebSocketService;
import pro.gravit.launcher.utils.NativeJVMHalt; import pro.gravit.launcher.utils.NativeJVMHalt;
@ -116,6 +117,7 @@ public static void main(String... args) throws Throwable {
public static void initGson(ClientModuleManager modulesManager) { public static void initGson(ClientModuleManager modulesManager) {
AuthRequest.registerProviders(); AuthRequest.registerProviders();
GetAvailabilityAuthRequest.registerProviders();
OptionalAction.registerProviders(); OptionalAction.registerProviders();
Launcher.gsonManager = new ClientGsonManager(modulesManager); Launcher.gsonManager = new ClientGsonManager(modulesManager);
Launcher.gsonManager.initGson(); Launcher.gsonManager.initGson();

View file

@ -21,6 +21,7 @@
import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.Request;
import pro.gravit.launcher.request.RequestException; import pro.gravit.launcher.request.RequestException;
import pro.gravit.launcher.request.auth.AuthRequest; import pro.gravit.launcher.request.auth.AuthRequest;
import pro.gravit.launcher.request.auth.GetAvailabilityAuthRequest;
import pro.gravit.launcher.request.auth.RestoreSessionRequest; import pro.gravit.launcher.request.auth.RestoreSessionRequest;
import pro.gravit.launcher.serialize.HInput; import pro.gravit.launcher.serialize.HInput;
import pro.gravit.launcher.utils.DirWatcher; import pro.gravit.launcher.utils.DirWatcher;
@ -183,6 +184,7 @@ public static void main(String[] args) throws Throwable {
private static void initGson(ClientModuleManager moduleManager) { private static void initGson(ClientModuleManager moduleManager) {
AuthRequest.registerProviders(); AuthRequest.registerProviders();
GetAvailabilityAuthRequest.registerProviders();
OptionalAction.registerProviders(); OptionalAction.registerProviders();
Launcher.gsonManager = new ClientGsonManager(moduleManager); Launcher.gsonManager = new ClientGsonManager(moduleManager);
Launcher.gsonManager.initGson(); Launcher.gsonManager.initGson();

View file

@ -2,6 +2,7 @@
import pro.gravit.launcher.LauncherNetworkAPI; import pro.gravit.launcher.LauncherNetworkAPI;
import pro.gravit.launcher.events.RequestEvent; import pro.gravit.launcher.events.RequestEvent;
import pro.gravit.utils.TypeSerializeInterface;
import java.util.List; import java.util.List;
@ -37,22 +38,34 @@ public enum ServerFeature {
public static class AuthAvailability { public static class AuthAvailability {
@LauncherNetworkAPI @LauncherNetworkAPI
public final String name; public String name;
@LauncherNetworkAPI @LauncherNetworkAPI
public final String displayName; public String displayName;
@Deprecated
@LauncherNetworkAPI @LauncherNetworkAPI
public final AuthType firstType; public AuthType firstType;
@Deprecated
@LauncherNetworkAPI @LauncherNetworkAPI
public final AuthType secondType; public AuthType secondType;
public final List<AuthAvailabilityDetails> details;
@Deprecated
public AuthAvailability(String name, String displayName, AuthType firstType, AuthType secondType) { public AuthAvailability(String name, String displayName, AuthType firstType, AuthType secondType) {
this.name = name; this.name = name;
this.displayName = displayName; this.displayName = displayName;
this.firstType = firstType; this.firstType = firstType;
this.secondType = secondType; this.secondType = secondType;
this.details = null;
} }
public AuthAvailability(String name, String displayName, List<AuthAvailabilityDetails> details) {
this.name = name;
this.displayName = displayName;
this.details = details;
}
@Deprecated
public enum AuthType { public enum AuthType {
@LauncherNetworkAPI @LauncherNetworkAPI
PASSWORD, PASSWORD,
@ -68,4 +81,6 @@ public enum AuthType {
OTHER OTHER
} }
} }
public interface AuthAvailabilityDetails extends TypeSerializeInterface {
}
} }

View file

@ -2,7 +2,10 @@
import pro.gravit.launcher.LauncherNetworkAPI; import pro.gravit.launcher.LauncherNetworkAPI;
import pro.gravit.launcher.events.request.AuthRequestEvent; import pro.gravit.launcher.events.request.AuthRequestEvent;
import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent;
import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.Request;
import pro.gravit.launcher.request.auth.details.AuthPasswordDetails;
import pro.gravit.launcher.request.auth.details.AuthWebViewDetails;
import pro.gravit.launcher.request.auth.password.*; import pro.gravit.launcher.request.auth.password.*;
import pro.gravit.launcher.request.websockets.WebSocketRequest; import pro.gravit.launcher.request.websockets.WebSocketRequest;
import pro.gravit.utils.ProviderMap; import pro.gravit.utils.ProviderMap;

View file

@ -2,10 +2,26 @@
import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent; import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent;
import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.Request;
import pro.gravit.launcher.request.auth.details.AuthPasswordDetails;
import pro.gravit.launcher.request.auth.details.AuthTotpDetails;
import pro.gravit.launcher.request.auth.details.AuthWebViewDetails;
import pro.gravit.launcher.request.websockets.WebSocketRequest; import pro.gravit.launcher.request.websockets.WebSocketRequest;
import pro.gravit.utils.ProviderMap;
public class GetAvailabilityAuthRequest extends Request<GetAvailabilityAuthRequestEvent> implements WebSocketRequest { public class GetAvailabilityAuthRequest extends Request<GetAvailabilityAuthRequestEvent> implements WebSocketRequest {
public static final ProviderMap<GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails> providers = new ProviderMap<>();
private static boolean registeredProviders = false;
public static void registerProviders() {
if(!registeredProviders) {
providers.register("password", AuthPasswordDetails.class);
providers.register("webview", AuthWebViewDetails.class);
providers.register("totp", AuthTotpDetails.class);
registeredProviders = true;
}
}
@Override @Override
public String getType() { public String getType() {
return "getAvailabilityAuth"; return "getAvailabilityAuth";

View file

@ -0,0 +1,10 @@
package pro.gravit.launcher.request.auth.details;
import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent;
public class AuthPasswordDetails implements GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails {
@Override
public String getType() {
return "password";
}
}

View file

@ -0,0 +1,23 @@
package pro.gravit.launcher.request.auth.details;
import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent;
public class AuthTotpDetails implements GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails {
public final String alg;
public final int maxKeyLength;
public AuthTotpDetails(String alg, int maxKeyLength) {
this.alg = alg;
this.maxKeyLength = maxKeyLength;
}
public AuthTotpDetails(String alg) {
this.alg = alg;
this.maxKeyLength = 6;
}
@Override
public String getType() {
return "totp";
}
}

View file

@ -0,0 +1,29 @@
package pro.gravit.launcher.request.auth.details;
import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent;
public class AuthWebViewDetails implements GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails {
public final String url;
public final String redirectUrl;
public final boolean canBrowser;
public final boolean onlyBrowser;
public AuthWebViewDetails(String url, String redirectUrl, boolean canBrowser, boolean onlyBrowser) {
this.url = url;
this.redirectUrl = redirectUrl;
this.canBrowser = canBrowser;
this.onlyBrowser = onlyBrowser;
}
public AuthWebViewDetails(String url, String redirectUrl) {
this.url = url;
this.redirectUrl = redirectUrl;
this.canBrowser = true;
this.onlyBrowser = false;
}
@Override
public String getType() {
return "webview";
}
}

View file

@ -14,6 +14,7 @@
import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.Request;
import pro.gravit.launcher.request.RequestException; import pro.gravit.launcher.request.RequestException;
import pro.gravit.launcher.request.auth.AuthRequest; import pro.gravit.launcher.request.auth.AuthRequest;
import pro.gravit.launcher.request.auth.GetAvailabilityAuthRequest;
import pro.gravit.launcher.request.update.ProfilesRequest; import pro.gravit.launcher.request.update.ProfilesRequest;
import pro.gravit.launcher.server.setup.ServerWrapperSetup; import pro.gravit.launcher.server.setup.ServerWrapperSetup;
import pro.gravit.utils.PublicURLClassLoader; import pro.gravit.utils.PublicURLClassLoader;
@ -127,6 +128,7 @@ public boolean loopAuth(int count, int sleeptime) {
public void run(String... args) throws Throwable { public void run(String... args) throws Throwable {
initGson(modulesManager); initGson(modulesManager);
AuthRequest.registerProviders(); AuthRequest.registerProviders();
GetAvailabilityAuthRequest.registerProviders();
OptionalAction.registerProviders(); OptionalAction.registerProviders();
if (args.length > 0 && args[0].equals("setup") && !disableSetup) { if (args.length > 0 && args[0].equals("setup") && !disableSetup) {
LogHelper.debug("Read ServerWrapperConfig.json"); LogHelper.debug("Read ServerWrapperConfig.json");