package io.dataease.utils; import io.dataease.constant.AuthConstant; import io.dataease.exception.DEException; import org.apache.commons.lang3.StringUtils; import org.springframework.core.env.Environment; import java.util.List; import java.util.Objects; import static io.dataease.result.ResultCode.INTERFACE_ADDRESS_INVALID; public class WhitelistUtils { private static String contextPath; public static String getContextPath() { if (StringUtils.isBlank(contextPath)) { contextPath = Objects.requireNonNull(CommonBeanFactory.getBean(Environment.class)).getProperty("server.servlet.context-path", String.class); } return contextPath; } public static List WHITE_PATH = List.of( "/login/localLogin", "/apisix/check", "/dekey", "/symmetricKey", "/index.html", "/model", "/xpackModel", "/swagger-resources", "/doc.html", "/panel.html", "/mobile.html", "/lark/qrinfo", "/lark/token", "/larksuite/qrinfo", "/larksuite/token", "/dingtalk/qrinfo", "/dingtalk/token", "/wecom/qrinfo", "/wecom/token", "/sysParameter/requestTimeOut", "/sysParameter/defaultSettings", "/setting/authentication/status", "/sysParameter/ui", "/sysParameter/defaultLogin", "/embedded/initIframe", "/sysParameter/i18nOptions", "/login/modifyInvalidPwd", "/"); public static boolean match(String requestURI) { invalidUrl(requestURI); if (StringUtils.startsWith(requestURI, getContextPath())) { requestURI = requestURI.replaceFirst(getContextPath(), ""); } if (StringUtils.startsWith(requestURI, AuthConstant.DE_API_PREFIX)) { requestURI = requestURI.replaceFirst(AuthConstant.DE_API_PREFIX, ""); } if (StringUtils.startsWith(requestURI, AuthConstant.DE_CASAPI_PREFIX)) { requestURI = requestURI.replaceFirst(AuthConstant.DE_CASAPI_PREFIX, ""); } if (StringUtils.startsWith(requestURI, AuthConstant.DE_OIDCAPI_PREFIX)) { requestURI = requestURI.replaceFirst(AuthConstant.DE_OIDCAPI_PREFIX, ""); } return WHITE_PATH.contains(requestURI) || StringUtils.endsWithAny(requestURI, ".gif",".ico", "js", ".css", "svg", "png", "jpg", "js.map", ".otf", ".ttf", ".woff2") || StringUtils.startsWithAny(requestURI, "data:image") || StringUtils.startsWithAny(requestURI, "/login/platformLogin/") || StringUtils.startsWithAny(requestURI, "/static-resource/") || StringUtils.startsWithAny(requestURI, "/appearance/image/") || StringUtils.startsWithAny(requestURI, "/share/proxyInfo") || StringUtils.startsWithAny(requestURI, "/xpackComponent/content") || StringUtils.startsWithAny(requestURI, "/xpackComponent/pluginStaticInfo") || StringUtils.startsWithAny(requestURI, "/geo/") || StringUtils.startsWithAny(requestURI, "/customGeo/") || StringUtils.startsWithAny(requestURI, "/websocket") || StringUtils.startsWithAny(requestURI, "/map/") || StringUtils.startsWithAny(requestURI, "/oauth2/") || StringUtils.startsWithAny(requestURI, "/mfa/qr/") || StringUtils.startsWithAny(requestURI, "/mfa/login") || StringUtils.startsWithAny(requestURI, "/typeface/download") || StringUtils.startsWithAny(requestURI, "/typeface/defaultFont") || StringUtils.startsWithAny(requestURI, "/typeface/listFont") || StringUtils.startsWithAny(requestURI, "/exportCenter/download") || StringUtils.startsWithAny(requestURI, "/i18n/") || StringUtils.startsWithAny(requestURI, "/communicate/image/") || StringUtils.startsWithAny(requestURI, "/saml/") || StringUtils.startsWithAny(requestURI, "/communicate/down/"); } public static String getBaseApiUrl(String redirect_uri) { if (StringUtils.endsWith(redirect_uri, "/")) { redirect_uri = redirect_uri.substring(0, redirect_uri.length() - 1); } String contextPath = WhitelistUtils.getContextPath(); if (StringUtils.isNotBlank(contextPath)) { redirect_uri += contextPath; } return redirect_uri + AuthConstant.DE_API_PREFIX + "/"; } private static void invalidUrl(String requestURI) { if (requestURI.contains("./") || requestURI.contains(".%") || requestURI.toLowerCase().contains("%2e") || (requestURI.contains(";") && !requestURI.contains("?"))) { DEException.throwException(INTERFACE_ADDRESS_INVALID.code(), String.format("%s [%s]", INTERFACE_ADDRESS_INVALID.message(), requestURI)); } } }