Page MenuHomeDevCentral

No OneTemporary

diff --git a/XHubSignature.php b/XHubSignature.php
index 5bfe71c..cba698b 100644
--- a/XHubSignature.php
+++ b/XHubSignature.php
@@ -1,132 +1,147 @@
<?php
namespace Keruald\GitHub;
class XHubSignature {
///
/// Properties
///
/**
* The secret token to secure messages
*
* @var string
*/
private $secret;
/**
* The hash algorithm
*
* @var string
*/
private $hashAlgo;
/**
* The payload
*
* @var string
*/
public $payload;
/**
* The signature delivered with the payload, to validate it
*
* @var string
*/
public $signature;
///
/// Constants
///
/**
* The default hash algorithm to use if none is offered
*/
const DEFAULT_HASH_ALGO = 'sha1';
///
/// Constructor
///
/**
* Initializes a new instance of the XHubSignature class
*
* @param string $secret the secret token
* @param string $algo the algorithm to use to compute hashs [facultative]
*/
public function __construct ($secret, $algo = self::DEFAULT_HASH_ALGO) {
$this->secret = $secret;
$this->hashAlgo = $algo;
}
///
/// Signature methods
///
/**
* Computes the signature for the current payload
*
* @return string the payload signature
*/
public function compute () {
return hash_hmac($this->hashAlgo, $this->payload, $this->secret);
}
/**
* Validates the signature
*
* @return bool true if the signature is correct; otherwise, false.
*/
public function validate () {
// Comparison with hash_equals allows to mitigate timing attacks.
return hash_equals($this->compute(), $this->signature);
}
///
/// Static helper methods
///
/**
* Computes a signature for the specified secret and payload
*
* @param string $secret the secret token to secure messages
* @param string $payload the payload
* @param string $algo the hash algorithm [facultative]
*
* @return string the payload signature
*/
public static function hashPayload(
$secret,
$payload,
$algo = self::DEFAULT_HASH_ALGO
) {
$instance = new static($secret, $algo);
$instance->payload = $payload;
return $instance->compute();
}
/**
* Validates a payload against specified secret
*
* @param string $secret the secret token to secure messages
* @param string $payload the payload
* @param string $signature the signature delivered with the payload
* @param string $algo the hash algorithm [facultative]
*
* @return bool true if the signature is correct; otherwise, false.
*/
public static function validatePayload (
$secret,
$payload,
$signature,
$algo = self::DEFAULT_HASH_ALGO
) {
$instance = new static($secret, $algo);
$instance->payload = $payload;
$instance->signature = $signature;
return $instance->validate();
}
+
+ /**
+ * Parses a X-Hub-Signature field from headers and gets the signature part
+ *
+ * @param string $header the header value
+ * @return string the signature
+ */
+ public static function parseSignature ($header) {
+ if (strpos($header, '=') === false) {
+ return $header;
+ }
+
+ $data = explode('=', $header, 2);
+ return $data[1];
+ }
}
diff --git a/tests/XHubSignatureTest.php b/tests/XHubSignatureTest.php
index 0646189..e2add85 100644
--- a/tests/XHubSignatureTest.php
+++ b/tests/XHubSignatureTest.php
@@ -1,73 +1,84 @@
<?php
use Keruald\GitHub\XHubSignature;
require 'XHubSignatureConstants.php';
class XHubSignatureTest extends PHPUnit_Framework_TestCase {
protected $defaultInstance;
protected $tigerInstance;
protected function setUp() {
$this->defaultInstance = new XHubSignature(SECRET);
$this->tigerInstance = new XHubSignature(SECRET, TIGER_ALGO);
$this->defaultInstance->payload = DEFAULT_PAYLOAD;
$this->tigerInstance->payload = TIGER_PAYLOAD;
}
public function testValidate () {
$this->defaultInstance->signature = "";
$this->assertFalse($this->defaultInstance->validate());
$this->defaultInstance->signature = "bad signature";
$this->assertFalse($this->defaultInstance->validate());
$this->defaultInstance->signature = DEFAULT_SIGNATURE;
$this->assertTrue($this->defaultInstance->validate());
}
public function testCompute () {
$this->assertSame(
DEFAULT_SIGNATURE,
$this->defaultInstance->compute()
);
$this->assertSame(
TIGER_SIGNATURE,
$this->tigerInstance->compute()
);
}
///
/// Test static helper methods
///
/**
* @covers XHubSignature::validatePayload
*/
public function testhashPayload () {
$this->assertSame(
EMPTY_DEFAULT_HASH_ALGO_SIGNATURE,
XHubSignature::hashPayload("", "")
);
$this->assertSame(
TIGER_SIGNATURE,
XHubSignature::hashPayload(SECRET, TIGER_PAYLOAD, TIGER_ALGO)
);
}
/**
* @covers XHubSignature::validatePayload
*/
public function testValidatePayload () {
$this->assertFalse(XHubSignature::validatePayload("", "", ""));
$this->assertTrue(XHubSignature::validatePayload(
SECRET,
TIGER_PAYLOAD,
TIGER_SIGNATURE,
TIGER_ALGO
));
}
+
+ public function testParseSignature () {
+ $this->assertSame(
+ TIGER_SIGNATURE,
+ XHubSignature::parseSignature(TIGER_SIGNATURE)
+ );
+ $this->assertSame(
+ TIGER_SIGNATURE,
+ XHubSignature::parseSignature(TIGER_ALGO . '=' . TIGER_SIGNATURE)
+ );
+ }
}

File Metadata

Mime Type
text/x-diff
Expires
Thu, Sep 18, 10:34 (6 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2990482
Default Alt Text
(6 KB)

Event Timeline