package com.netifera.platform.net.dns.internal.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.IAction;
import com.netifera.platform.api.iterables.IndexedIterable;
import com.netifera.platform.api.model.IEntity;
import com.netifera.platform.api.model.IShadowEntity;
import com.netifera.platform.net.dns.model.DomainEntity;
import com.netifera.platform.net.dns.model.NSRecordEntity;
import com.netifera.platform.net.dns.service.DNS;
import com.netifera.platform.net.dns.tools.DNSReverseLookup;
import com.netifera.platform.net.dns.tools.DNSZoneTransfer;
import com.netifera.platform.net.dns.tools.HostNamesBruteforcer;
import com.netifera.platform.net.dns.tools.MXLookup;
import com.netifera.platform.net.dns.tools.NSLookup;
import com.netifera.platform.net.dns.tools.NetOpGeoLocalizer;
import com.netifera.platform.net.model.HostEntity;
import com.netifera.platform.net.model.NetblockEntity;
import com.netifera.platform.net.model.ServiceEntity;
import com.netifera.platform.tools.options.GenericOption;
import com.netifera.platform.tools.options.IterableOption;
import com.netifera.platform.tools.options.StringOption;
import com.netifera.platform.ui.actions.ToolAction;
import com.netifera.platform.ui.api.actions.IEntityActionProvider;
import com.netifera.platform.util.addresses.inet.IPv4Address;
import com.netifera.platform.util.addresses.inet.InternetAddress;
public class EntityActionProvider implements IEntityActionProvider {
public List<IAction> getActions(IShadowEntity entity) {
List<IAction> answer = new ArrayList<IAction>();
if (entity instanceof DomainEntity) {
String domain = ((DomainEntity)entity).getFQDM();
ToolAction nsLookup = new ToolAction("Lookup NS records for "+domain, NSLookup.class.getName());
nsLookup.addFixedOption(new StringOption("domain", "Domain", "Target domain", domain));
nsLookup.addOption(new GenericOption(DNS.class, "dns", "Name Server", "Target Name Server", null));
answer.add(nsLookup);
ToolAction mxLookup = new ToolAction("Lookup MX records for "+domain, MXLookup.class.getName());
mxLookup.addFixedOption(new StringOption("domain", "Domain", "Target domain", domain));
mxLookup.addOption(new GenericOption(DNS.class, "dns", "Name Server", "Target Name Server", null));
answer.add(mxLookup);
ToolAction hostNamesBruteforcer = new ToolAction("Lookup Common Host Names *."+domain, HostNamesBruteforcer.class.getName());
hostNamesBruteforcer.addFixedOption(new StringOption("domain", "Domain", "Target domain", domain));
hostNamesBruteforcer.addOption(new GenericOption(DNS.class, "dns", "Name Server", "Target Name Server", null));
answer.add(hostNamesBruteforcer);
}
DNS dns = (DNS) entity.getAdapter(DNS.class);
if (dns != null) {
ToolAction zoneTransfer = new ToolAction("Request Zone Transfer", DNSZoneTransfer.class.getName());
zoneTransfer.addOption(new StringOption("domain", "Domain", "Target domain", ""));
zoneTransfer.addFixedOption(new GenericOption(DNS.class,"dns", "Name Server", "Target Name Server", dns));
answer.add(zoneTransfer);
}
if (entity instanceof NSRecordEntity) {
ServiceEntity service = ((NSRecordEntity)entity).getService();
if (service != null) {
dns = (DNS) service.getAdapter(DNS.class);
ToolAction zoneTransfer = new ToolAction("Request Zone Transfer", DNSZoneTransfer.class.getName());
zoneTransfer.addOption(new StringOption("domain", "Domain", "Target domain", ((NSRecordEntity)entity).getDomain().getFQDM()));
zoneTransfer.addFixedOption(new GenericOption(DNS.class,"dns", "Name Server", "Target Name Server", dns));
answer.add(zoneTransfer);
}
}
IndexedIterable<InternetAddress> addresses = getInternetAddressIndexedIterable(entity);
if (addresses != null) {
ToolAction reverseLookup = new ToolAction("Reverse DNS Lookup", DNSReverseLookup.class.getName());
reverseLookup.addFixedOption(new IterableOption(InternetAddress.class, "target", "Target", "Addresses to reverse-lookup", addresses));
reverseLookup.addOption(new GenericOption(DNS.class, "dns", "Name Server", "Target Name Server", dns));
answer.add(reverseLookup);
addresses = getIPv4AddressIndexedIterable(entity);
if (addresses != null && !(entity instanceof NetblockEntity) && (!(entity instanceof HostEntity) || ((HostEntity)entity).getDefaultAddress().getNamedAttribute("country") == null)) {
if (addresses.itemCount() > 1 || (addresses.itemAt(0).isUniCast() && !addresses.itemAt(0).isPrivate())) {
ToolAction geoLocalizer = new ToolAction("Lookup Country by Address", NetOpGeoLocalizer.class.getName());
geoLocalizer.addFixedOption(new IterableOption(InternetAddress.class, "target", "Target", "Addresses to geo-localize", addresses));
answer.add(geoLocalizer);
}
}
}
return answer;
}
public List<IAction> getQuickActions(IShadowEntity shadow) {
// TODO Auto-generated method stub
return null;
}
@SuppressWarnings("unchecked")
private IndexedIterable<InternetAddress> getInternetAddressIndexedIterable(IEntity entity) {
return (IndexedIterable<InternetAddress>) entity.getIterableAdapter(InternetAddress.class);
}
@SuppressWarnings("unchecked")
private IndexedIterable<InternetAddress> getIPv4AddressIndexedIterable(IEntity entity) {
return (IndexedIterable<InternetAddress>) entity.getIterableAdapter(IPv4Address.class);
}
}