/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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
*
* 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 ro.nextreports.server.security;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.springframework.security.acls.domain.AclFormattingUtils;
import org.springframework.security.acls.domain.CumulativePermission;
import org.springframework.security.acls.model.Permission;
/**
* @author Decebal Suiu
*/
public final class NextServerPermission implements Permission {
public static final Permission READ = new NextServerPermission(1 << 0, 'R'); // 1
public static final Permission EXECUTE = new NextServerPermission(1 << 1, 'E'); // 2
public static final Permission WRITE = new NextServerPermission(1 << 2, 'W'); // 4
public static final Permission DELETE = new NextServerPermission(1 << 3, 'D'); // 8
public static final Permission SECURITY = new NextServerPermission(1 << 4, 'C'); // 16
private static Map<Integer, NextServerPermission> permissionsByInteger;
private static Map<String, NextServerPermission> permissionsByName;
private char code;
private int mask;
private NextServerPermission(int mask, char code) {
this.mask = mask;
this.code = code;
}
static {
permissionsByInteger = new HashMap<Integer, NextServerPermission>();
permissionsByName = new HashMap<String, NextServerPermission>();
Field[] fields = NextServerPermission.class.getDeclaredFields();
for (Field field : fields) {
try {
Object fieldValue = field.get(null);
if (NextServerPermission.class.isAssignableFrom(fieldValue.getClass())) {
NextServerPermission permission = (NextServerPermission) fieldValue;
permissionsByInteger.put(permission.getMask(), permission);
permissionsByName.put(field.getName(), permission);
}
} catch (Exception e) {
// ignore
}
}
}
public static Permission buildFromMask(int mask) {
if (permissionsByInteger.containsKey(mask)) {
return permissionsByInteger.get(mask);
}
// to get this far, we have to use a CumulativePermission
CumulativePermission cumulativePermission = new CumulativePermission();
for (int i = 0; i < 32; i++) {
int permissionToCheck = 1 << i;
if ((mask & permissionToCheck) == permissionToCheck) {
Permission permission = permissionsByInteger.get(permissionToCheck);
if (permission == null) {
System.out.println("Mask " + permissionToCheck + " does not have a corresponding static NextServerPermission");
continue;
}
cumulativePermission.set(permission);
}
}
return cumulativePermission;
}
public static Permission[] buildFromMask(int[] masks) {
if ((masks == null) || (masks.length == 0)) {
return new Permission[0];
}
List<Permission> list = new Vector<Permission>();
for (int mask : masks) {
list.add(NextServerPermission.buildFromMask(mask));
}
Permission[] permissions = new Permission[list.size()];
permissions = list.toArray(permissions);
return permissions;
}
public static Permission buildFromName(String name) {
if (!permissionsByName.containsKey(name)) {
System.out.println("Unknown permission '" + name + "'");
return null;
}
return permissionsByName.get(name);
}
public static Permission[] buildFromName(String[] names) {
if ((names == null) || (names.length == 0)) {
return new Permission[0];
}
List<Permission> list = new Vector<Permission>();
for (String name : names) {
list.add(NextServerPermission.buildFromName(name));
}
Permission[] permissions = new Permission[list.size()];
permissions = list.toArray(permissions);
return permissions;
}
public int getMask() {
return mask;
}
public String getPattern() {
return AclFormattingUtils.printBinary(mask, code);
}
@Override
public String toString() {
return "NextServerPermission[" + getPattern() + "=" + mask + "]";
}
@Override
public boolean equals(Object object) {
if (object == null) {
return false;
}
if (!(object instanceof Permission)) {
return false;
}
Permission permission = (Permission) object;
return (mask == permission.getMask());
}
@Override
public int hashCode() {
return mask;
}
}