Skip to content

Commit 76982d0

Browse files
committed
[internal] use new jwt and users packages
1 parent f802304 commit 76982d0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+929
-418
lines changed

.golangci.yml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,12 @@ linters:
252252
- ^os/exec.Cmd$
253253
- ^reflect.StructField$
254254
# public libs
255-
- "^github.com/gofiber/.+Config$"
256-
- "^gopkg.in/telebot.v4.LongPoller$"
257-
- "^gopkg.in/telebot.v4.ReplyMarkup$"
258-
- "^gopkg.in/telebot.v4.Settings$"
255+
- ^firebase.google.com/go/v4/messaging.AndroidConfig$
256+
- ^firebase.google.com/go/v4/messaging.Message$
259257
- ^github.com/aws/aws-sdk-go-v2/service/s3.+Input$
260258
- ^github.com/aws/aws-sdk-go-v2/service/s3/types.ObjectIdentifier$
259+
- ^github.com/gofiber/.+Config$
260+
- ^github.com/golang-jwt/jwt/v5.+Claims$
261261
- ^github.com/mitchellh/mapstructure.DecoderConfig$
262262
- ^github.com/prometheus/client_golang/.+Opts$
263263
- ^github.com/secsy/goftp.Config$
@@ -273,10 +273,11 @@ linters:
273273
- ^github.com/urfave/cli.v3.FlagBase$
274274
- ^golang.org/x/tools/go/analysis.Analyzer$
275275
- ^google.golang.org/protobuf/.+Options$
276+
- ^gopkg.in/telebot.v4.LongPoller$
277+
- ^gopkg.in/telebot.v4.ReplyMarkup$
278+
- ^gopkg.in/telebot.v4.Settings$
276279
- ^gopkg.in/yaml.v3.Node$
277280
- ^gorm.io/gorm/clause.+$
278-
- ^firebase.google.com/go/v4/messaging.Message$
279-
- ^firebase.google.com/go/v4/messaging.AndroidConfig$
280281
# Allows empty structures in return statements.
281282
# Default: false
282283
allow-empty-returns: true

