Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lock Endpoint Scaffolding #8672

Merged
merged 2 commits into from
Jun 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{
"baseEndpoint" : "https://%(hostname)s/jans-lock/v1",

"tokenChannels":[
"jans_token"
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@
public class AppConfiguration implements Configuration {

private String baseDN;

@DocProperty(description = "Lock base endpoint URL")
private String baseEndpoint;

@DocProperty(description = "List of token channel names", defaultValue = "jans_token")
private List<String> tokenChannels;


@DocProperty(description = "Choose whether to disable JDK loggers", defaultValue = "true")
private Boolean disableJdkLogger = true;

Expand Down Expand Up @@ -82,6 +84,14 @@ public void setBaseDN(String baseDN) {
this.baseDN = baseDN;
}

public String getBaseEndpoint() {
return baseEndpoint;
}

public void setBaseEndpoint(String baseEndpoint) {
this.baseEndpoint = baseEndpoint;
}

public List<String> getTokenChannels() {
if (tokenChannels == null) {
tokenChannels = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
*
* Copyright (c) 2024, Janssen Project
*/

package io.jans.lock.service.util;

import java.util.HashSet;
import java.util.Set;

import io.jans.lock.service.ws.rs.ConfigurationRestWebService;
import io.jans.lock.service.ws.rs.audit.AuditRestWebServiceImpl;
import io.jans.lock.service.ws.rs.sse.SseRestWebServiceImpl;
import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;


/**
* Integration with Resteasy
*
* @author Yuriy Movchan Date: 06/06/2024
*/
@ApplicationPath("/v1")
public class ResteasyInitializer extends Application {

@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> classes = new HashSet<Class<?>>();
classes.add(AuditRestWebServiceImpl.class);
classes.add(ConfigurationRestWebService.class);
classes.add(SseRestWebServiceImpl.class);

return classes;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please align with this format: https://www.apache.org/licenses/LICENSE-2.0#apply

*
* Copyright (c) 2024, Janssen Project
*/

package io.jans.lock.service.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.ws.rs.core.CacheControl;

/**
* @author Yuriy Zabrovarnyy
* @author Yuriy Movchan
* @version 0.9, 26/12/2012
*/

public class ServerUtil {

private static final Logger log = LoggerFactory.getLogger(ServerUtil.class);

public static final String PRAGMA = "Pragma";
public static final String NO_CACHE = "no-cache";

public static CacheControl cacheControl(boolean noStore) {
final CacheControl cacheControl = new CacheControl();
cacheControl.setNoStore(noStore);
return cacheControl;
}

public static CacheControl cacheControl(boolean noStore, boolean noTransform) {
final CacheControl cacheControl = new CacheControl();
cacheControl.setNoStore(noStore);
cacheControl.setNoTransform(noTransform);
return cacheControl;
}

public static CacheControl cacheControlWithNoStoreTransformAndPrivate() {
final CacheControl cacheControl = cacheControl(true, false);
cacheControl.setPrivate(true);
return cacheControl;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
*
* Copyright (c) 2024, Janssen Project
*/

package io.jans.lock.service.ws.rs;

import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.ResponseBuilder;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import io.jans.lock.model.config.AppConfiguration;
import io.jans.service.net.NetworkService;

/**
* Lock metadata configuration
*
* @author Yuriy Movchan Date: 12/19/2018
*/
@ApplicationScoped
@Path("/configuration")
public class ConfigurationRestWebService {

@Inject
private AppConfiguration appConfiguration;

@Inject
private NetworkService networkService;

private ObjectMapper objectMapper;

@PostConstruct
public void init() {
this.objectMapper = new ObjectMapper();
}

@GET
@Produces({ "application/json" })
public Response getConfiguration() {
final String baseEndpointUri = appConfiguration.getBaseEndpoint();
ObjectNode response = objectMapper.createObjectNode();

response.put("version", "1.0");
response.put("issuer", networkService.getHost(baseEndpointUri));

ObjectNode audit = objectMapper.createObjectNode();
response.set("audit", audit);
audit.put("health_endpoint", baseEndpointUri + "/audit/health");
audit.put("log_endpoint", baseEndpointUri + "/audit/log");
audit.put("telemetry_endpoint", baseEndpointUri + "/audit/telemetry");

ObjectNode config = objectMapper.createObjectNode();
response.set("config", config);
config.put("config_endpoint", baseEndpointUri + "/config");
config.put("issuers_endpoint", baseEndpointUri + "/config/issuers");
config.put("policy_endpoint", baseEndpointUri + "/config/policy");
config.put("schema_endpoint", baseEndpointUri + "/config/schema");

config.put("sse_endpoint", baseEndpointUri + "/sse");

ResponseBuilder builder = Response.ok().entity(response.toString());
return builder.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
*
* Copyright (c) 2024, Janssen Project
*/

package io.jans.lock.service.ws.rs.audit;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;

/**
* Provides interface for audit REST web services
*
* @author Yuriy Movchan Date: 05/24/2024
*/
public interface AuditRestWebService {

@POST
@Path("/audit/health")
@Produces({ MediaType.APPLICATION_JSON })
Response processHealthRequest(@Context HttpServletRequest request, @Context HttpServletResponse response, @Context SecurityContext sec);

@POST
@Path("/audit//log")
@Produces({ MediaType.APPLICATION_JSON })
Response processLogRequest(@Context HttpServletRequest request, @Context HttpServletResponse response, @Context SecurityContext sec);

@POST
@Path("/audit//telemetry")
@Produces({ MediaType.APPLICATION_JSON })
Response processTelemetryRequest(@Context HttpServletRequest request, @Context HttpServletResponse response,
@Context SecurityContext sec);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
*
* Copyright (c) 2024, Janssen Project
*/

package io.jans.lock.service.ws.rs.audit;

import org.slf4j.Logger;

import io.jans.lock.service.util.ServerUtil;
import jakarta.inject.Inject;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;

/**
* Provides interface for audit REST web services
*
* @author Yuriy Movchan Date: 06/06/2024
*/
public class AuditRestWebServiceImpl implements AuditRestWebService {

@Inject
private Logger log;

@Override
public Response processHealthRequest(HttpServletRequest request, HttpServletResponse response, SecurityContext sec) {
log.debug("Processing Health request");
Response.ResponseBuilder builder = Response.ok();

builder.cacheControl(ServerUtil.cacheControlWithNoStoreTransformAndPrivate());
builder.header(ServerUtil.PRAGMA, ServerUtil.NO_CACHE);
builder.entity("{\"res\" : \"ok\"}");

return builder.build();
}

@Override
public Response processLogRequest(HttpServletRequest request, HttpServletResponse response, SecurityContext sec) {
log.debug("Processing Log request");
Response.ResponseBuilder builder = Response.ok();

builder.cacheControl(ServerUtil.cacheControlWithNoStoreTransformAndPrivate());
builder.header(ServerUtil.PRAGMA, ServerUtil.NO_CACHE);
builder.entity("{\"res\" : \"ok\"}");

return builder.build();
}

@Override
public Response processTelemetryRequest(HttpServletRequest request, HttpServletResponse response, SecurityContext sec) {
log.debug("Processing Telemetry request");
Response.ResponseBuilder builder = Response.ok();

builder.cacheControl(ServerUtil.cacheControlWithNoStoreTransformAndPrivate());
builder.header(ServerUtil.PRAGMA, ServerUtil.NO_CACHE);
builder.entity("{\"res\" : \"ok\"}");

return builder.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
*
* Copyright (c) 2024, Janssen Project
*/

package io.jans.lock.service.ws.rs.config;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;

/**
* Provides interface for configuration REST web services
*
* @author Yuriy Movchan Date: 06/06/2024
*/
public interface ConfigRestWebService {

@GET
@Path("/config")
@Produces({ MediaType.APPLICATION_JSON })
Response processConfigRequest(@Context HttpServletRequest request, @Context HttpServletResponse response, @Context SecurityContext sec);

@GET
@Path("/config/issuers")
@Produces({ MediaType.APPLICATION_JSON })
Response processIssuersRequest(@Context HttpServletRequest request, @Context HttpServletResponse response,
@Context SecurityContext sec);

@GET
@Path("/config/policy")
@Produces({ MediaType.APPLICATION_JSON })
Response processPolicyRequest(@Context HttpServletRequest request, @Context HttpServletResponse response, @Context SecurityContext sec);

@GET
@Path("​/config​/schema")
@Produces({ MediaType.APPLICATION_JSON })
Response processSchemaRequest(@Context HttpServletRequest request, @Context HttpServletResponse response, @Context SecurityContext sec);

}
Loading