using BuddyFinance.Common.Concepts; using BuddyFinance.Common.Encryption; using BuddyFinance.Model; using System; using System.Linq; /* Created: 06/09/2017 * Author: MxoSibeko */ namespace BuddyFinance.Integration.Utils { public static class TokenManager { public static TimeSpan TOKEN_LIFESPAN => TimeSpan.FromDays(1); public static TimeSpan ACCESS_TOKEN_LIFESPAN => TimeSpan.FromMinutes(120); public static int? UserId(string token) { int? id; try { var authCode_ = token.Decrypt(); var split = authCode_.Split('|'); //if (token.StartsWith("access_token")) // id = int.Parse(split[3]); //else // id = int.Parse(split[3]); id = int.Parse(split[3]); } catch (Exception) { id = null; } return id; } public static int ProfileId(string token) { //access_token int id; try { var authCode_ = token.Decrypt(); var split = authCode_.Split('|'); if (authCode_.StartsWith("access_token")) id = int.Parse(split[4]); else id = int.Parse(split[1]); } catch (Exception) { id = 0; } return id; } public static string Generate(string username, bool isAccessToken = false) { //var token = "token" + new Random(2000).Next(9999) + profileNumber; var token = ""; try { using (var db = new BuddyFinanceDBEntities()) { var ts = !isAccessToken ? TOKEN_LIFESPAN : ACCESS_TOKEN_LIFESPAN; var user = db.Users.FirstOrDefault(m => m.UserName.Equals(username, StringComparison.OrdinalIgnoreCase)); if (user != null) { if (isAccessToken) token = $"access_token|{DateTime.Now:yyyy-MM-ddTHH:mm:ss}|{ts}|{user.Id}|{user.ProfileId}"; else { token = ($"{user.Profile.Id}|{DateTime.Now:yyyy-MM-ddTHH:mm:ss}|{ts}|{user.Id}").Encrypt(); db.AuthenticationCodes.Add(new AuthenticationCode { Code = token, Number = user.Profile.ProfileNumber, Type = AuthenticationCodeType.Token, IsValid = true }); db.SaveChanges(); } } } } catch (Exception) { // } return token; } public static string GenerateOtp(string number) { var otp = ((new Random()).Next(10001, 99999)).ToString(); using (var db = new BuddyFinanceDBEntities()) { db.AuthenticationCodes.Add(new AuthenticationCode { Code = otp, Number = number, Type = AuthenticationCodeType.Otp, IsValid = true }); db.SaveChanges(); } return otp; } public static bool ValidateToken(string token, string profileNumber = null, string type = "") { var valid = false; token = token.Replace(" ", "+"); using (var db = new BuddyFinanceDBEntities()) { AuthenticationCode authCode = db.AuthenticationCodes.FirstOrDefault(m => m.Code.Equals(token)); if (!string.IsNullOrEmpty(profileNumber)) { if (authCode.Number.Equals(profileNumber, StringComparison.OrdinalIgnoreCase) && authCode.Type.Equals(AuthenticationCodeType.Token, StringComparison.OrdinalIgnoreCase)) { valid = false; } } //else // authCode = db.AuthenticationCodes.FirstOrDefault(m => m.Code.Equals(token) // && m.Type.Equals(AuthenticationCodeType.Token)); if (authCode != null) { var authCode_ = authCode.Code.Decrypt(); var split = authCode_.Split('|'); DateTime.TryParse(split[1], out DateTime issueDate); TimeSpan.TryParse(split[2], out TimeSpan validTimespan); valid = DateTime.Now < issueDate.Add(validTimespan); } } return valid; } public static void InvalidateToken(string token) { using (var db = new BuddyFinanceDBEntities()) { var authCode = db.AuthenticationCodes.FirstOrDefault(m => m.Code.Equals(token)); if (authCode != null) { authCode.IsValid = false; db.SaveChanges(); } } } public static bool ValidateOtp(string otp, string number) { var valid = false; using (var db = new BuddyFinanceDBEntities()) { var authCode = db.AuthenticationCodes.FirstOrDefault(m => m.Code.Equals(otp) && m.Number.Equals(number) && m.Type.Equals(AuthenticationCodeType.Otp)); if (authCode != null) { if (authCode.IsValid) { valid = true; authCode.IsValid = false; db.SaveChanges(); } } } return valid; } } }