Partnerships evolution

This commit is contained in:
mr
2026-01-26 15:45:13 +01:00
parent 07ec659bb4
commit 5a94504abb
4 changed files with 69 additions and 30 deletions

View File

@@ -148,10 +148,9 @@ func (o *PeerController) Partner() {
func (o *PeerController) Blacklist() { func (o *PeerController) Blacklist() {
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id") id := o.Ctx.Input.Param(":id")
o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).UpdateOne(map[string]interface{}{ req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil)
"relation": peer.BLACKLIST, data := req.LoadOne(id)
"state": peer.OFFLINE, o.changeRelation(data.ToPeer(), peer.BLACKLIST, req)
}, id)
} }
// used from : peer ask, or response, only from peer origin is authorized to change... // used from : peer ask, or response, only from peer origin is authorized to change...
@@ -176,9 +175,15 @@ func (o *PeerController) changeRelation(dest *peer.Peer, relation peer.PeerRelat
} }
// store and return Id or post with UUID // store and return Id or post with UUID
if dest != nil { if dest != nil {
if !dest.Verify && relation == peer.PARTNER { if !dest.Verify {
switch relation {
case peer.PARTNER:
relation = peer.PENDING_PARTNER relation = peer.PENDING_PARTNER
if _, err := tools.NewHTTPCaller(map[tools.DataType]map[tools.METHOD]string{}).CallGet(dest.Url, "/"+request.PeerID+"/link/"+relation.Path()); err != nil { case peer.BLACKLIST:
relation = peer.NONE
}
if _, err := tools.NewHTTPCaller(map[tools.DataType]map[tools.METHOD]string{}).CallGet(
dest.Url, "/"+request.PeerID+"/link/"+relation.Path()); err != nil {
o.Data["json"] = map[string]interface{}{ o.Data["json"] = map[string]interface{}{
"data": nil, "data": nil,
"code": 400, "code": 400,

2
go.mod
View File

@@ -5,7 +5,7 @@ go 1.24.6
toolchain go1.24.11 toolchain go1.24.11
require ( require (
cloud.o-forge.io/core/oc-lib v0.0.0-20260126093615-bc94f2b188e6 cloud.o-forge.io/core/oc-lib v0.0.0-20260126120055-055e6c70cdd7
github.com/beego/beego/v2 v2.3.8 github.com/beego/beego/v2 v2.3.8
github.com/smartystreets/goconvey v1.7.2 github.com/smartystreets/goconvey v1.7.2
) )

4
go.sum
View File

@@ -18,6 +18,10 @@ cloud.o-forge.io/core/oc-lib v0.0.0-20260123065115-f3d7c65b18d1 h1:K7ind/dAshdoF
cloud.o-forge.io/core/oc-lib v0.0.0-20260123065115-f3d7c65b18d1/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI= cloud.o-forge.io/core/oc-lib v0.0.0-20260123065115-f3d7c65b18d1/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI=
cloud.o-forge.io/core/oc-lib v0.0.0-20260126093615-bc94f2b188e6 h1:Sxjq1lQwSl+gkUYag4wAb6j74uU/JZviw1hkFavt58o= cloud.o-forge.io/core/oc-lib v0.0.0-20260126093615-bc94f2b188e6 h1:Sxjq1lQwSl+gkUYag4wAb6j74uU/JZviw1hkFavt58o=
cloud.o-forge.io/core/oc-lib v0.0.0-20260126093615-bc94f2b188e6/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI= cloud.o-forge.io/core/oc-lib v0.0.0-20260126093615-bc94f2b188e6/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI=
cloud.o-forge.io/core/oc-lib v0.0.0-20260126113404-85a8857938f5 h1:pl6/u6UXyFcfCU+xyQcSY8Lkby68EVWswxG2Oaq476A=
cloud.o-forge.io/core/oc-lib v0.0.0-20260126113404-85a8857938f5/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI=
cloud.o-forge.io/core/oc-lib v0.0.0-20260126120055-055e6c70cdd7 h1:LAK86efqe2HNV1Tkym1TpvzL1Xsj3F0ClsK/snfejD0=
cloud.o-forge.io/core/oc-lib v0.0.0-20260126120055-055e6c70cdd7/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/beego/beego/v2 v2.3.8 h1:wplhB1pF4TxR+2SS4PUej8eDoH4xGfxuHfS7wAk9VBc= github.com/beego/beego/v2 v2.3.8 h1:wplhB1pF4TxR+2SS4PUej8eDoH4xGfxuHfS7wAk9VBc=
github.com/beego/beego/v2 v2.3.8/go.mod h1:8vl9+RrXqvodrl9C8yivX1e6le6deCK6RWeq8R7gTTg= github.com/beego/beego/v2 v2.3.8/go.mod h1:8vl9+RrXqvodrl9C8yivX1e6le6deCK6RWeq8R7gTTg=

View File

@@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"oc-peer/conf" "oc-peer/conf"
"slices" "slices"
"sync"
"time" "time"
oclib "cloud.o-forge.io/core/oc-lib" oclib "cloud.o-forge.io/core/oc-lib"
@@ -39,6 +40,7 @@ type DHTService struct {
Host host.Host Host host.Host
DHT *dht.IpfsDHT DHT *dht.IpfsDHT
Cache []string Cache []string
mutex sync.RWMutex
} }
var singletonService *DHTService var singletonService *DHTService
@@ -93,7 +95,9 @@ func (d *DHTService) RefreshKeys(ctx context.Context, interval time.Duration) {
return return
case <-ticker.C: case <-ticker.C:
s := []string{} s := []string{}
d.mutex.Lock()
s = append(s, d.Cache...) s = append(s, d.Cache...)
d.mutex.Unlock()
for _, key := range s { for _, key := range s {
_, _ = d.GetValue(ctx, key) _, _ = d.GetValue(ctx, key)
} }
@@ -111,9 +115,11 @@ func (d *DHTService) PutValue(
if err != nil { if err != nil {
return err return err
} }
d.mutex.Lock()
if !slices.Contains(d.Cache, key) { if !slices.Contains(d.Cache, key) {
d.Cache = append(d.Cache, key) d.Cache = append(d.Cache, key)
} }
d.mutex.Unlock()
return nil return nil
} }
@@ -124,22 +130,27 @@ func (d *DHTService) GetValue(
dht, err := d.DHT.GetValue(ctx, key) dht, err := d.DHT.GetValue(ctx, key)
if err != nil { if err != nil {
cache := []string{} cache := []string{}
d.mutex.Lock()
for _, c := range d.Cache { for _, c := range d.Cache {
if c != key { if c != key {
cache = append(cache, c) cache = append(cache, c)
} }
} }
d.Cache = cache d.Cache = cache
d.mutex.Unlock()
return nil, err return nil, err
} }
d.mutex.Lock()
if !slices.Contains(d.Cache, key) { if !slices.Contains(d.Cache, key) {
d.Cache = append(d.Cache, key) d.Cache = append(d.Cache, key)
} }
var data *DHTRecord d.mutex.Unlock()
json.Unmarshal(dht, data) var data DHTRecord
json.Unmarshal(dht, &data)
if data == nil { peerID, err := oclib.GenerateNodeID()
return nil, errors.New("no record found") if err != nil {
return nil, err
} }
access := pp.NewAccessor(&tools.APIRequest{Admin: true}) access := pp.NewAccessor(&tools.APIRequest{Admin: true})
@@ -150,7 +161,7 @@ func (d *DHTService) GetValue(
}, },
State: pp.ONLINE, State: pp.ONLINE,
Relation: pp.SELF, Relation: pp.SELF,
PeerID: d.Host.ID().String(), PeerID: peerID,
PublicKey: string(data.PubKey), PublicKey: string(data.PubKey),
Url: data.URL, Url: data.URL,
NATSUrl: oclib.GetConfig().NATSUrl, NATSUrl: oclib.GetConfig().NATSUrl,
@@ -168,14 +179,15 @@ func (d *DHTService) GetValue(
access.UpdateOne(f, f.GetID()) access.UpdateOne(f, f.GetID())
} }
return data, err return &data, err
} }
func (d *DHTService) generateKey( func (d *DHTService) generateKey() (string, error) {
sub string, s, err := oclib.GenerateNodeID()
name string, if err != nil {
) string { return s, err
return "/opencloud/" + sub + "/" + name }
return "/opencloud/peer/" + s, nil
} }
// Create your peer. // Create your peer.
@@ -188,14 +200,20 @@ func (d *DHTService) ClaimName(
return nil, errors.New("no endpoint found for peer" + name) return nil, errors.New("no endpoint found for peer" + name)
} }
peerID, err := oclib.GenerateNodeID()
if err != nil {
return nil, err
}
pub := d.Host.Peerstore().PubKey(d.Host.ID()) pub := d.Host.Peerstore().PubKey(d.Host.ID())
pubBytes, _ := pub.Raw() pubBytes, _ := pub.Raw()
now := time.Now() now := time.Now()
expiry := now.Add(1 * time.Hour) expiry := now.Add(1 * time.Hour)
rec := DHTRecord{ rec := DHTRecord{
Name: name, Name: name,
PeerID: d.Host.ID().String(), PeerID: peerID,
PubKey: pubBytes, PubKey: pubBytes,
} }
@@ -210,12 +228,15 @@ func (d *DHTService) ClaimName(
data, _ := json.Marshal(rec) data, _ := json.Marshal(rec)
key := d.generateKey("peer", rec.Name) key, err := d.generateKey()
if err != nil {
return nil, err
}
// retrieve your key name in standard // retrieve your key name in standard
old, err := d.GetValue(ctx, key) old, err := d.GetValue(ctx, key)
if err == nil { if err == nil {
if old.PeerID != d.Host.ID().String() { // check if someone claims your name before if old.PeerID != peerID { // check if someone claims your name before
return nil, errors.New("name already claimed by another peer") return nil, errors.New("name already claimed by another peer")
// TODO : can be fragile if 2 peers connect at the same time // TODO : can be fragile if 2 peers connect at the same time
} }
@@ -232,6 +253,9 @@ func (d *DHTService) ClaimName(
pubStr := base64.StdEncoding.EncodeToString(pubBytes) pubStr := base64.StdEncoding.EncodeToString(pubBytes)
d.Key = key d.Key = key
access := pp.NewAccessor(&tools.APIRequest{Admin: true}) access := pp.NewAccessor(&tools.APIRequest{Admin: true})
if err != nil {
return nil, err
}
p := &pp.Peer{ p := &pp.Peer{
AbstractObject: utils.AbstractObject{ AbstractObject: utils.AbstractObject{
UUID: uuid.New().String(), UUID: uuid.New().String(),
@@ -239,7 +263,7 @@ func (d *DHTService) ClaimName(
}, },
State: pp.ONLINE, State: pp.ONLINE,
Relation: pp.SELF, Relation: pp.SELF,
PeerID: d.Host.ID().String(), PeerID: peerID,
PublicKey: pubStr, PublicKey: pubStr,
Url: endPoint, Url: endPoint,
NATSUrl: oclib.GetConfig().NATSUrl, NATSUrl: oclib.GetConfig().NATSUrl,
@@ -248,8 +272,12 @@ func (d *DHTService) ClaimName(
if founded, _, err := access.Search(nil, fmt.Sprintf("%v", pp.SELF.EnumIndex()), false); err != nil || len(founded) == 0 { if founded, _, err := access.Search(nil, fmt.Sprintf("%v", pp.SELF.EnumIndex()), false); err != nil || len(founded) == 0 {
access.StoreOne(p) access.StoreOne(p)
} else if f, _, err := access.LoadOne(founded[0].GetID()); err == nil { } else if f, _, err := access.LoadOne(founded[0].GetID()); err == nil {
peerID, err := oclib.GenerateNodeID()
if err != nil {
return nil, err
}
f.(*pp.Peer).Name = name f.(*pp.Peer).Name = name
f.(*pp.Peer).PeerID = d.Host.ID().String() f.(*pp.Peer).PeerID = peerID
f.(*pp.Peer).State = pp.ONLINE f.(*pp.Peer).State = pp.ONLINE
f.(*pp.Peer).Url = endPoint f.(*pp.Peer).Url = endPoint
f.(*pp.Peer).NATSUrl = oclib.GetConfig().NATSUrl f.(*pp.Peer).NATSUrl = oclib.GetConfig().NATSUrl
@@ -340,7 +368,10 @@ func (d *DHTService) DiscoverPeers(
name string, name string,
) ([]*pp.Peer, error) { ) ([]*pp.Peer, error) {
peers := []*pp.Peer{} peers := []*pp.Peer{}
key := d.generateKey("peer", name) key, err := d.generateKey()
if err != nil {
return nil, err
}
datas, err := d.DHT.SearchValue(ctx, key) datas, err := d.DHT.SearchValue(ctx, key)
if err != nil { if err != nil {
return nil, errors.New("no DHT peer not found") return nil, errors.New("no DHT peer not found")
@@ -359,7 +390,10 @@ func (d *DHTService) GetPeer(
ctx context.Context, ctx context.Context,
name string, name string,
) (*pp.Peer, error) { ) (*pp.Peer, error) {
key := d.generateKey("peer", name) key, err := d.generateKey()
if err != nil {
return nil, err
}
data, err := d.GetValue(ctx, key) data, err := d.GetValue(ctx, key)
if err != nil { if err != nil {
return nil, errors.New("no DHT peer not found") return nil, errors.New("no DHT peer not found")
@@ -393,7 +427,3 @@ func (d *DHTService) existsDHT(ctx context.Context) (*DHTRecord, error) {
} }
return rec, nil return rec, nil
} }
/*
Apply Name interlude...
*/