From 78060613130f2aba2408d5919429bd8055a07fe0 Mon Sep 17 00:00:00 2001 From: Fedorov Vladimir Date: Mon, 29 Jun 2026 13:26:57 +0700 Subject: [PATCH] add generate and hash password --- cmd/evening_detective_server/main.go | 4 ++- go.mod | 9 +++--- .../modules/password_generator/generator.go | 32 +++++++++++++++++++ .../modules/password_generator/interface.go | 5 +++ internal/services/users_service/service.go | 26 ++++++++++++--- 5 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 internal/modules/password_generator/generator.go create mode 100644 internal/modules/password_generator/interface.go diff --git a/cmd/evening_detective_server/main.go b/cmd/evening_detective_server/main.go index 401a42a..5dc706a 100644 --- a/cmd/evening_detective_server/main.go +++ b/cmd/evening_detective_server/main.go @@ -4,6 +4,7 @@ import ( "context" _ "embed" "evening_detective_server/internal/app" + "evening_detective_server/internal/modules/password_generator" "evening_detective_server/internal/repos/users_repo" "evening_detective_server/internal/services/users_service" proto "evening_detective_server/proto" @@ -41,7 +42,8 @@ func main() { } usersRepo := users_repo.NewUserRepo(dbpool) - usersService := users_service.NewUsersService(usersRepo) + passwordGenerator := password_generator.NewGenerator(8) + usersService := users_service.NewUsersService(usersRepo, passwordGenerator) // Create a listener on TCP port lis, err := net.Listen("tcp", ":8080") diff --git a/go.mod b/go.mod index a79a565..cc11966 100644 --- a/go.mod +++ b/go.mod @@ -18,9 +18,10 @@ require ( github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/joho/godotenv v1.5.1 github.com/swaggest/swgui v1.8.8 - golang.org/x/net v0.23.0 // indirect - golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.29.0 // indirect + golang.org/x/crypto v0.53.0 + golang.org/x/net v0.55.0 // indirect + golang.org/x/sync v0.21.0 // indirect + golang.org/x/sys v0.46.0 // indirect + golang.org/x/text v0.38.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect ) diff --git a/internal/modules/password_generator/generator.go b/internal/modules/password_generator/generator.go new file mode 100644 index 0000000..18ce9b1 --- /dev/null +++ b/internal/modules/password_generator/generator.go @@ -0,0 +1,32 @@ +package password_generator + +import ( + "crypto/rand" + "math/big" +) + +const ( + charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" +) + +type generator struct { + length int +} + +func NewGenerator(length int) IPasswordGenerator { + return &generator{ + length: length, + } +} + +func (g *generator) Generate() (string, error) { + password := make([]byte, g.length) + for i := range password { + num, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset)))) + if err != nil { + return "", err + } + password[i] = charset[num.Int64()] + } + return string(password), nil +} diff --git a/internal/modules/password_generator/interface.go b/internal/modules/password_generator/interface.go new file mode 100644 index 0000000..646edb2 --- /dev/null +++ b/internal/modules/password_generator/interface.go @@ -0,0 +1,5 @@ +package password_generator + +type IPasswordGenerator interface { + Generate() (string, error) +} diff --git a/internal/services/users_service/service.go b/internal/services/users_service/service.go index d6fb76b..ed25645 100644 --- a/internal/services/users_service/service.go +++ b/internal/services/users_service/service.go @@ -2,16 +2,24 @@ package users_service import ( "context" + "evening_detective_server/internal/modules/password_generator" "evening_detective_server/internal/repos/users_repo" + + "golang.org/x/crypto/bcrypt" ) type UsersService struct { - usersRepo *users_repo.UsersRepo + usersRepo *users_repo.UsersRepo + passwordGenerator password_generator.IPasswordGenerator } -func NewUsersService(usersRepo *users_repo.UsersRepo) *UsersService { +func NewUsersService( + usersRepo *users_repo.UsersRepo, + passwordGenerator password_generator.IPasswordGenerator, +) *UsersService { return &UsersService{ - usersRepo: usersRepo, + usersRepo: usersRepo, + passwordGenerator: passwordGenerator, } } @@ -20,11 +28,19 @@ func (s *UsersService) AddUser( username string, email string, ) error { - err := s.usersRepo.AddUser( + password, err := s.passwordGenerator.Generate() + if err != nil { + return err + } + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + return err + } + err = s.usersRepo.AddUser( ctx, username, email, - "hello", // TODO: generate password and send email + string(hashedPassword), "user", ) return err