// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/NoPrivateKeyException.java
// public class NoPrivateKeyException extends RuntimeException {
// 
//     private static final long serialVersionUID = 2712920621905135028L;
// 
//     public NoPrivateKeyException() {
//         super();
//     }
// 
// 
//     public NoPrivateKeyException(String message) {
//         super(message);
//     }
// 
// 
//     public NoPrivateKeyException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// 
//     public NoPrivateKeyException(Throwable cause) {
//         super(cause);
//     }
// }
// 
// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/config/Configuration.java
// public interface Configuration {
// 
//     String getGSuiteDomain();
// 
// 
//     String getGSuiteImplicitGroup();
// 
// 
//     boolean isSetGSuiteImplicitGroup();
// 
// 
//     String getServiceAccountEmail();
// 
// 
//     String getServiceAccountSubject();
// 
// 
//     Set<String> getServiceAccountScopes();
// 
// 
//     PrivateKey readServiceAccountKey() throws NoPrivateKeyException;
// 
// 
//     void setServiceAccount(String clientEmail, String privateKey, String subject, String tokenUri);
// 
// 
//     void resetServiceAccount();
// 
// 
//     String getServiceAccountTokenUri();
// 
// 
//     long getServiceAccountTokenLifetime();
// 
// 
//     String getPushServiceHostname();
// 
// 
//     void setPushServiceHostname(String hostname);
// 
// 
//     File getPushChannelFile();
// 
// 
//     boolean isPushEnabled();
// 
// 
//     void setPushEnabled(boolean value);
// 
// 
//     Duration getPushRefreshInterval();
// }
// 
// Path: services/facade/src/main/java/eu/hlavki/identity/services/rest/model/ServerError.java
// @XmlRootElement
// public class ServerError {
// 
//     String code;
//     String message;
// 
// 
//     public ServerError() {
//     }
// 
// 
//     public ServerError(String code, String message) {
//         this.code = code;
//         this.message = message;
//     }
// 
// 
//     public String getCode() {
//         return code;
//     }
// 
// 
//     public void setCode(String code) {
//         this.code = code;
//     }
// 
// 
//     public String getMessage() {
//         return message;
//     }
// 
// 
//     public void setMessage(String message) {
//         this.message = message;
//     }
// 
// 
//     public final static ResponseBuilder toResponse(String code, Throwable t) {
//         return Response.ok(new ServerError(code, t.getMessage())).status(Response.Status.INTERNAL_SERVER_ERROR);
//     }
// 
// 
//     public final static ServerErrorException serverError(Response.Status status, String code, Throwable t) {
//         String message = t != null ? t.getMessage() : null;
//         return serverError(status, code, message, t);
//     }
// 
// 
//     public final static ServerErrorException serverError(Response.Status status, String code, String message) {
//         return serverError(status, code, message, null);
//     }
// 
// 
//     public final static ServerErrorException serverError(Response.Status status, String code, String message, Throwable t) {
//         return new ServerErrorException(Response.status(status)
//                 .type(MediaType.APPLICATION_JSON)
//                 .entity(new ServerError(code, message)).build(), t);
//     }
// }


import eu.hlavki.identity.services.google.NoPrivateKeyException;
import eu.hlavki.identity.services.google.config.Configuration;
import eu.hlavki.identity.services.rest.model.ServerError;
import java.io.IOException;
import javax.annotation.Priority;
import javax.ws.rs.Priorities;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.cxf.rs.security.oidc.common.IdToken;
import org.apache.cxf.rs.security.oidc.rp.OidcClientTokenContext;
import org.apache.cxf.rs.security.oidc.rp.OidcSecurityContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
package eu.hlavki.identity.services.rest.security;


@Priority(Priorities.AUTHORIZATION)
public class SetupAuthorizationFilter implements ContainerRequestFilter {

    private static final Logger log = LoggerFactory.getLogger(SetupAuthorizationFilter.class);
    private final Configuration googleConfig;


    public SetupAuthorizationFilter(Configuration googleConfig) {
        this.googleConfig = googleConfig;
    }


    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        OidcSecurityContext secCtx = (OidcSecurityContext) requestContext.getSecurityContext();
        OidcClientTokenContext tokenCtx = secCtx.getOidcContext();
        IdToken idToken = tokenCtx.getIdToken();
        String email = idToken.getEmail();
        boolean configured = false;
        try {
            configured = googleConfig.getServiceAccountEmail() != null && googleConfig.readServiceAccountKey() != null;
// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/NoPrivateKeyException.java
// public class NoPrivateKeyException extends RuntimeException {
// 
//     private static final long serialVersionUID = 2712920621905135028L;
// 
//     public NoPrivateKeyException() {
//         super();
//     }
// 
// 
//     public NoPrivateKeyException(String message) {
//         super(message);
//     }
// 
// 
//     public NoPrivateKeyException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// 
//     public NoPrivateKeyException(Throwable cause) {
//         super(cause);
//     }
// }
// 
// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/config/Configuration.java
// public interface Configuration {
// 
//     String getGSuiteDomain();
// 
// 
//     String getGSuiteImplicitGroup();
// 
// 
//     boolean isSetGSuiteImplicitGroup();
// 
// 
//     String getServiceAccountEmail();
// 
// 
//     String getServiceAccountSubject();
// 
// 
//     Set<String> getServiceAccountScopes();
// 
// 
//     PrivateKey readServiceAccountKey() throws NoPrivateKeyException;
// 
// 
//     void setServiceAccount(String clientEmail, String privateKey, String subject, String tokenUri);
// 
// 
//     void resetServiceAccount();
// 
// 
//     String getServiceAccountTokenUri();
// 
// 
//     long getServiceAccountTokenLifetime();
// 
// 
//     String getPushServiceHostname();
// 
// 
//     void setPushServiceHostname(String hostname);
// 
// 
//     File getPushChannelFile();
// 
// 
//     boolean isPushEnabled();
// 
// 
//     void setPushEnabled(boolean value);
// 
// 
//     Duration getPushRefreshInterval();
// }
// 
// Path: services/facade/src/main/java/eu/hlavki/identity/services/rest/model/ServerError.java
// @XmlRootElement
// public class ServerError {
// 
//     String code;
//     String message;
// 
// 
//     public ServerError() {
//     }
// 
// 
//     public ServerError(String code, String message) {
//         this.code = code;
//         this.message = message;
//     }
// 
// 
//     public String getCode() {
//         return code;
//     }
// 
// 
//     public void setCode(String code) {
//         this.code = code;
//     }
// 
// 
//     public String getMessage() {
//         return message;
//     }
// 
// 
//     public void setMessage(String message) {
//         this.message = message;
//     }
// 
// 
//     public final static ResponseBuilder toResponse(String code, Throwable t) {
//         return Response.ok(new ServerError(code, t.getMessage())).status(Response.Status.INTERNAL_SERVER_ERROR);
//     }
// 
// 
//     public final static ServerErrorException serverError(Response.Status status, String code, Throwable t) {
//         String message = t != null ? t.getMessage() : null;
//         return serverError(status, code, message, t);
//     }
// 
// 
//     public final static ServerErrorException serverError(Response.Status status, String code, String message) {
//         return serverError(status, code, message, null);
//     }
// 
// 
//     public final static ServerErrorException serverError(Response.Status status, String code, String message, Throwable t) {
//         return new ServerErrorException(Response.status(status)
//                 .type(MediaType.APPLICATION_JSON)
//                 .entity(new ServerError(code, message)).build(), t);
//     }
// }


// Path: services/facade/src/main/java/eu/hlavki/identity/services/rest/security/SetupAuthorizationFilter.java
import eu.hlavki.identity.services.google.NoPrivateKeyException;
import eu.hlavki.identity.services.google.config.Configuration;
import eu.hlavki.identity.services.rest.model.ServerError;
import java.io.IOException;
import javax.annotation.Priority;
import javax.ws.rs.Priorities;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.cxf.rs.security.oidc.common.IdToken;
import org.apache.cxf.rs.security.oidc.rp.OidcClientTokenContext;
import org.apache.cxf.rs.security.oidc.rp.OidcSecurityContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

package eu.hlavki.identity.services.rest.security;


@Priority(Priorities.AUTHORIZATION)
public class SetupAuthorizationFilter implements ContainerRequestFilter {

    private static final Logger log = LoggerFactory.getLogger(SetupAuthorizationFilter.class);
    private final Configuration googleConfig;


    public SetupAuthorizationFilter(Configuration googleConfig) {
        this.googleConfig = googleConfig;
    }


    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        OidcSecurityContext secCtx = (OidcSecurityContext) requestContext.getSecurityContext();
        OidcClientTokenContext tokenCtx = secCtx.getOidcContext();
        IdToken idToken = tokenCtx.getIdToken();
        String email = idToken.getEmail();
        boolean configured = false;
        try {
            configured = googleConfig.getServiceAccountEmail() != null && googleConfig.readServiceAccountKey() != null;
        } catch (NoPrivateKeyException e) {