The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

=encoding utf-8
=head1 NAME
Net::ACME::Utils - utilities for C<Net::ACME>
=head1 SYNOPSIS
Net::ACME::Utils::verify_token('blah/blah'); #dies
Net::ACME::Utils::verify_token('blah-blah'); #succeeds
=head1 DESCRIPTION
This module is a home for “miscellaneous” functions that just aren’t
in other modules. Think carefully before expanding this module; it’s
probably better, if possible, to put new functionality into more
topic-specific modules rather than this “catch-all” one.
=cut
use strict;
use MIME::Base64 ();
*_to_base64url = \&MIME::Base64::encode_base64url;
use Net::ACME::X ();
my %KEY_OBJ_CACHE;
#Clear out the cache prior to global destruction.
END {
%KEY_OBJ_CACHE = ();
}
sub verify_token {
my ($token) = @_;
#cf. eval_bug.readme
my $eval_err = $@;
eval {
die Net::ACME::X::create('Empty') if !defined $token || !length $token;
die Net::ACME::X::create('Empty') if $token =~ m<\A\s*\z>;
if ( $token =~ m<[^0-9a-zA-Z_-]> ) {
die Net::ACME::X::create( 'InvalidCharacters', "“$token” contains invalid Base64-URL characters.", { value => $token } );
}
};
if ($@) {
my $message = $@->to_string();
die Net::ACME::X::create( 'InvalidParameter', "“$token” is not a valid ACME token. ($message)" );
}
$@ = $eval_err;
return;
}
#Use this to avoid a Try::Tiny dependency.
sub thing_isa {
my ($thing, $class) = @_;
#cf. eval_bug.readme
my $eval_err = $@;
my $isa = eval { $thing->isa($class) };
$@ = $eval_err;
return $isa;
}
1;