From 4eb0aa464147e8c0a6e0dbcc8c98c460b13d4f92 Mon Sep 17 00:00:00 2001 From: mmyj Date: Sun, 27 Sep 2020 12:38:28 +0800 Subject: [PATCH] fix: comment (#8) --- apiaccessor/accessor.go | 12 ++++++++---- apiaccessor/base_accessor.go | 7 +++++-- apiaccessor/query_accessor.go | 10 ++++++---- apiaccessor/query_accessor_test.go | 12 ++++++------ apiaccessor/setter.go | 7 ++++++- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/apiaccessor/accessor.go b/apiaccessor/accessor.go index 640697d..8cd4327 100644 --- a/apiaccessor/accessor.go +++ b/apiaccessor/accessor.go @@ -4,6 +4,7 @@ import ( "errors" ) +// Accessor is the interface use to check the availability of the request's arguments type Accessor interface { CheckSignature() error CheckTimestamp() error @@ -11,10 +12,10 @@ type Accessor interface { } var ( - ErrArgLack = errors.New("arg lack") - ErrSignatureUnmatched = errors.New("signature is unmatched") - ErrTimestampTimeout = errors.New("timestamp time out") - ErrNonceUsed = errors.New("nonce is used") + errArgLack = errors.New("arg lack") + errSignatureUnmatched = errors.New("signature is unmatched") + errTimestampTimeout = errors.New("timestamp time out") + errNonceUsed = errors.New("nonce is used") ) const ( @@ -46,8 +47,11 @@ func (a *args) append(k, v string) { a.l = append(a.l, &arg{k: k, v: v}) } +// EvalSignature evaluating the signature of the request's arguments type EvalSignature func(origin string) (signature string) +// TimestampChecker checking the availability of the request's timestamp argument type TimestampChecker func(timestamp int64) error +// NonceChecker checking the availability of the request's nonce argument type NonceChecker func(nonce string) error diff --git a/apiaccessor/base_accessor.go b/apiaccessor/base_accessor.go index d293475..52523bd 100644 --- a/apiaccessor/base_accessor.go +++ b/apiaccessor/base_accessor.go @@ -30,7 +30,7 @@ func defTimestampChecker(timestamp int64) error { const sec = 5 dt := time.Now().Unix() - timestamp if dt > sec || dt < -sec { - return ErrTimestampTimeout + return errTimestampTimeout } return nil } @@ -49,6 +49,7 @@ func newBaseAccessor() baseAccessor { } } +// CheckSignature implements the Accessor CheckSignature interface func (a *baseAccessor) CheckSignature() error { // ε‚ζ•°ζŽ’εΊ sort.Slice(a.args.l, func(i, j int) bool { @@ -75,11 +76,12 @@ func (a *baseAccessor) CheckSignature() error { signature := a.evalSignatureFunc(argText) argSignature := a.args.kv[signatureTag] if signature != argSignature { - return fmt.Errorf("%w: want %s, get %s", ErrSignatureUnmatched, signature, argSignature) + return fmt.Errorf("%w: want %s, get %s", errSignatureUnmatched, signature, argSignature) } return nil } +// CheckTimestamp implements the Accessor CheckTimestamp interface func (a *baseAccessor) CheckTimestamp() error { timestampStr := a.args.kv[timestampTag] timestamp, err := strconv.ParseInt(timestampStr, 10, 64) @@ -89,6 +91,7 @@ func (a *baseAccessor) CheckTimestamp() error { return a.timestampChecker(timestamp) } +// CheckNonce implements the Accessor CheckNonce interface func (a *baseAccessor) CheckNonce() error { return a.nonceChecker(a.args.kv[nonceTag]) } diff --git a/apiaccessor/query_accessor.go b/apiaccessor/query_accessor.go index 4afc6f6..a10ff0d 100644 --- a/apiaccessor/query_accessor.go +++ b/apiaccessor/query_accessor.go @@ -5,10 +5,12 @@ import ( "net/url" ) +// QueryAccessor use to check the availability of the request's query arguments type QueryAccessor struct { baseAccessor } +// NewQueryAccessor creates a new QueryAccessor. func NewQueryAccessor(query url.Values, secretKey string, setters ...Setter) (*QueryAccessor, error) { qa := &QueryAccessor{ baseAccessor: newBaseAccessor(), @@ -16,19 +18,19 @@ func NewQueryAccessor(query url.Values, secretKey string, setters ...Setter) (*Q for key, vs := range query { v := vs[0] if len(v) == 0 { - return nil, fmt.Errorf("%w: %s", ErrArgLack, key) + return nil, fmt.Errorf("%w: %s", errArgLack, key) } qa.args.append(key, v) } qa.args.append(secretKeyTag, secretKey) if len(qa.args.kv[nonceTag]) == 0 { - return nil, fmt.Errorf("%w: %s", ErrArgLack, nonceTag) + return nil, fmt.Errorf("%w: %s", errArgLack, nonceTag) } if len(qa.args.kv[timestampTag]) == 0 { - return nil, fmt.Errorf("%w: %s", ErrArgLack, timestampTag) + return nil, fmt.Errorf("%w: %s", errArgLack, timestampTag) } if len(qa.args.kv[signatureTag]) == 0 { - return nil, fmt.Errorf("%w: %s", ErrArgLack, signatureTag) + return nil, fmt.Errorf("%w: %s", errArgLack, signatureTag) } for _, setter := range setters { diff --git a/apiaccessor/query_accessor_test.go b/apiaccessor/query_accessor_test.go index b6cb2bd..958f6d1 100644 --- a/apiaccessor/query_accessor_test.go +++ b/apiaccessor/query_accessor_test.go @@ -13,13 +13,13 @@ import ( func TestNewQueryAccessor(t *testing.T) { query := url.Values{} _, err := NewQueryAccessor(query, "123") - assert.Equal(t, errors.Is(err, ErrArgLack), true) + assert.Equal(t, errors.Is(err, errArgLack), true) query = url.Values{ nonceTag: []string{"12345"}, } _, err = NewQueryAccessor(query, "123") - assert.Equal(t, errors.Is(err, ErrArgLack), true) + assert.Equal(t, errors.Is(err, errArgLack), true) query = url.Values{ nonceTag: []string{"12345"}, @@ -52,7 +52,7 @@ func TestCheckSignature(t *testing.T) { qa, err := NewQueryAccessor(query, "123") assert.Equal(t, err, nil) err = qa.CheckSignature() - assert.Equal(t, errors.Is(err, ErrSignatureUnmatched), true) + assert.Equal(t, errors.Is(err, errSignatureUnmatched), true) query = url.Values{ nonceTag: []string{"12345"}, @@ -78,7 +78,7 @@ func TestCheckTimestamp(t *testing.T) { qa, err := NewQueryAccessor(query, "123") assert.Equal(t, err, nil) err = qa.CheckTimestamp() - assert.Equal(t, errors.Is(err, ErrTimestampTimeout), true) + assert.Equal(t, errors.Is(err, errTimestampTimeout), true) query = url.Values{ nonceTag: []string{"12345"}, @@ -97,7 +97,7 @@ func TestCheckNonce(t *testing.T) { nonceMap := make(map[string]bool) mockNonceChecker := func(nonce string) error { if _, ok := nonceMap[nonce]; ok { - return ErrNonceUsed + return errNonceUsed } nonceMap[nonce] = true return nil @@ -115,5 +115,5 @@ func TestCheckNonce(t *testing.T) { err = qa.CheckNonce() assert.Equal(t, err, nil) err = qa.CheckNonce() - assert.Equal(t, errors.Is(err, ErrNonceUsed), true) + assert.Equal(t, errors.Is(err, errNonceUsed), true) } diff --git a/apiaccessor/setter.go b/apiaccessor/setter.go index 759c60e..4516163 100644 --- a/apiaccessor/setter.go +++ b/apiaccessor/setter.go @@ -2,8 +2,10 @@ package apiaccessor import "github.com/go-redis/redis/v7" +// Setter is the option of creating the Accessor type Setter func(b *baseAccessor) error +// WithEvalSignatureFunc set a custom EvalSignature for the Accessor func WithEvalSignatureFunc(e EvalSignature) Setter { return func(b *baseAccessor) error { b.evalSignatureFunc = e @@ -31,8 +33,10 @@ end return no `) +// KeyGen use to generate a redis key which is using in the WithGeneralRedisNonceChecker type KeyGen func(nonce string) (key string) +// WithGeneralRedisNonceChecker set a redis-base NonceChecker for the Accessor func WithGeneralRedisNonceChecker(client redis.Cmdable, sec int64, keyGenFunc KeyGen) Setter { return func(b *baseAccessor) error { b.nonceChecker = func(nonce string) error { @@ -42,7 +46,7 @@ func WithGeneralRedisNonceChecker(client redis.Cmdable, sec int64, keyGenFunc Ke return err } if re == 1 { - return ErrNonceUsed + return errNonceUsed } return nil } @@ -50,6 +54,7 @@ func WithGeneralRedisNonceChecker(client redis.Cmdable, sec int64, keyGenFunc Ke } } +// WithNonceChecker set a custom NonceChecker for the Accessor func WithNonceChecker(nc NonceChecker) Setter { return func(b *baseAccessor) error { b.nonceChecker = nc