mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-11-22 11:50:28 +00:00
Add NodeInfoPrivacy option for not including defaults, and also check for null/"null" instead of "hide"
This commit is contained in:
parent
60549cfa09
commit
586deed0f9
@ -71,6 +71,7 @@ func generateConfig(isAutoconf bool) *nodeConfig {
|
|||||||
cfg.SessionFirewall.AllowFromDirect = true
|
cfg.SessionFirewall.AllowFromDirect = true
|
||||||
cfg.SessionFirewall.AllowFromRemote = true
|
cfg.SessionFirewall.AllowFromRemote = true
|
||||||
cfg.SwitchOptions.MaxTotalQueueSize = yggdrasil.SwitchQueueTotalMinSize
|
cfg.SwitchOptions.MaxTotalQueueSize = yggdrasil.SwitchQueueTotalMinSize
|
||||||
|
cfg.NodeInfoPrivacy = false
|
||||||
|
|
||||||
return &cfg
|
return &cfg
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ type NodeConfig struct {
|
|||||||
SessionFirewall SessionFirewall `comment:"The session firewall controls who can send/receive network traffic\nto/from. This is useful if you want to protect this node without\nresorting to using a real firewall. This does not affect traffic\nbeing routed via this node to somewhere else. Rules are prioritised as\nfollows: blacklist, whitelist, always allow outgoing, direct, remote."`
|
SessionFirewall SessionFirewall `comment:"The session firewall controls who can send/receive network traffic\nto/from. This is useful if you want to protect this node without\nresorting to using a real firewall. This does not affect traffic\nbeing routed via this node to somewhere else. Rules are prioritised as\nfollows: blacklist, whitelist, always allow outgoing, direct, remote."`
|
||||||
TunnelRouting TunnelRouting `comment:"Allow tunneling non-Yggdrasil traffic over Yggdrasil. This effectively\nallows you to use Yggdrasil to route to, or to bridge other networks,\nsimilar to a VPN tunnel. Tunnelling works between any two nodes and\ndoes not require them to be directly peered."`
|
TunnelRouting TunnelRouting `comment:"Allow tunneling non-Yggdrasil traffic over Yggdrasil. This effectively\nallows you to use Yggdrasil to route to, or to bridge other networks,\nsimilar to a VPN tunnel. Tunnelling works between any two nodes and\ndoes not require them to be directly peered."`
|
||||||
SwitchOptions SwitchOptions `comment:"Advanced options for tuning the switch. Normally you will not need\nto edit these options."`
|
SwitchOptions SwitchOptions `comment:"Advanced options for tuning the switch. Normally you will not need\nto edit these options."`
|
||||||
|
NodeInfoPrivacy bool `comment:"By default, nodeinfo contains some defaults including the platform,\narchitecture and Yggdrasil version. These can help when surveying\nthe network and diagnosing network routing problems. Enabling\nnodeinfo privacy prevents this, so that only items specified in\n\"NodeInfo\" are sent back if specified."`
|
||||||
NodeInfo map[string]interface{} `comment:"Optional node info. This must be a { \"key\": \"value\", ... } map\nor set as null. This is entirely optional but, if set, is visible\nto the whole network on request."`
|
NodeInfo map[string]interface{} `comment:"Optional node info. This must be a { \"key\": \"value\", ... } map\nor set as null. This is entirely optional but, if set, is visible\nto the whole network on request."`
|
||||||
//Net NetConfig `comment:"Extended options for connecting to peers over other networks."`
|
//Net NetConfig `comment:"Extended options for connecting to peers over other networks."`
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ func (c *Core) Start(nc *config.NodeConfig, log *log.Logger) error {
|
|||||||
c.admin.init(c, nc.AdminListen)
|
c.admin.init(c, nc.AdminListen)
|
||||||
|
|
||||||
c.nodeinfo.init(c)
|
c.nodeinfo.init(c)
|
||||||
c.nodeinfo.setNodeInfo(nc.NodeInfo)
|
c.nodeinfo.setNodeInfo(nc.NodeInfo, nc.NodeInfoPrivacy)
|
||||||
|
|
||||||
if err := c.tcp.init(c, nc.Listen, nc.ReadTimeout); err != nil {
|
if err := c.tcp.init(c, nc.Listen, nc.ReadTimeout); err != nil {
|
||||||
c.log.Println("Failed to start TCP interface")
|
c.log.Println("Failed to start TCP interface")
|
||||||
@ -248,8 +248,8 @@ func (c *Core) GetNodeInfo() nodeinfoPayload {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sets the nodeinfo.
|
// Sets the nodeinfo.
|
||||||
func (c *Core) SetNodeInfo(nodeinfo interface{}) {
|
func (c *Core) SetNodeInfo(nodeinfo interface{}, nodeinfoprivacy bool) {
|
||||||
c.nodeinfo.setNodeInfo(nodeinfo)
|
c.nodeinfo.setNodeInfo(nodeinfo, nodeinfoprivacy)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets the output logger of the Yggdrasil node after startup. This may be
|
// Sets the output logger of the Yggdrasil node after startup. This may be
|
||||||
|
@ -96,29 +96,34 @@ func (m *nodeinfo) getNodeInfo() nodeinfoPayload {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set the current node's nodeinfo
|
// Set the current node's nodeinfo
|
||||||
func (m *nodeinfo) setNodeInfo(given interface{}) error {
|
func (m *nodeinfo) setNodeInfo(given interface{}, privacy bool) error {
|
||||||
m.myNodeInfoMutex.Lock()
|
m.myNodeInfoMutex.Lock()
|
||||||
defer m.myNodeInfoMutex.Unlock()
|
defer m.myNodeInfoMutex.Unlock()
|
||||||
newnodeinfo := map[string]interface{}{
|
defaults := map[string]interface{}{
|
||||||
"buildname": GetBuildName(),
|
"buildname": GetBuildName(),
|
||||||
"buildversion": GetBuildVersion(),
|
"buildversion": GetBuildVersion(),
|
||||||
"buildplatform": runtime.GOOS,
|
"buildplatform": runtime.GOOS,
|
||||||
"buildarch": runtime.GOARCH,
|
"buildarch": runtime.GOARCH,
|
||||||
}
|
}
|
||||||
|
newnodeinfo := make(map[string]interface{})
|
||||||
|
if !privacy {
|
||||||
|
for k, v := range defaults {
|
||||||
|
newnodeinfo[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
if nodeinfomap, ok := given.(map[string]interface{}); ok {
|
if nodeinfomap, ok := given.(map[string]interface{}); ok {
|
||||||
for key, value := range nodeinfomap {
|
for key, value := range nodeinfomap {
|
||||||
if _, ok := newnodeinfo[key]; ok {
|
if _, ok := defaults[key]; ok {
|
||||||
if value == "hide" {
|
if strvalue, strok := value.(string); strok && strvalue == "null" || value == nil {
|
||||||
delete(newnodeinfo, key)
|
delete(newnodeinfo, key)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if value != "hide" {
|
|
||||||
newnodeinfo[key] = value
|
newnodeinfo[key] = value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if newjson, err := json.Marshal(newnodeinfo); err == nil {
|
if newjson, err := json.Marshal(newnodeinfo); err == nil {
|
||||||
|
m.core.log.Println(string(newjson))
|
||||||
if len(newjson) > 16384 {
|
if len(newjson) > 16384 {
|
||||||
return errors.New("NodeInfo exceeds max length of 16384 bytes")
|
return errors.New("NodeInfo exceeds max length of 16384 bytes")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user