At
view release on metacpan or search on metacpan
lib/At/Protocol/DID.pm view on Meta::CPAN
}
#~ Taken from https://github.com/bluesky-social/atproto/blob/main/packages/syntax/src/did.ts
#~ Human-readable constraints:
#~ - valid W3C DID (https://www.w3.org/TR/did-core/#did-syntax)
#~ - entire URI is ASCII: [a-zA-Z0-9._:%-]
#~ - always starts "did:" (lower-case)
#~ - method name is one or more lower-case letters, followed by ":"
#~ - remaining identifier can have any of the above chars, but can not end in ":"
#~ - it seems that a bunch of ":" can be included, and don't need spaces between
#~ - "%" is used only for "percent encoding" and must be followed by two hex characters (and thus can't end in "%")
#~ - query ("?") and fragment ("#") stuff is defined for "DID URIs", but not as part of identifier itself
#~ - "The current specification does not take a position on the maximum length of a DID"
#~ - in current atproto, only allowing did:plc and did:web. But not *forcing* this at lexicon layer
#~ - hard length limit of 8KBytes
#~ - not going to validate "percent encoding" here
sub ensureValidDid ($did) {
# check that all chars are boring ASCII
throw InvalidDidError('Disallowed characters in DID (ASCII letters, digits, and a couple other characters only)')
unless $did =~ /^[a-zA-Z0-9._:%-]*$/;
#
my @parts = split ':', $did, -1; # negative limit, ftw
throw InvalidDidError('DID requires prefix, method, and method-specific content') if @parts < 3;
#
throw InvalidDidError('DID requires "did:" prefix') if $parts[0] ne 'did';
lib/At/Protocol/URI.pm view on Meta::CPAN
#~ Validation utils from https://github.com/bluesky-social/atproto/blob/main/packages/syntax/src/aturi_validation.ts
#~ Human-readable constraints on ATURI:
#~ - following regular URLs, a 8KByte hard total length limit
#~ - follows ATURI docs on website
#~ - all ASCII characters, no whitespace. non-ASCII could be URL-encoded
#~ - starts "at://"
#~ - "authority" is a valid DID or a valid handle
#~ - optionally, follow "authority" with "/" and valid NSID as start of path
#~ - optionally, if NSID given, follow that with "/" and rkey
#~ - rkey path component can include URL-encoded ("percent encoded"), or:
#~ ALPHA / DIGIT / "-" / "." / "_" / "~" / ":" / "@" / "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
#~ [a-zA-Z0-9._~:@!$&'\(\)*+,;=-]
#~ - rkey must have at least one char
#~ - regardless of path component, a fragment can follow as "#" and then a JSON pointer (RFC-6901)
sub ensureValidAtUri($uri) {
my $fragmentPart;
my @uriParts = split '#', $uri, -1; # negative limit, ftw
throw InvalidAtUriError('ATURI can have at most one "#", separating fragment out') if scalar @uriParts > 2;
$fragmentPart = $uriParts[1];
$uri = $uriParts[0];
( run in 0.553 second using v1.01-cache-2.11-cpan-39bf76dae61 )