Partnerships evolution
This commit is contained in:
@@ -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
2
go.mod
@@ -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
4
go.sum
@@ -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=
|
||||||
|
|||||||
@@ -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...
|
|
||||||
*/
|
|
||||||
|
|||||||
Reference in New Issue
Block a user