10use Wikimedia\Timestamp\ConvertibleTimestamp;
11use Wikimedia\Timestamp\TimestampFormat as TS;
19class Token implements Stringable {
40 $this->secret = $secret;
55 $suffixLen = strlen( self::SUFFIX );
56 $len = strlen( $token );
57 if ( $len <= 32 + $suffixLen ||
58 substr( $token, -$suffixLen ) !== self::SUFFIX ||
59 strspn( $token,
'0123456789abcdef' ) + $suffixLen !== $len
64 return hexdec( substr( $token, 32, -$suffixLen ) );
73 return hash_hmac(
'md5', $timestamp . $this->salt, $this->secret,
false ) .
74 dechex( $timestamp ) .
96 public function match( $userToken, $maxAge =
null ) {
101 if ( $timestamp ===
null ) {
104 if ( $maxAge !==
null && $timestamp < (
int)ConvertibleTimestamp::now( TS::UNIX ) - $maxAge ) {
110 return hash_equals( $sessionToken, $userToken );