Exemple #1
0
        public async Task <ActionResult <UserViewModel> > Update([FromBody] UpdateSelfUserModel newUser)
        {
            var user = AuthorizedUser;

            if (!string.IsNullOrEmpty(newUser.UserName) && !newUser.UserName.Equals(user.UserName))
            {
                if (!await UsernameAlreadyExists(newUser.UserName))
                {
                    return(BadRequest(new ResponseErrorModel("username already exists")));
                }
                user.UserName = newUser.UserName;
            }

            if (!string.IsNullOrEmpty(newUser.NewPassword))
            {
                if (string.IsNullOrEmpty(newUser.CurrentPassword) || !await hasher.CompareEncodedHash(newUser.CurrentPassword, user.PasswordHash))
                {
                    return(BadRequest(new ResponseErrorModel("invalid current password")));
                }
            }

            database.Update(user);
            await database.Commit();

            return(Ok(new UserViewModel(user)));
        }
Exemple #2
0
        public async Task <ActionResult <UserLoginViewModel> > Login(
            [FromBody] LoginModel login,
            [FromQuery] bool getSessionKey)
        {
            var user = await database
                       .GetWhere <UserModel>(u => u.UserName.Equals(login.Ident) || string.IsNullOrEmpty(u.MailAddress) && u.MailAddress.Equals(login.Ident))
                       .FirstOrDefaultAsync();

            if (user == null || !(await hasher.CompareEncodedHash(login.Password, user.PasswordHash)))
            {
                return(Unauthorized());
            }

            user.LastLogin = DateTime.Now;
            database.Update(user);

            var expire = login.Remember ? EXTENDED_SESSION_EXPIRATION : DEFAULT_SESSION_EXPIRATION;
            var claims = new AuthClaims
            {
                Guid = user.Guid,
            };

            var jwt = authorization.GetSessionKey(claims, expire);

            var cookieOptions = new CookieOptions
            {
                Expires  = DateTime.Now.Add(expire),
                HttpOnly = true,
                SameSite = SameSiteMode.Strict,
                Secure   = !bypassSecureCookies,
            };

            Response.Cookies.Append(Constants.SessionCookieName, jwt, cookieOptions);

            await database.Commit();

            var res = new UserLoginViewModel(user);

            if (getSessionKey)
            {
                res.SessionKey = jwt;
            }

            return(Ok(res));
        }
Exemple #3
0
        public async Task <ActionResult> GetIdent(
            [FromRoute] string ident,
            [FromQuery] string password)
        {
            var(ok, link) = await cache.Get <LinkModel>(ident);

            if (!ok)
            {
                link = await database.GetWhere <LinkModel>(l => l.Ident == ident).FirstOrDefaultAsync();

                if (link == null)
                {
                    return(Route(NotFound, routeNotFound));
                }
            }

            var now = DateTime.Now;

            if (!link.Enabled ||
                link.Expires != default && link.Expires <= now ||
                link.TotalAccessLimit > 0 && link.TotalAccessLimit <= link.UniqueAccessCount)
            {
                return(Route(NotFound, routeNotFound));
            }

            if (!string.IsNullOrEmpty(link.PasswordHash))
            {
                if (string.IsNullOrEmpty(password))
                {
                    return(Route(BadRequest, new ResponseErrorModel("password required"), $"{routePassword}?ident={link.Ident}"));
                }
                if (!await passwordHasher.CompareEncodedHash(password, link.PasswordHash))
                {
                    return(BadRequest(new ResponseErrorModel("password required")));
                }
            }

            link.LastAccess = now;
            link.AccessCount++;

            var hashedIPAddr = await fastHasher.GetEncodedHash(HttpContext.Connection.RemoteIpAddress.ToString());

            if (await database.GetWhere <AccessModel>(a => a.Link.Guid.Equals(link.Guid) && a.SourceIPHash.Equals(hashedIPAddr)).FirstOrDefaultAsync() == null)
            {
                link.UniqueAccessCount++;
            }

            database.Create(new AccessModel
            {
                Link         = link,
                SourceIPHash = hashedIPAddr,
            });
            database.Update(link);

            await database.Commit();

            await cache.Set(link, ident, cacheDuration);

            if (link.PermanentRedirect)
            {
                return(RedirectPermanent(link.Destination));
            }

            return(Redirect(link.Destination));
        }