cmd/sms-gateway/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ const (
1414
// @securitydefinitions.basic ApiAuth
1515
// @description User authentication
1616

17+
// @securitydefinitions.apikey JWTAuth
18+
// @in header
19+
// @name Authorization
20+
// @description JWT authentication
21+
1722
// @securitydefinitions.apikey UserCode
1823
// @in header
1924
// @name Authorization

configs/config.example.yml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,19 @@ cache: # cache config
3838
url: memory:// # cache url (memory:// or redis://) [CACHE__URL]
3939
pubsub: # pubsub config
4040
url: memory:// # pubsub url (memory:// or redis://) [PUBSUB__URL]
41+
jwt:
42+
secret: # jwt secret (leave empty to disable JWT functionality) [JWT__SECRET]
43+
ttl: 24h # jwt ttl [JWT__TTL]
44+
issuer: # jwt issuer [JWT__ISSUER]
4145

4246
## Worker Config ##
4347

4448
tasks: # tasks config
4549
messages_hashing:
46-
interval: 168h # task execution interval in hours [TASKS__MESSAGES_HASHING__INTERVAL]
50+
interval: 168h # task execution interval [TASKS__MESSAGES_HASHING__INTERVAL]
4751
messages_cleanup:
48-
interval: 24h # task execution interval in hours [TASKS__MESSAGES_CLEANUP__INTERVAL]
49-
max_age: 720h # messages max age in hours [TASKS__MESSAGES_CLEANUP__MAX_AGE]
52+
interval: 24h # task execution interval [TASKS__MESSAGES_CLEANUP__INTERVAL]
53+
max_age: 720h # messages max age [TASKS__MESSAGES_CLEANUP__MAX_AGE]
5054
devices_cleanup:
51-
interval: 24h # task execution interval in hours [TASKS__DEVICES_CLEANUP__INTERVAL]
52-
max_age: 8760h # inactive devices max age in hours [TASKS__DEVICES_CLEANUP__MAX_AGE]
55+
interval: 24h # task execution interval [TASKS__DEVICES_CLEANUP__INTERVAL]
56+
max_age: 8760h # inactive devices max age [TASKS__DEVICES_CLEANUP__MAX_AGE]

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.24.3
44

55
require (
66
firebase.google.com/go/v4 v4.12.1
7-
github.com/android-sms-gateway/client-go v1.9.5
7+
github.com/android-sms-gateway/client-go v1.9.6-0.20251123133512-f7816d96f90a
88
github.com/ansrivas/fiberprometheus/v2 v2.6.1
99
github.com/capcom6/go-helpers v0.3.0
1010
github.com/capcom6/go-infra-fx v0.5.2

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV
3434
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
3535
github.com/android-sms-gateway/client-go v1.9.5 h1:fHrE1Pi3rKUdPVMmI9evKW0iyjB5bMIhFRxyq1wVQ+o=
3636
github.com/android-sms-gateway/client-go v1.9.5/go.mod h1:DQsReciU1xcaVW3T5Z2bqslNdsAwCFCtghawmA6g6L4=
37+
github.com/android-sms-gateway/client-go v1.9.6-0.20251123133512-f7816d96f90a h1:Tm1FDTqFRs1ZftaEmQqDdIXtMRZf2aGCp8t2BgXY/rs=
38+
github.com/android-sms-gateway/client-go v1.9.6-0.20251123133512-f7816d96f90a/go.mod h1:DQsReciU1xcaVW3T5Z2bqslNdsAwCFCtghawmA6g6L4=
3739
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
3840
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
3941
github.com/ansrivas/fiberprometheus/v2 v2.6.1 h1:wac3pXaE6BYYTF04AC6K0ktk6vCD+MnDOJZ3SK66kXM=

internal/config/config.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package config
22

3+
import "time"
4+
35
type GatewayMode string
46

57
const (
@@ -17,6 +19,7 @@ type Config struct {
1719
Messages Messages `yaml:"messages"` // messages config
1820
Cache Cache `yaml:"cache"` // cache (memory or redis) config
1921
PubSub PubSub `yaml:"pubsub"` // pubsub (memory or redis) config
22+
JWT JWT `yaml:"jwt"` // jwt config
2023
}
2124

2225
type Gateway struct {
@@ -86,6 +89,12 @@ type PubSub struct {
8689
BufferSize uint `yaml:"buffer_size" envconfig:"PUBSUB__BUFFER_SIZE"`
8790
}
8891

92+
type JWT struct {
93+
Secret string `yaml:"secret" envconfig:"JWT__SECRET"`
94+
TTL Duration `yaml:"ttl" envconfig:"JWT__TTL"`
95+
Issuer string `yaml:"issuer" envconfig:"JWT__ISSUER"`
96+
}
97+
8998
func Default() Config {
9099
//nolint:exhaustruct,mnd // default values
91100
return Config{
@@ -123,5 +132,9 @@ func Default() Config {
123132
URL: "memory://",
124133
BufferSize: 128,
125134
},
135+
JWT: JWT{
136+
TTL: Duration(time.Hour * 24),
137+
Issuer: "sms-gate.app",
138+
},
126139
}
127140
}

internal/config/module.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/android-sms-gateway/server/internal/sms-gateway/cache"
88
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers"
9+
"github.com/android-sms-gateway/server/internal/sms-gateway/jwt"
910
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/auth"
1011
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
1112
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/messages"
@@ -136,5 +137,12 @@ func Module() fx.Option {
136137
BufferSize: cfg.PubSub.BufferSize,
137138
}
138139
}),
140+
fx.Provide(func(cfg Config) jwt.Config {
141+
return jwt.Config{
142+
Secret: cfg.JWT.Secret,
143+
TTL: time.Duration(cfg.JWT.TTL),
144+
Issuer: cfg.JWT.Issuer,
145+
}
146+
}),
139147
)
140148
}

