Skip to content
This repository has been archived by the owner on Nov 14, 2023. It is now read-only.

Commit

Permalink
Update majority of tests using Guzzle PSR Request
Browse files Browse the repository at this point in the history
  • Loading branch information
navitronic committed Jul 7, 2016
1 parent 2d9a9a5 commit e17513d
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 49 deletions.
7 changes: 5 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,13 @@
"require": {
"php": ">=5.5",
"symfony/http-foundation": "~2.8|~3.0",
"psr/http-message": "^1.0"
"psr/http-message": "^1.0",
"symfony/psr-http-message-bridge": "^0.2.0",
"zendframework/zend-diactoros": "^1.1"
},
"require-dev": {
"phpunit/phpunit": "~4.8",
"friendsofphp/php-cs-fixer": "^1.11"
"friendsofphp/php-cs-fixer": "^1.11",
"guzzlehttp/psr7": "^1.2"
}
}
16 changes: 9 additions & 7 deletions src/Signer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace HttpSignatures;

use Psr\Http\Message\MessageInterface;

class Signer
{
/** @var Key */
Expand All @@ -26,18 +28,19 @@ public function __construct($key, $algorithm, $headerList)
}

/**
* @param $message
* @param MessageInterface $message
* @return MessageInterface
*/
public function sign($message)
{
$signatureParameters = $this->signatureParameters($message);
$message->headers->set('Signature', $signatureParameters->string());
$message->headers->set('Authorization', 'Signature '.$signatureParameters->string());
$message = $message->withAddedHeader("Signature", $signatureParameters->string());
$message = $message->withAddedHeader("Authorization", "Signature " . $signatureParameters->string());
return $message;
}

/**
* @param $message
*
* @param MessageInterface $message
* @return SignatureParameters
*/
private function signatureParameters($message)
Expand All @@ -51,8 +54,7 @@ private function signatureParameters($message)
}

