]> source.dussan.org Git - gitea.git/commitdiff
Upgrade to the latest version of golang-jwt (#16590) (#16606)
authorzeripath <art27@cantab.net>
Tue, 3 Aug 2021 21:22:52 +0000 (22:22 +0100)
committerGitHub <noreply@github.com>
Tue, 3 Aug 2021 21:22:52 +0000 (22:22 +0100)
* Upgrade to the latest version of golang-jwt.

Backport #16590

* Forcibly update the vendored versions too
* Update our minimal go lang version to 1.15 (differs from 1.16 in #16590)

Signed-off-by: Andrew Thornton <art27@cantab.net>
 ### :warning: BREAKING :warning:

This PR raises the minimal version of go supported to 1.15 which will mean the end of support of 32-bit Mac and Mac OS versions before Sierra.

Signed-off-by: Andrew Thornton <art27@cantab.net>
* update minimal go required

Signed-off-by: Andrew Thornton <art27@cantab.net>
* update config.yaml

Signed-off-by: Andrew Thornton <art27@cantab.net>
14 files changed:
.drone.yml
Makefile
docs/config.yaml
go.mod
go.sum
vendor/github.com/golang-jwt/jwt/.travis.yml [deleted file]
vendor/github.com/golang-jwt/jwt/README.md
vendor/github.com/golang-jwt/jwt/VERSION_HISTORY.md
vendor/github.com/golang-jwt/jwt/ecdsa.go
vendor/github.com/golang-jwt/jwt/ed25519.go [new file with mode: 0644]
vendor/github.com/golang-jwt/jwt/ed25519_utils.go [new file with mode: 0644]
vendor/github.com/golang-jwt/jwt/map_claims.go
vendor/github.com/golang-jwt/jwt/token.go
vendor/modules.txt

index 4bcd2d123990d6cd2a662c110ea509145bbd09e0..d4585cb01d80656b3cc11c6f99007230bab10dbf 100644 (file)
@@ -84,7 +84,7 @@ steps:
 
   - name: build-backend-no-gcc
     pull: always
-    image: golang:1.14 # this step is kept as the lowest version of golang that we support
+    image: golang:1.15 # this step is kept as the lowest version of golang that we support
     environment:
       GO111MODULE: on
       GOPROXY: off
index c07dfbf475631439ed453cea1d81ca3a8eaf89a0..332e6afe16bf674d2d9ab0bd51ef7a7bb8bef980 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,7 @@ HAS_GO = $(shell hash $(GO) > /dev/null 2>&1 && echo "GO" || echo "NOGO" )
 COMMA := ,
 
 XGO_VERSION := go-1.16.x
-MIN_GO_VERSION := 001014000
+MIN_GO_VERSION := 001015000
 MIN_NODE_VERSION := 012017000
 
 DOCKER_IMAGE ?= gitea/gitea
@@ -200,7 +200,7 @@ help:
 go-check:
        $(eval GO_VERSION := $(shell printf "%03d%03d%03d" $(shell $(GO) version | grep -Eo '[0-9]+\.[0-9.]+' | tr '.' ' ');))
        @if [ "$(GO_VERSION)" -lt "$(MIN_GO_VERSION)" ]; then \
-               echo "Gitea requires Go 1.14 or greater to build. You can get it at https://golang.org/dl/"; \
+               echo "Gitea requires Go 1.15 or greater to build. You can get it at https://golang.org/dl/"; \
                exit 1; \
        fi
 
index 451984e09d7c02eb1124a2d349cc3482546988a8..efe3cfbeea5ba2f44856b370d1a75eb82129ebce 100644 (file)
@@ -19,7 +19,7 @@ params:
   author: The Gitea Authors
   website: https://docs.gitea.io
   version: 1.14.4
-  minGoVersion: 1.14
+  minGoVersion: 1.15
   goVersion: 1.16
   minNodeVersion: 12.17
 
diff --git a/go.mod b/go.mod
index 038097afa015395670f9ff2fa94a5ab86a94ee8a..3b73690d6ebc6ccf432c45b4dc17b7ad2197bde2 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -50,7 +50,7 @@ require (
        github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28
        github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14
        github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85
-       github.com/golang-jwt/jwt v3.2.1+incompatible
+       github.com/golang-jwt/jwt v3.2.2+incompatible
        github.com/golang/snappy v0.0.4 // indirect
        github.com/google/go-github/v32 v32.1.0
        github.com/google/go-querystring v1.1.0 // indirect
@@ -143,3 +143,5 @@ require (
 )
 
 replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1
+
+replace github.com/golang-jwt/jwt v3.2.1+incompatible => github.com/golang-jwt/jwt v3.2.2+incompatible
diff --git a/go.sum b/go.sum
index ac5814c9218419f4c9cea23e3d7d28684822194f..e7a2f98681d95f5736022e45bcb686b812620fa1 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -49,8 +49,6 @@ gitea.com/go-chi/captcha v0.0.0-20210110083842-e7696c336a1e h1:YjaQU6XFicdhPN+Ml
 gitea.com/go-chi/captcha v0.0.0-20210110083842-e7696c336a1e/go.mod h1:nfA7JaGv3hbGQ1ktdhAsZhdS84qKffI8NMlHr+Opsog=
 gitea.com/go-chi/session v0.0.0-20210108030337-0cb48c5ba8ee h1:9U6HuKUBt/cGK6T/64dEuz0r7Yp97WAAEJvXHDlY3ws=
 gitea.com/go-chi/session v0.0.0-20210108030337-0cb48c5ba8ee/go.mod h1:Ozg8IchVNb/Udg+ui39iHRYqVHSvf3C99ixdpLR8Vu0=
-gitea.com/lunny/levelqueue v0.3.0 h1:MHn1GuSZkxvVEDMyAPqlc7A3cOW+q8RcGhRgH/xtm6I=
-gitea.com/lunny/levelqueue v0.3.0/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU=
 gitea.com/lunny/levelqueue v0.4.0 h1:v+bCR1lwLTBpZMshguWNhGIFLkUj+R04pgaU3TcJFS8=
 gitea.com/lunny/levelqueue v0.4.0/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU=
 gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
@@ -477,8 +475,8 @@ github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14 h1:yXtpJr/LV6PFu4nTLgfjQ
 github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14/go.mod h1:jPoNZLWDAqA5N3G5amEoiNbhVrmM+ZQEcnQvNQ2KaZk=
 github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 h1:UjoPNDAQ5JPCjlxoJd6K8ALZqSDDhk2ymieAZOVaDg0=
 github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85/go.mod h1:fR6z1Ie6rtF7kl/vBYMfgD5/G5B1blui7z426/sj2DU=
-github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c=
-github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
+github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
+github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
 github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
 github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
diff --git a/vendor/github.com/golang-jwt/jwt/.travis.yml b/vendor/github.com/golang-jwt/jwt/.travis.yml
deleted file mode 100644 (file)
index 036a862..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-language: go
-
-script:
-    - go vet ./...
-    - go test -v ./...
-
-go:
-  - 1.7
-  - 1.8
-  - 1.9
-  - 1.10
index 13c31c09b6fb5a118a520fe10ec06553523567ca..9b653e46b013629b8b3fd793fdbfc9ec0bb8c13c 100644 (file)
@@ -9,10 +9,17 @@ A [go](http://www.golang.org) (or 'golang' for search engine friendliness) imple
 
 Future releases will be using the `github.com/golang-jwt/jwt` import path and continue the existing versioning scheme of `v3.x.x+incompatible`. Backwards-compatible patches and fixes will be done on the `v3` release branch, where as new build-breaking features will be developed in a `v4` release, possibly including a SIV-style import path.
 
-**SECURITY NOTICE:** Some older versions of Go have a security issue in the crypto/elliptic. Recommendation is to upgrade to at least 1.8.3. See issue [dgrijalva/jwt-go#216](https://github.com/dgrijalva/jwt-go/issues/216) for more detail.
+**SECURITY NOTICE:** Some older versions of Go have a security issue in the crypto/elliptic. Recommendation is to upgrade to at least 1.15 See issue [dgrijalva/jwt-go#216](https://github.com/dgrijalva/jwt-go/issues/216) for more detail.
 
 **SECURITY NOTICE:** It's important that you [validate the `alg` presented is what you expect](https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/). This library attempts to make it easy to do the right thing by requiring key types match the expected alg, but you should take the extra step to verify it in your usage.  See the examples provided.
 
+### Supported Go versions
+
+Our support of Go versions is aligned with Go's [version release policy](https://golang.org/doc/devel/release#policy).
+So we will support a major version of Go until there are two newer major releases.
+We no longer support building jwt-go with unsupported Go versions, as these contain security vulnerabilities
+which will not be fixed.
+
 ## What the heck is a JWT?
 
 JWT.io has [a great introduction](https://jwt.io/introduction) to JSON Web Tokens.
index dac737bcaa48f21219496fa53ff92244b1134c20..637f2ba616a8e77e093caa26373d69f4ee790992 100644 (file)
@@ -1,5 +1,12 @@
 ## `jwt-go` Version History
 
+#### 3.2.2
+
+* Starting from this release, we are adopting the policy to support the most 2 recent versions of Go currently available. By the time of this release, this is Go 1.15 and 1.16 ([#28](https://github.com/golang-jwt/jwt/pull/28)).
+* Fixed a potential issue that could occur when the verification of `exp`, `iat` or `nbf` was not required and contained invalid contents, i.e. non-numeric/date. Thanks for @thaJeztah for making us aware of that and @giorgos-f3 for originally reporting it to the formtech fork ([#40](https://github.com/golang-jwt/jwt/pull/40)).
+* Added support for EdDSA / ED25519 ([#36](https://github.com/golang-jwt/jwt/pull/36)).
+* Optimized allocations ([#33](https://github.com/golang-jwt/jwt/pull/33)).
+
 #### 3.2.1
 
 * **Import Path Change**: See MIGRATION_GUIDE.md for tips on updating your code
index d310af1c7c063cb6d9ae721feba8907607137c77..15e23435df6bb93e22025b42662e52097c31302e 100644 (file)
@@ -128,18 +128,12 @@ func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string
                        keyBytes += 1
                }
 
-               // We serialize the outpus (r and s) into big-endian byte arrays and pad
-               // them with zeros on the left to make sure the sizes work out. Both arrays
-               // must be keyBytes long, and the output must be 2*keyBytes long.
-               rBytes := r.Bytes()
-               rBytesPadded := make([]byte, keyBytes)
-               copy(rBytesPadded[keyBytes-len(rBytes):], rBytes)
-
-               sBytes := s.Bytes()
-               sBytesPadded := make([]byte, keyBytes)
-               copy(sBytesPadded[keyBytes-len(sBytes):], sBytes)
-
-               out := append(rBytesPadded, sBytesPadded...)
+               // We serialize the outputs (r and s) into big-endian byte arrays
+               // padded with zeros on the left to make sure the sizes work out.
+               // Output must be 2*keyBytes long.
+               out := make([]byte, 2*keyBytes)
+               r.FillBytes(out[0:keyBytes]) // r is assigned to the first half of output.
+               s.FillBytes(out[keyBytes:])  // s is assigned to the second half of output.
 
                return EncodeSegment(out), nil
        } else {
diff --git a/vendor/github.com/golang-jwt/jwt/ed25519.go b/vendor/github.com/golang-jwt/jwt/ed25519.go
new file mode 100644 (file)
index 0000000..a2f8ddb
--- /dev/null
@@ -0,0 +1,81 @@
+package jwt
+
+import (
+       "errors"
+
+       "crypto/ed25519"
+)
+
+var (
+       ErrEd25519Verification = errors.New("ed25519: verification error")
+)
+
+// Implements the EdDSA family
+// Expects ed25519.PrivateKey for signing and ed25519.PublicKey for verification
+type SigningMethodEd25519 struct{}
+
+// Specific instance for EdDSA
+var (
+       SigningMethodEdDSA *SigningMethodEd25519
+)
+
+func init() {
+       SigningMethodEdDSA = &SigningMethodEd25519{}
+       RegisterSigningMethod(SigningMethodEdDSA.Alg(), func() SigningMethod {
+               return SigningMethodEdDSA
+       })
+}
+
+func (m *SigningMethodEd25519) Alg() string {
+       return "EdDSA"
+}
+
+// Implements the Verify method from SigningMethod
+// For this verify method, key must be an ed25519.PublicKey
+func (m *SigningMethodEd25519) Verify(signingString, signature string, key interface{}) error {
+       var err error
+       var ed25519Key ed25519.PublicKey
+       var ok bool
+
+       if ed25519Key, ok = key.(ed25519.PublicKey); !ok {
+               return ErrInvalidKeyType
+       }
+
+       if len(ed25519Key) != ed25519.PublicKeySize {
+               return ErrInvalidKey
+       }
+
+       // Decode the signature
+       var sig []byte
+       if sig, err = DecodeSegment(signature); err != nil {
+               return err
+       }
+
+       // Verify the signature
+       if !ed25519.Verify(ed25519Key, []byte(signingString), sig) {
+               return ErrEd25519Verification
+       }
+
+       return nil
+}
+
+// Implements the Sign method from SigningMethod
+// For this signing method, key must be an ed25519.PrivateKey
+func (m *SigningMethodEd25519) Sign(signingString string, key interface{}) (string, error) {
+       var ed25519Key ed25519.PrivateKey
+       var ok bool
+
+       if ed25519Key, ok = key.(ed25519.PrivateKey); !ok {
+               return "", ErrInvalidKeyType
+       }
+
+       // ed25519.Sign panics if private key not equal to ed25519.PrivateKeySize
+       // this allows to avoid recover usage
+       if len(ed25519Key) != ed25519.PrivateKeySize {
+               return "", ErrInvalidKey
+       }
+
+       // Sign the string and return the encoded result
+       sig := ed25519.Sign(ed25519Key, []byte(signingString))
+       return EncodeSegment(sig), nil
+}
diff --git a/vendor/github.com/golang-jwt/jwt/ed25519_utils.go b/vendor/github.com/golang-jwt/jwt/ed25519_utils.go
new file mode 100644 (file)
index 0000000..c635727
--- /dev/null
@@ -0,0 +1,64 @@
+package jwt
+
+import (
+       "crypto"
+       "crypto/ed25519"
+       "crypto/x509"
+       "encoding/pem"
+       "errors"
+)
+
+var (
+       ErrNotEdPrivateKey = errors.New("Key is not a valid Ed25519 private key")
+       ErrNotEdPublicKey  = errors.New("Key is not a valid Ed25519 public key")
+)
+
+// Parse PEM-encoded Edwards curve private key
+func ParseEdPrivateKeyFromPEM(key []byte) (crypto.PrivateKey, error) {
+       var err error
+
+       // Parse PEM block
+       var block *pem.Block
+       if block, _ = pem.Decode(key); block == nil {
+               return nil, ErrKeyMustBePEMEncoded
+       }
+
+       // Parse the key
+       var parsedKey interface{}
+       if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil {
+               return nil, err
+       }
+
+       var pkey ed25519.PrivateKey
+       var ok bool
+       if pkey, ok = parsedKey.(ed25519.PrivateKey); !ok {
+               return nil, ErrNotEdPrivateKey
+       }
+
+       return pkey, nil
+}
+
+// Parse PEM-encoded Edwards curve public key
+func ParseEdPublicKeyFromPEM(key []byte) (crypto.PublicKey, error) {
+       var err error
+
+       // Parse PEM block
+       var block *pem.Block
+       if block, _ = pem.Decode(key); block == nil {
+               return nil, ErrKeyMustBePEMEncoded
+       }
+
+       // Parse the key
+       var parsedKey interface{}
+       if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil {
+               return nil, err
+       }
+
+       var pkey ed25519.PublicKey
+       var ok bool
+       if pkey, ok = parsedKey.(ed25519.PublicKey); !ok {
+               return nil, ErrNotEdPublicKey
+       }
+
+       return pkey, nil
+}
index ba290f429afdbb569782af5e27d9161b60bbd533..72c79f92e55ad4e87737d7c5e9e11f6bf5260db0 100644 (file)
@@ -34,27 +34,35 @@ func (m MapClaims) VerifyAudience(cmp string, req bool) bool {
 // Compares the exp claim against cmp.
 // If required is false, this method will return true if the value matches or is unset
 func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool {
-       switch exp := m["exp"].(type) {
+       exp, ok := m["exp"]
+       if !ok {
+               return !req
+       }
+       switch expType := exp.(type) {
        case float64:
-               return verifyExp(int64(exp), cmp, req)
+               return verifyExp(int64(expType), cmp, req)
        case json.Number:
-               v, _ := exp.Int64()
+               v, _ := expType.Int64()
                return verifyExp(v, cmp, req)
        }
-       return !req
+       return false
 }
 
 // Compares the iat claim against cmp.
 // If required is false, this method will return true if the value matches or is unset
 func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool {
-       switch iat := m["iat"].(type) {
+       iat, ok := m["iat"]
+       if !ok {
+               return !req
+       }
+       switch iatType := iat.(type) {
        case float64:
-               return verifyIat(int64(iat), cmp, req)
+               return verifyIat(int64(iatType), cmp, req)
        case json.Number:
-               v, _ := iat.Int64()
+               v, _ := iatType.Int64()
                return verifyIat(v, cmp, req)
        }
-       return !req
+       return false
 }
 
 // Compares the iss claim against cmp.
@@ -67,14 +75,18 @@ func (m MapClaims) VerifyIssuer(cmp string, req bool) bool {
 // Compares the nbf claim against cmp.
 // If required is false, this method will return true if the value matches or is unset
 func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool {
-       switch nbf := m["nbf"].(type) {
+       nbf, ok := m["nbf"]
+       if !ok {
+               return !req
+       }
+       switch nbfType := nbf.(type) {
        case float64:
-               return verifyNbf(int64(nbf), cmp, req)
+               return verifyNbf(int64(nbfType), cmp, req)
        case json.Number:
-               v, _ := nbf.Int64()
+               v, _ := nbfType.Int64()
                return verifyNbf(v, cmp, req)
        }
-       return !req
+       return false
 }
 
 // Validates time based claims "exp, iat, nbf".
index 99868d29b9fd406a6f995c65cc5a087796e214ee..6b30ced1200cb94b05aac81873122f972907498a 100644 (file)
@@ -95,14 +95,10 @@ func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token
 
 // Encode JWT specific base64url encoding with padding stripped
 func EncodeSegment(seg []byte) string {
-       return strings.TrimRight(base64.URLEncoding.EncodeToString(seg), "=")
+       return base64.RawURLEncoding.EncodeToString(seg)
 }
 
 // Decode JWT specific base64url encoding with padding stripped
 func DecodeSegment(seg string) ([]byte, error) {
-       if l := len(seg) % 4; l > 0 {
-               seg += strings.Repeat("=", 4-l)
-       }
-
-       return base64.URLEncoding.DecodeString(seg)
+       return base64.RawURLEncoding.DecodeString(seg)
 }
index 7f0460bd2ca3cfe7d490b8448de5f4c2ae7a8485..44c38da636fa375891f1fb3850c17bfeebbf3b99 100644 (file)
@@ -428,7 +428,7 @@ github.com/gogs/cron
 # github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85
 ## explicit
 github.com/gogs/go-gogs-client
-# github.com/golang-jwt/jwt v3.2.1+incompatible
+# github.com/golang-jwt/jwt v3.2.2+incompatible
 ## explicit
 github.com/golang-jwt/jwt
 # github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe
@@ -1053,3 +1053,4 @@ xorm.io/xorm/names
 xorm.io/xorm/schemas
 xorm.io/xorm/tags
 # github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1
+# github.com/golang-jwt/jwt v3.2.1+incompatible => github.com/golang-jwt/jwt v3.2.2+incompatible