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);
}
}