Skip to content

Commit ffac304

Browse files
author
Martin Brecht-Precht
committedFeb 1, 2017
Added the issuer to the URL encoder.
1 parent ae526f0 commit ffac304

File tree

8 files changed

+55
-27
lines changed

8 files changed

+55
-27
lines changed
 

‎src/SecretSharing/SharedSecretQrCodeProvider/SharedSecretQrCodeProvider.php

+9-2
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,25 @@ class SharedSecretQrCodeProvider
5050
*/
5151
private $qrCode;
5252

53+
/**
54+
* @var string
55+
*/
56+
private $issuer;
57+
5358
/**
5459
* SecretQrCodeProvider constructor.
5560
*
5661
* @param SharedSecretUrlEncoderInterface $contentEncoder
5762
* @param string $keyName
5863
* @param string $secret
64+
* @param string $issuer
5965
*/
60-
public function __construct(SharedSecretUrlEncoderInterface $contentEncoder, $keyName, $secret)
66+
public function __construct(SharedSecretUrlEncoderInterface $contentEncoder, $keyName, $secret, $issuer = null)
6167
{
6268
$this->contentEncoder = $contentEncoder;
6369
$this->keyName = $keyName;
6470
$this->secret = $secret;
71+
$this->issuer = $issuer;
6572
$this->qrEncoder = new QrEncoder();
6673
}
6774

@@ -71,7 +78,7 @@ public function __construct(SharedSecretUrlEncoderInterface $contentEncoder, $ke
7178
*/
7279
public function provideQrCode($path)
7380
{
74-
$this->qrCodeContents = $this->contentEncoder->encode($this->keyName, $this->secret);
81+
$this->qrCodeContents = $this->contentEncoder->encode($this->keyName, $this->secret, $this->issuer);
7582
$this->qrCode = $this->qrEncoder->encodeQrCode($this->qrCodeContents);
7683
$this->qrRenderer = new QrCodeRendererPng();
7784
$this->qrRenderer->render($this->qrCode, $path);

‎src/SecretSharing/SharedSecretUrlEncoder/Base/SharedSecretUrlEncoderInterface.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ interface SharedSecretUrlEncoderInterface
1313
/**
1414
* @param string $keyName
1515
* @param string $sharedSecret
16+
* @param string $issuer
1617
* @return string
1718
*/
18-
public function encode($keyName, $sharedSecret);
19+
public function encode($keyName, $sharedSecret, $issuer=null);
1920

2021
}

‎src/SecretSharing/SharedSecretUrlEncoder/HotpBase32SharedSecretUrlEncoder.php

+7-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,18 @@ class HotpBase32SharedSecretUrlEncoder implements Base\SharedSecretUrlEncoderInt
1515
/**
1616
* @param string $keyName
1717
* @param string $sharedSecret
18+
* @param string $issuer
1819
* @return string
1920
*/
20-
public function encode($keyName, $sharedSecret)
21+
public function encode($keyName, $sharedSecret, $issuer = null)
2122
{
2223
$sharedSecret = bin2hex($sharedSecret);
2324
$sharedSecret = Base32::encodeByteStr($sharedSecret, true);
24-
return 'otpauth://hotp/' . rawurlencode($keyName) . '?secret=' . $sharedSecret;
25+
$encoded = 'otpauth://hotp/' . rawurlencode($keyName) . '?secret=' . $sharedSecret;
26+
if (!is_null($issuer)) {
27+
$encoded .= '&issuer=' . rawurlencode($issuer);
28+
}
29+
return $encoded;
2530
}
2631

2732
}

‎src/SecretSharing/SharedSecretUrlEncoder/HotpSharedSecretUrlEncoder.php

+7-2
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ class HotpSharedSecretUrlEncoder implements Base\SharedSecretUrlEncoderInterface
1313
/**
1414
* @param string $keyName
1515
* @param string $sharedSecret
16+
* @param string $issuer
1617
* @return string
1718
*/
18-
public function encode($keyName, $sharedSecret)
19+
public function encode($keyName, $sharedSecret, $issuer = null)
1920
{
2021
$sharedSecret = bin2hex($sharedSecret);
21-
return 'otpauth://hotp/' . rawurlencode($keyName) . '?secret=' . $sharedSecret;
22+
$encoded = 'otpauth://hotp/' . rawurlencode($keyName) . '?secret=' . $sharedSecret;
23+
if (!is_null($issuer)) {
24+
$encoded .= '&issuer=' . $issuer;
25+
}
26+
return $encoded;
2227
}
2328

