diff --git a/src/main/java/ui/ActionPerformer.java b/src/main/java/ui/ActionPerformer.java index 86b7c18c642b071fb28ebfcce1df24135717524e..5f74e096b43a6116ec8076d33e2c027850fb58a2 100644 --- a/src/main/java/ui/ActionPerformer.java +++ b/src/main/java/ui/ActionPerformer.java @@ -786,8 +786,11 @@ public class ActionPerformer { } else if (command.equals(mgui.actions[TGUIAction.TMLCTD_EDIT].getActionCommand())) { mgui.actionOnButton(TGComponentManager.EDIT, -1); } else if (command.equals(mgui.actions[TGUIAction.TMLAD_WRITE_CHANNEL].getActionCommand())) { - mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_WRITE_CHANNEL); - } else if (command.equals(mgui.actions[TGUIAction.TMLAD_SEND_REQUEST].getActionCommand())) { + mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_WRITE_CHANNEL); + } else if (command.equals(mgui.actions[TGUIAction.TMLAD_WRITE_CAMS].getActionCommand())) { + mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_WRITE_CAMS); + } + else if (command.equals(mgui.actions[TGUIAction.TMLAD_SEND_REQUEST].getActionCommand())) { mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_SEND_REQUEST); } else if (command.equals(mgui.actions[TGUIAction.TMLAD_READ_REQUEST_ARG].getActionCommand())) { mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_READ_REQUEST_ARG); @@ -799,9 +802,11 @@ public class ActionPerformer { mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_NOTIFIED_EVENT); } else if (command.equals(mgui.actions[TGUIAction.TMLAD_READ_CHANNEL].getActionCommand())) { mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_READ_CHANNEL); - } else if (command.equals(mgui.actions[TGUIAction.TMLAD_ACTION_STATE].getActionCommand())) { + } else if (command.equals(mgui.actions[TGUIAction.TMLAD_READ_CAMS].getActionCommand())) { + mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_READ_CAMS); + } else if (command.equals(mgui.actions[TGUIAction.TMLAD_ACTION_STATE].getActionCommand())) { mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_ACTION_STATE); - } else if (command.equals(mgui.actions[TGUIAction.TMLAD_CHOICE].getActionCommand())) { + } else if (command.equals(mgui.actions[TGUIAction.TMLAD_CHOICE].getActionCommand())) { mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_CHOICE); } else if (command.equals(mgui.actions[TGUIAction.TMLAD_EXECI].getActionCommand())) { mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_EXECI); diff --git a/src/main/java/ui/TGComponentManager.java b/src/main/java/ui/TGComponentManager.java index 9760d9e793efad3167806b1c77c597a1683f4108..b06aacfd5044435acbd6a719ac121cc97d7f3272 100644 --- a/src/main/java/ui/TGComponentManager.java +++ b/src/main/java/ui/TGComponentManager.java @@ -240,9 +240,11 @@ public class TGComponentManager { public static final int TMLTD_REQUEST_OPERATOR = 1004; public static final int TMLTD_EVENT_OPERATOR = 1005; public static final int TMLAD_WRITE_CHANNEL = 1006; + public static final int TMLAD_WRITE_CAMS = 1037; public static final int TMLAD_SEND_REQUEST = 1007; public static final int TMLAD_SEND_EVENT = 1008; public static final int TMLAD_READ_CHANNEL = 1009; + public static final int TMLAD_READ_CAMS = 1038; public static final int TMLAD_WAIT_EVENT = 1010; public static final int TMLAD_NOTIFIED_EVENT = 1017; public static final int TMLAD_ACTION_STATE = 1011; @@ -1134,6 +1136,12 @@ public class TGComponentManager { case TMLAD_READ_CHANNEL: tgc = new TMLADReadChannel(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp); break; + case TMLAD_WRITE_CAMS: + tgc = new TMLADWriteCAMS(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp); + break; + case TMLAD_READ_CAMS: + tgc = new TMLADReadCAMS(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp); + break; case TMLAD_SEND_REQUEST: tgc = new TMLADSendRequest(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp); break; @@ -2095,6 +2103,11 @@ public class TGComponentManager { return TMLAD_WRITE_CHANNEL; } else if (tgc instanceof TMLADReadChannel) { return TMLAD_READ_CHANNEL; + } else if (tgc instanceof TMLADWriteCAMS) { + return TMLAD_WRITE_CAMS; + } else if (tgc instanceof TMLADReadCAMS) { + return TMLAD_READ_CAMS; + } else if (tgc instanceof TMLADSendRequest) { return TMLAD_SEND_REQUEST; } else if (tgc instanceof TMLADSendEvent) { diff --git a/src/main/java/ui/TGUIAction.java b/src/main/java/ui/TGUIAction.java index b8391a3a3d1ab5772b986fd21340c92f43f5d2e7..b7b28a440e8ad498fb040f90f5ce6f2cf217424f 100644 --- a/src/main/java/ui/TGUIAction.java +++ b/src/main/java/ui/TGUIAction.java @@ -220,6 +220,8 @@ public class TGUIAction extends AbstractAction { public static final int TMLAD_SEND_REQUEST = 143; public static final int TMLAD_SEND_EVENT = 144; public static final int TMLAD_WAIT_EVENT = 145; + public static final int TMLAD_WRITE_CAMS = 523; + public static final int TMLAD_READ_CAMS = 524; public static final int TMLAD_NOTIFIED_EVENT = 203; public static final int TMLAD_READ_CHANNEL = 146; public static final int TMLAD_FOR_LOOP = 147; @@ -676,7 +678,7 @@ public class TGUIAction extends AbstractAction { public static final int MOVE_ENABLED = 463; public static final int FIRST_DIAGRAM = 464; - public static final int NB_ACTION = 522; + public static final int NB_ACTION = 525; private static final TAction [] actions = new TAction[NB_ACTION]; @@ -1105,8 +1107,11 @@ public class TGUIAction extends AbstractAction { actions[TMLAD_WRITE_CHANNEL] = new TAction("add-tmladd-write-channel", "Write in channel", IconManager.imgic900, IconManager.imgic900, "Write in channel", "Add a write to channel operator opened TML activity diagram", 0); actions[TMLAD_SEND_REQUEST] = new TAction("add-tmladd-send-request", "Send request", IconManager.imgic902, IconManager.imgic902, "Send request", "Add a send request operator to the currently opened TML activity diagram", 0); actions[TMLAD_SEND_EVENT] = new TAction("add-tmladd-send-event", "Send event", IconManager.imgic904, IconManager.imgic904, "Send event", "Add a send event operator to the currently opened TML activity diagram", 0); - actions[TMLAD_WAIT_EVENT] = new TAction("add-tmladd-wait-event", "Wait event", IconManager.imgic908, IconManager.imgic908, "Wait event", "Add a wait event operator to the currently opened TML activity diagram", 0); + actions[TMLAD_WAIT_EVENT] = new TAction("add-tmladd-wait-event", "Wait event", IconManager.imgic908, IconManager.imgic908, "Wait event", "Add a wait event operator to the currently opened TML activity diagram", 0); actions[TMLAD_NOTIFIED_EVENT] = new TAction("add-tmladd-notified-event", "Notified event", IconManager.imgic918, IconManager.imgic918, "Notified event", "Add a notified event operator to the currently opened TML activity diagram", 0); + actions[TMLAD_WRITE_CAMS] = new TAction("add-tmladd-write-cams", "Write to CAMS", IconManager.imgic904, IconManager.imgic905, "Write to CAMS", "Add a write CAMS operator to the currently opened TML activity diagram", 0); + actions[TMLAD_READ_CAMS] = new TAction("add-tmladd-read-cams", "Read CAMS", IconManager.imgic908, IconManager.imgic907, "Read CAMS", "Add a read CAMS operator to the currently opened TML activity diagram", 0); + actions[TMLAD_READ_CHANNEL] = new TAction("add-tmladd-read-channel", "Read in channel", IconManager.imgic906, IconManager.imgic906, "Read in channel", "Add a read to channel operator opened TML activity diagram", 0); actions[TMLAD_FOR_LOOP] = new TAction("add-tmlad-for-loop", "Loop (for)", IconManager.imgic912, IconManager.imgic912, "Loop (for)", "Add a for loop to the currently opened TML activity diagram", 0); actions[TMLAD_FOR_STATIC_LOOP] = new TAction("add-tmlad-for-static-loop", "Static loop (for)", IconManager.imgic912, IconManager.imgic912, "Static loop (for)", "Add a static for loop to the currently opened TML activity diagram", 0); diff --git a/src/main/java/ui/tmlad/TMLADReadCAMS.java b/src/main/java/ui/tmlad/TMLADReadCAMS.java new file mode 100755 index 0000000000000000000000000000000000000000..5dac8a22345a6a9d41dda3a16227cb75e585839b --- /dev/null +++ b/src/main/java/ui/tmlad/TMLADReadCAMS.java @@ -0,0 +1,452 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + +package ui.tmlad; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.geom.Line2D; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.swing.JFrame; + +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import myutil.GraphicLib; +import ui.AllowedBreakpoint; +import ui.BasicErrorHighlight; +import ui.CheckableAccessibility; +import ui.CheckableLatency; +import ui.ColorManager; +import ui.EmbeddedComment; +import ui.ErrorHighlight; +import ui.LinkedReference; +import ui.MalformedModelingException; +import ui.TDiagramPanel; +import ui.TGComponent; +import ui.TGComponentManager; +import ui.TGConnectingPoint; +import ui.ad.TADComponentWithoutSubcomponents; +import ui.util.IconManager; +import ui.window.JDialogMultiStringAndTabs; +import ui.window.TabInfo; + +/** + * Class TMLADReadChannel + * Action of writing data in channel + * Creation: 21/11/2005 + * + * @author Ludovic APVRILLE + * @version 1.0 21/11/2005 +* @version 1.1 05/11/2019 + */ +public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 TGCWithoutInternalComponent*/ implements CheckableAccessibility, LinkedReference, CheckableLatency, EmbeddedComment, AllowedBreakpoint, BasicErrorHighlight { + private Map<String, String> latencyVals; + protected int lineLength = 5; + protected int textX = 5; + protected int textX0 = 2; + protected int textY0 = 0; + protected int textY1 = 15; + protected int linebreak = 10; + + protected int decSec = 4; + + protected int latencyX = 30; + protected int latencyY = 25; + protected int textWidth = 10; + protected int textHeight = 20; + + protected String channelName = "ch"; + protected String nbOfSamples = "1"; + protected String securityContext = ""; + protected boolean isAttacker = false; + + protected int stateOfError = 0; // Not yet checked + + public final static int NOT_VERIFIED = 0; + public final static int REACHABLE = 1; + public final static int NOT_REACHABLE = 2; + + public int reachabilityInformation; + + public boolean isEncForm = true; + + public TMLADReadCAMS(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp) { + super(_x, _y, _minX, _maxX, _minY, _maxY, _pos, _father, _tdp); + + width = 30; + height = 20; + minWidth = 30; + + nbConnectingPoint = 2; + connectingPoint = new TGConnectingPoint[2]; + connectingPoint[0] = new TGConnectingPointTMLAD(this, 0, -lineLength, true, false, 0.5, 0.0); + connectingPoint[1] = new TGConnectingPointTMLAD(this, 0, lineLength, false, true, 0.5, 1.0); + + moveable = true; + editable = true; + removable = true; + + makeValue(); + name = "read channel"; + + myImageIcon = IconManager.imgic906; + latencyVals = new ConcurrentHashMap<String, String>(); + //latencyVals.put("sendChannel: sensorData", "3"); + } + + /*public void addLatency(String name, String num){ + latencyVals.put(name,num); + }*/ + + public Map<String, String> getLatencyMap() { + return latencyVals; + } + + @Override + public void internalDrawing(Graphics g) { + int w = g.getFontMetrics().stringWidth(value); + int w1 = Math.max(minWidth, w + 2 * textX); + if ((w1 != width) & (!tdp.isScaled())) { + setCd(x + width / 2 - w1 / 2, y); + width = w1; + //updateConnectingPoints(); + } + + if (stateOfError > 0) { + Color c = g.getColor(); + switch (stateOfError) { + case ErrorHighlight.OK: + g.setColor(ColorManager.TML_PORT_CHANNEL); + break; + default: + g.setColor(ColorManager.UNKNOWN_BOX_ACTION); + } + // Making the polygon + int[] px1 = {x, x + width, x + width, x, x + linebreak}; + int[] py1 = {y, y, y + height, y + height, y + (height / 2)}; + g.fillPolygon(px1, py1, 5); + g.setColor(c); + } + + //g.drawRoundRect(x, y, width, height, arc, arc); + g.drawLine(x + (width / 2), y, x + (width / 2), y - lineLength); + g.drawLine(x + (width / 2), y + height, x + (width / 2), y + lineLength + height); + + Color c = g.getColor(); + int x1 = x + 1; + int y1 = y + 1; + int height1 = height; + int width1 = width; + g.setColor(ColorManager.TML_PORT_CHANNEL); + g.drawLine(x1, y1, x1 + width1, y1); + g.drawLine(x1 + width1, y1, x1 + width1, y1 + height1); + g.drawLine(x1, y1 + height1, x1 + width1, y1 + height1); + g.drawLine(x1, y1, x1 + linebreak, y1 + height1 / 2); + g.drawLine(x1, y1 + height1, x1 + linebreak, y1 + height1 / 2); + g.setColor(c); + + g.drawLine(x, y, x + width, y); + g.drawLine(x + width, y, x + width, y + height); + g.drawLine(x, y + height, x + width, y + height); + g.drawLine(x, y, x + linebreak, y + height / 2); + g.drawLine(x, y + height, x + linebreak, y + height / 2); + if (isAttacker) { + g.drawString("attack", x + (width - w) / 2, y + textY0); + } else { + g.drawString("chl", x + (width - w) / 2, y + textY0); + } + g.drawString(value, x + linebreak + textX0, y + textY1); + + if (!securityContext.equals("")) { + c = g.getColor(); + if (!isEncForm){ + g.setColor(Color.RED); + } + g.drawString("sec:" + securityContext, x + 3 * width / 4, y + height + textY1 - decSec); + g.setColor(c); + } + drawReachabilityInformation(g); + if (getCheckLatency()) { + ConcurrentHashMap<String, String> latency = tdp.getMGUI().getLatencyVals(getDIPLOID()); + + if (latency != null) { + latencyVals = latency; + drawLatencyInformation(g); + } + } + } + + private void drawLatencyInformation(Graphics g) { + int index = 1; + for (String s : latencyVals.keySet()) { + int w = g.getFontMetrics().stringWidth(s); + g.drawString(s, x - latencyX - w + 1, y - latencyY * index - 2); + g.drawRect(x - latencyX - w, y - latencyY * index - textHeight, w + 4, textHeight); + g.drawLine(x, y, x - latencyX, y - latencyY * index); + g.drawString(latencyVals.get(s), x - latencyX / 2, y - latencyY * index / 2); + index++; + } + } + + private void drawReachabilityInformation(Graphics g) { + if (reachabilityInformation > 0) { + Color c = g.getColor(); + Color c1; + switch (reachabilityInformation) { + case REACHABLE: + c1 = Color.green; + break; + case NOT_REACHABLE: + c1 = Color.red; + break; + default: + return; + } + + GraphicLib.arrowWithLine(g, 1, 0, 10, x - 30, y - 3, x - 15, y - 3, true); + g.drawOval(x - 11, y - 10, 7, 9); + g.setColor(c1); + g.fillRect(x - 12, y - 7, 9, 7); + g.setColor(c); + g.drawRect(x - 12, y - 7, 9, 7); + if (reachabilityInformation == NOT_REACHABLE) { + g.drawLine(x - 14, y - 9, x - 1, y + 3); + g.drawLine(x - 14, y + 3, x - 1, y - 9); + } + } + } + + @Override + public TGComponent isOnMe(int _x, int _y) { + if (GraphicLib.isInRectangle(_x, _y, x, y, width, height)) { + return this; + } + + if ((int) (Line2D.ptSegDistSq(x + (width / 2), y - lineLength, x + (width / 2), y + lineLength + height, _x, _y)) < distanceSelected) { + return this; + } + + return null; + } + + public void makeValue() { + value = channelName + "(" + nbOfSamples + ") "; + } + + public String getChannelName() { + return channelName; + } + + public String getSamplesValue() { + return nbOfSamples; + } + + public String getAction() { + return value; + } + + @Override + public boolean editOndoubleClick(JFrame frame) { + TabInfo tab1 = new TabInfo("Name and samples"); + String[] labels = new String[2]; + String[] values = new String[2]; + labels[0] = "CAMS Channel name"; + values[0] = channelName; + labels[1] = "Nb of samples"; + values[1] = nbOfSamples; + tab1.labels=labels; + tab1.values = values; + List<String[]> help = new ArrayList<String[]>(); + String[] allInChannels = tdp.getMGUI().getAllInChannels(); + if (isAttacker) { + allInChannels = tdp.getMGUI().getAllCompInChannels(); + } + help.add(allInChannels); + help.add(null); + tab1.help = help; + + TabInfo tab2 = new TabInfo("Security"); + labels = new String[3]; + values = new String[3]; + labels[0] = "Security Pattern"; + values[0] = securityContext; + labels[1] = "Attacker?"; + values[1] = isAttacker ? "Yes" : "No"; + labels[2] = "Encrypted Form?"; + values[2] = isEncForm ? "Yes" : "No"; + help = new ArrayList<String[]>(); + String[] choice = new String[]{"Yes", "No"}; + help.add(tdp.getMGUI().getCurrentCryptoConfig()); + help.add(choice); + help.add(choice); + tab2.labels=labels; + tab2.values = values; + tab2.help = help; + + List<TabInfo> tabs = new ArrayList<>(); + tabs.add(tab1); + tabs.add(tab2); + + //JDialogTwoString jdts = new JDialogTwoString(frame, "Setting channel's properties", "Channel name", channelName, "Nb of samples", nbOfSamples); + JDialogMultiStringAndTabs jdmsat = new JDialogMultiStringAndTabs(frame, "Write in channel", tabs); + //jdms.setSize(600, 300); + GraphicLib.centerOnParent(jdmsat, 600, 300); + jdmsat.setVisible(true); // blocked until dialog has been closed + + if (jdmsat.hasBeenSet() && (jdmsat.hasValidString(0))) { + channelName = jdmsat.getString(0, 0); + nbOfSamples = jdmsat.getString(0, 1); + securityContext = jdmsat.getString(1, 0); + isAttacker = jdmsat.getString(1, 1).equals("Yes"); + isEncForm = jdmsat.getString(1, 2).equals("Yes"); + makeValue(); + return true; + } + + return false; + } + + public void setSamples(String sp) { + nbOfSamples = sp; + makeValue(); + } + + @Override + protected String translateExtraParam() { + StringBuffer sb = new StringBuffer("<extraparam>\n"); + sb.append("<Data channelName=\""); + sb.append(getChannelName()); + sb.append("\" nbOfSamples=\""); + sb.append(getSamplesValue()); + sb.append("\" secPattern=\""); + sb.append(securityContext); + sb.append("\" isAttacker=\""); + sb.append(isAttacker ? "Yes" : "No"); + sb.append("\" isEncForm=\""); + sb.append(isEncForm ? "Yes" : "No"); + sb.append("\" />\n"); + sb.append("</extraparam>\n"); + return new String(sb); + } + + @Override + public void loadExtraParam(NodeList nl, int decX, int decY, int decId) throws MalformedModelingException { + try { + NodeList nli; + Node n1, n2; + Element elt; + + for (int i = 0; i < nl.getLength(); i++) { + n1 = nl.item(i); + + if (n1.getNodeType() == Node.ELEMENT_NODE) { + nli = n1.getChildNodes(); + for (int j = 0; j < nli.getLength(); j++) { + n2 = nli.item(j); + if (n2.getNodeType() == Node.ELEMENT_NODE) { + elt = (Element) n2; + if (elt.getTagName().equals("Data")) { + channelName = elt.getAttribute("channelName"); + nbOfSamples = elt.getAttribute("nbOfSamples"); + securityContext = elt.getAttribute("secPattern"); + isAttacker = elt.getAttribute("isAttacker").equals("Yes"); + isEncForm = elt.getAttribute("isEncForm").equals("Yes"); + if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){ + if (!securityContext.equals("")){ + isEncForm=true; + } + } + } + } + } + } + } + + } catch (Exception e) { + throw new MalformedModelingException( e ); + } + makeValue(); + } + + public String getSecurityContext() { + return securityContext; + } + + public void setSecurityContext(String sc) { + securityContext = sc; + } + + public boolean isAttacker() { + return isAttacker; + } + + @Override + public int getType() { + return TGComponentManager.TMLAD_READ_CHANNEL; + } + + @Override + public int getDefaultConnector() { + return TGComponentManager.CONNECTOR_TMLAD; + } + + @Override + public void setStateAction(int _stateAction) { + stateOfError = _stateAction; + } + + public boolean getEncForm(){ + return isEncForm; + } + + public void setEncForm(boolean encForm){ + isEncForm=encForm; + } + + + public void setChannelName(String s) { + channelName = s; + makeValue(); + } +} diff --git a/src/main/java/ui/tmlad/TMLADWriteCAMS.java b/src/main/java/ui/tmlad/TMLADWriteCAMS.java new file mode 100755 index 0000000000000000000000000000000000000000..7e4b4ef5d0359f2a74f17a0710c025ab91a346fd --- /dev/null +++ b/src/main/java/ui/tmlad/TMLADWriteCAMS.java @@ -0,0 +1,480 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + +package ui.tmlad; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.geom.Line2D; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.swing.JFrame; + +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import myutil.Conversion; +import myutil.GraphicLib; +import ui.AllowedBreakpoint; +import ui.BasicErrorHighlight; +import ui.CheckableAccessibility; +import ui.CheckableLatency; +import ui.ColorManager; +import ui.EmbeddedComment; +import ui.ErrorHighlight; +import ui.LinkedReference; +import ui.MalformedModelingException; +import ui.TDiagramPanel; +import ui.TGComponent; +import ui.TGComponentManager; +import ui.TGConnectingPoint; +import ui.ad.TADComponentWithoutSubcomponents; +import ui.util.IconManager; +import ui.window.JDialogMultiStringAndTabs; +import ui.window.TabInfo; + +/** + * Class TMLADWriteCAMS + * Action of writing data in CAMS channel + * Creation: 17/11/2005 + * + * @author Ludovic APVRILLE + * @version 1.0 17/11/2005 + * @version 1.1 05/11/2019 Daniela Genius + */ +public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 TGCWithoutInternalComponent*/ implements CheckableAccessibility, LinkedReference, CheckableLatency, EmbeddedComment, AllowedBreakpoint, BasicErrorHighlight { + protected int lineLength = 5; + protected int textX = 5; + protected int textY = 15; + protected int arc = 5; + protected int linebreak = 10; + protected int decSec = 4; + + private Map<String, String> latencyVals; + + protected int latencyX = 30; + protected int latencyY = 25; + protected int textWidth = 10; + protected int textHeight = 20; + + protected String channelName = "ch"; + protected String nbOfSamples = "1"; + protected String securityContext = ""; + protected boolean isAttacker = false; + + protected int stateOfError = 0; // Not yet checked + + public final static int NOT_VERIFIED = 0; + public final static int REACHABLE = 1; + public final static int NOT_REACHABLE = 2; + + public int reachabilityInformation; + + public boolean isEncForm = true; + + public TMLADWriteCAMS(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp) { + super(_x, _y, _minX, _maxX, _minY, _maxY, _pos, _father, _tdp); + + width = 30; + height = 20; + minWidth = 30; + + + nbConnectingPoint = 2; + connectingPoint = new TGConnectingPoint[2]; + connectingPoint[0] = new TGConnectingPointTMLAD(this, 0, -lineLength, true, false, 0.5, 0.0); + connectingPoint[1] = new TGConnectingPointTMLAD(this, 0, lineLength, false, true, 0.5, 1.0); + + moveable = true; + editable = true; + removable = true; + + makeValue(); + name = "write channel"; + + myImageIcon = IconManager.imgic900; + latencyVals = new ConcurrentHashMap<String, String>(); + } + + public Map<String, String> getLatencyMap() { + return latencyVals; + } + + @Override + public void internalDrawing(Graphics g) { + int w = g.getFontMetrics().stringWidth(value); + int w1 = Math.max(minWidth, w + 2 * textX); + if ((w1 != width) & (!tdp.isScaled())) { + setCd(x + width / 2 - w1 / 2, y); + width = w1; + //updateConnectingPoints(); + } + //g.drawRoundRect(x, y, width, height, arc, arc); + + if (stateOfError > 0) { + Color c = g.getColor(); + switch (stateOfError) { + case ErrorHighlight.OK: + g.setColor(ColorManager.TML_PORT_CHANNEL); + break; + default: + g.setColor(ColorManager.UNKNOWN_BOX_ACTION); + } + // Making the polygon + int[] px1 = {x, x + width - linebreak, x + width, x + width - linebreak, x}; + int[] py1 = {y, y, y + (height / 2), y + height, y + height}; + g.fillPolygon(px1, py1, 5); + g.setColor(c); + } + + g.drawLine(x + (width / 2), y, x + (width / 2), y - lineLength); + g.drawLine(x + (width / 2), y + height, x + (width / 2), y + lineLength + height); + + int x1 = x + 1; + int y1 = y + 1; + int height1 = height; + int width1 = width; + Color c = g.getColor(); + g.setColor(ColorManager.TML_PORT_CHANNEL); + g.drawLine(x1, y1, x1 + width1 - linebreak, y1); + g.drawLine(x1, y1 + height1, x1 + width1 - linebreak, y1 + height1); + g.drawLine(x1, y1, x1, y1 + height1); + g.drawLine(x1 + width1 - linebreak, y1, x1 + width1, y1 + height1 / 2); + g.drawLine(x1 + width1 - linebreak, y1 + height1, x1 + width1, y1 + height1 / 2); + g.setColor(c); + + g.drawLine(x, y, x + width - linebreak, y); + g.drawLine(x, y + height, x + width - linebreak, y + height); + g.drawLine(x, y, x, y + height); + g.drawLine(x + width - linebreak, y, x + width, y + height / 2); + g.drawLine(x + width - linebreak, y + height, x + width, y + height / 2); + if (isAttacker) { + g.drawString("attack", x + (width - w) / 2, y); + } else { + g.drawString("chl", x + (width - w) / 2, y); + } + g.drawString(value, x + (width - w) / 2, y + textY); + if (!securityContext.equals("")) { + c = g.getColor(); + if (!isEncForm){ + g.setColor(Color.RED); + } + g.drawString("sec:" + securityContext, x + 3 * width / 4, y + height + textY - decSec); + g.setColor(c); + } + + if (getCheckLatency()) { + ConcurrentHashMap<String, String> latency = tdp.getMGUI().getLatencyVals(getDIPLOID()); + // + if (latency != null) { + latencyVals = latency; + drawLatencyInformation(g); + } + } + drawReachabilityInformation(g); + } + + private void drawLatencyInformation(Graphics g) { + int index = 1; + for (String s : latencyVals.keySet()) { + int w = g.getFontMetrics().stringWidth(s); + g.drawString(s, x - latencyX - w + 1, y - latencyY * index - 2); + g.drawRect(x - latencyX - w, y - latencyY * index - textHeight, w + 4, textHeight); + g.drawLine(x, y, x - latencyX, y - latencyY * index); + g.drawString(latencyVals.get(s), x - latencyX / 2, y - latencyY * index / 2); + index++; + } + } + + public void addLatency(String name, String num) { + latencyVals.put(name, num); + } + + private void drawReachabilityInformation(Graphics g) { + if (reachabilityInformation > 0) { + + Color c = g.getColor(); + Color c1; + switch (reachabilityInformation) { + case REACHABLE: + c1 = Color.green; + break; + case NOT_REACHABLE: + c1 = Color.red; + break; + default: + return; + } + + GraphicLib.arrowWithLine(g, 1, 0, 10, x - 30, y - 3, x - 15, y - 3, true); + g.drawOval(x - 11, y - 10, 7, 9); + g.setColor(c1); + g.fillRect(x - 12, y - 7, 9, 7); + g.setColor(c); + g.drawRect(x - 12, y - 7, 9, 7); + if (reachabilityInformation == NOT_REACHABLE) { + g.drawLine(x - 14, y - 9, x - 1, y + 3); + g.drawLine(x - 14, y + 3, x - 1, y - 9); + } + } + } + + @Override + public TGComponent isOnMe(int _x, int _y) { + if (GraphicLib.isInRectangle(_x, _y, x, y, width, height)) { + return this; + } + + if ((int) (Line2D.ptSegDistSq(x + (width / 2), y - lineLength, x + (width / 2), y + lineLength + height, _x, _y)) < distanceSelected) { + return this; + } + + return null; + } + + public void makeValue() { + value = channelName + "(" + nbOfSamples + ")"; + } + + /*public String getChannelName() { + return channelName; + }*/ + + public String[] getChannelsByName() { + //int nbOfChannels = Conversion.nbChar(channelName, ',') + 1; + String tmp = Conversion.replaceAllChar(channelName, ' ', ""); + String[] channels = tmp.split(","); + return channels; + } + + public String getChannelName(int _index) { + return getChannelsByName()[_index]; + } + + public String getSamplesValue() { + return nbOfSamples; + } + + public String getAction() { + return value; + } + + @Override + public boolean editOndoubleClick(JFrame frame) { + TabInfo tab1 = new TabInfo("Name and samples"); + String[] labels = new String[2]; + String[] values = new String[2]; + labels[0] = "CAMS Channel name"; + values[0] = channelName; + labels[1] = "Nb of samples"; + values[1] = nbOfSamples; + + /* labels[2] = "Security Pattern"; + values[2] = securityContext; + labels[3] = "Attacker?"; + values[3] = isAttacker ? "Yes" : "No"; */ + List<String []> help = new ArrayList<String []>(); + String[] allOutChannels = tdp.getMGUI().getAllOutChannels(); + if (isAttacker){ + allOutChannels =tdp.getMGUI().getAllCompOutChannels(); + } + String[] choice = new String[]{"Yes", "No"}; + help.add(allOutChannels); + help.add(null); + // help.add(tdp.getMGUI().getCurrentCryptoConfig()); + //help.add(choice); + + tab1.labels=labels; + tab1.values = values; + tab1.help = help; + + TabInfo tab2 = new TabInfo("Security"); + labels = new String[3]; + values = new String[3]; + labels[0] = "Security Pattern"; + values[0] = securityContext; + labels[1] = "Attacker?"; + values[1] = isAttacker ? "Yes" : "No"; + labels[2] = "Encrypted Form?"; + values[2] = isEncForm ? "Yes" : "No"; + help = new ArrayList<String[]>(); + + help.add(tdp.getMGUI().getCurrentCryptoConfig()); + help.add(choice); + help.add(choice); + tab2.labels=labels; + tab2.values = values; + tab2.help = help; + + List<TabInfo> tabs = new ArrayList<>(); + tabs.add(tab1); + tabs.add(tab2); + + + //JDialogTwoString jdts = new JDialogTwoString(frame, "Setting channel's properties", "Channel name", channelName, "Nb of samples", nbOfSamples); + JDialogMultiStringAndTabs jdmsat = new JDialogMultiStringAndTabs(frame, "Write in channel", tabs); + //jdms.setSize(600, 300); + GraphicLib.centerOnParent(jdmsat, 600, 300); + jdmsat.setVisible(true); // blocked until dialog has been closed + + if (jdmsat.hasBeenSet() && (jdmsat.hasValidString(0))) { + channelName = jdmsat.getString(0, 0); + nbOfSamples = jdmsat.getString(0, 1); + securityContext = jdmsat.getString(1, 0); + isAttacker = jdmsat.getString(1, 1).equals("Yes"); + isEncForm = jdmsat.getString(1, 2).equals("Yes"); + makeValue(); + + return true; + } + + return false; + } + + @Override + protected String translateExtraParam() { + StringBuffer sb = new StringBuffer("<extraparam>\n"); + sb.append("<Data channelName=\""); + sb.append(channelName); + sb.append("\" nbOfSamples=\""); + sb.append(getSamplesValue()); + sb.append("\" secPattern=\""); + sb.append(securityContext); + sb.append("\" isAttacker=\""); + sb.append(isAttacker ? "Yes" : "No"); + sb.append("\" isEncForm=\""); + sb.append(isEncForm ? "Yes" : "No"); + sb.append("\" />\n"); + sb.append("</extraparam>\n"); + return new String(sb); + } + + @Override + public void loadExtraParam(NodeList nl, int decX, int decY, int decId) throws MalformedModelingException { + try { + NodeList nli; + Node n1, n2; + Element elt; + + for (int i = 0; i < nl.getLength(); i++) { + n1 = nl.item(i); + // + if (n1.getNodeType() == Node.ELEMENT_NODE) { + nli = n1.getChildNodes(); + for (int j = 0; j < nli.getLength(); j++) { + n2 = nli.item(j); + // + if (n2.getNodeType() == Node.ELEMENT_NODE) { + elt = (Element) n2; + if (elt.getTagName().equals("Data")) { + channelName = elt.getAttribute("channelName"); + nbOfSamples = elt.getAttribute("nbOfSamples"); + securityContext = elt.getAttribute("secPattern"); + isAttacker = elt.getAttribute("isAttacker").equals("Yes"); + isEncForm = elt.getAttribute("isEncForm").equals("Yes"); + if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){ + if (!securityContext.equals("")){ + isEncForm=true; + } + } + } + } + } + } + } + + } catch (Exception e) { + throw new MalformedModelingException( e ); + } + makeValue(); + } + + @Override + public int getType() { + return TGComponentManager.TMLAD_WRITE_CHANNEL; + } + + @Override + public int getDefaultConnector() { + return TGComponentManager.CONNECTOR_TMLAD; + } + + public String getChannelName() { + return channelName; + } + + public void setChannelName(String s) { + channelName = s; + makeValue(); + } + + public void setSamples(String sp) { + nbOfSamples = sp; + makeValue(); + } + + public String getSecurityContext() { + return securityContext; + } + + public void setSecurityContext(String sc) { + securityContext = sc; + } + + public boolean isAttacker() { + return isAttacker; + } + + public boolean getEncForm(){ + return isEncForm; + } + + + public void setEncForm(boolean encForm){ + isEncForm=encForm; + } + + @Override + public void setStateAction(int _stateAction) { + stateOfError = _stateAction; + } +} diff --git a/src/main/java/ui/tmlad/TMLActivityDiagramToolBar.java b/src/main/java/ui/tmlad/TMLActivityDiagramToolBar.java index 4c19db934fa316a72fd15860636634e6290a1b96..72d625d857802e5abbbb82a17fe2ce67e9ee804d 100755 --- a/src/main/java/ui/tmlad/TMLActivityDiagramToolBar.java +++ b/src/main/java/ui/tmlad/TMLActivityDiagramToolBar.java @@ -88,6 +88,8 @@ public class TMLActivityDiagramToolBar extends TToolBar { mgui.actions[TGUIAction.TMLAD_SEND_REQUEST].setEnabled(b); mgui.actions[TGUIAction.TMLAD_SEND_EVENT].setEnabled(b); mgui.actions[TGUIAction.TMLAD_WAIT_EVENT].setEnabled(b); + mgui.actions[TGUIAction.TMLAD_WRITE_CAMS].setEnabled(b); + mgui.actions[TGUIAction.TMLAD_READ_CAMS].setEnabled(b); mgui.actions[TGUIAction.TMLAD_NOTIFIED_EVENT].setEnabled(b); mgui.actions[TGUIAction.TMLAD_READ_REQUEST_ARG].setEnabled(b); mgui.actions[TGUIAction.TMLAD_FOR_LOOP].setEnabled(b); @@ -138,7 +140,10 @@ public class TMLActivityDiagramToolBar extends TToolBar { button = this.add(mgui.actions[TGUIAction.TMLAD_WRITE_CHANNEL]); button.addMouseListener(mgui.mouseHandler); - + + button = this.add(mgui.actions[TGUIAction.TMLAD_WRITE_CAMS]); + button.addMouseListener(mgui.mouseHandler); + button = this.add(mgui.actions[TGUIAction.TMLAD_SEND_EVENT]); button.addMouseListener(mgui.mouseHandler); @@ -149,7 +154,12 @@ public class TMLActivityDiagramToolBar extends TToolBar { button = this.add(mgui.actions[TGUIAction.TMLAD_READ_CHANNEL]); button.addMouseListener(mgui.mouseHandler); + + + button = this.add(mgui.actions[TGUIAction.TMLAD_READ_CAMS]); + button.addMouseListener(mgui.mouseHandler); + button = this.add(mgui.actions[TGUIAction.TMLAD_WAIT_EVENT]); button.addMouseListener(mgui.mouseHandler); diff --git a/src/main/java/ui/util/IconManager.java b/src/main/java/ui/util/IconManager.java index 709f2082315bccb3d3dd3ce853fd20b31dc34847..ab646504fa9388dc88b4ab84a91913d11ee7a7e0 100755 --- a/src/main/java/ui/util/IconManager.java +++ b/src/main/java/ui/util/IconManager.java @@ -108,7 +108,7 @@ public class IconManager { public static ImageIcon imgic700, imgic702; public static ImageIcon imgic800, imgic802, imgic804, imgic806, imgic808, imgic810, imgic812; - public static ImageIcon imgic900, imgic902, imgic904, imgic906, imgic908, imgic910, imgic912, imgic914, imgic916, imgic918; + public static ImageIcon imgic900, imgic902, imgic904, imgic905, imgic906, imgic907, imgic908, imgic910, imgic912, imgic914, imgic916, imgic918; public static ImageIcon imgic920, imgic922, imgic924, imgic926, imgic928, imgic930; public static ImageIcon imgic940, imgic941; // Requirement diagrams @@ -468,7 +468,9 @@ public class IconManager { private static String icon900 = "tmladwrch.gif"; private static String icon902 = "tmladsendreq.gif"; private static String icon904 = "tmladsendevt.gif"; + private static String icon905 = "tmladwritecams.gif"; private static String icon906 = "tmladrdch.gif"; + private static String icon907 = "tmladreadcams.gif"; private static String icon908 = "tmladwaitevt.gif"; private static String icon910 = "tmladexeci.gif"; private static String icon912 = "tmladforloop.gif"; @@ -977,7 +979,9 @@ public class IconManager { imgic900 = getIcon(icon900); imgic902 = getIcon(icon902); imgic904 = getIcon(icon904); + imgic905 = getIcon(icon905); imgic906 = getIcon(icon906); + imgic907 = getIcon(icon907); imgic908 = getIcon(icon908); imgic910 = getIcon(icon910); imgic912 = getIcon(icon912); diff --git a/src/main/resources/ui/util/tmladwritecams.gif b/src/main/resources/ui/util/tmladwritecams.gif new file mode 100755 index 0000000000000000000000000000000000000000..c8acb635ea8fd29aede85f98e58bbeb865cf10cc Binary files /dev/null and b/src/main/resources/ui/util/tmladwritecams.gif differ diff --git a/src/main/resources/ui/util/tmlreadcams.gif b/src/main/resources/ui/util/tmlreadcams.gif new file mode 100755 index 0000000000000000000000000000000000000000..fd661fbed71a605ead809eba99ffae90580f47ad Binary files /dev/null and b/src/main/resources/ui/util/tmlreadcams.gif differ