diff --git a/README.md b/README.md index 0c19291b139d4942bb89846d3f86a46eaa867e65..62cb4b10e1cc95e1b269d12749cbf0de6a3f7a68 100644 --- a/README.md +++ b/README.md @@ -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``` diff --git a/docs/home.md b/docs/home.md index 0c19291b139d4942bb89846d3f86a46eaa867e65..62cb4b10e1cc95e1b269d12749cbf0de6a3f7a68 100644 --- a/docs/home.md +++ b/docs/home.md @@ -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``` diff --git a/src/Project/Controllers/DataSourceController.cs b/src/Project/Controllers/DataSourceController.cs index 5c617c8235f6bcfb540298d7ab8819dc1e0a0ed8..26b4944897321702e4d4a9b3b84981f53eca5e82 100644 --- a/src/Project/Controllers/DataSourceController.cs +++ b/src/Project/Controllers/DataSourceController.cs @@ -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,40 +128,61 @@ 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>(); var credentials = new Dictionary<string, object> - { - { "access_key", _configuration.GetString("coscine/global/rds_access_key") }, - { "secret_key", _configuration.GetString("coscine/global/rds_secret_key") } - }; + { + { "access_key", _configuration.GetString("coscine/global/rds_access_key") }, + { "secret_key", _configuration.GetString("coscine/global/rds_secret_key") } + }; var settings = new Dictionary<string, object> - { - { "bucket", bucketname } - }; - - var data = new Dictionary<string, object> - { - { "auth", auth }, - { "credentials", credentials }, - { "settings", settings }, - { "callback_url", "rwth-aachen.de" } - }; - - var payload = new JwtPayload - { - { "data", data } - }; + { + { "bucket", bucketname } + }; - return _jwtHandler.GenerateJwtToken(payload); + return BuildWaterbutlerPayload(auth, credentials, settings); } - private string BuildGitlabAuthHeader() + private string BuildGitlabAuthHeader(string externalId, string url) { - return null; + + var auth = new Dictionary<string, object>(); + + var credentials = new Dictionary<string, object> + { + { "token", _configuration.GetString("coscine/global/gitlabtoken") } + }; + + var settings = new Dictionary<string, object> + { + {"owner", "Tester"}, + {"repo", url}, + { "repo_id", externalId}, + { "host", "https://git.rwth-aachen.de"} + }; + + return BuildWaterbutlerPayload(auth, credentials, settings); } } }