package file import ( "errors" "os" "path" "path/filepath" "strings" ) var ErrNames = errors.New("please use naming scheme of keyname.pub and keyname.sec") const ( PubExt = ".pub" EncExt = ".sec" SigExt = ".sig" verifyWith = "verify with " ) func splitNameExt(fname string) (string, string) { _, file := path.Split(fname) ext := filepath.Ext(file) return file[:len(file)-len(ext)], ext } func CheckNames(pubFile, encFile string) error { pubName, pubExt := splitNameExt(pubFile) encName, encExt := splitNameExt(encFile) if pubExt != PubExt || encExt != EncExt || pubName != encName { return ErrNames } return nil } func PubName(encFile string) string { ext := filepath.Ext(encFile) return filepath.Base(encFile[:len(ext)-1] + PubExt) } func SigName(msgFile string) string { return msgFile + SigExt } func PubFile(comment string) (string, bool) { if strings.HasPrefix(comment, verifyWith) { file := comment[len(verifyWith):] if strings.HasSuffix(file, PubExt) { return FindFile(file), true } } return "", false } func VerifyWith(encFile string) string { return verifyWith + PubName(encFile) } var safePath = []string{ "/etc/signify", "$HOME/.signify", } // FindFile locates keys in safe path. Falls back to current dir. func FindFile(fname string) string { for _, v := range safePath { p := path.Join(os.Expand(v, os.Getenv), fname) if _, err := os.Stat(p); err == nil { return p } } return fname }