/** * Copyright (c) 2011, SOCIETIES Consortium (WATERFORD INSTITUTE OF TECHNOLOGY (TSSG), HERIOT-WATT UNIVERSITY (HWU), SOLUTA.NET * (SN), GERMAN AEROSPACE CENTRE (Deutsches Zentrum fuer Luft- und Raumfahrt e.V.) (DLR), Zavod za varnostne tehnologije * informacijske družbe in elektronsko poslovanje (SETCCE), INSTITUTE OF COMMUNICATION AND COMPUTER SYSTEMS (ICCS), LAKE * COMMUNICATIONS (LAKE), INTEL PERFORMANCE LEARNING SOLUTIONS LTD (INTEL), PORTUGAL TELECOM INOVAÇÃO, SA (PTIN), IBM Corp., * INSTITUT TELECOM (ITSUD), AMITEC DIACHYTI EFYIA PLIROFORIKI KAI EPIKINONIES ETERIA PERIORISMENIS EFTHINIS (AMITEC), TELECOM * ITALIA S.p.a.(TI), TRIALOG (TRIALOG), Stiftelsen SINTEF (SINTEF), NEC EUROPE LTD (NEC)) * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following * conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 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. */ package org.societies.privacytrust.privacyprotection.model; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.api.context.model.MalformedCtxIdentifierException; import org.societies.api.identity.util.DataIdentifierFactory; import org.societies.api.identity.util.DataIdentifierUtils; import org.societies.api.identity.util.RequestorUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.ActionUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.RequestItemUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.ResourceUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.ResponseItemUtils; import org.societies.api.schema.identity.DataIdentifier; import org.societies.api.schema.identity.RequestorBean; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Action; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Condition; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Decision; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.RequestItem; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Resource; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem; /** * Entity to store privacy permissions for access control persistence * * @author Olivier Maridat (Trialog) * */ @Entity @Table(name = "PrivacyPermission") public class PrivacyPermission implements Serializable { private static final Logger LOG = LoggerFactory.getLogger(PrivacyPermission.class); private static final long serialVersionUID = -5745233622018708564L; @Id @GeneratedValue private Long id; private String dataId; @Column(length=9000) private String requestorId; /** * List of actions. * Syntax: action1:action2:action3 * E.g.: READ/WRITE */ private String actions; /** * List of action optional flags. In the same order of the list of actions. * Syntax: optional1/optional2/optional3 * E.g.: 1/1/0 */ private String actionOptionalFlags; /** * Number of actions for this tuple */ private int nbOfActions; @Enumerated private Decision permission; public PrivacyPermission() { super(); } /** * @param requestorId * @param permissionType * @param serviceId * @param cisId * @param ownerId * @param dataId * @param actions * @param actionsStatus * @param permission */ public PrivacyPermission(String requestorId, String dataId, String actions, String actionOptionalFlags, Decision permission) { super(); this.requestorId = requestorId; this.dataId = dataId; this.actions = actions; this.actionOptionalFlags = actionOptionalFlags; this.permission = permission; } /** * @param requestor * @param ownerId * @param dataId * @param actions * @param permission */ public PrivacyPermission(RequestorBean requestor, DataIdentifier dataId, List<Action> actions, Decision permission) { super(); setRequestor(requestor); setDataId(dataId); setActionsToData(actions); setPermission(permission); } /** * @param requestor * @param permission * @throws MalformedCtxIdentifierException */ public PrivacyPermission(RequestorBean requestor, ResponseItem permission) throws MalformedCtxIdentifierException { this(requestor, ResourceUtils.getDataIdentifier(permission.getRequestItem().getResource()), permission.getRequestItem().getActions(), permission.getDecision()); } /* --- Intelligent Setters --- */ /** * Retrieve the access control permission as a ResponseItem * @return Permission wrapped as a ResponseItem */ public ResponseItem createResponseItem() { // - Create the resource Resource resource = null; try { resource = ResourceUtils.create(DataIdentifierFactory.fromUri(this.dataId)); } catch (Exception e) { LOG.error("Can't retrieve the data identifier", e); } // - Create the list of actions List<Action> actions = getActionsFromData(); // - Create the ResponseItem RequestItem requestItem = RequestItemUtils.create(resource, actions, new ArrayList<Condition>()); ResponseItem reponseItem = ResponseItemUtils.create(permission, requestItem); return reponseItem; } public static List<ResponseItem> createResponseItems(List<PrivacyPermission> privacyPermissions) { if (null == privacyPermissions || privacyPermissions.size() <= 0) { return null; } List<ResponseItem> permissions = new ArrayList<ResponseItem>(); for(PrivacyPermission privacyPermission : privacyPermissions) { permissions.add(privacyPermission.createResponseItem()); } return permissions; } public void setDataId(DataIdentifier dataId) { if (dataId != null) { this.dataId = DataIdentifierUtils.toUriString(dataId); } } public void setRequestor(RequestorBean requestor) { if (requestor != null) { this.requestorId = RequestorUtils.toUriString(requestor); } } public List<Action> getActionsFromData() { List<Action> actions = new ArrayList<Action>(); if (null != this.actions && !"".equals(this.actions)) { int pos = 0, end; int posOptional = 0, endOptional; // Loop over actions while ((end = this.actions.indexOf('/', pos)) >= 0) { String action = this.actions.substring(pos, end); pos = end + 1; endOptional = this.actionOptionalFlags.indexOf('/', posOptional); boolean optional = "true".equals(this.actionOptionalFlags.substring(posOptional, endOptional)); posOptional = endOptional + 1; actions.add(ActionUtils.create(action, optional)); } } return actions; } public void setActionsToData(List<Action> actions) { if (null == actions) return; Collections.sort(actions, new ActionUtils.ActionComparator()); StringBuilder strActions = new StringBuilder(); StringBuilder strAtionOptionalFlags = new StringBuilder(); for(Action action : actions) { // sb.append(action.getActionConstant().name()+":"+action.isOptional()+"/"); strActions.append(action.getActionConstant().value()+"/"); strAtionOptionalFlags.append(action.isOptional()+"/"); } this.nbOfActions = actions.size(); this.actions = strActions.toString(); this.actionOptionalFlags = strAtionOptionalFlags.toString(); } /** * @param permission ResponseItem permission */ public void setResponseItem(ResponseItem permission) { setDataId(ResourceUtils.getDataIdUri(permission.getRequestItem().getResource())); setActionsToData(permission.getRequestItem().getActions()); setPermission(permission.getDecision()); } /* --- Normal Setters ---*/ public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDataId() { return dataId; } public void setDataId(String dataId) { this.dataId = dataId; } public String getRequestorId() { return requestorId; } public void setRequestorId(String requestorId) { this.requestorId = requestorId; } public String getActions() { return actions; } public void setActions(String actions) { this.actions = actions; } public String getActionOptionalFlags() { return actionOptionalFlags; } public void setActionOptionalFlags(String actionOptionalFlags) { this.actionOptionalFlags = actionOptionalFlags; } public int getNbOfActions() { return nbOfActions; } public void setNbOfActions(int nbOfActions) { this.nbOfActions = nbOfActions; } public Decision getPermission() { return permission; } public void setPermission(Decision permission) { this.permission = permission; } @Override public String toString() { return "PrivacyPermission [" + (id != null ? "id=" + id + ", " : "") + (requestorId != null ? "requestorId=" + requestorId + ", " : "") + (dataId != null ? "dataId=" + dataId + ", " : "") + (actions != null ? nbOfActions+" actions=" + actions + ", " : "") + (actionOptionalFlags != null ? "actionOptionalFlags=" + actionOptionalFlags + ", " : "") + (permission != null ? "permission=" + permission : "") + "]"; } }