keys/lib/path.go
2026-05-10 15:53:01 +08:00

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
}