123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- <?php
- namespace App\Http\Controllers;
- use Validator;
- use Zxing\QrReader;
- use App\Classes\TimedTOTP;
- use Illuminate\Http\File;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Storage;
- class QrCodecontroller extends Controller
- {
- /**
- * Handle uploaded qr code image
- *
- * @param \Illuminate\Http\Request $request
- * @return \Illuminate\Http\Response
- */
- public function decode(Request $request)
- {
- // input validation
- $messages = [
- 'qrcode.image' => 'Supported format are jpeg, png, bmp, gif, svg, or webp'
- ];
- $validator = Validator::make($request->all(), [
- 'qrcode' => 'required|image',
- ], $messages);
- if ($validator->fails()) {
- return response()->json(['error' => $validator->errors()], 400);
- }
- // qrcode analysis
- $path = $request->file('qrcode')->store('qrcodes');
- $qrcode = new QrReader(storage_path('app/' . $path));
- $uri = urldecode($qrcode->text());
- // delete uploaded file
- Storage::delete($path);
- if( empty($uri) ) {
- return response()->json([
- 'error' => [
- 'qrcode' => 'Nothing readable in this QR code 😕'
- ]
- ], 400);
- }
- // Check uri validity
- if( !TimedTOTP::get($uri) ) {
- return response()->json([
- 'error' => [
- 'uri' => 'This uri do not return any TOTP code 😕'
- ]
- ], 400);
- }
- $uriChunks = explode('?', $uri);
- foreach(explode('&', $uriChunks[1]) as $option) {
- $option = explode('=', $option);
- $options[$option[0]] = $option[1];
- }
- $account = $service = '';
- $serviceChunks = explode(':', str_replace('otpauth://totp/', '', $uriChunks[0]));
- if( count($serviceChunks) > 1 ) {
- $account = $serviceChunks[1];
- }
- $service = $serviceChunks[0];
- if( strstr( $service, '@') ) {
- $account = $service;
- $service = '';
- }
- if( empty($service) & !empty($options['issuer']) ) {
- $service = $options['issuer'];
- }
- // returned object
- $twofaccount = (object) array(
- 'service' => $service,
- 'account' => $account,
- 'uri' => $uri,
- 'icon' => '',
- 'options' => $options
- );
- return response()->json($twofaccount, 201);
- }
-
- }
|