@@ -2,7 +2,6 @@ package auth
22
33import (
44 "context"
5- "crypto/rand"
65 "crypto/sha256"
76 "crypto/subtle"
87 "encoding/hex"
@@ -12,10 +11,10 @@ import (
1211 "github.com/android-sms-gateway/server/internal/sms-gateway/models"
1312 "github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
1413 "github.com/android-sms-gateway/server/internal/sms-gateway/online"
14+ "github.com/android-sms-gateway/server/internal/sms-gateway/otp"
1515 "github.com/android-sms-gateway/server/pkg/crypto"
1616 "github.com/capcom6/go-helpers/cache"
1717 "github.com/jaevor/go-nanoid"
18- "go.uber.org/fx"
1918 "go.uber.org/zap"
2019)
2120
@@ -24,75 +23,55 @@ type Config struct {
2423 PrivateToken string
2524}
2625
27- type Params struct {
28- fx.In
29-
30- Config Config
31-
32- Users * repository
33- DevicesSvc * devices.Service
34- OnlineSvc online.Service
35-
36- Logger * zap.Logger
37- }
38-
3926type Service struct {
4027 config Config
4128
42- users * repository
43- codesCache * cache.Cache [string ]
44- usersCache * cache.Cache [models.User ]
29+ users * repository
4530
31+ otpSvc * otp.Service
4632 devicesSvc * devices.Service
4733 onlineSvc online.Service
4834
4935 logger * zap.Logger
5036
51- idgen func () string
37+ idgen func () string
38+ usersCache * cache.Cache [models.User ]
5239}
5340
54- func New (params Params ) * Service {
41+ func New (
42+ config Config ,
43+ users * repository ,
44+ otpSvc * otp.Service ,
45+ devicesSvc * devices.Service ,
46+ onlineSvc online.Service ,
47+ logger * zap.Logger ,
48+ ) * Service {
5549 idgen , _ := nanoid .Standard (21 )
5650
5751 return & Service {
58- config : params .Config ,
59- users : params .Users ,
60- devicesSvc : params .DevicesSvc ,
61- onlineSvc : params .OnlineSvc ,
62- logger : params .Logger ,
63- idgen : idgen ,
52+ config : config ,
6453
65- codesCache : cache.New [string ](cache.Config {}),
66- usersCache : cache.New [models.User ](cache.Config {TTL : 1 * time .Hour }),
67- }
68- }
54+ users : users ,
6955
70- // GenerateUserCode generates a unique one-time user authorization code
71- func (s * Service ) GenerateUserCode (userID string ) (AuthCode , error ) {
72- var code string
73- var err error
74-
75- b := make ([]byte , 3 )
76- validUntil := time .Now ().Add (codeTTL )
77- for range 3 {
78- if _ , err = rand .Read (b ); err != nil {
79- continue
80- }
81- num := (int (b [0 ]) << 16 ) | (int (b [1 ]) << 8 ) | int (b [2 ])
82- code = fmt .Sprintf ("%06d" , num % 1000000 )
56+ otpSvc : otpSvc ,
57+ devicesSvc : devicesSvc ,
58+ onlineSvc : onlineSvc ,
8359
84- if err = s .codesCache .SetOrFail (code , userID , cache .WithValidUntil (validUntil )); err != nil {
85- continue
86- }
60+ logger : logger ,
8761
88- break
62+ idgen : idgen ,
63+ usersCache : cache.New [models.User ](cache.Config {TTL : 1 * time .Hour }),
8964 }
65+ }
9066
67+ // GenerateUserCode generates a unique one-time user authorization code
68+ func (s * Service ) GenerateUserCode (ctx context.Context , userID string ) (* otp.Code , error ) {
69+ code , err := s .otpSvc .Generate (context .Background (), userID )
9170 if err != nil {
92- return AuthCode {} , fmt .Errorf ("can't generate code: %w" , err )
71+ return nil , fmt .Errorf ("failed to generate code: %w" , err )
9372 }
9473
95- return AuthCode { Code : code , ValidUntil : validUntil } , nil
74+ return code , nil
9675}
9776
9877func (s * Service ) RegisterUser (login , password string ) (models.User , error ) {
@@ -180,18 +159,18 @@ func (s *Service) AuthorizeUser(username, password string) (models.User, error)
180159}
181160
182161// AuthorizeUserByCode authorizes a user by one-time code.
183- func (s * Service ) AuthorizeUserByCode (code string ) (models.User , error ) {
184- userID , err := s .codesCache . GetAndDelete ( code )
162+ func (s * Service ) AuthorizeUserByCode (ctx context. Context , code string ) (* models.User , error ) {
163+ userID , err := s .otpSvc . Validate ( ctx , code )
185164 if err != nil {
186- return models. User {} , err
165+ return nil , fmt . Errorf ( "failed to validate code: %w" , err )
187166 }
188167
189168 user , err := s .users .GetByID (userID )
190169 if err != nil {
191- return models. User {} , err
170+ return nil , fmt . Errorf ( "failed to get user: %w" , err )
192171 }
193172
194- return user , nil
173+ return & user , nil
195174}
196175
197176func (s * Service ) ChangePassword (userID string , currentPassword string , newPassword string ) error {
@@ -240,6 +219,5 @@ func (s *Service) Run(ctx context.Context) {
240219}
241220
242221func (s * Service ) clean (_ context.Context ) {
243- s .codesCache .Cleanup ()
244222 s .usersCache .Cleanup ()
245223}
0 commit comments