summaryrefslogtreecommitdiff
path: root/script/mojocookiecheck.pl
blob: a078b8caf68af854561b01b21392b8253e273b83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/env perl

use v5.34;
use warnings;
use utf8;
use autodie;

use Digest::SHA 'hmac_sha256_hex';
use JSON::PP 'decode_json';
use MIME::Base64 'decode_base64';
use Pod::Usage 'pod2usage';


sub main {
    pod2usage if !@ARGV || $ARGV[0] eq '-h' || $ARGV[0] eq '--help';

    die 'invalid number of args' unless @ARGV == 1 || @ARGV == 3;
    my @check_args = $ARGV[0];
    if (@ARGV == 3) {
        push @check_args, $ARGV[1], $ARGV[2];
    }

    my ($match, $res) = check_cookie(@check_args);

    if (defined $match && !$match) {
        say STDERR 'mismatched mac';
        exit 1;
    }

    my $json = decode_json $res;
    print JSON::PP->new()->pretty(1)->canonical(1)->encode($json);
}

sub check_cookie {
    my $cookie = shift;

    # split
    my $splitAt = rindex $cookie, '--';
    die 'invalid format' if $splitAt == -1;
    my $val = substr $cookie, 0, $splitAt;
    my $sig = substr $cookie, $splitAt+2;

    my $match;
    if (@_) {
        my ($cookie_name, $secret) = @_;
        # hmac
        my $check = hmac_sha256_hex "$cookie_name=$val", $secret;
        $match = $sig eq $check;
    }

    # change base64 padding
    $val =~ s/-*$/'=' x length $&/e;

    # base64
    my $res = decode_base64 $val;

    # cookie content padding
    $res =~ s/Z*$//;

    return $match, $res;
}

main unless caller;

1

__END__

=encoding utf-8

=head1 NAME

mojocookiecheck - Prints out a Signed Cookie of Mojolicious

=head1 SYNOPSIS

mojocookiecheck.pl [OPTIONS] COOKIE_BODY [COOKIE_NAME SECRET]

  Options:
    -h  --help    print this help

=head1 DESCRIPTION

This is a cookie checker for Mojolicious that converts them from an opaque
character string to something nicely readable. It also can check the HMAC.