2025-12-13 15:53:57 +01:00
|
|
|
package org.openautonomousconnection.insserver;
|
2025-12-11 12:01:09 +01:00
|
|
|
|
2025-12-13 15:53:57 +01:00
|
|
|
import org.openautonomousconnection.insserver.utils.ClassicHelper;
|
|
|
|
|
import org.openautonomousconnection.insserver.utils.ParsedDomain;
|
2025-12-11 12:01:09 +01:00
|
|
|
import org.openautonomousconnection.protocol.ProtocolBridge;
|
|
|
|
|
import org.openautonomousconnection.protocol.side.ins.ConnectedProtocolClient;
|
|
|
|
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.INSRecord;
|
|
|
|
|
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.INSRecordType;
|
|
|
|
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.handlers.ClassicHandlerINSServer;
|
|
|
|
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.objects.Classic_Domain;
|
|
|
|
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.objects.Classic_RequestDomain;
|
|
|
|
|
import org.openautonomousconnection.protocol.versions.v1_0_0.classic.utils.Classic_ProtocolVersion;
|
|
|
|
|
|
|
|
|
|
import java.sql.*;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
|
public class ClassicHandler extends ClassicHandlerINSServer {
|
|
|
|
|
|
|
|
|
|
private ProtocolBridge bridge() {
|
|
|
|
|
return Main.getProtocolBridge();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void handleMessage(ConnectedProtocolClient client, String message, Classic_ProtocolVersion protocolVersion) {
|
|
|
|
|
bridge().getLogger().info("[ClassicHandler] Message received from ClientID " + client.getConnectionHandler().getClientID() +
|
|
|
|
|
" (Classic Version " + protocolVersion.version + ", Client Version: " +
|
|
|
|
|
client.getClientVersion().toString() + "): " + message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Classic_Domain getDomain(Classic_RequestDomain requestDomain) throws SQLException {
|
|
|
|
|
|
|
|
|
|
ParsedDomain pd = ClassicHelper.parseDomain(requestDomain);
|
|
|
|
|
|
|
|
|
|
// FIRST try A-record
|
|
|
|
|
List<INSRecord> a = bridge().getProtocolINSServer().resolve(pd.tln, pd.name, pd.sub, INSRecordType.A);
|
|
|
|
|
|
|
|
|
|
if (!a.isEmpty()) {
|
|
|
|
|
return ClassicHelper.buildClassicDomain(pd, a.get(0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If no A, try CNAME
|
|
|
|
|
List<INSRecord> cnameList = bridge().getProtocolINSServer().resolve(pd.tln, pd.name, pd.sub, INSRecordType.CNAME);
|
|
|
|
|
|
|
|
|
|
if (cnameList.isEmpty()) return null; // completely not found
|
|
|
|
|
|
|
|
|
|
INSRecord cname = cnameList.get(0);
|
|
|
|
|
|
|
|
|
|
// CNAME target = "www.example.net" or "app.dev"
|
|
|
|
|
String[] cnameParts = cname.value.split("\\.");
|
|
|
|
|
if (cnameParts.length < 2) return null;
|
|
|
|
|
|
|
|
|
|
String cnameTln = cnameParts[cnameParts.length - 1];
|
|
|
|
|
String cnameName = cnameParts[cnameParts.length - 2];
|
|
|
|
|
String cnameSub = cnameParts.length > 2
|
|
|
|
|
? String.join(".", java.util.Arrays.copyOfRange(cnameParts, 0, cnameParts.length - 2))
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
List<INSRecord> aAfterCname = bridge().getProtocolINSServer().resolve(cnameTln, cnameName, cnameSub, INSRecordType.A);
|
|
|
|
|
|
|
|
|
|
if (aAfterCname.isEmpty()) return null;
|
|
|
|
|
|
|
|
|
|
return ClassicHelper.buildClassicDomain(pd, aAfterCname.get(0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Classic_Domain ping(Classic_RequestDomain req) {
|
|
|
|
|
return new Classic_Domain(req.name, req.topLevelDomain, null, req.path, bridge());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void unsupportedClassicPacket(String className, Object[] content, ConnectedProtocolClient client) {
|
|
|
|
|
bridge().getLogger().warn(
|
|
|
|
|
"[Classic UnsupportedPacket] From client " + client.getConnectionHandler().getClientID() +
|
|
|
|
|
": packet=" + className + " content=" + java.util.Arrays.toString(content)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|