| | |
| | | import org.forgerock.opendj.ldap.DN; |
| | | import org.forgerock.opendj.ldap.LDAPClientContext; |
| | | import org.forgerock.opendj.ldap.LDAPClientContext.ConnectionEventListener; |
| | | import org.forgerock.opendj.ldap.LdapException; |
| | | import org.forgerock.opendj.ldap.ResultCode; |
| | | import org.forgerock.opendj.ldap.requests.UnbindRequest; |
| | | import org.forgerock.opendj.ldap.responses.CompareResult; |
| | |
| | | } |
| | | |
| | | private FlowableEmitter<Response> getAttachedEmitter(final Operation operation) { |
| | | return ((FlowableEmitter<Response>) operation.getAttachment(REACTIVE_OUT)); |
| | | return (FlowableEmitter<Response>) operation.getAttachment(REACTIVE_OUT); |
| | | } |
| | | |
| | | private Response toResponse(final SearchResultEntry searchEntry) { |
| | |
| | | */ |
| | | private boolean processAddRequest(final QueueingStrategy queueingStrategy, final LDAPMessage message, |
| | | final List<Control> controls, final FlowableEmitter<Response> out) { |
| | | if (ldapVersion == 2 && !controls.isEmpty()) { |
| | | // LDAPv2 clients aren't allowed to send controls. |
| | | out.onNext(Responses.newResult(ResultCode.PROTOCOL_ERROR) |
| | | .setDiagnosticMessage(ERR_LDAPV2_CONTROLS_NOT_ALLOWED.get().toString())); |
| | | out.onComplete(); |
| | | disconnectControlsNotAllowed(); |
| | | if (ldapV2HasControls(controls, out)) { |
| | | return false; |
| | | } |
| | | |
| | |
| | | logger.traceException(de); |
| | | |
| | | final Result result = Responses.newResult(de.getResultCode()); |
| | | if (de.getLocalizedMessage() != null) { |
| | | result.setDiagnosticMessage(de.getLocalizedMessage()); |
| | | } |
| | | if (de.getMatchedDN() != null) { |
| | | result.setMatchedDN(de.getMatchedDN().toString()); |
| | | } |
| | | if (de.getReferralURLs() != null) { |
| | | result.getReferralURIs().addAll(de.getReferralURLs()); |
| | | } |
| | | if (ldapVersion != 2 && addOp.getResponseControls() != null) { |
| | | for (Control control : addOp.getResponseControls()) { |
| | | result.addControl(Converters.from(control)); |
| | | } |
| | | } |
| | | |
| | | setDetails(result, de, addOp.getResponseControls()); |
| | | out.onNext(result); |
| | | out.onComplete(); |
| | | } |
| | |
| | | return connectionValid; |
| | | } |
| | | |
| | | private void disconnectControlsNotAllowed() { |
| | | disconnect(DisconnectReason.PROTOCOL_ERROR, false, ERR_LDAPV2_CONTROLS_NOT_ALLOWED.get()); |
| | | } |
| | | |
| | | /** |
| | | * Processes the provided LDAP message as a bind request. |
| | | * |
| | |
| | | logger.traceException(de); |
| | | |
| | | final Result result = Responses.newBindResult(de.getResultCode()); |
| | | if (de.getLocalizedMessage() != null) { |
| | | result.setDiagnosticMessage(de.getLocalizedMessage()); |
| | | } |
| | | if (de.getMatchedDN() != null) { |
| | | result.setMatchedDN(de.getMatchedDN().toString()); |
| | | } |
| | | if (de.getReferralURLs() != null) { |
| | | result.getReferralURIs().addAll(de.getReferralURLs()); |
| | | } |
| | | if (ldapVersion != 2 && bindOp.getResponseControls() != null) { |
| | | for (Control control : bindOp.getResponseControls()) { |
| | | result.addControl(Converters.from(control)); |
| | | } |
| | | } |
| | | setDetails(result, de, bindOp.getResponseControls()); |
| | | out.onNext(result); |
| | | out.onComplete(); |
| | | |
| | |
| | | logger.traceException(de); |
| | | |
| | | final CompareResult result = Responses.newCompareResult(de.getResultCode()); |
| | | if (de.getLocalizedMessage() != null) { |
| | | result.setDiagnosticMessage(de.getLocalizedMessage()); |
| | | } |
| | | if (de.getMatchedDN() != null) { |
| | | result.setMatchedDN(de.getMatchedDN().toString()); |
| | | } |
| | | if (de.getReferralURLs() != null) { |
| | | result.getReferralURIs().addAll(de.getReferralURLs()); |
| | | } |
| | | if (ldapVersion != 2 && compareOp.getResponseControls() != null) { |
| | | for (Control control : compareOp.getResponseControls()) { |
| | | result.addControl(Converters.from(control)); |
| | | } |
| | | } |
| | | setDetails(result, de, compareOp.getResponseControls()); |
| | | out.onNext(result); |
| | | out.onComplete(); |
| | | } |
| | |
| | | */ |
| | | private boolean processDeleteRequest(final QueueingStrategy queueingStrategy, final LDAPMessage message, |
| | | final List<Control> controls, final FlowableEmitter<Response> out) { |
| | | if (ldapVersion == 2 && !controls.isEmpty()) { |
| | | // LDAPv2 clients aren't allowed to send controls. |
| | | out.onNext(Responses.newResult(ResultCode.PROTOCOL_ERROR) |
| | | .setDiagnosticMessage(ERR_LDAPV2_CONTROLS_NOT_ALLOWED.get().toString())); |
| | | out.onComplete(); |
| | | disconnectControlsNotAllowed(); |
| | | if (ldapV2HasControls(controls, out)) { |
| | | return false; |
| | | } |
| | | |
| | |
| | | logger.traceException(de); |
| | | |
| | | final Result result = Responses.newResult(de.getResultCode()); |
| | | if (de.getLocalizedMessage() != null) { |
| | | result.setDiagnosticMessage(de.getLocalizedMessage()); |
| | | } |
| | | if (de.getMatchedDN() != null) { |
| | | result.setMatchedDN(de.getMatchedDN().toString()); |
| | | } |
| | | if (de.getReferralURLs() != null) { |
| | | result.getReferralURIs().addAll(de.getReferralURLs()); |
| | | } |
| | | if (ldapVersion != 2 && deleteOp.getResponseControls() != null) { |
| | | for (Control control : deleteOp.getResponseControls()) { |
| | | result.addControl(Converters.from(control)); |
| | | } |
| | | } |
| | | |
| | | setDetails(result, de, deleteOp.getResponseControls()); |
| | | out.onNext(result); |
| | | out.onComplete(); |
| | | } |
| | |
| | | } catch (DirectoryException de) { |
| | | logger.traceException(de); |
| | | final Result result = Responses.newGenericExtendedResult(de.getResultCode()); |
| | | if (de.getLocalizedMessage() != null) { |
| | | result.setDiagnosticMessage(de.getLocalizedMessage()); |
| | | } |
| | | if (de.getMatchedDN() != null) { |
| | | result.setMatchedDN(de.getMatchedDN().toString()); |
| | | } |
| | | if (de.getReferralURLs() != null) { |
| | | result.getReferralURIs().addAll(de.getReferralURLs()); |
| | | } |
| | | if (ldapVersion != 2 && extendedOp.getResponseControls() != null) { |
| | | for (Control control : extendedOp.getResponseControls()) { |
| | | result.addControl(Converters.from(control)); |
| | | } |
| | | } |
| | | setDetails(result, de, extendedOp.getResponseControls()); |
| | | out.onNext(result); |
| | | out.onComplete(); |
| | | } |
| | |
| | | */ |
| | | private boolean processModifyRequest(final QueueingStrategy queueingStrategy, final LDAPMessage message, |
| | | final List<Control> controls, final FlowableEmitter<Response> out) { |
| | | if (ldapVersion == 2 && !controls.isEmpty()) { |
| | | // LDAPv2 clients aren't allowed to send controls. |
| | | out.onNext(Responses.newResult(ResultCode.PROTOCOL_ERROR) |
| | | .setDiagnosticMessage(ERR_LDAPV2_CONTROLS_NOT_ALLOWED.get().toString())); |
| | | out.onComplete(); |
| | | disconnectControlsNotAllowed(); |
| | | if (ldapV2HasControls(controls, out)) { |
| | | return false; |
| | | } |
| | | |
| | |
| | | } catch (DirectoryException de) { |
| | | logger.traceException(de); |
| | | final Result result = Responses.newResult(de.getResultCode()); |
| | | if (de.getLocalizedMessage() != null) { |
| | | result.setDiagnosticMessage(de.getLocalizedMessage()); |
| | | } |
| | | if (de.getMatchedDN() != null) { |
| | | result.setMatchedDN(de.getMatchedDN().toString()); |
| | | } |
| | | if (de.getReferralURLs() != null) { |
| | | result.getReferralURIs().addAll(de.getReferralURLs()); |
| | | } |
| | | if (ldapVersion != 2 && modifyOp.getResponseControls() != null) { |
| | | for (Control control : modifyOp.getResponseControls()) { |
| | | result.addControl(Converters.from(control)); |
| | | } |
| | | } |
| | | setDetails(result, de, modifyOp.getResponseControls()); |
| | | out.onNext(result); |
| | | out.onComplete(); |
| | | } |
| | |
| | | */ |
| | | private boolean processModifyDNRequest(final QueueingStrategy queueingStrategy, final LDAPMessage message, |
| | | final List<Control> controls, final FlowableEmitter<Response> out) { |
| | | if (ldapVersion == 2 && !controls.isEmpty()) { |
| | | // LDAPv2 clients aren't allowed to send controls. |
| | | out.onNext(Responses.newResult(ResultCode.PROTOCOL_ERROR) |
| | | .setDiagnosticMessage(ERR_LDAPV2_CONTROLS_NOT_ALLOWED.get().toString())); |
| | | out.onComplete(); |
| | | disconnectControlsNotAllowed(); |
| | | if (ldapV2HasControls(controls, out)) { |
| | | return false; |
| | | } |
| | | |
| | |
| | | logger.traceException(de); |
| | | |
| | | final Result result = Responses.newResult(de.getResultCode()); |
| | | if (de.getLocalizedMessage() != null) { |
| | | result.setDiagnosticMessage(de.getLocalizedMessage()); |
| | | } |
| | | if (de.getMatchedDN() != null) { |
| | | result.setMatchedDN(de.getMatchedDN().toString()); |
| | | } |
| | | if (de.getReferralURLs() != null) { |
| | | result.getReferralURIs().addAll(de.getReferralURLs()); |
| | | } |
| | | if (ldapVersion != 2 && modifyDNOp.getResponseControls() != null) { |
| | | for (Control control : modifyDNOp.getResponseControls()) { |
| | | result.addControl(Converters.from(control)); |
| | | } |
| | | } |
| | | setDetails(result, de, modifyDNOp.getResponseControls()); |
| | | out.onNext(result); |
| | | out.onComplete(); |
| | | } |
| | |
| | | */ |
| | | private boolean processSearchRequest(final QueueingStrategy queueingStrategy, final LDAPMessage message, |
| | | final List<Control> controls, final FlowableEmitter<Response> out) { |
| | | if (ldapVersion == 2 && !controls.isEmpty()) { |
| | | // LDAPv2 clients aren't allowed to send controls. |
| | | out.onNext(Responses.newResult(ResultCode.PROTOCOL_ERROR) |
| | | .setDiagnosticMessage(ERR_LDAPV2_CONTROLS_NOT_ALLOWED.get().toString())); |
| | | out.onComplete(); |
| | | disconnectControlsNotAllowed(); |
| | | if (ldapV2HasControls(controls, out)) { |
| | | return false; |
| | | } |
| | | |
| | |
| | | logger.traceException(de); |
| | | |
| | | final Result result = Responses.newResult(de.getResultCode()); |
| | | if (de.getMessage() != null) { |
| | | result.setDiagnosticMessage(de.getMessage()); |
| | | } |
| | | if (de.getMatchedDN() != null) { |
| | | result.setMatchedDN(de.getMatchedDN().toString()); |
| | | } |
| | | if (de.getReferralURLs() != null) { |
| | | result.getReferralURIs().addAll(de.getReferralURLs()); |
| | | } |
| | | if (ldapVersion != 2 && searchOp.getResponseControls() != null) { |
| | | for (Control control : searchOp.getResponseControls()) { |
| | | result.addControl(Converters.from(control)); |
| | | } |
| | | } |
| | | setDetails(result, de, searchOp.getResponseControls()); |
| | | out.onNext(result); |
| | | out.onComplete(); |
| | | } |
| | |
| | | return connectionValid; |
| | | } |
| | | |
| | | private void setDetails(Result result, DirectoryException de, List<Control> responseControls) { |
| | | if (de.getLocalizedMessage() != null) { |
| | | result.setDiagnosticMessage(de.getLocalizedMessage()); |
| | | } |
| | | if (de.getMatchedDN() != null) { |
| | | result.setMatchedDN(de.getMatchedDN().toString()); |
| | | } |
| | | if (de.getReferralURLs() != null) { |
| | | result.getReferralURIs().addAll(de.getReferralURLs()); |
| | | } |
| | | if (ldapVersion != 2 && responseControls != null) { |
| | | for (Control control : responseControls) { |
| | | result.addControl(Converters.from(control)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** LDAPv2 clients aren't allowed to send controls. */ |
| | | private boolean ldapV2HasControls(final List<Control> controls, final FlowableEmitter<Response> out) { |
| | | if (ldapVersion == 2 && !controls.isEmpty()) { |
| | | out.onNext(Responses.newResult(ResultCode.PROTOCOL_ERROR) |
| | | .setDiagnosticMessage(ERR_LDAPV2_CONTROLS_NOT_ALLOWED.get().toString())); |
| | | out.onComplete(); |
| | | disconnectControlsNotAllowed(); |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private void disconnectControlsNotAllowed() { |
| | | disconnect(DisconnectReason.PROTOCOL_ERROR, false, ERR_LDAPV2_CONTROLS_NOT_ALLOWED.get()); |
| | | } |
| | | |
| | | /** |
| | | * Processes the provided LDAP message as an unbind request. |
| | | * |
| | |
| | | return clientContext.getSecurityStrengthFactor(); |
| | | } |
| | | |
| | | /** Upstream -> BlockingBackpressureSubscription -> Downstream */ |
| | | /** Upstream -> BlockingBackpressureSubscription -> Downstream. */ |
| | | private final class BlockingBackpressureSubscription |
| | | implements Subscription, Publisher<Response>, Subscriber<Response> { |
| | | private long pendingRequests; |