diff --git a/app/src/main/java/com/kamwithk/ankiconnectandroid/routing/RouteHandler.java b/app/src/main/java/com/kamwithk/ankiconnectandroid/routing/RouteHandler.java index 8561e9e..47acbf1 100644 --- a/app/src/main/java/com/kamwithk/ankiconnectandroid/routing/RouteHandler.java +++ b/app/src/main/java/com/kamwithk/ankiconnectandroid/routing/RouteHandler.java @@ -7,14 +7,17 @@ import android.content.Context; import android.content.SharedPreferences; +import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; import com.kamwithk.ankiconnectandroid.ankidroid_api.IntegratedAPI; import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import fi.iki.elonen.NanoHTTPD; import fi.iki.elonen.router.RouterNanoHTTPD; @@ -66,7 +69,7 @@ public NanoHTTPD.Response get(RouterNanoHTTPD.UriResource uriResource, Map headers = session.getHeaders(); + String origin = headers.get("origin"); + + String[] allowedHosts = corsHostsString.split("\\n"); + List normalizedAllowedHosts = Arrays.stream(allowedHosts) + .map(this::normalizeHost) + .filter(s -> !s.isEmpty()) + .collect(Collectors.toList()); + + if (normalizedAllowedHosts.contains("*")) { + // Since "*" is in the allowed hosts, simply allow all origins + applyHeaders(rep, "*"); + } else if (normalizedAllowedHosts.contains(origin)) { + // Request is from an origin the user trusts. + applyHeaders(rep, origin); + } + } - if (!corsHost.trim().equals("")) { - rep.addHeader("Access-Control-Allow-Origin", corsHost); - rep.addHeader("Access-Control-Allow-Headers", "*"); + private void applyHeaders(NanoHTTPD.Response rep, String allowOrigin) { + rep.addHeader("Access-Control-Allow-Origin", allowOrigin); + rep.addHeader("Access-Control-Allow-Headers", "*"); + } + + // Trim and remove trailing slash from a host + @NonNull + private String normalizeHost(String host) { + if (host == null) { + return ""; + } + String normalizedHost = host.trim(); + if (normalizedHost.endsWith("/")) { + normalizedHost = normalizedHost.substring(0, normalizedHost.length() - 1); } + return normalizedHost; } } diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index cb6a008..9214b04 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -24,10 +24,10 @@