61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package middlewares
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"errors"
|
|
"net/http"
|
|
|
|
"gitea.konchin.com/ytshih/inp2025/models"
|
|
"gitea.konchin.com/ytshih/inp2025/types"
|
|
"github.com/uptrace/bunrouter"
|
|
)
|
|
|
|
func (self *Handlers) Auth(
|
|
next bunrouter.HandlerFunc,
|
|
) bunrouter.HandlerFunc {
|
|
return func(w http.ResponseWriter, req bunrouter.Request) error {
|
|
ctx := req.Context()
|
|
|
|
username, password, ok := req.BasicAuth()
|
|
if !ok {
|
|
return HTTPError{
|
|
StatusCode: http.StatusNotFound,
|
|
Message: "username not exist",
|
|
}
|
|
}
|
|
|
|
dbUser := models.User{Username: username}
|
|
err := self.db.NewSelect().
|
|
Model(&dbUser).
|
|
WherePK().
|
|
Scan(ctx)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return HTTPError{
|
|
StatusCode: http.StatusUnauthorized,
|
|
Message: "username not exist",
|
|
OriginError: err,
|
|
}
|
|
}
|
|
if err != nil {
|
|
return HTTPError{
|
|
StatusCode: http.StatusInternalServerError,
|
|
Message: "failed to select user from db",
|
|
OriginError: err,
|
|
}
|
|
}
|
|
if password != dbUser.Password {
|
|
return HTTPError{
|
|
StatusCode: http.StatusUnauthorized,
|
|
Message: "password incorrect",
|
|
OriginError: err,
|
|
}
|
|
}
|
|
return next(w, req.WithContext(context.WithValue(
|
|
ctx, types.UserKey, models.User{
|
|
Username: username,
|
|
Password: password,
|
|
})))
|
|
}
|
|
}
|