blob: 44fd3659cafbbf1794d247852fe641d02bd30b1a [file] [log] [blame]
/*
* 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 org.apache.knox.gateway.util;
import java.util.ArrayList;
import java.util.Iterator;
import javax.security.auth.x500.X500Principal;
public class X500PrincipalParser
{
public static final int LEASTSIGNIFICANT = 0;
public static final int MOSTSIGNIFICANT = 1;
public static final String attrCN = "CN";
public static final String attrOU = "OU";
public static final String attrO = "O";
public static final String attrC = "C";
public static final String attrL = "L";
public static final String attrST = "ST";
public static final String attrSTREET = "STREET";
public static final String attrEMAIL = "EMAILADDRESS";
public static final String attrUID = "UID";
ArrayList rdnNameArray = new ArrayList();
private static final String attrTerminator = "=";
public X500PrincipalParser(X500Principal principal)
{
parseDN(principal.getName(X500Principal.RFC2253));
}
public ArrayList getAllValues(String attributeID)
{
ArrayList retList = new ArrayList();
String searchPart = attributeID + attrTerminator;
for(Iterator iter = rdnNameArray.iterator(); iter.hasNext();)
{
ArrayList nameList = (ArrayList)iter.next();
String namePart = (String)nameList.get(0);
if(namePart.startsWith(searchPart))
{
// Return the string starting after the ID string and the = sign that follows it.
retList.add(namePart.toString().substring(searchPart.length()));
}
}
return retList;
}
public String getC()
{
return findPart(attrC);
}
public String getCN()
{
return findPart(attrCN);
}
public String getEMAILDDRESS()
{
return findPart(attrEMAIL);
}
public String getL()
{
return findPart(attrL);
}
public String getO()
{
return findPart(attrO);
}
public String getOU()
{
return findPart(attrOU);
}
public String getST()
{
return findPart(attrST);
}
public String getSTREET()
{
return findPart(attrSTREET);
}
public String getUID()
{
return findPart(attrUID);
}
private String findPart(String attributeID)
{
return findSignificantPart(attributeID, MOSTSIGNIFICANT);
}
private String findSignificantPart(String attributeID, int significance)
{
String retNamePart = null;
String searchPart = attributeID + attrTerminator;
for(Iterator iter = rdnNameArray.iterator(); iter.hasNext();)
{
ArrayList nameList = (ArrayList)iter.next();
String namePart = (String)nameList.get(0);
if(namePart.startsWith(searchPart))
{
// Return the string starting after the ID string and the = sign that follows it.
retNamePart = namePart.toString().substring(searchPart.length());
// By definition the first one is most significant
if(significance == MOSTSIGNIFICANT)
break;
}
}
return retNamePart;
}
private void parseDN(String dn) throws IllegalArgumentException
{
int startIndex = 0;
char c = '\0';
ArrayList nameValues = new ArrayList();
rdnNameArray.clear();
while(startIndex < dn.length())
{
int endIndex;
for(endIndex = startIndex; endIndex < dn.length(); endIndex++)
{
c = dn.charAt(endIndex);
if(c == ',' || c == '+')
break;
if(c == '\\')
{
endIndex++; // skip the escaped char
}
}
if(endIndex > dn.length())
throw new IllegalArgumentException("unterminated escape " + dn);
nameValues.add(dn.substring(startIndex, endIndex));
if(c != '+')
{
rdnNameArray.add(nameValues);
if(endIndex != dn.length())
nameValues = new ArrayList();
else
nameValues = null;
}
startIndex = endIndex + 1;
}
if(nameValues != null)
{
throw new IllegalArgumentException("improperly terminated DN " + dn);
}
}
}