/**
* @param $message
*
* @param MessageInterface $message
* @return Signature
*/
private function signature($message)
Expand Down
5 changes: 3 additions & 2 deletions src/SigningString.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ private function line($name)
private function headerValue($name)
{
if ($this->message->hasHeader($name)) {
return $this->message->getHeader($name);
$header = $this->message->getHeader($name);
return end($header);
} else {
throw new SignedHeaderNotPresentException("Header '$name' not in message");
}
Expand All @@ -93,7 +94,7 @@ private function getPathWithQueryString()
{
$path = $this->message->getUri()->getPath();
$qs = $this->message->getUri()->getQuery();
if ($qs === null) {
if (empty($qs)) {
return $path;
} else {
return "$path?$qs";
Expand Down
4 changes: 3 additions & 1 deletion src/Verification.php
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@ private function signatureHeader()
*/
private function fetchHeader($name)
{
return $this->message->getHeader($name);
// grab the most recently set header.
$header = $this->message->getHeader($name);
return end($header);
}
}
18 changes: 8 additions & 10 deletions tests/ContextTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

namespace HttpSignatures\Tests;

use GuzzleHttp\Psr7\Request;
use HttpSignatures\Context;
use Symfony\Component\HttpFoundation\Request;

class ContextTest extends \PHPUnit_Framework_TestCase
{
Expand All @@ -20,10 +20,8 @@ public function setUp()

public function testSigner()
{
$message = Request::create('/path?query=123', 'GET');
$message->headers->replace(array('date' => 'today', 'accept' => 'llamas'));

$this->context->signer()->sign($message);
$message = new Request('GET', '/path?query=123', ['date' => 'today', 'accept' => 'llamas']);
$message = $this->context->signer()->sign($message);

$expectedString = implode(',', array(
'keyId="pda"',
Expand All @@ -34,22 +32,22 @@ public function testSigner()

$this->assertEquals(
$expectedString,
$message->headers->get('Signature')
$message->getHeader('Signature')[0]
);

$this->assertEquals(
'Signature ' . $expectedString,
$message->headers->get('Authorization')
$message->getHeader('Authorization')[0]
);
}

public function testVerifier()
{
$message = Request::create('/path?query=123', 'GET');
$message->headers->replace(array(
$message = $this->context->signer()->sign(new Request('GET', '/path?query=123', [
'Signature' => 'keyId="pda",algorithm="hmac-sha1",headers="date",signature="x"',
'Date' => 'x',
));
]));

// assert it works without errors; correctness of results tested elsewhere.
$this->assertTrue(is_bool($this->context->verifier()->isValid($message)));
}
Expand Down
43 changes: 37 additions & 6 deletions tests/SigningStringTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace HttpSignatures\Tests;

use GuzzleHttp\Psr7\Request;
use HttpSignatures\HeaderList;
use HttpSignatures\SigningString;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;

class SigningStringTest extends \PHPUnit_Framework_TestCase
{
private $message;

public function testWithoutQueryString()
{
$headerList = new HeaderList(array('(request-target)'));
Expand Down Expand Up @@ -43,6 +43,28 @@ public function testSigningStringWithUnorderedQueryParameters()
);
}

public function testSigningStringWithOrderedQueryParametersSymfonyRequest()
{
$headerList = new HeaderList(array('(request-target)', 'date'));
$ss = new SigningString($headerList, $this->symfonyMessage('/path?a=antelope&z=zebra'));

$this->assertEquals(
"(request-target): get /path?a=antelope&z=zebra\ndate: Mon, 28 Jul 2014 15:39:13 -0700",
$ss->string()
);
}

public function testSigningStringWithUnorderedQueryParametersSymfonyRequest()
{
$headerList = new HeaderList(array('(request-target)', 'date'));
$ss = new SigningString($headerList, $this->symfonyMessage('/path?z=zebra&a=antelope'));

$this->assertEquals(
"(request-target): get /path?z=zebra&a=antelope\ndate: Mon, 28 Jul 2014 15:39:13 -0700",
$ss->string()
);
}

/**
* @expectedException HttpSignatures\Exception
*/
Expand All @@ -55,8 +77,17 @@ public function testSigningStringErrorForMissingHeader()

private function message($path)
{
$m = Request::create($path, 'GET');
$m->headers->replace(array('date' => 'Mon, 28 Jul 2014 15:39:13 -0700'));
return $m;
return new Request('GET', $path, ['date' => 'Mon, 28 Jul 2014 15:39:13 -0700']);
}

private function symfonyMessage($path)
{
$symfonyRequest = SymfonyRequest::create($path, 'GET');
$symfonyRequest->headers->replace(array('date' => 'Mon, 28 Jul 2014 15:39:13 -0700'));

$psr7Factory = new DiactorosFactory();
$psrRequest = $psr7Factory->createRequest($symfonyRequest);

return $psrRequest;
}
}
41 changes: 20 additions & 21 deletions tests/VerifierTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

namespace HttpSignatures\Tests;

use GuzzleHttp\Psr7\Request;
use HttpSignatures\KeyStore;
use HttpSignatures\Verifier;
use Symfony\Component\HttpFoundation\Request;

class VerifierTest extends \PHPUnit_Framework_TestCase
{
Expand Down Expand Up @@ -43,11 +43,10 @@ private function setUpValidMessage()
"cS2VvndvReuTLy52Ggi4j6UaDqGm9hMb4z0xJZ6adqU="
);

$this->message = Request::create('/path?query=123', 'GET');
$this->message->headers->replace(array(
$this->message = new Request('GET', '/path?query=123', [
"Date" => self::DATE,
"Signature" => $signatureHeader
));
]);
}

public function testVerifyValidMessage()
Expand All @@ -57,49 +56,49 @@ public function testVerifyValidMessage()

public function testVerifyValidMessageAuthorizationHeader()
{
$this->message->headers->set('Authorization', "Signature {$this->message->headers->get('Signature')}");
$this->message->headers->remove('Signature');
$message = $this->message->withHeader('Authorization', "Signature {$this->message->getHeader('Signature')[0]}");
$message = $message->withoutHeader('Signature');

$this->assertTrue($this->verifier->isValid($this->message));
}

public function testRejectTamperedRequestMethod()
{
$this->message->setMethod('POST');
$this->assertFalse($this->verifier->isValid($this->message));
$message = $this->message->withMethod('POST');
$this->assertFalse($this->verifier->isValid($message));
}

public function testRejectTamperedDate()
{
$this->message->headers->set('Date', self::DATE_DIFFERENT);
$this->assertFalse($this->verifier->isValid($this->message));
$message = $this->message->withHeader('Date', self::DATE_DIFFERENT);
$this->assertFalse($this->verifier->isValid($message));
}

public function testRejectTamperedSignature()
{
$this->message->headers->set(
$message = $this->message->withHeader(
'Signature',
preg_replace('/signature="/', 'signature="x', $this->message->headers->get('Signature'))
preg_replace('/signature="/', 'signature="x', $this->message->getHeader('Signature')[0])
);
$this->assertFalse($this->verifier->isValid($this->message));
$this->assertFalse($this->verifier->isValid($message));
}

public function testRejectMessageWithoutSignatureHeader()
{
$this->message->headers->remove('Signature');
$this->assertFalse($this->verifier->isValid($this->message));
$message = $this->message->withoutHeader('Signature');
$this->assertFalse($this->verifier->isValid($message));
}

public function testRejectMessageWithGarbageSignatureHeader()
{
$this->message->headers->set('Signature', 'not="a",valid="signature"');
$this->assertFalse($this->verifier->isValid($this->message));
$message = $this->message->withHeader('Signature', 'not="a",valid="signature"');
$this->assertFalse($this->verifier->isValid($message));
}

public function testRejectMessageWithPartialSignatureHeader()
{
$this->message->headers->set('Signature', 'keyId="aa",algorithm="bb"');
$this->assertFalse($this->verifier->isValid($this->message));
$message = $this->message->withHeader('Signature', 'keyId="aa",algorithm="bb"');
$this->assertFalse($this->verifier->isValid($message));
}

public function testRejectsMessageWithUnknownKeyId()
Expand All @@ -111,7 +110,7 @@ public function testRejectsMessageWithUnknownKeyId()

public function testRejectsMessageMissingSignedHeaders()
{
$this->message->headers->remove('Date');
$this->assertFalse($this->verifier->isValid($this->message));
$message = $this->message->withoutHeader('Date');
$this->assertFalse($this->verifier->isValid($message));
}
}

0 comments on commit e17513d

Please sign in to comment.