/** * Verifies that the server will reject a CRAM-MD5 bind with credentials containing a malformed * digest. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testMalformedDigest() throws Exception { InternalClientConnection conn = new InternalClientConnection(new AuthenticationInfo()); BindOperation bindOperation = conn.processSASLBind(DN.nullDN(), SASL_MECHANISM_CRAM_MD5, null); assertEquals(bindOperation.getResultCode(), ResultCode.SASL_BIND_IN_PROGRESS); ByteString creds = ByteString.valueOf("dn:cn=Directory Manager malformeddigest"); bindOperation = conn.processSASLBind(DN.nullDN(), SASL_MECHANISM_CRAM_MD5, creds); assertFalse(bindOperation.getResultCode() == ResultCode.SUCCESS); }
/** * Tests the {@code getAuthorizationDN} and {@code setRawAuthorizationDN} methods. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testGetAndSetAuthorizationDN() throws Exception { ProxiedAuthV1Control proxyControl = new ProxiedAuthV1Control(DN.nullDN()); assertEquals(proxyControl.getRawAuthorizationDN(), ByteString.valueOf("")); assertEquals(proxyControl.getAuthorizationDN(), DN.nullDN()); proxyControl = new ProxiedAuthV1Control(DN.decode("uid=test,o=test")); assertEquals(proxyControl.getRawAuthorizationDN(), ByteString.valueOf("uid=test,o=test")); assertEquals(proxyControl.getAuthorizationDN(), DN.decode("uid=test,o=test")); }
/** * Tests the willMatchAfterBind method. * * @param isSecure Indicates if the client is using a secured connection. * @param criteria The security criteria. * @param expectedResult The expected result. * @throws Exception If an unexpected exception occurred. */ @Test(dataProvider = "testData") public void testWillMatchAfterBind( boolean isSecure, SecurityConnectionCriteria criteria, boolean expectedResult) throws Exception { ClientConnection client = new MockClientConnection(12345, false, DN.nullDN(), AllowedAuthMethod.ANONYMOUS); Assert.assertEquals( criteria.willMatchAfterBind(client, DN.nullDN(), AuthenticationType.SIMPLE, isSecure), expectedResult); }
/** * Verifies that the server will reject a CRAM-MD5 bind in which the first message contains SASL * credentials (which isn't allowed). * * @throws Exception If an unexpected problem occurs. */ @Test() public void testOutOfSequenceBind() throws Exception { InternalClientConnection conn = new InternalClientConnection(new AuthenticationInfo()); BindOperation bindOperation = conn.processSASLBind(DN.nullDN(), SASL_MECHANISM_CRAM_MD5, ByteString.valueOf("invalid")); assertFalse(bindOperation.getResultCode() == ResultCode.SUCCESS); }
/** * Tests the second constructor, which creates an instance of the control using a processed DN. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testConstructor2() throws Exception { // Try a DN of "null", which is not valid and will fail on the attempt to // create the control ProxiedAuthV1Control proxyControl; try { proxyControl = new ProxiedAuthV1Control((DN) null); throw new AssertionError( "Expected a failure when creating a proxied " + "auth V1 control with a null octet string."); } catch (Throwable t) { } // Try an empty DN, which is acceptable. proxyControl = new ProxiedAuthV1Control(DN.nullDN()); assertTrue(proxyControl.getOID().equals(OID_PROXIED_AUTH_V1)); assertTrue(proxyControl.isCritical()); assertTrue(proxyControl.getAuthorizationDN().isNullDN()); // Try a valid DN, which is acceptable. proxyControl = new ProxiedAuthV1Control(DN.decode("uid=test,o=test")); assertTrue(proxyControl.getOID().equals(OID_PROXIED_AUTH_V1)); assertTrue(proxyControl.isCritical()); assertEquals(proxyControl.getAuthorizationDN(), DN.decode("uid=test,o=test")); }
/** * Tests whether an Unauthenticated BIND request will be allowed with the default configuration * settings for "ds-cfg-reject-unauthenticated-requests". */ @Test() public void testUnauthBindDefCfg() { DirectoryServer.setRejectUnauthenticatedRequests(false); InternalClientConnection conn = new InternalClientConnection(new AuthenticationInfo()); BindOperation bindOperation = conn.processSimpleBind(DN.nullDN(), null); assertEquals(bindOperation.getResultCode(), ResultCode.SUCCESS); }
/** * Tests the matches method. * * @param isSecure Indicates if the client is using a secured connection. * @param criteria The security criteria. * @param expectedResult The expected result. * @throws Exception If an unexpected exception occurred. */ @Test(dataProvider = "testData") public void testMatches( boolean isSecure, SecurityConnectionCriteria criteria, boolean expectedResult) throws Exception { ClientConnection client = new MockClientConnection(12345, isSecure, DN.nullDN(), AllowedAuthMethod.ANONYMOUS); Assert.assertEquals(criteria.matches(client), expectedResult); }
/** * Process all global ACI attribute types found in the configuration entry and adds them to that * ACI list cache. It also logs messages about the number of ACI attribute types added to the * cache. This method is called once at startup. It also will put the server into lockdown mode if * needed. * * @param configuration The config handler containing the ACI configuration information. * @throws InitializationException If there is an error reading the global ACIs from the * configuration entry. */ private void processGlobalAcis(DseeCompatAccessControlHandlerCfg configuration) throws InitializationException { SortedSet<Aci> globalAcis = configuration.getGlobalACI(); try { if (globalAcis != null) { aciList.addAci(DN.nullDN(), globalAcis); Message message = INFO_ACI_ADD_LIST_GLOBAL_ACIS.get(Integer.toString(globalAcis.size())); logError(message); } } catch (Exception e) { if (debugEnabled()) { TRACER.debugCaught(DebugLogLevel.ERROR, e); } Message message = INFO_ACI_HANDLER_FAIL_PROCESS_GLOBAL_ACI.get(String.valueOf(configuration.dn())); throw new InitializationException(message, e); } }
/** * Tests whether authenticated and unauthenticated BIND requests will be allowed with the new * configuration settings for "ds-cfg-reject-unauthenticated-requests" . */ @Test public void testBindNewCfg() { try { DirectoryServer.setRejectUnauthenticatedRequests(true); InternalClientConnection conn = new InternalClientConnection(new AuthenticationInfo()); ByteString user = ByteString.valueOf("cn=Directory Manager"); ByteString password = ByteString.valueOf("password"); // Unauthenticated BIND request. BindOperation bindOperation = conn.processSimpleBind(DN.nullDN(), null); assertEquals(bindOperation.getResultCode(), ResultCode.SUCCESS); // Authenticated BIND request. bindOperation = conn.processSimpleBind(user, password); assertEquals(bindOperation.getResultCode(), ResultCode.SUCCESS); } finally { DirectoryServer.setRejectUnauthenticatedRequests(false); } }
/** * Checks to see if a LDAP modification is allowed access. * * @param container The structure containing the LDAP modifications * @param operation The operation to check modify privileges on. operation to check and the * evaluation context to apply the check against. * @param skipAccessCheck True if access checking should be skipped. * @return True if access is allowed. * @throws DirectoryException If a modified ACI could not be decoded. */ private boolean aciCheckMods( AciLDAPOperationContainer container, LocalBackendModifyOperation operation, boolean skipAccessCheck) throws DirectoryException { Entry resourceEntry = container.getResourceEntry(); DN dn = resourceEntry.getDN(); List<Modification> modifications = operation.getModifications(); for (Modification m : modifications) { Attribute modAttr = m.getAttribute(); AttributeType modAttrType = modAttr.getAttributeType(); if (modAttrType.equals(aciType)) { /* * Check that the operation has modify privileges if it contains * an "aci" attribute type. */ if (!operation.getClientConnection().hasPrivilege(Privilege.MODIFY_ACL, operation)) { Message message = INFO_ACI_MODIFY_FAILED_PRIVILEGE.get( String.valueOf(container.getResourceDN()), String.valueOf(container.getClientDN())); logError(message); return false; } } // This access check handles the case where all attributes of this // type are being replaced or deleted. If only a subset is being // deleted than this access check is skipped. ModificationType modType = m.getModificationType(); if (((modType == ModificationType.DELETE) && modAttr.isEmpty()) || ((modType == ModificationType.REPLACE) || (modType == ModificationType.INCREMENT))) { /* * Check if we have rights to delete all values of an attribute * type in the resource entry. */ if (resourceEntry.hasAttribute(modAttrType)) { container.setCurrentAttributeType(modAttrType); List<Attribute> attrList = resourceEntry.getAttribute(modAttrType, modAttr.getOptions()); if (attrList != null) { for (Attribute a : attrList) { for (AttributeValue v : a) { container.setCurrentAttributeValue(v); container.setRights(ACI_WRITE_DELETE); if (!skipAccessCheck && !accessAllowed(container)) { return false; } } } } } } if (!modAttr.isEmpty()) { for (AttributeValue v : modAttr) { container.setCurrentAttributeType(modAttrType); switch (m.getModificationType()) { case ADD: case REPLACE: container.setCurrentAttributeValue(v); container.setRights(ACI_WRITE_ADD); if (!skipAccessCheck && !accessAllowed(container)) { return false; } break; case DELETE: container.setCurrentAttributeValue(v); container.setRights(ACI_WRITE_DELETE); if (!skipAccessCheck && !accessAllowed(container)) { return false; } break; case INCREMENT: Entry modifiedEntry = operation.getModifiedEntry(); List<Attribute> modifiedAttrs = modifiedEntry.getAttribute(modAttrType, modAttr.getOptions()); if (modifiedAttrs != null) { for (Attribute attr : modifiedAttrs) { for (AttributeValue val : attr) { container.setCurrentAttributeValue(val); container.setRights(ACI_WRITE_ADD); if (!skipAccessCheck && !accessAllowed(container)) { return false; } } } } break; } /* * Check if the modification type has an "aci" attribute type. * If so, check the syntax of that attribute value. Fail the * the operation if the syntax check fails. */ if (modAttrType.equals(aciType) || modAttrType.equals(globalAciType)) { try { // A global ACI needs a NULL DN, not the DN of the // modification. if (modAttrType.equals(globalAciType)) { dn = DN.nullDN(); } Aci.decode(v.getValue(), dn); } catch (AciException ex) { Message message = WARN_ACI_MODIFY_FAILED_DECODE.get(String.valueOf(dn), ex.getMessage()); throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); } } } } } return true; }
private DN getDN(Entry e) { return e != null ? e.getDN() : DN.nullDN(); }
/** * Tests the change operation type is correct. * * @throws Exception If the test failed unexpectedly. */ @Test public void testChangeOperationType() throws Exception { DeleteChangeRecordEntry entry = new DeleteChangeRecordEntry(DN.nullDN()); Assert.assertEquals(entry.getChangeOperationType(), ChangeOperationType.DELETE); }
/** * Tests the constructor with empty DN. * * @throws Exception If the test failed unexpectedly. */ @Test public void testConstructorEmptyDN() throws Exception { DeleteChangeRecordEntry entry = new DeleteChangeRecordEntry(DN.nullDN()); Assert.assertEquals(entry.getDN(), DN.nullDN()); }
/** * Tests the {@code getValidatedAuthorizationDN} method for the null DN. * * @throws Exception If an unexpected problem occurs. */ @Test() public void testGetValidatedAuthorizationDNNullDN() throws Exception { ProxiedAuthV1Control proxyControl = new ProxiedAuthV1Control(DN.nullDN()); assertNull(proxyControl.getAuthorizationEntry()); }