package com.netifera.platform.net.internal.services.detection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.netifera.platform.net.services.detection.INetworkServiceDetector;
import com.netifera.platform.net.services.detection.INetworkServiceDetectorProvider;
import com.netifera.platform.net.services.detection.INetworkServiceTrigger;
import com.netifera.platform.net.services.detection.IServerDetectorService;
import com.netifera.platform.util.PortSet;
import com.netifera.platform.util.patternmatching.IPattern;
public class ServerDetectorService extends NetworkServiceDetectorService implements IServerDetectorService {
private final ArrayList<INetworkServiceTrigger> triggers = new ArrayList<INetworkServiceTrigger>();
public byte[] getTrigger(String protocol, int port) {
for (INetworkServiceTrigger trigger: triggers)
if (trigger.getProtocol().equals(protocol) && trigger.getPorts().contains(port)) {
return trigger.getBytes();
}
return new byte[0];
}
private final static PortSet DEFAULT_TCP_PORTSET = new PortSet("21-23,25,80,110,111,143,443,445,1433,1521,3306,8000,8080,8081,8888");
private final static PortSet DEFAULT_UDP_PORTSET = new PortSet("53,111,137,139,161,5060");
// Returns the PortSet of (pre-registered) triggerable ports for a given protocol
public PortSet getTriggerablePorts(String protocol) {
if (protocol.equals("tcp")) {
return DEFAULT_TCP_PORTSET;
}
return DEFAULT_UDP_PORTSET;
/*
int MAX_PORTSET_SIZE = 10; // FIXME
PortSet answer = new PortSet();
for (INetworkServiceTrigger trigger: triggers) {
if (trigger.getProtocol().equals(protocol)) {
PortSet triggerPorts = trigger.getPorts();
//if (triggerPorts.itemCount() < MAX_PORTSET_SIZE) {
answer.addPortSet(triggerPorts);
//}
}
}
return answer;
*/
}
protected void registerDetectorProvider(INetworkServiceDetectorProvider provider) {
for (INetworkServiceTrigger each: provider.getTriggers())
triggers.add(each);
for (INetworkServiceDetector each: provider.getServerDetectors())
addDetector(each);
}
protected void unregisterDetectorProvider(INetworkServiceDetectorProvider provider) {
// epa!
}
public Map<String,String> detect(String protocol, int port,
String trigger, String response) {
List<INetworkServiceDetector> detectors = this.detectors.get(protocol);
if (detectors == null)
return null;
for (INetworkServiceDetector each: detectors) {
if (each.getPorts() != null && !each.getPorts().contains(port)) continue;
Map<String,String> result = each.detect(trigger, response);
if (result != null) {
if (result.get("serviceType").equals("HTTP"))
response = response.split("\\n\\n|\\r\\n\\r\\n")[0];
if (!result.containsKey("banner") && isPrintable(response))
result.put("banner", response);
String os = result.get("os");
if (os == null || os.equals("Unix"))
for (IPattern osDetector: genericOSDetectors)
if (osDetector.match(result, response))
return result;
return result;
}
}
return null;
}
}