From 869f50db2fbc24826762fb61d35e5f8de79296c1 Mon Sep 17 00:00:00 2001 From: Gabriel Arakaki Giovanini Date: Fri, 25 Aug 2023 22:35:47 +0200 Subject: feat: Handle login error --- pkg/database/repository/base.go | 5 +++++ pkg/database/sql/user.go | 28 ++++++++++++++++++---------- pkg/service/auth.go | 12 +++++++++--- pkg/view/auth.go | 10 ++++++++++ scss/main.scss | 5 +---- templates/login.qtpl | 18 +++++++++++++++--- templates/register.qtpl | 4 ++-- 7 files changed, 60 insertions(+), 22 deletions(-) create mode 100644 pkg/database/repository/base.go diff --git a/pkg/database/repository/base.go b/pkg/database/repository/base.go new file mode 100644 index 0000000..a9d69c9 --- /dev/null +++ b/pkg/database/repository/base.go @@ -0,0 +1,5 @@ +package repository + +import "errors" + +var ErrRecordNotFound = errors.New("record not found") diff --git a/pkg/database/sql/user.go b/pkg/database/sql/user.go index 6b1cf0f..2ec8622 100644 --- a/pkg/database/sql/user.go +++ b/pkg/database/sql/user.go @@ -2,6 +2,7 @@ package sql import ( "context" + "errors" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" @@ -82,7 +83,7 @@ func (self *UserRepository) List(ctx context.Context) ([]*repository.User, error Find(&users) if result.Error != nil { - return nil, result.Error + return nil, wrapError(result.Error) } return users.ToModel(), nil @@ -95,7 +96,7 @@ func (self *UserRepository) Get(ctx context.Context, id uint) (*repository.User, First(user) if result.Error != nil { - return nil, result.Error + return nil, wrapError(result.Error) } return user, nil @@ -113,7 +114,7 @@ func (self *UserRepository) GetIDByUsername(ctx context.Context, username string First(&userID) if result.Error != nil { - return 0, result.Error + return 0, wrapError(result.Error) } return userID.ID, nil @@ -131,7 +132,7 @@ func (self *UserRepository) GetPassword(ctx context.Context, id uint) ([]byte, e First(&userPassword) if result.Error != nil { - return nil, result.Error + return nil, wrapError(result.Error) } return userPassword.Password, nil @@ -150,7 +151,7 @@ func (self *UserRepository) Create(ctx context.Context, createUser *repository.C WithContext(ctx). Create(user) if result.Error != nil { - return 0, result.Error + return 0, wrapError(result.Error) } return user.Model.ID, nil @@ -172,7 +173,7 @@ func (self *UserRepository) Update(ctx context.Context, id uint, update *reposit Omit("password"). Updates(user) if result.Error != nil { - return result.Error + return wrapError(result.Error) } return nil @@ -189,7 +190,7 @@ func (self *UserRepository) Delete(ctx context.Context, id uint) error { WithContext(ctx). Delete(user) if result.Error != nil { - return result.Error + return wrapError(result.Error) } return nil } @@ -203,7 +204,7 @@ func (u *UserRepository) Any(ctx context.Context) (bool, error) { Find(&exists) if result.Error != nil { - return false, result.Error + return false, wrapError(result.Error) } return exists, nil @@ -220,7 +221,7 @@ func (u *UserRepository) GetPathFromUserID(ctx context.Context, id uint) (string First(&userPath) if result.Error != nil { - return "", result.Error + return "", wrapError(result.Error) } return userPath, nil @@ -233,5 +234,12 @@ func (u *UserRepository) UpdatePassword(ctx context.Context, id uint, password [ Where("id = ?", id). Update("password", password) - return result.Error + return wrapError(result.Error) +} + +func wrapError(err error) error { + if errors.Is(err, gorm.ErrRecordNotFound) { + return repository.ErrRecordNotFound + } + return err } diff --git a/pkg/service/auth.go b/pkg/service/auth.go index 30e574a..2fc06e3 100644 --- a/pkg/service/auth.go +++ b/pkg/service/auth.go @@ -21,6 +21,8 @@ type AuthController struct { key []byte } +var InvalidLogin = errors.New("Invalid login") + func NewAuthController( authRepository repository.AuthRepository, userRepository repository.UserRepository, @@ -35,17 +37,21 @@ func NewAuthController( func (c *AuthController) Login(ctx context.Context, username, password []byte) ([]byte, error) { id, err := c.authRepository.GetIDByUsername(ctx, string(username)) - if err != nil { + if errors.Is(err, repository.ErrRecordNotFound) { + return nil, InvalidLogin + } else if err != nil { return nil, err } hashedPassword, err := c.authRepository.GetPassword(ctx, id) - if err != nil { + if errors.Is(err, repository.ErrRecordNotFound) { + return nil, InvalidLogin + } else if err != nil { return nil, err } if err := bcrypt.CompareHashAndPassword(hashedPassword, password); err != nil { - return nil, err + return nil, InvalidLogin } token := &Token{ diff --git a/pkg/view/auth.go b/pkg/view/auth.go index 1b87235..8d87035 100644 --- a/pkg/view/auth.go +++ b/pkg/view/auth.go @@ -2,6 +2,7 @@ package view import ( "encoding/base64" + "errors" "net/http" "git.sr.ht/~gabrielgio/img/pkg/ext" @@ -45,6 +46,15 @@ func (v *AuthView) Login(w http.ResponseWriter, r *http.Request) error { ) auth, err := v.userController.Login(r.Context(), username, password) + + if errors.Is(err, service.InvalidLogin) { + templates.WritePageTemplate(w, &templates.LoginPage{ + Username: r.FormValue("username"), + Err: err.Error(), + }) + return nil + } + if err != nil { return err } diff --git a/scss/main.scss b/scss/main.scss index 8877452..532a38a 100644 --- a/scss/main.scss +++ b/scss/main.scss @@ -1,13 +1,11 @@ $breakpoint: 360px; - +$radius: 0px; $tablet: 480px; $body-font-size: 1rem; -$radius-rounded: 0; $navbar-breakpoint: $breakpoint; $panel-item-border: 1px solid hsl(0, 0%, 93%); -$panel-radius: 0; $panel-shadow: 0; $card-shadow: 0; @@ -17,7 +15,6 @@ $card-content-padding: 0; $table-cell-padding: 0.5em; $table-cell-border-width: 0; -$tag-radius: 0; $tag-delete-margin: 15px; $title-weight: normal; diff --git a/templates/login.qtpl b/templates/login.qtpl index 56394d0..c68fb5f 100644 --- a/templates/login.qtpl +++ b/templates/login.qtpl @@ -1,5 +1,8 @@ {% code -type LoginPage struct {} +type LoginPage struct { + Username string + Err string + } %} {% func (p *LoginPage) Title() %}Login{% endfunc %} @@ -9,7 +12,7 @@ type LoginPage struct {}
- +
@@ -18,9 +21,18 @@ type LoginPage struct {}
+
+ +
+ {% if p.Err != "" %}
- +
+
+ {%s p.Err %} +
+
+ {% endif %} {% endfunc %} diff --git a/templates/register.qtpl b/templates/register.qtpl index 115edfe..4d3c545 100644 --- a/templates/register.qtpl +++ b/templates/register.qtpl @@ -25,8 +25,8 @@ type RegisterPage struct {} -
- +
+
{% endfunc %} -- cgit v1.2.3