blob: 736c5261c047343630ad57f652f93eb05da76e0c [file] [log] [blame]
/*
* Copyright (c) 2020 Kentyou.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kentyou - initial API and implementation
*/
package org.eclipse.sensinact.gateway.core.security;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.sensinact.gateway.core.method.AccessMethod;
/**
* Pre-defined set of {@link AccessProfile} policies
*
* @author <a href="mailto:christophe.munilla@cea.fr">Christophe Munilla</a>
*/
@SuppressWarnings("serial")
public enum AccessProfileOption {
DEFAULT(new HashMap<AccessMethod.Type, Integer>() {
{
put(AccessMethod.Type.valueOf(AccessMethod.GET), new Integer(1));
put(AccessMethod.Type.valueOf(AccessMethod.SET), new Integer(2));
put(AccessMethod.Type.valueOf(AccessMethod.ACT), new Integer(2));
put(AccessMethod.Type.valueOf(AccessMethod.SUBSCRIBE), new Integer(1));
put(AccessMethod.Type.valueOf(AccessMethod.UNSUBSCRIBE), new Integer(1));
put(AccessMethod.Type.valueOf(AccessMethod.DESCRIBE), new Integer(1));
}
}), ALL_ANONYMOUS(new HashMap<AccessMethod.Type, Integer>() {
{
put(AccessMethod.Type.valueOf(AccessMethod.GET), new Integer(1));
put(AccessMethod.Type.valueOf(AccessMethod.SET), new Integer(1));
put(AccessMethod.Type.valueOf(AccessMethod.ACT), new Integer(1));
put(AccessMethod.Type.valueOf(AccessMethod.SUBSCRIBE), new Integer(1));
put(AccessMethod.Type.valueOf(AccessMethod.UNSUBSCRIBE), new Integer(1));
put(AccessMethod.Type.valueOf(AccessMethod.DESCRIBE), new Integer(1));
}
}), NO_ANONYMOUS(new HashMap<AccessMethod.Type, Integer>() {
{
put(AccessMethod.Type.valueOf(AccessMethod.GET), new Integer(2));
put(AccessMethod.Type.valueOf(AccessMethod.SET), new Integer(2));
put(AccessMethod.Type.valueOf(AccessMethod.ACT), new Integer(2));
put(AccessMethod.Type.valueOf(AccessMethod.SUBSCRIBE), new Integer(2));
put(AccessMethod.Type.valueOf(AccessMethod.UNSUBSCRIBE), new Integer(2));
put(AccessMethod.Type.valueOf(AccessMethod.DESCRIBE), new Integer(2));
}
}), ADMIN(new HashMap<AccessMethod.Type, Integer>() {
{
put(AccessMethod.Type.valueOf(AccessMethod.GET), new Integer(3));
put(AccessMethod.Type.valueOf(AccessMethod.SET), new Integer(3));
put(AccessMethod.Type.valueOf(AccessMethod.ACT), new Integer(3));
put(AccessMethod.Type.valueOf(AccessMethod.SUBSCRIBE), new Integer(3));
put(AccessMethod.Type.valueOf(AccessMethod.UNSUBSCRIBE), new Integer(3));
put(AccessMethod.Type.valueOf(AccessMethod.DESCRIBE), new Integer(3));
}
}), OWNER(new HashMap<AccessMethod.Type, Integer>() {
{
put(AccessMethod.Type.valueOf(AccessMethod.GET), new Integer(3));
put(AccessMethod.Type.valueOf(AccessMethod.SET), new Integer(4));
put(AccessMethod.Type.valueOf(AccessMethod.ACT), new Integer(4));
put(AccessMethod.Type.valueOf(AccessMethod.SUBSCRIBE), new Integer(3));
put(AccessMethod.Type.valueOf(AccessMethod.UNSUBSCRIBE), new Integer(3));
put(AccessMethod.Type.valueOf(AccessMethod.DESCRIBE), new Integer(3));
}
});
/**
* @param map
*
* @return
*/
private static final Set<MethodAccess> buildMethodAccesses(HashMap<AccessMethod.Type, Integer> map) {
Set<MethodAccess> methodAccesses = new HashSet<MethodAccess>();
Iterator<Map.Entry<AccessMethod.Type, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<AccessMethod.Type, Integer> entry = iterator.next();
AccessMethod.Type type = entry.getKey();
AccessLevel accessLevel = new AccessLevelImpl(entry.getValue());
methodAccesses.add(new MethodAccessImpl(accessLevel, type));
}
return methodAccesses;
}
/**
* Returns the AccessProfileOption holding the same {@link AccessProfile} as the
* one passed as parameter; meaning that the same {@link AccessMethod.Type} has
* the same {@link AccessLevel}
*
* @param profile
*
* @return
*/
public static AccessProfileOption valueOf(AccessProfile profile) {
if (profile == null) {
return AccessProfileOption.ALL_ANONYMOUS;
}
Set<MethodAccess> methodAccesses = profile.getMethodAccesses();
Map<AccessMethod.Type, AccessLevel> profileMap = new HashMap<AccessMethod.Type, AccessLevel>();
Iterator<MethodAccess> iterator = methodAccesses.iterator();
while (iterator.hasNext()) {
MethodAccess methodAccess = iterator.next();
profileMap.put(methodAccess.getMethod(), methodAccess.getAccessLevel());
}
AccessProfileOption[] values = AccessProfileOption.values();
int index = 0;
int length = values == null ? 0 : values.length;
AccessProfileOption value = null;
for (; index < length; index++) {
AccessProfile optionProfile = values[index].getAccessProfile();
Set<MethodAccess> optionAccesses = optionProfile.getMethodAccesses();
Iterator<MethodAccess> optionIterator = optionAccesses.iterator();
boolean found = true;
while (optionIterator.hasNext()) {
MethodAccess methodAccess = optionIterator.next();
if (profileMap.get(methodAccess.getMethod()).getLevel() != methodAccess.getAccessLevel().getLevel()) {
found = false;
break;
}
}
if (found) {
value = values[index];
break;
}
}
return value;
}
private final AccessProfileImpl accessProfile;
/**
* Returns the {@link AccessProfile} associated to this access policy
*
* @return this access policy's {@link AccessProfile}
*/
public AccessProfile getAccessProfile() {
return this.accessProfile;
}
/**
* Constructor
*
* @param map
*/
AccessProfileOption(HashMap<AccessMethod.Type, Integer> map) {
Set<MethodAccess> methodAccesses = buildMethodAccesses(map);
this.accessProfile = new AccessProfileImpl(methodAccesses);
}
}