2fa-functions.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. trait TwoFAFunctions
  3. {
  4. public function create2FA($type)
  5. {
  6. $result['type'] = $type;
  7. switch ($type) {
  8. case 'google':
  9. try {
  10. $google2fa = new PragmaRX\Google2FA\Google2FA();
  11. $google2fa->setAllowInsecureCallToGoogleApis(true);
  12. $result['secret'] = $google2fa->generateSecretKey();
  13. $result['url'] = $google2fa->getQRCodeGoogleUrl(
  14. $this->config['title'],
  15. $this->user['username'],
  16. $result['secret']
  17. );
  18. } catch (PragmaRX\Google2FA\Exceptions\InsecureCallException $e) {
  19. $this->setAPIResponse('error', $e->getMessage(), 500);
  20. return null;
  21. }
  22. break;
  23. default:
  24. $this->setAPIResponse('error', $type . ' is not an available to be setup', 404);
  25. return null;
  26. }
  27. $this->setAPIResponse('success', '2FA code created - awaiting verification', 200);
  28. return $result;
  29. }
  30. public function verify2FA($secret, $code, $type)
  31. {
  32. if (!$secret || $secret == '') {
  33. $this->setAPIResponse('error', 'Secret was not supplied or left blank', 422);
  34. return false;
  35. }
  36. if (!$code || $code == '') {
  37. $this->setAPIResponse('error', 'Code was not supplied or left blank', 422);
  38. return false;
  39. }
  40. if (!$type || $type == '') {
  41. $this->setAPIResponse('error', 'Type was not supplied or left blank', 422);
  42. return false;
  43. }
  44. switch ($type) {
  45. case 'google':
  46. $google2fa = new PragmaRX\Google2FA\Google2FA();
  47. $google2fa->setWindow(5);
  48. $valid = $google2fa->verifyKey($secret, $code);
  49. break;
  50. default:
  51. $this->setAPIResponse('error', $type . ' is not an available to be setup', 404);
  52. return false;
  53. }
  54. if ($valid) {
  55. $this->setAPIResponse('success', 'Verification code verified', 200);
  56. return true;
  57. } else {
  58. $this->setAPIResponse('success', 'Verification code invalid', 401);
  59. return false;
  60. }
  61. }
  62. public function save2FA($secret, $type)
  63. {
  64. if (!$secret || $secret == '') {
  65. $this->setAPIResponse('error', 'Secret was not supplied or left blank', 422);
  66. return false;
  67. }
  68. if (!$type || $type == '') {
  69. $this->setAPIResponse('error', 'Type was not supplied or left blank', 422);
  70. return false;
  71. }
  72. $response = [
  73. array(
  74. 'function' => 'query',
  75. 'query' => array(
  76. 'UPDATE users SET',
  77. ['auth_service' => $type . '::' . $secret],
  78. 'WHERE id = ?',
  79. $this->user['userID']
  80. )
  81. ),
  82. ];
  83. $this->writeLog('success', 'User Management Function - User added 2FA', $this->user['username']);
  84. $this->setAPIResponse('success', '2FA Added', 200);
  85. return $this->processQueries($response);
  86. }
  87. public function remove2FA()
  88. {
  89. $response = [
  90. array(
  91. 'function' => 'query',
  92. 'query' => array(
  93. 'UPDATE users SET',
  94. ['auth_service' => 'internal'],
  95. 'WHERE id = ?',
  96. $this->user['userID']
  97. )
  98. ),
  99. ];
  100. $this->writeLog('success', 'User Management Function - User removed 2FA', $this->user['username']);
  101. $this->setAPIResponse('success', '2FA deleted', 204);
  102. return $this->processQueries($response);
  103. }
  104. }