package main import ( "errors" "os" "path" "path/filepath" "strings" ) var ErrNames = errors.New("please use naming scheme of keyname.pub and keyname.sec") const ( extPub = ".pub" extSec = ".sec" extSig = ".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 ValidateNames(pubFile, secFile string) error { pubName, pubExt := splitNameExt(pubFile) secName, secExt := splitNameExt(secFile) if pubExt != extPub || secExt != extSec || pubName != secName { return ErrNames } return nil } func PubName(secFile string) string { ext := filepath.Ext(secFile) return filepath.Base(secFile[:len(ext)-1] + extPub) } func SigName(msgFile string) string { return msgFile + extSig } func CommentPubFile(comment string) string { if strings.HasPrefix(comment, verifyWith) { file := comment[len(verifyWith):] if strings.HasSuffix(file, extPub) { return FindFile(file) } } return "" } func VerifyWith(secFile string) string { return verifyWith + PubName(secFile) } 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 }