Skip to content

Commit

Permalink
feat(jans-lock): added audit, config and metadata endpoints
Browse files Browse the repository at this point in the history
* feat(jans-lock): new lock endpoints

Signed-off-by: Yuriy Movchan <Yuriy.Movchan@gmail.com>

* feat(jans-lock): add autit, config and metadata endpoints

Signed-off-by: Yuriy Movchan <Yuriy.Movchan@gmail.com>

---------

Signed-off-by: Yuriy Movchan <Yuriy.Movchan@gmail.com>
  • Loading branch information
yurem committed Jun 7, 2024
1 parent 0ecff96 commit 7c6fec4
Show file tree
Hide file tree
Showing 12 changed files with 516 additions and 1 deletion.
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.
*
* 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

0 comments on commit 7c6fec4

Please sign in to comment.