mirror of https://github.com/mitchell/selfpass.git
Change update/create to give 2 OTP codes; minor rename
This commit is contained in:
parent
2c50106082
commit
7a0ef6b71d
|
@ -13,7 +13,7 @@ import (
|
||||||
"github.com/mitchell/selfpass/services/credentials/types"
|
"github.com/mitchell/selfpass/services/credentials/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CredentialsClientInit func(ctx context.Context) (c types.CredentialsClient)
|
type credentialsClientInit func(ctx context.Context) (c types.CredentialsClient)
|
||||||
|
|
||||||
var errSourceNotFound = errors.New("source host not found")
|
var errSourceNotFound = errors.New("source host not found")
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
clitypes "github.com/mitchell/selfpass/sp/types"
|
clitypes "github.com/mitchell/selfpass/sp/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func makeCreate(repo clitypes.ConfigRepo, initClient CredentialsClientInit) *cobra.Command {
|
func makeCreate(repo clitypes.ConfigRepo, initClient credentialsClientInit) *cobra.Command {
|
||||||
flags := credentialFlagSet{}.withPasswordFlags()
|
flags := credentialFlagSet{}.withPasswordFlags()
|
||||||
|
|
||||||
createCmd := &cobra.Command{
|
createCmd := &cobra.Command{
|
||||||
|
@ -32,6 +32,7 @@ password.`,
|
||||||
cleancb bool
|
cleancb bool
|
||||||
newpass bool
|
newpass bool
|
||||||
ci types.CredentialInput
|
ci types.CredentialInput
|
||||||
|
prompt survey.Prompt
|
||||||
)
|
)
|
||||||
|
|
||||||
masterpass, cfg, err := repo.OpenConfig()
|
masterpass, cfg, err := repo.OpenConfig()
|
||||||
|
@ -71,7 +72,7 @@ password.`,
|
||||||
key := cfg.GetString(clitypes.KeyPrivateKey)
|
key := cfg.GetString(clitypes.KeyPrivateKey)
|
||||||
keypass := crypto.GeneratePBKDF2Key([]byte(masterpass), []byte(key))
|
keypass := crypto.GeneratePBKDF2Key([]byte(masterpass), []byte(key))
|
||||||
|
|
||||||
prompt := &survey.Confirm{Message: "Do you want a random password?", Default: true}
|
prompt = &survey.Confirm{Message: "Do you want a random password?", Default: true}
|
||||||
check(survey.AskOne(prompt, &newpass, nil))
|
check(survey.AskOne(prompt, &newpass, nil))
|
||||||
|
|
||||||
if newpass {
|
if newpass {
|
||||||
|
@ -108,7 +109,7 @@ password.`,
|
||||||
|
|
||||||
if otp {
|
if otp {
|
||||||
var secret string
|
var secret string
|
||||||
prompt := &survey.Password{Message: "OTP secret:"}
|
prompt = &survey.Password{Message: "OTP secret:"}
|
||||||
check(survey.AskOne(prompt, &secret, nil))
|
check(survey.AskOne(prompt, &secret, nil))
|
||||||
|
|
||||||
ciphersecret, err := crypto.CBCEncrypt(keypass, []byte(secret))
|
ciphersecret, err := crypto.CBCEncrypt(keypass, []byte(secret))
|
||||||
|
@ -117,14 +118,24 @@ password.`,
|
||||||
ci.OTPSecret = base64.StdEncoding.EncodeToString(ciphersecret)
|
ci.OTPSecret = base64.StdEncoding.EncodeToString(ciphersecret)
|
||||||
|
|
||||||
var copyotp bool
|
var copyotp bool
|
||||||
prompt2 := &survey.Confirm{Message: "Copy new OTP to clipboard?", Default: true}
|
prompt = &survey.Confirm{Message: "Copy new OTP to clipboard?", Default: true}
|
||||||
check(survey.AskOne(prompt2, ©otp, nil))
|
check(survey.AskOne(prompt, ©otp, nil))
|
||||||
|
|
||||||
if copyotp {
|
if copyotp {
|
||||||
otp, err := totp.GenerateCode(secret, time.Now())
|
otp, err := totp.GenerateCode(secret, time.Now())
|
||||||
check(err)
|
check(err)
|
||||||
|
|
||||||
check(clipboard.WriteAll(otp))
|
check(clipboard.WriteAll(otp))
|
||||||
|
|
||||||
|
prompt = &survey.Confirm{Message: "Anotha one?", Default: true}
|
||||||
|
check(survey.AskOne(prompt, ©otp, nil))
|
||||||
|
|
||||||
|
if copyotp {
|
||||||
|
otp, err := totp.GenerateCode(secret, time.Now().Add(time.Second*30))
|
||||||
|
check(err)
|
||||||
|
|
||||||
|
check(clipboard.WriteAll(otp))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
"gopkg.in/AlecAivazis/survey.v1"
|
"gopkg.in/AlecAivazis/survey.v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
func makeDelete(initClient CredentialsClientInit) *cobra.Command {
|
func makeDelete(initClient credentialsClientInit) *cobra.Command {
|
||||||
flags := credentialFlagSet{}.withHostFlag()
|
flags := credentialFlagSet{}.withHostFlag()
|
||||||
|
|
||||||
deleteCmd := &cobra.Command{
|
deleteCmd := &cobra.Command{
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
clitypes "github.com/mitchell/selfpass/sp/types"
|
clitypes "github.com/mitchell/selfpass/sp/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func makeGCMToCBC(repo clitypes.ConfigRepo, initClient CredentialsClientInit) *cobra.Command {
|
func makeGCMToCBC(repo clitypes.ConfigRepo, initClient credentialsClientInit) *cobra.Command {
|
||||||
gcmToCBC := &cobra.Command{
|
gcmToCBC := &cobra.Command{
|
||||||
Use: "gcm-to-cbc",
|
Use: "gcm-to-cbc",
|
||||||
Hidden: true,
|
Hidden: true,
|
||||||
|
|
|
@ -15,7 +15,7 @@ import (
|
||||||
clitypes "github.com/mitchell/selfpass/sp/types"
|
clitypes "github.com/mitchell/selfpass/sp/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func makeGet(repo clitypes.ConfigRepo, initClient CredentialsClientInit) *cobra.Command {
|
func makeGet(repo clitypes.ConfigRepo, initClient credentialsClientInit) *cobra.Command {
|
||||||
flags := credentialFlagSet{}.withHostFlag()
|
flags := credentialFlagSet{}.withHostFlag()
|
||||||
|
|
||||||
getCmd := &cobra.Command{
|
getCmd := &cobra.Command{
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
"github.com/mitchell/selfpass/services/credentials/types"
|
"github.com/mitchell/selfpass/services/credentials/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func makeList(initClient CredentialsClientInit) *cobra.Command {
|
func makeList(initClient credentialsClientInit) *cobra.Command {
|
||||||
flags := credentialFlagSet{}.withHostFlag()
|
flags := credentialFlagSet{}.withHostFlag()
|
||||||
|
|
||||||
listCmd := &cobra.Command{
|
listCmd := &cobra.Command{
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/mitchell/selfpass/sp/types"
|
"github.com/mitchell/selfpass/sp/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Execute is the main entrypoint for the `sp` CLI tool.
|
||||||
func Execute() {
|
func Execute() {
|
||||||
rootCmd := &cobra.Command{
|
rootCmd := &cobra.Command{
|
||||||
Use: "sp",
|
Use: "sp",
|
||||||
|
@ -41,7 +42,7 @@ can interact with the entire Selfpass API.`,
|
||||||
check(rootCmd.Execute())
|
check(rootCmd.Execute())
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeInitClient(repo types.ConfigRepo, initClient credtypes.CredentialsClientInit) CredentialsClientInit {
|
func makeInitClient(repo types.ConfigRepo, initClient credtypes.CredentialsClientInit) credentialsClientInit {
|
||||||
return func(ctx context.Context) credtypes.CredentialsClient {
|
return func(ctx context.Context) credtypes.CredentialsClient {
|
||||||
_, cfg, err := repo.OpenConfig()
|
_, cfg, err := repo.OpenConfig()
|
||||||
check(err)
|
check(err)
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
clitypes "github.com/mitchell/selfpass/sp/types"
|
clitypes "github.com/mitchell/selfpass/sp/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func makeUpdate(repo clitypes.ConfigRepo, initClient CredentialsClientInit) *cobra.Command {
|
func makeUpdate(repo clitypes.ConfigRepo, initClient credentialsClientInit) *cobra.Command {
|
||||||
flags := credentialFlagSet{}.withHostFlag().withPasswordFlags()
|
flags := credentialFlagSet{}.withHostFlag().withPasswordFlags()
|
||||||
|
|
||||||
updateCmd := &cobra.Command{
|
updateCmd := &cobra.Command{
|
||||||
|
@ -143,7 +143,7 @@ password.`,
|
||||||
|
|
||||||
if otp {
|
if otp {
|
||||||
var secret string
|
var secret string
|
||||||
prompt := &survey.Password{Message: "OTP secret:"}
|
prompt = &survey.Password{Message: "OTP secret:"}
|
||||||
check(survey.AskOne(prompt, &secret, nil))
|
check(survey.AskOne(prompt, &secret, nil))
|
||||||
|
|
||||||
ciphersecret, err := crypto.CBCEncrypt(keypass, []byte(secret))
|
ciphersecret, err := crypto.CBCEncrypt(keypass, []byte(secret))
|
||||||
|
@ -152,14 +152,24 @@ password.`,
|
||||||
ci.OTPSecret = base64.StdEncoding.EncodeToString(ciphersecret)
|
ci.OTPSecret = base64.StdEncoding.EncodeToString(ciphersecret)
|
||||||
|
|
||||||
var copyotp bool
|
var copyotp bool
|
||||||
prompt2 := &survey.Confirm{Message: "Copy new OTP to clipboard?", Default: true}
|
prompt = &survey.Confirm{Message: "Copy new OTP to clipboard?", Default: true}
|
||||||
check(survey.AskOne(prompt2, ©otp, nil))
|
check(survey.AskOne(prompt, ©otp, nil))
|
||||||
|
|
||||||
if copyotp {
|
if copyotp {
|
||||||
otp, err := totp.GenerateCode(secret, time.Now())
|
otp, err := totp.GenerateCode(secret, time.Now())
|
||||||
check(err)
|
check(err)
|
||||||
|
|
||||||
check(clipboard.WriteAll(otp))
|
check(clipboard.WriteAll(otp))
|
||||||
|
|
||||||
|
prompt = &survey.Confirm{Message: "Anotha one?", Default: true}
|
||||||
|
check(survey.AskOne(prompt, ©otp, nil))
|
||||||
|
|
||||||
|
if copyotp {
|
||||||
|
otp, err := totp.GenerateCode(secret, time.Now().Add(time.Second*30))
|
||||||
|
check(err)
|
||||||
|
|
||||||
|
check(clipboard.WriteAll(otp))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ go 1.12
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/atotto/clipboard v0.1.2
|
github.com/atotto/clipboard v0.1.2
|
||||||
github.com/davecgh/go-spew v1.1.1
|
|
||||||
github.com/google/uuid v1.1.1
|
github.com/google/uuid v1.1.1
|
||||||
github.com/mitchell/selfpass/services v0.0.0-00010101000000-000000000000
|
github.com/mitchell/selfpass/services v0.0.0-00010101000000-000000000000
|
||||||
github.com/mitchellh/go-homedir v1.1.0
|
github.com/mitchellh/go-homedir v1.1.0
|
||||||
|
|
|
@ -48,7 +48,6 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m
|
||||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
||||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
||||||
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
|
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
|
||||||
github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
|
Loading…
Reference in New Issue