🐛 Fixes some issues in file controller
This commit is contained in:
@@ -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)
|
||||||
|
return true;
|
||||||
|
|
||||||
if (permission is null)
|
var permissions = await db.FilePermissions
|
||||||
{
|
.Where(p => p.FileId == file.Id)
|
||||||
var isOwner = currentUser is not null && file.AccountId == Guid.Parse(currentUser.Id);
|
.ToListAsync();
|
||||||
if (isOwner)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (permission.SubjectType == SnFilePermissionType.Anyone)
|
foreach (var perm in permissions)
|
||||||
{
|
{
|
||||||
var hasAccess = requiredLevel == SnFilePermissionLevel.Read
|
switch (perm.SubjectType)
|
||||||
|| (requiredLevel == SnFilePermissionLevel.Write &&
|
|
||||||
permission.Permission == SnFilePermissionLevel.Write);
|
|
||||||
return hasAccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (permission.SubjectType == SnFilePermissionType.Someone && currentUser is not null)
|
|
||||||
{
|
|
||||||
if (permission.SubjectId == currentUser.Id)
|
|
||||||
{
|
{
|
||||||
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();
|
||||||
|
|
||||||
if (permission is null)
|
foreach (var perm in permissions)
|
||||||
return false;
|
{
|
||||||
|
if (perm.Permission != SnFilePermissionLevel.Write) continue;
|
||||||
|
|
||||||
return permission.Permission == SnFilePermissionLevel.Write;
|
switch (perm.SubjectType)
|
||||||
|
{
|
||||||
|
case SnFilePermissionType.Anyone:
|
||||||
|
return true;
|
||||||
|
case SnFilePermissionType.Someone when currentUser != null && perm.SubjectId == currentUser.Id:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user