Skip to content
Snippets Groups Projects
Commit 5c10c1ce authored by Marcel Nellesen's avatar Marcel Nellesen
Browse files

Merge branch 'Topic/664-filesView' into 'Product/654-filesView'

New: quota endpoint

See merge request coscine/api/file!4
parents 3a88ed0d 9b7a823b
Branches
Tags
2 merge requests!6Product/654-filesView,!4New: quota endpoint
...@@ -265,3 +265,6 @@ __pycache__/ ...@@ -265,3 +265,6 @@ __pycache__/
tools/* tools/*
!tools/packages.config !tools/packages.config
dist/ dist/
#linq2db
src/.tools/*
\ No newline at end of file
...@@ -19,6 +19,8 @@ using Coscine.Configuration; ...@@ -19,6 +19,8 @@ using Coscine.Configuration;
using Coscine.Database.ReturnObjects; using Coscine.Database.ReturnObjects;
using Coscine.ApiCommons.Factories; using Coscine.ApiCommons.Factories;
using System.Web; using System.Web;
using Amazon.S3;
using Amazon.S3.Model;
namespace Coscine.Api.File.Controllers namespace Coscine.Api.File.Controllers
{ {
...@@ -31,6 +33,9 @@ namespace Coscine.Api.File.Controllers ...@@ -31,6 +33,9 @@ namespace Coscine.Api.File.Controllers
private static readonly HttpClient Client; private static readonly HttpClient Client;
private readonly Authenticator _authenticator; private readonly Authenticator _authenticator;
private readonly ResourceModel _resourceModel; private readonly ResourceModel _resourceModel;
private readonly string _accessKey;
private readonly string _secretKey;
private readonly AmazonS3Config _amazonConfig;
static DataSourceController() static DataSourceController()
{ {
...@@ -46,8 +51,92 @@ namespace Coscine.Api.File.Controllers ...@@ -46,8 +51,92 @@ namespace Coscine.Api.File.Controllers
_jwtHandler = new JWTHandler(_configuration); _jwtHandler = new JWTHandler(_configuration);
_authenticator = new Authenticator(this, _configuration); _authenticator = new Authenticator(this, _configuration);
_resourceModel = new ResourceModel(); _resourceModel = new ResourceModel();
_accessKey = _configuration.GetStringAndWait("coscine/global/buckets/accessKey");
_secretKey = _configuration.GetStringAndWait("coscine/global/buckets/secretKey");
_amazonConfig = new AmazonS3Config
{
ServiceURL = "https://s3.rwth-aachen.de/",
ForcePathStyle = true
};
}
[HttpGet("[controller]/{resourceId}/quota")]
public IActionResult GetQuota(string resourceId)
{
if (!Guid.TryParse(resourceId, out Guid resourceGuid))
{
return BadRequest($"{resourceId} is not a guid.");
}
var user = _authenticator.GetUser();
Resource resource;
try
{
resource = _resourceModel.GetById(resourceGuid);
if (resource == null)
{
return NotFound($"Could not find resource with id: {resourceId}");
}
}
catch (Exception)
{
return NotFound($"Could not find resource with id: {resourceId}");
}
if (resource.Type == null)
{
ResourceTypeModel resourceTypeModel = new ResourceTypeModel();
resource.Type = resourceTypeModel.GetById(resource.TypeId);
} }
if (!_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
{
return BadRequest("User does not have permission to the resource.");
}
if (resource.Type.DisplayName.ToLower() == "rds" && resource.ResourceTypeOptionId.HasValue)
{
var rdsResourceTypeModel = new RDSResourceTypeModel();
var rdsResourceType = rdsResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
var bucketname = rdsResourceType.BucketName;
using (var client = new AmazonS3Client(_accessKey, _secretKey, _amazonConfig))
{
long totalFileSize = 0;
long fileCount = 0;
ListObjectsRequest listReqeust = new ListObjectsRequest()
{
BucketName = bucketname
};
ListObjectsResponse listResponse;
try
{
do
{
listResponse = client.ListObjects(listReqeust);
fileCount += listResponse.S3Objects.Count();
totalFileSize += listResponse.S3Objects.Sum(x => x.Size);
listReqeust.Marker = listResponse.NextMarker;
} while (listResponse.IsTruncated);
}
catch (Exception)
{
return StatusCode(500);
}
return Ok($"{{ \"data\": {{ \"fileCount\": {fileCount}, \"usedSizeByte\": {totalFileSize} }}}}");
}
}
else
{
return BadRequest("The resourcetype must be rds.");
}
}
// inferring a ../ (urlencoded) can manipulate the url. // inferring a ../ (urlencoded) can manipulate the url.
// However the constructed signature for s3 won't match and it will not be resolved. // However the constructed signature for s3 won't match and it will not be resolved.
// This may be a problem for other provider! // This may be a problem for other provider!
......
...@@ -42,6 +42,12 @@ ...@@ -42,6 +42,12 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="AWSSDK.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=885c28607f98e604, processorArchitecture=MSIL">
<HintPath>packages\AWSSDK.Core.3.3.104.31\lib\net45\AWSSDK.Core.dll</HintPath>
</Reference>
<Reference Include="AWSSDK.S3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=885c28607f98e604, processorArchitecture=MSIL">
<HintPath>packages\AWSSDK.S3.3.3.110.29\lib\net45\AWSSDK.S3.dll</HintPath>
</Reference>
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"> <Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll</HintPath> <HintPath>packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll</HintPath>
</Reference> </Reference>
...@@ -494,6 +500,7 @@ ...@@ -494,6 +500,7 @@
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Analyzer Include="packages\AWSSDK.S3.3.3.110.29\analyzers\dotnet\cs\AWSSDK.S3.CodeAnalysis.dll" />
<Analyzer Include="packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\analyzers\dotnet\cs\Microsoft.CodeAnalysis.Analyzers.dll" /> <Analyzer Include="packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\analyzers\dotnet\cs\Microsoft.CodeAnalysis.Analyzers.dll" />
<Analyzer Include="packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\analyzers\dotnet\cs\Microsoft.CodeAnalysis.CSharp.Analyzers.dll" /> <Analyzer Include="packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\analyzers\dotnet\cs\Microsoft.CodeAnalysis.CSharp.Analyzers.dll" />
</ItemGroup> </ItemGroup>
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="AWSSDK.Core" version="3.3.104.31" targetFramework="net461" />
<package id="AWSSDK.S3" version="3.3.110.29" targetFramework="net461" />
<package id="Castle.Core" version="4.4.0" targetFramework="net461" /> <package id="Castle.Core" version="4.4.0" targetFramework="net461" />
<package id="Consul" version="0.7.2.6" targetFramework="net461" /> <package id="Consul" version="0.7.2.6" targetFramework="net461" />
<package id="Coscine.ApiCommons" version="1.6.0" targetFramework="net461" /> <package id="Coscine.ApiCommons" version="1.6.0" targetFramework="net461" />
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment