commit
077086621b
24
.github/workflows/deploy.yml
vendored
24
.github/workflows/deploy.yml
vendored
@ -16,6 +16,16 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Clear directory
|
||||||
|
uses: appleboy/ssh-action@v1.0.0
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.SSH_USER }}
|
||||||
|
port: ${{ secrets.SSH_PORT }}
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
script: |
|
||||||
|
rm -rf ${{ secrets.TARGET_DIR }}/ffsaf/src/*
|
||||||
|
|
||||||
- name: Copy repository contents to vps via scp
|
- name: Copy repository contents to vps via scp
|
||||||
uses: appleboy/scp-action@v0.1.4 # Latest in date when creating the workflow
|
uses: appleboy/scp-action@v0.1.4 # Latest in date when creating the workflow
|
||||||
with:
|
with:
|
||||||
@ -26,6 +36,20 @@ jobs:
|
|||||||
source: "."
|
source: "."
|
||||||
target: ${{ secrets.TARGET_DIR }}/ffsaf # Need to create it first on the VPS
|
target: ${{ secrets.TARGET_DIR }}/ffsaf # Need to create it first on the VPS
|
||||||
|
|
||||||
|
- name: Build site and copy it
|
||||||
|
uses: appleboy/ssh-action@v1.0.0
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.SSH_USER }}
|
||||||
|
port: ${{ secrets.SSH_PORT }}
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
script: |
|
||||||
|
cd ${{ secrets.TARGET_DIR }}/ffsaf/src/main/webapp
|
||||||
|
cp ${{ secrets.TARGET_DIR }}/vite.env .env
|
||||||
|
npm run build
|
||||||
|
rm -rf ${{ secrets.TARGET_DIR }}/ffsaf/src/main/resources/META-INF/resources
|
||||||
|
mv dist ${{ secrets.TARGET_DIR }}/ffsaf/src/main/resources/META-INF/resources
|
||||||
|
|
||||||
- name: Build application
|
- name: Build application
|
||||||
uses: appleboy/ssh-action@v1.0.0
|
uses: appleboy/ssh-action@v1.0.0
|
||||||
with:
|
with:
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -45,3 +45,5 @@ nb-configuration.xml
|
|||||||
# Custom
|
# Custom
|
||||||
/config/application.properties
|
/config/application.properties
|
||||||
/cle_prive.jks
|
/cle_prive.jks
|
||||||
|
/src/main/resources/META-INF/resources/
|
||||||
|
/media/
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@ -96,7 +96,7 @@
|
|||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.quarkiverse.quinoa</groupId>
|
<groupId>io.quarkiverse.quinoa</groupId>
|
||||||
<artifactId>quarkus-quinoa-deployment</artifactId>
|
<artifactId>quarkus-quinoa</artifactId>
|
||||||
<version>2.3.2</version>
|
<version>2.3.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|||||||
@ -0,0 +1,75 @@
|
|||||||
|
package fr.titionfire.ffsaf;
|
||||||
|
|
||||||
|
import io.vertx.core.http.HttpServerRequest;
|
||||||
|
import jakarta.annotation.Priority;
|
||||||
|
import jakarta.ws.rs.Priorities;
|
||||||
|
import jakarta.ws.rs.container.ContainerRequestContext;
|
||||||
|
import jakarta.ws.rs.container.ContainerResponseContext;
|
||||||
|
import jakarta.ws.rs.container.ContainerResponseFilter;
|
||||||
|
import jakarta.ws.rs.container.ResourceInfo;
|
||||||
|
import jakarta.ws.rs.core.Context;
|
||||||
|
import jakarta.ws.rs.core.MediaType;
|
||||||
|
import jakarta.ws.rs.core.UriInfo;
|
||||||
|
import jakarta.ws.rs.ext.Provider;
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
@Provider
|
||||||
|
@Priority(Priorities.USER)
|
||||||
|
public class FrontendForwardingFilter implements ContainerResponseFilter {
|
||||||
|
|
||||||
|
private static final Logger LOG = Logger.getLogger(FrontendForwardingFilter.class);
|
||||||
|
|
||||||
|
@Context
|
||||||
|
UriInfo info;
|
||||||
|
|
||||||
|
@Context
|
||||||
|
HttpServerRequest request;
|
||||||
|
|
||||||
|
@Context
|
||||||
|
ResourceInfo resourceInfo;
|
||||||
|
|
||||||
|
private static String text = null;
|
||||||
|
|
||||||
|
private static final String API_NAMESPACE_REGEX = "^/(api/.*|api)";
|
||||||
|
private static final String FILENAME_REGEX = "^/.*\\.[^.]+$";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
|
||||||
|
|
||||||
|
final String method = requestContext.getMethod();
|
||||||
|
final String path = info.getPath();
|
||||||
|
final String address = request.remoteAddress().toString();
|
||||||
|
|
||||||
|
LOG.infof("Request %s %s from IP %s", method, path, address);
|
||||||
|
|
||||||
|
int status = responseContext.getStatus();
|
||||||
|
if (status != 404 && !(status == 405 && "GET".equals(requestContext.getMethod()))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isApiNamespace = path.matches(API_NAMESPACE_REGEX);
|
||||||
|
if (isApiNamespace) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
boolean isFilename = path.matches(FILENAME_REGEX);
|
||||||
|
if (isFilename) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
boolean actualErrorResponse = resourceInfo != null && resourceInfo.getResourceMethod() != null;
|
||||||
|
if (actualErrorResponse) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.info("redirect");
|
||||||
|
|
||||||
|
if (text == null)
|
||||||
|
text = new Scanner(Objects.requireNonNull(this.getClass().getResourceAsStream("/META-INF/resources/index.html")),
|
||||||
|
StandardCharsets.UTF_8).useDelimiter("\\A").next();
|
||||||
|
responseContext.setStatus(200);
|
||||||
|
responseContext.setEntity(text, null, MediaType.TEXT_HTML_TYPE);
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@ -1,4 +1,4 @@
|
|||||||
import {createContext, useContext, useEffect, useReducer} from "react";
|
import {createContext, useContext, useReducer} from "react";
|
||||||
|
|
||||||
const AuthContext = createContext(undefined);
|
const AuthContext = createContext(undefined);
|
||||||
const AuthDispatchContext = createContext(null);
|
const AuthDispatchContext = createContext(null);
|
||||||
@ -24,20 +24,17 @@ export function KeycloakContextProvider({children}) {
|
|||||||
function authReducer(auth, action) {
|
function authReducer(auth, action) {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case 'init': {
|
case 'init': {
|
||||||
const token = localStorage.getItem("access_token");
|
|
||||||
return {
|
return {
|
||||||
token: token,
|
|
||||||
refresh: localStorage.getItem("refresh_token"),
|
|
||||||
is_authenticated: action.val,
|
is_authenticated: action.val,
|
||||||
data: action.val ? JSON.parse(atob(token.split('.')[1])) : null
|
data: {realm_access: {roles: ["federation_admin"]}}
|
||||||
|
//data: action.val ? JSON.parse(atob(token.split('.')[1])) : null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 'update': {
|
case 'update': {
|
||||||
return {
|
return {
|
||||||
...auth,
|
...auth,
|
||||||
token: action.token,
|
data: {realm_access: {roles: ["federation_admin"]}}
|
||||||
refresh: action.refresh,
|
// data: JSON.parse(atob(action.token.split('.')[1]))
|
||||||
data: JSON.parse(atob(action.token.split('.')[1]))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 'invalidate': {
|
case 'invalidate': {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user