diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 9fc9d34de..1c5f7d0ca 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -11,6 +11,6 @@ jobs: fetch-depth: 0 - uses: oven-sh/setup-bun@v1 with: - bun-version: 1.0.0 + bun-version: 1.0.3 - run: bun install - run: bun test diff --git a/.github/workflows/publish-records.yml b/.github/workflows/publish-records.yml index 7a0ab3e06..522179f4d 100644 --- a/.github/workflows/publish-records.yml +++ b/.github/workflows/publish-records.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v3 - uses: oven-sh/setup-bun@v1 with: - bun-version: 1.0.0 + bun-version: 1.0.3 - run: bun install - run: bun test - name: Publishing records diff --git a/bun.lockb b/bun.lockb index f6fab3304..502212010 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 587307bab..ccc8dbd41 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "author": "Akshay Nair ", "license": "GPL-3.0", "dependencies": { + "ip-regex": "^5.0.0", "ramda": "^0.27.1" }, "devDependencies": { diff --git a/tests/validations.test.js b/tests/validations.test.js index 219546bad..a2484d581 100644 --- a/tests/validations.test.js +++ b/tests/validations.test.js @@ -59,6 +59,10 @@ describe('validateDomainData', () => { { ...defaultDomain, name: 'help.baa' }, { ...defaultDomain, name: '_github-pages-challenge-is-a-dev' }, { ...defaultDomain, name: '_github-challenge-is-a-dev' }, + { ...defaultDomain, record: { AAAA: [] } }, + { ...defaultDomain, record: { AAAA: ['182.22.222.22', '::1'] } }, + { ...defaultDomain, record: { AAAA: '182.22.222.22' } }, + { ...defaultDomain, record: { A: '::1' } }, ]; const validCases = [ @@ -86,6 +90,8 @@ describe('validateDomainData', () => { { ...defaultDomain, name: '_github-challenge-hello01-ga' }, { ...defaultDomain, name: '_github-challenge-hello01_ga' }, { ...defaultDomain, record: { TXT: ['foobar wow nice!!!', 'more text'] } }, + { ...defaultDomain, record: { AAAA: ['::1', '2001:db8:3333:4444:5555:6666:7777:8888'] } }, + { ...defaultDomain, record: { A: ['122.222.222.222'] } }, ]; it('should return false for invalid data', () => { diff --git a/utils/constants.js b/utils/constants.js index 273a2761e..19430e5bf 100644 --- a/utils/constants.js +++ b/utils/constants.js @@ -18,7 +18,7 @@ const DOMAINS_PATH = path.resolve('domains'); module.exports = { ENV, IS_TEST, - VALID_RECORD_TYPES: ['CNAME', 'A', 'URL', 'MX', 'TXT'], + VALID_RECORD_TYPES: ['CNAME', 'A', 'URL', 'MX', 'TXT', 'AAAA'], DOMAIN_DOMAIN: DOMAIN_DOMAIN || 'booboo.xyz', DOMAIN_USER: IS_TEST ? 'testuser' : DOMAIN_USER, DOMAIN_API_KEY: IS_TEST ? 'testkey' : DOMAIN_API_KEY, diff --git a/utils/validations.js b/utils/validations.js index 9a99343fa..65d1c5336 100644 --- a/utils/validations.js +++ b/utils/validations.js @@ -2,6 +2,8 @@ const R = require('ramda'); const { VALID_RECORD_TYPES } = require('./constants'); const { or, and, validate, between, testRegex, withLengthEq, withLengthGte } = require('./helpers'); const INVALID_NAMES = require('./invalid-domains.json'); +const ipRegex_ = require('ip-regex'); +const ipRegex = ipRegex_.default ?? ipRegex_; const isValidURL = and([R.is(String), testRegex(/^https?:\/\//ig)]); @@ -17,6 +19,7 @@ const validateCnameRecord = type => and([ const validateARecord = type => and([ R.propIs(Array, type), R.propSatisfies(withLengthGte(1), type), + R.all(testRegex(ipRegex.v4({ exact: true }))), ]); const validateMXRecord = type => and([ @@ -25,6 +28,12 @@ const validateMXRecord = type => and([ R.propSatisfies(R.all(isValidDomain), type), ]); +const validateAAAARecord = R.propSatisfies(and([ + R.is(Array), + withLengthGte(1), + R.all(testRegex(ipRegex.v6({ exact: true }))), +])) + const checkRestrictedNames = R.complement(R.includes(R.__, INVALID_NAMES)) const validateDomainData = validate({ @@ -75,6 +84,7 @@ const validateDomainData = validate({ [R.has('URL'), R.propSatisfies(isValidURL, 'URL')], [R.has('MX'), validateMXRecord('MX')], [R.has('TXT'), R.propSatisfies(or([ R.is(String), R.is(Array) ]), 'TXT')], + [R.has('AAAA'), validateAAAARecord('AAAA')], [R.T, R.T], ]), ]),