QrCodeController.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Validator;
  4. use Zxing\QrReader;
  5. use App\Classes\TimedTOTP;
  6. use Illuminate\Http\File;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Facades\Storage;
  9. class QrCodecontroller extends Controller
  10. {
  11. /**
  12. * Handle uploaded qr code image
  13. *
  14. * @param \Illuminate\Http\Request $request
  15. * @return \Illuminate\Http\Response
  16. */
  17. public function decode(Request $request)
  18. {
  19. // input validation
  20. $messages = [
  21. 'qrcode.image' => 'Supported format are jpeg, png, bmp, gif, svg, or webp'
  22. ];
  23. $validator = Validator::make($request->all(), [
  24. 'qrcode' => 'required|image',
  25. ], $messages);
  26. if ($validator->fails()) {
  27. return response()->json(['error' => $validator->errors()], 400);
  28. }
  29. // qrcode analysis
  30. $path = $request->file('qrcode')->store('qrcodes');
  31. $qrcode = new QrReader(storage_path('app/' . $path));
  32. $uri = urldecode($qrcode->text());
  33. // delete uploaded file
  34. Storage::delete($path);
  35. if( empty($uri) ) {
  36. return response()->json([
  37. 'error' => [
  38. 'qrcode' => 'Nothing readable in this QR code 😕'
  39. ]
  40. ], 400);
  41. }
  42. // Check uri validity
  43. if( !TimedTOTP::get($uri) ) {
  44. return response()->json([
  45. 'error' => [
  46. 'uri' => 'This uri do not return any TOTP code 😕'
  47. ]
  48. ], 400);
  49. }
  50. $uriChunks = explode('?', $uri);
  51. foreach(explode('&', $uriChunks[1]) as $option) {
  52. $option = explode('=', $option);
  53. $options[$option[0]] = $option[1];
  54. }
  55. $account = $service = '';
  56. $serviceChunks = explode(':', str_replace('otpauth://totp/', '', $uriChunks[0]));
  57. if( count($serviceChunks) > 1 ) {
  58. $account = $serviceChunks[1];
  59. }
  60. $service = $serviceChunks[0];
  61. if( strstr( $service, '@') ) {
  62. $account = $service;
  63. $service = '';
  64. }
  65. if( empty($service) & !empty($options['issuer']) ) {
  66. $service = $options['issuer'];
  67. }
  68. // returned object
  69. $twofaccount = (object) array(
  70. 'service' => $service,
  71. 'account' => $account,
  72. 'uri' => $uri,
  73. 'icon' => '',
  74. 'options' => $options
  75. );
  76. return response()->json($twofaccount, 201);
  77. }
  78. }