internal/config/types.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package config
2+
3+
import (
4+
"encoding"
5+
"fmt"
6+
"time"
7+
8+
"gopkg.in/yaml.v3"
9+
)
10+
11+
type Duration time.Duration
12+
13+
// Duration returns the underlying time.Duration value.
14+
func (d *Duration) Duration() time.Duration {
15+
if d == nil {
16+
return 0
17+
}
18+
return time.Duration(*d)
19+
}
20+
21+
// String returns the string representation of the duration.
22+
func (d *Duration) String() string {
23+
if d == nil {
24+
return ""
25+
}
26+
return time.Duration(*d).String()
27+
}
28+
29+
func (d *Duration) UnmarshalText(text []byte) error {
30+
t, err := time.ParseDuration(string(text))
31+
if err != nil {
32+
return fmt.Errorf("can't parse duration: %w", err)
33+
}
34+
*d = Duration(t)
35+
return nil
36+
}
37+
38+
func (d *Duration) UnmarshalYAML(value *yaml.Node) error {
39+
var s string
40+
if err := value.Decode(&s); err != nil {
41+
return fmt.Errorf("can't unmarshal duration: %w", err)
42+
}
43+
44+
return d.UnmarshalText([]byte(s))
45+
}
46+
47+
var _ yaml.Unmarshaler = (*Duration)(nil)
48+
var _ encoding.TextUnmarshaler = (*Duration)(nil)

