setConfigDynamically($settings); $this->registerAdapters(); $messages = array_merge( is_null(config('common.site.uploads_disk_driver')) ? [] : $this->validateDisk('uploads'), $this->validateDisk('public'), ); return empty($messages) ? false : $messages; } private function validateDisk(string $diskName): array { $driverName = Config::get("common.site.{$diskName}_disk_driver"); try { $disk = Storage::disk($diskName); if ($disk->getAdapter() instanceof DropboxAdapter) { // dropbox adapter catches all errors silently // need to use client directly to check for errors $disk ->getAdapter() ->getClient() ->listFolder(); } else { $disk->allFiles(); } } catch (S3Exception $e) { return $this->getS3Message($e); } catch (Exception $e) { $message = $e->getMessage(); if ( Str::contains( $message, 'ftp_chdir(): Failed to change directory', ) ) { $message = 'Could not open "uploads" directory. You might need to create it manually via any FTP manager.'; } return [ 'storage_group' => "Invalid $driverName credentials.
{$message}", ]; } return []; } private function getS3Message(S3Exception $e): array { return [ 'storage_group' => "Could not validate credentials.
{$e->getAwsErrorMessage()}", ]; } private function setConfigDynamically($settings): void { $replacements = [ 's3', 'dropbox', 'ftp', 'digitalocean', 'rackspace', 'backblaze', ]; foreach ($settings as $key => $value) { if ($key === 'uploads_disk_driver') { Config::set('common.site.uploads_disk_driver', $value ?: null); } elseif ($key === 'public_disk_driver') { Config::set('common.site.public_disk_driver', $value ?: null); } else { // uploads_s3_key => services.s3.key $key = str_replace('storage_', '', $key); $key = preg_replace('/_/', '.', $key, 1); $key = "services.$key"; foreach ($replacements as $replacement) { $key = str_replace( "{$replacement}_", "{$replacement}.", $key, ); } $key = str_replace('digitalocean.', 'digitalocean_s3.', $key); $key = str_replace('backblaze.', 'backblaze_s3.', $key); Config::set($key, $value ?: null); } } } private function registerAdapters(): void { app()->register(DigitalOceanServiceProvider::class); app()->register(DropboxServiceProvider::class); app()->register(BackblazeServiceProvider::class); } }