/** * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.gnu.org/licenses/lgpl-3.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kevoree.tools.accesscontrol.framework; import org.kevoree.ContainerRoot; import org.kevoree.Instance; import org.kevoree.accesscontrol.AccessControlRoot; import org.kevoree.adaptation.accesscontrol.api.ControlException; import org.kevoree.adaptation.accesscontrol.api.SignedModel; import org.kevoree.framework.AbstractGroupType; import org.kevoree.framework.KevoreeXmiHelper; import org.kevoree.log.Log; import org.kevoree.tools.accesscontrol.framework.impl.CompareAccessControlImpl; import org.kevoree.tools.accesscontrol.framework.impl.SignedModelImpl; import org.kevoree.tools.accesscontrol.framework.impl.SignedPDPImpl; import org.kevoree.tools.accesscontrol.framework.utils.AccessControlXmiHelper; import org.kevoree.tools.accesscontrol.framework.utils.HelperSignature; import org.kevoreeadaptation.AdaptationPrimitive; import javax.swing.*; import java.io.*; import java.security.PrivateKey; import java.util.List; /** * Created with IntelliJ IDEA. * User: jed * Date: 09/04/13 * Time: 15:03 * To change this template use File | Settings | File Templates. */ public abstract class AbstractAccessControlGroupType extends AbstractGroupType { private CompareAccessControlImpl accessControl; @Override public void push(ContainerRoot model, String node) throws Exception { String private_exponent = ""; String modulus = ""; JFileChooser dialogue = new JFileChooser(new File(".")); PrintWriter sortie; File fichier = null; if (dialogue.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { fichier = dialogue.getSelectedFile(); sortie = new PrintWriter (new FileWriter(fichier.getPath(), true)); sortie.close(); } FileReader fr = new FileReader(fichier); BufferedReader br = new BufferedReader(fr); StringBuilder stringkey = new StringBuilder(); try { String line = br.readLine(); while (line != null) { stringkey.append(line); line = br.readLine(); } br.close(); fr.close(); private_exponent = stringkey.toString().split(":")[0]; modulus = stringkey.toString().split(":")[1]; pushSignedModel(model,node,HelperSignature.getPrivateKey(modulus, private_exponent)); } catch (EOFException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (AccessControlException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } public abstract void pushPDP(ContainerRoot model,String targetNodeName, AccessControlRoot pdp,PrivateKey key) throws AccessControlException; public abstract void pushSignedModel(ContainerRoot model, String targetNodeName,PrivateKey key) throws AccessControlException; public AccessControlRoot getModelAccessControl() { return accessControl.getRoot(); } private void setModelAccessControl(AccessControlRoot root) { accessControl = new CompareAccessControlImpl(root); } private CompareAccessControlImpl getAccessControl() { return accessControl; } private void setAccessControl(CompareAccessControlImpl accessControl) { this.accessControl = accessControl; } private ContainerRoot getModel(SignedModel signedModel){ return KevoreeXmiHelper.instance$.loadString(new String(signedModel.getSerialiedModel())); } private boolean approvalSignedModel(Object signed) throws ControlException { if (signed instanceof SignedModelImpl) { SignedModel signedModel = (SignedModelImpl) signed; if (getAccessControl().getRoot() != null) { List<AdaptationPrimitive> result = getAccessControl().approval(getNodeName(), getModelService().getLastModel(), signedModel); if (result != null && result.size() == 0) { Log.info("model accepted according to access control"); return true; } else { if (result != null) { for (AdaptationPrimitive p : result) { String ref = ""; if (p.getRef() instanceof Instance) { ref = ((Instance) p.getRef()).getTypeDefinition().getName(); } else { ref = p.getRef().toString(); } Log.error("Refused Adapation Primitive " + p.getPrimitiveType().getName() + " " + ref); } } else { Log.error(" no result "); } } } else { Log.error("There is no access control defined"); } } return false; } private boolean approvalPDP(Object signed) throws ControlException { if (signed instanceof SignedPDPImpl) { SignedPDPImpl pdp = (SignedPDPImpl) signed; if (getAccessControl() == null) { setModelAccessControl(AccessControlXmiHelper.instance$.loadString(new String(pdp.getSerialiedModel()))); Log.debug("Successful installation of the PDP"); return true; } else { if (getAccessControl().accessPDP(pdp)) { setModelAccessControl(AccessControlXmiHelper.instance$.loadString(new String(pdp.getSerialiedModel()))); } else { Log.error("There is no acess to PDP"); return true; } } } return false; } /** * * @param m SignedPDP or SignedModel * @throws ControlException */ protected void updateSignedModel(final Object m) throws ControlException { if(approvalPDP(m)){ Log.debug("accepted PDP"); } if(approvalSignedModel(m)) { Log.debug("accepted Model"); new Thread() { public void run() { try { long duree, start; getModelService().unregisterModelListener(AbstractAccessControlGroupType.this); start = System.currentTimeMillis(); getModelService().atomicUpdateModel(getModel((SignedModel) m)); duree = (System.currentTimeMillis() - start); getModelService().registerModelListener(AbstractAccessControlGroupType.this); } catch (Exception e) { Log.error("", e); } } }.start(); } } }