| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2022-12-29 19:42:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * FireflyConfig.php | 
					
						
							| 
									
										
										
										
											2020-02-16 13:56:52 +01:00
										 |  |  |  * Copyright (c) 2019 james@firefly-iii.org | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * This file is part of Firefly III (https://github.com/firefly-iii). | 
					
						
							| 
									
										
										
										
											2016-10-05 06:52:15 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as | 
					
						
							|  |  |  |  * published by the Free Software Foundation, either version 3 of the | 
					
						
							|  |  |  |  * License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2017-10-21 08:40:00 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2017-10-21 08:40:00 +02:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * GNU Affero General Public License for more details. | 
					
						
							| 
									
										
										
										
											2017-10-21 08:40:00 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2017-04-09 07:44:22 +02:00
										 |  |  | declare(strict_types=1); | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace FireflyIII\Support; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 06:49:48 +02:00
										 |  |  | use FireflyIII\Exceptions\FireflyException; | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  | use FireflyIII\Models\Configuration; | 
					
						
							| 
									
										
										
										
											2024-12-11 07:23:46 +01:00
										 |  |  | use Illuminate\Contracts\Encryption\DecryptException; | 
					
						
							|  |  |  | use Illuminate\Contracts\Encryption\EncryptException; | 
					
						
							| 
									
										
										
										
											2020-06-06 12:14:55 +02:00
										 |  |  | use Illuminate\Database\QueryException; | 
					
						
							| 
									
										
										
										
											2024-12-11 07:23:46 +01:00
										 |  |  | use Illuminate\Support\Facades\Log; | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2017-11-15 12:25:49 +01:00
										 |  |  |  * Class FireflyConfig. | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |  */ | 
					
						
							|  |  |  | class FireflyConfig | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-14 15:21:05 +02:00
										 |  |  |     public function delete(string $name): void | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-12-22 20:37:54 +01:00
										 |  |  |         $fullName = 'ff-config-'.$name; | 
					
						
							|  |  |  |         if (\Cache::has($fullName)) { | 
					
						
							|  |  |  |             \Cache::forget($fullName); | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-12-30 20:38:54 +01:00
										 |  |  |         Configuration::where('name', $name)->forceDelete(); | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     public function has(string $name): bool | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-12-20 19:35:52 +01:00
										 |  |  |         return 1 === Configuration::where('name', $name)->count(); | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 07:23:46 +01:00
										 |  |  |     public function getEncrypted(string $name, $default = null): ?Configuration | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $result = $this->get($name, $default); | 
					
						
							|  |  |  |         if (null === $result) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ('' === $result->data) { | 
					
						
							| 
									
										
										
										
											2024-12-14 05:39:55 +01:00
										 |  |  |             Log::warning(sprintf('Empty encrypted configuration value found: "%s"', $name)); | 
					
						
							| 
									
										
										
										
											2024-12-14 05:45:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 07:23:46 +01:00
										 |  |  |             return $result; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-12-14 05:45:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 07:23:46 +01:00
										 |  |  |         try { | 
					
						
							|  |  |  |             $result->data = decrypt($result->data); | 
					
						
							|  |  |  |         } catch (DecryptException $e) { | 
					
						
							| 
									
										
										
										
											2024-12-14 05:39:55 +01:00
										 |  |  |             Log::error(sprintf('Could not decrypt configuration value "%s": %s', $name, $e->getMessage())); | 
					
						
							| 
									
										
										
										
											2024-12-14 05:45:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 07:23:46 +01:00
										 |  |  |             return $result; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-12-14 05:45:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 07:23:46 +01:00
										 |  |  |         return $result; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-12-20 19:35:52 +01:00
										 |  |  |      * @param null|bool|int|string $default | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |      * @throws FireflyException | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-07-27 05:03:37 +02:00
										 |  |  |     public function get(string $name, $default = null): ?Configuration | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-12-22 20:37:54 +01:00
										 |  |  |         $fullName = 'ff-config-'.$name; | 
					
						
							|  |  |  |         if (\Cache::has($fullName)) { | 
					
						
							|  |  |  |             return \Cache::get($fullName); | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-06 12:14:55 +02:00
										 |  |  |         try { | 
					
						
							| 
									
										
										
										
											2023-12-20 19:35:52 +01:00
										 |  |  |             /** @var null|Configuration $config */ | 
					
						
							| 
									
										
										
										
											2020-06-06 12:14:55 +02:00
										 |  |  |             $config = Configuration::where('name', $name)->first(['id', 'name', 'data']); | 
					
						
							| 
									
										
										
										
											2024-12-22 20:37:54 +01:00
										 |  |  |         } catch (\Exception|QueryException $e) { | 
					
						
							| 
									
										
										
										
											2022-12-30 20:25:04 +01:00
										 |  |  |             throw new FireflyException(sprintf('Could not poll the database: %s', $e->getMessage()), 0, $e); | 
					
						
							| 
									
										
										
										
											2020-06-06 12:14:55 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-06 17:00:16 +02:00
										 |  |  |         if (null !== $config) { | 
					
						
							| 
									
										
										
										
											2024-12-22 20:37:54 +01:00
										 |  |  |             \Cache::forever($fullName, $config); | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             return $config; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // no preference found and default is null:
 | 
					
						
							| 
									
										
										
										
											2017-11-15 12:25:49 +01:00
										 |  |  |         if (null === $default) { | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-07 21:01:46 +01:00
										 |  |  |         return $this->set($name, $default); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 07:23:46 +01:00
										 |  |  |     public function set(string $name, mixed $value): Configuration | 
					
						
							| 
									
										
										
										
											2021-09-18 10:26:12 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             $config = Configuration::whereName($name)->whereNull('deleted_at')->first(); | 
					
						
							| 
									
										
										
										
											2022-12-30 20:25:04 +01:00
										 |  |  |         } catch (QueryException $e) { | 
					
						
							| 
									
										
										
										
											2023-10-29 06:32:00 +01:00
										 |  |  |             app('log')->error($e->getMessage()); | 
					
						
							| 
									
										
										
										
											2022-10-30 14:24:37 +01:00
										 |  |  |             $item       = new Configuration(); | 
					
						
							| 
									
										
										
										
											2021-09-18 10:26:12 +02:00
										 |  |  |             $item->name = $name; | 
					
						
							|  |  |  |             $item->data = $value; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return $item; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (null === $config) { | 
					
						
							| 
									
										
										
										
											2022-10-30 14:24:37 +01:00
										 |  |  |             $item       = new Configuration(); | 
					
						
							| 
									
										
										
										
											2021-09-18 10:26:12 +02:00
										 |  |  |             $item->name = $name; | 
					
						
							|  |  |  |             $item->data = $value; | 
					
						
							|  |  |  |             $item->save(); | 
					
						
							| 
									
										
										
										
											2024-12-22 20:37:54 +01:00
										 |  |  |             \Cache::forget('ff-config-'.$name); | 
					
						
							| 
									
										
										
										
											2021-09-18 10:26:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             return $item; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $config->data = $value; | 
					
						
							|  |  |  |         $config->save(); | 
					
						
							| 
									
										
										
										
											2024-12-22 20:37:54 +01:00
										 |  |  |         \Cache::forget('ff-config-'.$name); | 
					
						
							| 
									
										
										
										
											2021-09-18 10:26:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $config; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-12-20 19:35:52 +01:00
										 |  |  |      * @param mixed $default | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getFresh(string $name, $default = null): ?Configuration | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $config = Configuration::where('name', $name)->first(['id', 'name', 'data']); | 
					
						
							| 
									
										
										
										
											2023-11-05 09:40:45 +01:00
										 |  |  |         if (null !== $config) { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             return $config; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // no preference found and default is null:
 | 
					
						
							|  |  |  |         if (null === $default) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $this->set($name, $default); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-12-20 19:35:52 +01:00
										 |  |  |      * @param mixed $value | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function put(string $name, $value): Configuration | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->set($name, $value); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-22 08:43:12 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function setEncrypted(string $name, mixed $value): Configuration | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             $encrypted = encrypt($value); | 
					
						
							|  |  |  |         } catch (EncryptException $e) { | 
					
						
							|  |  |  |             Log::error(sprintf('Could not encrypt configuration value "%s": %s', $name, $e->getMessage())); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             throw new FireflyException(sprintf('Could not encrypt configuration value "%s". Cowardly refuse to continue.', $name)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $this->set($name, $encrypted); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-07-24 18:47:55 +02:00
										 |  |  | } |