DefaultTokenMapper.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * @copyright Copyright (c) 2016, ownCloud, Inc.
  5. *
  6. * @author Bjoern Schiessle <bjoern@schiessle.org>
  7. * @author Christoph Wurst <christoph@winzerhof-wurst.at>
  8. * @author Lukas Reschke <lukas@statuscode.ch>
  9. * @author Marcel Waldvogel <marcel.waldvogel@uni-konstanz.de>
  10. * @author Robin Appelman <robin@icewind.nl>
  11. * @author Roeland Jago Douma <roeland@famdouma.nl>
  12. *
  13. * @license AGPL-3.0
  14. *
  15. * This code is free software: you can redistribute it and/or modify
  16. * it under the terms of the GNU Affero General Public License, version 3,
  17. * as published by the Free Software Foundation.
  18. *
  19. * This program is distributed in the hope that it will be useful,
  20. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  22. * GNU Affero General Public License for more details.
  23. *
  24. * You should have received a copy of the GNU Affero General Public License, version 3,
  25. * along with this program. If not, see <http://www.gnu.org/licenses/>
  26. *
  27. */
  28. namespace OC\Authentication\Token;
  29. use OCP\AppFramework\Db\DoesNotExistException;
  30. use OCP\AppFramework\Db\QBMapper;
  31. use OCP\DB\QueryBuilder\IQueryBuilder;
  32. use OCP\IDBConnection;
  33. /**
  34. * @template-extends QBMapper<DefaultToken>
  35. */
  36. class DefaultTokenMapper extends QBMapper {
  37. public function __construct(IDBConnection $db) {
  38. parent::__construct($db, 'authtoken');
  39. }
  40. /**
  41. * Invalidate (delete) a given token
  42. *
  43. * @param string $token
  44. */
  45. public function invalidate(string $token) {
  46. /* @var $qb IQueryBuilder */
  47. $qb = $this->db->getQueryBuilder();
  48. $qb->delete('authtoken')
  49. ->where($qb->expr()->eq('token', $qb->createNamedParameter($token, IQueryBuilder::PARAM_STR)))
  50. ->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(DefaultToken::VERSION, IQueryBuilder::PARAM_INT)))
  51. ->execute();
  52. }
  53. /**
  54. * @param int $olderThan
  55. * @param int $remember
  56. */
  57. public function invalidateOld(int $olderThan, int $remember = IToken::DO_NOT_REMEMBER) {
  58. /* @var $qb IQueryBuilder */
  59. $qb = $this->db->getQueryBuilder();
  60. $qb->delete('authtoken')
  61. ->where($qb->expr()->lt('last_activity', $qb->createNamedParameter($olderThan, IQueryBuilder::PARAM_INT)))
  62. ->andWhere($qb->expr()->eq('type', $qb->createNamedParameter(IToken::TEMPORARY_TOKEN, IQueryBuilder::PARAM_INT)))
  63. ->andWhere($qb->expr()->eq('remember', $qb->createNamedParameter($remember, IQueryBuilder::PARAM_INT)))
  64. ->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(DefaultToken::VERSION, IQueryBuilder::PARAM_INT)))
  65. ->execute();
  66. }
  67. /**
  68. * Get the user UID for the given token
  69. *
  70. * @param string $token
  71. * @throws DoesNotExistException
  72. * @return DefaultToken
  73. */
  74. public function getToken(string $token): DefaultToken {
  75. /* @var $qb IQueryBuilder */
  76. $qb = $this->db->getQueryBuilder();
  77. $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'token', 'type', 'remember', 'last_activity', 'last_check', 'scope', 'expires', 'version')
  78. ->from('authtoken')
  79. ->where($qb->expr()->eq('token', $qb->createNamedParameter($token)))
  80. ->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(DefaultToken::VERSION, IQueryBuilder::PARAM_INT)))
  81. ->execute();
  82. $data = $result->fetch();
  83. $result->closeCursor();
  84. if ($data === false) {
  85. throw new DoesNotExistException('token does not exist');
  86. }
  87. return DefaultToken::fromRow($data);
  88. }
  89. /**
  90. * Get the token for $id
  91. *
  92. * @param int $id
  93. * @throws DoesNotExistException
  94. * @return DefaultToken
  95. */
  96. public function getTokenById(int $id): DefaultToken {
  97. /* @var $qb IQueryBuilder */
  98. $qb = $this->db->getQueryBuilder();
  99. $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'token', 'type', 'remember', 'last_activity', 'last_check', 'scope', 'expires', 'version')
  100. ->from('authtoken')
  101. ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
  102. ->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(DefaultToken::VERSION, IQueryBuilder::PARAM_INT)))
  103. ->execute();
  104. $data = $result->fetch();
  105. $result->closeCursor();
  106. if ($data === false) {
  107. throw new DoesNotExistException('token does not exist');
  108. }
  109. return DefaultToken::fromRow($data);
  110. }
  111. /**
  112. * Get all tokens of a user
  113. *
  114. * The provider may limit the number of result rows in case of an abuse
  115. * where a high number of (session) tokens is generated
  116. *
  117. * @param string $uid
  118. * @return DefaultToken[]
  119. */
  120. public function getTokenByUser(string $uid): array {
  121. /* @var $qb IQueryBuilder */
  122. $qb = $this->db->getQueryBuilder();
  123. $qb->select('id', 'uid', 'login_name', 'password', 'name', 'token', 'type', 'remember', 'last_activity', 'last_check', 'scope', 'expires', 'version')
  124. ->from('authtoken')
  125. ->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
  126. ->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(DefaultToken::VERSION, IQueryBuilder::PARAM_INT)))
  127. ->setMaxResults(1000);
  128. $result = $qb->execute();
  129. $data = $result->fetchAll();
  130. $result->closeCursor();
  131. $entities = array_map(function ($row) {
  132. return DefaultToken::fromRow($row);
  133. }, $data);
  134. return $entities;
  135. }
  136. public function deleteById(string $uid, int $id) {
  137. /* @var $qb IQueryBuilder */
  138. $qb = $this->db->getQueryBuilder();
  139. $qb->delete('authtoken')
  140. ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
  141. ->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
  142. ->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(DefaultToken::VERSION, IQueryBuilder::PARAM_INT)));
  143. $qb->execute();
  144. }
  145. /**
  146. * delete all auth token which belong to a specific client if the client was deleted
  147. *
  148. * @param string $name
  149. */
  150. public function deleteByName(string $name) {
  151. $qb = $this->db->getQueryBuilder();
  152. $qb->delete('authtoken')
  153. ->where($qb->expr()->eq('name', $qb->createNamedParameter($name), IQueryBuilder::PARAM_STR))
  154. ->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(DefaultToken::VERSION, IQueryBuilder::PARAM_INT)));
  155. $qb->execute();
  156. }
  157. }