2429
}

‎src/SecretSharing/SharedSecretUrlEncoder/TotpBase32SharedSecretUrlEncoder.php

+7-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,18 @@ class TotpBase32SharedSecretUrlEncoder implements Base\SharedSecretUrlEncoderInt
1515
/**
1616
* @param string $keyName
1717
* @param string $sharedSecret
18+
* @param string $issuer
1819
* @return string
1920
*/
20-
public function encode($keyName, $sharedSecret)
21+
public function encode($keyName, $sharedSecret, $issuer = null)
2122
{
2223
$sharedSecret = bin2hex($sharedSecret);
2324
$sharedSecret = Base32::encodeByteStr($sharedSecret, true);
24-
return 'otpauth://totp/' . rawurlencode($keyName) . '?secret=' . $sharedSecret;
25+
$encoded = 'otpauth://totp/' . rawurlencode($keyName) . '?secret=' . $sharedSecret;
26+
if (!is_null($issuer)) {
27+
$encoded .= '&issuer=' . $issuer;
28+
}
29+
return $encoded;
2530
}
2631

2732
}

‎src/SecretSharing/SharedSecretUrlEncoder/TotpSharedSecretUrlEncoder.php

+7-2
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ class TotpSharedSecretUrlEncoder implements Base\SharedSecretUrlEncoderInterface
1313
/**
1414
* @param string $keyName
1515
* @param string $sharedSecret
16+
* @param string $issuer
1617
* @return string
1718
*/
18-
public function encode($keyName, $sharedSecret)
19+
public function encode($keyName, $sharedSecret, $issuer = null)
1920
{
2021
$sharedSecret = bin2hex($sharedSecret);
21-
return 'otpauth://totp/' . rawurlencode($keyName) . '?secret=' . $sharedSecret;
22+
$encoded = 'otpauth://totp/' . rawurlencode($keyName) . '?secret=' . $sharedSecret;
23+
if (!is_null($issuer)) {
24+
$encoded .= '&issuer=' . $issuer;
25+
}
26+
return $encoded;
2227
}
2328

2429
}

‎test/SecretSharing/SharedSecretQrCodeProvider/SharedSecretQrCodeProviderTest.php

