105 lines
2.1 KiB
Go
105 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
`fmt`
|
|
`log`
|
|
`os`
|
|
`os/signal`
|
|
`sort`
|
|
`strings`
|
|
`time`
|
|
|
|
`github.com/chelnak/ysmrr`
|
|
`github.com/chelnak/ysmrr/pkg/animations`
|
|
`r00t2.io/vault_totp/common`
|
|
`r00t2.io/vault_totp/internal`
|
|
)
|
|
|
|
func main() {
|
|
|
|
var err error
|
|
var idx int
|
|
var rpt int
|
|
var doExit bool
|
|
var keyNm string
|
|
var keyNms []string
|
|
var ticker *time.Ticker
|
|
var keys map[string]struct{} = make(map[string]struct{})
|
|
|
|
log.SetOutput(os.Stdout)
|
|
|
|
ctx, cancelFunc = signal.NotifyContext(ctx, common.ProgEndSigs...)
|
|
|
|
if doExit, err = internal.PrepParser("gen", args.CommonArgs, parser); err != nil {
|
|
log.Panicln(err)
|
|
}
|
|
if doExit {
|
|
return
|
|
}
|
|
logger = internal.Logger
|
|
|
|
if err = internal.Validate(args); err != nil {
|
|
log.Panicln(err)
|
|
}
|
|
|
|
if vc, err = internal.GetVaultClient(&args.VaultArgs); err != nil {
|
|
log.Panicln(err)
|
|
}
|
|
|
|
if args.GenArgs.KeyNm == "" {
|
|
if keys, err = internal.ListTotpKeys(ctx, vc, args.GenArgs.VaultTotpMnt); err != nil {
|
|
log.Panicln(err)
|
|
}
|
|
keyNms = make([]string, 0, len(keys))
|
|
for keyNm, _ = range args.GenArgs.KeyNm {
|
|
keyNms[idx] = keyNm
|
|
idx++
|
|
}
|
|
sort.Strings(keyNms)
|
|
fmt.Printf(
|
|
"No key name provided.\n"+
|
|
"Existing key names at mount '%s' are:\n\n"+
|
|
"\t%s\n",
|
|
args.GenArgs.VaultTotpMnt,
|
|
strings.Join(keyNms, "\n\t"),
|
|
)
|
|
os.Exit(0)
|
|
}
|
|
|
|
if kinfo, err = internal.GetTotpKeys(ctx, vc, args.GenArgs.VaultTotpMnt); err != nil {
|
|
log.Panicln(err)
|
|
}
|
|
if kinfo == nil || len(kinfo) == 0 {
|
|
log.Panicln("no TOTP configuration found")
|
|
}
|
|
|
|
if !args.GenArgs.NoCtr {
|
|
if len(args.GenArgs.Plain) > 3 {
|
|
args.GenArgs.Plain = args.GenArgs.Plain[:3]
|
|
}
|
|
charSet = spinnerChars[len(args.GenArgs.Plain)]
|
|
}
|
|
|
|
if args.GenArgs.Repeat < 0 {
|
|
// ticker = time.NewTicker(cfg.period + (time.Millisecond * time.Duration(500)))
|
|
ticker = time.NewTicker(cfg.period)
|
|
breakLoop:
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
break breakLoop
|
|
case <-ticker.C:
|
|
// GET CODE
|
|
}
|
|
}
|
|
} else {
|
|
for rpt = args.GenArgs.Repeat; rpt >= 0; rpt-- {
|
|
fmt.Fprintf(os.Stderr, "(Issuance round #%d/%d)\n", args.GenArgs.Repeat-rpt, rpt)
|
|
// GET CODE
|
|
}
|
|
}
|
|
|
|
// Force close any remaining timing loops, etc.
|
|
cancelFunc()
|
|
}
|