JMAP-Tester
view release on metacpan or search on metacpan
lib/JMAP/Tester.pm view on Meta::CPAN
#pod JMAP::Tester object, and in futures mode will return a future that will resolve
#pod to the L<JMAP::Tester::Result::Auth> object.
#pod
#pod =cut
sub _get_client_session_future ($self, $auth_uri = undef) {
$auth_uri //= $self->authentication_uri;
my $auth_req = HTTP::Request->new(
GET => $auth_uri,
[
$self->_maybe_auth_header,
'Accept' => 'application/json',
],
);
my $future = $self->ua->request($self, $auth_req, 'auth')->then(sub {
my ($res) = @_;
unless ($res->code == 200) {
return Future->fail(
JMAP::Tester::Result::Failure->new({
ident => 'failure to get updated authentication data',
http_response => $res,
diagnostic_dumper => $self->default_diagnostic_dumper,
})
);
}
my $client_session = $self->json_decode( $res->decoded_content );
my $auth = JMAP::Tester::Result::Auth->new({
http_response => $res,
client_session => $client_session,
diagnostic_dumper => $self->default_diagnostic_dumper,
});
return Future->done($auth);
});
}
sub get_client_session ($self, $auth_uri = undef) {
my $future = $self->_get_client_session_future($auth_uri);
return $self->should_return_futures ? $future : $future->$Failsafe->get;
}
#pod =method update_client_session
#pod
#pod $tester->update_client_session;
#pod $tester->update_client_session($auth_uri);
#pod
#pod This method fetches the content at the authentication endpoint and uses it to
#pod configure the tester's target URIs and signing keys.
#pod
#pod This method respects the C<should_return_futures> attributes of the
#pod JMAP::Tester object, and in futures mode will return a future that will resolve
#pod to the Result.
#pod
#pod =cut
sub update_client_session ($self, $auth_uri = undef) {
my $future = $self->_get_client_session_future($auth_uri)->then(sub {
my ($auth) = @_;
$self->configure_from_client_session($auth->client_session);
return Future->done($auth);
});
return $self->should_return_futures ? $future : $future->$Failsafe->get;
}
#pod =method configure_from_client_session
#pod
#pod $tester->configure_from_client_session($client_session);
#pod
#pod Given a client session object (like those stored in an Auth result), this
#pod reconfigures the testers access token, signing keys, URIs, and so forth. This
#pod method is used internally when logging in.
#pod
#pod =cut
sub configure_from_client_session ($self, $client_session) {
# It's not crazy to think that we'd also try to pull the primary accountId
# out of the accounts in the auth struct, but I don't think there's a lot to
# gain by doing that yet. Maybe later we'd use it to set the default
# X-JMAP-AccountId or other things, but I think there are too many open
# questions. I'm leaving it out on purpose for now. -- rjbs, 2016-11-18
# This is no longer fatal because you might be an anonymous session that
# needs to call this to fetch an updated signing key. -- rjbs, 2017-03-23
# abort("no accessToken in client session object")
# unless $client_session->{accessToken};
$self->_access_token($client_session->{accessToken});
if ($client_session->{signingId} && $client_session->{signingKey}) {
$self->_jwt_config({
signingId => $client_session->{signingId},
signingKey => $client_session->{signingKey},
signingKeyValidUntil => $client_session->{signingKeyValidUntil},
});
} else {
$self->_jwt_config(undef);
}
for my $type (qw(api download upload)) {
if (defined (my $uri = $client_session->{"${type}Url"})) {
my $setter = "$type\_uri";
$self->$setter($uri);
} else {
my $clearer = "clear_$type\_uri";
$self->$clearer;
}
}
$self->_primary_accounts($client_session->{primaryAccounts});
$self->_accounts($client_session->{accounts});
return;
}
( run in 0.811 second using v1.01-cache-2.11-cpan-bbe5e583499 )