57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
package auth
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"go.signoz.io/signoz/ee/query-service/app/api"
|
|
baseauth "go.signoz.io/signoz/pkg/query-service/auth"
|
|
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
|
"go.signoz.io/signoz/pkg/query-service/telemetry"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func GetUserFromRequest(r *http.Request, apiHandler *api.APIHandler) (*basemodel.UserPayload, error) {
|
|
patToken := r.Header.Get("SIGNOZ-API-KEY")
|
|
if len(patToken) > 0 {
|
|
zap.L().Debug("Received a non-zero length PAT token")
|
|
ctx := context.Background()
|
|
dao := apiHandler.AppDao()
|
|
|
|
pat, err := dao.GetPAT(ctx, patToken)
|
|
if err == nil && pat != nil {
|
|
zap.L().Debug("Found valid PAT: ", zap.Any("pat", pat))
|
|
if pat.ExpiresAt < time.Now().Unix() && pat.ExpiresAt != 0 {
|
|
zap.L().Info("PAT has expired: ", zap.Any("pat", pat))
|
|
return nil, fmt.Errorf("PAT has expired")
|
|
}
|
|
group, apiErr := dao.GetGroupByName(ctx, pat.Role)
|
|
if apiErr != nil {
|
|
zap.L().Error("Error while getting group for PAT: ", zap.Any("apiErr", apiErr))
|
|
return nil, apiErr
|
|
}
|
|
user, err := dao.GetUser(ctx, pat.UserID)
|
|
if err != nil {
|
|
zap.L().Error("Error while getting user for PAT: ", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
telemetry.GetInstance().SetPatTokenUser()
|
|
dao.UpdatePATLastUsed(ctx, patToken, time.Now().Unix())
|
|
user.User.GroupId = group.Id
|
|
user.User.Id = pat.Id
|
|
return &basemodel.UserPayload{
|
|
User: user.User,
|
|
Role: pat.Role,
|
|
}, nil
|
|
}
|
|
if err != nil {
|
|
zap.L().Error("Error while getting user for PAT: ", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
}
|
|
return baseauth.GetUserFromRequest(r)
|
|
}
|