mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Chore: Add login protection when user is trying different uppercase letters (#87588)
* add login protection when the user is trying different uppercase letters
This commit is contained in:
parent
867d36fe59
commit
cd98aaf89b
@ -2,6 +2,7 @@ package loginattemptimpl
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
@ -54,14 +55,14 @@ func (s *Service) Add(ctx context.Context, username, IPAddress string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err := s.store.CreateLoginAttempt(ctx, CreateLoginAttemptCommand{
|
_, err := s.store.CreateLoginAttempt(ctx, CreateLoginAttemptCommand{
|
||||||
Username: username,
|
Username: strings.ToLower(username),
|
||||||
IpAddress: IPAddress,
|
IpAddress: IPAddress,
|
||||||
})
|
})
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) Reset(ctx context.Context, username string) error {
|
func (s *Service) Reset(ctx context.Context, username string) error {
|
||||||
return s.store.DeleteLoginAttempts(ctx, DeleteLoginAttemptsCommand{username})
|
return s.store.DeleteLoginAttempts(ctx, DeleteLoginAttemptsCommand{strings.ToLower(username)})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) Validate(ctx context.Context, username string) (bool, error) {
|
func (s *Service) Validate(ctx context.Context, username string) (bool, error) {
|
||||||
@ -70,7 +71,7 @@ func (s *Service) Validate(ctx context.Context, username string) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
loginAttemptCountQuery := GetUserLoginAttemptCountQuery{
|
loginAttemptCountQuery := GetUserLoginAttemptCountQuery{
|
||||||
Username: username,
|
Username: strings.ToLower(username),
|
||||||
Since: time.Now().Add(-loginAttemptsWindow),
|
Since: time.Now().Add(-loginAttemptsWindow),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
"github.com/grafana/grafana/pkg/services/loginattempt"
|
"github.com/grafana/grafana/pkg/services/loginattempt"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
)
|
)
|
||||||
@ -79,6 +80,31 @@ func TestService_Validate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLoginAttempts(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
cfg := setting.NewCfg()
|
||||||
|
cfg.DisableBruteForceLoginProtection = false
|
||||||
|
db := db.InitTestDB(t)
|
||||||
|
service := ProvideService(db, cfg, nil)
|
||||||
|
|
||||||
|
// add multiple login attempts with different uppercases, they all should be counted as the same user
|
||||||
|
_ = service.Add(ctx, "admin", "[::1]")
|
||||||
|
_ = service.Add(ctx, "Admin", "[::1]")
|
||||||
|
_ = service.Add(ctx, "aDmin", "[::1]")
|
||||||
|
_ = service.Add(ctx, "adMin", "[::1]")
|
||||||
|
_ = service.Add(ctx, "admIn", "[::1]")
|
||||||
|
_ = service.Add(ctx, "admIN", "[::1]")
|
||||||
|
|
||||||
|
// validate the number of attempts is correct for all the different uppercases
|
||||||
|
count, err := service.store.GetUserLoginAttemptCount(ctx, GetUserLoginAttemptCountQuery{Username: "admin"})
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, int64(6), count)
|
||||||
|
|
||||||
|
ok, err := service.Validate(ctx, "admin")
|
||||||
|
assert.False(t, ok)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
var _ store = new(fakeStore)
|
var _ store = new(fakeStore)
|
||||||
|
|
||||||
type fakeStore struct {
|
type fakeStore struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user