28459b4ecd394ddc3fb0b4269277af03daa5537e
[yaffs-website] / vendor / symfony / http-kernel / UriSigner.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\HttpKernel;
13
14 /**
15  * Signs URIs.
16  *
17  * @author Fabien Potencier <fabien@symfony.com>
18  */
19 class UriSigner
20 {
21     private $secret;
22     private $parameter;
23
24     /**
25      * @param string $secret    A secret
26      * @param string $parameter Query string parameter to use
27      */
28     public function __construct($secret, $parameter = '_hash')
29     {
30         $this->secret = $secret;
31         $this->parameter = $parameter;
32     }
33
34     /**
35      * Signs a URI.
36      *
37      * The given URI is signed by adding the query string parameter
38      * which value depends on the URI and the secret.
39      *
40      * @param string $uri A URI to sign
41      *
42      * @return string The signed URI
43      */
44     public function sign($uri)
45     {
46         $url = parse_url($uri);
47         if (isset($url['query'])) {
48             parse_str($url['query'], $params);
49         } else {
50             $params = array();
51         }
52
53         $uri = $this->buildUrl($url, $params);
54
55         return $uri.(false === strpos($uri, '?') ? '?' : '&').$this->parameter.'='.$this->computeHash($uri);
56     }
57
58     /**
59      * Checks that a URI contains the correct hash.
60      *
61      * @param string $uri A signed URI
62      *
63      * @return bool True if the URI is signed correctly, false otherwise
64      */
65     public function check($uri)
66     {
67         $url = parse_url($uri);
68         if (isset($url['query'])) {
69             parse_str($url['query'], $params);
70         } else {
71             $params = array();
72         }
73
74         if (empty($params[$this->parameter])) {
75             return false;
76         }
77
78         $hash = urlencode($params[$this->parameter]);
79         unset($params[$this->parameter]);
80
81         return $this->computeHash($this->buildUrl($url, $params)) === $hash;
82     }
83
84     private function computeHash($uri)
85     {
86         return urlencode(base64_encode(hash_hmac('sha256', $uri, $this->secret, true)));
87     }
88
89     private function buildUrl(array $url, array $params = array())
90     {
91         ksort($params, SORT_STRING);
92         $url['query'] = http_build_query($params, '', '&');
93
94         $scheme = isset($url['scheme']) ? $url['scheme'].'://' : '';
95         $host = isset($url['host']) ? $url['host'] : '';
96         $port = isset($url['port']) ? ':'.$url['port'] : '';
97         $user = isset($url['user']) ? $url['user'] : '';
98         $pass = isset($url['pass']) ? ':'.$url['pass'] : '';
99         $pass = ($user || $pass) ? "$pass@" : '';
100         $path = isset($url['path']) ? $url['path'] : '';
101         $query = isset($url['query']) && $url['query'] ? '?'.$url['query'] : '';
102         $fragment = isset($url['fragment']) ? '#'.$url['fragment'] : '';
103
104         return $scheme.$user.$pass.$host.$port.$path.$query.$fragment;
105     }
106 }