Keep Peer Caching + Resource Verification.

This commit is contained in:
mr
2026-02-09 13:28:00 +01:00
parent 1c0b2b4312
commit fa914958b6
14 changed files with 221 additions and 133 deletions

View File

@@ -2,6 +2,7 @@ package stream
import (
"context"
"crypto/subtle"
"encoding/json"
"errors"
"oc-discovery/daemons/node/common"
@@ -13,24 +14,60 @@ import (
"cloud.o-forge.io/core/oc-lib/tools"
)
func (ps *StreamService) getTopicName(topicName string) tools.PubSubAction {
type Verify struct {
IsVerified bool `json:"is_verified"`
}
func (ps *StreamService) getTopicName(topicName string) string {
ns := strings.Split(topicName, ".")
if len(ns) > 0 {
return tools.GetActionString(ns[0])
return ns[0]
}
return tools.NONE
return tools.NONE.String()
}
func (ps *StreamService) handleEvent(topicName string, evt *common.Event) error {
action := ps.getTopicName(topicName)
if err := ps.handleEventFromPartner(evt, action); err != nil {
return err
ps.handleEventFromPartner(evt, action)
if action == "verify_resource" {
if evt.DataType == -1 {
tools.NewNATSCaller().SetNATSPub(tools.VERIFY_RESOURCE, tools.NATSResponse{
FromApp: "oc-discovery",
Method: int(tools.VERIFY_RESOURCE),
Payload: evt.Payload,
})
} else if err := ps.verifyResponse(evt); err != nil {
return err
}
}
if action == tools.PB_SEARCH_RESPONSE {
if action == tools.PB_SEARCH_RESPONSE.String() {
if err := ps.retrieveResponse(evt); err != nil {
return err
}
}
return errors.New("no action authorized available : " + action)
}
func (abs *StreamService) verifyResponse(event *common.Event) error { //
res, err := resources.ToResource(int(event.DataType), event.Payload)
if err != nil || res == nil {
return nil
}
verify := Verify{
IsVerified: false,
}
access := oclib.NewRequestAdmin(oclib.LibDataEnum(event.DataType), nil)
data := access.LoadOne(res.GetID())
if data.Err == "" && data.Data != nil {
if b, err := json.Marshal(data.Data); err == nil {
if res2, err := resources.ToResource(int(event.DataType), b); err == nil {
verify.IsVerified = subtle.ConstantTimeCompare(res.GetSignature(), res2.GetSignature()) == 1
}
}
}
if b, err := json.Marshal(verify); err == nil {
abs.PublishVerifyResources(nil, "", event.From, b)
}
return nil
}
@@ -49,10 +86,7 @@ func (abs *StreamService) retrieveResponse(event *common.Event) error { //
return nil
}
func (ps *StreamService) handleEventFromPartner(evt *common.Event, action tools.PubSubAction) error {
if !(action == tools.PB_CREATE || action == tools.PB_UPDATE || action == tools.PB_DELETE) {
return nil
}
func (ps *StreamService) handleEventFromPartner(evt *common.Event, action string) error {
resource, err := resources.ToResource(int(evt.DataType), evt.Payload)
if err != nil {
return err
@@ -62,7 +96,7 @@ func (ps *StreamService) handleEventFromPartner(evt *common.Event, action tools.
return err
}
switch action {
case tools.PB_SEARCH:
case tools.PB_SEARCH.String():
access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
peers := access.Search(nil, evt.From, false)
if len(peers.Data) > 0 {
@@ -72,15 +106,15 @@ func (ps *StreamService) handleEventFromPartner(evt *common.Event, action tools.
} else if p, err := ps.Node.GetPeerRecord(context.Background(), evt.From); err == nil && len(p) > 0 { // peer from is peerID
ps.SendResponse(p[0], evt)
}
case tools.PB_CREATE:
case tools.PB_UPDATE:
case tools.PB_CREATE.String():
case tools.PB_UPDATE.String():
go tools.NewNATSCaller().SetNATSPub(tools.CREATE_RESOURCE, tools.NATSResponse{
FromApp: "oc-discovery",
Datatype: tools.DataType(evt.DataType),
Method: int(tools.CREATE_RESOURCE),
Payload: b,
})
case tools.PB_DELETE:
case tools.PB_DELETE.String():
go tools.NewNATSCaller().SetNATSPub(tools.REMOVE_RESOURCE, tools.NATSResponse{
FromApp: "oc-discovery",
Datatype: tools.DataType(evt.DataType),
@@ -88,7 +122,7 @@ func (ps *StreamService) handleEventFromPartner(evt *common.Event, action tools.
Payload: b,
})
default:
return errors.New("no action authorized available : " + action.String())
return errors.New("no action authorized available : " + action)
}
return nil
}