@@ -1,8 +1,10 @@
|
|||||||
package org.openautonomousconnection.protocol;
|
package org.openautonomousconnection.protocol;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.utils.Logger;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
import org.openautonomousconnection.protocol.listeners.ClientListener;
|
import org.openautonomousconnection.protocol.listeners.ClientListener;
|
||||||
import org.openautonomousconnection.protocol.listeners.DNSServerListener;
|
import org.openautonomousconnection.protocol.listeners.DNSServerListener;
|
||||||
import org.openautonomousconnection.protocol.listeners.WebServerListener;
|
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.AuthPacket;
|
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.AuthPacket;
|
||||||
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.GetDestinationPacket;
|
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.GetDestinationPacket;
|
||||||
@@ -16,9 +18,6 @@ import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
|||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.ClassicHandlerClient;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.ClassicHandlerClient;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.ClassicHandlerServer;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.ClassicHandlerServer;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_ClientListener;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_ClientListener;
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.utils.Logger;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -169,19 +168,19 @@ public class ProtocolBridge {
|
|||||||
private boolean validateProtocolSide() {
|
private boolean validateProtocolSide() {
|
||||||
return
|
return
|
||||||
(isRunningAsClient() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT) ||
|
(isRunningAsClient() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT) ||
|
||||||
(isRunningAsClient() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT_WEB) ||
|
(isRunningAsClient() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT_WEB) ||
|
||||||
(isRunningAsClient() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT_DNS) ||
|
(isRunningAsClient() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT_DNS) ||
|
||||||
(isRunningAsClient() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.ALL) ||
|
(isRunningAsClient() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.ALL) ||
|
||||||
|
|
||||||
(isRunningAsWebServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.WEB) ||
|
(isRunningAsWebServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.WEB) ||
|
||||||
(isRunningAsWebServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT_WEB) ||
|
(isRunningAsWebServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT_WEB) ||
|
||||||
(isRunningAsWebServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.WEB_DNS) ||
|
(isRunningAsWebServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.WEB_DNS) ||
|
||||||
(isRunningAsWebServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.ALL) ||
|
(isRunningAsWebServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.ALL) ||
|
||||||
|
|
||||||
(isRunningAsDNSServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.DNS) ||
|
(isRunningAsDNSServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.DNS) ||
|
||||||
(isRunningAsDNSServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.WEB_DNS) ||
|
(isRunningAsDNSServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.WEB_DNS) ||
|
||||||
(isRunningAsDNSServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT_DNS) ||
|
(isRunningAsDNSServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.CLIENT_DNS) ||
|
||||||
(isRunningAsDNSServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.ALL);
|
(isRunningAsDNSServer() && protocolVersion.getProtocolSide() == ProtocolVersion.ProtocolSide.ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean isVersionSupported(ProtocolVersion targetVersion) {
|
public final boolean isVersionSupported(ProtocolVersion targetVersion) {
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
package org.openautonomousconnection.protocol.listeners;
|
package org.openautonomousconnection.protocol.listeners;
|
||||||
|
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
|
||||||
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.AuthPacket;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.event.EventListener;
|
import dev.unlegitdqrk.unlegitlibrary.event.EventListener;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.event.Listener;
|
import dev.unlegitdqrk.unlegitlibrary.event.Listener;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.client.events.ClientConnectedEvent;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.client.events.ClientConnectedEvent;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.client.events.ClientDisconnectedEvent;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.client.events.ClientDisconnectedEvent;
|
||||||
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
|
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.AuthPacket;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
package org.openautonomousconnection.protocol.listeners;
|
package org.openautonomousconnection.protocol.listeners;
|
||||||
|
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
|
||||||
import org.openautonomousconnection.protocol.side.dns.ConnectedProtocolClient;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.event.EventListener;
|
import dev.unlegitdqrk.unlegitlibrary.event.EventListener;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.event.Listener;
|
import dev.unlegitdqrk.unlegitlibrary.event.Listener;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.ConnectionHandlerConnectedEvent;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.ConnectionHandlerConnectedEvent;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.ConnectionHandlerDisconnectedEvent;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.ConnectionHandlerDisconnectedEvent;
|
||||||
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
|
import org.openautonomousconnection.protocol.side.dns.ConnectedProtocolClient;
|
||||||
|
|
||||||
public class DNSServerListener extends EventListener {
|
public class DNSServerListener extends EventListener {
|
||||||
|
|
||||||
|
@@ -5,7 +5,6 @@ import dev.unlegitdqrk.unlegitlibrary.event.Listener;
|
|||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.ConnectionHandlerConnectedEvent;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.ConnectionHandlerConnectedEvent;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.ConnectionHandlerDisconnectedEvent;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.ConnectionHandlerDisconnectedEvent;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.side.dns.ConnectedProtocolClient;
|
|
||||||
import org.openautonomousconnection.protocol.side.web.ConnectedWebClient;
|
import org.openautonomousconnection.protocol.side.web.ConnectedWebClient;
|
||||||
|
|
||||||
public class WebServerListener extends EventListener {
|
public class WebServerListener extends EventListener {
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
package org.openautonomousconnection.protocol.packets;
|
package org.openautonomousconnection.protocol.packets;
|
||||||
|
|
||||||
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
|
||||||
import lombok.Getter;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.Packet;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.Packet;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
||||||
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
|
@@ -1,18 +1,17 @@
|
|||||||
package org.openautonomousconnection.protocol.packets.v1_0_0.beta;
|
package org.openautonomousconnection.protocol.packets.v1_0_0.beta;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.file.FileUtils;
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.server.ConnectionHandler;
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.utils.NetworkUtils;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
import org.openautonomousconnection.protocol.side.client.events.ConnectedToProtocolServer;
|
import org.openautonomousconnection.protocol.side.client.events.ConnectedToProtocolServer;
|
||||||
import org.openautonomousconnection.protocol.side.dns.ConnectedProtocolClient;
|
import org.openautonomousconnection.protocol.side.dns.ConnectedProtocolClient;
|
||||||
import org.openautonomousconnection.protocol.side.dns.events.ConnectedProtocolClientEvent;
|
import org.openautonomousconnection.protocol.side.dns.events.ConnectedProtocolClientEvent;
|
||||||
import org.openautonomousconnection.protocol.side.web.ConnectedWebClient;
|
import org.openautonomousconnection.protocol.side.web.ConnectedWebClient;
|
||||||
import org.openautonomousconnection.protocol.side.web.events.ConnectedWebClientEvent;
|
|
||||||
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.file.FileUtils;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.ConnectionHandler;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.utils.NetworkUtils;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -21,22 +20,18 @@ import java.io.ObjectOutputStream;
|
|||||||
|
|
||||||
public class AuthPacket extends OACPacket {
|
public class AuthPacket extends OACPacket {
|
||||||
|
|
||||||
|
File certificatesFolder = new File("certificates");
|
||||||
|
File publicFolder = new File(certificatesFolder, "public");
|
||||||
|
File publicCAFolder = new File(publicFolder, "ca");
|
||||||
|
File publicServerFolder = new File(publicFolder, "server");
|
||||||
|
File privateFolder = new File(certificatesFolder, "private");
|
||||||
|
File privateCAFolder = new File(privateFolder, "ca");
|
||||||
|
File privateServerFolder = new File(privateFolder, "server");
|
||||||
// Registration Constructor
|
// Registration Constructor
|
||||||
public AuthPacket() {
|
public AuthPacket() {
|
||||||
super(4, ProtocolVersion.PV_1_0_0_BETA);
|
super(4, ProtocolVersion.PV_1_0_0_BETA);
|
||||||
}
|
}
|
||||||
|
|
||||||
File certificatesFolder = new File("certificates");
|
|
||||||
|
|
||||||
File publicFolder = new File(certificatesFolder, "public");
|
|
||||||
File privateFolder = new File(certificatesFolder, "private");
|
|
||||||
|
|
||||||
File privateCAFolder = new File(privateFolder, "ca");
|
|
||||||
File privateServerFolder = new File(privateFolder, "server");
|
|
||||||
|
|
||||||
File publicCAFolder = new File(publicFolder, "ca");
|
|
||||||
File publicServerFolder = new File(publicFolder, "server");
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onWrite(PacketHandler packetHandler, ObjectOutputStream objectOutputStream) throws IOException, ClassNotFoundException {
|
public void onWrite(PacketHandler packetHandler, ObjectOutputStream objectOutputStream) throws IOException, ClassNotFoundException {
|
||||||
if (ProtocolBridge.getInstance().isRunningAsDNSServer()) {
|
if (ProtocolBridge.getInstance().isRunningAsDNSServer()) {
|
||||||
@@ -97,7 +92,7 @@ public class AuthPacket extends OACPacket {
|
|||||||
ConnectedWebClient client = ProtocolBridge.getInstance().getProtocolWebServer().getClientByID(clientID);
|
ConnectedWebClient client = ProtocolBridge.getInstance().getProtocolWebServer().getClientByID(clientID);
|
||||||
client.setClientVersion(clientVersion);
|
client.setClientVersion(clientVersion);
|
||||||
}
|
}
|
||||||
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
||||||
ProtocolVersion serverVersion = (ProtocolVersion) objectInputStream.readObject();
|
ProtocolVersion serverVersion = (ProtocolVersion) objectInputStream.readObject();
|
||||||
|
|
||||||
if (!ProtocolBridge.getInstance().isVersionSupported(serverVersion)) {
|
if (!ProtocolBridge.getInstance().isVersionSupported(serverVersion)) {
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
package org.openautonomousconnection.protocol.packets.v1_0_0.beta;
|
package org.openautonomousconnection.protocol.packets.v1_0_0.beta;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
package org.openautonomousconnection.protocol.packets.v1_0_0.beta;
|
package org.openautonomousconnection.protocol.packets.v1_0_0.beta;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
@@ -51,6 +51,7 @@ public class UnsupportedClassicPacket extends OACPacket {
|
|||||||
|
|
||||||
if (ProtocolBridge.getInstance().isRunningAsDNSServer())
|
if (ProtocolBridge.getInstance().isRunningAsDNSServer())
|
||||||
ProtocolBridge.getInstance().getClassicHandlerServer().unsupportedClassicPacket(className, content, ProtocolBridge.getInstance().getProtocolDNSServer().getClientByID(clientID));
|
ProtocolBridge.getInstance().getClassicHandlerServer().unsupportedClassicPacket(className, content, ProtocolBridge.getInstance().getProtocolDNSServer().getClientByID(clientID));
|
||||||
else if (ProtocolBridge.getInstance().isRunningAsClient()) ProtocolBridge.getInstance().getClassicHandlerClient().unsupportedClassicPacket(className, content);
|
else if (ProtocolBridge.getInstance().isRunningAsClient())
|
||||||
|
ProtocolBridge.getInstance().getClassicHandlerClient().unsupportedClassicPacket(className, content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
package org.openautonomousconnection.protocol.packets.v1_0_0.beta;
|
package org.openautonomousconnection.protocol.packets.v1_0_0.beta;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
@@ -27,7 +27,8 @@ public class ValidateDomainPacket extends OACPacket {
|
|||||||
public void onWrite(PacketHandler packetHandler, ObjectOutputStream objectOutputStream) throws IOException, ClassNotFoundException {
|
public void onWrite(PacketHandler packetHandler, ObjectOutputStream objectOutputStream) throws IOException, ClassNotFoundException {
|
||||||
if (ProtocolBridge.getInstance().isRunningAsClient())
|
if (ProtocolBridge.getInstance().isRunningAsClient())
|
||||||
objectOutputStream.writeInt(ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().getClientID());
|
objectOutputStream.writeInt(ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().getClientID());
|
||||||
else if (ProtocolBridge.getInstance().isRunningAsDNSServer()) setResponseCode(ProtocolBridge.getInstance().getProtocolDNSServer().validateDomain(domain));
|
else if (ProtocolBridge.getInstance().isRunningAsDNSServer())
|
||||||
|
setResponseCode(ProtocolBridge.getInstance().getProtocolDNSServer().validateDomain(domain));
|
||||||
|
|
||||||
objectOutputStream.writeObject(domain);
|
objectOutputStream.writeObject(domain);
|
||||||
}
|
}
|
||||||
@@ -49,7 +50,7 @@ public class ValidateDomainPacket extends OACPacket {
|
|||||||
ProtocolBridge.getInstance().getProtocolDNSServer().validationPacketSendFailed(domain, ProtocolBridge.getInstance().getProtocolDNSServer().getClientByID(clientID), e);
|
ProtocolBridge.getInstance().getProtocolDNSServer().validationPacketSendFailed(domain, ProtocolBridge.getInstance().getProtocolDNSServer().getClientByID(clientID), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
} else if (ProtocolBridge.getInstance().isRunningAsClient())
|
||||||
} else if (ProtocolBridge.getInstance().isRunningAsClient()) ProtocolBridge.getInstance().getProtocolClient().validationCompleted(domain, getResponseCode());
|
ProtocolBridge.getInstance().getProtocolClient().validationCompleted(domain, getResponseCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package org.openautonomousconnection.protocol.packets.v1_0_0.classic;
|
package org.openautonomousconnection.protocol.packets.v1_0_0.classic;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.UnsupportedClassicPacket;
|
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.UnsupportedClassicPacket;
|
||||||
@@ -8,7 +9,6 @@ import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_Dom
|
|||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_DomainPacketReceivedEvent;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_DomainPacketReceivedEvent;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_ProtocolVersion;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_RequestDomain;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_RequestDomain;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
@@ -39,7 +39,7 @@ public class Classic_DomainPacket extends OACPacket {
|
|||||||
objectOutputStream.writeInt(clientID);
|
objectOutputStream.writeInt(clientID);
|
||||||
objectOutputStream.writeObject(requestDomain);
|
objectOutputStream.writeObject(requestDomain);
|
||||||
objectOutputStream.writeObject(domain);
|
objectOutputStream.writeObject(domain);
|
||||||
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
||||||
clientID = ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().getClientID();
|
clientID = ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().getClientID();
|
||||||
objectOutputStream.writeInt(clientID);
|
objectOutputStream.writeInt(clientID);
|
||||||
objectOutputStream.writeObject(requestDomain);
|
objectOutputStream.writeObject(requestDomain);
|
||||||
@@ -67,7 +67,7 @@ public class Classic_DomainPacket extends OACPacket {
|
|||||||
ProtocolBridge.getInstance().getProtocolDNSServer().getNetworkServer().getConnectionHandlerByID(clientID).sendPacket(new Classic_DomainPacket(clientID, requestDomain, domain));
|
ProtocolBridge.getInstance().getProtocolDNSServer().getNetworkServer().getConnectionHandlerByID(clientID).sendPacket(new Classic_DomainPacket(clientID, requestDomain, domain));
|
||||||
else
|
else
|
||||||
ProtocolBridge.getInstance().getProtocolDNSServer().getNetworkServer().getConnectionHandlerByID(clientID).sendPacket(new UnsupportedClassicPacket(Classic_PingPacket.class, new Object[]{clientID, requestDomain, domain}));
|
ProtocolBridge.getInstance().getProtocolDNSServer().getNetworkServer().getConnectionHandlerByID(clientID).sendPacket(new UnsupportedClassicPacket(Classic_PingPacket.class, new Object[]{clientID, requestDomain, domain}));
|
||||||
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
||||||
clientID = objectInputStream.readInt();
|
clientID = objectInputStream.readInt();
|
||||||
requestDomain = (Classic_RequestDomain) objectInputStream.readObject();
|
requestDomain = (Classic_RequestDomain) objectInputStream.readObject();
|
||||||
domain = (Classic_Domain) objectInputStream.readObject();
|
domain = (Classic_Domain) objectInputStream.readObject();
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
package org.openautonomousconnection.protocol.packets.v1_0_0.classic;
|
package org.openautonomousconnection.protocol.packets.v1_0_0.classic;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_ProtocolVersion;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
@@ -28,7 +28,7 @@ public class Classic_MessagePacket extends OACPacket {
|
|||||||
@Override
|
@Override
|
||||||
public void onWrite(PacketHandler packetHandler, ObjectOutputStream objectOutputStream) throws IOException, ClassNotFoundException {
|
public void onWrite(PacketHandler packetHandler, ObjectOutputStream objectOutputStream) throws IOException, ClassNotFoundException {
|
||||||
if (ProtocolBridge.getInstance().isRunningAsDNSServer()) objectOutputStream.writeInt(clientID);
|
if (ProtocolBridge.getInstance().isRunningAsDNSServer()) objectOutputStream.writeInt(clientID);
|
||||||
else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
||||||
clientID = ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().getClientID();
|
clientID = ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().getClientID();
|
||||||
objectOutputStream.writeInt(clientID);
|
objectOutputStream.writeInt(clientID);
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,7 @@ public class Classic_MessagePacket extends OACPacket {
|
|||||||
Classic_ProtocolVersion protocolVersion = (Classic_ProtocolVersion) objectInputStream.readObject();
|
Classic_ProtocolVersion protocolVersion = (Classic_ProtocolVersion) objectInputStream.readObject();
|
||||||
|
|
||||||
ProtocolBridge.getInstance().getClassicHandlerServer().handleMessage(ProtocolBridge.getInstance().getProtocolDNSServer().getClientByID(clientID), message, protocolVersion);
|
ProtocolBridge.getInstance().getClassicHandlerServer().handleMessage(ProtocolBridge.getInstance().getProtocolDNSServer().getClientByID(clientID), message, protocolVersion);
|
||||||
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
||||||
clientID = objectInputStream.readInt();
|
clientID = objectInputStream.readInt();
|
||||||
String message = objectInputStream.readUTF();
|
String message = objectInputStream.readUTF();
|
||||||
Classic_ProtocolVersion protocolVersion = (Classic_ProtocolVersion) objectInputStream.readObject();
|
Classic_ProtocolVersion protocolVersion = (Classic_ProtocolVersion) objectInputStream.readObject();
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package org.openautonomousconnection.protocol.packets.v1_0_0.classic;
|
package org.openautonomousconnection.protocol.packets.v1_0_0.classic;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.UnsupportedClassicPacket;
|
import org.openautonomousconnection.protocol.packets.v1_0_0.beta.UnsupportedClassicPacket;
|
||||||
@@ -9,7 +10,6 @@ import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_Dom
|
|||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_PingPacketReceivedEvent;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_PingPacketReceivedEvent;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_ProtocolVersion;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_RequestDomain;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_RequestDomain;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.PacketHandler;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
@@ -43,7 +43,7 @@ public class Classic_PingPacket extends OACPacket {
|
|||||||
objectOutputStream.writeObject(requestDomain);
|
objectOutputStream.writeObject(requestDomain);
|
||||||
objectOutputStream.writeObject(domain);
|
objectOutputStream.writeObject(domain);
|
||||||
objectOutputStream.writeBoolean(reachable);
|
objectOutputStream.writeBoolean(reachable);
|
||||||
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
} else if (ProtocolBridge.getInstance().isRunningAsClient()) {
|
||||||
clientID = ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().getClientID();
|
clientID = ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().getClientID();
|
||||||
objectOutputStream.writeInt(clientID);
|
objectOutputStream.writeInt(clientID);
|
||||||
objectOutputStream.writeObject(requestDomain);
|
objectOutputStream.writeObject(requestDomain);
|
||||||
|
@@ -1,5 +1,10 @@
|
|||||||
package org.openautonomousconnection.protocol.side.client;
|
package org.openautonomousconnection.protocol.side.client;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.client.NetworkClient;
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.client.events.ClientDisconnectedEvent;
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.utils.NetworkUtils;
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.utils.DefaultMethodsOverrider;
|
||||||
|
import lombok.Getter;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.exceptions.UnsupportedProtocolException;
|
import org.openautonomousconnection.protocol.exceptions.UnsupportedProtocolException;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
@@ -10,70 +15,20 @@ import org.openautonomousconnection.protocol.packets.v1_0_0.classic.Classic_Ping
|
|||||||
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
||||||
import lombok.Getter;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.client.NetworkClient;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.client.events.ClientDisconnectedEvent;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.utils.NetworkUtils;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.utils.DefaultMethodsOverrider;
|
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.ClassicConverter;
|
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_Domain;
|
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_RequestDomain;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.Classic_RequestDomain;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.ConnectException;
|
|
||||||
import java.security.cert.CertificateException;
|
import java.security.cert.CertificateException;
|
||||||
|
|
||||||
public abstract class ProtocolClient extends DefaultMethodsOverrider {
|
public abstract class ProtocolClient extends DefaultMethodsOverrider {
|
||||||
public final class ClientCertificateFolderStructure {
|
|
||||||
public final File certificatesFolder;
|
|
||||||
|
|
||||||
public final File publicFolder;
|
|
||||||
public final File privateFolder;
|
|
||||||
|
|
||||||
public final File privateCAFolder;
|
|
||||||
public final File privateClientFolder;
|
|
||||||
|
|
||||||
public final File publicCAFolder;
|
|
||||||
public final File publicClientFolder;
|
|
||||||
|
|
||||||
public ClientCertificateFolderStructure() {
|
|
||||||
certificatesFolder = new File("certificates");
|
|
||||||
|
|
||||||
publicFolder = new File(certificatesFolder, "public");
|
|
||||||
privateFolder = new File(certificatesFolder, "private");
|
|
||||||
|
|
||||||
privateCAFolder = new File(privateFolder, "ca");
|
|
||||||
privateClientFolder = new File(privateFolder, "client");
|
|
||||||
|
|
||||||
publicCAFolder = new File(publicFolder, "ca");
|
|
||||||
publicClientFolder = new File(publicFolder, "client");
|
|
||||||
|
|
||||||
if (!certificatesFolder.exists()) certificatesFolder.mkdirs();
|
|
||||||
|
|
||||||
if (!publicFolder.exists()) publicFolder.mkdirs();
|
|
||||||
if (!privateFolder.exists()) privateFolder.mkdirs();
|
|
||||||
|
|
||||||
if (!privateCAFolder.exists()) privateCAFolder.mkdirs();
|
|
||||||
if (!privateClientFolder.exists()) privateClientFolder.mkdirs();
|
|
||||||
|
|
||||||
if (!publicCAFolder.exists()) publicCAFolder.mkdirs();
|
|
||||||
if (!publicClientFolder.exists()) publicClientFolder.mkdirs();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final NetworkClient clientToDNS; // Handles everything with DNS-Connection
|
private final NetworkClient clientToDNS; // Handles everything with DNS-Connection
|
||||||
|
@Getter
|
||||||
|
private final ClientCertificateFolderStructure folderStructure;
|
||||||
private WebClient webClient;
|
private WebClient webClient;
|
||||||
|
|
||||||
private ProtocolVersion serverVersion = null;
|
private ProtocolVersion serverVersion = null;
|
||||||
@Getter
|
|
||||||
private final ClientCertificateFolderStructure folderStructure;
|
|
||||||
|
|
||||||
public final NetworkClient getClientDNSConnection() {
|
|
||||||
return clientToDNS;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProtocolClient() throws CertificateException, IOException {
|
public ProtocolClient() throws CertificateException, IOException {
|
||||||
folderStructure = new ClientCertificateFolderStructure();
|
folderStructure = new ClientCertificateFolderStructure();
|
||||||
|
|
||||||
@@ -84,8 +39,13 @@ public abstract class ProtocolClient extends DefaultMethodsOverrider {
|
|||||||
build();
|
build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final NetworkClient getClientDNSConnection() {
|
||||||
|
return clientToDNS;
|
||||||
|
}
|
||||||
|
|
||||||
public final void createWebConnection(Domain domain, int pipelinePort, int webPort) throws Exception {
|
public final void createWebConnection(Domain domain, int pipelinePort, int webPort) throws Exception {
|
||||||
if (!ProtocolBridge.getInstance().isProtocolSupported(ProtocolVersion.Protocol.OAC)) throw new UnsupportedProtocolException();
|
if (!ProtocolBridge.getInstance().isProtocolSupported(ProtocolVersion.Protocol.OAC))
|
||||||
|
throw new UnsupportedProtocolException();
|
||||||
|
|
||||||
if (webClient != null) {
|
if (webClient != null) {
|
||||||
try {
|
try {
|
||||||
@@ -103,10 +63,12 @@ public abstract class ProtocolClient extends DefaultMethodsOverrider {
|
|||||||
if (folder == null) throw new FileNotFoundException("Folder does not exist");
|
if (folder == null) throw new FileNotFoundException("Folder does not exist");
|
||||||
|
|
||||||
File[] files = folder.listFiles();
|
File[] files = folder.listFiles();
|
||||||
if (files == null || files.length == 0) throw new FileNotFoundException("Folder " + folder.getAbsolutePath() + " is empty");
|
if (files == null || files.length == 0)
|
||||||
|
throw new FileNotFoundException("Folder " + folder.getAbsolutePath() + " is empty");
|
||||||
|
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
if (!file.getName().startsWith(prefix) || !file.getName().endsWith(extension)) throw new CertificateException(file.getAbsolutePath() + " is not valid");
|
if (!file.getName().startsWith(prefix) || !file.getName().endsWith(extension))
|
||||||
|
throw new CertificateException(file.getAbsolutePath() + " is not valid");
|
||||||
if (!found) found = file.getName().equalsIgnoreCase(prefix + NetworkUtils.getPublicIPAddress() + extension);
|
if (!found) found = file.getName().equalsIgnoreCase(prefix + NetworkUtils.getPublicIPAddress() + extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,4 +169,41 @@ public abstract class ProtocolClient extends DefaultMethodsOverrider {
|
|||||||
public abstract void validationCompleted(Domain domain, DNSResponseCode responseCode);
|
public abstract void validationCompleted(Domain domain, DNSResponseCode responseCode);
|
||||||
|
|
||||||
public abstract void getDestinationCompleted(Domain domain, String destination, DNSResponseCode validationResponse);
|
public abstract void getDestinationCompleted(Domain domain, String destination, DNSResponseCode validationResponse);
|
||||||
|
|
||||||
|
public final class ClientCertificateFolderStructure {
|
||||||
|
public final File certificatesFolder;
|
||||||
|
|
||||||
|
public final File publicFolder;
|
||||||
|
public final File privateFolder;
|
||||||
|
|
||||||
|
public final File privateCAFolder;
|
||||||
|
public final File privateClientFolder;
|
||||||
|
|
||||||
|
public final File publicCAFolder;
|
||||||
|
public final File publicClientFolder;
|
||||||
|
|
||||||
|
public ClientCertificateFolderStructure() {
|
||||||
|
certificatesFolder = new File("certificates");
|
||||||
|
|
||||||
|
publicFolder = new File(certificatesFolder, "public");
|
||||||
|
privateFolder = new File(certificatesFolder, "private");
|
||||||
|
|
||||||
|
privateCAFolder = new File(privateFolder, "ca");
|
||||||
|
privateClientFolder = new File(privateFolder, "client");
|
||||||
|
|
||||||
|
publicCAFolder = new File(publicFolder, "ca");
|
||||||
|
publicClientFolder = new File(publicFolder, "client");
|
||||||
|
|
||||||
|
if (!certificatesFolder.exists()) certificatesFolder.mkdirs();
|
||||||
|
|
||||||
|
if (!publicFolder.exists()) publicFolder.mkdirs();
|
||||||
|
if (!privateFolder.exists()) privateFolder.mkdirs();
|
||||||
|
|
||||||
|
if (!privateCAFolder.exists()) privateCAFolder.mkdirs();
|
||||||
|
if (!privateClientFolder.exists()) privateClientFolder.mkdirs();
|
||||||
|
|
||||||
|
if (!publicCAFolder.exists()) publicCAFolder.mkdirs();
|
||||||
|
if (!publicClientFolder.exists()) publicClientFolder.mkdirs();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,6 @@
|
|||||||
package org.openautonomousconnection.protocol.side.client;
|
package org.openautonomousconnection.protocol.side.client;
|
||||||
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.client.NetworkClient;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.client.NetworkClient;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.client.events.*;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.Packet;
|
|
||||||
import lombok.Getter;
|
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
||||||
|
|
||||||
@@ -21,19 +18,8 @@ import java.net.Socket;
|
|||||||
public final class WebClient {
|
public final class WebClient {
|
||||||
private final NetworkClient clientToWebPipeline; // Handles everything with Pipeline-Connection
|
private final NetworkClient clientToWebPipeline; // Handles everything with Pipeline-Connection
|
||||||
private SSLSocket clientToWebServer; // Handles everything with Web-Connection
|
private SSLSocket clientToWebServer; // Handles everything with Web-Connection
|
||||||
|
private ObjectOutputStream outputStream; private final Thread receiveThread = new Thread(this::receive);
|
||||||
private final Thread receiveThread = new Thread(this::receive);
|
|
||||||
private ObjectOutputStream outputStream;
|
|
||||||
private ObjectInputStream inputStream;
|
private ObjectInputStream inputStream;
|
||||||
|
|
||||||
public final NetworkClient getClientPipelineConnection() {
|
|
||||||
return clientToWebPipeline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final SSLSocket getClientWebConnection() {
|
|
||||||
return clientToWebServer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public WebClient(Domain domain, int pipelinePort, int webPort) throws Exception {
|
public WebClient(Domain domain, int pipelinePort, int webPort) throws Exception {
|
||||||
clientToWebPipeline = new NetworkClient.ClientBuilder().setLogger(ProtocolBridge.getInstance().getLogger()).
|
clientToWebPipeline = new NetworkClient.ClientBuilder().setLogger(ProtocolBridge.getInstance().getLogger()).
|
||||||
setHost(domain.getDestination()).setPort(pipelinePort).
|
setHost(domain.getDestination()).setPort(pipelinePort).
|
||||||
@@ -54,9 +40,9 @@ public final class WebClient {
|
|||||||
if (proxy != null) {
|
if (proxy != null) {
|
||||||
Socket rawSocket = new Socket(proxy);
|
Socket rawSocket = new Socket(proxy);
|
||||||
rawSocket.connect(new InetSocketAddress(domain.getDestination(), webPort), 0);
|
rawSocket.connect(new InetSocketAddress(domain.getDestination(), webPort), 0);
|
||||||
tempSocket = (SSLSocket)sslSocketFactory.createSocket(rawSocket, domain.getDestination(), webPort, true);
|
tempSocket = (SSLSocket) sslSocketFactory.createSocket(rawSocket, domain.getDestination(), webPort, true);
|
||||||
} else {
|
} else {
|
||||||
tempSocket = (SSLSocket)sslSocketFactory.createSocket(domain.getDestination(), webPort);
|
tempSocket = (SSLSocket) sslSocketFactory.createSocket(domain.getDestination(), webPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
clientToWebServer = tempSocket;
|
clientToWebServer = tempSocket;
|
||||||
@@ -85,7 +71,15 @@ public final class WebClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean isConnected() {
|
public NetworkClient getClientPipelineConnection() {
|
||||||
|
return clientToWebPipeline;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SSLSocket getClientWebConnection() {
|
||||||
|
return clientToWebServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isConnected() {
|
||||||
return this.clientToWebServer != null && this.clientToWebServer.isConnected() && !this.clientToWebServer.isClosed()
|
return this.clientToWebServer != null && this.clientToWebServer.isConnected() && !this.clientToWebServer.isClosed()
|
||||||
&& this.receiveThread.isAlive() && !this.receiveThread.isInterrupted() &&
|
&& this.receiveThread.isAlive() && !this.receiveThread.isInterrupted() &&
|
||||||
ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().isConnected() && clientToWebPipeline.isConnected();
|
ProtocolBridge.getInstance().getProtocolClient().getClientDNSConnection().isConnected() && clientToWebPipeline.isConnected();
|
||||||
@@ -93,7 +87,7 @@ public final class WebClient {
|
|||||||
|
|
||||||
private void receive() {
|
private void receive() {
|
||||||
try {
|
try {
|
||||||
while(this.isConnected()) {
|
while (this.isConnected()) {
|
||||||
Object received = this.inputStream.readObject();
|
Object received = this.inputStream.readObject();
|
||||||
}
|
}
|
||||||
} catch (Exception var2) {
|
} catch (Exception var2) {
|
||||||
@@ -105,7 +99,7 @@ public final class WebClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized final boolean closeConnection() throws IOException {
|
public synchronized boolean closeConnection() throws IOException {
|
||||||
if (!this.isConnected()) {
|
if (!this.isConnected()) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
@@ -133,4 +127,6 @@ public final class WebClient {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
package org.openautonomousconnection.protocol.side.dns;
|
package org.openautonomousconnection.protocol.side.dns;
|
||||||
|
|
||||||
|
import dev.unlegitdqrk.unlegitlibrary.network.system.server.ConnectionHandler;
|
||||||
|
import lombok.Getter;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
||||||
import lombok.Getter;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.ConnectionHandler;
|
|
||||||
|
|
||||||
public final class ConnectedProtocolClient {
|
public final class ConnectedProtocolClient {
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ public final class ConnectedProtocolClient {
|
|||||||
return clientVersion == null ? ProtocolVersion.PV_1_0_0_CLASSIC : clientVersion;
|
return clientVersion == null ? ProtocolVersion.PV_1_0_0_CLASSIC : clientVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setClientVersion(ProtocolVersion clientVersion) {
|
public void setClientVersion(ProtocolVersion clientVersion) {
|
||||||
if (clientVersion == null) this.clientVersion = clientVersion;
|
if (clientVersion == null) this.clientVersion = clientVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ public final class ConnectedProtocolClient {
|
|||||||
return getClientVersion() == targetVersion || getClientVersion().getCompatibleVersions().contains(targetVersion);
|
return getClientVersion() == targetVersion || getClientVersion().getCompatibleVersions().contains(targetVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean supportClientProtocol(ProtocolVersion.Protocol protocol) {
|
public boolean supportClientProtocol(ProtocolVersion.Protocol protocol) {
|
||||||
boolean yes = false;
|
boolean yes = false;
|
||||||
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
||||||
yes = compatibleVersion.getSupportedProtocols().contains(protocol);
|
yes = compatibleVersion.getSupportedProtocols().contains(protocol);
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
package org.openautonomousconnection.protocol.side.dns;
|
package org.openautonomousconnection.protocol.side.dns;
|
||||||
|
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
|
||||||
import lombok.Getter;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.file.ConfigurationManager;
|
import dev.unlegitdqrk.unlegitlibrary.file.ConfigurationManager;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.NetworkServer;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.server.NetworkServer;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.utils.NetworkUtils;
|
import dev.unlegitdqrk.unlegitlibrary.network.utils.NetworkUtils;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.utils.DefaultMethodsOverrider;
|
import dev.unlegitdqrk.unlegitlibrary.utils.DefaultMethodsOverrider;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.DNSResponseCode;
|
||||||
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
@@ -17,57 +17,15 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class ProtocolDNSServer extends DefaultMethodsOverrider {
|
public abstract class ProtocolDNSServer extends DefaultMethodsOverrider {
|
||||||
public final class ServerCertificateFolderStructure {
|
|
||||||
public final File certificatesFolder;
|
|
||||||
|
|
||||||
public final File publicFolder;
|
|
||||||
public final File privateFolder;
|
|
||||||
|
|
||||||
public final File privateCAFolder;
|
|
||||||
public final File privateServerFolder;
|
|
||||||
|
|
||||||
public final File publicCAFolder;
|
|
||||||
public final File publicServerFolder;
|
|
||||||
|
|
||||||
public ServerCertificateFolderStructure() {
|
|
||||||
certificatesFolder = new File("certificates");
|
|
||||||
|
|
||||||
publicFolder = new File(certificatesFolder, "public");
|
|
||||||
privateFolder = new File(certificatesFolder, "private");
|
|
||||||
|
|
||||||
privateCAFolder = new File(privateFolder, "ca");
|
|
||||||
privateServerFolder = new File(privateFolder, "server");
|
|
||||||
|
|
||||||
publicCAFolder = new File(publicFolder, "ca");
|
|
||||||
publicServerFolder = new File(publicFolder, "server");
|
|
||||||
|
|
||||||
if (!certificatesFolder.exists()) certificatesFolder.mkdirs();
|
|
||||||
|
|
||||||
if (!publicFolder.exists()) publicFolder.mkdirs();
|
|
||||||
if (!privateFolder.exists()) privateFolder.mkdirs();
|
|
||||||
|
|
||||||
if (!privateCAFolder.exists()) privateCAFolder.mkdirs();
|
|
||||||
if (!privateServerFolder.exists()) privateServerFolder.mkdirs();
|
|
||||||
|
|
||||||
if (!publicCAFolder.exists()) publicCAFolder.mkdirs();
|
|
||||||
if (!publicServerFolder.exists()) publicServerFolder.mkdirs();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final String caPrefix = "ca_dns_";
|
|
||||||
public final String certPrefix = "cert_dns_";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final NetworkServer networkServer;
|
private final NetworkServer networkServer;
|
||||||
|
private final ConfigurationManager configurationManager;
|
||||||
@Getter
|
@Getter
|
||||||
private List<ConnectedProtocolClient> clients;
|
private List<ConnectedProtocolClient> clients;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private ServerCertificateFolderStructure folderStructure;
|
private ServerCertificateFolderStructure folderStructure;
|
||||||
|
|
||||||
private final ConfigurationManager configurationManager;
|
|
||||||
|
|
||||||
public ProtocolDNSServer(File configFile) throws IOException, CertificateException {
|
public ProtocolDNSServer(File configFile) throws IOException, CertificateException {
|
||||||
if (!configFile.exists()) configFile.createNewFile();
|
if (!configFile.exists()) configFile.createNewFile();
|
||||||
|
|
||||||
@@ -112,10 +70,12 @@ public abstract class ProtocolDNSServer extends DefaultMethodsOverrider {
|
|||||||
if (folder == null) throw new FileNotFoundException("Folder does not exist");
|
if (folder == null) throw new FileNotFoundException("Folder does not exist");
|
||||||
|
|
||||||
File[] files = folder.listFiles();
|
File[] files = folder.listFiles();
|
||||||
if (files == null || files.length == 0) throw new FileNotFoundException("Folder " + folder.getAbsolutePath() + " is empty");
|
if (files == null || files.length == 0)
|
||||||
|
throw new FileNotFoundException("Folder " + folder.getAbsolutePath() + " is empty");
|
||||||
|
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
if (!file.getName().startsWith(prefix) || !file.getName().endsWith(extension)) throw new CertificateException(file.getAbsolutePath() + " is not valid");
|
if (!file.getName().startsWith(prefix) || !file.getName().endsWith(extension))
|
||||||
|
throw new CertificateException(file.getAbsolutePath() + " is not valid");
|
||||||
if (!found) found = file.getName().equalsIgnoreCase(prefix + NetworkUtils.getPublicIPAddress() + extension);
|
if (!found) found = file.getName().equalsIgnoreCase(prefix + NetworkUtils.getPublicIPAddress() + extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,4 +109,42 @@ public abstract class ProtocolDNSServer extends DefaultMethodsOverrider {
|
|||||||
public abstract void validationPacketSendFailed(Domain domain, ConnectedProtocolClient client, Exception exception);
|
public abstract void validationPacketSendFailed(Domain domain, ConnectedProtocolClient client, Exception exception);
|
||||||
|
|
||||||
public abstract void domainDestinationPacketFailedSend(ConnectedProtocolClient client, Domain domain, DNSResponseCode validationResponse, Exception exception);
|
public abstract void domainDestinationPacketFailedSend(ConnectedProtocolClient client, Domain domain, DNSResponseCode validationResponse, Exception exception);
|
||||||
|
|
||||||
|
public final class ServerCertificateFolderStructure {
|
||||||
|
public final File certificatesFolder;
|
||||||
|
|
||||||
|
public final File publicFolder;
|
||||||
|
public final File privateFolder;
|
||||||
|
|
||||||
|
public final File privateCAFolder;
|
||||||
|
public final File privateServerFolder;
|
||||||
|
|
||||||
|
public final File publicCAFolder;
|
||||||
|
public final File publicServerFolder;
|
||||||
|
public final String caPrefix = "ca_dns_";
|
||||||
|
public final String certPrefix = "cert_dns_";
|
||||||
|
public ServerCertificateFolderStructure() {
|
||||||
|
certificatesFolder = new File("certificates");
|
||||||
|
|
||||||
|
publicFolder = new File(certificatesFolder, "public");
|
||||||
|
privateFolder = new File(certificatesFolder, "private");
|
||||||
|
|
||||||
|
privateCAFolder = new File(privateFolder, "ca");
|
||||||
|
privateServerFolder = new File(privateFolder, "server");
|
||||||
|
|
||||||
|
publicCAFolder = new File(publicFolder, "ca");
|
||||||
|
publicServerFolder = new File(publicFolder, "server");
|
||||||
|
|
||||||
|
if (!certificatesFolder.exists()) certificatesFolder.mkdirs();
|
||||||
|
|
||||||
|
if (!publicFolder.exists()) publicFolder.mkdirs();
|
||||||
|
if (!privateFolder.exists()) privateFolder.mkdirs();
|
||||||
|
|
||||||
|
if (!privateCAFolder.exists()) privateCAFolder.mkdirs();
|
||||||
|
if (!privateServerFolder.exists()) privateServerFolder.mkdirs();
|
||||||
|
|
||||||
|
if (!publicCAFolder.exists()) publicCAFolder.mkdirs();
|
||||||
|
if (!publicServerFolder.exists()) publicServerFolder.mkdirs();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
package org.openautonomousconnection.protocol.side.dns.events;
|
package org.openautonomousconnection.protocol.side.dns.events;
|
||||||
|
|
||||||
import org.openautonomousconnection.protocol.side.dns.ConnectedProtocolClient;
|
|
||||||
import lombok.Getter;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.event.impl.Event;
|
import dev.unlegitdqrk.unlegitlibrary.event.impl.Event;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.openautonomousconnection.protocol.side.dns.ConnectedProtocolClient;
|
||||||
|
|
||||||
public final class ConnectedProtocolClientEvent extends Event {
|
public final class ConnectedProtocolClientEvent extends Event {
|
||||||
|
|
||||||
|
@@ -1,12 +1,6 @@
|
|||||||
package org.openautonomousconnection.protocol.side.web;
|
package org.openautonomousconnection.protocol.side.web;
|
||||||
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.packets.Packet;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.ConnectionHandler;
|
import dev.unlegitdqrk.unlegitlibrary.network.system.server.ConnectionHandler;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.NetworkServer;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.ConnectionHandlerDisconnectedEvent;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.S_PacketReceivedEvent;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.S_PacketReceivedFailedEvent;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.network.system.server.events.S_UnknownObjectReceivedEvent;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.packets.OACPacket;
|
import org.openautonomousconnection.protocol.packets.OACPacket;
|
||||||
@@ -17,7 +11,6 @@ import org.openautonomousconnection.protocol.versions.ProtocolVersion;
|
|||||||
|
|
||||||
import javax.net.ssl.SSLSocket;
|
import javax.net.ssl.SSLSocket;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.SocketException;
|
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@@ -33,216 +26,15 @@ public final class ConnectedWebClient {
|
|||||||
private SSLSocket webSocket;
|
private SSLSocket webSocket;
|
||||||
private ObjectOutputStream outputStream;
|
private ObjectOutputStream outputStream;
|
||||||
private ObjectInputStream inputStream;
|
private ObjectInputStream inputStream;
|
||||||
private final Thread receiveThread = new Thread(this::receive);
|
private ProtocolVersion clientVersion = null; private final Thread receiveThread = new Thread(this::receive);
|
||||||
|
@Getter
|
||||||
private ProtocolVersion clientVersion = null;
|
private boolean clientVersionLoaded = false;
|
||||||
|
|
||||||
public ConnectedWebClient(ConnectionHandler pipelineConnection) {
|
public ConnectedWebClient(ConnectionHandler pipelineConnection) {
|
||||||
this.pipelineConnection = pipelineConnection;
|
this.pipelineConnection = pipelineConnection;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setWebSocket(SSLSocket webSocket) {
|
private static void sendRedirect(OutputStream out, String location, Map<String, String> cookies) throws IOException {
|
||||||
if (webSocket != null) this.webSocket = webSocket;
|
|
||||||
this.receiveThread.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isConnected() {
|
|
||||||
return this.webSocket != null && this.webSocket.isConnected() && !this.webSocket.isClosed() && this.receiveThread.isAlive() && pipelineConnection.isConnected();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public synchronized boolean disconnect() {
|
|
||||||
if (!this.isConnected()) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
pipelineConnection.disconnect();
|
|
||||||
|
|
||||||
if (this.receiveThread.isAlive()) {
|
|
||||||
this.receiveThread.interrupt();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
this.outputStream.close();
|
|
||||||
this.inputStream.close();
|
|
||||||
this.webSocket.close();
|
|
||||||
} catch (IOException var2) {
|
|
||||||
}
|
|
||||||
|
|
||||||
this.webSocket = null;
|
|
||||||
this.outputStream = null;
|
|
||||||
this.inputStream = null;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private boolean clientVersionLoaded = false;
|
|
||||||
|
|
||||||
public ProtocolVersion getClientVersion() {
|
|
||||||
return clientVersion == null ? ProtocolVersion.PV_1_0_0_CLASSIC : clientVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setClientVersion(ProtocolVersion clientVersion) {
|
|
||||||
if (!clientVersionLoaded) clientVersionLoaded = true;
|
|
||||||
if (clientVersion == null) this.clientVersion = clientVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isStableClient() {
|
|
||||||
return !isBetaClient() && !isClassicClient();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean supportClientStable() {
|
|
||||||
boolean yes = false;
|
|
||||||
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
|
||||||
yes = compatibleVersion.getProtocolType() == ProtocolVersion.ProtocolType.STABLE;
|
|
||||||
if (yes) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return isStableClient() || yes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isBetaClient() {
|
|
||||||
return getClientVersion().getProtocolType() == ProtocolVersion.ProtocolType.BETA;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean supportClientBeta() {
|
|
||||||
boolean yes = false;
|
|
||||||
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
|
||||||
yes = compatibleVersion.getProtocolType() == ProtocolVersion.ProtocolType.BETA;
|
|
||||||
if (yes) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return isBetaClient() || yes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isClassicClient() {
|
|
||||||
return getClientVersion().getProtocolType() == ProtocolVersion.ProtocolType.CLASSIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean supportClientClassic() {
|
|
||||||
boolean yes = false;
|
|
||||||
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
|
||||||
yes = compatibleVersion.getProtocolType() == ProtocolVersion.ProtocolType.CLASSIC;
|
|
||||||
if (yes) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return isClassicClient() || yes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean supportClientPacket(OACPacket packet) {
|
|
||||||
return supportClientVersion(packet.getProtocolVersion());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean supportClientVersion(ProtocolVersion targetVersion) {
|
|
||||||
return getClientVersion() == targetVersion || getClientVersion().getCompatibleVersions().contains(targetVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean supportClientProtocol(ProtocolVersion.Protocol protocol) {
|
|
||||||
boolean yes = false;
|
|
||||||
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
|
||||||
yes = compatibleVersion.getSupportedProtocols().contains(protocol);
|
|
||||||
if (yes) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return getClientVersion().getSupportedProtocols().contains(protocol) || yes;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void receive() {
|
|
||||||
try {
|
|
||||||
while(this.isConnected()) {
|
|
||||||
Object received = this.inputStream.readObject();
|
|
||||||
|
|
||||||
try (InputStream in = webSocket.getInputStream(); OutputStream out = webSocket.getOutputStream()) {
|
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
|
|
||||||
String line;
|
|
||||||
String path = "/main.html";
|
|
||||||
Map<String, String> headers = new HashMap<>();
|
|
||||||
while ((line = reader.readLine()) != null && !line.isEmpty()) {
|
|
||||||
if (line.toLowerCase().startsWith("get") || line.toLowerCase().startsWith("post")) {
|
|
||||||
path = line.split(" ")[1];
|
|
||||||
}
|
|
||||||
if (line.contains(":")) {
|
|
||||||
String[] parts = line.split(":", 2);
|
|
||||||
headers.put(parts[0].trim().toLowerCase(), parts[1].trim());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
path = URLDecoder.decode(path, StandardCharsets.UTF_8);
|
|
||||||
path = normalizePath(path);
|
|
||||||
|
|
||||||
File file = new File(ProtocolBridge.getInstance().getProtocolWebServer().getContentFolder(), path);
|
|
||||||
|
|
||||||
String sessionId = null;
|
|
||||||
if (headers.containsKey("cookie")) {
|
|
||||||
for (String cookie : headers.get("cookie").split(";")) {
|
|
||||||
cookie = cookie.trim();
|
|
||||||
if (cookie.startsWith("SESSIONID=")) {
|
|
||||||
sessionId = cookie.substring("SESSIONID=".length());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!file.exists() || !file.isFile()) {
|
|
||||||
sendResponse(out, 404, new File(ProtocolBridge.getInstance().getProtocolWebServer().getErrorsFolder(), "404.html"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String clientIp = webSocket.getInetAddress().getHostAddress();
|
|
||||||
String userAgent = headers.getOrDefault("user-agent", null);
|
|
||||||
|
|
||||||
boolean loggedIn = sessionId != null && SessionManager.isValid(sessionId, clientIp, userAgent);
|
|
||||||
|
|
||||||
if (path.equals("/403-login") && headers.getOrDefault("content-type","").startsWith("application/x-www-form-urlencoded")) {
|
|
||||||
Map<String,String> postParams = parsePostParams(in);
|
|
||||||
String login = postParams.get("login");
|
|
||||||
String password = postParams.get("password");
|
|
||||||
|
|
||||||
if (AuthManager.checkAuth(login, password)) {
|
|
||||||
String newSessionId = SessionManager.create(login, clientIp, userAgent);
|
|
||||||
Map<String,String> cookies = Map.of("Set-Cookie", "SESSIONID=" + newSessionId + "; HttpOnly; Path=/");
|
|
||||||
sendRedirect(out, "/main.html", cookies);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
sendRedirect(out, "/403.php", null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isMultipart(headers)) {
|
|
||||||
handleMultipart(in, headers, new File(ProtocolBridge.getInstance().getProtocolWebServer().getContentFolder(), "uploads"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RuleManager.requiresAuth(path) && !loggedIn) {
|
|
||||||
PHPResponse phpResp = renderPHPWithCookies(new File(ProtocolBridge.getInstance().getProtocolWebServer().getContentFolder(), "403.php"));
|
|
||||||
sendResponse(out, 200, phpResp.body.getBytes(StandardCharsets.UTF_8), "text/html", phpResp.cookies);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (RuleManager.isDenied(path) && !RuleManager.isAllowed(path)) {
|
|
||||||
sendResponse(out, 403, new File(ProtocolBridge.getInstance().getProtocolWebServer().getErrorsFolder(), "403.php"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (path.endsWith(".php")) {
|
|
||||||
PHPResponse phpResp = renderPHPWithCookies(file);
|
|
||||||
sendResponse(out, 200, phpResp.body.getBytes(StandardCharsets.UTF_8), "text/html", phpResp.cookies);
|
|
||||||
} else {
|
|
||||||
sendResponse(out, 200, Files.readAllBytes(file.toPath()), getContentType(path), null);
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} finally {
|
|
||||||
disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception var2) {
|
|
||||||
this.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void sendRedirect(OutputStream out, String location, Map<String,String> cookies) throws IOException {
|
|
||||||
out.write(("HTTP/1.1 302 Found\r\n").getBytes());
|
out.write(("HTTP/1.1 302 Found\r\n").getBytes());
|
||||||
out.write(("Location: " + location + "\r\n").getBytes());
|
out.write(("Location: " + location + "\r\n").getBytes());
|
||||||
if (cookies != null) {
|
if (cookies != null) {
|
||||||
@@ -254,23 +46,24 @@ public final class ConnectedWebClient {
|
|||||||
out.flush();
|
out.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String,String> parsePostParams(InputStream in) throws IOException {
|
private static Map<String, String> parsePostParams(InputStream in) throws IOException {
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
while (reader.ready()) {
|
while (reader.ready()) {
|
||||||
sb.append((char) reader.read());
|
sb.append((char) reader.read());
|
||||||
}
|
}
|
||||||
Map<String,String> map = new HashMap<>();
|
Map<String, String> map = new HashMap<>();
|
||||||
String[] pairs = sb.toString().split("&");
|
String[] pairs = sb.toString().split("&");
|
||||||
for (String p : pairs) {
|
for (String p : pairs) {
|
||||||
String[] kv = p.split("=",2);
|
String[] kv = p.split("=", 2);
|
||||||
if (kv.length == 2) map.put(URLDecoder.decode(kv[0], StandardCharsets.UTF_8), URLDecoder.decode(kv[1], StandardCharsets.UTF_8));
|
if (kv.length == 2)
|
||||||
|
map.put(URLDecoder.decode(kv[0], StandardCharsets.UTF_8), URLDecoder.decode(kv[1], StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String normalizePath(String path) {
|
private static String normalizePath(String path) {
|
||||||
path = path.replace("/", File.separator).replace("\\","/");
|
path = path.replace("/", File.separator).replace("\\", "/");
|
||||||
while (path.contains("..")) path = path.replace("..", "");
|
while (path.contains("..")) path = path.replace("..", "");
|
||||||
if (path.startsWith("/")) path = path.substring(1);
|
if (path.startsWith("/")) path = path.substring(1);
|
||||||
return path;
|
return path;
|
||||||
@@ -288,7 +81,7 @@ public final class ConnectedWebClient {
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isMultipart(Map<String,String> headers) {
|
private static boolean isMultipart(Map<String, String> headers) {
|
||||||
String contentType = headers.get("content-type");
|
String contentType = headers.get("content-type");
|
||||||
return contentType != null && contentType.startsWith("multipart/form-data");
|
return contentType != null && contentType.startsWith("multipart/form-data");
|
||||||
}
|
}
|
||||||
@@ -355,7 +148,7 @@ public final class ConnectedWebClient {
|
|||||||
return output.toString(StandardCharsets.UTF_8);
|
return output.toString(StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void sendResponse(OutputStream out, int code, File file, Map<String,String> headers) throws IOException {
|
private static void sendResponse(OutputStream out, int code, File file, Map<String, String> headers) throws IOException {
|
||||||
byte[] body = Files.readAllBytes(file.toPath());
|
byte[] body = Files.readAllBytes(file.toPath());
|
||||||
sendResponse(out, code, body, "text/html", headers);
|
sendResponse(out, code, body, "text/html", headers);
|
||||||
}
|
}
|
||||||
@@ -378,7 +171,10 @@ public final class ConnectedWebClient {
|
|||||||
out.write(("Content-Type: " + contentType + "\r\n").getBytes());
|
out.write(("Content-Type: " + contentType + "\r\n").getBytes());
|
||||||
out.write(("Content-Length: " + body.length + "\r\n").getBytes());
|
out.write(("Content-Length: " + body.length + "\r\n").getBytes());
|
||||||
if (headers != null) headers.forEach((k, v) -> {
|
if (headers != null) headers.forEach((k, v) -> {
|
||||||
try { out.write((k + ": " + v + "\r\n").getBytes()); } catch (IOException ignored) {}
|
try {
|
||||||
|
out.write((k + ": " + v + "\r\n").getBytes());
|
||||||
|
} catch (IOException ignored) {
|
||||||
|
}
|
||||||
});
|
});
|
||||||
out.write("\r\n".getBytes());
|
out.write("\r\n".getBytes());
|
||||||
out.write(body);
|
out.write(body);
|
||||||
@@ -452,6 +248,203 @@ public final class ConnectedWebClient {
|
|||||||
return new PHPResponse(body, cookies);
|
return new PHPResponse(body, cookies);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setWebSocket(SSLSocket webSocket) {
|
||||||
|
if (webSocket != null) this.webSocket = webSocket;
|
||||||
|
this.receiveThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isConnected() {
|
||||||
|
return this.webSocket != null && this.webSocket.isConnected() && !this.webSocket.isClosed() && this.receiveThread.isAlive() && pipelineConnection.isConnected();
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized boolean disconnect() {
|
||||||
|
if (!this.isConnected()) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
pipelineConnection.disconnect();
|
||||||
|
|
||||||
|
if (this.receiveThread.isAlive()) {
|
||||||
|
this.receiveThread.interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.outputStream.close();
|
||||||
|
this.inputStream.close();
|
||||||
|
this.webSocket.close();
|
||||||
|
} catch (IOException var2) {
|
||||||
|
}
|
||||||
|
|
||||||
|
this.webSocket = null;
|
||||||
|
this.outputStream = null;
|
||||||
|
this.inputStream = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProtocolVersion getClientVersion() {
|
||||||
|
return clientVersion == null ? ProtocolVersion.PV_1_0_0_CLASSIC : clientVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClientVersion(ProtocolVersion clientVersion) {
|
||||||
|
if (!clientVersionLoaded) clientVersionLoaded = true;
|
||||||
|
if (clientVersion == null) this.clientVersion = clientVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isStableClient() {
|
||||||
|
return !isBetaClient() && !isClassicClient();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportClientStable() {
|
||||||
|
boolean yes = false;
|
||||||
|
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
||||||
|
yes = compatibleVersion.getProtocolType() == ProtocolVersion.ProtocolType.STABLE;
|
||||||
|
if (yes) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isStableClient() || yes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBetaClient() {
|
||||||
|
return getClientVersion().getProtocolType() == ProtocolVersion.ProtocolType.BETA;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportClientBeta() {
|
||||||
|
boolean yes = false;
|
||||||
|
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
||||||
|
yes = compatibleVersion.getProtocolType() == ProtocolVersion.ProtocolType.BETA;
|
||||||
|
if (yes) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isBetaClient() || yes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isClassicClient() {
|
||||||
|
return getClientVersion().getProtocolType() == ProtocolVersion.ProtocolType.CLASSIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportClientClassic() {
|
||||||
|
boolean yes = false;
|
||||||
|
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
||||||
|
yes = compatibleVersion.getProtocolType() == ProtocolVersion.ProtocolType.CLASSIC;
|
||||||
|
if (yes) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isClassicClient() || yes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportClientPacket(OACPacket packet) {
|
||||||
|
return supportClientVersion(packet.getProtocolVersion());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportClientVersion(ProtocolVersion targetVersion) {
|
||||||
|
return getClientVersion() == targetVersion || getClientVersion().getCompatibleVersions().contains(targetVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportClientProtocol(ProtocolVersion.Protocol protocol) {
|
||||||
|
boolean yes = false;
|
||||||
|
for (ProtocolVersion compatibleVersion : getClientVersion().getCompatibleVersions()) {
|
||||||
|
yes = compatibleVersion.getSupportedProtocols().contains(protocol);
|
||||||
|
if (yes) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getClientVersion().getSupportedProtocols().contains(protocol) || yes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void receive() {
|
||||||
|
try {
|
||||||
|
while (this.isConnected()) {
|
||||||
|
Object received = this.inputStream.readObject();
|
||||||
|
|
||||||
|
try (InputStream in = webSocket.getInputStream(); OutputStream out = webSocket.getOutputStream()) {
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
|
||||||
|
String line;
|
||||||
|
String path = "/main.html";
|
||||||
|
Map<String, String> headers = new HashMap<>();
|
||||||
|
while ((line = reader.readLine()) != null && !line.isEmpty()) {
|
||||||
|
if (line.toLowerCase().startsWith("get") || line.toLowerCase().startsWith("post")) {
|
||||||
|
path = line.split(" ")[1];
|
||||||
|
}
|
||||||
|
if (line.contains(":")) {
|
||||||
|
String[] parts = line.split(":", 2);
|
||||||
|
headers.put(parts[0].trim().toLowerCase(), parts[1].trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
path = URLDecoder.decode(path, StandardCharsets.UTF_8);
|
||||||
|
path = normalizePath(path);
|
||||||
|
|
||||||
|
File file = new File(ProtocolBridge.getInstance().getProtocolWebServer().getContentFolder(), path);
|
||||||
|
|
||||||
|
String sessionId = null;
|
||||||
|
if (headers.containsKey("cookie")) {
|
||||||
|
for (String cookie : headers.get("cookie").split(";")) {
|
||||||
|
cookie = cookie.trim();
|
||||||
|
if (cookie.startsWith("SESSIONID=")) {
|
||||||
|
sessionId = cookie.substring("SESSIONID=".length());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!file.exists() || !file.isFile()) {
|
||||||
|
sendResponse(out, 404, new File(ProtocolBridge.getInstance().getProtocolWebServer().getErrorsFolder(), "404.html"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String clientIp = webSocket.getInetAddress().getHostAddress();
|
||||||
|
String userAgent = headers.getOrDefault("user-agent", null);
|
||||||
|
|
||||||
|
boolean loggedIn = sessionId != null && SessionManager.isValid(sessionId, clientIp, userAgent);
|
||||||
|
|
||||||
|
if (path.equals("/403-login") && headers.getOrDefault("content-type", "").startsWith("application/x-www-form-urlencoded")) {
|
||||||
|
Map<String, String> postParams = parsePostParams(in);
|
||||||
|
String login = postParams.get("login");
|
||||||
|
String password = postParams.get("password");
|
||||||
|
|
||||||
|
if (AuthManager.checkAuth(login, password)) {
|
||||||
|
String newSessionId = SessionManager.create(login, clientIp, userAgent);
|
||||||
|
Map<String, String> cookies = Map.of("Set-Cookie", "SESSIONID=" + newSessionId + "; HttpOnly; Path=/");
|
||||||
|
sendRedirect(out, "/main.html", cookies);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
sendRedirect(out, "/403.php", null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isMultipart(headers)) {
|
||||||
|
handleMultipart(in, headers, new File(ProtocolBridge.getInstance().getProtocolWebServer().getContentFolder(), "uploads"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RuleManager.requiresAuth(path) && !loggedIn) {
|
||||||
|
PHPResponse phpResp = renderPHPWithCookies(new File(ProtocolBridge.getInstance().getProtocolWebServer().getContentFolder(), "403.php"));
|
||||||
|
sendResponse(out, 200, phpResp.body.getBytes(StandardCharsets.UTF_8), "text/html", phpResp.cookies);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (RuleManager.isDenied(path) && !RuleManager.isAllowed(path)) {
|
||||||
|
sendResponse(out, 403, new File(ProtocolBridge.getInstance().getProtocolWebServer().getErrorsFolder(), "403.php"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path.endsWith(".php")) {
|
||||||
|
PHPResponse phpResp = renderPHPWithCookies(file);
|
||||||
|
sendResponse(out, 200, phpResp.body.getBytes(StandardCharsets.UTF_8), "text/html", phpResp.cookies);
|
||||||
|
} else {
|
||||||
|
sendResponse(out, 200, Files.readAllBytes(file.toPath()), getContentType(path), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception var2) {
|
||||||
|
this.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static class PHPResponse {
|
private static class PHPResponse {
|
||||||
String body;
|
String body;
|
||||||
Map<String, String> cookies;
|
Map<String, String> cookies;
|
||||||
@@ -461,4 +454,6 @@ public final class ConnectedWebClient {
|
|||||||
this.cookies = cookies;
|
this.cookies = cookies;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -17,67 +17,21 @@ import java.io.IOException;
|
|||||||
import java.security.cert.CertificateException;
|
import java.security.cert.CertificateException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
|
|
||||||
public class ProtocolWebServer {
|
public class ProtocolWebServer {
|
||||||
public final class ServerCertificateFolderStructure {
|
|
||||||
public final File certificatesFolder;
|
|
||||||
|
|
||||||
public final File publicFolder;
|
|
||||||
public final File privateFolder;
|
|
||||||
|
|
||||||
public final File privateCAFolder;
|
|
||||||
public final File privateServerFolder;
|
|
||||||
|
|
||||||
public final File publicCAFolder;
|
|
||||||
public final File publicServerFolder;
|
|
||||||
|
|
||||||
public ServerCertificateFolderStructure() {
|
|
||||||
certificatesFolder = new File("certificates");
|
|
||||||
|
|
||||||
publicFolder = new File(certificatesFolder, "public");
|
|
||||||
privateFolder = new File(certificatesFolder, "private");
|
|
||||||
|
|
||||||
privateCAFolder = new File(privateFolder, "ca");
|
|
||||||
privateServerFolder = new File(privateFolder, "server");
|
|
||||||
|
|
||||||
publicCAFolder = new File(publicFolder, "ca");
|
|
||||||
publicServerFolder = new File(publicFolder, "server");
|
|
||||||
|
|
||||||
if (!certificatesFolder.exists()) certificatesFolder.mkdirs();
|
|
||||||
|
|
||||||
if (!publicFolder.exists()) publicFolder.mkdirs();
|
|
||||||
if (!privateFolder.exists()) privateFolder.mkdirs();
|
|
||||||
|
|
||||||
if (!privateCAFolder.exists()) privateCAFolder.mkdirs();
|
|
||||||
if (!privateServerFolder.exists()) privateServerFolder.mkdirs();
|
|
||||||
|
|
||||||
if (!publicCAFolder.exists()) publicCAFolder.mkdirs();
|
|
||||||
if (!publicServerFolder.exists()) publicServerFolder.mkdirs();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final String caPrefix = "ca_server_";
|
|
||||||
public final String certPrefix = "cert_server_";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private NetworkServer pipelineServer;
|
|
||||||
@Getter
|
|
||||||
private SSLServerSocket webServer;
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final File contentFolder;
|
private final File contentFolder;
|
||||||
@Getter
|
@Getter
|
||||||
private final File errorsFolder;
|
private final File errorsFolder;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final ServerCertificateFolderStructure folderStructure;
|
private final ServerCertificateFolderStructure folderStructure;
|
||||||
|
|
||||||
private final ConfigurationManager configurationManager;
|
private final ConfigurationManager configurationManager;
|
||||||
private final File certFile;
|
private final File certFile;
|
||||||
private final File keyFile;
|
private final File keyFile;
|
||||||
|
@Getter
|
||||||
|
private NetworkServer pipelineServer;
|
||||||
|
@Getter
|
||||||
|
private SSLServerSocket webServer;
|
||||||
@Getter
|
@Getter
|
||||||
private List<ConnectedWebClient> clients;
|
private List<ConnectedWebClient> clients;
|
||||||
|
|
||||||
@@ -146,8 +100,8 @@ public class ProtocolWebServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final void startWebServer() throws Exception {
|
public final void startWebServer() throws Exception {
|
||||||
webServer = (SSLServerSocket)NetworkServer.ServerBuilder.
|
webServer = (SSLServerSocket) NetworkServer.ServerBuilder.
|
||||||
createSSLServerSocketFactory(folderStructure.publicCAFolder, certFile,keyFile).
|
createSSLServerSocketFactory(folderStructure.publicCAFolder, certFile, keyFile).
|
||||||
createServerSocket(configurationManager.getInt("port"));
|
createServerSocket(configurationManager.getInt("port"));
|
||||||
webServer.setSoTimeout(0);
|
webServer.setSoTimeout(0);
|
||||||
webServer.setEnabledProtocols(pipelineServer.getServerSocket().getEnabledProtocols());
|
webServer.setEnabledProtocols(pipelineServer.getServerSocket().getEnabledProtocols());
|
||||||
@@ -194,10 +148,12 @@ public class ProtocolWebServer {
|
|||||||
if (folder == null) throw new FileNotFoundException("Folder does not exist");
|
if (folder == null) throw new FileNotFoundException("Folder does not exist");
|
||||||
|
|
||||||
File[] files = folder.listFiles();
|
File[] files = folder.listFiles();
|
||||||
if (files == null || files.length == 0) throw new FileNotFoundException("Folder " + folder.getAbsolutePath() + " is empty");
|
if (files == null || files.length == 0)
|
||||||
|
throw new FileNotFoundException("Folder " + folder.getAbsolutePath() + " is empty");
|
||||||
|
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
if (!file.getName().startsWith(prefix) || !file.getName().endsWith(extension)) throw new CertificateException(file.getAbsolutePath() + " is not valid");
|
if (!file.getName().startsWith(prefix) || !file.getName().endsWith(extension))
|
||||||
|
throw new CertificateException(file.getAbsolutePath() + " is not valid");
|
||||||
if (!found) found = file.getName().equalsIgnoreCase(prefix + NetworkUtils.getPublicIPAddress() + extension);
|
if (!found) found = file.getName().equalsIgnoreCase(prefix + NetworkUtils.getPublicIPAddress() + extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,4 +188,42 @@ public class ProtocolWebServer {
|
|||||||
|
|
||||||
return configurationManager;
|
return configurationManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class ServerCertificateFolderStructure {
|
||||||
|
public final File certificatesFolder;
|
||||||
|
|
||||||
|
public final File publicFolder;
|
||||||
|
public final File privateFolder;
|
||||||
|
|
||||||
|
public final File privateCAFolder;
|
||||||
|
public final File privateServerFolder;
|
||||||
|
|
||||||
|
public final File publicCAFolder;
|
||||||
|
public final File publicServerFolder;
|
||||||
|
public final String caPrefix = "ca_server_";
|
||||||
|
public final String certPrefix = "cert_server_";
|
||||||
|
public ServerCertificateFolderStructure() {
|
||||||
|
certificatesFolder = new File("certificates");
|
||||||
|
|
||||||
|
publicFolder = new File(certificatesFolder, "public");
|
||||||
|
privateFolder = new File(certificatesFolder, "private");
|
||||||
|
|
||||||
|
privateCAFolder = new File(privateFolder, "ca");
|
||||||
|
privateServerFolder = new File(privateFolder, "server");
|
||||||
|
|
||||||
|
publicCAFolder = new File(publicFolder, "ca");
|
||||||
|
publicServerFolder = new File(publicFolder, "server");
|
||||||
|
|
||||||
|
if (!certificatesFolder.exists()) certificatesFolder.mkdirs();
|
||||||
|
|
||||||
|
if (!publicFolder.exists()) publicFolder.mkdirs();
|
||||||
|
if (!privateFolder.exists()) privateFolder.mkdirs();
|
||||||
|
|
||||||
|
if (!privateCAFolder.exists()) privateCAFolder.mkdirs();
|
||||||
|
if (!privateServerFolder.exists()) privateServerFolder.mkdirs();
|
||||||
|
|
||||||
|
if (!publicCAFolder.exists()) publicCAFolder.mkdirs();
|
||||||
|
if (!publicServerFolder.exists()) publicServerFolder.mkdirs();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -10,7 +10,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class AuthManager {
|
public class AuthManager {
|
||||||
|
|
||||||
private static Map<String, String> users = new HashMap<>();
|
private static final Map<String, String> users = new HashMap<>();
|
||||||
|
|
||||||
public static void loadAuthFile(File authFile) throws IOException {
|
public static void loadAuthFile(File authFile) throws IOException {
|
||||||
if (!authFile.exists()) authFile.createNewFile();
|
if (!authFile.exists()) authFile.createNewFile();
|
||||||
|
@@ -15,7 +15,8 @@ public class RuleManager {
|
|||||||
|
|
||||||
public static void loadRules(File rulesFile) throws Exception {
|
public static void loadRules(File rulesFile) throws Exception {
|
||||||
String json = new String(Files.readAllBytes(rulesFile.toPath()));
|
String json = new String(Files.readAllBytes(rulesFile.toPath()));
|
||||||
Map<String, List<String>> map = new Gson().fromJson(json, new TypeToken<Map<String, List<String>>>(){}.getType());
|
Map<String, List<String>> map = new Gson().fromJson(json, new TypeToken<Map<String, List<String>>>() {
|
||||||
|
}.getType());
|
||||||
allow = map.getOrDefault("allow", List.of());
|
allow = map.getOrDefault("allow", List.of());
|
||||||
deny = map.getOrDefault("deny", List.of());
|
deny = map.getOrDefault("deny", List.of());
|
||||||
auth = map.getOrDefault("auth", List.of());
|
auth = map.getOrDefault("auth", List.of());
|
||||||
|
@@ -13,33 +13,6 @@ public class SessionManager {
|
|||||||
private static final Map<String, Session> sessions = new ConcurrentHashMap<>();
|
private static final Map<String, Session> sessions = new ConcurrentHashMap<>();
|
||||||
private static final SecureRandom secureRandom = new SecureRandom();
|
private static final SecureRandom secureRandom = new SecureRandom();
|
||||||
|
|
||||||
private static class Session {
|
|
||||||
@Getter
|
|
||||||
String login;
|
|
||||||
String ip;
|
|
||||||
String userAgent;
|
|
||||||
long expiresAt;
|
|
||||||
|
|
||||||
Session(String login, String ip, String userAgent) throws IOException {
|
|
||||||
this.login = login;
|
|
||||||
this.ip = ip;
|
|
||||||
this.userAgent = userAgent;
|
|
||||||
this.expiresAt = System.currentTimeMillis() + (long) Main.getConfigurationManager().getInt("sessionexpireminutes") * 60 * 1000;;;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isExpired() {
|
|
||||||
return System.currentTimeMillis() > expiresAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean matches(String ip, String userAgent) {
|
|
||||||
return this.ip.equals(ip) && this.userAgent.equals(userAgent);
|
|
||||||
}
|
|
||||||
|
|
||||||
void refresh() throws IOException {
|
|
||||||
this.expiresAt = System.currentTimeMillis() + (long) Main.getConfigurationManager().getInt("sessionexpireminutes") * 60 * 1000;;;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String create(String login, String ip, String userAgent) throws IOException {
|
public static String create(String login, String ip, String userAgent) throws IOException {
|
||||||
byte[] bytes = new byte[32];
|
byte[] bytes = new byte[32];
|
||||||
secureRandom.nextBytes(bytes);
|
secureRandom.nextBytes(bytes);
|
||||||
@@ -76,4 +49,31 @@ public class SessionManager {
|
|||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
sessions.entrySet().removeIf(entry -> entry.getValue().isExpired());
|
sessions.entrySet().removeIf(entry -> entry.getValue().isExpired());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class Session {
|
||||||
|
@Getter
|
||||||
|
String login;
|
||||||
|
String ip;
|
||||||
|
String userAgent;
|
||||||
|
long expiresAt;
|
||||||
|
|
||||||
|
Session(String login, String ip, String userAgent) throws IOException {
|
||||||
|
this.login = login;
|
||||||
|
this.ip = ip;
|
||||||
|
this.userAgent = userAgent;
|
||||||
|
this.expiresAt = System.currentTimeMillis() + Main.getConfigurationManager().getInt("sessionexpireminutes") * 60 * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isExpired() {
|
||||||
|
return System.currentTimeMillis() > expiresAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean matches(String ip, String userAgent) {
|
||||||
|
return this.ip.equals(ip) && this.userAgent.equals(userAgent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void refresh() throws IOException {
|
||||||
|
this.expiresAt = System.currentTimeMillis() + Main.getConfigurationManager().getInt("sessionexpireminutes") * 60 * 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -50,9 +50,7 @@ public enum ProtocolVersion implements Serializable {
|
|||||||
public enum Protocol implements Serializable {
|
public enum Protocol implements Serializable {
|
||||||
HTTP,
|
HTTP,
|
||||||
HTTPS,
|
HTTPS,
|
||||||
OAC
|
OAC;
|
||||||
|
|
||||||
;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final String toString() {
|
public final String toString() {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package org.openautonomousconnection.protocol.versions.v1_0_0.beta;
|
package org.openautonomousconnection.protocol.versions.v1_0_0.beta;
|
||||||
|
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -22,6 +22,7 @@ public class Domain implements Serializable {
|
|||||||
private String fragment;
|
private String fragment;
|
||||||
@Getter
|
@Getter
|
||||||
private String protocol;
|
private String protocol;
|
||||||
|
|
||||||
public Domain(String fullDomain) {
|
public Domain(String fullDomain) {
|
||||||
// Remove protocol
|
// Remove protocol
|
||||||
String domainWithPath = fullDomain.contains("://") ? fullDomain.split("://", 2)[1] : fullDomain;
|
String domainWithPath = fullDomain.contains("://") ? fullDomain.split("://", 2)[1] : fullDomain;
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package org.openautonomousconnection.protocol.versions.v1_0_0.classic;
|
package org.openautonomousconnection.protocol.versions.v1_0_0.classic;
|
||||||
|
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
import org.openautonomousconnection.protocol.packets.v1_0_0.classic.Classic_DomainPacket;
|
|
||||||
import org.openautonomousconnection.protocol.packets.v1_0_0.classic.Classic_MessagePacket;
|
import org.openautonomousconnection.protocol.packets.v1_0_0.classic.Classic_MessagePacket;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
package org.openautonomousconnection.protocol.versions.v1_0_0.classic;
|
package org.openautonomousconnection.protocol.versions.v1_0_0.classic;
|
||||||
|
|
||||||
import org.openautonomousconnection.protocol.ProtocolBridge;
|
|
||||||
import org.openautonomousconnection.protocol.packets.v1_0_0.classic.Classic_PingPacket;
|
|
||||||
import dev.unlegitdqrk.unlegitlibrary.event.EventListener;
|
import dev.unlegitdqrk.unlegitlibrary.event.EventListener;
|
||||||
import dev.unlegitdqrk.unlegitlibrary.event.Listener;
|
import dev.unlegitdqrk.unlegitlibrary.event.Listener;
|
||||||
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
||||||
|
import org.openautonomousconnection.protocol.packets.v1_0_0.classic.Classic_PingPacket;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package org.openautonomousconnection.protocol.versions.v1_0_0.classic;
|
package org.openautonomousconnection.protocol.versions.v1_0_0.classic;
|
||||||
|
|
||||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.Domain;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user