experimental/links.go (67 lines of code) (raw):
package experimental
import (
"crypto/md5"
"encoding/hex"
"fmt"
)
func analyzeLink(args []string) (digest, error) {
if len(args) != 3 {
return digest{}, fmt.Errorf("invalid args for link: %v", args)
}
if args[2] != "link" {
return digest{}, fmt.Errorf("expected link as path component: %v", args[2])
}
return newDigestFromPath(args[0:2])
}
func analyzeLinkSignature(args []string) (digest, digest, error) {
// sha256/8d0c94a38dfa0db8827089a036d47482aa30550510d62f8fb2021548f49b1c84/signatures/sha256/6b659c9f4d1ff9c422f7bc517a0e896bc7fadb99a00e5db4c9921ddf8b5d402c/link
if len(args) != 6 {
return digest{}, digest{}, fmt.Errorf("invalid args for signature link: %v", args)
}
if args[5] != "link" {
return digest{}, digest{}, fmt.Errorf("expected link as path component: %v", args[2])
}
if args[2] != "signatures" {
return digest{}, digest{}, fmt.Errorf("expected signatures as path component: %v", args[2])
}
link, err := newDigestFromPath(args[0:2])
if err != nil {
return digest{}, digest{}, err
}
signature, err := newDigestFromPath(args[3:5])
if err != nil {
return digest{}, digest{}, err
}
return link, signature, err
}
func compareEtag(data []byte, etag string) bool {
hash := md5.Sum(data)
hex := hex.EncodeToString(hash[:])
hex = "\"" + hex + "\""
return etag == hex
}
func readLink(path string, etag string) (digest, error) {
data, err := currentStorage.Read(path, etag)
if err != nil {
return digest{}, err
}
d, err := newDigestFromReference(data)
if err != nil {
return digest{}, err
}
return d, nil
}
func verifyLink(link digest, path string, etag string) error {
// If we have e-tag, let's verify e-tag
if etag != "" {
if link.etag() == etag {
return nil
}
}
readed, err := readLink(path, etag)
if err != nil {
return err
}
if readed != link {
return fmt.Errorf("%s: readed link for %s is not equal %s", path, link, readed)
}
return nil
}