1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
<?php
namespace PragmaRX\Google2FAQRCode;
use BaconQrCode\Renderer\Image\Png;
use BaconQrCode\Renderer\Image\RendererInterface;
use BaconQrCode\Writer as BaconQrCodeWriter;
use PragmaRX\Google2FA\Google2FA as Google2FAPackage;
use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\Image\ImageBackEndInterface;
use BaconQrCode\Renderer\Image\ImagickImageBackEnd;
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
use BaconQrCode\Writer;
class Google2FA extends Google2FAPackage
{
/**
* @var ImageBackEndInterface|RendererInterface|null $imageBackEnd
*/
protected $imageBackEnd;
/**
* Google2FA constructor.
*
* @param ImageBackEndInterface|RendererInterface|null $imageBackEnd
*/
public function __construct($imageBackEnd = null)
{
if ($this->getBaconQRCodeVersion() === 1) {
if ($imageBackEnd instanceof RendererInterface) {
$this->imageBackEnd = $imageBackEnd;
} else {
$this->imageBackEnd = new Png();
}
} else {
if ($imageBackEnd instanceof ImageBackEndInterface) {
$this->imageBackEnd = $imageBackEnd;
} else {
$this->imageBackEnd = new ImagickImageBackEnd();
}
}
}
/**
* Generates a QR code data url to display inline.
*
* @param string $company
* @param string $holder
* @param string $secret
* @param int $size
* @param string $encoding Default to UTF-8
*
* @return string
*/
public function getQRCodeInline($company, $holder, $secret, $size = 200, $encoding = 'utf-8')
{
return $this->getBaconQRCodeVersion() === 1
? $this->getQRCodeInlineV1($company, $holder, $secret, $size, $encoding)
: $this->getQRCodeInlineV2($company, $holder, $secret, $size, $encoding);
}
/**
* Generates a QR code data url to display inline for Bacon QRCode v1
*
* @param string $company
* @param string $holder
* @param string $secret
* @param int $size
* @param string $encoding Default to UTF-8
*
* @return string
*/
public function getQRCodeInlineV1($company, $holder, $secret, $size = 200, $encoding = 'utf-8')
{
$url = $this->getQRCodeUrl($company, $holder, $secret);
$renderer = $this->imageBackEnd;
$renderer->setWidth($size);
$renderer->setHeight($size);
$bacon = new BaconQrCodeWriter($renderer);
$data = $bacon->writeString($url, $encoding);
if ($this->imageBackEnd instanceof Png) {
return 'data:image/png;base64,'.base64_encode($data);
}
return $data;
}
/**
* Generates a QR code data url to display inline for Bacon QRCode v2
*
* @param string $company
* @param string $holder
* @param string $secret
* @param int $size
* @param string $encoding Default to UTF-8
*
* @return string
*/
public function getQRCodeInlineV2($company, $holder, $secret, $size = 200, $encoding = 'utf-8')
{
$renderer = new ImageRenderer(
(new RendererStyle($size))->withSize($size),
$this->imageBackEnd
);
$bacon = new Writer($renderer);
$data = $bacon->writeString(
$this->getQRCodeUrl($company, $holder, $secret),
$encoding
);
if ($this->imageBackEnd instanceof ImagickImageBackEnd) {
return 'data:image/png;base64,'.base64_encode($data);
}
return $data;
}
/**
* Get Bacon QRCode current version
*
* @return int
*/
public function getBaconQRCodeVersion()
{
return class_exists('BaconQrCode\Renderer\Image\Png') && class_exists('BaconQrCode\Writer')
? 1
: 2;
}
}
|