diff options
Diffstat (limited to 'b64file/names.go')
-rw-r--r-- | b64file/names.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/b64file/names.go b/b64file/names.go new file mode 100644 index 0000000..83d73d2 --- /dev/null +++ b/b64file/names.go @@ -0,0 +1,72 @@ +package b64file + +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 PubFile(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 +} |