Skip to content

Commit 801cace

Browse files
committed
Rework Session and Casbin examples
1 parent 709cbc8 commit 801cace

11 files changed

Lines changed: 357 additions & 118 deletions

File tree

cookbook/casbin/auth_model.conf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[request_definition]
2+
r = sub, obj, act
3+
4+
[policy_definition]
5+
p = sub, obj, act
6+
7+
[role_definition]
8+
g = _, _
9+
10+
[policy_effect]
11+
e = some(where (p.eft == allow))
12+
13+
[matchers]
14+
m = g(r.sub, p.sub) && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")

cookbook/casbin/auth_policy.csv

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
p, 1234567890, /dataset1/*, GET
2+
p, alice, /dataset1/*, GET
3+
p, alice, /dataset1/resource1, POST
4+
p, bob, /dataset2/resource1, *
5+
p, bob, /dataset2/resource2, GET
6+
p, bob, /dataset2/folder1/*, POST
7+
p, dataset1_admin, /dataset1/*, *
8+
g, cathy, dataset1_admin

cookbook/casbin/server.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package main
2+
3+
import (
4+
"log/slog"
5+
"net/http"
6+
7+
"github.com/casbin/casbin/v3"
8+
"github.com/golang-jwt/jwt/v5"
9+
echojwt "github.com/labstack/echo-jwt/v5"
10+
"github.com/labstack/echo/v5"
11+
)
12+
13+
// NewCasbinMiddleware returns middleware for [Casbin](https://casbin.org/).
14+
func NewCasbinMiddleware(enforcer *casbin.Enforcer, userGetter func(*echo.Context) (string, error)) echo.MiddlewareFunc {
15+
return func(next echo.HandlerFunc) echo.HandlerFunc {
16+
return func(c *echo.Context) error {
17+
username, err := userGetter(c)
18+
if err != nil {
19+
return echo.ErrUnauthorized.Wrap(err)
20+
}
21+
if pass, err := enforcer.Enforce(username, c.Request().URL.Path, c.Request().Method); err != nil {
22+
return echo.ErrInternalServerError.Wrap(err)
23+
} else if !pass {
24+
return echo.NewHTTPError(http.StatusForbidden, "access denied")
25+
}
26+
return next(c)
27+
}
28+
}
29+
}
30+
31+
/*
32+
Test with:
33+
curl -v "http://localhost:8080/dataset1/any" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"
34+
*/
35+
func main() {
36+
e := echo.New()
37+
38+
ce, err := casbin.NewEnforcer("auth_model.conf", "auth_policy.csv")
39+
if err != nil {
40+
slog.Error("failed to initialize Casbin enforcer", "error", err)
41+
}
42+
43+
// BasicAuth middleware does authentication
44+
// - should pass `curl -v -u "alice:password" http://localhost:8080/dataset1/any`
45+
// - should fail `curl -v -u "alice:password" http://localhost:8080/dataset2/resource2`
46+
//e.Use(middleware.BasicAuth(func(c *echo.Context, user string, password string) (bool, error) {
47+
// return subtle.ConstantTimeCompare([]byte(user), []byte("alice")) == 1 &&
48+
// subtle.ConstantTimeCompare([]byte(password), []byte("password")) == 1, nil
49+
//}))
50+
//basicAuthUser := func(c *echo.Context) (string, error) { // basic auth user getter for Casbin authorization
51+
// username, _, _ := c.Request().BasicAuth() // NB: authorization (PASSWORD check) must be done somewhere!!!
52+
// return username, nil
53+
//}
54+
//e.Use(NewCasbinMiddleware(ce, basicAuthUser)) // Casbin does authorization
55+
56+
e.Use(echojwt.JWT([]byte("secret"))) // JWT middleware does authentication
57+
jwtUser := func(c *echo.Context) (string, error) { // JWT user getter for Casbin authorization
58+
token, err := echo.ContextGet[*jwt.Token](c, "user")
59+
if err != nil {
60+
return "", err
61+
}
62+
return token.Claims.GetSubject()
63+
}
64+
e.Use(NewCasbinMiddleware(ce, jwtUser)) // Casbin does authorization
65+
66+
e.GET("/*", func(c *echo.Context) error {
67+
return c.String(http.StatusOK, "Hello, World!")
68+
})
69+
70+
if err := e.Start(":8080"); err != nil {
71+
e.Logger.Error("failed to start server", "error", err)
72+
}
73+
}

