Пример #1
0
        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();
            });
        }
Пример #2
0
        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();
            });
        }