Skip to content

Commit 6b6dcac

Browse files
authored
Merge pull request #3 from anfen93/improvements
better error handling, updated tests
2 parents c9f1320 + 1c220bf commit 6b6dcac

5 files changed

Lines changed: 126 additions & 39 deletions

File tree

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ require (
1111
require (
1212
aidanwoods.dev/go-result v0.1.0 // indirect
1313
github.com/davecgh/go-spew v1.1.1 // indirect
14+
github.com/kr/pretty v0.3.0 // indirect
1415
github.com/pmezard/go-difflib v1.0.0 // indirect
16+
github.com/rogpeppe/go-internal v1.12.0 // indirect
1517
golang.org/x/crypto v0.17.0 // indirect
1618
golang.org/x/sys v0.15.0 // indirect
19+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
1720
gopkg.in/yaml.v3 v3.0.1 // indirect
1821
)

go.sum

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,34 @@ aidanwoods.dev/go-paseto v1.5.1 h1:IvT7wk7jmeTff6wyk7RlS6uAjUIAKU4MU2hkqr95lCo=
22
aidanwoods.dev/go-paseto v1.5.1/go.mod h1:9J13iCMdWrkfK1AxAg9QDHLaDMYSEP1ldbFiR+DfmVc=
33
aidanwoods.dev/go-result v0.1.0 h1:y/BMIRX6q3HwaorX1Wzrjo3WUdiYeyWbvGe18hKS3K8=
44
aidanwoods.dev/go-result v0.1.0/go.mod h1:yridkWghM7AXSFA6wzx0IbsurIm1Lhuro3rYef8FBHM=
5+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
56
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
67
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
78
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
89
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
10+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
11+
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
12+
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
13+
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
14+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
15+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
16+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
17+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
918
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1019
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
20+
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
21+
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
22+
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
1123
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
1224
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
1325
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
1426
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
1527
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
1628
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
17-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
1829
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
30+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
31+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
32+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
33+
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
1934
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
2035
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

paseto_maker.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package goPasetoV4
66
import (
77
"aidanwoods.dev/go-paseto"
88
"crypto/rand"
9+
"github.com/anfen93/goPasetoV4/util"
910
"github.com/google/uuid"
1011
"os"
1112
"strings"
@@ -37,10 +38,28 @@ func NewPasetoMaker() Maker {
3738
return &PasetoMaker{paseto.NewV4SymmetricKey(), nonce}
3839
}
3940

41+
// validateDuration validates the duration of a token. It returns true if the
42+
// duration is valid or false if it is not. It returns an error if the duration
43+
// is invalid.
44+
func validateDuration(duration time.Duration) (bool, error) {
45+
if duration == 0 {
46+
return false, util.ErrDurationNotSet()
47+
}
48+
if duration < 0 {
49+
return false, util.ErrDurationNegative()
50+
}
51+
return true, nil
52+
}
53+
4054
// CreateToken generates a new Paseto token for a given username and duration.
4155
// It returns an encrypted token string and the Payload struct, or an error if the token generation fails.
4256
func (maker *PasetoMaker) CreateToken(username string, duration time.Duration) (string, *Payload, error) {
4357

58+
// Validate the duration
59+
_, err := validateDuration(duration)
60+
if err != nil {
61+
return "", nil, err
62+
}
4463
token := paseto.NewToken() // Initializes a new Paseto token
4564

4665
tokenID, err := uuid.NewRandom() // Generates a unique identifier for the token

paseto_maker_test.go

Lines changed: 75 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,93 @@
11
package goPasetoV4
22

33
import (
4-
"github.com/stretchr/testify/require"
54
"testing"
65
"time"
6+
7+
"github.com/stretchr/testify/require"
78
)
89

9-
func TestPasetoMakerTokenLifecycle(t *testing.T) {
10-
// Testing token creation and validation lifecycle
10+
func TestPasetoMaker(t *testing.T) {
1111
maker := NewPasetoMaker()
12-
require.NotNil(t, maker, "Maker should not be nil")
1312

14-
username := "testuser"
15-
duration := time.Minute
13+
t.Run("CreateToken with Valid Inputs", func(t *testing.T) {
14+
username := "testuser"
15+
duration := time.Minute
1616

17-
token, payload, err := maker.CreateToken(username, duration)
18-
require.NoError(t, err, "Token creation should not error")
19-
require.NotEmpty(t, token, "Token should not be empty")
20-
require.NotEmpty(t, payload, "Payload should not be empty")
17+
token, payload, err := maker.CreateToken(username, duration)
18+
require.NoError(t, err)
19+
require.NotEmpty(t, token)
20+
require.NotNil(t, payload)
21+
require.Equal(t, username, payload.Username)
22+
})
2123

22-
payload, err = maker.VerifyToken(token)
23-
require.NoError(t, err, "Token verification should not error")
24-
require.NotEmpty(t, payload, "Payload should not be empty")
24+
t.Run("VerifyToken with Valid Token", func(t *testing.T) {
25+
username := "testuser"
26+
duration := time.Minute
2527

26-
require.NotZero(t, payload.ID, "Payload ID should not be zero")
27-
require.Equal(t, username, payload.Username, "Username should match")
28-
require.WithinDuration(t, time.Now(), payload.IssuedAt, time.Second, "IssuedAt should be recent")
29-
require.WithinDuration(t, time.Now().Add(duration), payload.ExpiredAt, time.Second, "ExpiredAt should be correct")
30-
}
28+
token, _, err := maker.CreateToken(username, duration)
29+
require.NoError(t, err)
3130

32-
func TestPasetoMakerExpiredToken(t *testing.T) {
33-
// Testing behavior with an expired token
34-
maker := NewPasetoMaker()
35-
require.NotNil(t, maker, "Maker should not be nil")
31+
payload, err := maker.VerifyToken(token)
32+
require.NoError(t, err)
33+
require.NotNil(t, payload)
34+
require.Equal(t, username, payload.Username)
35+
})
3636

37-
token, payload, err := maker.CreateToken("expireduser", -time.Minute)
38-
require.NoError(t, err, "Expired token creation should not error")
39-
require.NotEmpty(t, token, "Expired token should not be empty")
37+
t.Run("VerifyToken with Valid Token and Expiration in 24h", func(t *testing.T) {
38+
username := "testuser"
39+
//duration is expressed as time.Duration of 24h
40+
duration := time.Duration(24) * time.Hour
4041

41-
payload, err = maker.VerifyToken(token)
42-
require.Error(t, err, "Expired token verification should error")
43-
require.EqualError(t, err, ErrExpiredToken.Error(), "Error should be ErrExpiredToken")
44-
require.Nil(t, payload, "Payload should be nil for an expired token")
45-
}
42+
token, _, err := maker.CreateToken(username, duration)
43+
require.NoError(t, err)
4644

47-
func TestPasetoMakerInvalidToken(t *testing.T) {
48-
// Testing behavior with an invalid token
49-
maker := NewPasetoMaker()
50-
require.NotNil(t, maker, "Maker should not be nil")
45+
payload, err := maker.VerifyToken(token)
46+
require.NoError(t, err)
47+
require.NotNil(t, payload)
48+
require.Equal(t, username, payload.Username)
49+
})
50+
51+
t.Run("VerifyToken with Expired Token", func(t *testing.T) {
52+
username := "testuser"
53+
//two minutes ago
54+
expiredDuration := -time.Minute * 2
55+
56+
token, _, err := maker.CreateToken(username, expiredDuration)
57+
58+
payload, err := maker.VerifyToken(token)
59+
require.Error(t, err)
60+
require.Nil(t, payload)
61+
})
62+
63+
t.Run("CreateToken with Zero Duration", func(t *testing.T) {
64+
username := "testuser"
65+
66+
token, payload, err := maker.CreateToken(username, 0)
67+
require.Error(t, err)
68+
require.Empty(t, token)
69+
require.Nil(t, payload)
70+
})
71+
72+
t.Run("CreateToken with Negative Duration", func(t *testing.T) {
73+
username := "testuser"
74+
75+
token, payload, err := maker.CreateToken(username, -time.Minute)
76+
require.Error(t, err)
77+
require.Empty(t, token)
78+
require.Nil(t, payload)
79+
})
80+
81+
t.Run("VerifyToken with Altered Token", func(t *testing.T) {
82+
username := "testuser"
83+
duration := time.Minute
84+
85+
token, _, err := maker.CreateToken(username, duration)
86+
require.NoError(t, err)
5187

52-
payload, err := maker.VerifyToken("invalidtoken")
53-
require.Error(t, err, "Invalid token verification should error")
54-
require.EqualError(t, err, ErrInvalidToken.Error(), "Error should be ErrInvalidToken")
55-
require.Nil(t, payload, "Payload should be nil for an invalid token")
88+
alteredToken := token + "something-extra"
89+
payload, err := maker.VerifyToken(alteredToken)
90+
require.Error(t, err)
91+
require.Nil(t, payload)
92+
})
5693
}

util/errors.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package util
2+
3+
import "errors"
4+
5+
// ErrDurationNotSet is an error for when a duration is not set
6+
func ErrDurationNotSet() error {
7+
return errors.New("duration not set")
8+
}
9+
10+
// ErrDurationNegative is an error for when a duration is negative
11+
func ErrDurationNegative() error {
12+
return errors.New("duration cannot be negative")
13+
}

0 commit comments

Comments
 (0)