Files
INSServer/src/main/java/org/openautonomousconnection/insserver/ClassicHandler.java
2025-12-13 15:53:57 +01:00

79 lines
3.4 KiB
Java

package org.openautonomousconnection.insserver;
import org.openautonomousconnection.insserver.utils.ClassicHelper;
import org.openautonomousconnection.insserver.utils.ParsedDomain;
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)
);
}
}