// Handle - Decrypt and handle an encrypted message func (node *Node) Handle(channelName string, message []byte) error { var clear []byte var err error var clearMsg api.Msg // msg to out channel channelLen := len(channelName) if channelLen > 0 { v, ok := node.channelKeys[channelName] if !ok { return errors.New("Cannot Handle message for Unknown Channel") } clearMsg = api.Msg{Name: channelName, IsChan: true} clear, err = v.DecryptMessage(message) } else { clearMsg = api.Msg{Name: "[content]", IsChan: false} clear, err = node.contentKey.DecryptMessage(message) } if err != nil { return err } clearMsg.Content = bytes.NewBuffer(clear) select { case node.Out() <- clearMsg: node.debugMsg("Sent message " + fmt.Sprint(message)) default: node.debugMsg("No message sent") } return nil }
func Test_apicall_Channels_1(t *testing.T) { message := api.Msg{Name: "destname1", IsChan: false} message.Content = bytes.NewBufferString(testMessage1) node.In() <- message t.Log("API Channel TX: ") t.Log(message) }
/* TODO: encrypted debug and error messages?! yes please! - you may want an application that can detect that messages have happend while only being able to read them within the admin context */ func (node *Node) debugMsg(content string) { if node.debugMode { msg := new(api.Msg) msg.Name = "[DEBUG]" msg.Content = bytes.NewBufferString(content) node.Err() <- *msg } }
func (node *Node) errMsg(err error, fatal bool) { msg := new(api.Msg) if node.debugMode { msg.Content = bytes.NewBufferString(err.Error() + "\n---\n" + string(debug.Stack())) } else { msg.Content = bytes.NewBufferString(err.Error()) } msg.Name = "[ERROR]" msg.IsChan = fatal // use the "is channel" message flag as the "is fatal" flag node.Err() <- *msg if msg.IsChan { node.Stop() } }