my ($self) = @_;
return if $self->{loaded};
$self->{loaded} = 1;
- my $data = fromjs(file_get_contents($self->{path}));
+ my $raw = file_get_contents($self->{path});
+ if ($raw =~ m/^(.*)$/s) { $raw = $1; } # untaint
+ my $data = fromjs($raw);
$self->{$_} = $data->{$_} for @SAVED_VALUES;
if (defined(my $keystr = $data->{key})) {
my $key = Crypt::OpenSSL::RSA->new_private_key($keystr);
my $key = $self->{key}
or die "No key was generated yet\n";
- my $payload = encode(tojs($data));
+ my $payload = $data ne '' ? encode(tojs($data)) : $data;
if (!defined($self->{nonce})) {
my $method = $self->_method('newNonce');
sub __get_result {
my ($resp, $code, $plain) = @_;
- die "expected code '$code', received '".$resp->code."'"
+ die "expected code '$code', received '".$resp->code."'\n"
if $resp->code != $code;
return $plain ? $resp->decoded_content : fromjs($resp->decoded_content);
my ($order_url, $order);
eval {
$order_url = $r->header('Location')
- or die "did not receive an order URL";
+ or die "did not receive an order URL\n";
$order = __get_result($r, 201)
};
$self->fatal("POST to '$url' failed - $@", $r) if $@;
}
# Get order status
-# GET to order URL
+# GET-as-POST to order URL
# Expects a '200 OK' reply
# returns order object
sub get_order {
my ($self, $order_url) = @_;
- my $r = $self->do(GET => $order_url);
+ my $r = $self->do(POST => $order_url, '');
my $return = eval { __get_result($r, 200); };
- $self->fatal("GET of '$order_url' failed - $@", $r) if $@;
+ $self->fatal("POST of '$order_url' failed - $@", $r) if $@;
return $return;
}
# Gets authorization object
-# GET to authorization URL
+# GET-as-POST to authorization URL
# Expects a '200 OK' reply
# returns authorization object, including challenges array
sub get_authorization {
my ($self, $auth_url) = @_;
- my $r = $self->do(GET => $auth_url);
+ my $r = $self->do(POST => $auth_url, '');
my $return = eval { __get_result($r, 200); };
- $self->fatal("GET of '$auth_url' failed - $@", $r) if $@;
+ $self->fatal("POST of '$auth_url' failed - $@", $r) if $@;
return $return;
}
}
# Get certificate
-# GET to order's certificate URL
+# GET-as-POST to order's certificate URL
# Expects a '200 OK' reply
# returns certificate chain in PEM format
sub get_certificate {
$self->fatal("no certificate URL available (yet?)", $order)
if !$order->{certificate};
- my $r = $self->do(GET => $order->{certificate});
+ my $r = $self->do(POST => $order->{certificate}, '');
my $return = eval { __get_result($r, 200, 1); };
- $self->fatal("GET of '$order->{certificate}' failed - $@", $r) if $@;
+ $self->fatal("POST of '$order->{certificate}' failed - $@", $r) if $@;
return $return;
}
# TODO: set use_jwk if revoking with certificate key
my $r = $self->do(POST => $url, $req);
eval {
- die "unexpected code $r->code" if $r->code != 200;
+ die "unexpected code $r->code\n" if $r->code != 200;
};
$self->fatal("POST to '$url' failed - $@", $r) if $@;
}
my $headers = HTTP::Headers->new();
$headers->header('Content-Type' => 'application/jose+json');
- my $content = $self->jws($use_jwk, $data, $url) if defined($data);
+ my $content = defined($data) ? $self->jws($use_jwk, $data, $url) : undef;
my $request;
if (defined($content)) {
$content = tojs($content);
if ($res->code == 400 && $res->decoded_content) {
my $parsed_content = fromjs($res->decoded_content);
if ($parsed_content->{type} eq 'urn:ietf:params:acme:error:badNonce') {
- warn("bad Nonce, retrying");
+ warn("bad Nonce, retrying\n");
$self->{nonce} = $res->header('Replay-Nonce');
return $self->do($method, $url, $data, $use_jwk);
}