diff --git a/platform/com.subgraph.vega.ui.util/build.properties b/platform/com.subgraph.vega.ui.util/build.properties index e9863e28..6c480f39 100644 --- a/platform/com.subgraph.vega.ui.util/build.properties +++ b/platform/com.subgraph.vega.ui.util/build.properties @@ -2,4 +2,5 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ .,\ - plugin.xml + plugin.xml,\ + icons/ diff --git a/platform/com.subgraph.vega.ui.util/icons/proxy.png b/platform/com.subgraph.vega.ui.util/icons/proxy.png new file mode 100644 index 00000000..2a8a4cfe Binary files /dev/null and b/platform/com.subgraph.vega.ui.util/icons/proxy.png differ diff --git a/platform/com.subgraph.vega.ui.util/icons/scanner.png b/platform/com.subgraph.vega.ui.util/icons/scanner.png new file mode 100644 index 00000000..43e2f8d4 Binary files /dev/null and b/platform/com.subgraph.vega.ui.util/icons/scanner.png differ diff --git a/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/Activator.java b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/Activator.java index 272eef0a..7251265b 100644 --- a/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/Activator.java +++ b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/Activator.java @@ -2,6 +2,9 @@ import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; +import org.osgi.util.tracker.ServiceTracker; + +import com.subgraph.vega.api.model.IModel; /** * The activator class controls the plug-in life cycle @@ -13,7 +16,8 @@ public class Activator extends AbstractUIPlugin { // The shared instance private static Activator plugin; - + private ServiceTracker modelTracker; + /** * The constructor */ @@ -27,6 +31,8 @@ public Activator() { public void start(BundleContext context) throws Exception { super.start(context); plugin = this; + modelTracker = new ServiceTracker(context, IModel.class.getName(), null); + modelTracker.open(); } /* @@ -47,4 +53,7 @@ public static Activator getDefault() { return plugin; } + public IModel getModel() { + return modelTracker.getService(); + } } diff --git a/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/AlertExportWizard.java b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/AlertExportWizard.java new file mode 100644 index 00000000..14b19aff --- /dev/null +++ b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/AlertExportWizard.java @@ -0,0 +1,54 @@ +package com.subgraph.vega.ui.util.export; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.wizard.Wizard; + +import com.subgraph.vega.api.model.alerts.IScanAlert; +import com.subgraph.vega.api.model.alerts.IScanInstance; +import com.subgraph.vega.export.AlertExporter; + +public class AlertExportWizard extends Wizard { + + protected ExportWizardPageOne one; + protected ExportWizardPageTwo two; + protected ExportWizardPageThree three; + private IScanInstance scanInstance = null; + + public AlertExportWizard(IScanInstance s) { + super(); + scanInstance = s; + } + + public AlertExportWizard() { + super(); + } + + @Override + public void addPages() { + one = new ExportWizardPageOne(); + two = new ExportWizardPageTwo(scanInstance); + three = new ExportWizardPageThree(); + addPage(one); + addPage(two); + addPage(three); + + } + + @Override + public boolean performFinish() { + // TODO Auto-generated method stub + + + List alerts; + alerts = two.allAlertsFromTree(); + System.out.println(alerts.size()); + + AlertExporter exporter = new AlertExporter(); + exporter.exportAlertsbyList(alerts); + + return true; + } + +} diff --git a/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/ExportWizardPageOne.java b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/ExportWizardPageOne.java new file mode 100644 index 00000000..a9ef10f3 --- /dev/null +++ b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/ExportWizardPageOne.java @@ -0,0 +1,82 @@ +package com.subgraph.vega.ui.util.export; + + + +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; + +public class ExportWizardPageOne extends WizardPage { + + + private Composite container; + private Group radioGroup; + private String choice = "HTML"; + + protected ExportWizardPageOne() { + super("Output format"); + setTitle("Output format"); + setDescription("HTML or XML output format."); + + } + + @Override + public void createControl(Composite parent) { + + container = new Composite(parent, SWT.NONE); + + GridData gd = new GridData(); + gd.grabExcessHorizontalSpace = true; + container.setLayoutData(gd); + + GridLayout layout = new GridLayout(); + + container.setLayout(layout); + layout.numColumns = 1; + + /*Label l = new Label(container, SWT.NONE); + l.setText("Select XML or HTML output.");*/ + + + radioGroup = new Group(container, SWT.SHADOW_IN); + radioGroup.setText("Select XML or HTML output."); + gd.grabExcessHorizontalSpace = true; + radioGroup.setLayoutData(gd); + + radioGroup.setLayout(new RowLayout(SWT.VERTICAL)); + Button htmlButton = new Button(radioGroup, SWT.RADIO); + Button xmlButton = new Button(radioGroup, SWT.RADIO); + xmlButton.setText("XML"); + htmlButton.setText("HTML"); + htmlButton.setSelection(true); + xmlButton.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent e) { + choice = xmlButton.getText(); + } + }); + + htmlButton.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent e) { + choice = xmlButton.getText(); + } + }); + + setControl(container); + + } + + protected String getChoice() { + return this.choice; + } + +} diff --git a/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/ExportWizardPageThree.java b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/ExportWizardPageThree.java new file mode 100644 index 00000000..9ce383ff --- /dev/null +++ b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/ExportWizardPageThree.java @@ -0,0 +1,109 @@ +package com.subgraph.vega.ui.util.export; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.eclipse.jface.wizard.IWizardPage; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class ExportWizardPageThree extends WizardPage { + + protected FileDialog dialog; + protected Text textField; + protected Composite container; + private String saveFilename = null; + private String filename = null; + + final static int VISIBLE_PATH_LENGTH = 255; + + protected ExportWizardPageThree() { + super("Output destination"); + + + + setTitle("Destination for report output."); + + } + + @Override + public void createControl(Composite parent) { + + container = new Composite(parent, SWT.NONE); + + GridLayout layout = new GridLayout(); + container.setLayout(layout); + layout.numColumns = 2; + + Label label = new Label(container, SWT.NONE); + label.setText("Choose file:"); + textField = new Text(container, SWT.READ_ONLY | SWT.FILL); + textField.setSize(VISIBLE_PATH_LENGTH, textField.getSize().y); + Button button = new Button(container, SWT.NONE); + button.setText("Open"); + + GridData buttonGridData = new GridData(); + buttonGridData.horizontalSpan = 2; + buttonGridData.horizontalAlignment = SWT.END; + button.setLayoutData(buttonGridData); + + GridData textFieldGridData = new GridData(); + textFieldGridData.widthHint = 300; + textField.setLayoutData(textFieldGridData); + + button.addSelectionListener (new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + doFileDialog(parent.getShell()); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // TODO Auto-generated method stub + + }}); + + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); + filename = "Vega-report-"+dateFormat.format(new Date()); + + IWizardPage pageOne = getPreviousPage().getPreviousPage(); + String ext = ((ExportWizardPageOne) pageOne).getChoice(); + + if (ext.equals("HTML")) { + filename += ".html"; + } else if (ext.equals("XML")){ + filename += ".xml"; + } + + setPageComplete(false); + setControl(container); + } + + private void doFileDialog(Shell shell) { + dialog = new FileDialog(shell, SWT.SAVE); + dialog.setText("Choose an output file"); + + dialog.setFileName(filename); + saveFilename = dialog.open(); + if (saveFilename != null) { + textField.setText(saveFilename); + setPageComplete(true); + } + } + + String getSaveFilename() { + return saveFilename; + } +} diff --git a/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/ExportWizardPageTwo.java b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/ExportWizardPageTwo.java new file mode 100644 index 00000000..811f3403 --- /dev/null +++ b/platform/com.subgraph.vega.ui.util/src/com/subgraph/vega/ui/util/export/ExportWizardPageTwo.java @@ -0,0 +1,261 @@ +package com.subgraph.vega.ui.util.export; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.viewers.TreeSelection; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.events.TreeEvent; +import org.eclipse.swt.events.TreeListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeItem; + +import com.subgraph.vega.api.model.IModel; +import com.subgraph.vega.api.model.alerts.IScanInstance; +import com.subgraph.vega.api.model.alerts.IScanAlert; +import com.subgraph.vega.ui.util.Activator; + +public class ExportWizardPageTwo extends WizardPage { + + protected Label label; + private Composite container; + private final IModel model; + private IScanInstance scanInstance = null; + private final Logger logger = Logger.getLogger("export-wizard"); + private final SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); + + Tree alertsTree; + ScrolledComposite treeContainer; + + private final static String SCAN_IMAGE = "/icons/scanner.png"; + private final static String PROXY_IMAGE = "/icons/proxy.png"; + + protected ExportWizardPageTwo(IScanInstance s) { + super("Alerts"); + setTitle("Scans to include in report."); + + scanInstance = s; + + model = Activator.getDefault().getModel(); + if (model == null) { + logger.warning("Failed to obtain reference to model"); + return; + } + //model.getCurrentWorkspace().getScanAlertRepository(). + + } + + @Override + public void createControl(Composite parent) { + + container = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + TreeItem scanInstanceItem = null; + + container.setLayout(layout); + layout.numColumns = 2; + setPageComplete(false); + + Label selectAllLabel = new Label(container, SWT.NONE); + selectAllLabel.setText("Select all:"); + Button selectAllButton = new Button(container, SWT.CHECK); + + selectAllButton.addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + + if (selectAllButton.getSelection() == true) { + for (TreeItem t: alertsTree.getItems()) { + t.setChecked(true); + setPageComplete(true); + } + } + + treeContainer.setOrigin (0, 10); + + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // TODO Auto-generated method stub + + }}); + + treeContainer = new ScrolledComposite (container, SWT.VERTICAL); + + GridData treeContainerGridData = new GridData(); + treeContainerGridData.horizontalSpan = 2; + treeContainerGridData.horizontalAlignment = GridData.FILL; + treeContainer.setLayoutData(treeContainerGridData); + treeContainer.setBounds (10, 10, 280, 200); + + alertsTree = new Tree(treeContainer, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL + | SWT.H_SCROLL | SWT.MULTI); + + + IScanInstance proxyScanInstance = model.getCurrentWorkspace().getScanAlertRepository().getProxyScanInstance(); + if (proxyScanInstance != null) { + TreeItem item = new TreeItem(alertsTree, SWT.NONE); + item.setText("Proxy alerts (" + model.getCurrentWorkspace().getScanAlertRepository().getProxyScanInstance().getAllAlerts().size() + ")"); + // TODO: If proxy scan is enabled, we probably shouldn't be letting the user export its alerts, but maybe we don't care.. + item.setImage(ImageDescriptor.createFromURL(getClass().getResource(PROXY_IMAGE)).createImage()); + item.setData(proxyScanInstance.getAllAlerts()); + } + + for (IScanInstance s: model.getCurrentWorkspace().getScanAlertRepository().getAllScanInstances()) { + String time = ""; + if (s.getStartTime() != null && + ((s.getScanStatus() == IScanInstance.SCAN_CANCELLED) || (s.getScanStatus() == IScanInstance.SCAN_COMPLETED))) { + TreeItem item = new TreeItem(alertsTree, SWT.NONE); + time = dateFormat.format(s.getStartTime()); + item.setText(time + " [" + statusToString(s.getScanStatus()) + "] ("+s.getAllAlerts().size()+")"); + item.setImage(ImageDescriptor.createFromURL(getClass().getResource(SCAN_IMAGE)).createImage()); + item.setData(s.getAllAlerts()); + if (scanInstance != null) { + if (s.getScanId() == scanInstance.getScanId()) { + item.setChecked(true); + setPageComplete(true); + scanInstanceItem = item; + } + } + } + } + + treeContainer.setContent(alertsTree); + + final int width = treeContainer.getClientArea ().width; + + int height = alertsTree.computeSize (SWT.DEFAULT, SWT.DEFAULT).y; + alertsTree.setSize (width, height > 280 ? 280 : height); + + alertsTree.addTreeListener (new TreeListener () { + @Override + public void treeExpanded (TreeEvent e) { + int height = alertsTree.computeSize (SWT.DEFAULT, SWT.DEFAULT).y; + alertsTree.setSize (width, height); + } + @Override + public void treeCollapsed (TreeEvent e) { + int height = alertsTree.computeSize (SWT.DEFAULT, SWT.DEFAULT).y; + alertsTree.setSize (width, height); + } + + + }); + + alertsTree.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + TreeItem ti = (TreeItem) e.item; + if (ti.getChecked() == false) { + if (selectAllButton.getSelection() == true) { + selectAllButton.setSelection(false); + } + + } + + boolean anyChecked = false; + for (TreeItem t : alertsTree.getItems()) { + if (t.getChecked() == true) { + anyChecked = true; + } + } + setPageComplete(anyChecked); + } + + }); + + + setControl(container); + + if (scanInstanceItem != null) { + for (TreeItem sItem : alertsTree.getItems()) { + if (sItem == scanInstanceItem) { + System.out.println("Found it"); + Rectangle itemRectangle = sItem.getBounds(); + Rectangle clientArea = treeContainer.getClientArea(); + Point origin = treeContainer.getOrigin(); + if (itemRectangle.x < origin.x || itemRectangle.y < origin.y + || itemRectangle.x + itemRectangle.width > origin.x + clientArea.width + || itemRectangle.y + itemRectangle.height > origin.y + clientArea.height) { + treeContainer.setOrigin(0, itemRectangle.y); + System.out.println(origin.x + " " + origin.y + " " + itemRectangle.x + " "+ itemRectangle.y); + origin = treeContainer.getOrigin(); + System.out.println(origin.x + " " + origin.y + " " + itemRectangle.x + " "+ itemRectangle.y); + treeContainer.setOrigin(new Point(sItem.getBounds().x, sItem.getBounds().y)); + } + else { + System.out.println("nope"); + } + + } + } + + } + + } + + + protected List allAlertsFromTree() { + + List alerts = new ArrayList(); + + for (TreeItem t : alertsTree.getItems()) { + if (t.getChecked() == true) { + System.out.println(t.getData()); + // IScanInstance s = (IScanInstance)(t.getData()); + List scanInstanceAlerts = (List) t.getData(); + //s.getAllAlerts(); + alerts.addAll(scanInstanceAlerts); + } + } + + return alerts; + + } + + private String statusToString(int status) { + + String s = ""; + + switch(status) { + + case IScanInstance.SCAN_PROBING: + s = "Probing Server"; + break; + case IScanInstance.SCAN_STARTING: + s = "Starting"; + break; + case IScanInstance.SCAN_AUDITING: + s = "Auditing"; + break; + case IScanInstance.SCAN_CANCELLED: + s = "Cancelled"; + break; + case IScanInstance.SCAN_COMPLETED: + s = "Completed"; + break; + } + return s; + + } + + +}