| | |
| | | // whitespace. |
| | | int pos = 0; |
| | | int length = valueStr.length(); |
| | | while ((pos < length) && (valueStr.charAt(pos) == ' ')) |
| | | while (pos < length && valueStr.charAt(pos) == ' ') |
| | | { |
| | | pos++; |
| | | } |
| | |
| | | char c = valueStr.charAt(pos++); |
| | | if (c != '(') |
| | | { |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_EXPECTED_OPEN_PARENTHESIS.get(valueStr, (pos-1), c); |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_EXPECTED_OPEN_PARENTHESIS.get(valueStr, pos-1, c); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | |
| | | |
| | | // Skip over any spaces immediately following the opening parenthesis. |
| | | while ((pos < length) && ((c = valueStr.charAt(pos)) == ' ')) |
| | | while (pos < length && ((c = valueStr.charAt(pos)) == ' ')) |
| | | { |
| | | pos++; |
| | | } |
| | |
| | | // This must be a numeric OID. In that case, we will accept only digits |
| | | // and periods, but not consecutive periods. |
| | | boolean lastWasPeriod = false; |
| | | while ((pos < length) && ((c = valueStr.charAt(pos++)) != ' ')) |
| | | while (pos < length && ((c = valueStr.charAt(pos++)) != ' ')) |
| | | { |
| | | if (c == '.') |
| | | { |
| | | if (lastWasPeriod) |
| | | { |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_DOUBLE_PERIOD_IN_NUMERIC_OID. |
| | | get(valueStr, (pos-1)); |
| | | get(valueStr, pos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | | message); |
| | | } |
| | | else |
| | | { |
| | | lastWasPeriod = true; |
| | | } |
| | | lastWasPeriod = true; |
| | | } |
| | | else if (! isDigit(c)) |
| | | { |
| | | // This must have been an illegal character. |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR_IN_NUMERIC_OID.get(valueStr, c, (pos-1)); |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR_IN_NUMERIC_OID.get(valueStr, c, pos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | else |
| | |
| | | { |
| | | // This must be a "fake" OID. In this case, we will only accept |
| | | // alphabetic characters, numeric digits, and the hyphen. |
| | | while ((pos < length) && ((c = valueStr.charAt(pos++)) != ' ')) |
| | | while (pos < length && ((c = valueStr.charAt(pos++)) != ' ')) |
| | | { |
| | | if (isAlpha(c) || isDigit(c) || (c == '-') || |
| | | ((c == '_') && DirectoryServer.allowAttributeNameExceptions())) |
| | | if (isAlpha(c) || isDigit(c) || c == '-' || |
| | | (c == '_' && DirectoryServer.allowAttributeNameExceptions())) |
| | | { |
| | | // This is fine. It is an acceptable character. |
| | | } |
| | | else |
| | | { |
| | | // This must have been an illegal character. |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR_IN_STRING_OID.get(valueStr, c, (pos-1)); |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR_IN_STRING_OID.get(valueStr, c, pos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | } |
| | |
| | | |
| | | // If we're at the end of the value, then it isn't a valid DIT content rule |
| | | // description. Otherwise, parse out the OID. |
| | | String oid; |
| | | if (pos >= length) |
| | | { |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | else |
| | | { |
| | | oid = lowerStr.substring(oidStartPos, (pos-1)); |
| | | } |
| | | |
| | | String oid = lowerStr.substring(oidStartPos, pos-1); |
| | | |
| | | // Get the objectclass with the specified OID. If it does not exist or is |
| | | // not structural, then fail. |
| | |
| | | |
| | | |
| | | // Skip over the space(s) after the OID. |
| | | while ((pos < length) && ((c = valueStr.charAt(pos)) == ' ')) |
| | | while (pos < length && ((c = valueStr.charAt(pos)) == ' ')) |
| | | { |
| | | pos++; |
| | | } |
| | |
| | | if (pos < length) |
| | | { |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_UNEXPECTED_CLOSE_PARENTHESIS. |
| | | get(valueStr, (pos-1)); |
| | | get(valueStr, pos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | | message); |
| | | } |
| | |
| | | { |
| | | StringBuilder userBuffer = new StringBuilder(); |
| | | StringBuilder lowerBuffer = new StringBuilder(); |
| | | pos = readQuotedString(valueStr, lowerStr, userBuffer, lowerBuffer, |
| | | (pos-1)); |
| | | pos = readQuotedString(valueStr, lowerStr, userBuffer, lowerBuffer, pos-1); |
| | | names.put(lowerBuffer.toString(), userBuffer.toString()); |
| | | } |
| | | else if (c == '(') |
| | |
| | | { |
| | | // Skip over any spaces after the parenthesis. |
| | | pos++; |
| | | while ((pos < length) && ((c = valueStr.charAt(pos)) == ' ')) |
| | | while (pos < length && ((c = valueStr.charAt(pos)) == ' ')) |
| | | { |
| | | pos++; |
| | | } |
| | |
| | | else |
| | | { |
| | | // This is an illegal character. |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, (pos-1)); |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, pos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | } |
| | |
| | | while (true) |
| | | { |
| | | StringBuilder woidBuffer = new StringBuilder(); |
| | | pos = readWOID(lowerStr, woidBuffer, (pos)); |
| | | pos = readWOID(lowerStr, woidBuffer, pos); |
| | | |
| | | ObjectClass oc = schema.getObjectClass(woidBuffer.toString()); |
| | | if (oc == null) |
| | |
| | | else if (c != '$') |
| | | { |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, (pos-1)); |
| | | ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, pos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | } |
| | |
| | | else |
| | | { |
| | | StringBuilder woidBuffer = new StringBuilder(); |
| | | pos = readWOID(lowerStr, woidBuffer, (pos-1)); |
| | | pos = readWOID(lowerStr, woidBuffer, pos-1); |
| | | |
| | | ObjectClass oc = schema.getObjectClass(woidBuffer.toString()); |
| | | if (oc == null) |
| | |
| | | while (true) |
| | | { |
| | | StringBuilder woidBuffer = new StringBuilder(); |
| | | pos = readWOID(lowerStr, woidBuffer, (pos)); |
| | | pos = readWOID(lowerStr, woidBuffer, pos); |
| | | attrs.add(getAttribute(schema, allowUnknownElements, valueStr, woidBuffer, |
| | | ERR_ATTR_SYNTAX_DCR_UNKNOWN_REQUIRED_ATTR)); |
| | | |
| | |
| | | else if (c != '$') |
| | | { |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, (pos-1)); |
| | | ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, pos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | } |
| | |
| | | else |
| | | { |
| | | StringBuilder woidBuffer = new StringBuilder(); |
| | | pos = readWOID(lowerStr, woidBuffer, (pos-1)); |
| | | pos = readWOID(lowerStr, woidBuffer, pos-1); |
| | | attrs.add(getAttribute(schema, allowUnknownElements, valueStr, woidBuffer, |
| | | ERR_ATTR_SYNTAX_DCR_UNKNOWN_REQUIRED_ATTR)); |
| | | } |
| | |
| | | while (true) |
| | | { |
| | | StringBuilder woidBuffer = new StringBuilder(); |
| | | pos = readWOID(lowerStr, woidBuffer, (pos)); |
| | | pos = readWOID(lowerStr, woidBuffer, pos); |
| | | attrs.add(getAttribute(schema, allowUnknownElements, valueStr, woidBuffer, |
| | | ERR_ATTR_SYNTAX_DCR_UNKNOWN_OPTIONAL_ATTR)); |
| | | |
| | |
| | | else if (c != '$') |
| | | { |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, (pos-1)); |
| | | ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, pos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | } |
| | |
| | | else |
| | | { |
| | | StringBuilder woidBuffer = new StringBuilder(); |
| | | pos = readWOID(lowerStr, woidBuffer, (pos-1)); |
| | | pos = readWOID(lowerStr, woidBuffer, pos-1); |
| | | attrs.add(getAttribute(schema, allowUnknownElements, valueStr, woidBuffer, |
| | | ERR_ATTR_SYNTAX_DCR_UNKNOWN_OPTIONAL_ATTR)); |
| | | } |
| | |
| | | while (true) |
| | | { |
| | | StringBuilder woidBuffer = new StringBuilder(); |
| | | pos = readWOID(lowerStr, woidBuffer, (pos)); |
| | | pos = readWOID(lowerStr, woidBuffer, pos); |
| | | attrs.add(getAttribute(schema, allowUnknownElements, valueStr, woidBuffer, |
| | | ERR_ATTR_SYNTAX_DCR_UNKNOWN_PROHIBITED_ATTR)); |
| | | |
| | |
| | | else if (c != '$') |
| | | { |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, (pos-1)); |
| | | ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR.get(valueStr, c, pos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | } |
| | |
| | | else |
| | | { |
| | | StringBuilder woidBuffer = new StringBuilder(); |
| | | pos = readWOID(lowerStr, woidBuffer, (pos-1)); |
| | | pos = readWOID(lowerStr, woidBuffer, pos-1); |
| | | attrs.add(getAttribute(schema, allowUnknownElements, valueStr, woidBuffer, |
| | | ERR_ATTR_SYNTAX_DCR_UNKNOWN_PROHIBITED_ATTR)); |
| | | } |
| | |
| | | // Skip over any spaces at the beginning of the value. |
| | | char c = '\u0000'; |
| | | int length = valueStr.length(); |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | |
| | | |
| | | // Read until we find the next space. |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos++)) != ' ')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos++)) != ' ')) |
| | | { |
| | | tokenName.append(c); |
| | | } |
| | | |
| | | |
| | | // Skip over any trailing spaces after the value. |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | // Skip over any spaces at the beginning of the value. |
| | | char c = '\u0000'; |
| | | int length = valueStr.length(); |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | |
| | | // Read until we find the closing quote. |
| | | startPos++; |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos)) != '\'')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos)) != '\'')) |
| | | { |
| | | valueBuffer.append(c); |
| | | startPos++; |
| | |
| | | |
| | | // Skip over any trailing spaces after the value. |
| | | startPos++; |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | // Skip over any spaces at the beginning of the value. |
| | | char c = '\u0000'; |
| | | int length = lowerStr.length(); |
| | | while ((startPos < length) && ((c = lowerStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = lowerStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | |
| | | // Read until we find the closing quote. |
| | | startPos++; |
| | | while ((startPos < length) && ((c = lowerStr.charAt(startPos)) != '\'')) |
| | | while (startPos < length && ((c = lowerStr.charAt(startPos)) != '\'')) |
| | | { |
| | | lowerBuffer.append(c); |
| | | userBuffer.append(valueStr.charAt(startPos)); |
| | |
| | | |
| | | // Skip over any trailing spaces after the value. |
| | | startPos++; |
| | | while ((startPos < length) && ((c = lowerStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = lowerStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | // Skip over any spaces at the beginning of the value. |
| | | char c = '\u0000'; |
| | | int length = lowerStr.length(); |
| | | while ((startPos < length) && ((c = lowerStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = lowerStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | // This must be a numeric OID. In that case, we will accept only digits |
| | | // and periods, but not consecutive periods. |
| | | boolean lastWasPeriod = false; |
| | | while ((startPos < length) && ((c = lowerStr.charAt(startPos++)) != ' ')) |
| | | while (startPos < length && ((c = lowerStr.charAt(startPos++)) != ' ')) |
| | | { |
| | | if (c == '.') |
| | | { |
| | | if (lastWasPeriod) |
| | | { |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_DOUBLE_PERIOD_IN_NUMERIC_OID. |
| | | get(lowerStr, (startPos-1)); |
| | | get(lowerStr, startPos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | | message); |
| | | } |
| | |
| | | // additional characters. |
| | | if (c == ')') |
| | | { |
| | | return (startPos-1); |
| | | return startPos-1; |
| | | } |
| | | |
| | | // This must have been an illegal character. |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR_IN_NUMERIC_OID.get( |
| | | lowerStr, c, (startPos-1)); |
| | | lowerStr, c, startPos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | else |
| | |
| | | else if (isAlpha(c)) |
| | | { |
| | | // This must be an attribute type/objectclass description. In this case, |
| | | // we will only accept alphabetic characters, numeric digits, and the |
| | | // hyphen. |
| | | while ((startPos < length) && ((c = lowerStr.charAt(startPos++)) != ' ')) |
| | | // we will only accept alphabetic characters, numeric digits, and the hyphen. |
| | | while (startPos < length && ((c = lowerStr.charAt(startPos++)) != ' ')) |
| | | { |
| | | if (isAlpha(c) || isDigit(c) || (c == '-') || |
| | | ((c == '_') && DirectoryServer.allowAttributeNameExceptions())) |
| | | if (isAlpha(c) || isDigit(c) || c == '-' || |
| | | (c == '_' && DirectoryServer.allowAttributeNameExceptions())) |
| | | { |
| | | woidBuffer.append(c); |
| | | } |
| | |
| | | // additional characters. |
| | | if (c == ')') |
| | | { |
| | | return (startPos-1); |
| | | return startPos-1; |
| | | } |
| | | |
| | | // This must have been an illegal character. |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_DCR_ILLEGAL_CHAR_IN_STRING_OID.get( |
| | | lowerStr, c, (startPos-1)); |
| | | lowerStr, c, startPos-1); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | | } |
| | |
| | | |
| | | |
| | | // Skip over any trailing spaces after the value. |
| | | while ((startPos < length) && ((c = lowerStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = lowerStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | // Skip over any leading spaces. |
| | | int length = valueStr.length(); |
| | | char c = '\u0000'; |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | // Parse until the closing quote. |
| | | StringBuilder valueBuffer = new StringBuilder(); |
| | | startPos++; |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos)) != '\'')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos)) != '\'')) |
| | | { |
| | | valueBuffer.append(c); |
| | | startPos++; |
| | |
| | | while (true) |
| | | { |
| | | // Skip over any leading spaces; |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos)) == ' ')) |
| | | { |
| | | startPos++; |
| | | } |
| | |
| | | // We have a quoted string |
| | | StringBuilder valueBuffer = new StringBuilder(); |
| | | startPos++; |
| | | while ((startPos < length) && |
| | | while (startPos < length && |
| | | ((c = valueStr.charAt(startPos)) != '\'')) |
| | | { |
| | | valueBuffer.append(c); |
| | |
| | | { |
| | | //Consider unquoted string |
| | | StringBuilder valueBuffer = new StringBuilder(); |
| | | while ((startPos < length) && |
| | | while (startPos < length && |
| | | ((c = valueStr.charAt(startPos)) != ' ')) |
| | | { |
| | | valueBuffer.append(c); |
| | |
| | | { |
| | | // Parse until the next space. |
| | | StringBuilder valueBuffer = new StringBuilder(); |
| | | while ((startPos < length) && ((c = valueStr.charAt(startPos)) != ' ')) |
| | | while (startPos < length && ((c = valueStr.charAt(startPos)) != ' ')) |
| | | { |
| | | valueBuffer.append(c); |
| | | startPos++; |
| | |
| | | } |
| | | |
| | | // Skip over any trailing spaces. |
| | | while ((startPos < length) && (valueStr.charAt(startPos) == ' ')) |
| | | while (startPos < length && valueStr.charAt(startPos) == ' ') |
| | | { |
| | | startPos++; |
| | | } |