lockbox

password manager
Log | Files | Refs | README | LICENSE

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:
Mgo.mod | 2+-
Mgo.sum | 2++
Minternal/backend/actions.go | 7++++---
Minternal/totp/core.go | 23+++++++++++++++++++++--
Mtests/expected.log | 2+-
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)