cookbook/jwt/custom-claims/server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ func accessible(c *echo.Context) error {
5656
}
5757

5858
func restricted(c *echo.Context) error {
59-
user, err := echo.ContextGet[*jwt.Token](c, "user")
59+
token, err := echo.ContextGet[*jwt.Token](c, "user")
6060
if err != nil {
6161
return echo.ErrUnauthorized.Wrap(err)
6262
}
63-
claims := user.Claims.(*jwtCustomClaims)
63+
claims := token.Claims.(*jwtCustomClaims)
6464
name := claims.Name
6565
return c.String(http.StatusOK, "Welcome "+name+"!")
6666
}

cookbook/prometheus/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package main
33
import (
44
"net/http"
55

6-
"github.com/labstack/echo-contrib/echoprometheus"
6+
"github.com/labstack/echo-contrib/v5/echoprometheus"
77
"github.com/labstack/echo/v5"
88
"github.com/prometheus/client_golang/prometheus"
99
)

go.mod

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,33 @@ module github.com/labstack/echox
33
go 1.25.0
44

55
require (
6-
github.com/golang-jwt/jwt/v5 v5.3.0
6+
github.com/golang-jwt/jwt/v5 v5.3.1
77
github.com/gorilla/websocket v1.5.3
8-
github.com/labstack/echo-contrib v0.50.0
8+
github.com/labstack/echo-contrib/v5 v5.0.0
99
github.com/labstack/echo-jwt/v5 v5.0.0
10-
github.com/labstack/echo/v5 v5.0.0
10+
github.com/labstack/echo/v5 v5.0.3
1111
github.com/lestrrat-go/jwx/v3 v3.0.13
1212
github.com/prometheus/client_golang v1.23.2
1313
github.com/r3labs/sse/v2 v2.10.0
1414
github.com/stretchr/testify v1.11.1
15-
golang.org/x/crypto v0.47.0
16-
golang.org/x/net v0.49.0
15+
golang.org/x/crypto v0.48.0
16+
golang.org/x/net v0.50.0
1717
)
1818

