summaryrefslogtreecommitdiff
path: root/Postman/Postman-Mail/mailgun/vendor/mailgun/mailgun-php/src/Mailgun/Lists/OptInHandler.php
blob: a263563eec0e37c30b4b6a47aef2520afbcd1e69 (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
<?php

/*
 * Copyright (C) 2013-2016 Mailgun
 *
 * This software may be modified and distributed under the terms
 * of the MIT license. See the LICENSE file for details.
 */

namespace Mailgun\Lists;

/**
 * This class is used for creating a unique hash for
 * mailing list subscription double-opt in requests.
 *
 * @see https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Lists/README.md
 */
class OptInHandler
{
    /**
     * @param string $mailingList
     * @param string $secretAppId
     * @param string $recipientAddress
     *
     * @return string
     */
    public function generateHash($mailingList, $secretAppId, $recipientAddress)
    {
        $innerPayload = ['r' => $recipientAddress, 'l' => $mailingList];
        $encodedInnerPayload = base64_encode(json_encode($innerPayload));

        $innerHash = hash_hmac('sha1', $encodedInnerPayload, $secretAppId);
        $outerPayload = ['h' => $innerHash, 'p' => $encodedInnerPayload];

        return urlencode(base64_encode(json_encode($outerPayload)));
    }

    /**
     * @param string $secretAppId
     * @param string $uniqueHash
     *
     * @return array|bool
     */
    public function validateHash($secretAppId, $uniqueHash)
    {
        $decodedOuterPayload = json_decode(base64_decode(urldecode($uniqueHash)), true);

        $decodedHash = $decodedOuterPayload['h'];
        $innerPayload = $decodedOuterPayload['p'];

        $decodedInnerPayload = json_decode(base64_decode($innerPayload), true);
        $computedInnerHash = hash_hmac('sha1', $innerPayload, $secretAppId);

        if ($computedInnerHash == $decodedHash) {
            return ['recipientAddress' => $decodedInnerPayload['r'], 'mailingList' => $decodedInnerPayload['l']];
        }

        return false;
    }
}