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.

90 lines
2.6 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\AppFramework\Http;
  23. use OC\Authentication\Token\DefaultTokenProvider;
  24. use OC\Authentication\Token\IToken;
  25. use OC\User\Manager;
  26. use OCP\AppFramework\Controller;
  27. use OCP\AppFramework\Http\JSONResponse;
  28. use OCP\AppFramework\Http\Response;
  29. use OCP\IRequest;
  30. use OCP\Security\ISecureRandom;
  31. class TokenController extends Controller {
  32. /** @var Manager */
  33. private $userManager;
  34. /** @var DefaultTokenProvider */
  35. private $tokenProvider;
  36. /** @var ISecureRandom */
  37. private $secureRandom;
  38. /**
  39. * @param string $appName
  40. * @param IRequest $request
  41. * @param Manager $userManager
  42. * @param DefaultTokenProvider $tokenProvider
  43. * @param ISecureRandom $secureRandom
  44. */
  45. public function __construct($appName, IRequest $request, Manager $userManager, DefaultTokenProvider $tokenProvider,
  46. ISecureRandom $secureRandom) {
  47. parent::__construct($appName, $request);
  48. $this->userManager = $userManager;
  49. $this->tokenProvider = $tokenProvider;
  50. $this->secureRandom = $secureRandom;
  51. }
  52. /**
  53. * Generate a new access token clients can authenticate with
  54. *
  55. * @PublicPage
  56. * @NoCSRFRequired
  57. *
  58. * @param string $user
  59. * @param string $password
  60. * @param string $name the name of the client
  61. * @return JSONResponse
  62. */
  63. public function generateToken($user, $password, $name = 'unknown client') {
  64. if (is_null($user) || is_null($password)) {
  65. $response = new Response();
  66. $response->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY);
  67. return $response;
  68. }
  69. if ($this->userManager->checkPassword($user, $password) === false) {
  70. $response = new Response();
  71. $response->setStatus(Http::STATUS_UNAUTHORIZED);
  72. return $response;
  73. }
  74. $token = $this->secureRandom->generate(128);
  75. $this->tokenProvider->generateToken($token, $user, $password, $name, IToken::PERMANENT_TOKEN);
  76. return [
  77. 'token' => $token,
  78. ];
  79. }
  80. }