@@ -14,6 +14,11 @@ import (
1414
1515var ErrInvalidInput = errors .New ("invalid input" )
1616
17+ const (
18+ minUsernameLen = 2
19+ maxUsernameLen = 20
20+ )
21+
1722type Service struct {
1823 repo Repository
1924 idGen func () ID
@@ -38,8 +43,8 @@ func (s *Service) Create(ctx context.Context, username string) (User, error) {
3843 }
3944
4045 name := normalizeUsername (username )
41- if name == "" {
42- return User {}, ErrInvalidInput
46+ if err := validateUsername ( name ); err != nil {
47+ return User {}, err
4348 }
4449 if len (s .pepper ) == 0 {
4550 return User {}, errors .New ("username pepper is required" )
@@ -67,7 +72,10 @@ func (s *Service) CreateWithPassword(ctx context.Context, username, passwordHash
6772 }
6873
6974 name := normalizeUsername (username )
70- if name == "" || strings .TrimSpace (passwordHash ) == "" {
75+ if err := validateUsername (name ); err != nil {
76+ return User {}, err
77+ }
78+ if strings .TrimSpace (passwordHash ) == "" {
7179 return User {}, ErrInvalidInput
7280 }
7381 if len (s .pepper ) == 0 {
@@ -98,7 +106,10 @@ func (s *Service) CreateWithPasswordAndID(ctx context.Context, id ID, username,
98106 return User {}, ErrInvalidInput
99107 }
100108 name := normalizeUsername (username )
101- if name == "" || strings .TrimSpace (passwordHash ) == "" {
109+ if err := validateUsername (name ); err != nil {
110+ return User {}, err
111+ }
112+ if strings .TrimSpace (passwordHash ) == "" {
102113 return User {}, ErrInvalidInput
103114 }
104115 if len (s .pepper ) == 0 {
@@ -147,8 +158,8 @@ func (s *Service) GetByUsername(ctx context.Context, username string) (User, err
147158 return User {}, errors .New ("repository is required" )
148159 }
149160 name := normalizeUsername (username )
150- if name == "" {
151- return User {}, ErrInvalidInput
161+ if err := validateUsername ( name ); err != nil {
162+ return User {}, err
152163 }
153164 if len (s .pepper ) == 0 {
154165 return User {}, errors .New ("username pepper is required" )
@@ -208,6 +219,16 @@ func normalizeUsername(username string) string {
208219 return strings .ToLower (strings .TrimSpace (username ))
209220}
210221
222+ func validateUsername (name string ) error {
223+ if name == "" {
224+ return ErrInvalidInput
225+ }
226+ if len (name ) < minUsernameLen || len (name ) > maxUsernameLen {
227+ return ErrInvalidInput
228+ }
229+ return nil
230+ }
231+
211232func hashUsername (pepper []byte , username string ) string {
212233 mac := hmac .New (sha256 .New , pepper )
213234 _ , _ = mac .Write ([]byte (username ))
0 commit comments