From 8e4c7f62fbc0ff35a1937897eaa58cb55fd24f0a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A9o=20Banno-Cloutier?=
 <leo.banno-cloutier@savoirfairelinux.com>
Date: Wed, 21 Jun 2023 16:52:09 -0400
Subject: [PATCH] jams-server: enable cors

Change-Id: If030ae85310eef6acefcac994f02340c7ab7f385
---
 README.md                                     |  7 +-
 jams-react-client/src/api.js                  | 40 +++------
 .../CustomUiPreview/CustomUiPreview.js        | 12 ++-
 jams-react-client/src/globalUrls.js           |  6 +-
 jams-react-client/src/index.js                | 83 +++++--------------
 .../src/views/Blueprint/EditBlueprintUi.js    | 18 +---
 .../src/views/Blueprint/parsePolicyData.js    | 15 ++--
 .../src/views/Blueprints/Blueprints.js        | 76 ++++++++---------
 .../src/views/Groups/EditGroup.js             | 10 +--
 jams-react-client/src/views/Groups/Groups.js  | 10 +--
 .../api/admin/group/AddGroupServlet.java      |  9 +-
 .../directory/SearchDirectoryServlet.java     |  3 -
 .../filters/ARequestLoggingFilter.java        | 24 ++++++
 .../{CorsFilter.java => BCorsFilter.java}     | 10 +--
 ...InstallFilter.java => CInstallFilter.java} |  4 +-
 .../{ApiFilter.java => DApiFilter.java}       |  2 +-
 16 files changed, 150 insertions(+), 179 deletions(-)
 create mode 100644 jams-server/src/main/java/net/jami/jams/server/servlets/filters/ARequestLoggingFilter.java
 rename jams-server/src/main/java/net/jami/jams/server/servlets/filters/{CorsFilter.java => BCorsFilter.java} (55%)
 rename jams-server/src/main/java/net/jami/jams/server/servlets/filters/{InstallFilter.java => CInstallFilter.java} (95%)
 rename jams-server/src/main/java/net/jami/jams/server/servlets/filters/{ApiFilter.java => DApiFilter.java} (98%)

