You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
4.3 KiB

  1. <?php
  2. /**
  3. * @author Christoph Wurst <christoph@owncloud.com>
  4. *
  5. * @copyright Copyright (c) 2016, ownCloud, Inc.
  6. * @license AGPL-3.0
  7. *
  8. * This code is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU Affero General Public License, version 3,
  10. * as published by the Free Software Foundation.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU Affero General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Affero General Public License, version 3,
  18. * along with this program. If not, see <http://www.gnu.org/licenses/>
  19. *
  20. */
  21. namespace OC\Core\Controller;
  22. use OC\Authentication\TwoFactorAuth\Manager;
  23. use OCP\AppFramework\Controller;
  24. use OCP\AppFramework\Http\RedirectResponse;
  25. use OCP\AppFramework\Http\TemplateResponse;
  26. use OCP\IRequest;
  27. use OCP\ISession;
  28. use OCP\IURLGenerator;
  29. use OCP\IUserSession;
  30. class TwoFactorChallengeController extends Controller {
  31. /** @var Manager */
  32. private $twoFactorManager;
  33. /** @var IUserSession */
  34. private $userSession;
  35. /** @var ISession */
  36. private $session;
  37. /** @var IURLGenerator */
  38. private $urlGenerator;
  39. /**
  40. * @param string $appName
  41. * @param IRequest $request
  42. * @param Manager $twoFactorManager
  43. * @param IUserSession $userSession
  44. * @param ISession $session
  45. * @param IURLGenerator $urlGenerator
  46. */
  47. public function __construct($appName, IRequest $request, Manager $twoFactorManager, IUserSession $userSession,
  48. ISession $session, IURLGenerator $urlGenerator) {
  49. parent::__construct($appName, $request);
  50. $this->twoFactorManager = $twoFactorManager;
  51. $this->userSession = $userSession;
  52. $this->session = $session;
  53. $this->urlGenerator = $urlGenerator;
  54. }
  55. /**
  56. * @NoAdminRequired
  57. * @NoCSRFRequired
  58. *
  59. * @param string $redirect_url
  60. * @return TemplateResponse
  61. */
  62. public function selectChallenge($redirect_url) {
  63. $user = $this->userSession->getUser();
  64. $providers = $this->twoFactorManager->getProviders($user);
  65. $data = [
  66. 'providers' => $providers,
  67. 'redirect_url' => $redirect_url,
  68. ];
  69. return new TemplateResponse($this->appName, 'twofactorselectchallenge', $data, 'guest');
  70. }
  71. /**
  72. * @NoAdminRequired
  73. * @NoCSRFRequired
  74. * @UseSession
  75. *
  76. * @param string $challengeProviderId
  77. * @param string $redirect_url
  78. * @return TemplateResponse
  79. */
  80. public function showChallenge($challengeProviderId, $redirect_url) {
  81. $user = $this->userSession->getUser();
  82. $provider = $this->twoFactorManager->getProvider($user, $challengeProviderId);
  83. if (is_null($provider)) {
  84. return new RedirectResponse($this->urlGenerator->linkToRoute('core.TwoFactorChallenge.selectChallenge'));
  85. }
  86. if ($this->session->exists('two_factor_auth_error')) {
  87. $this->session->remove('two_factor_auth_error');
  88. $error = true;
  89. } else {
  90. $error = false;
  91. }
  92. $tmpl = $provider->getTemplate($user);
  93. $tmpl->assign('redirect_url', $redirect_url);
  94. $data = [
  95. 'error' => $error,
  96. 'provider' => $provider,
  97. 'template' => $tmpl->fetchPage(),
  98. ];
  99. return new TemplateResponse($this->appName, 'twofactorshowchallenge', $data, 'guest');
  100. }
  101. /**
  102. * @NoAdminRequired
  103. * @NoCSRFRequired
  104. * @UseSession
  105. *
  106. * @param string $challengeProviderId
  107. * @param string $challenge
  108. * @param string $redirect_url
  109. * @return RedirectResponse
  110. */
  111. public function solveChallenge($challengeProviderId, $challenge, $redirect_url = null) {
  112. $user = $this->userSession->getUser();
  113. $provider = $this->twoFactorManager->getProvider($user, $challengeProviderId);
  114. if (is_null($provider)) {
  115. return new RedirectResponse($this->urlGenerator->linkToRoute('core.TwoFactorChallenge.selectChallenge'));
  116. }
  117. if ($this->twoFactorManager->verifyChallenge($challengeProviderId, $user, $challenge)) {
  118. if (!is_null($redirect_url)) {
  119. return new RedirectResponse($this->urlGenerator->getAbsoluteURL(urldecode($redirect_url)));
  120. }
  121. return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index'));
  122. }
  123. $this->session->set('two_factor_auth_error', true);
  124. return new RedirectResponse($this->urlGenerator->linkToRoute('core.TwoFactorChallenge.showChallenge', [
  125. 'challengeProviderId' => $provider->getId(),
  126. 'redirect_url' => $redirect_url,
  127. ]));
  128. }
  129. }