/** * */ package com.thinkbiganalytics.security.role; /*- * #%L * kylo-security-api * %% * Copyright (C) 2017 ThinkBig Analytics * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. * #L% */ import java.security.Principal; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import com.thinkbiganalytics.security.action.Action; import com.thinkbiganalytics.security.action.AllowableAction; import com.thinkbiganalytics.security.action.AllowedActions; /** * An immutable implementation of AllowedActions suitable for making a snapshot of another * AllowedActions. This implementation does not support changing any permissions of * its contained AllowableActions. */ public class ImmutableAllowedActions implements AllowedActions { private final List<AllowableAction> availableActions; public ImmutableAllowedActions(AllowedActions allowed) { this(allowed.getAvailableActions()); } public ImmutableAllowedActions(List<AllowableAction> actions) { List<AllowableAction> newActions = actions.stream() .map(ImmutableAllowableAction::new) .collect(Collectors.toList()); this.availableActions = Collections.unmodifiableList(newActions); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#getAvailableActions() */ @Override public List<AllowableAction> getAvailableActions() { return availableActions; } @Override public boolean hasPermission(Action action, Action... more) { return this.availableActions.stream() .anyMatch(a -> Stream.concat(Stream.of(action), Arrays.stream(more)).anyMatch(b -> a.implies(b))); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#checkPermission(java.util.Set) */ @Override public void checkPermission(Set<Action> actions) { this.availableActions.stream() .anyMatch(a -> actions.stream().anyMatch(b -> a.implies(b))); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#checkPermission(com.thinkbiganalytics.security.action.Action, com.thinkbiganalytics.security.action.Action[]) */ @Override public void checkPermission(Action action, Action... more) { this.availableActions.stream() .anyMatch(a -> Stream.concat(Stream.of(action), Arrays.stream(more)).anyMatch(b -> a.implies(b))); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#enable(java.security.Principal, com.thinkbiganalytics.security.action.Action, com.thinkbiganalytics.security.action.Action[]) */ @Override public boolean enable(Principal principal, Action action, Action... more) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#enable(java.security.Principal, java.util.Set) */ @Override public boolean enable(Principal principal, Set<Action> actions) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#enableOnly(java.security.Principal, com.thinkbiganalytics.security.action.Action, com.thinkbiganalytics.security.action.Action[]) */ @Override public boolean enableOnly(Principal principal, Action action, Action... more) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#enableOnly(java.security.Principal, java.util.Set) */ @Override public boolean enableOnly(Principal principal, Set<Action> actions) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#enableOnly(java.security.Principal, com.thinkbiganalytics.security.action.AllowedActions) */ @Override public boolean enableOnly(Principal principal, AllowedActions actions) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#enableAll(java.security.Principal) */ @Override public boolean enableAll(Principal principal) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#disable(java.security.Principal, com.thinkbiganalytics.security.action.Action, com.thinkbiganalytics.security.action.Action[]) */ @Override public boolean disable(Principal principal, Action action, Action... more) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#disable(java.security.Principal, java.util.Set) */ @Override public boolean disable(Principal principal, Set<Action> actions) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#disable(java.security.Principal, com.thinkbiganalytics.security.action.AllowedActions) */ @Override public boolean disable(Principal principal, AllowedActions actions) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see com.thinkbiganalytics.security.action.AllowedActions#deisableAll(java.security.Principal) */ @Override public boolean disableAll(Principal principal) { throw new UnsupportedOperationException("Changing permissions is not supported by this type of " + AllowedActions.class.getSimpleName()); } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return this.availableActions.toString(); } }