diff --git a/configurator/public/index.html b/configurator/public/index.html
index 67550a3..7425cd9 100644
--- a/configurator/public/index.html
+++ b/configurator/public/index.html
@@ -277,7 +277,25 @@ cache_log /var/log/squid/cache.log
`;
}
function genDomains(s) {
- return s.domains.map(d => d.startsWith('*.') ? '.' + d.slice(2) : d).join('\n') + '\n';
+ let wildcardBases = s.domains
+ .filter(d => d.startsWith('*.'))
+ .map(d => d.slice(2));
+ wildcardBases = wildcardBases.filter(base =>
+ !wildcardBases.some(other => other !== base && base.endsWith('.' + other))
+ );
+ const isCovered = d => wildcardBases.some(b => d === b || d.endsWith('.' + b));
+ const seen = new Set();
+ const out = [];
+ for (const base of wildcardBases) {
+ const dotted = '.' + base;
+ if (!seen.has(dotted)) { out.push(dotted); seen.add(dotted); }
+ }
+ for (const d of s.domains) {
+ if (d.startsWith('*.')) continue;
+ if (isCovered(d) || seen.has(d)) continue;
+ out.push(d); seen.add(d);
+ }
+ return out.join('\n') + '\n';
}
function genWpad(s) {
return `function FindProxyForURL(url, host) {
diff --git a/configurator/server.js b/configurator/server.js
index 9396d89..10184d0 100644
--- a/configurator/server.js
+++ b/configurator/server.js
@@ -105,11 +105,40 @@ cache_log /var/log/squid/cache.log
}
function generateVpnDomains(s) {
- return (
- s.domains
- .map((d) => (d.startsWith("*.") ? "." + d.slice(2) : d))
- .join("\n") + "\n"
- );
+ // Wildcards: '*.foo.bar' -> covers 'foo.bar' und alle Subdomains in squid
+ let wildcardBases = s.domains
+ .filter((d) => d.startsWith("*."))
+ .map((d) => d.slice(2));
+
+ // Dedupe: wenn '*.bar' und '*.foo.bar' beide drin sind, '*.foo.bar' droppen
+ wildcardBases = wildcardBases.filter((base) => {
+ return !wildcardBases.some(
+ (other) => other !== base && base.endsWith("." + other)
+ );
+ });
+
+ const isCoveredByWildcard = (d) =>
+ wildcardBases.some((base) => d === base || d.endsWith("." + base));
+
+ const seen = new Set();
+ const out = [];
+
+ for (const base of wildcardBases) {
+ const dotted = "." + base;
+ if (!seen.has(dotted)) {
+ out.push(dotted);
+ seen.add(dotted);
+ }
+ }
+
+ for (const d of s.domains) {
+ if (d.startsWith("*.")) continue;
+ if (isCoveredByWildcard(d) || seen.has(d)) continue;
+ out.push(d);
+ seen.add(d);
+ }
+
+ return out.join("\n") + "\n";
}
function generateWpadDat(s) {