Compare commits

...

2 Commits

Author SHA1 Message Date
a3f2a5ee6d Rework discovery
peer discovery happens now based on vault ids not the general token
"pentapass". It also happens periodically instead of just once
2024-10-10 13:12:26 +02:00
069fdf8215 rename Namespace -> Vault
mv into seperate file
2024-10-10 12:15:26 +02:00
7 changed files with 498 additions and 418 deletions

View File

@@ -37,8 +37,8 @@ var listCmd = &cobra.Command{
}
var names []string
namespace := "root"
err = client.Call("Query.GetAllNames", &namespace, &names)
vault := "root"
err = client.Call("Query.GetAllNames", &vault, &names)
if err != nil {
Logger.Error(err)
@@ -67,14 +67,14 @@ var generateCmd = &cobra.Command{
serviceName := args[0]
var password *crypto.Password
np := rpc.NamespaceService{ Namespace: "root", Service: serviceName }
np := rpc.VaultService{ Vault: "root", Service: serviceName }
err = client.Call("Query.Generate", &np, &password)
if err != nil {
Logger.Error(err)
}
Logger.Info(*password)
Logger.Info(password.Password)
},
}
@@ -94,7 +94,7 @@ var showCmd = &cobra.Command{
serviceName := args[0]
var password *crypto.Password
np := rpc.NamespaceService{ Namespace: "root", Service: serviceName }
np := rpc.VaultService{ Vault: "root", Service: serviceName }
err = client.Call("Query.Get", &np, &password)
if err != nil {
@@ -106,14 +106,14 @@ var showCmd = &cobra.Command{
},
}
var namespaceCmd = &cobra.Command{
Use: "namespace",
Short: "Add, delete or list namespaces",
var vaultCmd = &cobra.Command{
Use: "vault",
Short: "Add, delete or list vaults",
}
var addNamespaceCmd = &cobra.Command{
var addVaultCmd = &cobra.Command{
Use: "add",
Short: "add a namespace",
Short: "add a vault",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
dbPath, _ := cmd.Flags().GetString("db")
@@ -124,23 +124,23 @@ var addNamespaceCmd = &cobra.Command{
return
}
namespace := args[0]
vault := args[0]
var placeholder int
err = client.Call("Query.AddNamespace", &namespace, &placeholder)
err = client.Call("Query.AddVault", &vault, &placeholder)
if err != nil {
Logger.Error(err)
return
}
Logger.Infof("Namespace %s was added\n", namespace)
Logger.Infof("Vault %s was added\n", vault)
},
}
var deleteNamespaceCmd = &cobra.Command{
var deleteVaultCmd = &cobra.Command{
Use: "delete",
Short: "delete a namespace",
Short: "delete a vault",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
dbPath, _ := cmd.Flags().GetString("db")
@@ -151,23 +151,23 @@ var deleteNamespaceCmd = &cobra.Command{
return
}
namespace := args[0]
vault := args[0]
var placeholder int
err = client.Call("Query.DeleteNamespace", &namespace, &placeholder)
err = client.Call("Query.DeleteVault", &vault, &placeholder)
if err != nil {
Logger.Error(err)
return
}
Logger.Infof("Namespace %s was deleted\n", namespace)
Logger.Infof("Vault %s was deleted\n", vault)
},
}
var listNamespacesCmd = &cobra.Command{
var listVaultsCmd = &cobra.Command{
Use: "list",
Short: "list all namespaces",
Short: "list all vaults",
Run: func(cmd *cobra.Command, args []string) {
dbPath, _ := cmd.Flags().GetString("db")
client, err := rpc.Receive(dbPath)
@@ -178,14 +178,14 @@ var listNamespacesCmd = &cobra.Command{
}
var reply []string
err = client.Call("Query.ListNamespaces", 0, &reply)
err = client.Call("Query.ListVaults", 0, &reply)
if err != nil {
Logger.Error(err)
return
}
Logger.Info("Namespaces:")
Logger.Info("Vaults:")
for _, ns := range reply {
Logger.Info(ns)
}
@@ -230,19 +230,19 @@ var addPeerCmd = &cobra.Command{
return
}
var namespace string
var vault string
var peerString string
if len(args) == 1 {
namespace = "root"
vault = "root"
peerString = args[0]
} else {
namespace = args[0]
vault = args[0]
peerString = args[1]
}
var success *bool
np := rpc.NamespacePeer{ Namespace: namespace, Peer: peerString }
np := rpc.VaultPeer{ Vault: vault, Peer: peerString }
err = client.Call("Query.AddPeer", &np, &success)
if err != nil {
@@ -250,7 +250,11 @@ var addPeerCmd = &cobra.Command{
return
}
Logger.Info(*success)
if *success {
Logger.Infof("Added peer: %s", peerString)
} else {
Logger.Infof("Could not add peer: %s", peerString)
}
},
}
@@ -267,19 +271,19 @@ var removePeerCmd = &cobra.Command{
return
}
var namespace string
var vault string
var peerString string
if len(args) == 1 {
namespace = "root"
vault = "root"
peerString = args[0]
} else {
namespace = args[0]
vault = args[0]
peerString = args[1]
}
var success *bool
np := rpc.NamespacePeer{ Namespace: namespace, Peer: peerString }
np := rpc.VaultPeer{ Vault: vault, Peer: peerString }
err = client.Call("Query.DeletePeer", &np, &success)
if err != nil {
@@ -287,7 +291,11 @@ var removePeerCmd = &cobra.Command{
return
}
Logger.Info(*success)
if *success {
Logger.Infof("Removed peer: %s", peerString)
} else {
Logger.Infof("Could not find peer: %s", peerString)
}
},
}
@@ -304,26 +312,30 @@ var deleteCmd = &cobra.Command{
return
}
var namespace string
var vault string
var serviceName string
if len(args) == 1 {
namespace = "root"
vault = "root"
serviceName = args[0]
} else {
namespace = args[0]
vault = args[0]
serviceName = args[1]
}
var success *bool
np := rpc.NamespaceService{ Namespace: namespace, Service: serviceName }
np := rpc.VaultService{ Vault: vault, Service: serviceName }
err = client.Call("Query.Delete", &np, &success)
if err != nil {
Logger.Error(err)
}
Logger.Info(*success)
if *success {
Logger.Infof("Deleted password: %s", serviceName)
} else {
Logger.Infof("Could not find password: %s", serviceName)
}
},
}
@@ -336,20 +348,20 @@ func init() {
peerCmd.AddCommand(removePeerCmd)
peerCmd.AddCommand(infoCmd)
namespaceCmd.AddCommand(addNamespaceCmd)
namespaceCmd.AddCommand(deleteNamespaceCmd)
namespaceCmd.AddCommand(listNamespacesCmd)
vaultCmd.AddCommand(addVaultCmd)
vaultCmd.AddCommand(deleteVaultCmd)
vaultCmd.AddCommand(listVaultsCmd)
rootCmd.AddCommand(listCmd)
rootCmd.AddCommand(generateCmd)
rootCmd.AddCommand(showCmd)
rootCmd.AddCommand(deleteCmd)
rootCmd.AddCommand(peerCmd)
rootCmd.AddCommand(namespaceCmd)
rootCmd.AddCommand(vaultCmd)
}
func main() {
InitLogger(true)
InitLogger(false)
if err := rootCmd.Execute(); err != nil {
Logger.Error(err)
os.Exit(1)

View File

@@ -50,9 +50,6 @@ func main() {
Logger.Panic(err)
}
Logger.Info("Starting peer discovery...")
go storage.DiscoverPeers(ctx, h, dht)
Logger.Info("Initializing datastore...")
store, err := badger.NewDatastore(data, &badger.DefaultOptions)
if err != nil {
@@ -74,6 +71,9 @@ func main() {
Key: key,
}
Logger.Info("Starting peer discovery...")
go storageHandler.RunBackground(ctx, h, dht)
configPath := *dbPath + "/config.json"
Logger.Infof("Loading config from: %s", configPath)
Cfg, err := storageHandler.NewConfig(configPath)
@@ -85,14 +85,15 @@ func main() {
storageHandler.Config = Cfg
storageHandler.ConfigPath = configPath
Logger.Infof("Setting up Namespaces...")
storageHandler.InitNamespaces()
Logger.Infof("Setting up Vaults...")
storageHandler.InitVaults()
for _, val := range storageHandler.Namespaces {
for _, val := range storageHandler.Vaults {
defer val.Close()
}
Logger.Infof("Initialization complete!")
Logger.Infof("Serving RPC for ppass cli")
rpc.StorageHandler = &storageHandler
rpc.Serve(*dbPath)
}

21
go.mod
View File

@@ -12,6 +12,7 @@ require (
github.com/libp2p/go-libp2p v0.35.4
github.com/libp2p/go-libp2p-kad-dht v0.25.2
github.com/libp2p/go-libp2p-pubsub v0.11.0
github.com/mudler/edgevpn v0.28.3
github.com/multiformats/go-multiaddr v0.13.0
github.com/sirupsen/logrus v1.8.1
github.com/spf13/cobra v0.0.5
@@ -23,6 +24,8 @@ require (
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/c-robinson/iplib v1.0.8 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/containerd/cgroups v1.1.0 // indirect
@@ -94,7 +97,7 @@ require (
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/miekg/dns v1.1.61 // indirect
github.com/miekg/dns v1.1.62 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -109,7 +112,7 @@ require (
github.com/multiformats/go-multistream v0.5.0 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/onsi/ginkgo/v2 v2.19.1 // indirect
github.com/onsi/ginkgo/v2 v2.20.1 // indirect
github.com/opencontainers/runtime-spec v1.2.0 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
@@ -155,14 +158,14 @@ require (
go.uber.org/mock v0.4.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/crypto v0.25.0 // indirect
golang.org/x/crypto v0.26.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/mod v0.19.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/text v0.16.0 // indirect
golang.org/x/tools v0.23.0 // indirect
golang.org/x/mod v0.20.0 // indirect
golang.org/x/net v0.28.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.24.0 // indirect
golang.org/x/text v0.17.0 // indirect
golang.org/x/tools v0.24.0 // indirect
gonum.org/v1/gonum v0.15.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

49
go.sum
View File

@@ -33,6 +33,10 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
github.com/c-robinson/iplib v1.0.8 h1:exDRViDyL9UBLcfmlxxkY5odWX5092nPsQIykHXhIn4=
github.com/c-robinson/iplib v1.0.8/go.mod h1:i3LuuFL1hRT5gFpBRnEydzw8R6yhGkF4szNDIbF8pgo=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
@@ -316,8 +320,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -335,6 +339,8 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb
github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mudler/edgevpn v0.28.3 h1:yIuoMExwKHy/mNMBXIsm6FUFbnB9ELIxw9KXrK9KHDk=
github.com/mudler/edgevpn v0.28.3/go.mod h1:HWcdIwj5zBgOD04Hn3I+J5E5Yb3kK1CwwWaEe6/QERo=
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
@@ -363,10 +369,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/onsi/ginkgo/v2 v2.19.1 h1:QXgq3Z8Crl5EL1WBAC98A5sEBHARrAJNzAmMxzLcRF0=
github.com/onsi/ginkgo/v2 v2.19.1/go.mod h1:O3DtEWQkPa/F7fBMgmZQKKsluAy8pd3rEQdrjkPb9zA=
github.com/onsi/gomega v1.34.0 h1:eSSPsPNp6ZpsG8X1OVmOTxig+CblTc4AxpPBykhe2Os=
github.com/onsi/gomega v1.34.0/go.mod h1:MIKI8c+f+QLWk+hxbePD4i0LMJSExPaZOVfkoex4cAo=
github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo=
github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -479,8 +485,9 @@ github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5k
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
github.com/smartystreets/assertions v1.13.0 h1:Dx1kYM01xsSqKPno3aqLnrwac2LetPvN23diwyr69Qs=
github.com/smartystreets/assertions v1.13.0/go.mod h1:wDmR7qL282YbGsPy6H/yAsesrxfxaaSlJazyFLYVFx8=
github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg=
github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM=
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
@@ -579,8 +586,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
@@ -597,8 +604,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -622,8 +629,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -639,8 +646,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -671,8 +678,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -688,8 +695,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
@@ -713,8 +720,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

View File

@@ -20,21 +20,21 @@ var StorageHandler *storage.StorageHandler
type Query int
type NamespaceService struct {
Namespace string
type VaultService struct {
Vault string
Service string
}
type NamespacePeer struct {
Namespace string
type VaultPeer struct {
Vault string
Peer string
}
func (t *Query) Generate(np *NamespaceService, reply *crypto.Password) error {
val, ok := StorageHandler.Namespaces[np.Namespace]
func (t *Query) Generate(np *VaultService, reply *crypto.Password) error {
val, ok := StorageHandler.Vaults[np.Vault]
if !ok {
return fmt.Errorf("Namespace does not exist")
return fmt.Errorf("Vault does not exist")
}
password := crypto.NewPassword(crypto.DEFAULT_LENGTH)
@@ -59,12 +59,12 @@ func (t *Query) Generate(np *NamespaceService, reply *crypto.Password) error {
return nil
}
func (t *Query) Get(np *NamespaceService, reply *crypto.Password) error {
namespace := np.Namespace
val, ok := StorageHandler.Namespaces[namespace]
func (t *Query) Get(np *VaultService, reply *crypto.Password) error {
vault := np.Vault
val, ok := StorageHandler.Vaults[vault]
if !ok {
return fmt.Errorf("Namespace does not exist")
return fmt.Errorf("Vault does not exist")
}
v, err := val.GetPassword(np.Service)
@@ -85,12 +85,12 @@ func (t *Query) GetPeerString(_ *int, result *string) error {
return nil
}
func (t *Query) AddPeer(np *NamespacePeer, success *bool) error {
namespace := np.Namespace
val, ok := StorageHandler.Namespaces[namespace]
func (t *Query) AddPeer(np *VaultPeer, success *bool) error {
vault := np.Vault
val, ok := StorageHandler.Vaults[vault]
if !ok {
return fmt.Errorf("Namespace does not exist")
return fmt.Errorf("Vault does not exist")
}
peer, err := storage.PeerFromString(np.Peer)
@@ -107,12 +107,12 @@ func (t *Query) AddPeer(np *NamespacePeer, success *bool) error {
return nil
}
func (t *Query) DeletePeer(np *NamespacePeer, success *bool) error {
namespace := np.Namespace
val, ok := StorageHandler.Namespaces[namespace]
func (t *Query) DeletePeer(np *VaultPeer, success *bool) error {
vault := np.Vault
val, ok := StorageHandler.Vaults[vault]
if !ok {
return fmt.Errorf("Namespace does not exist")
return fmt.Errorf("Vault does not exist")
}
peer, err := storage.PeerFromString(np.Peer)
@@ -129,12 +129,12 @@ func (t *Query) DeletePeer(np *NamespacePeer, success *bool) error {
return nil
}
func (t *Query) Delete(np *NamespaceService, success *bool) error {
namespace := np.Namespace
val, ok := StorageHandler.Namespaces[namespace]
func (t *Query) Delete(np *VaultService, success *bool) error {
vault := np.Vault
val, ok := StorageHandler.Vaults[vault]
if !ok {
return fmt.Errorf("Namespace does not exist")
return fmt.Errorf("Vault does not exist")
}
err := val.Delete(np.Service)
@@ -147,25 +147,25 @@ func (t *Query) Delete(np *NamespaceService, success *bool) error {
return nil
}
func (t *Query) AddNamespace(namespace *string, _ *int) error {
_, err := StorageHandler.AddNamespace(*namespace)
func (t *Query) AddVault(vault *string, _ *int) error {
_, err := StorageHandler.AddVault(*vault)
return err
}
func (t *Query) DeleteNamespace(namespace *string, _ *int) error {
err := StorageHandler.DeleteNamespace(*namespace)
func (t *Query) DeleteVault(vault *string, _ *int) error {
err := StorageHandler.DeleteVault(*vault)
return err
}
func (t *Query) ListNamespaces(_ *int, reply *[]string) error {
*reply = StorageHandler.ListNamespaces()
func (t *Query) ListVaults(_ *int, reply *[]string) error {
*reply = StorageHandler.ListVaults()
return nil
}
func (t *Query) GetAllNames(namespace *string, reply *[]string) error {
Logger.Infof("Listing content of %s", *namespace)
func (t *Query) GetAllNames(vault *string, reply *[]string) error {
Logger.Infof("Listing content of %s", *vault)
val, ok := StorageHandler.Namespaces[*namespace]
val, ok := StorageHandler.Vaults[*vault]
if !ok {
return fmt.Errorf("Namesapce does not exist")

View File

@@ -11,7 +11,7 @@ import (
"sync"
"strings"
"github.com/ipfs/go-datastore/query"
"github.com/mudler/edgevpn/pkg/utils"
"github.com/libp2p/go-libp2p"
dht "github.com/libp2p/go-libp2p-kad-dht"
pubsub "github.com/libp2p/go-libp2p-pubsub"
@@ -21,7 +21,6 @@ import (
"github.com/libp2p/go-libp2p/core/network"
//"github.com/libp2p/go-libp2p/core/peerstore"
discovery "github.com/libp2p/go-libp2p/p2p/discovery/routing"
ds "github.com/ipfs/go-datastore"
ipfslite "github.com/hsanjuan/ipfs-lite"
"github.com/google/uuid"
@@ -29,18 +28,14 @@ import (
badger "github.com/ipfs/go-ds-badger2"
dsq "github.com/ipfs/go-datastore/query"
crdt "github.com/ipfs/go-ds-crdt"
crypto "github.com/libp2p/go-libp2p/core/crypto"
routed "github.com/libp2p/go-libp2p/p2p/host/routed"
agelib "filippo.io/age"
password "github.com/k4lipso/pentapass/internal/crypto"
"github.com/k4lipso/pentapass/internal/crypto/age"
. "github.com/k4lipso/pentapass/internal/log"
)
var (
topicNameFlag = "pentapass"
Listen = libp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/0")
)
@@ -80,15 +75,6 @@ func SetupLibp2pHost(ctx context.Context, dbPath string) (host host.Host, dht *d
Logger.Fatal(err)
}
//whitelistedPeers := map[peer.ID]struct{} {
// "12D3KooWLF7BU5VgpqWdS1XwSTFCLphENozhYQAj6i5LqU8BPZZZ": {},
// "12D3KooWBRvtW83QYnPgJCyVyAgMXtg71wjkGefVB2fBnm1A36kS": {},
// "12D3KooWMmc4kYy78vSumqWtPkUNAoPeCpJ66ysFv1U8S554B7e2": {},
//}
//connectionGater := &WhitelistConnectionGater{whitelistedPeers: whitelistedPeers}
//host, err = libp2p.New(libp2p.Identity(priv), libp2p.ConnectionGater(connectionGater), Listen)
host, err = libp2p.New(libp2p.Identity(priv), Listen)
if err != nil {
@@ -98,7 +84,6 @@ func SetupLibp2pHost(ctx context.Context, dbPath string) (host host.Host, dht *d
dht = initDHT(ctx, host)
host = routed.Wrap(host, dht)
return host, dht, nil
}
@@ -107,13 +92,13 @@ type Peer struct {
Key string `json:"Key"`
}
type NamespaceConfig struct {
type VaultConfig struct {
Name string `json:"Name"`
Id string `json:"Id"`
Peers []Peer `json:"Peers"`
}
type Config []NamespaceConfig
type Config []VaultConfig
type WhitelistConnectionGater struct {
@@ -148,7 +133,7 @@ func (wg *WhitelistConnectionGater) InterceptUpgraded(conn network.Conn) (allow
return wg.InterceptPeerDial(conn.RemotePeer()), 0
}
func GetTrustedPeers(config []NamespaceConfig) map[string][]Peer {
func GetTrustedPeers(config []VaultConfig) map[string][]Peer {
result := make(map[string][]Peer)
for _, c := range config {
result[c.Id] = c.Peers
@@ -161,16 +146,6 @@ func InitRootNs() {
//TODO: check if "SharedKeyRegistry" key exists, if not create
}
type Namespace struct {
ID string
Datastore *crdt.Datastore
//Registry *sharedKeyRegistry
CancelFunc context.CancelFunc
ctx context.Context
Key *agelib.X25519Identity
TrustedPeers []Peer
}
func PeerFromString(str string) (Peer, error) {
parts := strings.Split(str, "/")
@@ -182,183 +157,6 @@ func PeerFromString(str string) (Peer, error) {
return Peer{ Id: parts[0], Key: parts[1] }, nil
}
func (n *Namespace) AddPeer(peer Peer) {
for _, CurrentPeer := range n.TrustedPeers {
if CurrentPeer.Id == peer.Id && CurrentPeer.Key == peer.Key {
return
}
}
n.TrustedPeers = append(n.TrustedPeers, peer)
}
func (n *Namespace) RemovePeer(peer Peer) {
var Peers []Peer
for _, CurrentPeer := range n.TrustedPeers {
if CurrentPeer.Id == peer.Id && CurrentPeer.Key == peer.Key {
continue
}
Peers = append(Peers, CurrentPeer)
}
n.TrustedPeers = Peers
}
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))
if err != nil {
printErr(err)
}
return err
}
func (n *Namespace) Delete(k string) error {
key := ds.NewKey(k)
err := n.Datastore.Delete(n.ctx, key)
if err != nil {
printErr(err)
}
return err
}
func (n *Namespace) GetPassword(k string) (password.Password, error) {
v, err := n.Datastore.Get(n.ctx, ds.NewKey(k))
if err != nil {
printErr(err)
return password.Password{}, err
}
val, err := age.Decrypt(v, n.Key)
if err != nil {
printErr(err)
return password.Password{}, err
}
pw, err := password.GetPasswordFromJson(val)
if err != nil {
printErr(err)
return password.Password{}, err
}
return pw, nil
}
func (n *Namespace) Get(k string) (string, error) {
v, err := n.Datastore.Get(n.ctx, ds.NewKey(k))
if err != nil {
printErr(err)
return "", err
}
return string(v), nil
}
func (n *Namespace) GetAllNames() []string {
q := query.Query{}
results, err := n.Datastore.Query(n.ctx, q)
if err != nil {
printErr(err)
}
var result []string
for r := range results.Next() {
if r.Error != nil {
printErr(err)
continue
}
result = append(result, r.Key)
}
return result
}
func (n *Namespace) List() {
q := query.Query{}
results, err := n.Datastore.Query(n.ctx, q)
if err != nil {
printErr(err)
}
for r := range results.Next() {
if r.Error != nil {
printErr(err)
continue
}
val, err := age.Decrypt(r.Value, n.Key)
if err != nil {
printErr(err)
continue
}
Logger.Infof("[%s] -> %s\n", r.Key, string(val))
}
}
func (n *Namespace) GetAllPasswords() ([]password.Password, error) {
q := query.Query{}
results, err := n.Datastore.Query(n.ctx, q)
if err != nil {
return nil, fmt.Errorf("Error during GetAllPasswords: %s", err)
}
var result []password.Password
for r := range results.Next() {
if r.Error != nil {
printErr(err)
continue
}
val, err := age.Decrypt(r.Value, n.Key)
if err != nil {
printErr(err)
continue
}
pw, err := password.GetPasswordFromJson(val)
if err != nil {
printErr(err)
continue
}
result = append(result, pw)
}
return result, nil
}
func (n *Namespace) Close() {
n.CancelFunc()
n.Datastore.Close()
}
type StorageHandler struct {
Ctx context.Context
Store *badger.Datastore
@@ -366,8 +164,8 @@ type StorageHandler struct {
Ipfs *ipfslite.Peer
PubSub *pubsub.PubSub
Key *agelib.X25519Identity
Config []NamespaceConfig
Namespaces map[string]*Namespace
Config []VaultConfig
Vaults map[string]*Vault
ConfigPath string
}
@@ -385,21 +183,21 @@ func (s *StorageHandler) UpdateConfig() {
}
func (s *StorageHandler) recreateConfig() {
var newCfg []NamespaceConfig
for key, val := range s.Namespaces {
newCfg = append(newCfg, NamespaceConfig{
var newCfg []VaultConfig
for key, val := range s.Vaults {
newCfg = append(newCfg, VaultConfig{
Name: key,
Id: val.ID,
Peers: val.TrustedPeers,
})
}
s.Config = newCfg
//for idx, namespaceConfig := range s.Config {
// s.Config[idx].Peers = s.Namespaces[namespaceConfig.Name].TrustedPeers
//for idx, vaultConfig := range s.Config {
// s.Config[idx].Peers = s.Vaults[vaultConfig.Name].TrustedPeers
//}
}
func (s *StorageHandler) writeConfig(filename string, config []NamespaceConfig) error {
func (s *StorageHandler) writeConfig(filename string, config []VaultConfig) error {
jsonData, err := json.Marshal(config)
if err != nil {
@@ -416,9 +214,9 @@ func (s *StorageHandler) writeConfig(filename string, config []NamespaceConfig)
return nil
}
func (s *StorageHandler) NewConfig(filename string) ([]NamespaceConfig, error) {
func (s *StorageHandler) NewConfig(filename string) ([]VaultConfig, error) {
if _, err := os.Stat(filename); errors.Is(err, os.ErrNotExist) {
err := s.writeConfig(filename, []NamespaceConfig{
err := s.writeConfig(filename, []VaultConfig{
{
Name: "root",
Id: uuid.New().String(),
@@ -442,7 +240,7 @@ func (s *StorageHandler) NewConfig(filename string) ([]NamespaceConfig, error) {
return nil, fmt.Errorf("Could not read config file: %s", err)
}
var result []NamespaceConfig
var result []VaultConfig
err = json.Unmarshal(content, &result)
@@ -453,29 +251,29 @@ func (s *StorageHandler) NewConfig(filename string) ([]NamespaceConfig, error) {
return result, nil
}
func (s *StorageHandler) GetDefaultNamespace(Name string) *Namespace {
return s.Namespaces["root"]
func (s *StorageHandler) GetDefaultVault(Name string) *Vault {
return s.Vaults["root"]
}
func (s *StorageHandler) InitNamespaces() {
NamespaceMap := make(map[string]*Namespace)
func (s *StorageHandler) InitVaults() {
VaultMap := make(map[string]*Vault)
for _, nsCfg := range s.Config {
ns1, err := CreateNamespace(nsCfg.Id, s)
ns1, err := CreateVault(nsCfg.Id, s)
if err != nil {
Logger.Fatal(err)
}
NamespaceMap[nsCfg.Name] = ns1
VaultMap[nsCfg.Name] = ns1
}
s.Namespaces = NamespaceMap
s.Vaults = VaultMap
}
func IsTrustedPeer(ctx context.Context, id peer.ID, namespace string, config []NamespaceConfig) bool {
func IsTrustedPeer(ctx context.Context, id peer.ID, vault string, config []VaultConfig) bool {
peerMap := GetTrustedPeers(config)
val, ok := peerMap[namespace]
val, ok := peerMap[vault]
if ok {
for _, v := range val {
@@ -498,100 +296,48 @@ func PrintDBContent(ctx context.Context, store *badger.Datastore) {
}
}
func (s *StorageHandler) ListNamespaces() []string {
func (s *StorageHandler) ListVaults() []string {
var result []string
for k := range s.Namespaces {
for k := range s.Vaults {
result = append(result, k)
}
return result
}
func (s *StorageHandler) DeleteNamespace(ID string) error {
ns, ok := s.Namespaces[ID]
func (s *StorageHandler) DeleteVault(ID string) error {
ns, ok := s.Vaults[ID]
if !ok {
Logger.Debug("DeleteNamespace that does not exists")
Logger.Debug("DeleteVault that does not exists")
return nil
}
delete(s.Namespaces, ID)
delete(s.Vaults, ID)
ns.Close()
s.UpdateConfig()
return nil
}
func (s *StorageHandler) AddNamespace(Name string) (*Namespace, error) {
ns, ok := s.Namespaces[Name]
func (s *StorageHandler) AddVault(Name string) (*Vault, error) {
ns, ok := s.Vaults[Name]
if ok {
return ns, nil
}
result, err := CreateNamespace(uuid.New().String(), s)
result, err := CreateVault(uuid.New().String(), s)
if err != nil {
return nil, err
}
result.TrustedPeers = append(result.TrustedPeers, s.GetSelfPeer())
s.Namespaces[Name] = result
s.Vaults[Name] = result
s.UpdateConfig()
return result, nil
}
func CreateNamespace(ID string, storageHandler *StorageHandler) (*Namespace, error) {
Logger.Infof("Creating Namespace %s\n", ID)
err := storageHandler.PubSub.RegisterTopicValidator(
ID, //== topicName
func(ctx context.Context, id peer.ID, msg *pubsub.Message) bool {
Logger.Debugf("PubSubmsg TOPIC: %s, PEER: %s\n", ID, id)
signer := msg.GetFrom()
trusted := IsTrustedPeer(ctx, signer, ID, storageHandler.Config)
if !trusted {
Logger.Debugf("discarded pubsub message from non trusted source %s\n", signer)
}
return trusted
},
)
if err != nil {
Logger.Errorf("error registering topic validator: %s", err)
}
psubCtx, psubCancel := context.WithCancel(storageHandler.Ctx)
pubsubBC, err := crdt.NewPubSubBroadcaster(psubCtx, storageHandler.PubSub, ID)
if err != nil {
Logger.Fatal(err)
}
opts := crdt.DefaultOptions()
//opts.Logger = Logger
opts.RebroadcastInterval = 5 * time.Second
opts.PutHook = func(k ds.Key, v []byte) {
Logger.Infof("Added: [%s]\n", k)
}
opts.DeleteHook = func(k ds.Key) {
Logger.Infof("Removed: [%s]\n", k)
}
crdt, err := crdt.New(storageHandler.Store, ds.NewKey(ID), storageHandler.Ipfs, pubsubBC, opts)
if err != nil {
Logger.Fatal(err)
psubCancel()
return nil, err
}
PeerMap := GetTrustedPeers(storageHandler.Config)
val, ok := PeerMap[ID]
if !ok {
Logger.Debug("namespace config does not contain any peers")
}
return &Namespace{ID: ID, Datastore: crdt, CancelFunc: psubCancel, ctx: storageHandler.Ctx, Key: storageHandler.Key, TrustedPeers: val}, nil
}
func initDHT(ctx context.Context, h host.Host) *dht.IpfsDHT {
// Start a DHT, for use in peer discovery. We can't just make a new DHT
@@ -602,9 +348,16 @@ func initDHT(ctx context.Context, h host.Host) *dht.IpfsDHT {
if err != nil {
panic(err)
}
if err = kademliaDHT.Bootstrap(ctx); err != nil {
panic(err)
}
// if err = kademliaDHT.Bootstrap(ctx); err != nil {
// panic(err)
// }
return kademliaDHT
}
func (s *StorageHandler) bootstrapPeers(ctx context.Context, h host.Host) {
Logger.Info("Bootstrapping DHT")
var wg sync.WaitGroup
for _, peerAddr := range dht.DefaultBootstrapPeers {
peerinfo, _ := peer.AddrInfoFromP2pAddr(peerAddr)
@@ -619,35 +372,75 @@ func initDHT(ctx context.Context, h host.Host) *dht.IpfsDHT {
}()
}
wg.Wait()
return kademliaDHT
}
func DiscoverPeers(ctx context.Context, h host.Host, dht *dht.IpfsDHT) {
routingDiscovery := discovery.NewRoutingDiscovery(dht)
routingDiscovery.Advertise(ctx, topicNameFlag)
func (s *StorageHandler) RunBackground(ctx context.Context, h host.Host, dht *dht.IpfsDHT) {
s.discoverPeers(ctx, h, dht)
t := utils.NewBackoffTicker(utils.BackoffInitialInterval(2 * time.Minute),
utils.BackoffMaxInterval(6 * time.Minute))
defer t.Stop()
for {
select {
case <-t.C:
// We announce ourselves to the rendezvous point for all the peers.
// We have a safeguard of 1 hour to avoid blocking the main loop
// in case of network issues.
// The TTL of DHT is by default no longer than 3 hours, so we should
// be safe by having an entry less than that.
safeTimeout, cancel := context.WithTimeout(ctx, time.Hour)
// Look for others who have announced and attempt to connect to them
anyConnected := false
Logger.Debugf("Own Id: %s\n", h.ID())
for !anyConnected {
time.Sleep(2 * time.Second)
Logger.Debug("Searching for peers...")
peerChan, err := routingDiscovery.FindPeers(ctx, topicNameFlag)
if err != nil {
panic(err)
endChan := make(chan struct{})
go func() {
s.discoverPeers(safeTimeout, h, dht)
endChan <- struct{}{}
}()
select {
case <-endChan:
cancel()
case <-safeTimeout.Done():
Logger.Error("Timeout while peer discovery")
cancel()
}
case <-ctx.Done():
return
}
}
}
func (s *StorageHandler) discoverPeers(ctx context.Context, h host.Host, dht *dht.IpfsDHT) error {
s.bootstrapPeers(ctx, h)
time.Sleep(2 * time.Second)
for vaultName, v := range s.Vaults {
Logger.Debugf("Announcing vault \"%s\" with id: %s", vaultName, v.ID)
routingDiscovery := discovery.NewRoutingDiscovery(dht)
routingDiscovery.Advertise(ctx, v.ID)
Logger.Debugf("Start peer discovery...")
timedCtx, cf := context.WithTimeout(ctx, time.Second*120)
defer cf()
peerChan, err := routingDiscovery.FindPeers(timedCtx, v.ID)
if err != nil {
return err
}
for peer := range peerChan {
if peer.ID == h.ID() || len(peer.Addrs) == 0 {
continue // No self connection
}
Logger.Debugf("Found peer with id %s", peer.ID.String())
if h.Network().Connectedness(peer.ID) == network.Connected {
Logger.Debugf("Already connected to %s", peer.ID.String())
continue
}
Logger.Debugf("Connecting to peer with id %s", peer.ID.String())
err := h.Connect(ctx, peer)
timeoutCtx, cancel := context.WithTimeout(ctx, time.Second*120)
defer cancel()
err := h.Connect(timeoutCtx, peer)
if err != nil {
Logger.Debugf("Failed connecting to %s, error: %s\n", peer.ID, err)
} else {
@@ -655,7 +448,9 @@ func DiscoverPeers(ctx context.Context, h host.Host, dht *dht.IpfsDHT) {
}
}
}
Logger.Debugf("Peer discovery complete")
Logger.Debug("Peer discovery complete")
return nil
}
func printErr(err error) {

262
internal/storage/vault.go Normal file
View File

@@ -0,0 +1,262 @@
package storage
import (
"context"
"fmt"
"time"
"github.com/ipfs/go-datastore/query"
pubsub "github.com/libp2p/go-libp2p-pubsub"
"github.com/libp2p/go-libp2p/core/peer"
ds "github.com/ipfs/go-datastore"
crdt "github.com/ipfs/go-ds-crdt"
agelib "filippo.io/age"
password "github.com/k4lipso/pentapass/internal/crypto"
"github.com/k4lipso/pentapass/internal/crypto/age"
. "github.com/k4lipso/pentapass/internal/log"
)
type Vault struct {
ID string
Datastore *crdt.Datastore
//Registry *sharedKeyRegistry
CancelFunc context.CancelFunc
ctx context.Context
Key *agelib.X25519Identity
TrustedPeers []Peer
}
func (n *Vault) AddPeer(peer Peer) {
for _, CurrentPeer := range n.TrustedPeers {
if CurrentPeer.Id == peer.Id && CurrentPeer.Key == peer.Key {
return
}
}
n.TrustedPeers = append(n.TrustedPeers, peer)
}
func (n *Vault) RemovePeer(peer Peer) {
var Peers []Peer
for _, CurrentPeer := range n.TrustedPeers {
if CurrentPeer.Id == peer.Id && CurrentPeer.Key == peer.Key {
continue
}
Peers = append(Peers, CurrentPeer)
}
n.TrustedPeers = Peers
}
func (n *Vault) GetRecipients() []string {
var result []string
for _, peer := range n.TrustedPeers {
result = append(result, peer.Key)
}
return result
}
func (n *Vault) Put(k string, v string) error {
key := ds.NewKey(k)
err := n.Datastore.Put(n.ctx, key, []byte(v))
if err != nil {
printErr(err)
}
return err
}
func (n *Vault) Delete(k string) error {
key := ds.NewKey(k)
err := n.Datastore.Delete(n.ctx, key)
if err != nil {
printErr(err)
}
return err
}
func (n *Vault) GetPassword(k string) (password.Password, error) {
v, err := n.Datastore.Get(n.ctx, ds.NewKey(k))
if err != nil {
printErr(err)
return password.Password{}, err
}
val, err := age.Decrypt(v, n.Key)
if err != nil {
printErr(err)
return password.Password{}, err
}
pw, err := password.GetPasswordFromJson(val)
if err != nil {
printErr(err)
return password.Password{}, err
}
return pw, nil
}
func (n *Vault) Get(k string) (string, error) {
v, err := n.Datastore.Get(n.ctx, ds.NewKey(k))
if err != nil {
printErr(err)
return "", err
}
return string(v), nil
}
func (n *Vault) GetAllNames() []string {
q := query.Query{}
results, err := n.Datastore.Query(n.ctx, q)
if err != nil {
printErr(err)
}
var result []string
for r := range results.Next() {
if r.Error != nil {
printErr(err)
continue
}
result = append(result, r.Key)
}
return result
}
func (n *Vault) List() {
q := query.Query{}
results, err := n.Datastore.Query(n.ctx, q)
if err != nil {
printErr(err)
}
for r := range results.Next() {
if r.Error != nil {
printErr(err)
continue
}
val, err := age.Decrypt(r.Value, n.Key)
if err != nil {
printErr(err)
continue
}
Logger.Infof("[%s] -> %s\n", r.Key, string(val))
}
}
func (n *Vault) GetAllPasswords() ([]password.Password, error) {
q := query.Query{}
results, err := n.Datastore.Query(n.ctx, q)
if err != nil {
return nil, fmt.Errorf("Error during GetAllPasswords: %s", err)
}
var result []password.Password
for r := range results.Next() {
if r.Error != nil {
printErr(err)
continue
}
val, err := age.Decrypt(r.Value, n.Key)
if err != nil {
printErr(err)
continue
}
pw, err := password.GetPasswordFromJson(val)
if err != nil {
printErr(err)
continue
}
result = append(result, pw)
}
return result, nil
}
func (n *Vault) Close() {
n.CancelFunc()
n.Datastore.Close()
}
func CreateVault(ID string, storageHandler *StorageHandler) (*Vault, error) {
Logger.Infof("Creating Vault %s\n", ID)
err := storageHandler.PubSub.RegisterTopicValidator(
ID, //== topicName
func(ctx context.Context, id peer.ID, msg *pubsub.Message) bool {
if id == storageHandler.Host.ID() {
return false
}
Logger.Debugf("PubSubmsg TOPIC: %s, PEER: %s\n", ID, id)
trusted := IsTrustedPeer(ctx, id, ID, storageHandler.Config)
if !trusted {
Logger.Debugf("discarded pubsub message from non trusted source %s\n", id)
}
return trusted
},
)
if err != nil {
Logger.Errorf("error registering topic validator: %s", err)
}
psubCtx, psubCancel := context.WithCancel(storageHandler.Ctx)
pubsubBC, err := crdt.NewPubSubBroadcaster(psubCtx, storageHandler.PubSub, ID)
if err != nil {
Logger.Fatal(err)
}
opts := crdt.DefaultOptions()
//opts.Logger = Logger
opts.RebroadcastInterval = 5 * time.Second
opts.PutHook = func(k ds.Key, v []byte) {
Logger.Infof("Added: [%s]\n", k)
}
opts.DeleteHook = func(k ds.Key) {
Logger.Infof("Removed: [%s]\n", k)
}
crdt, err := crdt.New(storageHandler.Store, ds.NewKey(ID), storageHandler.Ipfs, pubsubBC, opts)
if err != nil {
Logger.Fatal(err)
psubCancel()
return nil, err
}
PeerMap := GetTrustedPeers(storageHandler.Config)
val, ok := PeerMap[ID]
if !ok {
Logger.Debug("vault config does not contain any peers")
}
return &Vault{ID: ID, Datastore: crdt, CancelFunc: psubCancel, ctx: storageHandler.Ctx, Key: storageHandler.Key, TrustedPeers: val}, nil
}