diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1521b5990..91d81f6e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,6 @@ on: - "tests/*" - "util/*" - ".github/workflows/ci.yml" - - "dnsconfig.js" workflow_dispatch: @@ -44,11 +43,5 @@ jobs: env: GH_TOKEN: ${{ github.token }} - - name: Run DNSControl tests - if: github.event_name == 'pull_request' && contains(fromJson(env.CHANGED_FILES), 'dnsconfig.js') - uses: is-a-dev/dnscontrol-action@main - with: - args: check - - name: Run tests run: npx ava tests/*.test.js --timeout=1m diff --git a/.github/workflows/dnscontrol.yml b/.github/workflows/dnscontrol.yml new file mode 100644 index 000000000..847aae8cb --- /dev/null +++ b/.github/workflows/dnscontrol.yml @@ -0,0 +1,25 @@ +name: DNSControl + +on: + push: + branches: [main] + paths: + - ".github/workflows/dnscontrol.yml" + - "dnsconfig.js" + + workflow_dispatch: + +concurrency: + group: ${{ github.ref }}-dnscontrol + cancel-in-progress: true + +jobs: + tests: + name: Tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: is-a-dev/dnscontrol-action@main + with: + args: check diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index e0891daae..415277fbe 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -1,12 +1,15 @@ -name: Pull Request Labeler +name: Label + on: schedule: - cron: "*/10 * * * *" + jobs: - labeler: + pull-requests: + name: Pull Requests runs-on: ubuntu-latest steps: - - uses: docker://docker.io/ilyam8/periodic-pr-labeler:v0.1.1 + - uses: ilyam8/periodic-pr-labeler@v0.3.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_REPOSITORY: ${{ github.repository }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6094cba76..157d73bfc 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -22,11 +22,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Run DNSControl tests - uses: is-a-dev/dnscontrol-action@main - with: - args: check - - name: Generate creds.json run: echo '{"cloudflare":{"TYPE":"CLOUDFLAREAPI","apitoken":"$CLOUDFLARE_API_TOKEN"}}' > ./creds.json diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index ad78c7b61..815d5ace0 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -1,12 +1,14 @@ -name: StaleBOT +name: Stale on: - workflow_dispatch: schedule: - - cron: "30 14 * * *" + - cron: "0 12 * * *" + + workflow_dispatch: jobs: - stale: + label: + name: Label runs-on: ubuntu-latest steps: - uses: actions/stale@v3 diff --git a/README.md b/README.md index 36ab40258..0c3a0828f 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Not all of these will be posted on GitHub[^1], however they will always be poste ### NS Records When applying for NS records, please be aware we already support a [wide range of DNS records](https://docs.is-a.dev/faq/#which-records-are-supported), so you may not need them. -In your PR, please explain why you need NS records, including examples, to help mitigate potential abuse. Refer to the [FAQ](https://docs.is-a.dev/faq/#who-can-use-ns-records) for guidelines on allowed usage. Good examples of NS record requests are [#17592](https://github.com/is-a-dev/register/pull/17592) and [#18026](https://github.com/is-a-dev/register/pull/18026). +In your PR, please explain why you need NS records, including examples, to help mitigate potential abuse. Refer to the [FAQ](https://docs.is-a.dev/faq/#who-can-use-ns-records) for guidelines on allowed usage. ***Pull requests adding NS records without sufficient reasoning will be closed.*** diff --git a/dnsconfig.js b/dnsconfig.js index c2f151bc2..ae7905e0f 100644 --- a/dnsconfig.js +++ b/dnsconfig.js @@ -133,7 +133,6 @@ for (var subdomain in domains) { // Handle URL records if (domainData.record.URL) { records.push(A(subdomainName, IP("192.0.2.1"), CF_PROXY_ON)); - records.push(TXT("_redirect." + subdomainName, "\"" + domainData.record.URL + "\"")); } } @@ -150,8 +149,6 @@ for (var i = 0; i < reserved.length; i++) { ) { records.push(A(subdomainName, IP("192.0.2.1"), CF_PROXY_ON)); } - - records.push(TXT("_redirect." + subdomainName, "\"https://is-a.dev/reserved\"")); } var options = { diff --git a/domains/_discord.thangle.json b/domains/_discord.thangle.json deleted file mode 100644 index ed21f0026..000000000 --- a/domains/_discord.thangle.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "owner": { - "username": "ThangLe9999", - "discord": "872078632565215282", - "OWL": "eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiUlNBLU9BRVAiLCJraWQiOiJaa1VsRmRqVThiUEstLXVVM2JJR09PVHFYYVFFS1ZINFVXOW53MTR6WTJnIn0.G5BtkuOaAUmFdixUP1IN4ZTmec-NZCllzsliK6q8sggJkBzasXefGfeEh6pBOiZ6ZkV2gr-GCdTN7LkP7QLPgLN6FglXac8BP1DSGDF3Lo8ULvrM-CpLUdeR0mqes6OQVvWdmPhZgVFGF3ItzDXQ7SqB6zrMbEWEwuZeg2KLHyPqvHsdrWLjzNpvVUwZRBuxicPyNTT70oMbPaOn3cvg4J_mVxNywnrIY5F34-T4tmiOEijsHmPwG2RzHsTCzC3cGYfNmokQtAsL0jhIMH4GzYdbTUsjDOrqbLdT-W2y33pQkeQuCjdf8KkeYCfacE0oWAZKFhrW2X0zJLYvGQBeuw.3qY1yT9H2x2WH2DePTziiw.PJvjWBGxfTgCKqZiHuAsRaUEdjld3XeMAw7NwX9P28VSFOS3-xsSiOvbLrCo1n1nTF-4g8EIRkkFJPn2P1T6YUDNuHVqbvnGg2wfhpfdSaM.yxghx67x9iGLMjDEKJdeAw" - }, - - "record": { - "TXT": "dh=8d98fb5fefbb1915e89d5dc43c9fdd9fa801557f" - } -} diff --git a/domains/_github-pages-challenge-riviox.galaxytweaks.riviox.json b/domains/_github-pages-challenge-riviox.galaxytweaks.riviox.json deleted file mode 100644 index 844946459..000000000 --- a/domains/_github-pages-challenge-riviox.galaxytweaks.riviox.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "owner": { - "username": "riviox", - "email": "rivioxyt@hotmail.com" - }, - "record": { - "TXT": "15bce163359555d636e6bd2cc5903f" - } -} diff --git a/domains/_minecraft._tcp.mc.3gee.json b/domains/_minecraft._tcp.mc.3gee.json index ca7a9f426..b717967fb 100644 --- a/domains/_minecraft._tcp.mc.3gee.json +++ b/domains/_minecraft._tcp.mc.3gee.json @@ -9,7 +9,7 @@ "priority": 0, "weight": 5, "port": 32279, - "target": "gold.magmanode.com" + "target": "mc.3gee.is-a.dev" } ] } diff --git a/domains/angel.json b/domains/angel.json deleted file mode 100644 index 2b8a5383d..000000000 --- a/domains/angel.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "owner": { - "username": "chewieleaf", - "email": "cchirrpy@outlook.com" - }, - "record": { - "TXT": "dh=440ef941b9b55391f86cf985e87ed861fc6e9512" - } -} diff --git a/domains/api.karyakarsa.willo.json b/domains/api.karyakarsa.willo.json deleted file mode 100644 index c70b3e330..000000000 --- a/domains/api.karyakarsa.willo.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "description": "api for karyakarsa", - "repo": "https://github.com/WilloIzCitron/karyakarsa-rest-api", - "owner": { - "username": "WilloIzCitron", - "twitter": "willoizcitron" - }, - "record": { - "CNAME": "karyakarsa-rest-api-production.up.railway.app" - } -} diff --git a/domains/auth.sign.alvin.json b/domains/auth.sign.alvin.json new file mode 100644 index 000000000..c279d0ff2 --- /dev/null +++ b/domains/auth.sign.alvin.json @@ -0,0 +1,9 @@ +{ + "owner": { + "username": "alvinsjoy", + "discord": "825382504353234954" + }, + "record": { + "TXT": "Created to allow nested subdomains to exist." + } +} diff --git a/domains/cdn.akk1to.json b/domains/cdn.akk1to.json new file mode 100644 index 000000000..b6723a57d --- /dev/null +++ b/domains/cdn.akk1to.json @@ -0,0 +1,10 @@ +{ + "owner": { + "username": "akk1to", + "email": "akk1to.dev@gmail.com", + "discord": "727497287777124414" + }, + "record": { + "TXT": "Created to allow nested subdomains to exist." + } +} diff --git a/domains/cedrickfeze.json b/domains/cedrickfeze.json deleted file mode 100644 index 8585ed122..000000000 --- a/domains/cedrickfeze.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "owner": { - "username": "cedrickdev", - "email": "cedrickv.tchindaf@hes-so.ch" - }, - "record": { - "CNAME": "cedrickfeze.vercel.app" - } -} diff --git a/domains/chewieleaf.json b/domains/chewieleaf.json deleted file mode 100644 index 699471137..000000000 --- a/domains/chewieleaf.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "owner": { - "username": "chewieleaf", - "email": "cchirrpy@outlook.com", - "discord": "898255050592366642" - }, - "record": { - "TXT": "dh=440ef941b9b55391f86cf985e87ed861fc6e9512" - } -} diff --git a/domains/coder.json b/domains/coder.json new file mode 100644 index 000000000..d74f24d92 --- /dev/null +++ b/domains/coder.json @@ -0,0 +1,12 @@ +{ + "owner": { + "username": "turbomaster95", + "email": "devamidhun.3c.kmbvm@gmail.com" + }, + "record": { + "NS": [ + "aria.ns.cloudflare.com", + "leonard.ns.cloudflare.com" + ] + } +} diff --git a/domains/colix.json b/domains/colix.json deleted file mode 100644 index e9f5291a9..000000000 --- a/domains/colix.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "owner": { - "username": "YeahhColix", - "email": "yeahhcolix@gmail.com" - }, - "record": { - "CNAME": "colix.pages.dev" - } -} diff --git a/domains/denisklimenko.json b/domains/denisklimenko.json deleted file mode 100644 index b7d688c90..000000000 --- a/domains/denisklimenko.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "owner": { - "username": "DenisKlimenko", - "email": "denis.klimenko.92@gmail.com" - }, - "record": { - "NS": ["destiny.ns.cloudflare.com", "kirk.ns.cloudflare.com"] - } -} diff --git a/domains/exrand.json b/domains/exrand.json index 5d3190765..ec9fc953f 100644 --- a/domains/exrand.json +++ b/domains/exrand.json @@ -1,9 +1,9 @@ { "owner": { - "username": "exrand", + "username": "randomyaps", "email": "totallynota903@gmail.com" }, "record": { - "A": ["207.180.248.6"] + "A": ["212.91.26.79"] } } diff --git a/domains/exx.json b/domains/exx.json deleted file mode 100644 index 977561c23..000000000 --- a/domains/exx.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "owner": { - "username": "xqxyzl", - "email": "exemailhelp+3@gmail.com" - }, - "record": { - "TXT": "_discord.exx.is-a.dev" - } -} diff --git a/domains/faultysden.json b/domains/faultysden.json deleted file mode 100644 index b2c3cdc94..000000000 --- a/domains/faultysden.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "owner": { - "username": "FaultyFaulty-glitch", - "email": "faultywindows+github@gmail.com", - "discord": "1041028534690386051" - }, - "record": { - "TXT": "google-site-verification=ix1jczu2q87igryc4eaexvdv1vrzjxolu14sjfpsnko" - } -} diff --git a/domains/interstellaros.json b/domains/interstellaros.json deleted file mode 100644 index cf559db57..000000000 --- a/domains/interstellaros.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "owner": { - "username": "jacksoncraft859", - "email": "pollardjackson@outlook.com" - }, - "record": { - "TXT": "replit-verify=ac38945f-f53b-4b1b-980d-e2a1d64175c6" - } -} diff --git a/domains/luoxiaohei.json b/domains/luoxiaohei.json deleted file mode 100644 index 1ef5b4c72..000000000 --- a/domains/luoxiaohei.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "description": "🌸 This is nicer with it's own site of discord app named Luo Xiaohei", - "repo": "https://github.com/lxhapp/lxhapp.github.io", - "owner": { - "username": "Melishy", - "email": "themelishy@outlook.com", - "twitter": "themelishy", - "discord": "1053012080812359750" - }, - "record": { - "CNAME": "lxhapp.github.io" - } -} diff --git a/domains/mc.3gee.json b/domains/mc.3gee.json new file mode 100644 index 000000000..754a634a0 --- /dev/null +++ b/domains/mc.3gee.json @@ -0,0 +1,9 @@ +{ + "owner": { + "username": "3geETR", + "email": "egemacun@gmail.com" + }, + "record": { + "CNAME": "gold.magmanode.com" + } +} diff --git a/domains/reejit.json b/domains/reejit.json new file mode 100644 index 000000000..3a5d8a374 --- /dev/null +++ b/domains/reejit.json @@ -0,0 +1,9 @@ +{ + "owner": { + "username": "reejit", + "email": "guardiansofspartax@gmail.com" + }, + "record": { + "NS": ["gloria.ns.cloudflare.com", "west.ns.cloudflare.com"] + } +} diff --git a/domains/thangle.json b/domains/thangle.json deleted file mode 100644 index f3b5eea08..000000000 --- a/domains/thangle.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "owner": { - "username": "thangle9999", - "discord": "thangle9999" - }, - "record": { - "TXT": "vc-domain-verify=thangle.is-a.dev,bd6f80914ee2949ce900" - } -} diff --git a/domains/thinhnguyen.json b/domains/thinhnguyen.json new file mode 100644 index 000000000..4023b9961 --- /dev/null +++ b/domains/thinhnguyen.json @@ -0,0 +1,9 @@ +{ + "owner": { + "username": "thinhdnn", + "email": "nguyenvanthinh.dnn@gmail.com" + }, + "record": { + "A": ["152.69.196.244"] + } +} diff --git a/domains/vulehuan.json b/domains/vulehuan.json new file mode 100644 index 000000000..4676646d1 --- /dev/null +++ b/domains/vulehuan.json @@ -0,0 +1,10 @@ +{ + "description": "vulehuan.is-a.dev : This is my personal notebook", + "owner": { + "username": "vulehuan", + "email": "vulehuan@gmail.com" + }, + "record": { + "URL": "https://vulehuan.com" + } +} diff --git a/domains/w.json b/domains/w.json deleted file mode 100644 index 55dcef36b..000000000 --- a/domains/w.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "owner": { - "username": "wdhdev", - "email": "william@is-a.dev" - }, - "record": { - "URL": "https://william.is-a.dev" - }, - "redirect_config": { - "redirect_paths": true - } -} diff --git a/domains/yu.json b/domains/yu.json new file mode 100644 index 000000000..47b754fa2 --- /dev/null +++ b/domains/yu.json @@ -0,0 +1,9 @@ +{ + "owner": { + "username": "yunexiz", + "discord": "1040303561847881729" + }, + "record": { + "CNAME": "redirecting-for-yu.pages.dev" + } +} diff --git a/tests/domains.test.js b/tests/domains.test.js index 9df9598f4..43395fcda 100644 --- a/tests/domains.test.js +++ b/tests/domains.test.js @@ -24,26 +24,31 @@ function getDomainData(subdomain) { t("Nested subdomains should not exist without a parent subdomain", (t) => { files.forEach((file) => { const subdomain = file.replace(/\.json$/, ""); - const parentDomain = subdomain.split(".").reverse()[0]; + const parts = subdomain.split("."); + + for (let i = 1; i < parts.length; i++) { + const parent = parts.slice(i).join("."); + if (parent.startsWith("_")) continue; - if (parentDomain !== subdomain) { t.true( - parentDomain && files.includes(`${parentDomain}.json`), - `${file}: Parent subdomain does not exist` + files.includes(`${parent}.json`), + `${file}: Parent subdomain "${parent}" does not exist` ); } }); }); -t("Nested subdomains should not exist if the parent subdomain has NS records", (t) => { +t("Nested subdomains should not exist if any parent subdomain has NS records", (t) => { files.forEach((file) => { const subdomain = file.replace(/\.json$/, ""); - const parentDomain = subdomain.split(".").reverse()[0]; + const parts = subdomain.split("."); - if (parentDomain !== subdomain) { - const parentData = getDomainData(parentDomain); + for (let i = 1; i < parts.length; i++) { + const parent = parts.slice(i).join("."); + if (parent.startsWith("_") || !files.includes(`${parent}.json`)) continue; + const parentData = getDomainData(parent); - t.true(!parentData.record.NS, `${file}: Parent subdomain has NS records`); + t.true(!parentData.record.NS, `${file}: Parent subdomain "${parent}" has NS records`); } }); }); diff --git a/tests/records.test.js b/tests/records.test.js index 52fb1f677..573e0604e 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -216,7 +216,10 @@ function validateRecordValues(t, data, file) { Number.isInteger(record.matchingType) && record.matchingType >= 0 && record.matchingType <= 255, `${file}: Invalid matchingType for ${key} at index ${idx}` ); - t.true(isValidHexadecimal(record.certificate), `${file}: Invalid certificate for ${key} at index ${idx}`); + t.true( + isValidHexadecimal(record.certificate), + `${file}: Invalid certificate for ${key} at index ${idx}` + ); } }); } @@ -310,3 +313,20 @@ t("All files should have valid record types", (t) => { t.pass(); }); + +t("Root subdomains should have at least one usable record", (t) => { + const usableRecordTypes = ["A", "AAAA", "CNAME", "MX", "NS", "URL"]; + + files.forEach((file) => { + const subdomain = file.replace(/\.json$/, ""); + if (subdomain.includes(".") || subdomain.startsWith("_")) return; + + const data = getDomainData(file); + const recordKeys = Object.keys(data.record); + + t.true( + usableRecordTypes.some((record) => recordKeys.includes(record)), + `${file}: Root subdomains must have at least one A, AAAA, CNAME, MX, NS, or URL record` + ); + }); +});