|
|
@@ -1,8 +1,10 @@
|
|
|
+// Surge Domain Set can not include root domain from public suffix list.
|
|
|
+
|
|
|
const tldts = require('tldts');
|
|
|
const picocolors = require('picocolors');
|
|
|
-
|
|
|
const fs = require('fs');
|
|
|
const path = require('path');
|
|
|
+const listDir = require('@sukka/listdir');
|
|
|
|
|
|
const SPECIAL_SUFFIXES = new Set([
|
|
|
'linodeobjects.com', // only *.linodeobjects.com are public suffix
|
|
|
@@ -10,12 +12,11 @@ const SPECIAL_SUFFIXES = new Set([
|
|
|
'dweb.link' // only *.dweb.link are public suffix
|
|
|
]);
|
|
|
|
|
|
-(async () => {
|
|
|
+const validateDomainSet = async (filePath) => {
|
|
|
const domainSetContent = await fs.promises.readFile(
|
|
|
- path.resolve(__dirname, '../List/domainset/cdn.conf'),
|
|
|
+ path.resolve(__dirname, '../List/domainset', filePath),
|
|
|
{ encoding: 'utf-8' }
|
|
|
);
|
|
|
-
|
|
|
const domainSetLines = domainSetContent.split('\n');
|
|
|
for (let i = 0, len = domainSetLines.length; i < len; i++) {
|
|
|
const line = domainSetLines[i];
|
|
|
@@ -36,16 +37,20 @@ const SPECIAL_SUFFIXES = new Set([
|
|
|
|| parsed.isIcann
|
|
|
) && domain === parsed.publicSuffix
|
|
|
) {
|
|
|
- console.error('Domain', picocolors.yellow(domain), picocolors.red('is in public suffix list!'));
|
|
|
+ console.error(`[${filePath}]`, picocolors.yellow(domain), picocolors.red('is in public suffix list!'));
|
|
|
}
|
|
|
}
|
|
|
+};
|
|
|
|
|
|
+const validateRuleset = async (filePath) => {
|
|
|
const rulesetContent = await fs.promises.readFile(
|
|
|
- path.resolve(__dirname, '../List/non_ip/cdn.conf'),
|
|
|
+ path.resolve(__dirname, '../List/non_ip', filePath),
|
|
|
{ encoding: 'utf-8' }
|
|
|
);
|
|
|
const rulesetLines = rulesetContent.split('\n');
|
|
|
|
|
|
+ console.log(`[${filePath}]`);
|
|
|
+
|
|
|
for (let i = 0, len = rulesetLines.length; i < len; i++) {
|
|
|
const line = rulesetLines[i];
|
|
|
// starts with #
|
|
|
@@ -55,16 +60,30 @@ const SPECIAL_SUFFIXES = new Set([
|
|
|
if (line.trim().length === 0) {
|
|
|
continue;
|
|
|
}
|
|
|
+ if (!line.startsWith('DOMAIN-SUFFIX,')) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ const domain = line.slice(14);
|
|
|
+ const parsed = tldts.parse(domain, { allowPrivateDomains: true, detectIp: false });
|
|
|
|
|
|
- if (line.startsWith('DOMAIN-SUFFIX')) {
|
|
|
- const domain = line.slice(14);
|
|
|
- const parsed = tldts.parse(domain, { allowPrivateDomains: true, detectIp: false });
|
|
|
-
|
|
|
- if (domain !== parsed.publicSuffix) {
|
|
|
- if (!SPECIAL_SUFFIXES.has(domain)) {
|
|
|
- console.error('Domain', picocolors.yellow(domain), picocolors.green('is not in public suffix list!'));
|
|
|
- }
|
|
|
+ if (domain !== parsed.publicSuffix) {
|
|
|
+ if (!SPECIAL_SUFFIXES.has(domain)) {
|
|
|
+ console.warn(picocolors.yellow(domain), picocolors.green('is not in public suffix list!'));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+}
|
|
|
+
|
|
|
+(async () => {
|
|
|
+ const [domainsetFiles, rulesetFiles] = await Promise.all([
|
|
|
+ listDir(path.resolve(__dirname, '../List/domainset')),
|
|
|
+ listDir(path.resolve(__dirname, '../List/non_ip'))
|
|
|
+ ]);
|
|
|
+ await Promise.all(
|
|
|
+ domainsetFiles.map(file => validateDomainSet(file))
|
|
|
+ );
|
|
|
+ // await Promise.all(
|
|
|
+ // rulesetFiles.map(file => validateRuleset(file))
|
|
|
+ // );
|
|
|
})();
|
|
|
+
|