internal/sms-gateway/app.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
appconfig "github.com/android-sms-gateway/server/internal/config"
88
"github.com/android-sms-gateway/server/internal/sms-gateway/cache"
99
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers"
10+
"github.com/android-sms-gateway/server/internal/sms-gateway/jwt"
1011
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/auth"
1112
appdb "github.com/android-sms-gateway/server/internal/sms-gateway/modules/db"
1213
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
@@ -20,6 +21,7 @@ import (
2021
"github.com/android-sms-gateway/server/internal/sms-gateway/online"
2122
"github.com/android-sms-gateway/server/internal/sms-gateway/openapi"
2223
"github.com/android-sms-gateway/server/internal/sms-gateway/pubsub"
24+
"github.com/android-sms-gateway/server/internal/sms-gateway/users"
2325
"github.com/android-sms-gateway/server/pkg/health"
2426
"github.com/capcom6/go-infra-fx/cli"
2527
"github.com/capcom6/go-infra-fx/db"
@@ -40,6 +42,7 @@ func Module() fx.Option {
4042
validator.Module,
4143
openapi.Module(),
4244
handlers.Module(),
45+
users.Module(),
4346
auth.Module(),
4447
push.Module(),
4548
db.Module,
@@ -54,6 +57,7 @@ func Module() fx.Option {
5457
metrics.Module(),
5558
sse.Module(),
5659
online.Module(),
60+
jwt.Module(),
5761
)
5862
}
5963

internal/sms-gateway/handlers/3rdparty.go

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,43 +5,65 @@ import (
55
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/devices"
66
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/logs"
77
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/messages"
8+
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/jwtauth"
89
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/userauth"
910
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/settings"
11+
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/thirdparty"
1012
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/webhooks"
11-
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/auth"
13+
"github.com/android-sms-gateway/server/internal/sms-gateway/jwt"
14+
"github.com/android-sms-gateway/server/internal/sms-gateway/users"
1215
"github.com/go-playground/validator/v10"
1316
"github.com/gofiber/fiber/v2"
14-
"go.uber.org/fx"
1517
"go.uber.org/zap"
1618
)
1719

18-
type ThirdPartyHandlerParams struct {
19-
fx.In
20-
21-
HealthHandler *HealthHandler
22-
MessagesHandler *messages.ThirdPartyController
23-
WebhooksHandler *webhooks.ThirdPartyController
24-
DevicesHandler *devices.ThirdPartyController
25-
SettingsHandler *settings.ThirdPartyController
26-
LogsHandler *logs.ThirdPartyController
27-
28-
AuthSvc *auth.Service
29-
30-
Logger *zap.Logger
31-
Validator *validator.Validate
32-
}
33-
3420
type thirdPartyHandler struct {
3521
base.Handler
3622

23+
usersSvc *users.Service
24+
jwtSvc jwt.Service
25+
3726
healthHandler *HealthHandler
3827
messagesHandler *messages.ThirdPartyController
3928
webhooksHandler *webhooks.ThirdPartyController
4029
devicesHandler *devices.ThirdPartyController
4130
settingsHandler *settings.ThirdPartyController
4231
logsHandler *logs.ThirdPartyController
32+
authHandler *thirdparty.AuthHandler
33+
}
4334

44-
authSvc *auth.Service
35+
func newThirdPartyHandler(
36+
usersSvc *users.Service,
37+
jwtService jwt.Service,
38+
39+
healthHandler *HealthHandler,
40+
messagesHandler *messages.ThirdPartyController,
41+
webhooksHandler *webhooks.ThirdPartyController,
42+
devicesHandler *devices.ThirdPartyController,
43+
settingsHandler *settings.ThirdPartyController,
44+
logsHandler *logs.ThirdPartyController,
45+
authHandler *thirdparty.AuthHandler,
46+
47+
logger *zap.Logger,
48+
validator *validator.Validate,
49+
) *thirdPartyHandler {
50+
return &thirdPartyHandler{
51+
Handler: base.Handler{
52+
Logger: logger,
53+
Validator: validator,
54+
},
55+
56+
usersSvc: usersSvc,
57+
jwtSvc: jwtService,
58+
59+
healthHandler: healthHandler,
60+
messagesHandler: messagesHandler,
61+
webhooksHandler: webhooksHandler,
62+
devicesHandler: devicesHandler,
63+
settingsHandler: settingsHandler,
64+
logsHandler: logsHandler,
65+
authHandler: authHandler,
66+
}
4567
}
4668

4769
func (h *thirdPartyHandler) Register(router fiber.Router) {
@@ -50,10 +72,13 @@ func (h *thirdPartyHandler) Register(router fiber.Router) {
5072
h.healthHandler.Register(router)
5173

5274
router.Use(
53-
userauth.NewBasic(h.authSvc),
75+
userauth.NewBasic(h.usersSvc),
76+
jwtauth.NewJWT(h.jwtSvc, h.usersSvc),
5477
userauth.UserRequired(),
5578
)
5679

80+
h.authHandler.Register(router.Group("/auth"))
81+
5782
h.messagesHandler.Register(router.Group("/message")) // TODO: remove after 2025-12-31
5883
h.messagesHandler.Register(router.Group("/messages"))
5984

@@ -66,16 +91,3 @@ func (h *thirdPartyHandler) Register(router fiber.Router) {
6691

6792
h.logsHandler.Register(router.Group("/logs"))
6893
}
69-
70-
func newThirdPartyHandler(params ThirdPartyHandlerParams) *thirdPartyHandler {
71-
return &thirdPartyHandler{
72-
Handler: base.Handler{Logger: params.Logger.Named("ThirdPartyHandler"), Validator: params.Validator},
73-
healthHandler: params.HealthHandler,
74-
messagesHandler: params.MessagesHandler,
75-
webhooksHandler: params.WebhooksHandler,
76-
devicesHandler: params.DevicesHandler,
77-
settingsHandler: params.SettingsHandler,
78-
logsHandler: params.LogsHandler,
79-
authSvc: params.AuthSvc,
80-
}
81-
}

0 commit comments

Comments
 (0)