/* * ThreatEventPropertySection.java * * This file is part of the STS-Tool project. * Copyright (c) 2011-2012 "University of Trento - DISI" All rights reserved. * * Is strictly forbidden to remove this copyright notice from this source code. * * Disclaimer of Warranty: * STS-Tool (this software) is provided "as-is" and without warranty of any kind, * express, implied or otherwise, including without limitation, any warranty of * merchantability or fitness for a particular purpose. * In no event shall the copyright holder or contributors be liable for any direct, * indirect, incidental, special, exemplary, or consequential damages * including, but not limited to, procurement of substitute goods or services; * loss of use, data, or profits; or business interruption) however caused and on * any theory of liability, whether in contract, strict liability, or tort (including * negligence or otherwise) arising in any way out of the use of this software, even * if advised of the possibility of such damage. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License version 3 * as published by the Free Software Foundation with the addition of the * following permission added to Section 15 as permitted in Section 7(a): * FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY * "University of Trento - DISI","University of Trento - DISI" DISCLAIMS THE * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. * * See the GNU Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License * along with this program; if not, see http://www.gnu.org/licenses or write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA, 02110-1301 USA, or download the license from the following URL: * http://www.sts-tool.eu/License.php * * For more information, please contact STS-Tool group at this * address: ststool@disi.unitn.it * */ /* * ThreatEventPropertySection.java * * This file is part of the STS-Tool project. * Copyright (c) 2011-2012 "University of Trento - DISI" All rights reserved. * * Is strictly forbidden to remove this copyright notice from this source code. * * Disclaimer of Warranty: * STS-Tool (this software) is provided "as-is" and without warranty of any kind, * express, implied or otherwise, including without limitation, any warranty of * merchantability or fitness for a particular purpose. * In no event shall the copyright holder or contributors be liable for any direct, * indirect, incidental, special, exemplary, or consequential damages * including, but not limited to, procurement of substitute goods or services; * loss of use, data, or profits; or business interruption) however caused and on * any theory of liability, whether in contract, strict liability, or tort (including * negligence or otherwise) arising in any way out of the use of this software, even * if advised of the possibility of such damage. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License version 3 * as published by the Free Software Foundation with the addition of the * following permission added to Section 15 as permitted in Section 7(a): * FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY * "University of Trento - DISI","University of Trento - DISI" DISCLAIMS THE * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. * * See the GNU Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License * along with this program; if not, see http://www.gnu.org/licenses or write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA, 02110-1301 USA, or download the license from the following URL: * http://www.sts-tool.eu/License.php * * For more information, please contact STS-Tool group at this * address: ststool@disi.unitn.it * */ package eu.aniketos.wp1.ststool.diagram.sheet; import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import java.util.InputMismatchException; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.impl.EAttributeImpl; import org.eclipse.gef.EditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor; import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditDomain; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; import eu.aniketos.wp1.ststool.diagram.edit.parts.EventEditPart; /** * @generated NOT */ public class ThreatEventPropertySection extends AbstractPropertySection { // TODO If used anywhere else in the application (e.g. the Security // Requirements Document), this URL should probably be defined elsewhere public final static String SVRS_WEB_URL = "https://svrs.shields-project.eu/ANIKETOS/"; private Composite container; private Composite controlsContainer; private EObject event; private String eventId; private Adapter changeAdapter; public ThreatEventPropertySection() { event = null; eventId = null; controlsContainer = null; changeAdapter = new AdapterImpl() { public void notifyChanged(Notification notification) { if (notification.getEventType() == Notification.REMOVE) { event = null; eventId = null; } else { Object obj = notification.getFeature(); if (obj != null && obj.getClass() == EAttributeImpl.class) { EAttributeImpl feature = (EAttributeImpl) obj; if (feature != null && feature.getName() != null) { String name = feature.getName(); if (name.equals("eventID") && notification.getNewStringValue() != null) { eventId = notification.getNewStringValue(); try { updateControls(); } catch(Exception ex) { // TODO Nothing to do... System.out.println(ex.getMessage()); } } } } } } }; } /** * TODO If the focus is inside the Property window --> Threat tab, pressing * Delete/Backspace will not trigger the deletion of the selected Event. Try * to fix this here.. * @generated NOT */ private void deleteElement() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); DiagramEditor diagramEditor = (DiagramEditor) window.getActivePage().getActiveEditor(); Diagram diagram = diagramEditor.getDiagram(); EObject element = diagram.getElement(); EList<EObject> eContents = element.eContents(); ISelection selection = window.getActivePage().getActiveEditor().getSite().getSelectionProvider().getSelection(); IStructuredSelection structuredSelection = (IStructuredSelection) selection; IGraphicalEditPart selectElement = ((IGraphicalEditPart) structuredSelection.getFirstElement()); if (selection == null || ((EditPart) structuredSelection.getFirstElement()) == null || ((EditPart) structuredSelection.getFirstElement()).getModel() == null) return; View view = (View) ((EditPart) structuredSelection.getFirstElement()).getModel(); if (view == null) return; EObject event = (EObject) view.getElement(); IDiagramEditDomain domain = selectElement.getDiagramEditDomain(); // domain.getDiagramCommandStack().execute(new new // RemoveCommand(event)); // DestroyElementRequest // Create an Event element if not selected // if (!event.eClass().getName().equals(eventEType.getDisplayName())) { // // If an Event is not selected, creat a new Event element in the // diagram // CreateElementRequest request = new CreateElementRequest(type); // ViewAndElementDescriptor viewDescriptor = new // ViewAndElementDescriptor( // new CreateElementRequestAdapter(request), Node.class, // ((IHintedType) type).getSemanticHint(), // selectElement.getDiagramPreferencesHint()); // CompoundCommand cmd = new // CompoundCommand("Creating a new event element"); // // CreateViewAndElementRequest req = new // CreateViewAndElementRequest(viewDescriptor); // cmd.add(selectElement.getCommand(req)); // selectElement.getDiagramEditDomain().getDiagramCommandStack().execute(cmd); // Collection results = DiagramCommandStack.getReturnValues(cmd); // IAdaptable[] adaptables = (IAdaptable[]) results.toArray(); // if (adaptables.length > 0) { // View altView = (View) adaptables[1].getAdapter(View.class); // event = (EObject) altView.getElement(); // System.out.println("Creating a new event element!"); // } // else // throw new Exception("Unable to create a new Event element"); // } } @Override public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) { container = new Composite(parent, SWT.NULL); container.setBackground(container.getDisplay().getSystemColor(SWT.COLOR_WHITE)); container.addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent e) { if (e.keyCode == SWT.DEL || e.keyCode == SWT.BS) { // deleteElement(); // Uncomment this line when the // deleteElement() method is fixed // e.doit = false; } } @Override public void keyPressed(KeyEvent e) { } }); GridLayout gridLayout = new GridLayout(); gridLayout.verticalSpacing = 15; gridLayout.numColumns = 1; gridLayout.marginRight = 0; container.setLayout(gridLayout); updateControls(); loadThreatRepositoryPlugin(); } /** * @generated NOT */ public void updateControls() { if (controlsContainer != null) controlsContainer.dispose(); GridData horizontalFillLayout = new GridData(); horizontalFillLayout.horizontalAlignment = SWT.FILL; horizontalFillLayout.grabExcessHorizontalSpace = true; horizontalFillLayout.verticalAlignment = SWT.FILL; horizontalFillLayout.grabExcessVerticalSpace = true; horizontalFillLayout.minimumHeight = 150; horizontalFillLayout.minimumWidth = 620; // FormData horGridFill = new FormData(); // horGridFill.top = new FormAttachment(0); // horGridFill.left = new FormAttachment(0); // horGridFill.right = new FormAttachment(100); controlsContainer = new Composite(container, SWT.NONE); controlsContainer.setBackground(container.getDisplay().getSystemColor(SWT.COLOR_WHITE)); controlsContainer.setLayout(new FormLayout()); controlsContainer.setLayoutData(horizontalFillLayout); //horizontalFillLayout Label headingLabel = new Label(controlsContainer, SWT.NONE); headingLabel.setBackground(container.getDisplay().getSystemColor(SWT.COLOR_WHITE)); FormData headingLabelLayout = new FormData(); headingLabelLayout.right = new FormAttachment(60, 0); headingLabelLayout.left = new FormAttachment(0, 10); headingLabel.setLayoutData(headingLabelLayout); headingLabel.setText("Threat Repository"); FontData[] fD = headingLabel.getFont().getFontData(); fD[0].setStyle(SWT.BOLD); fD[0].setHeight(18); Font font = new Font(container.getDisplay(), fD[0]); headingLabel.setFont(font); Button wizardButton = new Button(controlsContainer, SWT.PUSH); // Simple validation of the Event ID string, though it could be // validated better! if (eventId != null && eventId.length() == 36) { Label instructionLabel = new Label(controlsContainer, SWT.NONE); instructionLabel.setBackground(container.getDisplay().getSystemColor(SWT.COLOR_WHITE)); FormData instructionLabelLayout = new FormData(); instructionLabelLayout.top = new FormAttachment(headingLabel, 18); instructionLabelLayout.left = new FormAttachment(0, 10); instructionLabelLayout.right = new FormAttachment(60, 0); instructionLabel.setLayoutData(instructionLabelLayout); instructionLabel.setText("Click to view additional information in web browser (free registration/login required):"); final String url = SVRS_WEB_URL + "resourceView.jsp?version=1&id=" + eventId; Link browserLink = new Link(controlsContainer, SWT.NONE); browserLink.setText("<A href=\"" + url + "\">" + url + "</A>"); // Button openBrowserButton = new Button(controlsContainer, // SWT.PUSH); // openBrowserButton.setText("Open threat in browser"); FormData browserLinkLayout = new FormData(); browserLinkLayout.top = new FormAttachment(instructionLabel, 6); browserLinkLayout.left = new FormAttachment(0, 10); browserLinkLayout.right = new FormAttachment(80, 0); browserLink.setLayoutData(browserLinkLayout); browserLink.setBackground(container.getDisplay().getSystemColor(SWT.COLOR_WHITE)); browserLink.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { try { // Open default external browser PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(new URL(url)); } catch (PartInitException ex) { // ex.printStackTrace(); } catch (MalformedURLException ex) { // ex.printStackTrace(); } } }); FormData wizardLayout = new FormData(); wizardLayout.top = new FormAttachment(browserLink, 20); wizardLayout.left = new FormAttachment(0, 10); wizardLayout.right = new FormAttachment(15, 0); wizardButton.setLayoutData(wizardLayout); wizardButton.setText("Change threat definition"); wizardButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { invokeThreatRepositoryWizard(); } }); } else { Label instructionLabel = new Label(controlsContainer, SWT.NONE); instructionLabel.setBackground(container.getDisplay().getSystemColor(SWT.COLOR_WHITE)); FormData instructionLabelLayout = new FormData(); instructionLabelLayout.top = new FormAttachment(headingLabel, 20); instructionLabelLayout.left = new FormAttachment(0, 10); instructionLabelLayout.right = new FormAttachment(60, 0); instructionLabel.setLayoutData(instructionLabelLayout); instructionLabel.setText("Click to browse a list of common threats:"); FormData wizardButtonLayout = new FormData(); wizardButtonLayout.top = new FormAttachment(instructionLabel, 10); wizardButtonLayout.left = new FormAttachment(0, 10); wizardButtonLayout.right = new FormAttachment(15, 0); wizardButton.setLayoutData(wizardButtonLayout); wizardButton.setText("Import threat definition"); wizardButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { invokeThreatRepositoryWizard(); } }); } container.layout(); } /** * @generated NOT */ private void loadThreatRepositoryPlugin() { try { new ProgressMonitorDialog(container.getShell()).run(true, false, new ConnectionInitiationHandler()); } catch (Exception ex) { // This is nothing to tell the user about just yet as it should be done in the background MessageDialog.openError(container.getShell(), "Threat Repository connection failed", ex.getCause().getMessage()); } } /** * @generated NOT */ private void invokeThreatRepositoryWizard() { // The eu.aniketos.wp1.ststool.threats plugin service which interfaces with the Threat Repository IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class); try { handlerService.executeCommand("addthreats", null); } catch (Exception ex) { // Give message about missing plug-in MessageDialog.openError(container.getShell(), "Required component missing", "The Threat Repository plug-in could not be initialized: " + ex.getMessage()); // ex.printStackTrace(); } } /** * @generated NOT */ public void setInput(IWorkbenchPart part, ISelection selection) { if (event != null) event.eAdapters().remove(changeAdapter); EventEditPart editPart; if (selection instanceof IStructuredSelection) editPart = (EventEditPart) ((IStructuredSelection) selection).getFirstElement(); else { MessageDialog.openError(container.getShell(), "Diagram error", "Invalid selection of event element."); throw new InputMismatchException("Invalid selection of diagram element."); } View view = (View) editPart.getModel(); EObject newEvent = (EObject) view.getElement(); List<EStructuralFeature> features = newEvent.eClass().getEAllStructuralFeatures(); for (EStructuralFeature feature : features) { if ((feature.getName().replaceAll(" ", "")).equalsIgnoreCase("eventID")) { eventId = (String) newEvent.eGet(feature); } // else if ((feature.getName().replaceAll(" ", // "")).equalsIgnoreCase("name")) { // name = (String) event.eGet(feature); // } // else if ((feature.getName().replaceAll(" ", // "")).equalsIgnoreCase("description")) { // description = (String) event.eGet(feature); // } } newEvent.eAdapters().add(changeAdapter); event = newEvent; updateControls(); } } /** * This class represents a long running operation * @generated NOT */ class ConnectionInitiationHandler implements IRunnableWithProgress { /** * LongRunningOperation constructor * * @param indeterminate whether the animation is unknown * @generated NOT */ public ConnectionInitiationHandler() { } /** * Runs the long running operation * * @param monitor the progress monitor * @generated NOT */ public void run(IProgressMonitor monitor) throws InvocationTargetException { monitor.beginTask("Establishing a connection with the Threat Repository...", IProgressMonitor.UNKNOWN); try { // The eu.aniketos.wp1.ststool.threats plugin service which interfaces with the Threat Repository IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class); Object result = handlerService.executeCommand("loadDomains", null); if (result != null) { String message = (result instanceof Exception) ? ((Exception) result).getMessage() : (String) result; throw new Exception(message); } } catch (Exception ex) { // Thread t = Thread.currentThread(); // t.getUncaughtExceptionHandler().uncaughtException(t, ex); throw new InvocationTargetException(ex); } } }