From dbe00740f15054055d23421889040dbabab4f31c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 8 Jan 2018 14:22:53 +0100 Subject: [PATCH] commands/block: use CIDv1 with custom mhtype MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Ɓukasz Magiera --- core/commands/block.go | 29 ++++++++++++++++++----------- test/sharness/t0050-block.sh | 12 ++++++++++++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/core/commands/block.go b/core/commands/block.go index 01fe61bda97..acc2926fe3d 100644 --- a/core/commands/block.go +++ b/core/commands/block.go @@ -9,12 +9,14 @@ import ( util "github.com/ipfs/go-ipfs/blocks/blockstore/util" e "github.com/ipfs/go-ipfs/core/commands/e" - "gx/ipfs/QmP9vZfc5WSjfGTXmwX2EcicMFzmZ6fXn7HTdKYat6ccmH/go-ipfs-cmds" - "gx/ipfs/QmQp2a2Hhb7F6eK2A5hN8f9aJy4mtkEikL9Zj4cgB7d1dD/go-ipfs-cmdkit" + cmds "gx/ipfs/QmP9vZfc5WSjfGTXmwX2EcicMFzmZ6fXn7HTdKYat6ccmH/go-ipfs-cmds" + cmdkit "gx/ipfs/QmQp2a2Hhb7F6eK2A5hN8f9aJy4mtkEikL9Zj4cgB7d1dD/go-ipfs-cmdkit" mh "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + + "github.com/pkg/errors" ) type BlockStat struct { @@ -156,27 +158,32 @@ It reads from stdin, and is a base58 encoded multihash. return } + mhtype, _, _ := req.Option("mhtype").String() + mhtval, ok := mh.Names[mhtype] + if !ok { + err := fmt.Errorf("unrecognized multihash function: %s", mhtype) + res.SetError(err, cmdkit.ErrNormal) + return + } + var pref cid.Prefix pref.Version = 1 - format, _, _ := req.Option("format").String() + format, userFormat, _ := req.Option("format").String() formatval, ok := cid.Codecs[format] if !ok { res.SetError(fmt.Errorf("unrecognized format: %s", format), cmdkit.ErrNormal) return } - if format == "v0" { + if format == "v0" && (mhtval == mh.SHA2_256 || userFormat) { pref.Version = 0 } - pref.Codec = formatval - - mhtype, _, _ := req.Option("mhtype").String() - mhtval, ok := mh.Names[mhtype] - if !ok { - err := fmt.Errorf("unrecognized multihash function: %s", mhtype) - res.SetError(err, cmdkit.ErrNormal) + if mhtval != mh.SHA2_256 && pref.Version == 0 { + res.SetError(errors.New("cannot generate CIDv0 with non-sha256 hash function"), cmdkit.ErrNormal) return } + + pref.Codec = formatval pref.MhType = mhtval mhlen, _, err := req.Option("mhlen").Int() diff --git a/test/sharness/t0050-block.sh b/test/sharness/t0050-block.sh index 285d8ad94b5..0cdd2498ba4 100755 --- a/test/sharness/t0050-block.sh +++ b/test/sharness/t0050-block.sh @@ -209,4 +209,16 @@ test_expect_success "no panic in output" ' test_expect_code 1 grep "panic" stat_out ' +test_expect_success "can set multihash type and length on block put without format" ' + HASH=$(echo "foooo" | ipfs block put --mhtype=sha3 --mhlen=16) +' + +test_expect_success "output looks good" ' + test "z2APJNN6rqZTWPpv7gYFHzh7ZEDX" = "$HASH" +' + +test_expect_success "put with sha3 and cidv0 fails" ' + echo "foooo" | test_must_fail ipfs block put --mhtype=sha3 --mhlen=16 --format=v0 +' + test_done