@@ -42,6 +42,15 @@ public function __construct($secret)
42
42
*/
43
43
public function sign ($ uri )
44
44
{
45
+ $ url = parse_url ($ uri );
46
+ if (isset ($ url ['query ' ])) {
47
+ parse_str ($ url ['query ' ], $ params );
48
+ } else {
49
+ $ params = array ();
50
+ }
51
+
52
+ $ uri = $ this ->buildUrl ($ url , $ params );
53
+
45
54
return $ uri .(false === (strpos ($ uri , '? ' )) ? '? ' : '& ' ).'_hash= ' .$ this ->computeHash ($ uri );
46
55
}
47
56
@@ -58,15 +67,43 @@ public function sign($uri)
58
67
*/
59
68
public function check ($ uri )
60
69
{
61
- if (!preg_match ('/^(.*)(?:\?|&)_hash=(.+?)$/ ' , $ uri , $ matches )) {
70
+ $ url = parse_url ($ uri );
71
+ if (isset ($ url ['query ' ])) {
72
+ parse_str ($ url ['query ' ], $ params );
73
+ } else {
74
+ $ params = array ();
75
+ }
76
+
77
+ if (empty ($ params ['_hash ' ])) {
62
78
return false ;
63
79
}
64
80
65
- return $ this ->computeHash ($ matches [1 ]) === $ matches [2 ];
81
+ $ hash = urlencode ($ params ['_hash ' ]);
82
+ unset($ params ['_hash ' ]);
83
+
84
+ return $ this ->computeHash ($ this ->buildUrl ($ url , $ params )) === $ hash ;
66
85
}
67
86
68
87
private function computeHash ($ uri )
69
88
{
70
89
return urlencode (base64_encode (hash_hmac ('sha1 ' , $ uri , $ this ->secret , true )));
71
90
}
91
+
92
+ private function buildUrl (array $ url , array $ params = array ())
93
+ {
94
+ ksort ($ params );
95
+ $ url ['query ' ] = http_build_query ($ params );
96
+
97
+ $ scheme = isset ($ url ['scheme ' ]) ? $ url ['scheme ' ].':// ' : '' ;
98
+ $ host = isset ($ url ['host ' ]) ? $ url ['host ' ] : '' ;
99
+ $ port = isset ($ url ['port ' ]) ? ': ' .$ url ['port ' ] : '' ;
100
+ $ user = isset ($ url ['user ' ]) ? $ url ['user ' ] : '' ;
101
+ $ pass = isset ($ url ['pass ' ]) ? ': ' .$ url ['pass ' ] : '' ;
102
+ $ pass = ($ user || $ pass ) ? "$ pass@ " : '' ;
103
+ $ path = isset ($ url ['path ' ]) ? $ url ['path ' ] : '' ;
104
+ $ query = isset ($ url ['query ' ]) && $ url ['query ' ] ? '? ' .$ url ['query ' ] : '' ;
105
+ $ fragment = isset ($ url ['fragment ' ]) ? '# ' .$ url ['fragment ' ] : '' ;
106
+
107
+ return $ scheme .$ user .$ pass .$ host .$ port .$ path .$ query .$ fragment ;
108
+ }
72
109
}
0 commit comments