public Func <HttpContext, Func <Task>, Task> Get() { return(async(context, next) => { // Remove account id header context.Request.Headers.Remove("AccountId"); // Get authentication header context.Request.Headers.TryGetValue("VFIDAuth", out StringValues authenticationValues); // Extract vfid value ulong vfid = 0; if (authenticationValues.Count == 1) { bool valid = ulong.TryParse(authenticationValues.ToArray()[0], out vfid); if (!valid) { vfid = 0; } } Console.Write($"[{vfid}] "); // Check against logged in users LoggedUsers.Session session = LoggedUsers.GetSession(vfid); if (session == null) { Console.Write($"Session not found."); context.Request.Headers.Add("AccountId", "-1"); session = LoggedUsers.GetSessionSlow(vfid); if (session != null && vfid != 0) { Console.Write(" Found on repeat search."); } } else { // Get account id Account acc = Program.Database.QSelectAccounts(item => item.Id == session.accid).FirstOrDefault(); if (acc != null) { Console.Write($"Session linked to account '{acc.Username}'"); context.Request.Headers.Add("AccountId", acc.Id.ToString()); } else { Console.Write($"Session linked to non-existent account"); context.Request.Headers.Add("AccountId", "-1"); } } Console.WriteLine(); await next.Invoke(); }); }
public Func <HttpContext, Func <Task>, Task> Get() { return(async(context, next) => { // Get account from request StringValues accountIdValue; context.Request.Headers.TryGetValue("AccountId", out accountIdValue); Account acc = new Account(); if (accountIdValue.Count == 1) { int accountId = -1; bool valid = int.TryParse(accountIdValue.ToArray()[0], out accountId); if (!valid) { accountId = -1; } acc = Program.Database.QSelectAccounts(item => item.Id == accountId).FirstOrDefault(); if (acc == null) { acc = new Account(); } } // Login if (context.Request.Path.StartsWithSegments(PathString.FromUriComponent("/login"))) { if (context.Request.Method == "GET") { ulong vfid = 0; string[] parameters = context.Request.Path.Value.Split('/').TakeLast(2).ToArray(); if (parameters.Length == 2) { string email = parameters[0]; string passwordHash = parameters[1]; Account loginAcc = Program.Database.QSelectAccounts(item => item.Email == email).FirstOrDefault(); if (loginAcc != null) { if (loginAcc.PasswordHash == passwordHash) { vfid = LoggedUsers.GenerateUser(loginAcc.Id); } } } context.Response.StatusCode = 200; await context.Response.Body.WriteAsync(BitConverter.GetBytes(vfid), 0, 8); return; } else { context.Response.StatusCode = 404; return; } } // Logout else if (context.Request.Path.StartsWithSegments(PathString.FromUriComponent("/logout"))) { if (context.Request.Method == "GET") { // Get authentication header StringValues authenticationValues; context.Request.Headers.TryGetValue("VFIDAuth", out authenticationValues); // Extract vfid value ulong vfid = 0; if (authenticationValues.Count == 1) { bool valid = ulong.TryParse(authenticationValues.ToArray()[0], out vfid); if (!valid) { vfid = 0; } } // Logout if (vfid != 0) { LoggedUsers.EndSession(vfid); } context.Response.StatusCode = 200; return; } else { context.Response.StatusCode = 404; return; } } await next.Invoke(); }); }