class wfJWT { private $claims; const JWT_TTL = 600; const ISSUER = 600; public static function extractTokenContents($token) { if (!is_string($token)) { throw new InvalidArgumentException('Token is not a string. ' . gettype($token) . ' given.'); } // Verify the token matches the JWT format. if (!preg_match('/^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?$/', $token)) { throw new wfJWTException('Invalid token format.'); } list($header, $body, $signature) = explode('.', $token); // Test that the token is valid and not expired. $decodedHeader = base64_decode($header); if (!(is_string($decodedHeader) && $decodedHeader)) { throw new wfJWTException('Token header is invalid.'); } $header = json_decode($decodedHeader, true); if (!is_array($header)) { throw new wfJWTException('Token header is invalid.'); } $decodedBody = base64_decode($body); if (!(is_string($decodedBody) && $decodedBody)) { throw new wfJWTException('Token body is invalid.'); } $body = json_decode($decodedBody, true); if (!is_array($body)) { throw new wfJWTException('Token body is invalid.'); } return array( 'header' => $header, 'body' => $body, 'signature' => $signature, ); } /** * @param mixed $subject */ public function __construct($subject = null) { $this->claims = $this->getClaimDefaults(); $this->claims['sub'] = $subject; } /** * @return string */ public function encode() { $header = $this->encodeString($this->buildHeader()); $body = $this->encodeString($this->buildBody()); return sprintf('%s.%s.%s', $header, $body, $this->encodeString($this->sign(sprintf('%s.%s', $header, $body)))); } /** * @param string $token * @return array * @throws wfJWTException|InvalidArgumentException */ public function decode($token) { if (!is_string($token)) { throw new InvalidArgumentException('Token is not a string. ' . gettype($token) . ' given.'); } // Verify the token matches the JWT format. if (!preg_match('/^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?$/', $token)) { throw new wfJWTException('Invalid token format.'); } list($header, $body, $signature) = explode('.', $token); // Verify signature matches the supplied payload. if (!$this->verifySignature($this->decodeString($signature), sprintf('%s.%s', $header, $body))) { throw new wfJWTException('Invalid signature.'); } // Test that the token is valid and not expired. $decodedHeader = base64_decode($header); if (!(is_string($decodedHeader) && $decodedHeader)) { throw new wfJWTException('Token header is invalid.'); } $header = json_decode($decodedHeader, true); if (!( is_array($header) && array_key_exists('alg', $header) && $header['alg'] === 'HS256' && $header['typ'] === 'JWT' )) { throw new wfJWTException('Token header is invalid.'); } $decodedBody = base64_decode($body); if (!(is_string($decodedBody) && $decodedBody)) { throw new wfJWTException('Token body is invalid.'); } $body = json_decode($decodedBody, true); if (!( is_array($body) && // Check the token not before now timestamp. array_key_exists('nbf', $body) && is_numeric($body['nbf']) && $body['nbf'] <= time() && // Check the token is not expired. array_key_exists('exp', $body) && is_numeric($body['exp']) && $body['exp'] >= time() && // Check the issuer and audience is ours. $body['iss'] === 'Wordfence ' . WORDFENCE_VERSION && $body['aud'] === 'Wordfence Central' )) { throw new wfJWTException('Token is invalid or expired.'); } return array( 'header' => $header, 'body' => $body, ); } /** * @param string $string * @return string */ public function sign($string) { $salt = wp_salt('auth'); return hash_hmac('sha256', $string, $salt, true); } /** * @param string $signature * @param string $message * @return bool */ public function verifySignature($signature, $message) { return hash_equals($this->sign($message), $signature); } /** * @return string */ public function __toString() { return $this->encode(); } /** * @param string $data * @return string */ public function encodeString($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } /** * @param string $data * @return bool|string */ public function decodeString($data) { return base64_decode(strtr($data, '-_', '+/')); } /** * @return mixed|string */ protected function buildHeader() { return '{"alg":"HS256","typ":"JWT"}'; } /** * @return mixed|string */ protected function buildBody() { return json_encode($this->getClaims()); } /** * @return array */ protected function getClaimDefaults() { $now = time(); return array( 'iss' => 'Wordfence ' . WORDFENCE_VERSION, 'aud' => 'Wordfence Central', 'nbf' => $now, 'iat' => $now, 'exp' => $now + self::JWT_TTL, ); } /** * @param array $claims */ public function addClaims($claims) { if (!is_array($claims)) { throw new InvalidArgumentException(__METHOD__ . ' expects argument 1 to be array.'); } $this->setClaims(array_merge($this->getClaims(), $claims)); } /** * @return array */ public function getClaims() { return $this->claims; } /** * @param array $claims */ public function setClaims($claims) { $this->claims = $claims; } } class wfJWTException extends Exception { } Latest News | Right Tactics
HomeLatest News

Latest News

    Understanding Trenbolone Enanthate 200 Dosage

    Trenbolone Enanthate is a powerful anabolic steroid that is widely used by athletes and bodybuilders to enhance muscle mass and performance. It is known for its ability to promote muscle growth, increase strength, and improve overall physical conditioning. However, like any powerful substance, it...

    Games, Bonuses, Mobile App, and Login Ways

    Put out within the January 2006, Mister Cash is indeed one of the earliest entrants on the for the the web slot industry. The crypto payment methods at Slots Empire are Bitcoin, Ethereum, Litecoin, and Tether. These are the biggest four cryptos out there,...
    spot_img

    Keep exploring

    Democratic Majority Polling Places Being Threatened In Georgia

    Last updated on November 11th, 2024 at 01:38 pmGwinett County elections director Zach Manifold...

    Nevada Is Seeing Extremely High Youth Turnout

    Last updated on November 12th, 2024 at 04:16 pmYoung people are coming out to...

    Abortion Measure Loses In Florida After Getting 1 Million More Votes Than Ron DeSantis

    Last updated on November 13th, 2024 at 02:10 pmRepublicans showed what the undercutting of...

    Democrats Have A Path To Power Against Trump On Government Funding

    Last updated on November 13th, 2024 at 05:08 pmRepublicans may end up with majorities...

    Trump Expected To Make It Harder For Workers To Get Overtime Pay And Benefits

    Last updated on November 14th, 2024 at 03:00 pmThe incoming Trump administration is expected...

    Trump Has Already Created A Problem For Mike Johnson In The House

    It will take months for Republicans to fill the House seats that will be...

    Trump’s Immigration Plan To Kill Jobs And Raise Prices

    Last updated on November 15th, 2024 at 03:43 pmEconomists are warning that Trump’s mass...

    Bernie Sanders To Stay In Top Senate Post To Protect Social Security And Medicare

    Sen. Bernie Sanders (I-VT) announced that he will be staying as the ranking member...

    Matt Gaetz’s Nomination To Be Attorney General May Already Be Doomed

    Last updated on November 16th, 2024 at 12:56 pmTrump’s nomination of Rep. Matt Gaetz...

    Top Senate Democrat Tells House Ethics Committee To Preserve Matt Gaetz Report

    Last updated on November 17th, 2024 at 01:51 pmSenate Judiciary Committee Chair Sen. Dick...

    CDC Employees Are Resigning In Droves As They Refuse To Work For RFK Jr.

    Last updated on November 17th, 2024 at 04:40 pmTrump’s nomination of RFK Jr. to...

    Trump And Republicans Aren’t Likely To Have Total Control Of The Governmment For Long

    Trump and the Republicans are racing the clock because recent history shows that they...

    Latest articles

    Understanding Trenbolone Enanthate 200 Dosage

    Trenbolone Enanthate is a powerful anabolic steroid that is widely used by athletes and...

    Games, Bonuses, Mobile App, and Login Ways

    Put out within the January 2006, Mister Cash is indeed one of the earliest...

    The Understanding of Wagering Requirements in Casino Promotions: Why They Keep Players Coming Back

    Casino bonuses appeal to millions of players worldwide, yet few understand how online casinos...

    Mastering the basics A beginner's guide to understanding gambling principles

    Mastering the basics A beginner's guide to understanding gambling principles Understanding Gambling Fundamentals Gambling is an...