/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * docs/licenses/cddl.txt * or http://www.opensource.org/licenses/cddl1.php. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * docs/licenses/cddl.txt. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2017-2018 Ping Identity Corporation */ package com.unboundid.directory.sdk.examples; import com.unboundid.directory.sdk.broker.api.PolicyAdvice; import com.unboundid.directory.sdk.broker.config.PolicyAdviceConfig; import com.unboundid.directory.sdk.broker.types.AdviceContext; import com.unboundid.directory.sdk.broker.types.BrokerContext; import com.unboundid.scim2.common.exceptions.ScimException; import com.unboundid.scim2.common.messages.ErrorResponse; import com.unboundid.util.args.ArgumentParser; import java.util.List; /** * Example of third-party Policy Advice. This example may be used on * any SCIM request. When a request is denied by policy, this advice * populates the SCIM error response with reason messages returned * by policy. */ public class ExamplePolicyAdvice extends PolicyAdvice { /** * The name of the argument that will be used to specify the * 'scimType' portion of a SCIM error response. */ private static final String ARG_SCIM_TYPE = "scimType"; /** * The name of the argument that will be used to specify the * 'detail' portion of a SCIM error response. */ private static final String ARG_DETAIL = "detail"; /** * Handle to the ServerContext object. */ private BrokerContext serverContext; /** * Creates a new instance of this policy advice. All policy * advice implementations must include a default constructor, * but any initialization should generally be performed in the * {@code initializePolicyAdvice} method. */ public ExamplePolicyAdvice() { } /** * Initialize this Policy Advice. This example does not have extension * arguments so there is no need to initialize the parser. * @param serverContext A handle to the server context for the server in * which this extension is running. * @param adviceCfg The general configuration for this policy advice. * @param parser The argument parser which has been initialized from * the configuration for this policy advice. * @throws Exception if an error occurs during initialization. */ @Override public void initializePolicyAdvice( final BrokerContext serverContext, final PolicyAdviceConfig adviceCfg, final ArgumentParser parser) throws Exception { super.initializePolicyAdvice(serverContext, adviceCfg, parser); } /** * Retrieves a human-readable name for this extension. * @return extension name */ @Override public String getExtensionName() { return "Example Policy Advice"; } /** * Retrieves a human-readable description of this extension. * @return text description string */ @Override public String[] getExtensionDescription() { return new String[] { "This Policy Advice implementation serves as an example that may" + " be used to demonstrate the process for creating a third-party" + " Policy Advice. It demonstrates how to retrieve argument " + " values that were computed during policy evaluation." }; } /** * This method is called when a SCIM request is denied by policy. * @param context AdviceContext containing any arguments passed * from policy. * @param defaultError the default error information that will be * returned if nothing is done by the advice * implementation. * @return the modified error info, as directed by policy. * @throws ScimException if an internal error occurs trying to generate * the advice. */ @Override public ErrorResponse onScimDeny( final AdviceContext context, final ErrorResponse defaultError) throws ScimException { ErrorResponse errorInfo = new ErrorResponse(defaultError.getStatus()); List<String> error = context.getArgumentValue(ARG_SCIM_TYPE); if (error.size() > 0) { errorInfo.setScimType(error.get(0)); } List<String> errorDescription = context.getArgumentValue(ARG_DETAIL); if (errorDescription.size() > 0) { errorInfo.setDetail(errorDescription.get(0)); } return errorInfo; } }