mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-01 10:49:24 +08:00
refactor(name, pub, resolve) separate files
This commit is contained in:

committed by
Juan Batiz-Benet

parent
092e346f94
commit
63feb68ce7
@ -1,27 +1,12 @@
|
|||||||
package commands
|
package commands
|
||||||
|
|
||||||
import (
|
import cmds "github.com/jbenet/go-ipfs/commands"
|
||||||
"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"
|
|
||||||
)
|
|
||||||
|
|
||||||
type IpnsEntry struct {
|
type IpnsEntry struct {
|
||||||
Name string
|
Name string
|
||||||
Value string
|
Value string
|
||||||
}
|
}
|
||||||
|
|
||||||
type ResolveOutput struct {
|
|
||||||
Entries []IpnsEntry
|
|
||||||
}
|
|
||||||
|
|
||||||
var errNotOnline = errors.New("This command must be run in online mode. Try running 'ipfs daemon' first.")
|
|
||||||
|
|
||||||
var nameCmd = &cmds.Command{
|
var nameCmd = &cmds.Command{
|
||||||
// TODO UsageLine: "name [publish | resolve]",
|
// TODO UsageLine: "name [publish | resolve]",
|
||||||
// TODO Short: "ipfs namespace (ipns) tool",
|
// TODO Short: "ipfs namespace (ipns) tool",
|
||||||
@ -63,175 +48,3 @@ Resolve te value of another name:
|
|||||||
"resolve": resolveCmd,
|
"resolve": resolveCmd,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var publishCmd = &cmds.Command{
|
|
||||||
// TODO UsageLine: "publish",
|
|
||||||
// TODO Short: "publish a <ref> to ipns.",
|
|
||||||
Help: `ipfs publish [<name>] <ref> - publish a <ref> to ipns.
|
|
||||||
|
|
||||||
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.Argument{"name", cmds.ArgString, false, false},
|
|
||||||
cmds.Argument{"object", cmds.ArgString, true, false},
|
|
||||||
},
|
|
||||||
Run: func(res cmds.Response, req cmds.Request) {
|
|
||||||
n := req.Context().Node
|
|
||||||
args := req.Arguments()
|
|
||||||
|
|
||||||
if n.Network == nil {
|
|
||||||
res.SetError(errNotOnline, cmds.ErrNormal)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if n.Identity == nil {
|
|
||||||
res.SetError(errors.New("Identity not loaded!"), cmds.ErrNormal)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// name := ""
|
|
||||||
ref := ""
|
|
||||||
|
|
||||||
switch len(args) {
|
|
||||||
case 2:
|
|
||||||
// name = args[0]
|
|
||||||
ref = args[1].(string)
|
|
||||||
res.SetError(errors.New("keychains not yet implemented"), cmds.ErrNormal)
|
|
||||||
return
|
|
||||||
case 1:
|
|
||||||
// name = n.Identity.ID.String()
|
|
||||||
ref = args[0].(string)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO n.Keychain.Get(name).PrivKey
|
|
||||||
k := n.Identity.PrivKey()
|
|
||||||
publishOutput, err := publish(n, k, ref)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
res.SetError(err, cmds.ErrNormal)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
res.SetOutput(publishOutput)
|
|
||||||
},
|
|
||||||
Marshallers: map[cmds.EncodingType]cmds.Marshaller{
|
|
||||||
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{},
|
|
||||||
}
|
|
||||||
|
|
||||||
var resolveCmd = &cmds.Command{
|
|
||||||
// TODO UsageLine: "resolve",
|
|
||||||
// TODO Short: "resolve an ipns name to a <ref>",
|
|
||||||
Help: `ipfs resolve [<name>] - Resolve an ipns name to a <ref>.
|
|
||||||
|
|
||||||
IPNS is a PKI namespace, where names are the hashes of public keys, and
|
|
||||||
the private key enables publishing new (signed) values. In resolve, the
|
|
||||||
default value of <name> is your own identity public key.
|
|
||||||
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
Resolve the value of your identity:
|
|
||||||
|
|
||||||
> ipfs name resolve
|
|
||||||
QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
|
|
||||||
|
|
||||||
Resolve te value of another name:
|
|
||||||
|
|
||||||
> ipfs name resolve QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n
|
|
||||||
QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
|
|
||||||
|
|
||||||
`,
|
|
||||||
|
|
||||||
Arguments: []cmds.Argument{
|
|
||||||
cmds.Argument{"name", cmds.ArgString, false, true},
|
|
||||||
},
|
|
||||||
Run: func(res cmds.Response, req cmds.Request) {
|
|
||||||
|
|
||||||
n := req.Context().Node
|
|
||||||
var names []string
|
|
||||||
|
|
||||||
if n.Network == nil {
|
|
||||||
res.SetError(errNotOnline, cmds.ErrNormal)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(req.Arguments()) == 0 {
|
|
||||||
if n.Identity == nil {
|
|
||||||
res.SetError(errors.New("Identity not loaded!"), cmds.ErrNormal)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
names = append(names, n.Identity.ID().String())
|
|
||||||
} else {
|
|
||||||
for _, arg := range req.Arguments() {
|
|
||||||
name, ok := arg.(string)
|
|
||||||
if !ok {
|
|
||||||
res.SetError(errors.New("cast error"), cmds.ErrNormal)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
names = append(names, name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
entries, err := resolve(n, names)
|
|
||||||
if err != nil {
|
|
||||||
res.SetError(err, cmds.ErrNormal)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
res.SetOutput(&ResolveOutput{entries})
|
|
||||||
},
|
|
||||||
Type: &ResolveOutput{},
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
func resolve(n *core.IpfsNode, names []string) ([]IpnsEntry, error) {
|
|
||||||
var entries []IpnsEntry
|
|
||||||
for _, name := range names {
|
|
||||||
resolved, err := n.Namesys.Resolve(name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
entries = append(entries, IpnsEntry{
|
|
||||||
Name: name,
|
|
||||||
Value: resolved,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return entries, nil
|
|
||||||
}
|
|
||||||
|
106
core/commands2/publish.go
Normal file
106
core/commands2/publish.go
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
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{
|
||||||
|
// TODO UsageLine: "publish",
|
||||||
|
// TODO Short: "publish a <ref> to ipns.",
|
||||||
|
Help: `ipfs publish [<name>] <ref> - publish a <ref> to ipns.
|
||||||
|
|
||||||
|
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.Argument{"name", cmds.ArgString, false, false},
|
||||||
|
cmds.Argument{"object", cmds.ArgString, true, false},
|
||||||
|
},
|
||||||
|
Run: func(res cmds.Response, req cmds.Request) {
|
||||||
|
n := req.Context().Node
|
||||||
|
args := req.Arguments()
|
||||||
|
|
||||||
|
if n.Network == nil {
|
||||||
|
res.SetError(errNotOnline, cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if n.Identity == nil {
|
||||||
|
res.SetError(errors.New("Identity not loaded!"), cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// name := ""
|
||||||
|
ref := ""
|
||||||
|
|
||||||
|
switch len(args) {
|
||||||
|
case 2:
|
||||||
|
// name = args[0]
|
||||||
|
ref = args[1].(string)
|
||||||
|
res.SetError(errors.New("keychains not yet implemented"), cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
case 1:
|
||||||
|
// name = n.Identity.ID.String()
|
||||||
|
ref = args[0].(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO n.Keychain.Get(name).PrivKey
|
||||||
|
k := n.Identity.PrivKey()
|
||||||
|
publishOutput, err := publish(n, k, ref)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
res.SetError(err, cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res.SetOutput(publishOutput)
|
||||||
|
},
|
||||||
|
Marshallers: map[cmds.EncodingType]cmds.Marshaller{
|
||||||
|
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
|
||||||
|
}
|
92
core/commands2/resolve.go
Normal file
92
core/commands2/resolve.go
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
package commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
cmds "github.com/jbenet/go-ipfs/commands"
|
||||||
|
core "github.com/jbenet/go-ipfs/core"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ResolveOutput struct {
|
||||||
|
Entries []IpnsEntry
|
||||||
|
}
|
||||||
|
|
||||||
|
var resolveCmd = &cmds.Command{
|
||||||
|
// TODO UsageLine: "resolve",
|
||||||
|
// TODO Short: "resolve an ipns name to a <ref>",
|
||||||
|
Help: `ipfs resolve [<name>] - Resolve an ipns name to a <ref>.
|
||||||
|
|
||||||
|
IPNS is a PKI namespace, where names are the hashes of public keys, and
|
||||||
|
the private key enables publishing new (signed) values. In resolve, the
|
||||||
|
default value of <name> is your own identity public key.
|
||||||
|
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
Resolve the value of your identity:
|
||||||
|
|
||||||
|
> ipfs name resolve
|
||||||
|
QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
|
||||||
|
|
||||||
|
Resolve te value of another name:
|
||||||
|
|
||||||
|
> ipfs name resolve QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n
|
||||||
|
QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
|
||||||
|
|
||||||
|
`,
|
||||||
|
|
||||||
|
Arguments: []cmds.Argument{
|
||||||
|
cmds.Argument{"name", cmds.ArgString, false, true},
|
||||||
|
},
|
||||||
|
Run: func(res cmds.Response, req cmds.Request) {
|
||||||
|
|
||||||
|
n := req.Context().Node
|
||||||
|
var names []string
|
||||||
|
|
||||||
|
if n.Network == nil {
|
||||||
|
res.SetError(errNotOnline, cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(req.Arguments()) == 0 {
|
||||||
|
if n.Identity == nil {
|
||||||
|
res.SetError(errors.New("Identity not loaded!"), cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
names = append(names, n.Identity.ID().String())
|
||||||
|
} else {
|
||||||
|
for _, arg := range req.Arguments() {
|
||||||
|
name, ok := arg.(string)
|
||||||
|
if !ok {
|
||||||
|
res.SetError(errors.New("cast error"), cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
names = append(names, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
entries, err := resolve(n, names)
|
||||||
|
if err != nil {
|
||||||
|
res.SetError(err, cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res.SetOutput(&ResolveOutput{entries})
|
||||||
|
},
|
||||||
|
Type: &ResolveOutput{},
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolve(n *core.IpfsNode, names []string) ([]IpnsEntry, error) {
|
||||||
|
var entries []IpnsEntry
|
||||||
|
for _, name := range names {
|
||||||
|
resolved, err := n.Namesys.Resolve(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
entries = append(entries, IpnsEntry{
|
||||||
|
Name: name,
|
||||||
|
Value: resolved,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return entries, nil
|
||||||
|
}
|
Reference in New Issue
Block a user