/** * Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016 * * 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. */ package org.glite.security.voms.admin.util; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.glite.security.voms.admin.configuration.VOMSConfiguration; import org.glite.security.voms.admin.configuration.VOMSConfigurationConstants; import org.glite.security.voms.admin.error.NullArgumentException; import org.glite.security.voms.admin.error.VOMSSyntaxException; /** * * * @author <a href="mailto:lorentey@elte.hu">Karoly Lorentey</a> * @author <a href="mailto:andrea.ceccanti@cnaf.infn.it">Andrea Ceccanti </a> * * */ public class PathNamingScheme { public static final Logger log = LoggerFactory .getLogger(PathNamingScheme.class); public static final String containerSyntax = "^(/[\\w.-]+)+|((/[\\w.-]+)+/)?(Role=[\\w.-]+)|(Capability=[\\w\\s.-]+)$"; public static final String groupSyntax = "^(/[\\w.-]+)+$"; public static final String roleSyntax = "^Role=[\\w.-]+$"; public static final String qualifiedRoleSyntax = "^(/[\\w.-]+)+/Role=[\\w.-]+$"; public static final String capabilitySyntax = "^Capability=[\\w\\s.-]+$"; public static final Pattern containerPattern = Pattern .compile(containerSyntax); public static final Pattern groupPattern = Pattern.compile(groupSyntax); public static final Pattern rolePattern = Pattern.compile(roleSyntax); public static final Pattern qualifiedRolePattern = Pattern .compile(qualifiedRoleSyntax); public static final Pattern capabilityPattern = Pattern .compile(capabilitySyntax); public static void checkSyntax(String containerName) { if (containerName == null) throw new NullArgumentException("containerName == null"); if (containerName.length() > 255) throw new VOMSSyntaxException("containerName.length() > 255"); if (!containerPattern.matcher(containerName).matches()) throw new VOMSSyntaxException("Syntax error in container name: " + containerName); } public static void checkGroup(String groupName) { checkSyntax(groupName); if (!groupPattern.matcher(groupName).matches()) throw new VOMSSyntaxException("Syntax error in group name: " + groupName); } public static void checkRole(String roleName) { if (roleName == null) throw new NullArgumentException("roleName == null"); if (roleName.length() > 255) throw new VOMSSyntaxException("roleName.length()>255"); if (!rolePattern.matcher(roleName).matches()) throw new VOMSSyntaxException("Syntax error in role name: " + roleName); } public static String getParentGroupName(String groupName) { checkSyntax(groupName); if (StringUtils.countMatches(groupName, "/") == 1) return groupName; else return StringUtils.substringBeforeLast(groupName, "/"); } public static String[] getParentGroupChain(String groupName) { checkSyntax(groupName); String[] tmp = groupName.split("/"); String[] groupChain = (String[]) ArrayUtils.subarray(tmp, 1, tmp.length); if (groupChain.length == 1) { return new String[] { groupName }; } String[] result = new String[groupChain.length - 1]; if (result.length == 1) { result[0] = "/" + groupChain[0]; return result; } for (int i = groupChain.length - 1; i > 0; i--) result[i - 1] = "/" + StringUtils.join(ArrayUtils.subarray(groupChain, 0, i), "/"); return result; } public static boolean isGroupFQAN(String groupName) { checkSyntax(groupName); return groupPattern.matcher(groupName).matches(); } public static boolean isGroup(String groupName) { checkSyntax(groupName); String voName = "/" + VOMSConfiguration.instance().getString( VOMSConfigurationConstants.VO_NAME); if (!groupName.startsWith(voName)) { log.error("Group name : " + groupName + " does not start with vo name: " + voName); return false; } return groupPattern.matcher(groupName).matches(); } public static boolean isRole(String roleName) { checkSyntax(roleName); return rolePattern.matcher(roleName).matches(); } public static boolean isQualifiedRole(String roleName) { checkSyntax(roleName); return qualifiedRolePattern.matcher(roleName).matches(); } public static String getRoleName(String containerName) { if (!isRole(containerName) && !isQualifiedRole(containerName)) throw new VOMSSyntaxException("No role specified in \"" + containerName + "\" voms syntax."); Matcher m = containerPattern.matcher(containerName); if (m.matches()) { String roleGroup = m.group(4); return roleGroup .substring(roleGroup.indexOf("=") + 1, roleGroup.length()); } return null; } public static String getGroupName(String containerName) { checkSyntax(containerName); // If it's a container and it's not a role or a qualified role, then // it's a group! if (!isRole(containerName) && !isQualifiedRole(containerName)) return containerName; Matcher m = containerPattern.matcher(containerName); if (m.matches()) { String groupName = m.group(2); if (groupName.endsWith("/")) return groupName.substring(0, groupName.length() - 1); else return groupName; } return null; } }