83 lines
1.9 KiB
Go
83 lines
1.9 KiB
Go
|
|
package lib
|
||
|
|
|
||
|
|
import (
|
||
|
|
"os"
|
||
|
|
"path/filepath"
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
"apigo.cc/go/file"
|
||
|
|
)
|
||
|
|
|
||
|
|
// GetKeysRootPath returns the root path for all keys and passwords.
|
||
|
|
// Resolution order:
|
||
|
|
// 1. KEYSPATH environment variable
|
||
|
|
// 2. Path stored in ~/.keyspath
|
||
|
|
// 3. Default: ~/.keys
|
||
|
|
func GetKeysRootPath() string {
|
||
|
|
if p := os.Getenv("KEYSPATH"); p != "" {
|
||
|
|
return p
|
||
|
|
}
|
||
|
|
|
||
|
|
homeDir, err := os.UserHomeDir()
|
||
|
|
if err != nil {
|
||
|
|
homeDir = "."
|
||
|
|
}
|
||
|
|
|
||
|
|
keyspathFile := filepath.Join(homeDir, ".keyspath")
|
||
|
|
if file.Exists(keyspathFile) {
|
||
|
|
content, err := file.ReadBytes(keyspathFile)
|
||
|
|
if err == nil {
|
||
|
|
p := strings.TrimSpace(string(content))
|
||
|
|
if p != "" {
|
||
|
|
return p
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return filepath.Join(homeDir, ".keys")
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetKeystorePath returns the path for the keystore directory.
|
||
|
|
func GetKeystorePath() string {
|
||
|
|
return filepath.Join(GetKeysRootPath(), "keystore")
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetPasswordBasePath returns the base path for passwords.
|
||
|
|
func GetPasswordBasePath() string {
|
||
|
|
return filepath.Join(GetKeysRootPath(), "passwords")
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetPasswordPath returns the path for passwords associated with a specific key.
|
||
|
|
func GetPasswordPath(keyName string) string {
|
||
|
|
return filepath.Join(GetPasswordBasePath(), keyName)
|
||
|
|
}
|
||
|
|
|
||
|
|
// EnsureDir ensures the specified directory exists.
|
||
|
|
func EnsureDir(path string) error {
|
||
|
|
return os.MkdirAll(path, 0700)
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetStatus returns the root path, number of keystores, and total number of passwords.
|
||
|
|
func GetStatus() (rootPath string, keystoreCount int, passwordCount int) {
|
||
|
|
rootPath = GetKeysRootPath()
|
||
|
|
|
||
|
|
ksPath := GetKeystorePath()
|
||
|
|
if entries, err := os.ReadDir(ksPath); err == nil {
|
||
|
|
for _, e := range entries {
|
||
|
|
if !e.IsDir() && !strings.HasPrefix(e.Name(), ".") {
|
||
|
|
keystoreCount++
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
pwPath := GetPasswordBasePath()
|
||
|
|
_ = filepath.Walk(pwPath, func(path string, info os.FileInfo, err error) error {
|
||
|
|
if err == nil && !info.IsDir() {
|
||
|
|
passwordCount++
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
})
|
||
|
|
|
||
|
|
return
|
||
|
|
}
|