diff --git a/frontend/src/Components/Menu.svelte b/frontend/src/Components/Menu.svelte index fc7a5b1..7982c78 100644 --- a/frontend/src/Components/Menu.svelte +++ b/frontend/src/Components/Menu.svelte @@ -1,17 +1,39 @@ + + router.navigate('/user')}>{t('menu.users')} {t('menu.tutorial')} + {#each modules as module,i} + {module.name} + {/each} {#if user.name } {t('menu.logout')} {/if} diff --git a/legacy/src/main/java/de/srsoftware/umbrella/legacy/LegacyApi.java b/legacy/src/main/java/de/srsoftware/umbrella/legacy/LegacyApi.java index 86f4aae..83d0f8f 100644 --- a/legacy/src/main/java/de/srsoftware/umbrella/legacy/LegacyApi.java +++ b/legacy/src/main/java/de/srsoftware/umbrella/legacy/LegacyApi.java @@ -7,8 +7,7 @@ import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.TOKEN; import static de.srsoftware.umbrella.core.Paths.*; import static de.srsoftware.umbrella.core.Util.request; -import static de.srsoftware.umbrella.user.Paths.NOTIFY; -import static de.srsoftware.umbrella.user.Paths.VALIDATE_TOKEN; +import static de.srsoftware.umbrella.user.Paths.*; import static java.lang.Long.parseLong; import static java.lang.System.Logger.Level.*; import static java.lang.System.Logger.Level.DEBUG; @@ -27,10 +26,7 @@ import de.srsoftware.umbrella.user.model.UmbrellaUser; import de.srsoftware.umbrella.user.sqlite.SqliteDB; import java.io.IOException; import java.time.Instant; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import org.json.JSONObject; @@ -57,6 +53,7 @@ public class LegacyApi extends BaseHandler { } case LOGIN -> getLogin(ex); case LOGOUT-> logout(ex); + case MODULES -> getModules(ex); case SEARCH -> sendRedirect(ex,url(ex).replaceAll("/legacy/","/")); default -> super.doGet(path,ex); }; @@ -93,6 +90,17 @@ public class LegacyApi extends BaseHandler { return sendRedirect(ex,location); } + public boolean getModules(HttpExchange ex) throws IOException { + var optToken = SessionToken.from(ex).map(Token::of); + if (optToken.isEmpty()) return sendEmptyResponse(HTTP_UNAUTHORIZED,ex); + var list = new ArrayList>(); + for (var module : config.keys()){ + Optional url = config.get(module+".baseUrl"); + url.ifPresent(u -> list.add(Map.of("module",module,URL,u))); + } + return sendContent(addCors(ex),list); + } + private boolean jsonUser(HttpExchange ex) throws UmbrellaException, IOException { Map data = null; try { @@ -214,42 +222,6 @@ public class LegacyApi extends BaseHandler { return sendContent(ex,Map.of(REDIRECT,"home")); } - protected Session requestSession(Token token) throws UmbrellaException { - var session = users.load(token); - session = users.extend(session); - return session; - } - - private boolean getSearch(HttpExchange ex) throws IOException, UmbrellaException { - var optToken = SessionToken.from(ex).map(Token::of); - if (optToken.isEmpty()) return sendEmptyResponse(HTTP_UNAUTHORIZED,ex); - var token = optToken.get(); - var params = queryParam(ex); - var key = params.get(KEY) instanceof String s ? s : null; - if (key == null) throw new UmbrellaException(HTTP_BAD_REQUEST,"Missing search key"); - var fulltext = key.contains("+") || "on".equals(params.get("fulltext")); - StringBuilder searchResult = new StringBuilder(); - if (fulltext){ - for (var module : config.keys()){ - var baseUrl = config.get(module + ".baseUrl"); - if (baseUrl.isEmpty()) continue; - - var res = request(baseUrl.get()+"/search",token.asMap().plus(KEY,key),MIME_FORM_URL,token.asBearer()); - if (!(res instanceof String content) || content.isBlank()) continue; - searchResult.append("").append(module).append(""); - searchResult.append(content).append("\n"); - } - } else { - var bookmark = config.get("bookmark.baseUrl"); - if (bookmark.isEmpty()) throw new UmbrellaException(500,"Tag search not available: Bookmark module not configured!"); - var res = request(bookmark.get()+"/search",token.asMap().plus(KEY,key),MIME_FORM_URL,null); - if (!(res instanceof String content)) throw new UmbrellaException(500,"Search did not return html content!"); - searchResult.append(content); - } - addCors(ex); - return sendContent(ex,searchResult.toString()); - }; - private boolean postSearch(HttpExchange ex) throws IOException, UmbrellaException { var optToken = SessionToken.from(ex).map(Token::of); if (optToken.isEmpty()) return sendEmptyResponse(HTTP_UNAUTHORIZED,ex); @@ -279,6 +251,12 @@ public class LegacyApi extends BaseHandler { return sendContent(ex,searchResult.toString()); }; + protected Session requestSession(Token token) throws UmbrellaException { + var session = users.load(token); + session = users.extend(session); + return session; + } + private static String stripTrailingSlash(Object o){ String url = o.toString(); if (url.endsWith("/")) return url.substring(0,url.length()-1); diff --git a/user/src/main/java/de/srsoftware/umbrella/user/Paths.java b/user/src/main/java/de/srsoftware/umbrella/user/Paths.java index db3c50b..6e287c2 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/Paths.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/Paths.java @@ -11,6 +11,7 @@ public class Paths { public static final String INSTALL = "install"; public static final String JAVASCRIPT = "js"; public static final String MENU = "menu"; + public static final String MODULES = "modules"; public static final String NOTIFY = "notify"; public static final String BUTTONS = "buttons"; public static final String OIDC_LOGIN = "oidc_login";