mirror of https://github.com/namecoin/ncdns
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.1 KiB
Go
135 lines
3.1 KiB
Go
10 years ago
|
package namecoin
|
||
|
|
||
|
// btcjson had to be modified a bit to get correct error reporting.
|
||
10 years ago
|
import "github.com/hlandauf/btcjson"
|
||
10 years ago
|
import "github.com/hlandau/ncdns/ncerr"
|
||
|
|
||
10 years ago
|
import "encoding/json"
|
||
|
import "sync/atomic"
|
||
|
import "fmt"
|
||
|
|
||
10 years ago
|
// Used for generating IDs for JSON-RPC requests.
|
||
10 years ago
|
var idCounter int32 = 0
|
||
|
|
||
|
func newID() int32 {
|
||
|
return atomic.AddInt32(&idCounter, 1)
|
||
|
}
|
||
|
|
||
|
type NameShowCmd struct {
|
||
|
id interface{}
|
||
|
Name string `json:"name"`
|
||
|
}
|
||
|
|
||
|
func NewNameShowCmd(id interface{}, name string) (*NameShowCmd, error) {
|
||
|
return &NameShowCmd {
|
||
|
id: id,
|
||
|
Name: name,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func (c *NameShowCmd) Id() interface{} {
|
||
|
return c.id
|
||
|
}
|
||
|
|
||
|
func (c *NameShowCmd) Method() string {
|
||
|
return "name_show"
|
||
|
}
|
||
|
|
||
|
func (c *NameShowCmd) MarshalJSON() ([]byte, error) {
|
||
|
params := []interface{}{
|
||
|
c.Name,
|
||
|
}
|
||
|
|
||
|
raw, err := btcjson.NewRawCmd(c.id, c.Method(), params)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return json.Marshal(raw)
|
||
|
}
|
||
|
|
||
|
func (c *NameShowCmd) UnmarshalJSON(b []byte) error {
|
||
|
// We don't need to implement this as we are only ever the client.
|
||
|
panic("not implemented")
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type NameShowReply struct {
|
||
|
Name string `json:"name"`
|
||
|
Value string `json:"value"`
|
||
|
ExpiresIn int `json:"expires_in"`
|
||
|
}
|
||
|
|
||
|
func replyParser(m json.RawMessage) (interface{}, error) {
|
||
|
nsr := &NameShowReply{}
|
||
|
err := json.Unmarshal(m, nsr)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
10 years ago
|
|
||
10 years ago
|
return nsr, nil
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
btcjson.RegisterCustomCmd("name_show", nil, replyParser, "name_show <name>")
|
||
|
}
|
||
|
|
||
|
type NamecoinConn struct {
|
||
|
Username string
|
||
|
Password string
|
||
|
Server string
|
||
|
}
|
||
|
|
||
|
func (nc *NamecoinConn) Query(name string) (v string, err error) {
|
||
10 years ago
|
if name == "d/badger2" {
|
||
10 years ago
|
v = `{"ns":["ns1.badger.bit","ns2.badger.bit"],"map":{"ns1":{"ip":["1.2.3.4"],"ip6":["::beef:1"]},"ns2":{"ip":["2.3.4.5"],"ip6":["::beef:2"]}},"ds":[[12345,8,2,"lu6y/9mwDNRpTngni179qwqARGVntp9jTaB48NkPAbo="]]}`
|
||
10 years ago
|
return
|
||
|
}
|
||
10 years ago
|
if name == "d/badger" {
|
||
10 years ago
|
v = `{"ns":["ns1.badger.bit.genoq.org"],"map":{"ns1":{"ip":["192.99.208.248"]}},"ds":[[4015,8,1,"zvJorv4AV1it/HukLVw5wc6wtnI="],[4015,8,2,"mGW8W55p5JajShyDBvmAdPFOAEcA8IMDzwL0nO5AxAQ="]]}`
|
||
10 years ago
|
return
|
||
|
}
|
||
10 years ago
|
if name == "d/secure" {
|
||
|
v = `{"ns":["ns1.example.com","ns2.example.com"],"ds":[[12345,8,2,"lu6y/9mwDNRpTngni179qwqARGVntp9jTaB48NkPAbo="]]}`
|
||
|
return
|
||
|
}
|
||
|
if name == "d/insecure" {
|
||
|
v = `{"ns":["ns1.example.com","ns2.example.com"]}`
|
||
|
return
|
||
|
}
|
||
10 years ago
|
|
||
10 years ago
|
cmd, err := NewNameShowCmd(newID(), name)
|
||
|
if err != nil {
|
||
10 years ago
|
//log.Info("NC NEWCMD ", err)
|
||
10 years ago
|
return "", err
|
||
|
}
|
||
|
|
||
|
r, err := btcjson.RpcSend(nc.Username, nc.Password, nc.Server, cmd)
|
||
|
if err != nil {
|
||
10 years ago
|
return "", err
|
||
|
}
|
||
|
|
||
|
if r.Error != nil {
|
||
|
//log.Info("RPC error: ", r.Error)
|
||
|
if r.Error.Code == -4 {
|
||
10 years ago
|
return "", ncerr.ErrNoSuchDomain
|
||
10 years ago
|
}
|
||
10 years ago
|
return "", r.Error
|
||
10 years ago
|
}
|
||
|
|
||
|
if r.Result == nil {
|
||
10 years ago
|
//log.Info("NC NILRESULT")
|
||
10 years ago
|
return "", fmt.Errorf("got nil result")
|
||
|
}
|
||
|
|
||
|
if nsr, ok := r.Result.(*NameShowReply); ok {
|
||
10 years ago
|
//log.Info("NC OK")
|
||
10 years ago
|
return nsr.Value, nil
|
||
|
} else {
|
||
10 years ago
|
//log.Info("NC BADREPLY")
|
||
10 years ago
|
return "", fmt.Errorf("bad reply")
|
||
|
}
|
||
|
}
|
||
10 years ago
|
|
||
|
// © 2014 Hugo Landau <hlandau@devever.net> GPLv3 or later
|