diff --git a/README.md b/README.md
index e500bc46..03708ff7 100644
--- a/README.md
+++ b/README.md
@@ -60,7 +60,7 @@ cp extras/scripts/pre-commit .git/hooks
 chmod +x .git/hooks/pre-commit
 ```
 
-## Development Docker container:
+## Development Docker container
 
 You can build the docker container using:
 
@@ -73,3 +73,8 @@ To run the docker container (assuming you want to have it on port 8080 locally):
 ```
 docker run -p 8080:8080 --rm jams:latest
 ```
+
+## About jams-server/src/main/java/net/jami/jams/server/filters
+The files in the `filters` folder are prefixed "A", "B", "C" and "D" so that the
+order of execution of the filters are right (jakarta registers filters in
+alphabetical order).
diff --git a/jams-react-client/src/api.js b/jams-react-client/src/api.js
index a2f3a744..eb57688f 100644
--- a/jams-react-client/src/api.js
+++ b/jams-react-client/src/api.js
@@ -29,9 +29,7 @@ import {
   api_path_post_update_user,
   api_path_get_user_directory_search,
   api_path_blueprints,
-} from "globalUrls";
-
-let isSearch = false;
+} from "./globalUrls";
 
 export default function configApiCall(
   api_path,
@@ -45,24 +43,24 @@ export default function configApiCall(
     method: request_type,
     crossDomain: true,
     dataType: "json",
+    headers: {},
   };
 
   // pass credentials in the header
   if (credentials) {
-    config["headers"] = {
-      Authorization:
-        "Basic " +
-        btoa(credentials["username"] + ":" + credentials["password"]),
-    };
+    const base64 = btoa(
+      credentials["username"] + ":" + credentials["password"]
+    );
+    config["headers"]["Authorization"] = "Basic " + base64;
   }
 
-  if (window.localStorage.getItem("access_token")) {
-    const jwt = localStorage.getItem("access_token");
-    config["headers"] = {
-      Authorization: "Bearer " + jwt,
-    };
+  const jwt = localStorage.getItem("access_token");
+  if (jwt) {
+    config["headers"]["Authorization"] = "Bearer " + jwt;
   }
 
+  config["headers"]["Content-type"] = "application/json";
+
   // pass data in the header
   if (data) {
     if (
@@ -74,30 +72,16 @@ export default function configApiCall(
       api_path === api_path_get_auth_devices ||
       api_path === api_path_get_admin_devices ||
       api_path === api_path_post_configuration_change_password
-    )
-      isSearch = true;
-
-    // search dataType
-    if (isSearch) {
+    ) {
       if (request_type === "GET" || request_type === "DELETE") {
         config["params"] = data;
       } else {
         config["data"] = data;
       }
     } else {
-      config["header"] = {
-        "Content-type": "application/json",
-      };
-
-      if (window.localStorage.getItem("access_token")) {
-        const jwt = localStorage.getItem("access_token");
-        config["headers"]["Authorization"] = "Bearer " + jwt;
-      }
-
       config["data"] = JSON.stringify(data);
     }
   }
 
-  isSearch = false;
   return config;
 }
diff --git a/jams-react-client/src/components/CustomUiPreview/CustomUiPreview.js b/jams-react-client/src/components/CustomUiPreview/CustomUiPreview.js
index 7ca6237a..5787f86b 100644
--- a/jams-react-client/src/components/CustomUiPreview/CustomUiPreview.js
+++ b/jams-react-client/src/components/CustomUiPreview/CustomUiPreview.js
@@ -8,6 +8,8 @@ import logoImage from "assets/img/logo-jami-net.svg";
 import TipBox from "./TipBox";
 import JamiIdCard from "./JamiIdCard";
 import i18next from "i18next";
+import { url_path } from "../../globalUrls";
+import { url_port } from "../../globalUrls";
 
 const styles = {
   backgroundImage: {
@@ -118,7 +120,9 @@ export default function CustomUiPreview({
       "Here is your Jami identifier, don’t hesitate to share it in order to be contacted more easily!"
     );
   }
-  if (!logoUrl) {
+  if (logoUrl) {
+    logoUrl = `${url_path}:${url_port}/${logoUrl}`;
+  } else {
     logoUrl = logoImage;
   }
 
@@ -126,6 +130,12 @@ export default function CustomUiPreview({
     backgroundColor = "white";
     backgroundUrl = "";
   }
+  if (backgroundUrl !== "") {
+    backgroundColor = "white";
+  }
+  if (backgroundUrl) {
+    backgroundUrl = `${url_path}:${url_port}/${backgroundUrl}`;
+  }
 
   const isCompactDisplay = !hasTitle && !hasDescription && !hasTips;
 
diff --git a/jams-react-client/src/globalUrls.js b/jams-react-client/src/globalUrls.js
index ffae7eff..12efdb95 100644
--- a/jams-react-client/src/globalUrls.js
+++ b/jams-react-client/src/globalUrls.js
@@ -1,6 +1,10 @@
 const uri = "";
 const current_uri = window.location.href;
-const backend_address = new URL(window.location.href);
+const backend_address = new URL(
+  process.env.NODE_ENV === "development"
+    ? "http://localhost:8080"
+    : window.location.href
+);
 const url_path = backend_address.protocol + "//" + backend_address.hostname;
 const url_port = backend_address.port;
 const api_path_post_install_admin = "/api/install/start";
diff --git a/jams-react-client/src/index.js b/jams-react-client/src/index.js
index d85216a6..28c6f538 100644
--- a/jams-react-client/src/index.js
+++ b/jams-react-client/src/index.js
@@ -18,7 +18,7 @@
 import React, { StrictMode, Suspense } from "react";
 import ReactDOM from "react-dom";
 import { createBrowserHistory } from "history";
-import { Router, Route, Switch, Redirect } from "react-router-dom";
+import { Router, Switch, Redirect } from "react-router-dom";
 import { ProtectedRoute } from "protected.route";
 import { ConfiguredRoute } from "configured.route";
 import auth from "./auth";
@@ -60,76 +60,39 @@ const theme = createTheme({
   },
 });
 
-if (process.env.NODE_ENV === "development") {
-  auth.checkLastKnownStep(() => {
-    ReactDOM.render(
-      <StrictMode>
+auth.checkServerInstalled(() => {
+  auth.checkAdminAccountStatus(() => {
+    auth.checkLastKnownStep(() => {
+      ReactDOM.render(
         <ThemeProvider theme={theme}>
           <Suspense fallback={<div>Loading...</div>}>
             <Router history={hist}>
               <Switch>
                 <ConfiguredRoute path="/signin" component={SignIn} />
-                <Route path="/users" component={UsersRoute} />
-                <Route path="/user/:username" component={UserRoute} />
-                <Route path="/createuser" component={CreateUserRoute} />
-                <Route path="/groups" component={GroupsRoute} />
-                <Route path="/group/:groupid" component={GroupRoute} />
-                <Route path="/blueprints" component={BlueprintsRoute} />
-                <Route
+                <ProtectedRoute path="/users" component={UsersRoute} />
+                <ProtectedRoute path="/user/:username" component={UserRoute} />
+                <ProtectedRoute
+                  path="/createuser"
+                  component={CreateUserRoute}
+                />
+                <ProtectedRoute path="/groups" component={GroupsRoute} />
+                <ProtectedRoute path="/group/:groupid" component={GroupRoute} />
+                <ProtectedRoute
+                  path="/blueprints"
+                  component={BlueprintsRoute}
+                />
+                <ProtectedRoute
                   path="/blueprint/:blueprintname"
                   component={BlueprintRoute}
                 />
-                <Route path="/settings" component={SettingsRoute} />
+                <ProtectedRoute path="/settings" component={SettingsRoute} />
                 <Redirect from="/" to="/signin" />
               </Switch>
             </Router>
           </Suspense>
-        </ThemeProvider>
-      </StrictMode>,
-      document.getElementById("root")
-    );
-  });
-} else {
-  auth.checkServerInstalled(() => {
-    auth.checkAdminAccountStatus(() => {
-      auth.checkLastKnownStep(() => {
-        ReactDOM.render(
-          <ThemeProvider theme={theme}>
-            <Suspense fallback={<div>Loading...</div>}>
-              <Router history={hist}>
-                <Switch>
-                  <ConfiguredRoute path="/signin" component={SignIn} />
-                  <ProtectedRoute path="/users" component={UsersRoute} />
-                  <ProtectedRoute
-                    path="/user/:username"
-                    component={UserRoute}
-                  />
-                  <ProtectedRoute
-                    path="/createuser"
-                    component={CreateUserRoute}
-                  />
-                  <ProtectedRoute path="/groups" component={GroupsRoute} />
-                  <ProtectedRoute
-                    path="/group/:groupid"
-                    component={GroupRoute}
-                  />
-                  <ProtectedRoute
-                    path="/blueprints"
-                    component={BlueprintsRoute}
-                  />
-                  <ProtectedRoute
-                    path="/blueprint/:blueprintname"
-                    component={BlueprintRoute}
-                  />
-                  <ProtectedRoute path="/settings" component={SettingsRoute} />
-                  <Redirect from="/" to="/signin" />
-                </Switch>
-              </Router>
-            </Suspense>
-          </ThemeProvider>,
-          document.getElementById("root")
-        );
-      });
+        </ThemeProvider>,
+        document.getElementById("root")
+      );
     });
   });
-}
+});
diff --git a/jams-react-client/src/views/Blueprint/EditBlueprintUi.js b/jams-react-client/src/views/Blueprint/EditBlueprintUi.js
index bc11a7e7..ccd33ac7 100644
--- a/jams-react-client/src/views/Blueprint/EditBlueprintUi.js
+++ b/jams-react-client/src/views/Blueprint/EditBlueprintUi.js
@@ -14,7 +14,7 @@ import GridContainer from "components/Grid/GridContainer.js";
 
 import { hexToRgb, blackColor } from "assets/jss/material-dashboard-react.js";
 
-import { api_path_get_image, api_path_post_image } from "../../globalUrls";
+import { api_path_get_image, api_path_post_image, url_path, url_port } from "../../globalUrls";
 
 import dashboardStyle from "assets/jss/material-dashboard-react/views/dashboardStyle.js";
 
@@ -135,20 +135,16 @@ export default function EditBlueprintUi({ blueprintName }) {
     const formData = new FormData();
     formData.append("file", acceptedFiles[0]);
 
-    const url = `${api_path_post_image}/${blueprintName}/${imgType}`;
+    const url = `${url_path}:${url_port}${api_path_post_image}/${blueprintName}/${imgType}`;
 
     fetch(url, {
       method: "POST",
       body: formData,
     })
       .then(() => {
+        const newUrl = `${api_path_get_image}/${blueprintName}/${imgType}/${acceptedFiles[0].name}`;
+
         if (imgType === "background") {
-          let newUrl =
-            api_path_get_image +
-            "/" +
-            blueprintName +
-            "/background/" +
-            acceptedFiles[0].name;
           setUiCustomization({
             ...uiCustomization,
             backgroundUrl: newUrl,
@@ -156,12 +152,6 @@ export default function EditBlueprintUi({ blueprintName }) {
           });
           handleUpdateUi("backgroundUrl", newUrl);
         } else if (imgType === "logo") {
-          let newUrl =
-            api_path_get_image +
-            "/" +
-            blueprintName +
-            "/logo/" +
-            acceptedFiles[0].name;
           setUiCustomization({
             ...uiCustomization,
             logoUrl: newUrl,
diff --git a/jams-react-client/src/views/Blueprint/parsePolicyData.js b/jams-react-client/src/views/Blueprint/parsePolicyData.js
index f5da5f55..5c8186a8 100644
--- a/jams-react-client/src/views/Blueprint/parsePolicyData.js
+++ b/jams-react-client/src/views/Blueprint/parsePolicyData.js
@@ -27,6 +27,15 @@ const getModerators = async (defaultModerators) => {
   return moderators;
 };
 
+const setPermissionsSettings = async (policyData) => {
+  policyData.blueprintModerators = await getModerators(
+    policyData.defaultModerators
+  );
+  delete policyData.defaultModerators;
+
+  return policyData;
+};
+
 const setConfigurationSettings = (policyData) => {
   const { turnEnabled, proxyEnabled } = policyData;
 
@@ -89,11 +98,7 @@ const setCustomizationSettings = (policyData) => {
 export const parsePolicyData = async (data) => {
   let policyData = JSON.parse(data);
 
-  policyData.blueprintModerators = await getModerators(
-    policyData.defaultModerators
-  );
-  delete policyData.defaultModerators;
-
+  policyData = await setPermissionsSettings(policyData);
   policyData = setConfigurationSettings(policyData);
   policyData = setCustomizationSettings(policyData);
 
diff --git a/jams-react-client/src/views/Blueprints/Blueprints.js b/jams-react-client/src/views/Blueprints/Blueprints.js
index dbae9f46..239784f7 100644
--- a/jams-react-client/src/views/Blueprints/Blueprints.js
+++ b/jams-react-client/src/views/Blueprints/Blueprints.js
@@ -177,6 +177,7 @@ export default function Blueprints() {
   const handleCreateBlueprint = () => {
     let defaultPolicyData = {
       videoEnabled: true,
+      publicInCalls: false,
       allowCertFromContact: true,
       allowCertFromHistory: true,
       allowCertFromTrusted: true,
@@ -249,46 +250,41 @@ export default function Blueprints() {
           {i18next.t("create_blueprint", "Create blueprint")}
         </DialogTitle>
         <DialogContent>
-          <DialogContentText id="alert-dialog-description">
-            <FormControl
-              className={classes.margin}
-              size="medium"
-              error={blueprintNameExits}
-            >
-              <InputLabel htmlFor="blueprintName">
-                {i18next.t("blueprint_name", "Blueprint name")}
-              </InputLabel>
-              <Input
-                id="blueprintName"
-                placeholder={i18next.t("blueprint_name", "Blueprint name")}
-                startAdornment={
-                  <InputAdornment position="start">
-                    <AllInbox />
-                  </InputAdornment>
-                }
-                onChange={(e) => {
-                  setBlueprintName(e.target.value);
-                  initCheckBlueprintNameExists(e.target.value);
-                }}
-              />
-            </FormControl>
-            {disableCreate && blueprintName.length > 0 && (
-              <p>
-                {i18next.t(
-                  "blueprint_name_already_exists",
-                  "Blueprint name already exists!"
-                )}
-              </p>
-            )}
-            {disableCreate && blueprintName.length === 0 && (
-              <p>
-                {i18next.t(
-                  "blueprint_name_is_empty",
-                  "Blueprint name is empty"
-                )}
-              </p>
-            )}
-          </DialogContentText>
+          <FormControl
+            className={classes.margin}
+            size="medium"
+            error={blueprintNameExits}
+          >
+            <InputLabel htmlFor="blueprintName">
+              {i18next.t("blueprint_name", "Blueprint name")}
+            </InputLabel>
+            <Input
+              id="blueprintName"
+              placeholder={i18next.t("blueprint_name", "Blueprint name")}
+              startAdornment={
+                <InputAdornment position="start">
+                  <AllInbox />
+                </InputAdornment>
+              }
+              onChange={(e) => {
+                setBlueprintName(e.target.value);
+                initCheckBlueprintNameExists(e.target.value);
+              }}
+            />
+          </FormControl>
+          {disableCreate && blueprintName.length > 0 && (
+            <p>
+              {i18next.t(
+                "blueprint_name_already_exists",
+                "Blueprint name already exists!"
+              )}
+            </p>
+          )}
+          {disableCreate && blueprintName.length === 0 && (
+            <p>
+              {i18next.t("blueprint_name_is_empty", "Blueprint name is empty")}
+            </p>
+          )}
         </DialogContent>
         <DialogActions>
           <Button onClick={handleClose} color="primary">
diff --git a/jams-react-client/src/views/Groups/EditGroup.js b/jams-react-client/src/views/Groups/EditGroup.js
index 64c7c1ec..dcbd5fd3 100644
--- a/jams-react-client/src/views/Groups/EditGroup.js
+++ b/jams-react-client/src/views/Groups/EditGroup.js
@@ -209,11 +209,6 @@ export default function EditGroup(props) {
     getBlueprintsOptions(blueprints)
   );
 
-  useEffect(() => {
-    getGroup();
-    searchUsers();
-  }, []);
-
   const updateGroup = (blueprintValue) => {
     let data = {
       name: newName,
@@ -357,6 +352,11 @@ export default function EditGroup(props) {
       });
   };
 
+  useEffect(() => {
+    getGroup();
+    searchUsers();
+  }, []);
+
   const tableCellClasses = classnames(classes.tableCell);
 
   return (
diff --git a/jams-react-client/src/views/Groups/Groups.js b/jams-react-client/src/views/Groups/Groups.js
index a19bb244..0ad1ce74 100644
--- a/jams-react-client/src/views/Groups/Groups.js
+++ b/jams-react-client/src/views/Groups/Groups.js
@@ -266,18 +266,14 @@ export default function Groups() {
 
     axios(
       configApiCall(
-        api_path_post_create_group +
-          "?name=" +
-          groupName +
-          "&blueprintName=" +
-          blueprintName,
+        api_path_post_create_group,
         "POST",
-        null,
+        { name: groupName, blueprintName },
         null
       )
     )
       .then((response) => {
-        console.log("Successfully  created " + groupName);
+        console.log("Successfully created " + groupName);
         setOpenCreate(false);
         history.push(`/group/${response.data.id}`);
       })
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/AddGroupServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/AddGroupServlet.java
index c29f498a..f6fb5be8 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/AddGroupServlet.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/AddGroupServlet.java
@@ -1,6 +1,8 @@
 package net.jami.jams.server.servlets.api.admin.group;
 
 import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
 import jakarta.servlet.annotation.WebServlet;
 import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
@@ -28,8 +30,11 @@ public class AddGroupServlet extends HttpServlet {
         Group group = new Group();
         UUID uuid = UUID.randomUUID();
         group.setId(uuid.toString());
-        group.setName(req.getParameter("name"));
-        group.setBlueprint(req.getParameter("blueprintName"));
+
+        JsonObject body = JsonParser.parseReader(req.getReader()).getAsJsonObject();
+        group.setName(body.get("name").getAsString());
+        group.setBlueprint(body.get("blueprintName").getAsString());
+
         if (dataStore.getGroupDao().storeObject(group)) {
             JsonObject data = new JsonObject();
             data.addProperty("id", uuid.toString());
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java
index 6fa9151e..cd77d04b 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java
@@ -23,7 +23,6 @@
 package net.jami.jams.server.servlets.api.auth.directory;
 
 import com.jsoniter.JsonIterator;
-import com.jsoniter.output.JsonStream;
 import jakarta.servlet.annotation.WebServlet;
 import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
@@ -35,9 +34,7 @@ import net.jami.jams.common.authentication.AuthenticationSourceType;
 import net.jami.jams.common.authmodule.AuthModuleKey;
 import net.jami.jams.common.dao.StatementElement;
 import net.jami.jams.common.dao.StatementList;
-import net.jami.jams.common.objects.responses.DeviceRegistrationResponse;
 import net.jami.jams.common.objects.user.*;
-import net.jami.jams.server.servlets.api.install.CachedObjects;
 import org.json.JSONObject;
 
 import java.io.IOException;
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/filters/ARequestLoggingFilter.java b/jams-server/src/main/java/net/jami/jams/server/servlets/filters/ARequestLoggingFilter.java
new file mode 100644
index 00000000..d3864de8
--- /dev/null
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/filters/ARequestLoggingFilter.java
@@ -0,0 +1,24 @@
+package net.jami.jams.server.servlets.filters;
+
+import java.io.IOException;
+
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.annotation.WebFilter;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+
+@WebFilter(urlPatterns = { "*" })
+@Slf4j
+public class ARequestLoggingFilter implements Filter {
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException {
+        HttpServletRequest req = ((HttpServletRequest) request);
+        log.info("Request: {} {}", req.getMethod(), req.getRequestURI());
+        chain.doFilter(request, response);
+    }
+}
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/filters/CorsFilter.java b/jams-server/src/main/java/net/jami/jams/server/servlets/filters/BCorsFilter.java
similarity index 55%
rename from jams-server/src/main/java/net/jami/jams/server/servlets/filters/CorsFilter.java
rename to jams-server/src/main/java/net/jami/jams/server/servlets/filters/BCorsFilter.java
index 56d5af3a..e8199f0f 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/filters/CorsFilter.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/filters/BCorsFilter.java
@@ -1,21 +1,13 @@
 package net.jami.jams.server.servlets.filters;
 
-import java.io.IOException;
-
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.ServletRequest;
-import jakarta.servlet.ServletResponse;
 import jakarta.servlet.annotation.WebFilter;
 import jakarta.servlet.annotation.WebInitParam;
-import jakarta.servlet.http.HttpServletResponse;
 
-// @WebFilter(urlPatterns = { "*" }, initParams = { @WebInitParam(name = "cors.allowed.origins", value = "*") })
 @WebFilter(urlPatterns = { "*" }, initParams = {
         @WebInitParam(name = "cors.allowed.origins", value = "*"),
         @WebInitParam(name = "cors.allowed.methods", value = "PUT, POST, GET, OPTIONS, DELETE"),
         @WebInitParam(name = "cors.allowed.headers", value = "Content-Type, Authorization"),
         @WebInitParam(name = "cors.preflight.maxage", value = "3600")
 })
-public class CorsFilter extends org.apache.catalina.filters.CorsFilter {
+public class BCorsFilter extends org.apache.catalina.filters.CorsFilter {
 }
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/filters/InstallFilter.java b/jams-server/src/main/java/net/jami/jams/server/servlets/filters/CInstallFilter.java
similarity index 95%
rename from jams-server/src/main/java/net/jami/jams/server/servlets/filters/InstallFilter.java
rename to jams-server/src/main/java/net/jami/jams/server/servlets/filters/CInstallFilter.java
index 3d57e902..72b567c6 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/filters/InstallFilter.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/filters/CInstallFilter.java
@@ -38,9 +38,9 @@ import java.io.IOException;
 
 import static net.jami.jams.server.servlets.filters.FilterUtils.doAuthCheck;
 
-@WebFilter("/api/install/*")
+@WebFilter(filterName = "installFilter", urlPatterns = { "/api/install/*" })
 @Slf4j
-public class InstallFilter implements Filter {
+public class CInstallFilter implements Filter {
 
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/filters/ApiFilter.java b/jams-server/src/main/java/net/jami/jams/server/servlets/filters/DApiFilter.java
similarity index 98%
rename from jams-server/src/main/java/net/jami/jams/server/servlets/filters/ApiFilter.java
rename to jams-server/src/main/java/net/jami/jams/server/servlets/filters/DApiFilter.java
index 6adbcb27..d9c31fc6 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/filters/ApiFilter.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/filters/DApiFilter.java
@@ -45,7 +45,7 @@ import static net.jami.jams.server.servlets.filters.FilterUtils.doAuthCheck;
  */
 @WebFilter(urlPatterns = {"/api/auth/*","/api/admin/*"})
 @Slf4j
-public class ApiFilter implements Filter {
+public class DApiFilter implements Filter {
 
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
-- 
GitLab