+8-8
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ class SharedSecretQrCodeProviderTest extends \PHPUnit_Framework_TestCase
1717
{
1818

1919
const SHARED_SECRET ='9nxnvWgVw5Ca2YLUIkou2CkV2K15QI';
20-
const EXPECTED_HOTP_BASE32_SHARED_SECRET_URL = 'otpauth://hotp/Awesome%20Application?secret=GM4TMZJXHA3GKNZWGU3TMNZVGY3TOMZVGQZTMMJTGI2TSNDDGU2TIOJWMI3GMNZVGMZDIMZWMI2TMMZSGRRDGMJTGU2TCNBZ';
21-
const EXPECTED_TOTP_BASE32_SHARED_SECRET_URL = 'otpauth://totp/Awesome%20Application?secret=GM4TMZJXHA3GKNZWGU3TMNZVGY3TOMZVGQZTMMJTGI2TSNDDGU2TIOJWMI3GMNZVGMZDIMZWMI2TMMZSGRRDGMJTGU2TCNBZ';
22-
const EXPECTED_HOTP_SHARED_SECRET_URL = 'otpauth://hotp/Awesome%20Application?secret=396e786e765767567735436132594c55496b6f7532436b56324b31355149';
23-
const EXPECTED_TOTP_SHARED_SECRET_URL = 'otpauth://totp/Awesome%20Application?secret=396e786e765767567735436132594c55496b6f7532436b56324b31355149';
20+
const EXPECTED_HOTP_BASE32_SHARED_SECRET_URL = 'otpauth://hotp/Awesome%20Application?secret=GM4TMZJXHA3GKNZWGU3TMNZVGY3TOMZVGQZTMMJTGI2TSNDDGU2TIOJWMI3GMNZVGMZDIMZWMI2TMMZSGRRDGMJTGU2TCNBZ&issuer=Markenwerk';
21+
const EXPECTED_TOTP_BASE32_SHARED_SECRET_URL = 'otpauth://totp/Awesome%20Application?secret=GM4TMZJXHA3GKNZWGU3TMNZVGY3TOMZVGQZTMMJTGI2TSNDDGU2TIOJWMI3GMNZVGMZDIMZWMI2TMMZSGRRDGMJTGU2TCNBZ&issuer=Markenwerk';
22+
const EXPECTED_HOTP_SHARED_SECRET_URL = 'otpauth://hotp/Awesome%20Application?secret=396e786e765767567735436132594c55496b6f7532436b56324b31355149&issuer=Markenwerk';
23+
const EXPECTED_TOTP_SHARED_SECRET_URL = 'otpauth://totp/Awesome%20Application?secret=396e786e765767567735436132594c55496b6f7532436b56324b31355149&issuer=Markenwerk';
2424

2525
public function testHotpBase32ProvideQrCode()
2626
{
2727
// Init QR code renderer
28-
$sharedSecretQrCodeProvider = new SharedSecretQrCodeProvider(new HotpBase32SharedSecretUrlEncoder(), 'Awesome Application', self::SHARED_SECRET);
28+
$sharedSecretQrCodeProvider = new SharedSecretQrCodeProvider(new HotpBase32SharedSecretUrlEncoder(), 'Awesome Application', self::SHARED_SECRET, 'Markenwerk');
2929
$sharedSecretQrCodeProvider->getQrEncoder()
3030
->setLevel(QrEncoder::QR_CODE_LEVEL_LOW)
3131
->setTempDir(__DIR__ . '/tmp/');
@@ -50,7 +50,7 @@ public function testHotpBase32ProvideQrCode()
5050
public function testTotpBase32ProvideQrCode()
5151
{
5252
// Init QR code renderer
53-
$sharedSecretQrCodeProvider = new SharedSecretQrCodeProvider(new TotpBase32SharedSecretUrlEncoder(), 'Awesome Application', self::SHARED_SECRET);
53+
$sharedSecretQrCodeProvider = new SharedSecretQrCodeProvider(new TotpBase32SharedSecretUrlEncoder(), 'Awesome Application', self::SHARED_SECRET, 'Markenwerk');
5454
$sharedSecretQrCodeProvider->getQrEncoder()
5555
->setLevel(QrEncoder::QR_CODE_LEVEL_LOW)
5656
->setTempDir(__DIR__ . '/tmp/');
@@ -75,7 +75,7 @@ public function testTotpBase32ProvideQrCode()
7575
public function testHotpProvideQrCode()
7676
{
7777
// Init QR code renderer
78-
$sharedSecretQrCodeProvider = new SharedSecretQrCodeProvider(new HotpSharedSecretUrlEncoder(), 'Awesome Application', self::SHARED_SECRET);
78+
$sharedSecretQrCodeProvider = new SharedSecretQrCodeProvider(new HotpSharedSecretUrlEncoder(), 'Awesome Application', self::SHARED_SECRET, 'Markenwerk');
7979
$sharedSecretQrCodeProvider->getQrEncoder()
8080
->setLevel(QrEncoder::QR_CODE_LEVEL_LOW)
8181
->setTempDir(__DIR__ . '/tmp/');
@@ -100,7 +100,7 @@ public function testHotpProvideQrCode()
100100
public function testTotpProvideQrCode()
101101
{
102102
// Init QR code renderer
103-
$sharedSecretQrCodeProvider = new SharedSecretQrCodeProvider(new TotpSharedSecretUrlEncoder(), 'Awesome Application', self::SHARED_SECRET);
103+
$sharedSecretQrCodeProvider = new SharedSecretQrCodeProvider(new TotpSharedSecretUrlEncoder(), 'Awesome Application', self::SHARED_SECRET, 'Markenwerk');
104104
$sharedSecretQrCodeProvider->getQrEncoder()
105105
->setLevel(QrEncoder::QR_CODE_LEVEL_LOW)
106106
->setTempDir(__DIR__ . '/tmp/');

‎test/SecretSharing/SharedSecretUrlEncoder/SharedSecretUrlEncoderTest.php

+8-8
Original file line numberDiff line numberDiff line change
@@ -11,36 +11,36 @@ class SharedSecretUrlEncoderTest extends \PHPUnit_Framework_TestCase
1111
{
1212

1313
const SHARED_SECRET ='9nxnvWgVw5Ca2YLUIkou2CkV2K15QI';
14-
const EXPECTED_HOTP_BASE32_SHARED_SECRET_URL = 'otpauth://hotp/Awesome%20Application?secret=GM4TMZJXHA3GKNZWGU3TMNZVGY3TOMZVGQZTMMJTGI2TSNDDGU2TIOJWMI3GMNZVGMZDIMZWMI2TMMZSGRRDGMJTGU2TCNBZ';
15-
const EXPECTED_TOTP_BASE32_SHARED_SECRET_URL = 'otpauth://totp/Awesome%20Application?secret=GM4TMZJXHA3GKNZWGU3TMNZVGY3TOMZVGQZTMMJTGI2TSNDDGU2TIOJWMI3GMNZVGMZDIMZWMI2TMMZSGRRDGMJTGU2TCNBZ';
16-
const EXPECTED_HOTP_SHARED_SECRET_URL = 'otpauth://hotp/Awesome%20Application?secret=396e786e765767567735436132594c55496b6f7532436b56324b31355149';
17-
const EXPECTED_TOTP_SHARED_SECRET_URL = 'otpauth://totp/Awesome%20Application?secret=396e786e765767567735436132594c55496b6f7532436b56324b31355149';
14+
const EXPECTED_HOTP_BASE32_SHARED_SECRET_URL = 'otpauth://hotp/Awesome%20Application?secret=GM4TMZJXHA3GKNZWGU3TMNZVGY3TOMZVGQZTMMJTGI2TSNDDGU2TIOJWMI3GMNZVGMZDIMZWMI2TMMZSGRRDGMJTGU2TCNBZ&issuer=Markenwerk';
15+
const EXPECTED_TOTP_BASE32_SHARED_SECRET_URL = 'otpauth://totp/Awesome%20Application?secret=GM4TMZJXHA3GKNZWGU3TMNZVGY3TOMZVGQZTMMJTGI2TSNDDGU2TIOJWMI3GMNZVGMZDIMZWMI2TMMZSGRRDGMJTGU2TCNBZ&issuer=Markenwerk';
16+
const EXPECTED_HOTP_SHARED_SECRET_URL = 'otpauth://hotp/Awesome%20Application?secret=396e786e765767567735436132594c55496b6f7532436b56324b31355149&issuer=Markenwerk';
17+
const EXPECTED_TOTP_SHARED_SECRET_URL = 'otpauth://totp/Awesome%20Application?secret=396e786e765767567735436132594c55496b6f7532436b56324b31355149&issuer=Markenwerk';
1818

1919
public function testHotpBase32UrlEncode()
2020
{
2121
$sharedSecretUrlEncoder = new HotpBase32SharedSecretUrlEncoder();
22-
$sharedSecretUrl = $sharedSecretUrlEncoder->encode('Awesome Application', self::SHARED_SECRET);
22+
$sharedSecretUrl = $sharedSecretUrlEncoder->encode('Awesome Application', self::SHARED_SECRET, 'Markenwerk');
2323
$this->assertEquals(self::EXPECTED_HOTP_BASE32_SHARED_SECRET_URL, $sharedSecretUrl);
2424
}
2525

2626
public function testTotpBase32UrlEncode()
2727
{
2828
$sharedSecretUrlEncoder = new TotpBase32SharedSecretUrlEncoder();
29-
$sharedSecretUrl = $sharedSecretUrlEncoder->encode('Awesome Application', self::SHARED_SECRET);
29+
$sharedSecretUrl = $sharedSecretUrlEncoder->encode('Awesome Application', self::SHARED_SECRET, 'Markenwerk');
3030
$this->assertEquals(self::EXPECTED_TOTP_BASE32_SHARED_SECRET_URL, $sharedSecretUrl);
3131
}
3232

3333
public function testHotpUrlEncode()
3434
{
3535
$sharedSecretUrlEncoder = new HotpSharedSecretUrlEncoder();
36-
$sharedSecretUrl = $sharedSecretUrlEncoder->encode('Awesome Application', self::SHARED_SECRET);
36+
$sharedSecretUrl = $sharedSecretUrlEncoder->encode('Awesome Application', self::SHARED_SECRET, 'Markenwerk');
3737
$this->assertEquals(self::EXPECTED_HOTP_SHARED_SECRET_URL, $sharedSecretUrl);
3838
}
3939

4040
public function testTotpUrlEncode()
4141
{
4242
$sharedSecretUrlEncoder = new TotpSharedSecretUrlEncoder();
43-
$sharedSecretUrl = $sharedSecretUrlEncoder->encode('Awesome Application', self::SHARED_SECRET);
43+
$sharedSecretUrl = $sharedSecretUrlEncoder->encode('Awesome Application', self::SHARED_SECRET, 'Markenwerk');
4444
$this->assertEquals(self::EXPECTED_TOTP_SHARED_SECRET_URL, $sharedSecretUrl);
4545
}
4646

0 commit comments

Comments
 (0)
Please sign in to comment.