mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-11-15 19:49:11 +03:00
Compare commits
3 commits
4be299f6ca
...
2ed4abf9b0
Author | SHA1 | Date | |
---|---|---|---|
|
2ed4abf9b0 | ||
|
af2dcec8cd | ||
|
9bffe07d36 |
13 changed files with 235 additions and 107 deletions
|
@ -80,7 +80,6 @@ public final class LaunchServer implements Runnable, AutoCloseable, Reconfigurab
|
||||||
/**
|
/**
|
||||||
* The path to the folder with profiles
|
* The path to the folder with profiles
|
||||||
*/
|
*/
|
||||||
public final Path profilesDir;
|
|
||||||
public final Path tmpDir;
|
public final Path tmpDir;
|
||||||
public final Path modulesDir;
|
public final Path modulesDir;
|
||||||
public final Path launcherModulesDir;
|
public final Path launcherModulesDir;
|
||||||
|
@ -119,8 +118,6 @@ public final class LaunchServer implements Runnable, AutoCloseable, Reconfigurab
|
||||||
private final Logger logger = LogManager.getLogger();
|
private final Logger logger = LogManager.getLogger();
|
||||||
public final int shardId;
|
public final int shardId;
|
||||||
public LaunchServerConfig config;
|
public LaunchServerConfig config;
|
||||||
// Updates and profiles
|
|
||||||
private volatile Set<ClientProfile> profilesList;
|
|
||||||
|
|
||||||
public LaunchServer(LaunchServerDirectories directories, LaunchServerEnv env, LaunchServerConfig config, LaunchServerRuntimeConfig runtimeConfig, LaunchServerConfigManager launchServerConfigManager, LaunchServerModulesManager modulesManager, KeyAgreementManager keyAgreementManager, CommandHandler commandHandler, CertificateManager certificateManager, int shardId) throws IOException {
|
public LaunchServer(LaunchServerDirectories directories, LaunchServerEnv env, LaunchServerConfig config, LaunchServerRuntimeConfig runtimeConfig, LaunchServerConfigManager launchServerConfigManager, LaunchServerModulesManager modulesManager, KeyAgreementManager keyAgreementManager, CommandHandler commandHandler, CertificateManager certificateManager, int shardId) throws IOException {
|
||||||
this.dir = directories.dir;
|
this.dir = directories.dir;
|
||||||
|
@ -129,7 +126,6 @@ public LaunchServer(LaunchServerDirectories directories, LaunchServerEnv env, La
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.launchServerConfigManager = launchServerConfigManager;
|
this.launchServerConfigManager = launchServerConfigManager;
|
||||||
this.modulesManager = modulesManager;
|
this.modulesManager = modulesManager;
|
||||||
this.profilesDir = directories.profilesDir;
|
|
||||||
this.updatesDir = directories.updatesDir;
|
this.updatesDir = directories.updatesDir;
|
||||||
this.keyAgreementManager = keyAgreementManager;
|
this.keyAgreementManager = keyAgreementManager;
|
||||||
this.commandHandler = commandHandler;
|
this.commandHandler = commandHandler;
|
||||||
|
@ -326,12 +322,14 @@ public void close() throws Exception {
|
||||||
logger.info("LaunchServer stopped");
|
logger.info("LaunchServer stopped");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public Set<ClientProfile> getProfiles() {
|
public Set<ClientProfile> getProfiles() {
|
||||||
return profilesList;
|
return config.profileProvider.getProfiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public void setProfiles(Set<ClientProfile> profilesList) {
|
public void setProfiles(Set<ClientProfile> profilesList) {
|
||||||
this.profilesList = Collections.unmodifiableSet(profilesList);
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void rebindNettyServerSocket() {
|
public void rebindNettyServerSocket() {
|
||||||
|
@ -358,8 +356,6 @@ public void run() {
|
||||||
CommonHelper.newThread("Profiles and updates sync", true, () -> {
|
CommonHelper.newThread("Profiles and updates sync", true, () -> {
|
||||||
try {
|
try {
|
||||||
// Sync profiles dir
|
// Sync profiles dir
|
||||||
if (!IOHelper.isDir(profilesDir))
|
|
||||||
Files.createDirectory(profilesDir);
|
|
||||||
syncProfilesDir();
|
syncProfilesDir();
|
||||||
|
|
||||||
// Sync updates dir
|
// Sync updates dir
|
||||||
|
@ -402,12 +398,7 @@ public void syncLauncherBinaries() throws IOException {
|
||||||
|
|
||||||
public void syncProfilesDir() throws IOException {
|
public void syncProfilesDir() throws IOException {
|
||||||
logger.info("Syncing profiles dir");
|
logger.info("Syncing profiles dir");
|
||||||
List<ClientProfile> newProfies = new LinkedList<>();
|
config.profileProvider.sync();
|
||||||
IOHelper.walk(profilesDir, new ProfilesFileVisitor(newProfies), false);
|
|
||||||
|
|
||||||
// Sort and set new profiles
|
|
||||||
newProfies.sort(Comparator.comparing(a -> a));
|
|
||||||
profilesList = Set.copyOf(newProfies);
|
|
||||||
if (config.netty.sendProfileUpdatesEvent) {
|
if (config.netty.sendProfileUpdatesEvent) {
|
||||||
sendUpdateProfilesEvent();
|
sendUpdateProfilesEvent();
|
||||||
}
|
}
|
||||||
|
@ -422,7 +413,7 @@ private void sendUpdateProfilesEvent() {
|
||||||
if (client == null || !client.isAuth) {
|
if (client == null || !client.isAuth) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ProfilesRequestEvent event = new ProfilesRequestEvent(ProfilesResponse.getListVisibleProfiles(this, client));
|
ProfilesRequestEvent event = new ProfilesRequestEvent(config.profileProvider.getProfiles(client));
|
||||||
event.requestUUID = RequestEvent.eventUUID;
|
event.requestUUID = RequestEvent.eventUUID;
|
||||||
handler.service.sendObject(ch, event);
|
handler.service.sendObject(ch, event);
|
||||||
});
|
});
|
||||||
|
@ -468,38 +459,11 @@ public interface LaunchServerConfigManager {
|
||||||
void writeRuntimeConfig(LaunchServerRuntimeConfig config) throws IOException;
|
void writeRuntimeConfig(LaunchServerRuntimeConfig config) throws IOException;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class ProfilesFileVisitor extends SimpleFileVisitor<Path> {
|
|
||||||
private final Collection<ClientProfile> result;
|
|
||||||
private final Logger logger = LogManager.getLogger();
|
|
||||||
|
|
||||||
private ProfilesFileVisitor(Collection<ClientProfile> result) {
|
|
||||||
this.result = result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
|
||||||
logger.info("Syncing '{}' profile", IOHelper.getFileName(file));
|
|
||||||
|
|
||||||
// Read profile
|
|
||||||
ClientProfile profile;
|
|
||||||
try (BufferedReader reader = IOHelper.newReader(file)) {
|
|
||||||
profile = Launcher.gsonManager.gson.fromJson(reader, ClientProfile.class);
|
|
||||||
}
|
|
||||||
profile.verify();
|
|
||||||
profile.setProfileFilePath(file);
|
|
||||||
|
|
||||||
// Add SIGNED profile to result list
|
|
||||||
result.add(profile);
|
|
||||||
return super.visitFile(file, attrs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class LaunchServerDirectories {
|
public static class LaunchServerDirectories {
|
||||||
public static final String UPDATES_NAME = "updates", PROFILES_NAME = "profiles",
|
public static final String UPDATES_NAME = "updates",
|
||||||
TRUSTSTORE_NAME = "truststore", LAUNCHERLIBRARIES_NAME = "launcher-libraries",
|
TRUSTSTORE_NAME = "truststore", LAUNCHERLIBRARIES_NAME = "launcher-libraries",
|
||||||
LAUNCHERLIBRARIESCOMPILE_NAME = "launcher-libraries-compile", LAUNCHERPACK_NAME = "launcher-pack", KEY_NAME = ".keys", MODULES = "modules", LAUNCHER_MODULES = "launcher-modules", LIBRARIES = "libraries";
|
LAUNCHERLIBRARIESCOMPILE_NAME = "launcher-libraries-compile", LAUNCHERPACK_NAME = "launcher-pack", KEY_NAME = ".keys", MODULES = "modules", LAUNCHER_MODULES = "launcher-modules", LIBRARIES = "libraries";
|
||||||
public Path updatesDir;
|
public Path updatesDir;
|
||||||
public Path profilesDir;
|
|
||||||
public Path librariesDir;
|
public Path librariesDir;
|
||||||
public Path launcherLibrariesDir;
|
public Path launcherLibrariesDir;
|
||||||
public Path launcherLibrariesCompileDir;
|
public Path launcherLibrariesCompileDir;
|
||||||
|
@ -513,7 +477,6 @@ public static class LaunchServerDirectories {
|
||||||
|
|
||||||
public void collect() {
|
public void collect() {
|
||||||
if (updatesDir == null) updatesDir = getPath(UPDATES_NAME);
|
if (updatesDir == null) updatesDir = getPath(UPDATES_NAME);
|
||||||
if (profilesDir == null) profilesDir = getPath(PROFILES_NAME);
|
|
||||||
if (trustStore == null) trustStore = getPath(TRUSTSTORE_NAME);
|
if (trustStore == null) trustStore = getPath(TRUSTSTORE_NAME);
|
||||||
if (launcherLibrariesDir == null) launcherLibrariesDir = getPath(LAUNCHERLIBRARIES_NAME);
|
if (launcherLibrariesDir == null) launcherLibrariesDir = getPath(LAUNCHERLIBRARIES_NAME);
|
||||||
if (launcherLibrariesCompileDir == null)
|
if (launcherLibrariesCompileDir == null)
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
|
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
|
||||||
import pro.gravit.launchserver.auth.mix.MixProvider;
|
import pro.gravit.launchserver.auth.mix.MixProvider;
|
||||||
import pro.gravit.launchserver.auth.password.PasswordVerifier;
|
import pro.gravit.launchserver.auth.password.PasswordVerifier;
|
||||||
|
import pro.gravit.launchserver.auth.profiles.ProfileProvider;
|
||||||
import pro.gravit.launchserver.auth.protect.ProtectHandler;
|
import pro.gravit.launchserver.auth.protect.ProtectHandler;
|
||||||
import pro.gravit.launchserver.auth.texture.TextureProvider;
|
import pro.gravit.launchserver.auth.texture.TextureProvider;
|
||||||
import pro.gravit.launchserver.components.Component;
|
import pro.gravit.launchserver.components.Component;
|
||||||
|
@ -178,6 +179,7 @@ public static void registerAll() {
|
||||||
OptionalAction.registerProviders();
|
OptionalAction.registerProviders();
|
||||||
OptionalTrigger.registerProviders();
|
OptionalTrigger.registerProviders();
|
||||||
MixProvider.registerProviders();
|
MixProvider.registerProviders();
|
||||||
|
ProfileProvider.registerProviders();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void printExperimentalBranch() {
|
private static void printExperimentalBranch() {
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
package pro.gravit.launchserver.auth.profiles;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import pro.gravit.launcher.base.Launcher;
|
||||||
|
import pro.gravit.launcher.base.profiles.ClientProfile;
|
||||||
|
import pro.gravit.utils.helper.IOHelper;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.*;
|
||||||
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class LocalProfileProvider extends ProfileProvider {
|
||||||
|
public String profilesDir = "profiles";
|
||||||
|
private transient volatile Map<Path, ClientProfile> profilesMap;
|
||||||
|
private transient volatile Set<ClientProfile> profilesList; // Cache
|
||||||
|
@Override
|
||||||
|
public void sync() throws IOException {
|
||||||
|
Path profilesDirPath = Path.of(profilesDir);
|
||||||
|
if (!IOHelper.isDir(profilesDirPath))
|
||||||
|
Files.createDirectory(profilesDirPath);
|
||||||
|
Map<Path, ClientProfile> newProfiles = new HashMap<>();
|
||||||
|
IOHelper.walk(profilesDirPath, new ProfilesFileVisitor(newProfiles), false);
|
||||||
|
Set<ClientProfile> newProfilesList = new HashSet<>(newProfiles.values());
|
||||||
|
profilesMap = newProfiles;
|
||||||
|
profilesList = newProfilesList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<ClientProfile> getProfiles() {
|
||||||
|
return profilesList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addProfile(ClientProfile profile) throws IOException {
|
||||||
|
Path profilesDirPath = Path.of(profilesDir);
|
||||||
|
ClientProfile oldProfile;
|
||||||
|
Path target = null;
|
||||||
|
for(var e : profilesMap.entrySet()) {
|
||||||
|
if(e.getValue().getUUID().equals(profile.getUUID())) {
|
||||||
|
target = e.getKey();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(target == null) {
|
||||||
|
target = IOHelper.resolveIncremental(profilesDirPath,
|
||||||
|
profile.getTitle(), "json");
|
||||||
|
oldProfile = profilesMap.get(target);
|
||||||
|
if(oldProfile != null && !oldProfile.getUUID().equals(profile.getUUID())) {
|
||||||
|
throw new FileAlreadyExistsException(target.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try (BufferedWriter writer = IOHelper.newWriter(target)) {
|
||||||
|
Launcher.gsonManager.configGson.toJson(profile, writer);
|
||||||
|
}
|
||||||
|
addProfile(target, profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteProfile(ClientProfile profile) throws IOException {
|
||||||
|
for(var e : profilesMap.entrySet()) {
|
||||||
|
if(e.getValue().getUUID().equals(profile.getUUID())) {
|
||||||
|
Files.deleteIfExists(e.getKey());
|
||||||
|
profilesMap.remove(e.getKey());
|
||||||
|
profilesList.remove(e.getValue());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addProfile(Path path, ClientProfile profile) {
|
||||||
|
for(var e : profilesMap.entrySet()) {
|
||||||
|
if(e.getValue().getUUID().equals(profile.getUUID())) {
|
||||||
|
profilesMap.remove(e.getKey());
|
||||||
|
profilesList.remove(e.getValue());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
profilesMap.put(path, profile);
|
||||||
|
profilesList.add(profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class ProfilesFileVisitor extends SimpleFileVisitor<Path> {
|
||||||
|
private final Map<Path, ClientProfile> result;
|
||||||
|
private final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private ProfilesFileVisitor(Map<Path, ClientProfile> result) {
|
||||||
|
this.result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
||||||
|
logger.info("Syncing '{}' profile", IOHelper.getFileName(file));
|
||||||
|
|
||||||
|
// Read profile
|
||||||
|
ClientProfile profile;
|
||||||
|
try (BufferedReader reader = IOHelper.newReader(file)) {
|
||||||
|
profile = Launcher.gsonManager.gson.fromJson(reader, ClientProfile.class);
|
||||||
|
}
|
||||||
|
profile.verify();
|
||||||
|
|
||||||
|
// Add SIGNED profile to result list
|
||||||
|
result.put(file.toAbsolutePath(), profile);
|
||||||
|
return super.visitFile(file, attrs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
package pro.gravit.launchserver.auth.profiles;
|
||||||
|
|
||||||
|
import pro.gravit.launcher.base.profiles.ClientProfile;
|
||||||
|
import pro.gravit.launchserver.LaunchServer;
|
||||||
|
import pro.gravit.launchserver.auth.protect.interfaces.ProfilesProtectHandler;
|
||||||
|
import pro.gravit.launchserver.socket.Client;
|
||||||
|
import pro.gravit.utils.ProviderMap;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public abstract class ProfileProvider {
|
||||||
|
public static final ProviderMap<ProfileProvider> providers = new ProviderMap<>("ProfileProvider");
|
||||||
|
private static boolean registredProviders = false;
|
||||||
|
protected transient LaunchServer server;
|
||||||
|
|
||||||
|
public static void registerProviders() {
|
||||||
|
if (!registredProviders) {
|
||||||
|
providers.register("local", LocalProfileProvider.class);
|
||||||
|
registredProviders = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(LaunchServer server) {
|
||||||
|
this.server = server;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void sync() throws IOException;
|
||||||
|
|
||||||
|
public abstract Set<ClientProfile> getProfiles();
|
||||||
|
|
||||||
|
public abstract void addProfile(ClientProfile profile) throws IOException;
|
||||||
|
|
||||||
|
public abstract void deleteProfile(ClientProfile profile) throws IOException;
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ClientProfile getProfile(UUID uuid) {
|
||||||
|
for(var e : getProfiles()) {
|
||||||
|
if(e.getUUID().equals(uuid)) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ClientProfile getProfile(String title) {
|
||||||
|
for(var e : getProfiles()) {
|
||||||
|
if(e.getTitle().equals(title)) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ClientProfile> getProfiles(Client client) {
|
||||||
|
List<ClientProfile> profileList;
|
||||||
|
Set<ClientProfile> serverProfiles = getProfiles();
|
||||||
|
if (server.config.protectHandler instanceof ProfilesProtectHandler protectHandler) {
|
||||||
|
profileList = new ArrayList<>(4);
|
||||||
|
for (ClientProfile profile : serverProfiles) {
|
||||||
|
if (protectHandler.canGetProfile(profile, client)) {
|
||||||
|
profileList.add(profile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
profileList = List.copyOf(serverProfiles);
|
||||||
|
}
|
||||||
|
return profileList;
|
||||||
|
}
|
||||||
|
}
|
|
@ -97,10 +97,7 @@ public void invoke(String... args) throws IOException, CommandException {
|
||||||
isMirrorClientDownload = true;
|
isMirrorClientDownload = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try (BufferedWriter writer = IOHelper.newWriter(IOHelper.resolveIncremental(server.profilesDir,
|
server.config.profileProvider.addProfile(clientProfile);
|
||||||
dirName, "json"))) {
|
|
||||||
Launcher.gsonManager.configGson.toJson(clientProfile, writer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finished
|
// Finished
|
||||||
server.syncProfilesDir();
|
server.syncProfilesDir();
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
import pro.gravit.launcher.base.profiles.ClientProfileBuilder;
|
import pro.gravit.launcher.base.profiles.ClientProfileBuilder;
|
||||||
import pro.gravit.launchserver.LaunchServer;
|
import pro.gravit.launchserver.LaunchServer;
|
||||||
import pro.gravit.launchserver.command.Command;
|
import pro.gravit.launchserver.command.Command;
|
||||||
|
import pro.gravit.utils.helper.CommonHelper;
|
||||||
import pro.gravit.utils.helper.IOHelper;
|
import pro.gravit.utils.helper.IOHelper;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -26,7 +27,7 @@ public CloneProfileCommand(LaunchServer server) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getArgsDescription() {
|
public String getArgsDescription() {
|
||||||
return "[profile file name] [new profile title]";
|
return "[profile title/uuid] [new profile title]";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -37,13 +38,12 @@ public String getUsageDescription() {
|
||||||
@Override
|
@Override
|
||||||
public void invoke(String... args) throws Exception {
|
public void invoke(String... args) throws Exception {
|
||||||
verifyArgs(args, 2);
|
verifyArgs(args, 2);
|
||||||
var profilePath = server.profilesDir.resolve(args[0].concat(".json"));
|
|
||||||
if(!Files.exists(profilePath)) {
|
|
||||||
logger.error("File {} not found", profilePath);
|
|
||||||
}
|
|
||||||
ClientProfile profile;
|
ClientProfile profile;
|
||||||
try(Reader reader = IOHelper.newReader(profilePath)) {
|
try {
|
||||||
profile = Launcher.gsonManager.gson.fromJson(reader, ClientProfile.class);
|
UUID uuid = UUID.fromString(args[0]);
|
||||||
|
profile = server.config.profileProvider.getProfile(uuid);
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
profile = server.config.profileProvider.getProfile(args[0]);
|
||||||
}
|
}
|
||||||
var builder = new ClientProfileBuilder(profile);
|
var builder = new ClientProfileBuilder(profile);
|
||||||
builder.setTitle(args[1]);
|
builder.setTitle(args[1]);
|
||||||
|
@ -65,10 +65,7 @@ public void invoke(String... args) throws Exception {
|
||||||
}
|
}
|
||||||
builder.setDir(args[1]);
|
builder.setDir(args[1]);
|
||||||
profile = builder.createClientProfile();
|
profile = builder.createClientProfile();
|
||||||
var targetPath = server.profilesDir.resolve(args[1].concat(".json"));
|
server.config.profileProvider.addProfile(profile);
|
||||||
try(Writer writer = IOHelper.newWriter(targetPath)) {
|
|
||||||
Launcher.gsonManager.gson.toJson(profile, writer);
|
|
||||||
}
|
|
||||||
logger.info("Profile {} cloned from {}", args[1], args[0]);
|
logger.info("Profile {} cloned from {}", args[1], args[0]);
|
||||||
server.syncProfilesDir();
|
server.syncProfilesDir();
|
||||||
server.syncUpdatesDir(List.of(args[1]));
|
server.syncUpdatesDir(List.of(args[1]));
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
import pro.gravit.utils.helper.IOHelper;
|
import pro.gravit.utils.helper.IOHelper;
|
||||||
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public class DeleteProfileCommand extends Command {
|
public class DeleteProfileCommand extends Command {
|
||||||
private final transient Logger logger = LogManager.getLogger(ListProfilesCommand.class);
|
private final transient Logger logger = LogManager.getLogger(ListProfilesCommand.class);
|
||||||
|
@ -28,12 +29,12 @@ public String getUsageDescription() {
|
||||||
@Override
|
@Override
|
||||||
public void invoke(String... args) throws Exception {
|
public void invoke(String... args) throws Exception {
|
||||||
verifyArgs(args, 1);
|
verifyArgs(args, 1);
|
||||||
ClientProfile profile = null;
|
ClientProfile profile;
|
||||||
for(var p : server.getProfiles()) {
|
try {
|
||||||
if(p.getUUID().toString().equals(args[0]) || p.getTitle().equals(args[0])) {
|
UUID uuid = UUID.fromString(args[0]);
|
||||||
profile = p;
|
profile = server.config.profileProvider.getProfile(uuid);
|
||||||
break;
|
} catch (IllegalArgumentException ex) {
|
||||||
}
|
profile = server.config.profileProvider.getProfile(args[0]);
|
||||||
}
|
}
|
||||||
if(profile == null) {
|
if(profile == null) {
|
||||||
logger.error("Profile {} not found", args[0]);
|
logger.error("Profile {} not found", args[0]);
|
||||||
|
@ -44,13 +45,9 @@ public void invoke(String... args) throws Exception {
|
||||||
if(!showApplyDialog("Continue?")) {
|
if(!showApplyDialog("Continue?")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
logger.info("Delete {} ({})", profile.getTitle(), profile.getUUID());
|
||||||
|
server.config.profileProvider.deleteProfile(profile);
|
||||||
logger.info("Delete {}", clientDir);
|
logger.info("Delete {}", clientDir);
|
||||||
IOHelper.deleteDir(clientDir, true);
|
IOHelper.deleteDir(clientDir, true);
|
||||||
var profileFile = profile.getProfileFilePath();
|
|
||||||
if(profileFile == null) {
|
|
||||||
profileFile = server.profilesDir.resolve(profile.getTitle().concat(".json"));
|
|
||||||
}
|
|
||||||
logger.info("Delete {}", profileFile);
|
|
||||||
Files.deleteIfExists(profileFile);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,9 +37,7 @@ public void invoke(String... args) throws Exception {
|
||||||
logger.info("Detected option {}", option);
|
logger.info("Detected option {}", option);
|
||||||
}
|
}
|
||||||
ClientProfile profile = MakeProfileHelper.makeProfile(version, args[0], options);
|
ClientProfile profile = MakeProfileHelper.makeProfile(version, args[0], options);
|
||||||
try (Writer writer = IOHelper.newWriter(server.profilesDir.resolve(args[0].concat(".json")))) {
|
server.config.profileProvider.addProfile(profile);
|
||||||
Launcher.gsonManager.configGson.toJson(profile, writer);
|
|
||||||
}
|
|
||||||
logger.info("Profile {} created", args[0]);
|
logger.info("Profile {} created", args[0]);
|
||||||
server.syncProfilesDir();
|
server.syncProfilesDir();
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,20 +22,6 @@ public SaveProfilesCommand(LaunchServer server) {
|
||||||
super(server);
|
super(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveProfile(ClientProfile profile, Path path) throws IOException {
|
|
||||||
if (profile.getServers().isEmpty()) {
|
|
||||||
ClientProfile.ServerProfile serverProfile = new ClientProfile.ServerProfile();
|
|
||||||
serverProfile.isDefault = true;
|
|
||||||
serverProfile.name = profile.getTitle();
|
|
||||||
serverProfile.serverAddress = profile.getServerAddress();
|
|
||||||
serverProfile.serverPort = profile.getServerPort();
|
|
||||||
profile.getServers().add(serverProfile);
|
|
||||||
}
|
|
||||||
try (Writer w = IOHelper.newWriter(path)) {
|
|
||||||
Launcher.gsonManager.configGson.toJson(profile, w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getArgsDescription() {
|
public String getArgsDescription() {
|
||||||
return "[profile names...]";
|
return "[profile names...]";
|
||||||
|
@ -51,17 +37,14 @@ public void invoke(String... args) throws Exception {
|
||||||
verifyArgs(args, 1);
|
verifyArgs(args, 1);
|
||||||
if (args.length > 0) {
|
if (args.length > 0) {
|
||||||
for (String profileName : args) {
|
for (String profileName : args) {
|
||||||
Path profilePath = server.profilesDir.resolve(profileName.concat(".json"));
|
|
||||||
if (!Files.exists(profilePath)) {
|
|
||||||
logger.error("Profile {} not found", profilePath.toString());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ClientProfile profile;
|
ClientProfile profile;
|
||||||
try (Reader reader = IOHelper.newReader(profilePath)) {
|
try {
|
||||||
profile = Launcher.gsonManager.configGson.fromJson(reader, ClientProfile.class);
|
UUID uuid = UUID.fromString(profileName);
|
||||||
|
profile = server.config.profileProvider.getProfile(uuid);
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
profile = server.config.profileProvider.getProfile(profileName);
|
||||||
}
|
}
|
||||||
saveProfile(profile, profilePath);
|
server.config.profileProvider.addProfile(profile);
|
||||||
logger.info("Profile {} save successful", profilePath.toString());
|
|
||||||
}
|
}
|
||||||
server.syncProfilesDir();
|
server.syncProfilesDir();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
import pro.gravit.launchserver.LaunchServer;
|
import pro.gravit.launchserver.LaunchServer;
|
||||||
import pro.gravit.launchserver.auth.AuthProviderPair;
|
import pro.gravit.launchserver.auth.AuthProviderPair;
|
||||||
import pro.gravit.launchserver.auth.core.RejectAuthCoreProvider;
|
import pro.gravit.launchserver.auth.core.RejectAuthCoreProvider;
|
||||||
|
import pro.gravit.launchserver.auth.profiles.LocalProfileProvider;
|
||||||
|
import pro.gravit.launchserver.auth.profiles.ProfileProvider;
|
||||||
import pro.gravit.launchserver.auth.protect.ProtectHandler;
|
import pro.gravit.launchserver.auth.protect.ProtectHandler;
|
||||||
import pro.gravit.launchserver.auth.protect.StdProtectHandler;
|
import pro.gravit.launchserver.auth.protect.StdProtectHandler;
|
||||||
import pro.gravit.launchserver.auth.texture.RequestTextureProvider;
|
import pro.gravit.launchserver.auth.texture.RequestTextureProvider;
|
||||||
|
@ -36,6 +38,7 @@ public final class LaunchServerConfig {
|
||||||
// Handlers & Providers
|
// Handlers & Providers
|
||||||
public ProtectHandler protectHandler;
|
public ProtectHandler protectHandler;
|
||||||
public Map<String, Component> components;
|
public Map<String, Component> components;
|
||||||
|
public ProfileProvider profileProvider = new LocalProfileProvider();
|
||||||
public NettyConfig netty;
|
public NettyConfig netty;
|
||||||
public LauncherConf launcher;
|
public LauncherConf launcher;
|
||||||
public JarSignerConf sign;
|
public JarSignerConf sign;
|
||||||
|
@ -85,6 +88,7 @@ public static LaunchServerConfig getDefault(LaunchServer.LaunchServerEnv env) {
|
||||||
newConfig.components.put("authLimiter", authLimiterComponent);
|
newConfig.components.put("authLimiter", authLimiterComponent);
|
||||||
ProGuardComponent proGuardComponent = new ProGuardComponent();
|
ProGuardComponent proGuardComponent = new ProGuardComponent();
|
||||||
newConfig.components.put("proguard", proGuardComponent);
|
newConfig.components.put("proguard", proGuardComponent);
|
||||||
|
newConfig.profileProvider = new LocalProfileProvider();
|
||||||
return newConfig;
|
return newConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,6 +170,10 @@ public void init(LaunchServer.ReloadType type) {
|
||||||
server.registerObject("protectHandler", protectHandler);
|
server.registerObject("protectHandler", protectHandler);
|
||||||
protectHandler.init(server);
|
protectHandler.init(server);
|
||||||
}
|
}
|
||||||
|
if(profileProvider != null) {
|
||||||
|
server.registerObject("profileProvider", profileProvider);
|
||||||
|
profileProvider.init(server);
|
||||||
|
}
|
||||||
if (components != null) {
|
if (components != null) {
|
||||||
components.forEach((k, v) -> server.registerObject("component.".concat(k), v));
|
components.forEach((k, v) -> server.registerObject("component.".concat(k), v));
|
||||||
}
|
}
|
||||||
|
@ -206,6 +214,10 @@ public void close(LaunchServer.ReloadType type) {
|
||||||
server.unregisterObject("protectHandler", protectHandler);
|
server.unregisterObject("protectHandler", protectHandler);
|
||||||
protectHandler.close();
|
protectHandler.close();
|
||||||
}
|
}
|
||||||
|
if(profileProvider != null) {
|
||||||
|
server.unregisterObject("profileProvider", profileProvider);
|
||||||
|
profileProvider.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class JarSignerConf {
|
public static class JarSignerConf {
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
|
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
|
||||||
import pro.gravit.launchserver.auth.mix.MixProvider;
|
import pro.gravit.launchserver.auth.mix.MixProvider;
|
||||||
import pro.gravit.launchserver.auth.password.PasswordVerifier;
|
import pro.gravit.launchserver.auth.password.PasswordVerifier;
|
||||||
|
import pro.gravit.launchserver.auth.profiles.ProfileProvider;
|
||||||
import pro.gravit.launchserver.auth.protect.ProtectHandler;
|
import pro.gravit.launchserver.auth.protect.ProtectHandler;
|
||||||
import pro.gravit.launchserver.auth.texture.TextureProvider;
|
import pro.gravit.launchserver.auth.texture.TextureProvider;
|
||||||
import pro.gravit.launchserver.components.Component;
|
import pro.gravit.launchserver.components.Component;
|
||||||
|
@ -46,6 +47,7 @@ public void registerAdapters(GsonBuilder builder) {
|
||||||
builder.registerTypeAdapter(OptionalAction.class, new UniversalJsonAdapter<>(OptionalAction.providers));
|
builder.registerTypeAdapter(OptionalAction.class, new UniversalJsonAdapter<>(OptionalAction.providers));
|
||||||
builder.registerTypeAdapter(OptionalTrigger.class, new UniversalJsonAdapter<>(OptionalTrigger.providers));
|
builder.registerTypeAdapter(OptionalTrigger.class, new UniversalJsonAdapter<>(OptionalTrigger.providers));
|
||||||
builder.registerTypeAdapter(MixProvider.class, new UniversalJsonAdapter<>(MixProvider.providers));
|
builder.registerTypeAdapter(MixProvider.class, new UniversalJsonAdapter<>(MixProvider.providers));
|
||||||
|
builder.registerTypeAdapter(ProfileProvider.class, new UniversalJsonAdapter<>(ProfileProvider.providers));
|
||||||
modulesManager.invokeEvent(new PreGsonPhase(builder));
|
modulesManager.invokeEvent(new PreGsonPhase(builder));
|
||||||
//ClientWebSocketService.appendTypeAdapters(builder);
|
//ClientWebSocketService.appendTypeAdapters(builder);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class ProfilesResponse extends SimpleResponse {
|
public class ProfilesResponse extends SimpleResponse {
|
||||||
|
@Deprecated
|
||||||
public static List<ClientProfile> getListVisibleProfiles(LaunchServer server, Client client) {
|
public static List<ClientProfile> getListVisibleProfiles(LaunchServer server, Client client) {
|
||||||
List<ClientProfile> profileList;
|
List<ClientProfile> profileList;
|
||||||
Set<ClientProfile> serverProfiles = server.getProfiles();
|
Set<ClientProfile> serverProfiles = server.getProfiles();
|
||||||
|
@ -40,6 +41,6 @@ public void execute(ChannelHandlerContext ctx, Client client) {
|
||||||
sendError("Access denied");
|
sendError("Access denied");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sendResult(new ProfilesRequestEvent(getListVisibleProfiles(server, client)));
|
sendResult(new ProfilesRequestEvent(server.config.profileProvider.getProfiles(client)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
public final class ClientProfile implements Comparable<ClientProfile> {
|
public final class ClientProfile implements Comparable<ClientProfile> {
|
||||||
private static final FileNameMatcher ASSET_MATCHER = new FileNameMatcher(
|
private static final FileNameMatcher ASSET_MATCHER = new FileNameMatcher(
|
||||||
new String[0], new String[]{"indexes", "objects"}, new String[0]);
|
new String[0], new String[]{"indexes", "objects"}, new String[0]);
|
||||||
private transient Path profileFilePath;
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
private String title;
|
private String title;
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
|
@ -392,14 +391,6 @@ public List<CompatibilityFlags> getFlags() {
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Path getProfileFilePath() {
|
|
||||||
return profileFilePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProfileFilePath(Path profileFilePath) {
|
|
||||||
this.profileFilePath = profileFilePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum ClassLoaderConfig {
|
public enum ClassLoaderConfig {
|
||||||
AGENT, LAUNCHER, MODULE, SYSTEM_ARGS
|
AGENT, LAUNCHER, MODULE, SYSTEM_ARGS
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue