From a5782f9e42e48769626097d56462db3d5420fa55 Mon Sep 17 00:00:00 2001 From: angryziber Date: Thu, 4 Jan 2007 23:11:51 +0000 Subject: [PATCH] Fetcher info and Fetcher options context menu items implemented. git-svn-id: https://ipscan.svn.sourceforge.net/svnroot/ipscan/trunk@115 375186e5-ef17-0410-b0b6-91563547dcda --- ipscan/resources/Labels.txt | 12 +++- .../azib/ipscan/config/ComponentRegistry.java | 7 +++ .../azib/ipscan/core/ScanningResultList.java | 2 +- .../ipscan/fetchers/FetcherException.java | 8 +++ .../net/azib/ipscan/gui/DetailsDialog.java | 4 +- ipscan/src/net/azib/ipscan/gui/MainMenu.java | 8 +-- .../net/azib/ipscan/gui/OptionsDialog.java | 9 +++ .../src/net/azib/ipscan/gui/ResultTable.java | 8 +-- .../ipscan/gui/actions/ColumnsActions.java | 61 ++++++++++++++++++- .../azib/ipscan/gui/actions/ToolsActions.java | 8 +-- 10 files changed, 108 insertions(+), 19 deletions(-) diff --git a/ipscan/resources/Labels.txt b/ipscan/resources/Labels.txt index 06964d7f..b486fe3a 100755 --- a/ipscan/resources/Labels.txt +++ b/ipscan/resources/Labels.txt @@ -39,7 +39,7 @@ menu.help.about=&About... menu.columns.sortBy=Sort by menu.columns.sortDirection=Change sort direction menu.columns.info=Fetcher info -menu.columns.options=Fetcher options +menu.columns.options=Fetcher options... state.ready=Ready state.scanning=Scanning state.waitForThreads=Wait for all threads to terminate... @@ -83,6 +83,8 @@ text.openers.hintText=You may use any scanned values returned by fetchers in the text.fetchers.select=Here you can select fetchers for scanning. Fetchers are represented by columns. text.fetchers.selectedList=Selected fetchers text.fetchers.availableList=Available fetchers +text.fetchers.info=Fetcher information: +text.fetchers.info.notAvailable=Unfortunately, no additional information about this fetcher is available. text.about=%NAME\n\nVersion %VERSION\n%COPYLEFT\n\n%WEBSITE\n%MAILTO\n\nThis is an Open Source Software released under the GPL. text.gettingStarted=Dummy text.gettingStarted1=Angry IP Scanner is an IP address scanner tool.\n\nIt is used for scanning IP addresses for finding alive hosts, gathering any kind of needed information about each host. @@ -138,12 +140,19 @@ feeder.random.mask=IP Mask: feeder.random.hostname=Hostname: feeder.random.count=Count: fetcher.ip=IP +fetcher.ip.info=Displays the scanned IP address.\nThis fetcher is mandatory and cannot be removed from the list. fetcher.ping=Ping +fetcher.ping.info=Shows whether the host replies to ping requests and shows average packet roundtrip time to the host and back if it was detected (depending on the pinging method selected in the Options dialog). fetcher.ping.ttl=TTL +fetcher.ping.ttl.info=Shows the TTL (Time To Live) value in response IP packets to pings.\n\nThis value is usually decremented by each node in the network that forwards the packet, so if initial value is guessable (usually 64, 128, or 255), then the difference shows the distance to the host (in number of hosts). fetcher.hostname=Hostname +fetcher.hostname.info=Shows the hostname of the host obtained by the reverse DNS lookup.\n\nThis is the registered host name on the DNS server and may be different from the host name configured on the machine itself. fetcher.ports=Ports +fetcher.ports.info=Shows the list of open ports from the ones that were scanned.\n\nA port is open when it is possible to complete TCP handshake with it and estabilish a connection.\nYou can select scanned ports in the Options dialog. fetcher.ports.filtered=Filtered Ports +fetcher.ports.filtered.info=Shows the list of filtered ports from the ones that were scanned.\n\nA port is filtered when no response is being received to the connection attempt within specified amount of time. If a port is filtered, then it is probably blocked by a firewall. fetcher.comment=Comments +fetcher.comment.info=Allows writing of comments for each host.\nThe comments are persisted and always shown then the host is scanned. fetcher.value.ms= ms fetcher.value.notAvailable=[n/a] fetcher.value.notScanned=[n/s] @@ -177,6 +186,7 @@ exception.FeederException.random.invalidCount=Random address count must be great exception.FeederException.file.notExists=Specified file doesn't exist or you don't have permissions to read it exception.FeederException.file.errorWhileReading=Error while reading the file exception.FeederException.file.nothingFound=No IP addresses found in the file +exception.FetcherException.options.notAvailable=This fetcher doesn't have any options. exception.ExporterException.failed=Exporting failed exception.ExporterException.exporter.unknown=Unknown file type, please specify correct extension in the file name. exception.ExporterException.xml.noAppend=Appending to XML files is not supported. diff --git a/ipscan/src/net/azib/ipscan/config/ComponentRegistry.java b/ipscan/src/net/azib/ipscan/config/ComponentRegistry.java index fd629fa6..cceff79f 100755 --- a/ipscan/src/net/azib/ipscan/config/ComponentRegistry.java +++ b/ipscan/src/net/azib/ipscan/config/ComponentRegistry.java @@ -139,6 +139,7 @@ public class ComponentRegistry { new ComponentParameter("mainShell"), anyComponentParameter, anyComponentParameter, + anyComponentParameter, anyComponentParameter}); container.registerComponentImplementation(StatusBar.class, StatusBar.class, new Parameter[] { new ComponentParameter("mainShell")}); @@ -150,6 +151,8 @@ public class ComponentRegistry { new ConstantParameter(container)}); container.registerComponentImplementation(MainMenu.ColumnsMenu.class, MainMenu.ColumnsMenu.class, new Parameter[] { new ComponentParameter("mainShell"), + anyComponentParameter, + anyComponentParameter, anyComponentParameter}); container.registerComponentImplementation(OptionsDialog.class); @@ -158,6 +161,10 @@ public class ComponentRegistry { // various actions / listener container.registerComponentImplementation(StartStopScanningAction.class); container.registerComponentImplementation(ColumnsActions.SortBy.class); + container.registerComponentImplementation(ColumnsActions.FetcherOptions.class); + container.registerComponentImplementation(ColumnsActions.FetcherInfo.class); + container.registerComponentImplementation(ColumnsActions.ColumnClick.class); + container.registerComponentImplementation(ColumnsActions.ColumnResize.class); } public MainWindow createMainWindow() { diff --git a/ipscan/src/net/azib/ipscan/core/ScanningResultList.java b/ipscan/src/net/azib/ipscan/core/ScanningResultList.java index 2d0938f9..c44d4c62 100755 --- a/ipscan/src/net/azib/ipscan/core/ScanningResultList.java +++ b/ipscan/src/net/azib/ipscan/core/ScanningResultList.java @@ -77,7 +77,7 @@ public class ScanningResultList { details.append(fetcherName).append(":\t"); Object value = iterator.next(); details.append(value != null ? value : ""); - details.append(newLine).append("--------------------------------------------------------------------------------------").append(newLine); + details.append(newLine); } return details.toString(); } diff --git a/ipscan/src/net/azib/ipscan/fetchers/FetcherException.java b/ipscan/src/net/azib/ipscan/fetchers/FetcherException.java index 82cd6280..95fbebea 100755 --- a/ipscan/src/net/azib/ipscan/fetchers/FetcherException.java +++ b/ipscan/src/net/azib/ipscan/fetchers/FetcherException.java @@ -18,4 +18,12 @@ public class FetcherException extends RuntimeException { super(cause); } + public FetcherException(String label, Throwable cause) { + super(label, cause); + } + + public FetcherException(String label) { + super(label); + } + } diff --git a/ipscan/src/net/azib/ipscan/gui/DetailsDialog.java b/ipscan/src/net/azib/ipscan/gui/DetailsDialog.java index 0191ecbb..6af6ab29 100755 --- a/ipscan/src/net/azib/ipscan/gui/DetailsDialog.java +++ b/ipscan/src/net/azib/ipscan/gui/DetailsDialog.java @@ -33,7 +33,7 @@ public class DetailsDialog extends AbstractModalDialog { private void createShell(Shell parent) { shell = new Shell(parent, SWT.TOOL | SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE); shell.setText(Labels.getLabel("title.details")); - shell.setSize(new Point(300, 300)); + shell.setSize(new Point(300, 200)); shell.setImage(parent.getImage()); FillLayout fillLayout = new FillLayout(); fillLayout.spacing = 3; @@ -41,7 +41,7 @@ public class DetailsDialog extends AbstractModalDialog { fillLayout.marginWidth = 3; shell.setLayout(fillLayout); - Text detailsText = new Text(shell, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL); + Text detailsText = new Text(shell, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL); detailsText.setText(resultTable.getIPDetails()); detailsText.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); detailsText.setTabs(32); diff --git a/ipscan/src/net/azib/ipscan/gui/MainMenu.java b/ipscan/src/net/azib/ipscan/gui/MainMenu.java index 99c7a1cb..b2de4ef7 100755 --- a/ipscan/src/net/azib/ipscan/gui/MainMenu.java +++ b/ipscan/src/net/azib/ipscan/gui/MainMenu.java @@ -50,7 +50,7 @@ public class MainMenu { container.registerComponentImplementation(CommandsActions.EditOpeners.class); container.registerComponentImplementation(CommandsActions.SelectOpener.class); - container.registerComponentImplementation(CommandsActions.ShowOpenersMenu.class); + container.registerComponentImplementation(CommandsActions.ShowOpenersMenu.class); // this one is not cached because we need 2 instances of it - in the Commands menu and in the context menu container.registerComponent(new ConstructorInjectionComponentAdapter(OpenersMenu.class, OpenersMenu.class)); @@ -219,12 +219,12 @@ public class MainMenu { * This is the menu when clicking on a column header. */ public static class ColumnsMenu extends Menu { - public ColumnsMenu(Decorations parent, ColumnsActions.SortBy sortByListener) { + public ColumnsMenu(Decorations parent, ColumnsActions.SortBy sortByListener, ColumnsActions.FetcherInfo infoListener, ColumnsActions.FetcherOptions optionsListener) { super(parent, SWT.POP_UP); initMenuItem(this, "menu.columns.sortBy", null, null, sortByListener); - initMenuItem(this, "menu.columns.info", null, null, null); - initMenuItem(this, "menu.columns.options", null, null, null); + initMenuItem(this, "menu.columns.options", null, null, optionsListener); + initMenuItem(this, "menu.columns.info", null, null, infoListener); } protected void checkSubclass() { } // allow extending of Menu class } diff --git a/ipscan/src/net/azib/ipscan/gui/OptionsDialog.java b/ipscan/src/net/azib/ipscan/gui/OptionsDialog.java index 9f7ce9bc..3bd4919c 100755 --- a/ipscan/src/net/azib/ipscan/gui/OptionsDialog.java +++ b/ipscan/src/net/azib/ipscan/gui/OptionsDialog.java @@ -60,9 +60,18 @@ public class OptionsDialog extends AbstractModalDialog { } public void open() { + openTab(0); + } + + /** + * Opens the specified tab of options dialog + * @param tabIndex + */ + public void openTab(int tabIndex) { // widgets are created on demand createShell(); loadOptions(); + tabFolder.setSelection(tabIndex); super.open(); } diff --git a/ipscan/src/net/azib/ipscan/gui/ResultTable.java b/ipscan/src/net/azib/ipscan/gui/ResultTable.java index 1f1cf29e..4c952929 100755 --- a/ipscan/src/net/azib/ipscan/gui/ResultTable.java +++ b/ipscan/src/net/azib/ipscan/gui/ResultTable.java @@ -18,7 +18,6 @@ import net.azib.ipscan.core.ScanningSubject; import net.azib.ipscan.fetchers.Fetcher; import net.azib.ipscan.fetchers.FetcherRegistry; import net.azib.ipscan.fetchers.FetcherRegistryUpdateListener; -import net.azib.ipscan.gui.MainMenu.ColumnsMenu; import net.azib.ipscan.gui.actions.ColumnsActions; import net.azib.ipscan.gui.actions.CommandsActions; @@ -48,15 +47,15 @@ public class ResultTable extends Table implements FetcherRegistryUpdateListener private Listener columnResizeListener; - public ResultTable(Composite parent, ColumnsMenu columnsMenu, FetcherRegistry fetcherRegistry, ScanningResultList scanningResultList) { + public ResultTable(Composite parent, FetcherRegistry fetcherRegistry, ScanningResultList scanningResultList, ColumnsActions.ColumnClick columnClickListener, ColumnsActions.ColumnResize columnResizeListener) { super(parent, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL); this.scanningResults = scanningResultList; setHeaderVisible(true); setLinesVisible(true); - columnClickListener = new ColumnsActions.ColumnClick(columnsMenu); - columnResizeListener = new ColumnsActions.ColumnResize(); + this.columnClickListener = columnClickListener; + this.columnResizeListener = columnResizeListener; fetcherRegistry.addListener(this); handleUpdateOfSelectedFetchers(fetcherRegistry); @@ -103,6 +102,7 @@ public class ResultTable extends Table implements FetcherRegistryUpdateListener String fetcherName = Labels.getLabel(fetcher.getLabel()); tableColumn.setWidth(Config.getDimensionsConfig().getColumnWidth(fetcherName)); tableColumn.setText(fetcherName); + tableColumn.setData(fetcher); // this is used in some listeners in ColumnsActions tableColumn.addListener(SWT.Selection, columnClickListener); tableColumn.addListener(SWT.Resize, columnResizeListener); } diff --git a/ipscan/src/net/azib/ipscan/gui/actions/ColumnsActions.java b/ipscan/src/net/azib/ipscan/gui/actions/ColumnsActions.java index 829857d4..6107553a 100755 --- a/ipscan/src/net/azib/ipscan/gui/actions/ColumnsActions.java +++ b/ipscan/src/net/azib/ipscan/gui/actions/ColumnsActions.java @@ -5,9 +5,16 @@ */ package net.azib.ipscan.gui.actions; +import java.util.MissingResourceException; + import net.azib.ipscan.config.Config; import net.azib.ipscan.config.Labels; import net.azib.ipscan.config.Platform; +import net.azib.ipscan.fetchers.Fetcher; +import net.azib.ipscan.fetchers.FetcherException; +import net.azib.ipscan.fetchers.PingFetcher; +import net.azib.ipscan.fetchers.PortsFetcher; +import net.azib.ipscan.gui.OptionsDialog; import net.azib.ipscan.gui.MainMenu.ColumnsMenu; import org.eclipse.swt.SWT; @@ -15,6 +22,7 @@ import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; @@ -57,8 +65,8 @@ public class ColumnsActions { sortMenuItem.setText(Labels.getLabel("menu.columns.sortBy") + tableColumn.getText()); } - // remember the clicked column (see SortBy below) - sortMenuItem.setData(tableColumn); + // remember the clicked column (see SortBy, FetcherOptions, and FetcherInfo below) + columnsMenu.setData(tableColumn); // show the menu columnsMenu.setLocation(e.display.getCursorLocation()); @@ -70,7 +78,7 @@ public class ColumnsActions { public void handleEvent(Event event) { // retrieve the clicked column (see ColumnClick above) - TableColumn tableColumn = (TableColumn) event.widget.getData(); + TableColumn tableColumn = (TableColumn) ((MenuItem)event.widget).getParent().getData(); Table table = tableColumn.getParent(); @@ -84,7 +92,54 @@ public class ColumnsActions { // TODO: execute ScanningResultList.sort() here!!! } + } + + public static class FetcherOptions implements Listener { + + private OptionsDialog optionsDialog; + + public FetcherOptions(OptionsDialog optionsDialog) { + this.optionsDialog = optionsDialog; + } + public void handleEvent(Event event) { + // retrieve the clicked column (see ColumnClick above) + TableColumn tableColumn = (TableColumn) ((MenuItem)event.widget).getParent().getData(); + + Fetcher fetcher = (Fetcher) tableColumn.getData(); + + // some hardcodes here for 'special' fetchers + if (fetcher instanceof PingFetcher) { + optionsDialog.open(); + } + else + if (fetcher instanceof PortsFetcher) { + optionsDialog.openTab(1); + } + else { + throw new FetcherException("options.notAvailable"); + } + } + } + + public static class FetcherInfo implements Listener { + + public void handleEvent(Event event) { + // retrieve the clicked column (see ColumnClick above) + TableColumn tableColumn = (TableColumn) ((MenuItem)event.widget).getParent().getData(); + + Fetcher fetcher = (Fetcher) tableColumn.getData(); + + MessageBox messageBox = new MessageBox(event.display.getActiveShell(), SWT.ICON_INFORMATION); + messageBox.setText(Labels.getLabel("text.fetchers.info") + Labels.getLabel(fetcher.getLabel())); + try { + messageBox.setMessage(Labels.getLabel(fetcher.getLabel() + ".info")); + } + catch (MissingResourceException e) { + messageBox.setMessage(Labels.getLabel("text.fetchers.info.notAvailable")); + } + messageBox.open(); + } } } diff --git a/ipscan/src/net/azib/ipscan/gui/actions/ToolsActions.java b/ipscan/src/net/azib/ipscan/gui/actions/ToolsActions.java index d6283308..d1bbc3bc 100755 --- a/ipscan/src/net/azib/ipscan/gui/actions/ToolsActions.java +++ b/ipscan/src/net/azib/ipscan/gui/actions/ToolsActions.java @@ -20,14 +20,14 @@ public class ToolsActions { public static class Options implements Listener { - private OptionsDialog optionsWindow; + private OptionsDialog optionsDialog; - public Options(OptionsDialog optionsWindow) { - this.optionsWindow = optionsWindow; + public Options(OptionsDialog optionsDialog) { + this.optionsDialog = optionsDialog; } public void handleEvent(Event event) { - optionsWindow.open(); + optionsDialog.open(); } }