From f0a50ba70a70fd7839fc7b9ea1fc134034af59f2 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Tue, 13 Aug 2019 00:11:04 -0400 Subject: [PATCH] Implemented TokenManager #57 --- .gitmodules | 3 + Controllers/Managers/AlbumManager.cs | 28 ------- Controllers/Managers/ArtistManager.cs | 28 ------- Controllers/Managers/GenreManager.cs | 28 ------- Controllers/Managers/TokenManager.cs | 103 +++----------------------- Controllers/Managers/YearManager.cs | 28 ------- Controllers/v1/LoginController.cs | 23 ++++-- Controllers/v1/LogoutController.cs | 0 Libs/CMakeLists.txt | 12 ++- Libs/conanfile.txt | 5 ++ Libs/cpr | 1 + Libs/include/models.h | 20 +++++ Libs/src/token_manager.cpp | 41 ++++++++++ Models/LoginResult.cs | 34 ++++++--- Models/TokenReq.cs | 22 ++++++ Models/User.cs | 41 +++++----- 16 files changed, 176 insertions(+), 241 deletions(-) create mode 100644 .gitmodules delete mode 100644 Controllers/Managers/AlbumManager.cs delete mode 100644 Controllers/Managers/ArtistManager.cs delete mode 100644 Controllers/Managers/GenreManager.cs delete mode 100644 Controllers/Managers/YearManager.cs delete mode 100644 Controllers/v1/LogoutController.cs create mode 100644 Libs/conanfile.txt create mode 160000 Libs/cpr create mode 100644 Libs/src/token_manager.cpp create mode 100644 Models/TokenReq.cs diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..06db291 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Libs/cpr"] + path = Libs/cpr + url = https://github.com/whoshuu/cpr.git diff --git a/Controllers/Managers/AlbumManager.cs b/Controllers/Managers/AlbumManager.cs deleted file mode 100644 index 4a907f5..0000000 --- a/Controllers/Managers/AlbumManager.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; - -using Icarus.Controllers.Utilities; -using Icarus.Models; -using Icarus.Database.Contexts; - -namespace Icarus.Controllers.Managers -{ - public class AlbumManager : BaseManager - { - #region Fields - #endregion - - - #region Properties - #endregion - - - #region Constructors - #endregion - - - #region Methods - #endregion - } -} diff --git a/Controllers/Managers/ArtistManager.cs b/Controllers/Managers/ArtistManager.cs deleted file mode 100644 index a63f3e4..0000000 --- a/Controllers/Managers/ArtistManager.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; - -using Icarus.Controllers.Utilities; -using Icarus.Models; -using Icarus.Database.Contexts; - -namespace Icarus.Controllers.Managers -{ - public class ArtistManager : BaseManager - { - #region Fields - #endregion - - - #region Properties - #endregion - - - #region Constructors - #endregion - - - #region Methods - #endregion - } -} diff --git a/Controllers/Managers/GenreManager.cs b/Controllers/Managers/GenreManager.cs deleted file mode 100644 index 3571500..0000000 --- a/Controllers/Managers/GenreManager.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; - -using Icarus.Controllers.Utilities; -using Icarus.Models; -using Icarus.Database.Contexts; - -namespace Icarus.Controllers.Managers -{ - public class GenreManager : BaseManager - { - #region Fields - #endregion - - - #region Properties - #endregion - - - #region Constructors - #endregion - - - #region Methods - #endregion - } -} diff --git a/Controllers/Managers/TokenManager.cs b/Controllers/Managers/TokenManager.cs index 0809ad0..73cb0a0 100644 --- a/Controllers/Managers/TokenManager.cs +++ b/Controllers/Managers/TokenManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.InteropServices; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; @@ -14,11 +15,6 @@ namespace Icarus.Controllers.Managers { #region Fields private IConfiguration _config; - private string _clientId; - private string _clientSecret; - private string _audience; - private string _grantType; - private string _url; #endregion @@ -30,103 +26,26 @@ namespace Icarus.Controllers.Managers public TokenManager(IConfiguration config) { _config = config; - InitializeValues(); } #endregion #region Methods - public LoginResult RetrieveLoginResult(User user) + #region c++ Libs + [DllImport("libicarus.so")] + public static extern IntPtr retrieve_token(ref TokenReq req); + #endregion + + public static LoginResult ConvertLogResToLoginResult(ref LogRes res) { - _logger.Info("Preparing Auth0 API request"); - - var client = new RestClient(_url); - var request = new RestRequest("oauth/token", Method.POST); - var tokenRequest = RetrieveTokenRequest(); - - _logger.Info("Serializing token object into JSON"); - var tokenObject = JsonConvert.SerializeObject(tokenRequest); - - request.AddParameter("application/json; charset=utf-8", - tokenObject, ParameterType.RequestBody); - - request.RequestFormat = DataFormat.Json; - - _logger.Info("Sending request"); - IRestResponse response = client.Execute(request); - _logger.Info("Response received"); - - - _logger.Info("Deserializing response"); - var tokenResult = JsonConvert - .DeserializeObject(response.Content); - _logger.Info("Response deserialized"); - return new LoginResult { - UserId = user.Id, Username = user.Username, Token = tokenResult.AccessToken, - TokenType = tokenResult.TokenType, Expiration = tokenResult.Expiration, - Message = "Successfully retrieved token" + Token = res.Token, + TokenType = res.TokenType, + Expiration = res.Expiration, + Message = res.Message }; } - - private TokenRequest RetrieveTokenRequest() - { - _logger.Info("Retrieving token object"); - - return new TokenRequest - { - ClientId = _clientId, ClientSecret = _clientSecret, - Audience = _audience, GrantType = _grantType - }; - } - - private void InitializeValues() - { - _logger.Info("Analyzing Auth0 information"); - - _clientId = _config["Auth0:ClientId"]; - _clientSecret = _config["Auth0:ClientSecret"]; - _audience = _config["Auth0:ApiIdentifier"]; - _grantType = "client_credentials"; - _url = $"https://{_config["Auth0:Domain"]}"; - } - - #region Testing Methods - // For testing purposes - private void PrintCredentials() - { - Console.WriteLine("Auth0 credentials:"); - Console.WriteLine($"Client Id: {_clientId}"); - Console.WriteLine($"Client Secret: {_clientSecret}"); - Console.WriteLine($"Audience: {_audience}"); - Console.WriteLine($"Url: {_url}"); - } - #endregion - #endregion - - - #region Classes - private class TokenRequest - { - [JsonProperty("client_id")] - public string ClientId { get; set; } - [JsonProperty("client_secret")] - public string ClientSecret { get; set; } - [JsonProperty("audience")] - public string Audience { get; set; } - [JsonProperty("grant_type")] - public string GrantType { get; set; } - } - private class Token - { - [JsonProperty("access_token")] - public string AccessToken { get; set; } - [JsonProperty("expires_in")] - public int Expiration { get; set; } - [JsonProperty("token_type")] - public string TokenType { get; set; } - } #endregion } } diff --git a/Controllers/Managers/YearManager.cs b/Controllers/Managers/YearManager.cs deleted file mode 100644 index 7a77274..0000000 --- a/Controllers/Managers/YearManager.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; - -using Icarus.Controllers.Utilities; -using Icarus.Models; -using Icarus.Database.Contexts; - -namespace Icarus.Controllers.Managers -{ - public class YearManager : BaseManager - { - #region Fields - #endregion - - - #region Properties - #endregion - - - #region Constructors - #endregion - - - #region Methods - #endregion - } -} diff --git a/Controllers/v1/LoginController.cs b/Controllers/v1/LoginController.cs index 4fd898c..4372e6e 100644 --- a/Controllers/v1/LoginController.cs +++ b/Controllers/v1/LoginController.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Threading.Tasks; +using System.Runtime.InteropServices; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; @@ -47,7 +48,6 @@ namespace Icarus.Controllers.V1 _logger.LogInformation("Starting process of validating credentials"); var message = "Invalid credentials"; - var password = user.Password; var loginRes = new LoginResult { @@ -59,7 +59,7 @@ namespace Icarus.Controllers.V1 user = context.RetrieveUser(user); var validatePass = new PasswordEncryption(); - var validated = validatePass.VerifyPassword(user, password); + var validated = validatePass.VerifyPassword(user, user.Password); if (!validated) { loginRes.Message = message; @@ -70,9 +70,22 @@ namespace Icarus.Controllers.V1 _logger.LogInformation("Successfully validated user credentials"); - TokenManager tk = new TokenManager(_config); - - loginRes = tk.RetrieveLoginResult(user); + var tok = new TokenReq + { + ClientId = _config["Auth0:ClientId"], + ClientSecret = _config["Auth0:ClientSecret"], + Audience = _config["Auth0:ApiIdentifier"], + GrantType = "client_credentials", + URI = $"https://{_config["Auth0:Domain"]}", + Endpoint = "oauth/token" + }; + + IntPtr logRes = TokenManager.retrieve_token(ref tok); + LogRes lr = new LogRes(); + lr = (LogRes)Marshal.PtrToStructure(logRes, typeof(LogRes)); + loginRes = TokenManager.ConvertLogResToLoginResult(ref lr); + loginRes.Username = user.Username; + loginRes.UserId = user.Id; return Ok(loginRes); } diff --git a/Controllers/v1/LogoutController.cs b/Controllers/v1/LogoutController.cs deleted file mode 100644 index e69de29..0000000 diff --git a/Libs/CMakeLists.txt b/Libs/CMakeLists.txt index b93884e..f2d1db4 100644 --- a/Libs/CMakeLists.txt +++ b/Libs/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.10) -project(icarus CXX) +project(icarus) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 17) @@ -9,6 +9,7 @@ set(SOURCES src/directory_manager.cpp src/imageFile.cpp src/metadata_retriever.cpp + src/token_manager.cpp ) set(HEADERS include/models.h @@ -17,6 +18,11 @@ set(HEADERS include/metadata_retriever.h ) +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +add_subdirectory(cpr) + add_library(icarus SHARED ${SOURCES} ${HEADERS}) -include_directories(include) -target_link_libraries(icarus "-lstdc++fs" tag) +include_directories(${CPR_INCLUDE_DIRS} include) +target_link_libraries(icarus "-lstdc++fs" tag ${CONAN_LIBS} ${CPR_LIBRARIES}) diff --git a/Libs/conanfile.txt b/Libs/conanfile.txt new file mode 100644 index 0000000..411f105 --- /dev/null +++ b/Libs/conanfile.txt @@ -0,0 +1,5 @@ +[requires] +jsonformoderncpp/3.7.0@vthiery/stable + +[generators] +cmake diff --git a/Libs/cpr b/Libs/cpr new file mode 160000 index 0000000..feebd2f --- /dev/null +++ b/Libs/cpr @@ -0,0 +1 @@ +Subproject commit feebd2fd5467e219cf124acb5de3f8eee0d0970b diff --git a/Libs/include/models.h b/Libs/include/models.h index caa98dc..dbc5c67 100644 --- a/Libs/include/models.h +++ b/Libs/include/models.h @@ -20,4 +20,24 @@ struct Cover char ImagePath[1024]; }; +struct LoginRes +{ + int UserId; + char Username[1024]; + char Token[1024]; + char TokenType[1024]; + char Message[1024]; + int Expiration; +}; + +struct TokenReq +{ + char ClientId[1024]; + char ClientSecret[1024]; + char Audience[1024]; + char GrantType[1024]; + char URI[1024]; + char Endpoint[1024]; +}; + #endif diff --git a/Libs/src/token_manager.cpp b/Libs/src/token_manager.cpp new file mode 100644 index 0000000..7162920 --- /dev/null +++ b/Libs/src/token_manager.cpp @@ -0,0 +1,41 @@ +#include +#include +#include + +#include +#include + +#include "models.h" + + +extern "C" +{ + + +LoginRes* retrieve_token(TokenReq *tok) +{ + LoginRes *res = new LoginRes; + + nlohmann::json reqObj; + reqObj["client_id"] = tok->ClientId; + reqObj["client_secret"] = tok->ClientSecret; + reqObj["audience"] = tok->Audience; + reqObj["grant_type"] = tok->GrantType; + + std::string uri{tok->URI}; + uri.append("/"); + uri.append(tok->Endpoint); + + auto r = cpr::Post(cpr::Url{uri}, + cpr::Body{reqObj.dump()}, + cpr::Header{{"Content-Type", "application/json"}}); + + auto post_res = nlohmann::json::parse(r.text); + strcpy(res->Token, post_res["access_token"].get().c_str()); + strcpy(res->TokenType, post_res["token_type"].get().c_str()); + res->Expiration = post_res["expires_in"].get(); + strcpy(res->Message, "Success"); + + return res; +} +} diff --git a/Models/LoginResult.cs b/Models/LoginResult.cs index ef08a26..e03df38 100644 --- a/Models/LoginResult.cs +++ b/Models/LoginResult.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; using Newtonsoft.Json; @@ -7,14 +8,29 @@ namespace Icarus.Models public class LoginResult : BaseResult { [JsonProperty("id")] - public int UserId { get; set; } - [JsonProperty("username")] - public string Username { get; set; } - [JsonProperty("token")] - public string Token { get; set; } - [JsonProperty("token_type")] - public string TokenType { get; set; } - [JsonProperty("expiration")] - public int Expiration { get; set; } + public int UserId { get; set; } + [JsonProperty("username")] + public string Username { get; set; } + [JsonProperty("token")] + public string Token { get; set; } + [JsonProperty("token_type")] + public string TokenType { get; set; } + [JsonProperty("expiration")] + public int Expiration { get; set; } + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi), Serializable] + public struct LogRes + { + public int UserId; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string Username; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string Token; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string TokenType; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string Message; + public int Expiration; } } diff --git a/Models/TokenReq.cs b/Models/TokenReq.cs new file mode 100644 index 0000000..9b3b9ed --- /dev/null +++ b/Models/TokenReq.cs @@ -0,0 +1,22 @@ +using System; +using System.Runtime.InteropServices; + +namespace Icarus.Models +{ + [StructLayout(LayoutKind.Sequential)] + public struct TokenReq + { + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string ClientId; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string ClientSecret; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string Audience; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string GrantType; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string URI; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] + public string Endpoint; + } +} diff --git a/Models/User.cs b/Models/User.cs index 9c289d0..f4ec760 100644 --- a/Models/User.cs +++ b/Models/User.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; using Newtonsoft.Json; @@ -7,26 +8,26 @@ namespace Icarus.Models public class User { [JsonProperty("id")] - public int Id { get; set; } - [JsonProperty("username")] - public string Username { get; set; } - [JsonProperty("nickname")] - public string Nickname { get; set; } - [JsonProperty("password")] - public string Password { get; set; } - [JsonProperty("email")] - public string Email { get; set; } - [JsonProperty("phone_number")] - public string PhoneNumber { get; set; } - [JsonProperty("first_name")] - public string Firstname { get; set; } - [JsonProperty("last_name")] - public string Lastname { get; set; } - [JsonProperty("email_verified")] - public bool EmailVerified { get; set; } + public int Id { get; set; } + [JsonProperty("username")] + public string Username { get; set; } + [JsonProperty("nickname")] + public string Nickname { get; set; } + [JsonProperty("password")] + public string Password { get; set; } + [JsonProperty("email")] + public string Email { get; set; } + [JsonProperty("phone_number")] + public string PhoneNumber { get; set; } + [JsonProperty("first_name")] + public string Firstname { get; set; } + [JsonProperty("last_name")] + public string Lastname { get; set; } + [JsonProperty("email_verified")] + public bool EmailVerified { get; set; } [JsonProperty("date_created")] - public DateTime DateCreated { get; set; } - [JsonProperty("last_login")] - public DateTime? LastLogin { get; set; } + public DateTime DateCreated { get; set; } + [JsonProperty("last_login")] + public DateTime? LastLogin { get; set; } } }