(REF) CryptoToken - Extract method 'parse()'
authorTim Otten <totten@civicrm.org>
Sun, 20 Dec 2020 21:28:17 +0000 (13:28 -0800)
committerTim Otten <totten@civicrm.org>
Mon, 21 Dec 2020 10:17:57 +0000 (02:17 -0800)
Civi/Crypto/CryptoToken.php

index 038f405ce2d23ce8987f64d93da901166f36eb8e..2a478fd7ce4ef715962569f5b885ae1f47c91293 100644 (file)
@@ -130,27 +130,40 @@ class CryptoToken {
     /** @var CryptoRegistry $registry */
     $registry = \Civi::service('crypto.registry');
 
+    $tokenData = $this->parse($token);
+
+    $key = $registry->findKey($tokenData['k']);
+    if (!in_array('*', $keyIdOrTag) && !in_array($tokenData['k'], $keyIdOrTag) && empty(array_intersect($keyIdOrTag, $key['tags']))) {
+      throw new CryptoException("Cannot decrypt token. Unexpected key: {$tokenData['k']}");
+    }
+
+    /** @var \Civi\Crypto\CipherSuiteInterface $cipherSuite */
+    $cipherSuite = $registry->findSuite($key['suite']);
+    $plainText = $cipherSuite->decrypt($tokenData['t'], $key);
+    return $plainText;
+  }
+
+  /**
+   * Parse the content of a token (without decrypting it).
+   *
+   * @param string $token
+   *
+   * @return array
+   * @throws \Civi\Crypto\Exception\CryptoException
+   */
+  public function parse($token): array {
     $fmt = substr($token, 1, 4);
     switch ($fmt) {
       case self::FMT_QUERY:
+        $tokenData = [];
         parse_str(substr($token, 5), $tokenData);
-        $keyId = $tokenData['k'];
-        $cipherText = \CRM_Utils_String::base64UrlDecode($tokenData['t']);
+        $tokenData['t'] = \CRM_Utils_String::base64UrlDecode($tokenData['t']);
         break;
 
       default:
         throw new CryptoException("Cannot decrypt token. Invalid format.");
     }
-
-    $key = $registry->findKey($keyId);
-    if (!in_array('*', $keyIdOrTag) && !in_array($keyId, $keyIdOrTag) && empty(array_intersect($keyIdOrTag, $key['tags']))) {
-      throw new CryptoException("Cannot decrypt token. Unexpected key: {$keyId}");
-    }
-
-    /** @var \Civi\Crypto\CipherSuiteInterface $cipherSuite */
-    $cipherSuite = $registry->findSuite($key['suite']);
-    $plainText = $cipherSuite->decrypt($cipherText, $key);
-    return $plainText;
+    return $tokenData;
   }
 
 }