QrCodeController.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Zxing\QrReader;
  4. use OTPHP\TOTP;
  5. use OTPHP\Factory;
  6. use App\Classes\Options;
  7. use Assert\AssertionFailedException;
  8. use Illuminate\Http\File;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\Storage;
  11. class QrCodecontroller extends Controller
  12. {
  13. /**
  14. * Handle uploaded qr code image
  15. *
  16. * @param \Illuminate\Http\Request $request
  17. * @return \Illuminate\Http\Response
  18. */
  19. public function decode(Request $request)
  20. {
  21. if(Options::get('useBasicQrcodeReader')) {
  22. // input validation
  23. $this->validate($request, [
  24. 'qrcode' => 'required|image',
  25. ]);
  26. // qrcode analysis
  27. $path = $request->file('qrcode')->store('qrcodes');
  28. $qrcode = new QrReader(storage_path('app/' . $path));
  29. $uri = urldecode($qrcode->text());
  30. // delete uploaded file
  31. Storage::delete($path);
  32. }
  33. else {
  34. $this->validate($request, [
  35. 'uri' => 'required|string',
  36. ]);
  37. $uri = $request->uri;
  38. }
  39. // return the OTP object
  40. try {
  41. $otp = Factory::loadFromProvisioningUri($uri);
  42. if(!$otp->getIssuer()) {
  43. $otp->setIssuer($otp->getLabel());
  44. $otp->setLabel('');
  45. }
  46. // returned object
  47. $twofaccount = (object) array(
  48. 'service' => $otp->getIssuer(),
  49. 'account' => $otp->getLabel(),
  50. 'uri' => $uri,
  51. 'icon' => '',
  52. 'options' => $otp->getParameters()
  53. );
  54. return response()->json($twofaccount, 200);
  55. }
  56. catch (AssertionFailedException $exception) {
  57. $error = \Illuminate\Validation\ValidationException::withMessages([
  58. 'qrcode' => __('errors.response.no_valid_otp')
  59. ]);
  60. throw $error;
  61. }
  62. }
  63. }