forked from sneak/secret
When os.UserConfigDir() fails, DetermineStateDir falls back to os.UserHomeDir(). Previously the error from UserHomeDir was discarded, which could result in a dangerous root-relative path (/.config/...) if both calls fail. Now DetermineStateDir returns (string, error) and propagates failures from both UserConfigDir and UserHomeDir. Closes #14
73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
// Package cli implements the command-line interface for the secret application.
|
|
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.eeqj.de/sneak/secret/internal/secret"
|
|
"github.com/spf13/afero"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
// Instance encapsulates all CLI functionality and state
|
|
type Instance struct {
|
|
fs afero.Fs
|
|
stateDir string
|
|
cmd *cobra.Command
|
|
}
|
|
|
|
// NewCLIInstance creates a new CLI instance with the real filesystem
|
|
func NewCLIInstance() *Instance {
|
|
fs := afero.NewOsFs()
|
|
stateDir, err := secret.DetermineStateDir("")
|
|
if err != nil {
|
|
panic(fmt.Sprintf("cannot determine state directory: %v", err))
|
|
}
|
|
|
|
return &Instance{
|
|
fs: fs,
|
|
stateDir: stateDir,
|
|
}
|
|
}
|
|
|
|
// NewCLIInstanceWithFs creates a new CLI instance with the given filesystem (for testing)
|
|
func NewCLIInstanceWithFs(fs afero.Fs) *Instance {
|
|
stateDir, err := secret.DetermineStateDir("")
|
|
if err != nil {
|
|
panic(fmt.Sprintf("cannot determine state directory: %v", err))
|
|
}
|
|
|
|
return &Instance{
|
|
fs: fs,
|
|
stateDir: stateDir,
|
|
}
|
|
}
|
|
|
|
// NewCLIInstanceWithStateDir creates a new CLI instance with custom state directory (for testing)
|
|
func NewCLIInstanceWithStateDir(fs afero.Fs, stateDir string) *Instance {
|
|
return &Instance{
|
|
fs: fs,
|
|
stateDir: stateDir,
|
|
}
|
|
}
|
|
|
|
// SetFilesystem sets the filesystem for this CLI instance (for testing)
|
|
func (cli *Instance) SetFilesystem(fs afero.Fs) {
|
|
cli.fs = fs
|
|
}
|
|
|
|
// SetStateDir sets the state directory for this CLI instance (for testing)
|
|
func (cli *Instance) SetStateDir(stateDir string) {
|
|
cli.stateDir = stateDir
|
|
}
|
|
|
|
// GetStateDir returns the state directory for this CLI instance
|
|
func (cli *Instance) GetStateDir() string {
|
|
return cli.stateDir
|
|
}
|
|
|
|
// Print outputs to the command's configured output writer
|
|
func (cli *Instance) Print(a ...interface{}) (n int, err error) {
|
|
return fmt.Fprint(cli.cmd.OutOrStdout(), a...)
|
|
}
|