1919
require (
2020
github.com/beorn7/perks v1.0.1 // indirect
21+
github.com/bmatcuk/doublestar/v4 v4.10.0 // indirect
22+
github.com/casbin/casbin/v3 v3.10.0 // indirect
23+
github.com/casbin/govaluate v1.10.0 // indirect
2124
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2225
github.com/davecgh/go-spew v1.1.1 // indirect
2326
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
2427
github.com/goccy/go-json v0.10.5 // indirect
28+
github.com/google/uuid v1.6.0 // indirect
2529
github.com/kr/text v0.2.0 // indirect
2630
github.com/lestrrat-go/blackmagic v1.0.4 // indirect
2731
github.com/lestrrat-go/httpcc v1.0.1 // indirect
28-
github.com/lestrrat-go/httprc/v3 v3.0.3 // indirect
32+
github.com/lestrrat-go/httprc/v3 v3.0.4 // indirect
2933
github.com/lestrrat-go/option/v2 v2.0.0 // indirect
3034
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
3135
github.com/pmezard/go-difflib v1.0.0 // indirect
@@ -34,8 +38,8 @@ require (
3438
github.com/prometheus/procfs v0.19.2 // indirect
3539
github.com/segmentio/asm v1.2.1 // indirect
3640
go.yaml.in/yaml/v2 v2.4.3 // indirect
37-
golang.org/x/sys v0.40.0 // indirect
38-
golang.org/x/text v0.33.0 // indirect
41+
golang.org/x/sys v0.41.0 // indirect
42+
golang.org/x/text v0.34.0 // indirect
3943
golang.org/x/time v0.14.0 // indirect
4044
google.golang.org/protobuf v1.36.11 // indirect
4145
gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect

go.sum

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
22
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
3+
github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
4+
github.com/bmatcuk/doublestar/v4 v4.10.0 h1:zU9WiOla1YA122oLM6i4EXvGW62DvKZVxIe6TYWexEs=
5+
github.com/bmatcuk/doublestar/v4 v4.10.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
6+
github.com/casbin/casbin/v3 v3.10.0 h1:039ORla55vCeIZWd0LfzWFt1yiEA5X4W41xBW2bQuHs=
7+
github.com/casbin/casbin/v3 v3.10.0/go.mod h1:5rJbQr2e6AuuDDNxnPc5lQlC9nIgg6nS1zYwKXhpHC8=
8+
github.com/casbin/govaluate v1.3.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A=
9+
github.com/casbin/govaluate v1.10.0 h1:ffGw51/hYH3w3rZcxO/KcaUIDOLP84w7nsidMVgaDG0=
10+
github.com/casbin/govaluate v1.10.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A=
311
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
412
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
513
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
@@ -12,8 +20,12 @@ github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
1220
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
1321
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
1422
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
23+
github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=
24+
github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
1525
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
1626
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
27+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
28+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
1729
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
1830
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
1931
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
@@ -24,18 +36,14 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
2436
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
2537
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
2638
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
27-
github.com/labstack/echo-contrib v0.17.5-0.20260113213056-68ad9fe34c3d h1:P5nNuXYDv47aLCbf+jLWxmIgtCLPFZQPRqNP52KUoKI=
28-
github.com/labstack/echo-contrib v0.17.5-0.20260113213056-68ad9fe34c3d/go.mod h1:tGZ39uN7bCDY4WtVWd2KiDFI2PxHB5lhLOtSNb+9tE4=
29-
github.com/labstack/echo-contrib v0.50.0 h1:MLTQdqME3BEBczV2thYz9yPT5sBhzkoUEpwAOY9llds=
30-
github.com/labstack/echo-contrib v0.50.0/go.mod h1:oftqJL4enNg9ao1VLpVZmisVE5/8uwHtIYE4zTpqyWU=
31-
github.com/labstack/echo-jwt/v5 v5.0.0-20260101195926-7cdd901b4337 h1:+9keiGOPRLJvrh+hp+4hApQK/seq3iVr0hVdRweUUYI=
32-
github.com/labstack/echo-jwt/v5 v5.0.0-20260101195926-7cdd901b4337/go.mod h1:7zV1rqeuZ57XS4nwL/ymw4tywVUzg5SEovZandLv9nI=
39+
github.com/labstack/echo-contrib/v5 v5.0.0 h1:ZukJ7gzW/gEe9ZiqpSQGAkRR8E35eTvu1PQBjmp2tDs=
40+
github.com/labstack/echo-contrib/v5 v5.0.0/go.mod h1:oUtPer7/M+vUJjDATlgVUhHvVUDc7Nh/4Xs+/m52OKA=
3341
github.com/labstack/echo-jwt/v5 v5.0.0 h1:uPp+FpkI/PKpMPPygtnK3RQOpg5a2wlM04UgfpWLVyI=
3442
github.com/labstack/echo-jwt/v5 v5.0.0/go.mod h1:RYF2ojWXbaY09QQ5J9vVtPUtkyI5UztS0gJotmCRz/U=
35-
github.com/labstack/echo/v5 v5.0.0-20260106091252-d6cb58b5c24e h1:QFu8S1iZijCXEUcP8u/h+JtZYlekbt0VIndrKbT/VAo=
36-
github.com/labstack/echo/v5 v5.0.0-20260106091252-d6cb58b5c24e/go.mod h1:5La3y+CVfH4IzVRlQA2LmK+clJEniclmzbqSyZIhsP4=
37-
github.com/labstack/echo/v5 v5.0.0 h1:JHKGrI0cbNsNMyKvranuY0C94O4hSM7yc/HtwcV3Na4=
38-
github.com/labstack/echo/v5 v5.0.0/go.mod h1:SyvlSdObGjRXeQfCCXW/sybkZdOOQZBmpKF0bvALaeo=
43+
github.com/labstack/echo/v5 v5.0.1 h1:60L7x1KMWRIJuaFqvnEHH322g+YnsMWq5Rzaeo6lcP4=
44+
github.com/labstack/echo/v5 v5.0.1/go.mod h1:SyvlSdObGjRXeQfCCXW/sybkZdOOQZBmpKF0bvALaeo=
45+
github.com/labstack/echo/v5 v5.0.3 h1:Jql8sDtCYXrhh2Mbs6jKwjR6r7X8FSQQmch+w6QS7kc=
46+
github.com/labstack/echo/v5 v5.0.3/go.mod h1:SyvlSdObGjRXeQfCCXW/sybkZdOOQZBmpKF0bvALaeo=
3947
github.com/lestrrat-go/blackmagic v1.0.4 h1:IwQibdnf8l2KoO+qC3uT4OaTWsW7tuRQXy9TRN9QanA=
4048
github.com/lestrrat-go/blackmagic v1.0.4/go.mod h1:6AWFyKNNj0zEXQYfTMPfZrAXUWUfTIZ5ECEUEJaijtw=
4149
github.com/lestrrat-go/dsig v1.0.0 h1:OE09s2r9Z81kxzJYRn07TFM9XA4akrUdoMwr0L8xj38=
@@ -46,8 +54,8 @@ github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZ
4654
github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E=
4755
github.com/lestrrat-go/httprc/v3 v3.0.3 h1:WjLHWkDkgWXeIUrKi/7lS/sGq2DjkSAwdTbH5RHXAKs=
4856
github.com/lestrrat-go/httprc/v3 v3.0.3/go.mod h1:mSMtkZW92Z98M5YoNNztbRGxbXHql7tSitCvaxvo9l0=
49-
github.com/lestrrat-go/jwx/v3 v3.0.12 h1:p25r68Y4KrbBdYjIsQweYxq794CtGCzcrc5dGzJIRjg=
50-
github.com/lestrrat-go/jwx/v3 v3.0.12/go.mod h1:HiUSaNmMLXgZ08OmGBaPVvoZQgJVOQphSrGr5zMamS8=
57+
github.com/lestrrat-go/httprc/v3 v3.0.4 h1:pXyH2ppK8GYYggygxJ3TvxpCZnbEUWc9qSwRTTApaLA=
58+
github.com/lestrrat-go/httprc/v3 v3.0.4/go.mod h1:mSMtkZW92Z98M5YoNNztbRGxbXHql7tSitCvaxvo9l0=
5159
github.com/lestrrat-go/jwx/v3 v3.0.13 h1:AdHKiPIYeCSnOJtvdpipPg/0SuFh9rdkN+HF3O0VdSk=
5260
github.com/lestrrat-go/jwx/v3 v3.0.13/go.mod h1:2m0PV1A9tM4b/jVLMx8rh6rBl7F6WGb3EG2hufN9OQU=
5361
github.com/lestrrat-go/option/v2 v2.0.0 h1:XxrcaJESE1fokHy3FpaQ/cXW8ZsIdWcdFzzLOcID3Ss=
@@ -75,31 +83,32 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
7583
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
7684
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
7785
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
78-
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
79-
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
8086
github.com/valyala/fastjson v1.6.7 h1:ZE4tRy0CIkh+qDc5McjatheGX2czdn8slQjomexVpBM=
87+
github.com/valyala/fastjson v1.6.7/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
8188
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
8289
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
8390
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
8491
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
8592
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
86-
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
87-
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
8893
golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
8994
golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
95+
golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
96+
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
9097
golang.org/x/net v0.0.0-20191116160921-f9c825593386/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
91-
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
92-
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
9398
golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
9499
golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
100+
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
101+
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
95102
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
96103
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
97104
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
105+
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
106+
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
98107
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
99-
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
100-
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
101108
golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
102109
golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
110+
golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
111+
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
103112
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
104113
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
105114
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=

0 commit comments

Comments
 (0)