Skip to content
Snippets Groups Projects
Commit fb9953d0 authored by Benedikt Heinrichs's avatar Benedikt Heinrichs
Browse files

Merge branch 'Topic/183-connectToGitlab' into 'Product/152-connectToRds'

New: Gitlab implementation

See merge request coscine/api/project!12
parents c1fab9de 3d454cbd
Branches
Tags
2 merge requests!13New: Handling multiple DataSources,!12New: Gitlab implementation
......@@ -10,6 +10,16 @@ To use Kestrel you need to add the following NuGet packages:
* ```Microsoft.AspNetCore.Mvc```
* ```Microsoft.AspNetCore```
## Consul keys
The following Consul keys are required:
* "coscine/global/waterbutler_url"
* "coscine/global/rds_access_key"
* "coscine/global/rds_secret_key"
* "coscine/global/gitlabtoken"
* Look at cs/action Consul keys
## Https usage
Generate a developer certificate: ```dotnet dev-certs https```
......
......@@ -10,6 +10,16 @@ To use Kestrel you need to add the following NuGet packages:
* ```Microsoft.AspNetCore.Mvc```
* ```Microsoft.AspNetCore```
## Consul keys
The following Consul keys are required:
* "coscine/global/waterbutler_url"
* "coscine/global/rds_access_key"
* "coscine/global/rds_secret_key"
* "coscine/global/gitlabtoken"
* Look at cs/action Consul keys
## Https usage
Generate a developer certificate: ```dotnet dev-certs https```
......
......@@ -20,7 +20,7 @@ namespace Coscine.Api.Project.Controllers
{
private readonly IConfiguration _configuration;
private readonly JWTHandler _jwtHandler;
private static readonly HttpClient _client = new HttpClient();
private static readonly HttpClient Client = new HttpClient();
private readonly Authenticator _authenticator;
private readonly ResourceModel _resourceModel;
......@@ -59,14 +59,11 @@ namespace Coscine.Api.Project.Controllers
return NotFound($"Could not find resource with id: {resourceId}");
}
// Temporary
#if (!DEBUG)
var user = _authenticator.GetUserFromToken();
if (!_resourceModel.OwnsResource(user, resource))
{
return Forbid($"The user does not own the resource {resourceId}");
}
#endif
if (resource.Type == null)
{
......@@ -82,7 +79,7 @@ namespace Coscine.Api.Project.Controllers
}
else if (resource.Type.DisplayName.ToLower() == "gitlab")
{
authHeader = BuildGitlabAuthHeader();
authHeader = BuildGitlabAuthHeader(resource.ExternalId, resource.Url);
}
if (authHeader != null)
......@@ -94,7 +91,7 @@ namespace Coscine.Api.Project.Controllers
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authHeader);
// Thread safe according to msdn and HttpCompletionOption sets it to get only headers first.
var response = await _client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
if (response.IsSuccessStatusCode)
{
if (response.Content.Headers.Contains("Content-Disposition"))
......@@ -117,7 +114,7 @@ namespace Coscine.Api.Project.Controllers
else
if (response.StatusCode == System.Net.HttpStatusCode.Forbidden)
{
return Forbid($"Not allowed to access the datasource.");
return Forbid("Not allowed to access the datasource.");
}
else
{
......@@ -131,6 +128,24 @@ namespace Coscine.Api.Project.Controllers
}
}
private string BuildWaterbutlerPayload(Dictionary<string, object> auth, Dictionary<string, object> credentials, Dictionary<string, object> settings)
{
var data = new Dictionary<string, object>
{
{ "auth", auth },
{ "credentials", credentials },
{ "settings", settings },
{ "callback_url", "rwth-aachen.de" }
};
var payload = new JwtPayload
{
{ "data", data }
};
return _jwtHandler.GenerateJwtToken(payload);
}
private string BuildRdsAuthHeader(string bucketname)
{
var auth = new Dictionary<string, object>();
......@@ -146,25 +161,28 @@ namespace Coscine.Api.Project.Controllers
{ "bucket", bucketname }
};
var data = new Dictionary<string, object>
return BuildWaterbutlerPayload(auth, credentials, settings);
}
private string BuildGitlabAuthHeader(string externalId, string url)
{
{ "auth", auth },
{ "credentials", credentials },
{ "settings", settings },
{ "callback_url", "rwth-aachen.de" }
};
var payload = new JwtPayload
var auth = new Dictionary<string, object>();
var credentials = new Dictionary<string, object>
{
{ "data", data }
{ "token", _configuration.GetString("coscine/global/gitlabtoken") }
};
return _jwtHandler.GenerateJwtToken(payload);
}
private string BuildGitlabAuthHeader()
var settings = new Dictionary<string, object>
{
return null;
{"owner", "Tester"},
{"repo", url},
{ "repo_id", externalId},
{ "host", "https://git.rwth-aachen.de"}
};
return BuildWaterbutlerPayload(auth, credentials, settings);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment