🐛 Fixes some issues in file controller

This commit is contained in:
2026-01-13 19:36:18 +08:00
parent 979e0cb3f2
commit 1173f98ec6

View File

@@ -74,39 +74,33 @@ public class FileController(
: null; : null;
} }
private async Task<bool> CheckFilePermissionAsync(SnCloudFile file, Account? currentUser, private async Task<bool> CheckFilePermissionAsync(
SnFilePermissionLevel requiredLevel) SnCloudFile file,
Account? currentUser,
SnFilePermissionLevel requiredLevel
)
{ {
if (currentUser?.IsSuperuser == true) if (currentUser?.IsSuperuser == true)
return true; return true;
var permission = await db.FilePermissions Guid? accountId = currentUser is not null ? Guid.Parse(currentUser.Id) : null;
.FirstOrDefaultAsync(p => p.FileId == file.Id); if (file.AccountId == accountId)
if (permission is null)
{
var isOwner = currentUser is not null && file.AccountId == Guid.Parse(currentUser.Id);
if (isOwner)
return true; return true;
return false;
}
if (permission.SubjectType == SnFilePermissionType.Anyone) var permissions = await db.FilePermissions
{ .Where(p => p.FileId == file.Id)
var hasAccess = requiredLevel == SnFilePermissionLevel.Read .ToListAsync();
|| (requiredLevel == SnFilePermissionLevel.Write &&
permission.Permission == SnFilePermissionLevel.Write);
return hasAccess;
}
if (permission.SubjectType == SnFilePermissionType.Someone && currentUser is not null) foreach (var perm in permissions)
{ {
if (permission.SubjectId == currentUser.Id) switch (perm.SubjectType)
{ {
var hasAccess = requiredLevel == SnFilePermissionLevel.Read case SnFilePermissionType.Anyone:
|| (requiredLevel == SnFilePermissionLevel.Write && case SnFilePermissionType.Someone when currentUser != null && perm.SubjectId == currentUser.Id:
permission.Permission == SnFilePermissionLevel.Write); if (requiredLevel == SnFilePermissionLevel.Read ||
return hasAccess; (requiredLevel == SnFilePermissionLevel.Write && perm.Permission == SnFilePermissionLevel.Write))
return true;
break;
} }
} }
@@ -121,13 +115,24 @@ public class FileController(
if (currentUser is not null && file.AccountId == Guid.Parse(currentUser.Id)) if (currentUser is not null && file.AccountId == Guid.Parse(currentUser.Id))
return true; return true;
var permission = await db.FilePermissions var permissions = await db.FilePermissions
.FirstOrDefaultAsync(p => p.FileId == file.Id); .Where(p => p.FileId == file.Id)
.ToListAsync();
foreach (var perm in permissions)
{
if (perm.Permission != SnFilePermissionLevel.Write) continue;
switch (perm.SubjectType)
{
case SnFilePermissionType.Anyone:
return true;
case SnFilePermissionType.Someone when currentUser != null && perm.SubjectId == currentUser.Id:
return true;
}
}
if (permission is null)
return false; return false;
return permission.Permission == SnFilePermissionLevel.Write;
} }
private Task<ActionResult> ServeLocalFile(SnCloudFile file) private Task<ActionResult> ServeLocalFile(SnCloudFile file)
@@ -136,7 +141,8 @@ public class FileController(
var hasWritePermission = Task.Run(() => HasWritePermissionAsync(file, currentUser)).GetAwaiter().GetResult(); var hasWritePermission = Task.Run(() => HasWritePermissionAsync(file, currentUser)).GetAwaiter().GetResult();
var accessToken = GenerateLocalSignedToken(file.Id, currentUser?.Id, hasWritePermission); var accessToken = GenerateLocalSignedToken(file.Id, currentUser?.Id, hasWritePermission);
var accessUrl = $"/api/files/{file.Id}/access?token={accessToken}"; var gatewayUrl = configuration["GatewayUrl"];
var accessUrl = $"{gatewayUrl}/drive/files/{file.Id}/access?token={accessToken}";
return Task.FromResult<ActionResult>(Redirect(accessUrl)); return Task.FromResult<ActionResult>(Redirect(accessUrl));
} }