/*
* Copyright (c) 2011, Cloudera, Inc. All Rights Reserved.
*
* Cloudera, Inc. licenses this file to you 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
*
* This software 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 com.cloudera.lib.service.security;
import com.cloudera.lib.server.BaseService;
import com.cloudera.lib.server.ServiceException;
import com.cloudera.lib.service.ACL;
import com.cloudera.lib.service.Groups;
import com.cloudera.lib.util.Check;
import java.io.IOException;
import java.security.AccessControlException;
import java.text.MessageFormat;
import java.util.List;
public class ACLService extends BaseService implements ACL {
private static final String PREFIX = "acl";
public ACLService() {
super(PREFIX);
}
@Override
protected void init() throws ServiceException {
}
@Override
public Class getInterface() {
return ACL.class;
}
@Override
public Class[] getServiceDependencies() {
return new Class[]{Groups.class};
}
@Override
public void validate(String user, String owner, String acl) throws AccessControlException {
Check.notEmpty(user, "user");
Check.notEmpty(owner, "owner");
if (!user.equals(owner)) {
if (acl != null) {
String values[] = acl.split(",");
for (String value : values) {
value = value.trim();
if (value.equals(user)) {
return;
}
}
try {
List<String> groups = getServer().get(Groups.class).getGroups(user);
for (String value : values) {
if (groups.contains(value)) {
return;
}
}
throw new AccessControlException(MessageFormat.format("User [{0}] does not satisfy ACL [{1}]",
user, acl));
}
catch (IOException ex) {
throw new AccessControlException(ex.getMessage());
}
}
else {
throw new AccessControlException(MessageFormat.format("No ACL, user [{0}] not owner [{1}]",
user, owner));
}
}
}
}