From 51bf1b6cd4f1fa2bb2fa0a57d0af6a3e430b5af7 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 4 Mar 2018 01:29:24 +0100 Subject: [PATCH] Significanly improve GC UX with verifcid License: MIT Signed-off-by: Jakub Sztandera --- core/commands/pin.go | 10 ++++++++++ pin/gc/gc.go | 26 +++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/core/commands/pin.go b/core/commands/pin.go index a68b754244c..f85a2e40028 100644 --- a/core/commands/pin.go +++ b/core/commands/pin.go @@ -17,6 +17,7 @@ import ( path "github.com/ipfs/go-ipfs/path" resolver "github.com/ipfs/go-ipfs/path/resolver" pin "github.com/ipfs/go-ipfs/pin" + "github.com/ipfs/go-ipfs/thirdparty/verifcid" uio "github.com/ipfs/go-ipfs/unixfs/io" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" @@ -608,6 +609,15 @@ func pinVerify(ctx context.Context, n *core.IpfsNode, opts pinVerifyOpts) <-chan return status } + if err := verifcid.ValidateCid(root); err != nil { + status := PinStatus{Ok: false} + if opts.explain { + status.BadNodes = []BadNode{BadNode{Cid: key, Err: err.Error()}} + } + visited[key] = status + return status + } + links, err := getLinks(ctx, root) if err != nil { status := PinStatus{Ok: false} diff --git a/pin/gc/gc.go b/pin/gc/gc.go index c665e355e17..6c3f438c690 100644 --- a/pin/gc/gc.go +++ b/pin/gc/gc.go @@ -5,11 +5,13 @@ import ( "context" "errors" "fmt" + "strings" bserv "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" + "github.com/ipfs/go-ipfs/thirdparty/verifcid" dstore "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" @@ -129,12 +131,34 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn // adds them to the given cid.Set, using the provided dag.GetLinks function // to walk the tree. func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error { + verifyGetLinks := func(ctx context.Context, c *cid.Cid) ([]*ipld.Link, error) { + err := verifcid.ValidateCid(c) + if err != nil { + return nil, err + } + + return getLinks(ctx, c) + } + + verboseCidError := func(err error) error { + if strings.Contains(err.Error(), verifcid.ErrBelowMinimumHashLength.Error()) || + strings.Contains(err.Error(), verifcid.ErrPossiblyInsecureHashFunction.Error()) { + err = fmt.Errorf("\"%s\"\nPlease run 'ipfs pin verify'"+ + " to list insecure hashes. If you want to read them,"+ + " please downgrade your go-ipfs to 0.4.13\n", err) + log.Error(err) + } + return err + } + for _, c := range roots { set.Add(c) // EnumerateChildren recursively walks the dag and adds the keys to the given set - err := dag.EnumerateChildren(ctx, getLinks, c, set.Visit) + err := dag.EnumerateChildren(ctx, verifyGetLinks, c, set.Visit) + if err != nil { + err = verboseCidError(err) return err } }