/** * Tests the ASN.1 encoding for the response control. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testASN1ValueEncoding() throws Exception { ByteStringBuilder builder = new ByteStringBuilder(); ASN1Writer writer = ASN1.getWriter(builder); VLVResponseControl vlvResponse = new VLVResponseControl(true, 0, 15, 0, ByteString.valueOf("foo")); vlvResponse.writeValue(writer); ASN1Reader reader = ASN1.getReader(builder.toByteString()); // Should start as an octet string with a nested sequence assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_OCTET_STRING_TYPE); reader.readStartSequence(); // Should be an sequence start assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_SEQUENCE_TYPE); reader.readStartSequence(); // Should be an integer with targetPosition assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_INTEGER_TYPE); assertEquals(reader.readInteger(), 0); // Should be an integer with contentCount assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_INTEGER_TYPE); assertEquals(reader.readInteger(), 15); // Should be an enumerated with virtualListViewResult assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_ENUMERATED_TYPE); assertEquals(reader.readEnumerated(), 0); // Should be an octet string with contextID assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_OCTET_STRING_TYPE); assertEquals(reader.readOctetStringAsString(), "foo"); }
private void encodeV2Attributes( ByteStringBuilder buffer, Map<AttributeType, List<Attribute>> attributes, EntryEncodeConfig config) throws DirectoryException { int numAttributes = 0; // First count how many attributes are there to encode. for (List<Attribute> attrList : attributes.values()) { for (Attribute a : attrList) { if (a.isVirtual() || a.isEmpty()) { continue; } numAttributes++; } } // Encoded one-to-five byte number of attributes buffer.appendBERLength(numAttributes); if (config.compressAttributeDescriptions()) { for (List<Attribute> attrList : attributes.values()) { for (Attribute a : attrList) { if (a.isVirtual() || a.isEmpty()) { continue; } ByteStringBuilder bsb = new ByteStringBuilder(); config.getCompressedSchema().encodeAttribute(bsb, a); buffer.appendBERLength(bsb.length()); buffer.append(bsb); } } } else { // The attributes will be encoded as a sequence of: // - A UTF-8 byte representation of the attribute name. // - A zero delimiter // - A one-to-five byte number of values for the attribute // - A sequence of: // - A one-to-five byte length for the value // - A UTF-8 byte representation for the value for (List<Attribute> attrList : attributes.values()) { for (Attribute a : attrList) { byte[] nameBytes = getBytes(a.getNameWithOptions()); buffer.append(nameBytes); buffer.append((byte) 0x00); buffer.appendBERLength(a.size()); for (AttributeValue v : a) { buffer.appendBERLength(v.getValue().length()); buffer.append(v.getValue()); } } } } }
/** * Tests the {@code decodeControl} method when the control value is a sequence with zero elements. * * @throws Exception If an unexpected problem occurs. */ @Test(expectedExceptions = {DirectoryException.class}) public void testDecodeControlValueEmptySequence() throws Exception { ByteStringBuilder bsb = new ByteStringBuilder(); ASN1Writer writer = ASN1.getWriter(bsb); writer.writeStartSequence(); writer.writeEndSequence(); LDAPControl c = new LDAPControl(OID_PROXIED_AUTH_V1, true, bsb.toByteString()); ProxiedAuthV1Control.DECODER.decode(c.isCritical(), c.getValue()); }
/** * Encodes this entry using the V3 encoding. * * @param buffer The buffer to encode into. * @throws DirectoryException If a problem occurs while attempting to encode the entry. */ private void encodeV1(Entry entry, ByteStringBuilder buffer) throws DirectoryException { // The version number will be one byte. buffer.append((byte) 0x01); // TODO: Can we encode the DN directly into buffer? byte[] dnBytes = getBytes(entry.getDN().toString()); buffer.appendBERLength(dnBytes.length); buffer.append(dnBytes); // Encode number of OCs and 0 terminated names. int i = 1; ByteStringBuilder bsb = new ByteStringBuilder(); for (String ocName : entry.getObjectClasses().values()) { bsb.append(ocName); if (i < entry.getObjectClasses().values().size()) { bsb.append((byte) 0x00); } i++; } buffer.appendBERLength(bsb.length()); buffer.append(bsb); // Encode the user attributes in the appropriate manner. encodeV1Attributes(buffer, entry.getUserAttributes()); // The operational attributes will be encoded in the same way as // the user attributes. encodeV1Attributes(buffer, entry.getOperationalAttributes()); }
/** * Tests the {@code decodeControl} method when the control value is a valid octet string that * contains an valid non-empty DN. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testDecodeControlValueNonEmptyDN() throws Exception { ByteStringBuilder bsb = new ByteStringBuilder(); ASN1Writer writer = ASN1.getWriter(bsb); writer.writeStartSequence(); writer.writeOctetString("uid=test,o=test"); writer.writeEndSequence(); LDAPControl c = new LDAPControl(OID_PROXIED_AUTH_V1, true, bsb.toByteString()); ProxiedAuthV1Control proxyControl = ProxiedAuthV1Control.DECODER.decode(c.isCritical(), c.getValue()); assertEquals(proxyControl.getAuthorizationDN(), DN.decode("uid=test,o=test")); }
/** * Tests the {@code decodeControl} method when the control value is a sequence with multiple * elements. * * @throws Exception If an unexpected problem occurs. */ @Test public void testDecodeControlValueMultiElementSequence() throws Exception { ByteStringBuilder bsb = new ByteStringBuilder(); ASN1Writer writer = ASN1.getWriter(bsb); writer.writeStartSequence(); writer.writeOctetString("uid=element1,o=test"); writer.writeOctetString("uid=element2,o=test"); writer.writeEndSequence(); LDAPControl c = new LDAPControl(OID_PROXIED_AUTH_V1, true, bsb.toByteString()); assertEquals( ByteString.valueOf("uid=element1,o=test"), ProxiedAuthV1Control.DECODER.decode(c.isCritical(), c.getValue()).getRawAuthorizationDN()); }
/** * Tests the entry encoding and decoding process the version 1 encoding. * * @throws Exception If the test failed unexpectedly. */ @Test() public void testEntryToAndFromDatabaseV1() throws Exception { // Make sure that the server is up and running. TestCaseUtils.startServer(); // Convert the test LDIF string to a byte array byte[] originalLDIFBytes = StaticUtils.getBytes(ldifString); LDIFReader reader = new LDIFReader(new LDIFImportConfig(new ByteArrayInputStream(originalLDIFBytes))); Entry entryBefore, entryAfterV1; while ((entryBefore = reader.readEntry(false)) != null) { ByteStringBuilder bsb = new ByteStringBuilder(); encodeV1(entryBefore, bsb); entryAfterV1 = Entry.decode(bsb.asReader()); assertEquals(entryBefore, entryAfterV1); } reader.close(); }
/** * Encodes this entry using the V3 encoding. * * @param buffer The buffer to encode into. * @throws DirectoryException If a problem occurs while attempting to encode the entry. */ private void encodeV2(Entry entry, ByteStringBuilder buffer, EntryEncodeConfig config) throws DirectoryException { // The version number will be one byte. buffer.append((byte) 0x02); // Get the encoded respresentation of the config. config.encode(buffer); // If we should include the DN, then it will be encoded as a // one-to-five byte length followed by the UTF-8 byte // representation. if (!config.excludeDN()) { // TODO: Can we encode the DN directly into buffer? byte[] dnBytes = getBytes(entry.getDN().toString()); buffer.appendBERLength(dnBytes.length); buffer.append(dnBytes); } // Encode the object classes in the appropriate manner. if (config.compressObjectClassSets()) { config.getCompressedSchema().encodeObjectClasses(buffer, entry.getObjectClasses()); } else { // Encode number of OCs and 0 terminated names. int i = 1; ByteStringBuilder bsb = new ByteStringBuilder(); for (String ocName : entry.getObjectClasses().values()) { bsb.append(ocName); if (i < entry.getObjectClasses().values().size()) { bsb.append((byte) 0x00); } i++; } buffer.appendBERLength(bsb.length()); buffer.append(bsb); } // Encode the user attributes in the appropriate manner. encodeV2Attributes(buffer, entry.getUserAttributes(), config); // The operational attributes will be encoded in the same way as // the user attributes. encodeV2Attributes(buffer, entry.getOperationalAttributes(), config); }
/** * Tests the entry encoding and decoding process the version 1 encoding. * * @throws Exception If the test failed unexpectedly. */ @Test(dataProvider = "encodeConfigs") public void testEntryToAndFromDatabaseV3(EntryEncodeConfig config) throws Exception { // Make sure that the server is up and running. TestCaseUtils.startServer(); // Convert the test LDIF string to a byte array byte[] originalLDIFBytes = StaticUtils.getBytes(ldifString); LDIFReader reader = new LDIFReader(new LDIFImportConfig(new ByteArrayInputStream(originalLDIFBytes))); Entry entryBefore, entryAfterV3; while ((entryBefore = reader.readEntry(false)) != null) { ByteStringBuilder bsb = new ByteStringBuilder(); entryBefore.encode(bsb, config); entryAfterV3 = Entry.decode(bsb.asReader()); if (config.excludeDN()) { entryAfterV3.setDN(entryBefore.getDN()); } assertEquals(entryBefore, entryAfterV3); } reader.close(); }
/** * Encodes this entry encode configuration into a byte array * suitable for inclusion in the encoded entry. * * @param buffer The buffer to encode this configuration to. */ public void encode(ByteStringBuilder buffer) { buffer.appendBERLength(1); buffer.append(encodedRepresentation); }