diff --git a/cmd/ppass/ppass.go b/cmd/ppass/ppass.go index 77b76db..5562299 100644 --- a/cmd/ppass/ppass.go +++ b/cmd/ppass/ppass.go @@ -47,10 +47,10 @@ func main() { fmt.Printf("AgeKey: %s\n", key.String()) fmt.Printf("AgePublicKey: %s\n", key.Recipient().String()) - cipher, err := age.Encrypt([]byte("Test Message"), []string{key.Recipient().String()}) - fmt.Printf("Encrypted: %s\n", cipher) - decrypted, err := age.Decrypt(cipher, key) - fmt.Printf("Decrypted: %s\n", decrypted) + //cipher, err := age.Encrypt([]byte("Test Message"), []string{key.Recipient().String()}) + //fmt.Printf("Encrypted: %s\n", cipher) + //decrypted, err := age.Decrypt(cipher, key) + //fmt.Printf("Decrypted: %s\n", decrypted) h, dht, err := storage.SetupLibp2pHost(ctx, *dbPath) @@ -84,6 +84,12 @@ func main() { logger.Fatal(err) } + Cfg, err := storage.NewConfig(*dbPath + "/config.json") + + if err != nil { + logger.Fatal(err) + } + storageHandler := storage.StorageHandler{ Ctx: ctx , Store: store, @@ -91,10 +97,9 @@ func main() { Ipfs: ipfs, PubSub: ps, Key: key, + Config: Cfg, } - Cfg := storage.NewConfig() - Namespaces := make(map[string]*storage.Namespace) for _, nsCfg := range Cfg { ns1, err := storage.CreateNamespace(nsCfg.Id, storageHandler) @@ -254,7 +259,7 @@ Commands: continue } - encryptedPassword, err := age.Encrypt(data, []string{key.Recipient().String()}) + encryptedPassword, err := age.Encrypt(data, val.GetRecipients()) if err != nil { printErr(err) continue diff --git a/storage/storage.go b/storage/storage.go index a0dff93..66abc83 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -4,10 +4,10 @@ import ( "context" "fmt" "os" + "encoding/json" "path/filepath" "time" "sync" - "io/ioutil" "github.com/ipfs/go-datastore/query" "github.com/libp2p/go-libp2p" @@ -37,7 +37,7 @@ import ( ) var ( - topicNameFlag = "akdjlask-23klaj2idalj2-ajl2kjd3i-2ldakjd2" + topicNameFlag = "afbjlask-23klaj2idalj2-ajl2kjd3i-2ldakjd2" logger = logging.Logger("globaldb") Listen = libp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/0") ) @@ -56,14 +56,14 @@ func SetupLibp2pHost(ctx context.Context, dbPath string) (host host.Host, dht *d if err != nil { logger.Fatal(err) } - err = ioutil.WriteFile(keyPath, data, 0400) + err = os.WriteFile(keyPath, data, 0400) if err != nil { logger.Fatal(err) } } else if err != nil { logger.Fatal(err) } else { - key, err := ioutil.ReadFile(keyPath) + key, err := os.ReadFile(keyPath) if err != nil { logger.Fatal(err) } @@ -101,47 +101,35 @@ func SetupLibp2pHost(ctx context.Context, dbPath string) (host host.Host, dht *d } type Peer struct { - Id string - Key string + Id string `json:"Id"` + Key string `json:"Key"` } type NamespaceConfig struct { - Name string - Id string - Peers []Peer + Name string `json:"Name"` + Id string `json:"Id"` + Peers []Peer `json:"Peers"` } type Config []NamespaceConfig -func NewConfig() []NamespaceConfig { +func NewConfig(filename string) ([]NamespaceConfig, error) { //fmt.Println("NewConfig Path not implemented yet") - return []NamespaceConfig{ - { - Name: "root", - Id: "akdjlask-23klaj2idalj2-ajl2kjd3i-2ldakjd2", - Peers: []Peer{ - { Id: "12D3KooWLF7BU5VgpqWdS1XwSTFCLphENozhYQAj6i5LqU8BPZZZ" }, - { Id: "12D3KooWBRvtW83QYnPgJCyVyAgMXtg71wjkGefVB2fBnm1A36kS" }, - { Id: "12D3KooWMmc4kYy78vSumqWtPkUNAoPeCpJ66ysFv1U8S554B7e2" }, - }, - }, - { - Name: "foo", - Id: "2-903djl1290djl1-21jdl1kjd2-1d1jdl1k2jd11", - Peers: []Peer{ - { Id: "12D3KooWLF7BU5VgpqWdS1XwSTFCLphENozhYQAj6i5LqU8BPZZZ" }, - { Id: "12D3KooWMmc4kYy78vSumqWtPkUNAoPeCpJ66ysFv1U8S554B7e2" }, - }, - }, - { - Name: "bar", - Id: "2-90ssssssssdjl1-21jdl1kjd2-1d1jdl1k2jd11", - Peers: []Peer{ - //{ Id: "12D3KooWLF7BU5VgpqWdS1XwSTFCLphENozhYQAj6i5LqU8BPZZZ" }, - //{ Id: "12D3KooWBRvtW83QYnPgJCyVyAgMXtg71wjkGefVB2fBnm1A36kS" }, - }, - }, + content, err := os.ReadFile(filename) + + if err != nil { + return nil, fmt.Errorf("Could not read config file: %s", err) } + + var result []NamespaceConfig + err = json.Unmarshal(content, &result) + + + if err != nil { + return nil, fmt.Errorf("Could not parse config file: %s", err) + } + + return result, nil } @@ -182,11 +170,9 @@ func (wg *WhitelistConnectionGater) InterceptUpgraded(conn network.Conn) (allow return wg.InterceptPeerDial(conn.RemotePeer()), 0 } -func GetTrustedPeers() map[string][]Peer { - cfg := NewConfig() - +func GetTrustedPeers(config []NamespaceConfig) map[string][]Peer { result := make(map[string][]Peer) - for _, c := range cfg { + for _, c := range config { result[c.Id] = c.Peers } @@ -204,9 +190,20 @@ type Namespace struct { CancelFunc context.CancelFunc ctx context.Context Key *agelib.X25519Identity + TrustedPeers []Peer } +func (n *Namespace) GetRecipients() []string { + var result []string + + for _, peer := range n.TrustedPeers { + result = append(result, peer.Key) + } + + return result +} + func (n *Namespace) Put(k string, v string) error { key := ds.NewKey(k) err := n.Datastore.Put(n.ctx, key, []byte(v)) @@ -265,10 +262,11 @@ type StorageHandler struct { Ipfs *ipfslite.Peer PubSub *pubsub.PubSub Key *agelib.X25519Identity + Config []NamespaceConfig } -func IsTrustedPeer(ctx context.Context, id peer.ID, namespace string) bool { - peerMap := GetTrustedPeers() +func IsTrustedPeer(ctx context.Context, id peer.ID, namespace string, config []NamespaceConfig) bool { + peerMap := GetTrustedPeers(config) val, ok := peerMap[namespace] @@ -299,7 +297,7 @@ func CreateNamespace(ID string, storageHandler StorageHandler) (*Namespace, erro ID, //== topicName func(ctx context.Context, _ peer.ID, msg *pubsub.Message) bool { signer := msg.GetFrom() - trusted := IsTrustedPeer(ctx, signer, ID) + trusted := IsTrustedPeer(ctx, signer, ID, storageHandler.Config) if !trusted { logger.Debug("discarded pubsub message from non trusted source %s ", signer) } @@ -334,7 +332,15 @@ func CreateNamespace(ID string, storageHandler StorageHandler) (*Namespace, erro return nil, err } - return &Namespace{ID: ID, Datastore: crdt, CancelFunc: psubCancel, ctx: storageHandler.Ctx, Key: storageHandler.Key}, nil + PeerMap := GetTrustedPeers(storageHandler.Config) + + val, ok := PeerMap[ID] + + if !ok { + logger.Fatal("namespace config does not contain any peers") + } + + return &Namespace{ID: ID, Datastore: crdt, CancelFunc: psubCancel, ctx: storageHandler.Ctx, Key: storageHandler.Key, TrustedPeers: val}, nil } @@ -402,7 +408,7 @@ func DiscoverPeers(ctx context.Context, h host.Host, dht *dht.IpfsDHT) { fmt.Printf("Own Id: %s\n", h.ID()) for !anyConnected { time.Sleep(2 * time.Second) - fmt.Println("Searching for peers...") + //debug fmt.Println("Searching for peers...") peerChan, err := routingDiscovery.FindPeers(ctx, topicNameFlag) if err != nil { panic(err) @@ -413,7 +419,7 @@ func DiscoverPeers(ctx context.Context, h host.Host, dht *dht.IpfsDHT) { } err := h.Connect(ctx, peer) if err != nil { - fmt.Printf("Failed connecting to %s, error: %s\n", peer.ID, err) + //debug fmt.Printf("Failed connecting to %s, error: %s\n", peer.ID, err) } else { fmt.Println("Connected to:", peer.ID) anyConnected = true