commit 044c876f04397f990010bbb553da6ad10892cd60
parent 3cd372a22ae19a919844ecab7ddfb3a39b27f336
Author: Sean Enck <sean@ttypty.com>
Date: Sun, 2 Oct 2022 15:50:41 -0400
updating to use opts from totp code
Diffstat:
5 files changed, 29 insertions(+), 7 deletions(-)
diff --git a/go.mod b/go.mod
@@ -4,7 +4,7 @@ go 1.18
require (
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
- github.com/pquerna/otp v1.3.0
+ github.com/pquerna/otp v1.3.1-0.20220803165443-c62dc589378a
github.com/tobischo/gokeepasslib/v3 v3.4.1
)
diff --git a/go.sum b/go.sum
@@ -13,6 +13,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pquerna/otp v1.3.0 h1:oJV/SkzR33anKXwQU3Of42rL4wbrffP4uvUf1SvS5Xs=
github.com/pquerna/otp v1.3.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
+github.com/pquerna/otp v1.3.1-0.20220803165443-c62dc589378a h1:aHBuXBWfSYHaZedMVtNBBX6bVfZtM+A89daAtZixiIg=
+github.com/pquerna/otp v1.3.1-0.20220803165443-c62dc589378a/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
diff --git a/internal/backend/actions.go b/internal/backend/actions.go
@@ -188,12 +188,13 @@ func (t *Transaction) Move(src QueryEntity, dst string) error {
if multi {
field = notesKey
}
+ v := src.Value
if NewSuffix(dTitle) == NewSuffix(inputs.TOTPToken()) {
- url := inputs.FormatTOTP(src.Value)
- e.Values = append(e.Values, protectedValue("otp", url))
+ v = inputs.FormatTOTP(v)
+ e.Values = append(e.Values, protectedValue("otp", v))
}
- e.Values = append(e.Values, protectedValue(field, src.Value))
+ e.Values = append(e.Values, protectedValue(field, v))
c.insertEntity(dOffset, dTitle, e)
return nil
})
diff --git a/internal/totp/core.go b/internal/totp/core.go
@@ -14,6 +14,7 @@ import (
"github.com/enckse/lockbox/internal/colors"
"github.com/enckse/lockbox/internal/inputs"
"github.com/enckse/lockbox/internal/platform"
+ coreotp "github.com/pquerna/otp"
otp "github.com/pquerna/otp/totp"
)
@@ -28,6 +29,10 @@ type (
Short bool
List bool
}
+ totpWrapper struct {
+ opts otp.ValidateOpts
+ code string
+ }
)
func clear() {
@@ -75,6 +80,10 @@ func colorWhenRules() ([]colorWhen, error) {
return rules, nil
}
+func (w totpWrapper) generateCode() (string, error) {
+ return otp.GenerateCodeCustom(w.code, time.Now(), w.opts)
+}
+
func display(token string, args arguments) error {
interactive, err := inputs.IsInteractive()
if err != nil {
@@ -102,8 +111,18 @@ func display(token string, args arguments) error {
return errors.New("object does not exist")
}
totpToken := string(entity.Value)
+ k, err := coreotp.NewKeyFromURL(totpToken)
+ if err != nil {
+ return err
+ }
+ wrapper := totpWrapper{}
+ wrapper.code = k.Secret()
+ wrapper.opts = otp.ValidateOpts{}
+ wrapper.opts.Digits = k.Digits()
+ wrapper.opts.Algorithm = k.Algorithm()
+ wrapper.opts.Period = uint(k.Period())
if !interactive {
- code, err := otp.GenerateCode(totpToken, time.Now())
+ code, err := wrapper.generateCode()
if err != nil {
return err
}
@@ -146,7 +165,7 @@ func display(token string, args arguments) error {
}
lastSecond = last
left := 60 - last
- code, err := otp.GenerateCode(totpToken, now)
+ code, err := wrapper.generateCode()
if err != nil {
return err
}
diff --git a/tests/expected.log b/tests/expected.log
@@ -27,7 +27,7 @@ hash:6d201beeefb589b08ef0672dac82353d0cbd9ad99e1642c83a1601f3d647bcca003257b5e8f
keys2/k/three:
hash:132ab0244293c495a027cec12d0050598616daca888449920fc652719be0987830827d069ef78cc613e348de37c9b592d3406e2fb8d99a6961bf0c58da8a334f
test/k/totp:
-hash:7ef183065ba70aaa417b87ea0a96b7e550a938a52440c640a07537f7794d8a89e50078eca6a7cbcfacabd97a2db06d11e82ddf7556ca909c4df9fc0d006013b1
+hash:9f12449917d856a2f97d5f1b280ef864c1a6c03a7763d9a565553aeb4ebeca6ab3807e5b8e8c457333c6fe1dd5085d8d526ad150d31f42da9e875a45bf3eec00
delete entry? (y/N)
delete entry? (y/N)
delete entry? (y/N) unable to remove entry (entity is empty/invalid)