123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- <?php
- namespace App\Services;
- use App\Models\ConfigCache as ConfigCacheModel;
- use Cache;
- use Illuminate\Database\QueryException;
- class ConfigCacheService
- {
- const CACHE_KEY = 'config_cache:_v0-key:';
- const PROTECTED_KEYS = [
- 'filesystems.disks.s3.key',
- 'filesystems.disks.s3.secret',
- 'filesystems.disks.spaces.key',
- 'filesystems.disks.spaces.secret',
- 'captcha.secret',
- 'captcha.sitekey',
- ];
- public static function get($key)
- {
- $cacheKey = self::CACHE_KEY.$key;
- $ttl = now()->addHours(12);
- if (! config('instance.enable_cc')) {
- return config($key);
- }
- try {
- return Cache::remember($cacheKey, $ttl, function () use ($key) {
- $allowed = [
- 'app.name',
- 'app.short_description',
- 'app.description',
- 'app.rules',
- 'pixelfed.max_photo_size',
- 'pixelfed.max_album_length',
- 'pixelfed.image_quality',
- 'pixelfed.media_types',
- 'pixelfed.open_registration',
- 'federation.activitypub.enabled',
- 'instance.stories.enabled',
- 'pixelfed.oauth_enabled',
- 'pixelfed.import.instagram.enabled',
- 'pixelfed.bouncer.enabled',
- 'federation.activitypub.authorized_fetch',
- 'pixelfed.enforce_email_verification',
- 'pixelfed.max_account_size',
- 'pixelfed.enforce_account_limit',
- 'uikit.custom.css',
- 'uikit.custom.js',
- 'uikit.show_custom.css',
- 'uikit.show_custom.js',
- 'about.title',
- 'pixelfed.cloud_storage',
- 'account.autofollow',
- 'account.autofollow_usernames',
- 'config.discover.features',
- 'instance.has_legal_notice',
- 'instance.avatar.local_to_cloud',
- 'pixelfed.directory',
- 'app.banner_image',
- 'pixelfed.directory.submission-key',
- 'pixelfed.directory.submission-ts',
- 'pixelfed.directory.has_submitted',
- 'pixelfed.directory.latest_response',
- 'pixelfed.directory.is_synced',
- 'pixelfed.directory.testimonials',
- 'instance.landing.show_directory',
- 'instance.landing.show_explore',
- 'instance.admin.pid',
- 'instance.banner.blurhash',
- 'autospam.nlp.enabled',
- 'instance.curated_registration.enabled',
- 'federation.migration',
- 'pixelfed.max_caption_length',
- 'pixelfed.max_bio_length',
- 'pixelfed.max_name_length',
- 'pixelfed.min_password_length',
- 'pixelfed.max_avatar_size',
- 'pixelfed.max_altext_length',
- 'pixelfed.allow_app_registration',
- 'pixelfed.app_registration_rate_limit_attempts',
- 'pixelfed.app_registration_rate_limit_decay',
- 'pixelfed.app_registration_confirm_rate_limit_attempts',
- 'pixelfed.app_registration_confirm_rate_limit_decay',
- 'instance.embed.profile',
- 'instance.embed.post',
- 'captcha.enabled',
- 'captcha.secret',
- 'captcha.sitekey',
- 'captcha.active.login',
- 'captcha.active.register',
- 'captcha.triggers.login.enabled',
- 'captcha.triggers.login.attempts',
- 'federation.custom_emoji.enabled',
- 'pixelfed.optimize_image',
- 'pixelfed.optimize_video',
- 'pixelfed.max_collection_length',
- 'media.delete_local_after_cloud',
- 'instance.user_filters.max_user_blocks',
- 'instance.user_filters.max_user_mutes',
- 'instance.user_filters.max_domain_blocks',
- 'filesystems.disks.s3.key',
- 'filesystems.disks.s3.secret',
- 'filesystems.disks.s3.region',
- 'filesystems.disks.s3.bucket',
- 'filesystems.disks.s3.visibility',
- 'filesystems.disks.s3.url',
- 'filesystems.disks.s3.endpoint',
- 'filesystems.disks.s3.use_path_style_endpoint',
- 'filesystems.disks.spaces.key',
- 'filesystems.disks.spaces.secret',
- 'filesystems.disks.spaces.region',
- 'filesystems.disks.spaces.bucket',
- 'filesystems.disks.spaces.visibility',
- 'filesystems.disks.spaces.url',
- 'filesystems.disks.spaces.endpoint',
- 'filesystems.disks.spaces.use_path_style_endpoint',
- 'instance.stats.total_local_posts',
- // 'system.user_mode'
- ];
- if (! config('instance.enable_cc')) {
- return config($key);
- }
- if (! in_array($key, $allowed)) {
- return config($key);
- }
- $protect = false;
- $protected = null;
- if (in_array($key, self::PROTECTED_KEYS)) {
- $protect = true;
- }
- $v = config($key);
- $c = ConfigCacheModel::where('k', $key)->first();
- if ($c) {
- if ($protect) {
- return decrypt($c->v) ?? config($key);
- } else {
- return $c->v ?? config($key);
- }
- }
- if (! $v) {
- return;
- }
- if ($protect && $v) {
- $protected = encrypt($v);
- }
- $cc = new ConfigCacheModel;
- $cc->k = $key;
- $cc->v = $protect ? $protected : $v;
- $cc->save();
- return $v;
- });
- } catch (Exception|QueryException $e) {
- return config($key);
- }
- }
- public static function put($key, $val)
- {
- $exists = ConfigCacheModel::whereK($key)->first();
- $protect = false;
- $protected = null;
- if (in_array($key, self::PROTECTED_KEYS)) {
- $protect = true;
- $protected = encrypt($val);
- }
- if ($exists) {
- $exists->v = $protect ? $protected : $val;
- $exists->save();
- Cache::put(self::CACHE_KEY.$key, $val, now()->addHours(12));
- return self::get($key);
- }
- $cc = new ConfigCacheModel;
- $cc->k = $key;
- $cc->v = $protect ? $protected : $val;
- $cc->save();
- Cache::put(self::CACHE_KEY.$key, $val, now()->addHours(12));
- return self::get($key);
- }
- }
|