3 * @copyright Copyright (C) 2010-2022, the Friendica project
5 * @license GNU AGPL version 3 or any later version
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
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.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 namespace Friendica\Security\TwoFactor\Repository;
24 use Friendica\Security\TwoFactor;
25 use Friendica\Database\Database;
26 use Psr\Log\LoggerInterface;
33 /** @var LoggerInterface */
36 /** @var TwoFactor\Factory\TrustedBrowser */
39 protected static $table_name = '2fa_trusted_browser';
41 public function __construct(Database $database, LoggerInterface $logger, TwoFactor\Factory\TrustedBrowser $factory = null)
43 $this->db = $database;
44 $this->logger = $logger;
45 $this->factory = $factory ?? new TwoFactor\Factory\TrustedBrowser($logger);
49 * @param string $cookie_hash
51 * @return TwoFactor\Model\TrustedBrowser|null
53 * @throws TwoFactor\Exception\TrustedBrowserPersistenceException
54 * @throws TwoFactor\Exception\TrustedBrowserNotFoundException
56 public function selectOneByHash(string $cookie_hash): TwoFactor\Model\TrustedBrowser
59 $fields = $this->db->selectFirst(self::$table_name, [], ['cookie_hash' => $cookie_hash]);
60 } catch (\Exception $exception) {
61 throw new TwoFactor\Exception\TrustedBrowserPersistenceException(sprintf('Internal server error when retrieving cookie hash \'%s\'', $cookie_hash));
63 if (!$this->db->isResult($fields)) {
64 throw new TwoFactor\Exception\TrustedBrowserNotFoundException(sprintf('Cookie hash \'%s\' not found', $cookie_hash));
67 return $this->factory->createFromTableRow($fields);
73 * @return TwoFactor\Collection\TrustedBrowsers
75 * @throws TwoFactor\Exception\TrustedBrowserPersistenceException
77 public function selectAllByUid(int $uid): TwoFactor\Collection\TrustedBrowsers
80 $rows = $this->db->selectToArray(self::$table_name, [], ['uid' => $uid]);
82 $trustedBrowsers = [];
83 foreach ($rows as $fields) {
84 $trustedBrowsers[] = $this->factory->createFromTableRow($fields);
86 return new TwoFactor\Collection\TrustedBrowsers($trustedBrowsers);
88 } catch (\Exception $exception) {
89 throw new TwoFactor\Exception\TrustedBrowserPersistenceException(sprintf('selection for uid \'%s\' wasn\'t successful.', $uid));
94 * @param TwoFactor\Model\TrustedBrowser $trustedBrowser
98 * @throws TwoFactor\Exception\TrustedBrowserPersistenceException
100 public function save(TwoFactor\Model\TrustedBrowser $trustedBrowser): bool
103 return $this->db->insert(self::$table_name, $trustedBrowser->toArray(), $this->db::INSERT_UPDATE);
104 } catch (\Exception $exception) {
105 throw new TwoFactor\Exception\TrustedBrowserPersistenceException(sprintf('Couldn\'t save trusted Browser with cookie_hash \'%s\'', $trustedBrowser->cookie_hash));
110 * @param TwoFactor\Model\TrustedBrowser $trustedBrowser
114 * @throws TwoFactor\Exception\TrustedBrowserPersistenceException
116 public function remove(TwoFactor\Model\TrustedBrowser $trustedBrowser): bool
119 return $this->db->delete(self::$table_name, ['cookie_hash' => $trustedBrowser->cookie_hash]);
120 } catch (\Exception $exception) {
121 throw new TwoFactor\Exception\TrustedBrowserPersistenceException(sprintf('Couldn\'t delete trusted Browser with cookie hash \'%s\'', $trustedBrowser->cookie_hash));
126 * @param int $local_user
127 * @param string $cookie_hash
131 * @throws TwoFactor\Exception\TrustedBrowserPersistenceException
133 public function removeForUser(int $local_user, string $cookie_hash): bool
136 return $this->db->delete(self::$table_name, ['cookie_hash' => $cookie_hash, 'uid' => $local_user]);
137 } catch (\Exception $exception) {
138 throw new TwoFactor\Exception\TrustedBrowserPersistenceException(sprintf('Couldn\'t delete trusted Browser for user \'%s\' and cookie hash \'%s\'', $local_user, $cookie_hash));
143 * @param int $local_user
146 public function removeAllForUser(int $local_user): bool
149 return $this->db->delete(self::$table_name, ['uid' => $local_user]);
150 } catch (\Exception $exception) {
151 throw new TwoFactor\Exception\TrustedBrowserPersistenceException(sprintf('Couldn\'t delete trusted Browsers for user \'%s\'', $local_user));