some adjustmentsfor server delivery and peer storage study
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
ycc
2024-05-23 14:14:12 +02:00
parent d657e64ae4
commit 17c991f442
7 changed files with 346 additions and 139 deletions

View File

@ -3,11 +3,13 @@ package client
import "forge.redroom.link/yves/meowlib"
type InternalUserMessage struct {
Outbound bool `json:"outbound"`
Messagetype string `json:"messagetype,omitempty"`
Message string `json:"message,omitempty"`
ConversationStatus *meowlib.ConversationStatus `json:"conversation_status,omitempty"`
Contact *meowlib.ContactCard `json:"contact,omitempty"`
Outbound bool `json:"outbound"`
Messagetype string `json:"messagetype,omitempty"`
Message string `json:"message,omitempty"`
ConversationStatus *meowlib.ConversationStatus `json:"conversation_status,omitempty"`
Contact *meowlib.ContactCard `json:"contact,omitempty"`
ServerDeliveryUuid string `json:"server_delivery_uuid,omitempty"`
ServerDeliveryTimestamp int64 `json:"server_delivery_timestamp,omitempty"`
//Group group
FilePaths []string `json:"file_paths,omitempty"`
CurrentLocation *meowlib.Location `json:"current_location,omitempty"`

View File

@ -46,6 +46,8 @@ type Peer struct {
Blocked bool `json:"blocked,omitempty"`
MessageNotification string `json:"message_notification,omitempty"`
MatriochkaMode bool `json:"matriochka_mode,omitempty"`
ServerDeliveryInfo bool `json:"server_delivery_info,omitempty"`
CallsAllowed bool `json:"calls_allowed,omitempty"`
DirectMode bool `json:"direct_mode,omitempty"`
DbIds []string `json:"db_ids,omitempty"`
Type string `json:"type,omitempty"`
@ -229,6 +231,9 @@ func (p *Peer) PackUserMessage(message []byte, signature []byte) *meowlib.Packed
msg.Destination = p.ContactLookupKey
msg.Payload = message
msg.Signature = signature
if p.ServerDeliveryInfo {
msg.ServerDeliveryUuid = uuid.New().String()
}
return &msg
}

View File

@ -1,9 +1,5 @@
package client
import (
"forge.redroom.link/yves/meowlib"
)
type PeerList []*Peer
func (pl *PeerList) GetFromPublicKey(publickey string) *Peer {
@ -43,7 +39,7 @@ func (pl *PeerList) GetFromName(name string) *Peer {
}
// ! Wrong implementation, does not discriminate on different servers
func (pl *PeerList) GetConversationRequests() []*meowlib.ConversationRequest {
/*func (pl *PeerList) GetConversationRequests() []*meowlib.ConversationRequest {
var list []*meowlib.ConversationRequest
for _, peer := range *pl {
var cr meowlib.ConversationRequest
@ -52,4 +48,4 @@ func (pl *PeerList) GetConversationRequests() []*meowlib.ConversationRequest {
list = append(list, &cr)
}
return list
}
}*/

171
client/peerstorage.go Normal file
View File

@ -0,0 +1,171 @@
package client
//
// Storage
//
import (
"crypto/sha256"
"encoding/json"
"path/filepath"
"forge.redroom.link/yves/meowlib"
"github.com/dgraph-io/badger"
)
type PeerStorage struct {
DbFile string `json:"db_file,omitempty"`
db *badger.DB
}
// Open a badger database from struct PeerStorage
func (ps *PeerStorage) open() error {
opts := badger.DefaultOptions(filepath.Join(GetConfig().StoragePath, GetConfig().GetIdentity().Uuid, ps.DbFile))
opts.Logger = nil
var err error
ps.db, err = badger.Open(opts)
if err != nil {
return err
}
return nil
}
// Store function StorePeer stores a peer in a badger database with Peer.Uid as key
func (ps *PeerStorage) StorePeer(peer *Peer) error {
err := ps.open()
if err != nil {
return err
}
defer ps.close()
// first marshal the Peer to bytes with protobuf
jsonsrv, err := json.Marshal(peer)
if err != nil {
return err
}
password := GetConfig().memoryPassword
if peer.dbPassword != "" {
password = peer.dbPassword
}
data, err := meowlib.SymEncrypt(password, jsonsrv)
if err != nil {
return err
}
shakey := sha256.Sum256([]byte(peer.Uid))
key := shakey[:]
// then store it in the database
return ps.db.Update(func(txn *badger.Txn) error {
return txn.Set(key, data)
})
}
// LoadPeer function loads a Peer from a badger database with Peer.GetUid() as key
func (ps *PeerStorage) LoadPeer(uid string, password string) (*Peer, error) {
var peer Peer
err := ps.open()
if err != nil {
return nil, err
}
defer ps.close()
shakey := sha256.Sum256([]byte(uid))
key := shakey[:]
err = ps.db.View(func(txn *badger.Txn) error {
item, err := txn.Get(key)
if err != nil {
return err
}
return item.Value(func(val []byte) error {
jsonsrv, err := meowlib.SymDecrypt(password, val)
if err != nil {
return err
}
return json.Unmarshal(jsonsrv, &peer)
})
})
return &peer, err
}
// DeletePeer function deletes a Peer from a badger database with Peer.GetUid() as key
func (ps *PeerStorage) DeletePeer(uid string) error {
err := ps.open()
if err != nil {
return err
}
defer ps.close()
shakey := sha256.Sum256([]byte(uid))
key := shakey[:]
return ps.db.Update(func(txn *badger.Txn) error {
return txn.Delete(key)
})
}
// LoadAllPeers function loads all Peers from a badger database
func (ps *PeerStorage) LoadAllPeers(password string) ([]*Peer, error) {
var peers []*Peer
err := ps.open()
if err != nil {
return nil, err
}
defer ps.close()
err = ps.db.View(func(txn *badger.Txn) error {
opts := badger.DefaultIteratorOptions
opts.PrefetchSize = 10
it := txn.NewIterator(opts)
defer it.Close()
for it.Rewind(); it.Valid(); it.Next() {
item := it.Item()
var sc Peer
err := item.Value(func(val []byte) error {
jsonsrv, err := meowlib.SymDecrypt(password, val)
if err != nil {
return err
}
return json.Unmarshal(jsonsrv, &sc)
})
if err != nil {
peers = append(peers, &sc)
}
}
return nil
})
return peers, err
}
// LoadPeersFromUids function loads Peers with id in []Uid parameter from a badger database
func (ps *PeerStorage) LoadPeersFromUids(uids []string, password string) ([]*Peer, error) {
var peers []*Peer
err := ps.open()
if err != nil {
return nil, err
}
defer ps.close()
err = ps.db.View(func(txn *badger.Txn) error {
for _, uid := range uids {
shakey := sha256.Sum256([]byte(uid))
key := shakey[:]
item, err := txn.Get(key)
if err != nil {
return err
}
var sc Peer
err = item.Value(func(val []byte) error {
jsonsrv, err := meowlib.SymDecrypt(password, val)
if err != nil {
return err
}
return json.Unmarshal(jsonsrv, &sc)
})
if err == nil {
peers = append(peers, &sc)
}
}
return nil
})
return peers, err
}
// close a badger database
func (ps *PeerStorage) close() {
ps.db.Close()
}