Чистка LauncherAPI

This commit is contained in:
Gravit 2018-10-13 15:01:10 +07:00
parent bae9a511bc
commit 311fee0443
No known key found for this signature in database
GPG key ID: 061981E1E85D3216
28 changed files with 182 additions and 186 deletions

View file

@ -68,39 +68,39 @@
public final class LaunchServer implements Runnable, AutoCloseable {
public static final class Config extends ConfigObject {
@LauncherAPI
public final int port;
// Handlers & Providers
@LauncherAPI
public final AuthHandler[] authHandler;
@LauncherAPI
public final AuthProvider[] authProvider;
@LauncherAPI
public final TextureProvider textureProvider;
@LauncherAPI
public final HWIDHandler hwidHandler;
// Misc options
@LauncherAPI
public final ExeConf launch4j;
@LauncherAPI
public final SignConf sign;
@LauncherAPI
public final boolean compress;
@LauncherAPI
public final int authRateLimit;
@LauncherAPI
public final int authRateLimitMilis;
@LauncherAPI
public final String authRejectString;
@LauncherAPI
public final String projectName;
@LauncherAPI
public final String whitelistRejectString;
@LauncherAPI
public final boolean genMappings;
@LauncherAPI
public final String binaryName;
private final StringConfigEntry address;
private final String bindAddress;
@ -143,27 +143,27 @@ private Config(BlockConfigEntry block, Path coredir,LaunchServer server) {
compress = block.getEntryValue("compress", BooleanConfigEntry.class);
}
@LauncherAPI
public String getAddress() {
return address.getValue();
}
@LauncherAPI
public String getBindAddress() {
return bindAddress;
}
@LauncherAPI
public SocketAddress getSocketAddress() {
return new InetSocketAddress(bindAddress, port);
}
@LauncherAPI
public void setAddress(String address) {
this.address.setValue(address);
}
@LauncherAPI
public void verify() {
VerifyHelper.verify(getAddress(), VerifyHelper.NOT_EMPTY, "LaunchServer address can't be empty");
}
@ -276,53 +276,53 @@ public static void main(String... args) throws Throwable {
}
// Constant paths
@LauncherAPI
public final Path dir;
@LauncherAPI
public final Path configFile;
@LauncherAPI
public final Path publicKeyFile;
@LauncherAPI
public final Path privateKeyFile;
@LauncherAPI
public final Path updatesDir;
public static LaunchServer server;
@LauncherAPI
public final Path profilesDir;
// Server config
@LauncherAPI
public final Config config;
@LauncherAPI
public final RSAPublicKey publicKey;
@LauncherAPI
public final RSAPrivateKey privateKey;
@LauncherAPI
public final boolean portable;
// Launcher binary
@LauncherAPI
public final LauncherBinary launcherBinary;
@LauncherAPI
public final LauncherBinary launcherEXEBinary;
// HWID ban + anti-brutforce
@LauncherAPI
public final AuthLimiter limiter;
@LauncherAPI
public final SessionManager sessionManager;
// Server
@LauncherAPI
public final ModulesManager modulesManager;
@LauncherAPI
public final BuildHookManager buildHookManager;
@LauncherAPI
public final ProguardConf proguardConf;
@LauncherAPI
public final CommandHandler commandHandler;
@LauncherAPI
public final ServerSocketHandler serverSocketHandler;
private final AtomicBoolean started = new AtomicBoolean(false);
@ -445,7 +445,7 @@ private LauncherBinary binary() {
return new EXELauncherBinary(this);
}
@LauncherAPI
public void buildLauncherBinaries() throws IOException {
launcherBinary.build();
launcherEXEBinary.build();
@ -504,23 +504,23 @@ private void generateConfigIfNotExists() throws IOException {
}
}
@LauncherAPI
@SuppressWarnings("ReturnOfCollectionOrArrayField")
public Collection<SignedObjectHolder<ClientProfile>> getProfiles() {
return profilesList;
}
@LauncherAPI
public SignedObjectHolder<HashedDir> getUpdateDir(String name) {
return updatesDirMap.get(name);
}
@LauncherAPI
public Set<Entry<String, SignedObjectHolder<HashedDir>>> getUpdateDirs() {
return updatesDirMap.entrySet();
}
@LauncherAPI
public void rebindServerSocket() {
serverSocketHandler.close();
CommonHelper.newThread("Server Socket Thread", false, serverSocketHandler).start();
@ -539,7 +539,7 @@ public void run() {
rebindServerSocket();
}
@LauncherAPI
public void syncLauncherBinaries() throws IOException {
LogHelper.info("Syncing launcher binaries");
@ -554,7 +554,7 @@ public void syncLauncherBinaries() throws IOException {
}
@LauncherAPI
public void syncProfilesDir() throws IOException {
LogHelper.info("Syncing profiles dir");
List<SignedObjectHolder<ClientProfile>> newProfies = new LinkedList<>();
@ -565,7 +565,7 @@ public void syncProfilesDir() throws IOException {
profilesList = Collections.unmodifiableList(newProfies);
}
@LauncherAPI
public void syncUpdatesDir(Collection<String> dirs) throws IOException {
LogHelper.info("Syncing updates dir");
Map<String, SignedObjectHolder<HashedDir>> newUpdatesDirMap = new HashMap<>(16);

View file

@ -7,7 +7,7 @@
public final class AuthException extends IOException {
private static final long serialVersionUID = -2586107832847245863L;
@LauncherAPI
public AuthException(String message) {
super(message);
}

View file

@ -46,7 +46,7 @@ public String toString() {
}
}
@LauncherAPI
public static final long TIMEOUT = 10 * 60 * 1000; //10 минут
public final int rateLimit;
public final int rateLimitMilis;

View file

@ -19,7 +19,7 @@
import ru.gravit.launcher.serialize.config.entry.StringConfigEntry;
public final class MySQLSourceConfig extends ConfigObject implements AutoCloseable {
@LauncherAPI
public static final int TIMEOUT = VerifyHelper.verifyInt(
Integer.parseUnsignedInt(System.getProperty("launcher.mysql.idleTimeout", Integer.toString(5000))),
VerifyHelper.POSITIVE, "launcher.mysql.idleTimeout can't be <= 5000");
@ -44,7 +44,7 @@ public final class MySQLSourceConfig extends ConfigObject implements AutoCloseab
private DataSource source;
private boolean hikari;
@LauncherAPI
public MySQLSourceConfig(String poolName, BlockConfigEntry block) {
super(block);
this.poolName = poolName;
@ -70,7 +70,7 @@ public synchronized void close() {
((HikariDataSource) source).close();
}
@LauncherAPI
public synchronized Connection getConnection() throws SQLException {
if (source == null) { // New data source
MysqlDataSource mysqlSource = new MysqlDataSource();

View file

@ -17,19 +17,19 @@ public abstract class AuthHandler extends ConfigObject implements AutoCloseable
private static final Map<String, Adapter<AuthHandler>> AUTH_HANDLERS = new ConcurrentHashMap<>(4);
private static boolean registredHandl = false;
@LauncherAPI
public static UUID authError(String message) throws AuthException {
throw new AuthException(message);
}
@LauncherAPI
public static AuthHandler newHandler(String name, BlockConfigEntry block) {
Adapter<AuthHandler> authHandlerAdapter = VerifyHelper.getMapValue(AUTH_HANDLERS, name,
String.format("Unknown auth handler: '%s'", name));
return authHandlerAdapter.convert(block);
}
@LauncherAPI
public static void registerHandler(String name, Adapter<AuthHandler> adapter) {
VerifyHelper.verifyIDName(name);
VerifyHelper.putIfAbsent(AUTH_HANDLERS, name, Objects.requireNonNull(adapter, "adapter"),
@ -50,26 +50,26 @@ public static void registerHandlers() {
}
}
@LauncherAPI
protected AuthHandler(BlockConfigEntry block) {
super(block);
}
@LauncherAPI
public abstract UUID auth(AuthProviderResult authResult) throws IOException;
@LauncherAPI
public abstract UUID checkServer(String username, String serverID) throws IOException;
@Override
public abstract void close() throws IOException;
@LauncherAPI
public abstract boolean joinServer(String username, String accessToken, String serverID) throws IOException;
@LauncherAPI
public abstract UUID usernameToUUID(String username) throws IOException;
@LauncherAPI
public abstract String uuidToUsername(UUID uuid) throws IOException;
}

View file

@ -18,13 +18,13 @@
public abstract class CachedAuthHandler extends AuthHandler implements NeedGarbageCollection {
public static final class Entry {
@LauncherAPI
public final UUID uuid;
private String username;
private String accessToken;
private String serverID;
@LauncherAPI
public Entry(UUID uuid, String username, String accessToken, String serverID) {
this.uuid = Objects.requireNonNull(uuid, "uuid");
this.username = Objects.requireNonNull(username, "username");
@ -37,14 +37,14 @@ public Entry(UUID uuid, String username, String accessToken, String serverID) {
private final Map<String, UUID> usernamesCache = new HashMap<>(1024);
@LauncherAPI
protected CachedAuthHandler(BlockConfigEntry block) {
super(block);
if (block.hasEntry("garbage"))
if (block.getEntryValue("garbage", BooleanConfigEntry.class)) GarbageManager.registerNeedGC(this);
}
@LauncherAPI
protected void addEntry(Entry entry) {
Entry previous = entryCache.put(entry.uuid, entry);
if (previous != null)
@ -72,10 +72,10 @@ public synchronized UUID checkServer(String username, String serverID) throws IO
serverID.equals(entry.serverID) ? entry.uuid : null;
}
@LauncherAPI
protected abstract Entry fetchEntry(String username) throws IOException;
@LauncherAPI
protected abstract Entry fetchEntry(UUID uuid) throws IOException;
private Entry getEntry(String username) throws IOException {
@ -118,10 +118,10 @@ public synchronized void garbageCollection() {
entryCache.clear();
}
@LauncherAPI
protected abstract boolean updateAuth(UUID uuid, String username, String accessToken) throws IOException;
@LauncherAPI
protected abstract boolean updateServerID(UUID uuid, String serverID) throws IOException;
@Override

View file

@ -31,7 +31,7 @@ public static final class Entry extends StreamObject {
private String accessToken;
private String serverID;
@LauncherAPI
public Entry(HInput input) throws IOException {
username = VerifyHelper.verifyUsername(input.readString(64));
if (input.readBoolean()) {
@ -41,12 +41,12 @@ public Entry(HInput input) throws IOException {
}
}
@LauncherAPI
public Entry(String username) {
this.username = VerifyHelper.verifyUsername(username);
}
@LauncherAPI
public Entry(String username, String accessToken, String serverID) {
this(username);
if (accessToken == null && serverID != null)
@ -67,17 +67,17 @@ private boolean checkServer(String username, String serverID) {
return username.equals(this.username) && serverID.equals(this.serverID);
}
@LauncherAPI
public String getAccessToken() {
return accessToken;
}
@LauncherAPI
public String getServerID() {
return serverID;
}
@LauncherAPI
public String getUsername() {
return username;
}
@ -104,12 +104,12 @@ public void write(HOutput output) throws IOException {
}
}
@LauncherAPI
public final Path file;
@LauncherAPI
public final Path fileTmp;
@LauncherAPI
public final boolean offlineUUIDs;
// Instance
private final SecureRandom random = SecurityHelper.newRandom();
@ -120,7 +120,7 @@ public void write(HOutput output) throws IOException {
private final Map<String, UUID> usernamesMap = new HashMap<>(256);
@LauncherAPI
protected FileAuthHandler(BlockConfigEntry block) {
super(block);
file = IOHelper.toPath(block.getEntryValue("file", StringConfigEntry.class));
@ -138,7 +138,7 @@ protected FileAuthHandler(BlockConfigEntry block) {
}
}
@LauncherAPI
protected final void addAuth(UUID uuid, Entry entry) {
lock.writeLock().lock();
try {
@ -202,7 +202,7 @@ public final void close() throws IOException {
}
}
@LauncherAPI
protected final Set<Map.Entry<UUID, Entry>> entrySet() {
return Collections.unmodifiableMap(entryMap).entrySet();
}
@ -234,7 +234,7 @@ public final boolean joinServer(String username, String accessToken, String serv
}
}
@LauncherAPI
protected abstract void readAuthFile() throws IOException;
@Override
@ -258,6 +258,6 @@ public final String uuidToUsername(UUID uuid) {
}
}
@LauncherAPI
protected abstract void writeAuthFileTmp() throws IOException;
}

View file

@ -42,7 +42,7 @@ public boolean joinServer(String username, String accessToken, String serverID)
return getHandler().joinServer(username, accessToken, serverID);
}
@LauncherAPI
public void setBackend(AuthHandler handler) {
this.handler = handler;
}

View file

@ -15,14 +15,14 @@ public abstract class HWIDHandler extends ConfigObject implements AutoCloseable
public static final HWID nullHWID = HWID.gen(0, 0, 0);
private static boolean registredHandl = false;
@LauncherAPI
public static HWIDHandler newHandler(String name, BlockConfigEntry block) {
Adapter<HWIDHandler> authHandlerAdapter = VerifyHelper.getMapValue(HW_HANDLERS, name,
String.format("Unknown HWID handler: '%s'", name));
return authHandlerAdapter.convert(block);
}
@LauncherAPI
public static void registerHandler(String name, Adapter<HWIDHandler> adapter) {
VerifyHelper.verifyIDName(name);
VerifyHelper.putIfAbsent(HW_HANDLERS, name, Objects.requireNonNull(adapter, "adapter"),

View file

@ -18,12 +18,12 @@ public abstract class AuthProvider extends ConfigObject implements AutoCloseable
private static boolean registredProv = false;
private LaunchServer server;
@LauncherAPI
public static AuthProviderResult authError(String message) throws AuthException {
throw new AuthException(message);
}
@LauncherAPI
public static AuthProvider newProvider(String name, BlockConfigEntry block,LaunchServer server) {
VerifyHelper.verifyIDName(name);
ServerAdapter<AuthProvider> authHandlerAdapter = VerifyHelper.getMapValue(AUTH_PROVIDERS, name,
@ -31,7 +31,7 @@ public static AuthProvider newProvider(String name, BlockConfigEntry block,Launc
return authHandlerAdapter.convert(block,server);
}
@LauncherAPI
public static void registerProvider(String name, ServerAdapter<AuthProvider> adapter) {
VerifyHelper.putIfAbsent(AUTH_PROVIDERS, name, Objects.requireNonNull(adapter, "adapter"),
String.format("Auth provider has been already registered: '%s'", name));
@ -57,20 +57,20 @@ public AuthHandler getAccociateHandler(int this_position)
return server.config.authHandler[this_position];
}
@LauncherAPI
protected AuthProvider(BlockConfigEntry block, LaunchServer launchServer) {
super(block);
server = launchServer;
}
@LauncherAPI
public abstract AuthProviderResult auth(String login, String password, String ip) throws Exception;
@Override
public abstract void close() throws IOException;
@FunctionalInterface
public interface ServerAdapter<O extends ConfigObject> {
@LauncherAPI
O convert(BlockConfigEntry entry,LaunchServer server);
}
}

View file

@ -11,13 +11,13 @@
public abstract class DigestAuthProvider extends AuthProvider {
private final DigestAlgorithm digest;
@LauncherAPI
protected DigestAuthProvider(BlockConfigEntry block, LaunchServer server) {
super(block,server);
digest = DigestAlgorithm.byName(block.getEntryValue("digest", StringConfigEntry.class));
}
@LauncherAPI
protected final void verifyDigest(String validDigest, String password) throws AuthException {
boolean valid;
if (digest == DigestAlgorithm.PLAIN)

View file

@ -31,7 +31,7 @@ private AuthProvider getProvider() {
return VerifyHelper.verify(provider, Objects::nonNull, "Backend auth provider wasn't set");
}
@LauncherAPI
public void setBackend(AuthProvider provider) {
this.provider = provider;
}

View file

@ -39,7 +39,7 @@ public void clear() {
// File constants
private final Path faviconFile;
@LauncherAPI
public EXEL4JLauncherBinary(LaunchServer server) {
super(server, server.dir.resolve(server.config.binaryName + ".exe"));
faviconFile = server.dir.resolve("favicon.ico");

View file

@ -71,17 +71,17 @@ private static ZipEntry newEntry(String fileName) {
return newZipEntry(Launcher.RUNTIME_DIR + IOHelper.CROSS_SEPARATOR + fileName);
}
@LauncherAPI
public final Path runtimeDir;
public final Path guardDir;
@LauncherAPI
public final Path initScriptFile;
@LauncherAPI
public final Path obfJar;
@LauncherAPI
public JARLauncherBinary(LaunchServer server) throws IOException {
super(server, server.dir.resolve(server.config.binaryName + ".jar"),
server.dir.resolve(server.config.binaryName + (server.config.sign.enabled ? "-sign.jar" : "-obf.jar")));
@ -252,7 +252,7 @@ private void stdBuild() throws IOException {
}
}
@LauncherAPI
public void tryUnpackRuntime() throws IOException {
// Verify is runtime dir unpacked
if (IOHelper.isDir(runtimeDir))
@ -271,7 +271,7 @@ public void tryUnpackRuntime() throws IOException {
}
}
}
@LauncherAPI
public void tryUnpackGuard() throws IOException {
// Verify is runtime dir unpacked
if (IOHelper.isDir(guardDir))

View file

@ -10,46 +10,46 @@
import ru.gravit.utils.helper.SecurityHelper;
public abstract class LauncherBinary {
@LauncherAPI
protected final LaunchServer server;
@LauncherAPI
protected final Path binaryFile;
protected final Path syncBinaryFile;
private volatile SignedBytesHolder binary;
private volatile byte[] hash;
@LauncherAPI
protected LauncherBinary(LaunchServer server, Path binaryFile) {
this.server = server;
this.binaryFile = binaryFile;
syncBinaryFile = binaryFile;
}
@LauncherAPI
protected LauncherBinary(LaunchServer server, Path binaryFile, Path syncBinaryFile) {
this.server = server;
this.binaryFile = binaryFile;
this.syncBinaryFile = syncBinaryFile;
}
@LauncherAPI
public abstract void build() throws IOException;
@LauncherAPI
public final boolean exists() {
return IOHelper.isFile(syncBinaryFile);
}
@LauncherAPI
public final SignedBytesHolder getBytes() {
return binary;
}
@LauncherAPI
public final byte[] getHash() {
return hash;
}
@LauncherAPI
public final boolean sync() throws IOException {
boolean exists = exists();
binary = exists ? new SignedBytesHolder(IOHelper.read(syncBinaryFile), server.privateKey) : null;

View file

@ -7,7 +7,7 @@
import ru.gravit.launchserver.LaunchServer;
public abstract class Command {
@LauncherAPI
protected static String parseUsername(String username) throws CommandException {
try {
return VerifyHelper.verifyUsername(username);
@ -16,7 +16,7 @@ protected static String parseUsername(String username) throws CommandException {
}
}
@LauncherAPI
protected static UUID parseUUID(String s) throws CommandException {
try {
return UUID.fromString(s);
@ -25,24 +25,24 @@ protected static UUID parseUUID(String s) throws CommandException {
}
}
@LauncherAPI
protected final LaunchServer server;
@LauncherAPI
protected Command(LaunchServer server) {
this.server = server;
}
@LauncherAPI
public abstract String getArgsDescription(); // "<required> [optional]"
@LauncherAPI
public abstract String getUsageDescription();
@LauncherAPI
public abstract void invoke(String... args) throws Exception;
@LauncherAPI
protected final void verifyArgs(String[] args, int min) throws CommandException {
if (args.length < min)
throw new CommandException("Command usage: " + getArgsDescription());

View file

@ -5,12 +5,12 @@
public final class CommandException extends Exception {
private static final long serialVersionUID = -6588814993972117772L;
@LauncherAPI
public CommandException(String message) {
super(message);
}
@LauncherAPI
public CommandException(Throwable exc) {
super(exc);
}

View file

@ -120,18 +120,18 @@ protected CommandHandler(LaunchServer server) {
registerCommand("unban", new UnbanCommand(server));
}
@LauncherAPI
public abstract void bell() throws IOException;
@LauncherAPI
public abstract void clear() throws IOException;
@LauncherAPI
public final Map<String, Command> commandsMap() {
return Collections.unmodifiableMap(commands);
}
@LauncherAPI
public final void eval(String line, boolean bell) {
LogHelper.info("Command '%s'", line);
@ -148,7 +148,7 @@ public final void eval(String line, boolean bell) {
eval(args, bell);
}
@LauncherAPI
public final void eval(String[] args, boolean bell) {
if (args.length == 0)
return;
@ -171,7 +171,7 @@ public final void eval(String[] args, boolean bell) {
}
}
@LauncherAPI
public final Command lookup(String name) throws CommandException {
Command command = commands.get(name);
if (command == null)
@ -179,7 +179,7 @@ public final Command lookup(String name) throws CommandException {
return command;
}
@LauncherAPI
public abstract String readLine() throws IOException;
private void readLoop() throws IOException {
@ -187,7 +187,7 @@ private void readLoop() throws IOException {
eval(line, true);
}
@LauncherAPI
public final void registerCommand(String name, Command command) {
VerifyHelper.verifyIDName(name);
VerifyHelper.putIfAbsent(commands, name, Objects.requireNonNull(command, "command"),

View file

@ -54,12 +54,12 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO
private static final String JSON_EXTENSION = ".json";
@LauncherAPI
public static Path resolveIndexFile(Path assetDir, String name) {
return assetDir.resolve(INDEXES_DIR).resolve(name + JSON_EXTENSION);
}
@LauncherAPI
public static Path resolveObjectFile(Path assetDir, String hash) {
return assetDir.resolve(OBJECTS_DIR).resolve(hash.substring(0, 2)).resolve(hash);
}

View file

@ -8,32 +8,32 @@
import ru.gravit.launchserver.socket.Client;
public class SessionManager implements NeedGarbageCollection {
@LauncherAPI
public static final long SESSION_TIMEOUT = 10 * 60 * 1000; // 10 минут
public static final boolean NON_GARBAGE_SERVER = true;
private Set<Client> clientSet = new HashSet<>(128);
@LauncherAPI
public boolean addClient(Client client) {
clientSet.add(client);
return true;
}
@Override
@LauncherAPI
public void garbageCollection() {
long time = System.currentTimeMillis();
clientSet.removeIf(c -> (c.timestamp + SESSION_TIMEOUT < time) && ((c.type == Client.Type.USER) || ((c.type == Client.Type.SERVER) && !NON_GARBAGE_SERVER ) ));
}
@LauncherAPI
public Client getClient(long session) {
for (Client c : clientSet)
if (c.session == session) return c;
return null;
}
@LauncherAPI
public Client getOrNewClient(long session) {
for (Client c : clientSet)
if (c.session == session) return c;
@ -42,7 +42,7 @@ public Client getOrNewClient(long session) {
return newClient;
}
@LauncherAPI
public void updateClient(long session) {
for (Client c : clientSet) {
if (c.session == session) {

View file

@ -26,7 +26,7 @@
public abstract class Response {
@FunctionalInterface
public interface Factory<R> {
@LauncherAPI
Response newResponse(LaunchServer server, long id, HInput input, HOutput output, String ip);
}
@ -57,24 +57,24 @@ public static void registerResponses() {
registerResponse(RequestType.SERVERAUTH.getNumber(), AuthServerResponse::new);
}
@LauncherAPI
public static void requestError(String message) throws RequestException {
throw new RequestException(message);
}
@LauncherAPI
protected final LaunchServer server;
@LauncherAPI
protected final HInput input;
@LauncherAPI
protected final HOutput output;
@LauncherAPI
protected final String ip;
@LauncherAPI
protected final long session;
protected Response(LaunchServer server, long session, HInput input, HOutput output, String ip) {
@ -85,20 +85,20 @@ protected Response(LaunchServer server, long session, HInput input, HOutput outp
this.session = session;
}
@LauncherAPI
protected final void debug(String message) {
LogHelper.subDebug("#%d %s", session, message);
}
@LauncherAPI
protected final void debug(String message, Object... args) {
debug(String.format(message, args));
}
@LauncherAPI
public abstract void reply() throws Exception;
@LauncherAPI
@SuppressWarnings("MethodMayBeStatic") // Intentionally not static
protected final void writeNoError(HOutput output) throws IOException {
output.writeString("", 0);

View file

@ -51,7 +51,7 @@ public final class NettyServerSocketHandler implements Runnable, AutoCloseable {
private static final String WEBSOCKET_PATH = "/api";
private static SSLServerSocketFactory ssf;
private static final ThreadFactory THREAD_FACTORY = r -> CommonHelper.newThread("Network Thread", true, r);
@LauncherAPI
public volatile boolean logConnections = Boolean.getBoolean("launcher.logConnections");
private final AtomicReference<ServerSocket> serverSocket = new AtomicReference<>();
@ -191,14 +191,14 @@ public void initChannel(NioSocketChannel ch) {
*/
}
@LauncherAPI
public void registerCustomResponse(String name, Response.Factory factory) {
VerifyHelper.verifyIDName(name);
VerifyHelper.putIfAbsent(customResponses, name, Objects.requireNonNull(factory, "factory"),
String.format("Custom response has been already registered: '%s'", name));
}
@LauncherAPI
public void setListener(Listener listener) {
this.listener = listener;
}
@ -214,13 +214,13 @@ public void setListener(Listener listener) {
}
public interface Listener {
@LauncherAPI
boolean onConnect(long id, InetAddress address);
@LauncherAPI
void onDisconnect(long id, Exception e);
@LauncherAPI
boolean onHandshake(long id, Integer type);
}
}

View file

@ -19,19 +19,19 @@
public final class ServerSocketHandler implements Runnable, AutoCloseable {
public interface Listener {
@LauncherAPI
boolean onConnect(InetAddress address);
@LauncherAPI
void onDisconnect(Exception e);
@LauncherAPI
boolean onHandshake(long session, Integer type);
}
private static final ThreadFactory THREAD_FACTORY = r -> CommonHelper.newThread("Network Thread", true, r);
@LauncherAPI
public volatile boolean logConnections = Boolean.getBoolean("launcher.logConnections");
// Instance
private final LaunchServer server;
@ -109,7 +109,7 @@ public void run() {
}
}
@LauncherAPI
public void setListener(Listener listener) {
this.listener = listener;
}

View file

@ -37,7 +37,7 @@ public Texture getSkinTexture(UUID uuid, String username, String client) throws
return getProvider().getSkinTexture(uuid, username, client);
}
@LauncherAPI
public void setBackend(TextureProvider provider) {
this.provider = provider;
}

View file

@ -16,7 +16,7 @@ public abstract class TextureProvider extends ConfigObject implements AutoClosea
private static final Map<String, Adapter<TextureProvider>> TEXTURE_PROVIDERS = new ConcurrentHashMap<>(2);
private static boolean registredProv = false;
@LauncherAPI
public static TextureProvider newProvider(String name, BlockConfigEntry block) {
VerifyHelper.verifyIDName(name);
Adapter<TextureProvider> authHandlerAdapter = VerifyHelper.getMapValue(TEXTURE_PROVIDERS, name,
@ -24,7 +24,7 @@ public static TextureProvider newProvider(String name, BlockConfigEntry block) {
return authHandlerAdapter.convert(block);
}
@LauncherAPI
public static void registerProvider(String name, Adapter<TextureProvider> adapter) {
VerifyHelper.putIfAbsent(TEXTURE_PROVIDERS, name, Objects.requireNonNull(adapter, "adapter"),
String.format("Texture provider has been already registered: '%s'", name));
@ -41,7 +41,7 @@ public static void registerProviders() {
}
}
@LauncherAPI
protected TextureProvider(BlockConfigEntry block) {
super(block);
}
@ -49,9 +49,9 @@ protected TextureProvider(BlockConfigEntry block) {
@Override
public abstract void close() throws IOException;
@LauncherAPI
public abstract Texture getCloakTexture(UUID uuid, String username, String client) throws IOException;
@LauncherAPI
public abstract Texture getSkinTexture(UUID uuid, String username, String client) throws IOException;
}

View file

@ -24,7 +24,7 @@ public final class LauncherConfig extends StreamObject {
public static final String ADDRESS_OVERRIDE = System.getProperty(ADDRESS_OVERRIDE_PROPERTY, null);
private static final AutogenConfig config = new AutogenConfig();
@LauncherAPI
public static AutogenConfig getAutogenConfig() {
return config;
}

View file

@ -40,7 +40,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO
public PublicURLClassLoader classloader;
protected ModuleContext context;
@LauncherAPI
public void autoload(Path dir) throws IOException {
LogHelper.info("Load modules");
if (Files.notExists(dir)) Files.createDirectory(dir);
@ -70,7 +70,7 @@ public void close() {
}
@Override
@LauncherAPI
public void initModules() {
for (Module m : modules) {
m.init(context);
@ -79,13 +79,13 @@ public void initModules() {
}
@Override
@LauncherAPI
public void load(Module module) {
modules.add(module);
}
@Override
@LauncherAPI
public void load(Module module, boolean preload) {
load(module);
if (!preload) module.init(context);
@ -93,7 +93,7 @@ public void load(Module module, boolean preload) {
@Override
@LauncherAPI
public void loadModule(URL jarpath, boolean preload) throws ClassNotFoundException, IllegalAccessException, InstantiationException, URISyntaxException, IOException {
JarFile f = new JarFile(Paths.get(jarpath.toURI()).toString());
Manifest m = f.getManifest();
@ -103,7 +103,7 @@ public void loadModule(URL jarpath, boolean preload) throws ClassNotFoundExcepti
}
@Override
@LauncherAPI
public void loadModule(URL jarpath, String classname, boolean preload) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
classloader.addURL(jarpath);
Class<?> moduleclass = Class.forName(classname, true, classloader);
@ -124,7 +124,7 @@ public void postInitModules() {
@Override
@LauncherAPI
public void preInitModules() {
for (Module m : modules) {
m.preInit(context);
@ -133,7 +133,7 @@ public void preInitModules() {
}
@Override
@LauncherAPI
public void printModules() {
for (Module m : modules)
LogHelper.info("Module %s version: %s", m.getName(), m.getVersion());
@ -141,7 +141,7 @@ public void printModules() {
}
@Override
@LauncherAPI
public void registerModule(Module module, boolean preload) {
load(module, preload);
LogHelper.info("Module %s version: %s registered", module.getName(), module.getVersion());

View file

@ -39,10 +39,8 @@ public static OS byName(String name) {
}
// MXBeans exports
@LauncherAPI
public static final RuntimeMXBean RUNTIME_MXBEAN = ManagementFactory.getRuntimeMXBean();
@LauncherAPI
public static final OperatingSystemMXBean OPERATING_SYSTEM_MXBEAN =
ManagementFactory.getOperatingSystemMXBean();
// System properties
@ -60,10 +58,8 @@ public static OS byName(String name) {
@LauncherAPI
public static final SecurityManager SECURITY_MANAGER = System.getSecurityManager();
// Public static fields
@LauncherAPI
public static final Runtime RUNTIME = Runtime.getRuntime();
@LauncherAPI
public static final ClassLoader LOADER = ClassLoader.getSystemClassLoader();
static {
@ -76,18 +72,18 @@ public static OS byName(String name) {
}
@Deprecated
@LauncherAPI
public static void addClassPath(URL url) {
throw new IllegalArgumentException("Method Deprecated");
}
@Deprecated
@LauncherAPI
public static void addNativePath(Path path) {
throw new IllegalArgumentException("Method Deprecated");
}
@LauncherAPI
public static void appendVars(ProcessBuilder builder, Map<String, String> vars) {
builder.environment().putAll(vars);
}
@ -111,17 +107,17 @@ public static void fullGC() {
}
@Deprecated
@LauncherAPI
public static Certificate[] getCertificates(String resource) {
throw new IllegalArgumentException("Method Deprecated");
}
@LauncherAPI
public static String[] getClassPath() {
return System.getProperty("java.class.path").split(File.pathSeparator);
}
@LauncherAPI
public static URL[] getClassPathURL() {
String[] cp = System.getProperty("java.class.path").split(File.pathSeparator);
URL[] list = new URL[cp.length];
@ -175,7 +171,7 @@ public static String systemToJvmProperty(String name) {
return String.format("-D%s=%s", name, System.getProperties().getProperty(name));
}
@LauncherAPI
public static void verifySystemProperties(Class<?> mainClass, boolean requireSystem) {
Locale.setDefault(Locale.US);
// Verify class loader