diff --git a/Iceshrimp.Backend/Core/Services/ObjectStorageService.cs b/Iceshrimp.Backend/Core/Services/ObjectStorageService.cs index 8b2f287d..eb9bfac9 100644 --- a/Iceshrimp.Backend/Core/Services/ObjectStorageService.cs +++ b/Iceshrimp.Backend/Core/Services/ObjectStorageService.cs @@ -12,10 +12,21 @@ namespace Iceshrimp.Backend.Core.Services; public class ObjectStorageService(IOptions config, HttpClient httpClient) { private readonly string? _accessUrl = config.Value.ObjectStorage?.AccessUrl; - private readonly S3Bucket _bucket = GetBucket(config); + private readonly S3Bucket? _bucket = GetBucketSafely(config); private readonly string? _prefix = config.Value.ObjectStorage?.Prefix?.Trim('/'); + private static S3Bucket? GetBucketSafely(IOptions config) { + if (config.Value.Mode != Enums.FileStorage.Local) return GetBucket(config); + + try { + return GetBucket(config); + } + catch { + return null; + } + } + private static S3Bucket GetBucket(IOptions config) { var s3Config = config.Value.ObjectStorage ?? throw new Exception("Invalid object storage configuration"); @@ -24,7 +35,7 @@ public class ObjectStorageService(IOptions config, HttpCl var accessKey = s3Config.KeyId ?? throw new Exception("Invalid object storage access key"); var secretKey = s3Config.SecretKey ?? throw new Exception("Invalid object storage secret key"); var bucket = s3Config.Bucket ?? throw new Exception("Invalid object storage bucket"); - + if (config.Value.ObjectStorage?.AccessUrl == null) throw new Exception("Invalid object storage access url"); @@ -52,14 +63,17 @@ public class ObjectStorageService(IOptions config, HttpCl } public async Task UploadFileAsync(string filename, byte[] data) { + if (_bucket == null) throw new Exception("Refusing to upload to object storage with invalid configuration"); await _bucket.PutAsync(new Blob(GetFilenameWithPrefix(filename), data)); } public async Task UploadFileAsync(string filename, Stream data) { + if (_bucket == null) throw new Exception("Refusing to upload to object storage with invalid configuration"); await _bucket.PutAsync(new Blob(GetFilenameWithPrefix(filename), data)); } public async Task UploadFileAsync(byte[] data) { + if (_bucket == null) throw new Exception("Refusing to upload to object storage with invalid configuration"); var filename = Guid.NewGuid().ToString().ToLowerInvariant(); await _bucket.PutAsync(new Blob(GetFilenameWithPrefix(filename), data)); return filename; @@ -71,6 +85,8 @@ public class ObjectStorageService(IOptions config, HttpCl } public async ValueTask GetFileAsync(string filename) { + if (_bucket == null) throw new Exception("Refusing to get file from object storage with invalid configuration"); + try { var res = await _bucket.GetAsync(GetFilenameWithPrefix(filename)); return await res.OpenAsync(); @@ -81,6 +97,8 @@ public class ObjectStorageService(IOptions config, HttpCl } public async Task RemoveFilesAsync(params string[] filenames) { + if (_bucket == null) + throw new Exception("Refusing to remove file from object storage with invalid configuration"); await _bucket.DeleteAsync(filenames.Select(GetFilenameWithPrefix).ToImmutableList()); }