mirror of
https://github.com/ipfs/kubo.git
synced 2026-03-07 01:08:08 +08:00
this is a major refactor of the entire codebase it changes the monolithic peer.Peer into using a peer.ID and a peer.Peerstore. Other changes: - removed handshake3. - testutil vastly simplified peer - secio bugfix + debugging logs - testutil: RandKeyPair - backpressure bugfix: w.o.w. - peer: added hex enc/dec - peer: added a PeerInfo struct PeerInfo is a small struct used to pass around a peer with a set of addresses and keys. This is not meant to be a complete view of the system, but rather to model updates to the peerstore. It is used by things like the routing system. - updated peer/queue + peerset - latency metrics - testutil: use crand for PeerID gen RandPeerID generates random "valid" peer IDs. it does not NEED to generate keys because it is as if we lost the key right away. fine to read some randomness and hash it. to generate proper keys and an ID, use: sk, pk, _ := testutil.RandKeyPair() id, _ := peer.IDFromPublicKey(pk) Also added RandPeerIDFatal helper - removed old spipe - updated seccat - core: cleanup initIdentity - removed old getFromPeerList
107 lines
2.8 KiB
Go
107 lines
2.8 KiB
Go
package commands
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
cmds "github.com/jbenet/go-ipfs/commands"
|
|
core "github.com/jbenet/go-ipfs/core"
|
|
crypto "github.com/jbenet/go-ipfs/crypto"
|
|
nsys "github.com/jbenet/go-ipfs/namesys"
|
|
u "github.com/jbenet/go-ipfs/util"
|
|
)
|
|
|
|
var errNotOnline = errors.New("This command must be run in online mode. Try running 'ipfs daemon' first.")
|
|
|
|
var publishCmd = &cmds.Command{
|
|
Helptext: cmds.HelpText{
|
|
Tagline: "Publish an object to IPNS",
|
|
ShortDescription: `
|
|
IPNS is a PKI namespace, where names are the hashes of public keys, and
|
|
the private key enables publishing new (signed) values. In publish, the
|
|
default value of <name> is your own identity public key.
|
|
`,
|
|
LongDescription: `
|
|
IPNS is a PKI namespace, where names are the hashes of public keys, and
|
|
the private key enables publishing new (signed) values. In publish, the
|
|
default value of <name> is your own identity public key.
|
|
|
|
Examples:
|
|
|
|
Publish a <ref> to your identity name:
|
|
|
|
> ipfs name publish QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
|
|
published name QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n to QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
|
|
|
|
Publish a <ref> to another public key:
|
|
|
|
> ipfs name publish QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
|
|
published name QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n to QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
|
|
`,
|
|
},
|
|
|
|
Arguments: []cmds.Argument{
|
|
cmds.StringArg("name", false, false, "The IPNS name to publish to. Defaults to your node's peerID"),
|
|
cmds.StringArg("ipfs-path", true, false, "IPFS path of the obejct to be published at <name>"),
|
|
},
|
|
Run: func(req cmds.Request) (interface{}, error) {
|
|
log.Debug("Begin Publish")
|
|
n, err := req.Context().GetNode()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
args := req.Arguments()
|
|
|
|
if n.Network == nil {
|
|
return nil, errNotOnline
|
|
}
|
|
|
|
if n.Identity == "" {
|
|
return nil, errors.New("Identity not loaded!")
|
|
}
|
|
|
|
// name := ""
|
|
ref := ""
|
|
|
|
switch len(args) {
|
|
case 2:
|
|
// name = args[0]
|
|
ref = args[1]
|
|
return nil, errors.New("keychains not yet implemented")
|
|
case 1:
|
|
// name = n.Identity.ID.String()
|
|
ref = args[0]
|
|
}
|
|
|
|
// TODO n.Keychain.Get(name).PrivKey
|
|
return publish(n, n.PrivateKey, ref)
|
|
},
|
|
Marshalers: cmds.MarshalerMap{
|
|
cmds.Text: func(res cmds.Response) ([]byte, error) {
|
|
v := res.Output().(*IpnsEntry)
|
|
s := fmt.Sprintf("Published name %s to %s\n", v.Name, v.Value)
|
|
return []byte(s), nil
|
|
},
|
|
},
|
|
Type: &IpnsEntry{},
|
|
}
|
|
|
|
func publish(n *core.IpfsNode, k crypto.PrivKey, ref string) (*IpnsEntry, error) {
|
|
pub := nsys.NewRoutingPublisher(n.Routing)
|
|
err := pub.Publish(k, ref)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
hash, err := k.GetPublic().Hash()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &IpnsEntry{
|
|
Name: u.Key(hash).String(),
|
|
Value: ref,
|
|
}, nil
|
|
}
|