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