syntax: update to allow non-leading digits in NSID 'name' part (#3633)

* syntax: allow non-leading digits in NSID 'name' part

* update (copied) interop tests

* prettier
This commit is contained in:
bnewbold 2025-03-11 18:04:14 -07:00 committed by GitHub
parent 9332c0f315
commit a07aca9737
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 13 additions and 9 deletions

View File

@ -32,3 +32,4 @@ at://did:abc:123/io.nsid.someFunc/-
at://did:abc:123/io.nsid.someFunc/_
at://did:abc:123/io.nsid.someFunc/~
at://did:abc:123/io.nsid.someFunc/...
at://did:plc:asdf123/com.atproto.feed.postV2

View File

@ -3,15 +3,13 @@ com.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.foo
com.example.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
com.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.foo
# invliad examples
# invalid examples
com.example.foo.*
com.example.foo.blah*
com.example.foo.*blah
com.example.f00
com.exa💩ple.thing
a-0.b-1.c-3
a-0.b-1.c-o
a0.b1.c3
1.0.0.127.record
0two.example.foo
example.com
@ -29,4 +27,4 @@ com.atproto.feed.p*st
com.atproto.feed.po#t
com.atproto.feed.p!ot
com.example-.foo
com.example.fooBar.2

View File

@ -5,6 +5,7 @@ com.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle
# valid examples
com.example.fooBar
com.example.fooBarV2
net.users.bob.ping
a.b.c
m.xn--masekowski-d0b.pl
@ -18,6 +19,8 @@ test.12345.record
a01.thing.record
a.0.c
xn--fiqs8s.xn--fiqa61au8b7zsevnm8ak20mc4a87e.record.two
a0.b1.c3
com.example.f00
# allows onion (Tor) NSIDs
onion.expyuzz4wqqyqhjn.spec.getThing

View File

@ -87,8 +87,10 @@ export const ensureValidNsid = (nsid: string): void => {
if (/^[0-9]/.test(l) && i === 0) {
throw new InvalidNsidError('NSID first part may not start with a digit')
}
if (!/^[a-zA-Z]+$/.test(l) && i + 1 === labels.length) {
throw new InvalidNsidError('NSID name part must be only letters')
if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(l) && i + 1 === labels.length) {
throw new InvalidNsidError(
'NSID name part must be only letters and digits (and no leading digit)',
)
}
}
}
@ -97,7 +99,7 @@ export const ensureValidNsidRegex = (nsid: string): void => {
// simple regex to enforce most constraints via just regex and length.
// hand wrote this regex based on above constraints
if (
!/^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z]([a-zA-Z]{0,61}[a-zA-Z])?)$/.test(
!/^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z]([a-zA-Z0-9]{0,62})?)$/.test(
nsid,
)
) {

View File

@ -83,15 +83,15 @@ describe('NSID validation', () => {
expectValid('a01.thing.record')
expectValid('a.0.c')
expectValid('xn--fiqs8s.xn--fiqa61au8b7zsevnm8ak20mc4a87e.record.two')
expectValid('a0.b1.c3')
expectValid('com.example.f00')
expectInvalid('com.example.foo.*')
expectInvalid('com.example.foo.blah*')
expectInvalid('com.example.foo.*blah')
expectInvalid('com.example.f00')
expectInvalid('com.exa💩ple.thing')
expectInvalid('a-0.b-1.c-3')
expectInvalid('a-0.b-1.c-o')
expectInvalid('a0.b1.c3')
expectInvalid('1.0.0.127.record')
expectInvalid('0two.example.foo')
expectInvalid('example.com')