/*
* The contents of this file are subject to the terms of the Common Development and
* Distribution License (the License). You may not use this file except in compliance with the
* License.
*
* You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
* specific language governing permission and limitations under the License.
*
* When distributing Covered Software, include this CDDL Header Notice in each file and include
* the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
* Header, with the fields enclosed by brackets [] replaced by your own identifying
* information: "Portions copyright [year] [name of copyright owner]".
*
* Copyright 2015 ForgeRock AS.
*/
package org.forgerock.openidm.selfservice.impl;
import static org.forgerock.json.resource.ResourcePath.resourcePath;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.ConfigurationPolicy;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.forgerock.json.JsonPointer;
import org.forgerock.json.resource.ActionRequest;
import org.forgerock.json.resource.ActionResponse;
import org.forgerock.json.resource.CollectionResourceProvider;
import org.forgerock.json.resource.Connection;
import org.forgerock.json.resource.ConnectionFactory;
import org.forgerock.json.resource.CreateRequest;
import org.forgerock.json.resource.DeleteRequest;
import org.forgerock.json.resource.PatchRequest;
import org.forgerock.json.resource.QueryRequest;
import org.forgerock.json.resource.QueryResourceHandler;
import org.forgerock.json.resource.QueryResponse;
import org.forgerock.json.resource.ReadRequest;
import org.forgerock.json.resource.ResourceException;
import org.forgerock.json.resource.ResourceResponse;
import org.forgerock.json.resource.UpdateRequest;
import org.forgerock.openidm.router.IDMConnectionFactory;
import org.forgerock.services.context.Context;
import org.forgerock.util.promise.Promise;
import org.osgi.service.component.ComponentContext;
/**
* This service supports self-service updates of user details; namely, KBA answers.
*/
@Component(name = UserUpdateService.PID, immediate = true, policy = ConfigurationPolicy.IGNORE)
@Service
@Properties({
@Property(name = "service.description", value = "OpenIDM SelfService User-Update"),
@Property(name = "service.vendor", value = "ForgeRock AS"),
@Property(name = "openidm.router.prefix", value = UserUpdateService.ROUTER_PATH)
})
public class UserUpdateService implements CollectionResourceProvider {
static final String PID = "org.forgerock.openidm.selfservice.userupdate";
static final String ROUTER_PATH = SelfService.ROUTER_PREFIX + "/user";
/** The Connection Factory */
@Reference(policy = ReferencePolicy.STATIC)
protected IDMConnectionFactory connectionFactory;
/** The KBA Configuration. */
@Reference(policy = ReferencePolicy.STATIC)
private KbaConfiguration kbaConfiguration;
private org.forgerock.selfservice.core.UserUpdateService userUpdateService;
@Activate
void activate(ComponentContext context) throws Exception {
userUpdateService = new org.forgerock.selfservice.core.UserUpdateService(
/* Provide the Self-Service UserUpdateService with a ConnectionFactory that appears as "external".
* This is necessary because we want external user-kba patch requests that originate here to be fed to
* the decorated org.forgerock.selfservice.core.UserUpdateService and subsequently to managed/user to
* be handled the same as if they had been made against managed/user directly.
*/
new ConnectionFactory() {
@Override
public void close() {
connectionFactory.close();
}
@Override
public Connection getConnection() throws ResourceException {
return connectionFactory.getExternalConnection();
}
@Override
public Promise<Connection, ResourceException> getConnectionAsync() {
return connectionFactory.getExternalConnectionAsync();
}
},
resourcePath("managed/user"),
new JsonPointer(kbaConfiguration.getConfig().get("kbaPropertyName").asString()));
}
@Deactivate
void deactivate(ComponentContext compContext) {
userUpdateService = null;
}
@Override
public Promise<ActionResponse, ResourceException> actionCollection(Context context, ActionRequest request) {
return userUpdateService.actionCollection(context, request);
}
@Override
public Promise<ActionResponse, ResourceException> actionInstance(Context context, String resourceId, ActionRequest request) {
return userUpdateService.actionInstance(context, resourceId, request);
}
@Override
public Promise<ResourceResponse, ResourceException> createInstance(Context context, CreateRequest request) {
return userUpdateService.createInstance(context, request);
}
@Override
public Promise<ResourceResponse, ResourceException> deleteInstance(Context context, String resourceId, DeleteRequest request) {
return userUpdateService.deleteInstance(context, resourceId, request);
}
@Override
public Promise<ResourceResponse, ResourceException> patchInstance(Context context, String resourceId, PatchRequest request) {
return userUpdateService.patchInstance(context, resourceId, request);
}
@Override
public Promise<QueryResponse, ResourceException> queryCollection(Context context, QueryRequest request, QueryResourceHandler handler) {
return userUpdateService.queryCollection(context, request, handler);
}
@Override
public Promise<ResourceResponse, ResourceException> readInstance(Context context, String resourceId, ReadRequest request) {
return userUpdateService.readInstance(context, resourceId, request);
}
@Override
public Promise<ResourceResponse, ResourceException> updateInstance(Context context, String resourceId, UpdateRequest request) {
return userUpdateService.updateInstance(context, resourceId, request);
}
}