diff --git a/server/control/server.go b/server/control/server.go index 131d116..ea32f64 100644 --- a/server/control/server.go +++ b/server/control/server.go @@ -30,6 +30,10 @@ func NewServer(cfg Config) (*Server, error) { return nil, fmt.Errorf("config store open: %w", err) } + if err := cfg.Stores.RemoveDeprecated(); err != nil { + cfg.Logger.Warn("could not remove deprecated stores", "err", err) + } + relays, err := newRelayServer(cfg.RelaysIngress, cfg.RelaysAuth, configStore, cfg.Stores, cfg.Logger) if err != nil { return nil, fmt.Errorf("create relay server: %w", err) diff --git a/server/control/store.go b/server/control/store.go index 4454e88..0638047 100644 --- a/server/control/store.go +++ b/server/control/store.go @@ -3,6 +3,8 @@ package control import ( "crypto/x509" "encoding/json" + "errors" + "os" "path/filepath" "github.com/connet-dev/connet/model" @@ -17,6 +19,8 @@ type Stores interface { ClientPeers() (logc.KV[ClientPeerKey, ClientPeerValue], error) RelayDirects() (logc.KV[RelayConnKey, RelayDirectValue], error) + + RemoveDeprecated() error } func NewFileStores(dir string) Stores { @@ -43,6 +47,16 @@ func (f *fileStores) RelayDirects() (logc.KV[RelayConnKey, RelayDirectValue], er return logc.NewKV[RelayConnKey, RelayDirectValue](filepath.Join(f.dir, "relay-directs")) } +func (f *fileStores) RemoveDeprecated() error { + return errors.Join( + os.RemoveAll(filepath.Join(f.dir, "relay-conns")), + os.RemoveAll(filepath.Join(f.dir, "relay-clients")), + os.RemoveAll(filepath.Join(f.dir, "relay-endpoints")), + os.RemoveAll(filepath.Join(f.dir, "relay-servers")), + os.RemoveAll(filepath.Join(f.dir, "relay-server-offsets")), + ) +} + type ConfigKey string var ( diff --git a/server/relay/server.go b/server/relay/server.go index ab63713..459c6e0 100644 --- a/server/relay/server.go +++ b/server/relay/server.go @@ -47,6 +47,10 @@ func NewServer(cfg Config) (*Server, error) { return nil, fmt.Errorf("relay stores: %w", err) } + if err := cfg.Stores.RemoveDeprecated(); err != nil { + cfg.Logger.Warn("could not remove deprecated stores", "err", err) + } + statelessResetVal, err := configStore.GetOrInit(configStatelessReset, func(ck ConfigKey) (ConfigValue, error) { var key quic.StatelessResetKey if _, err := io.ReadFull(rand.Reader, key[:]); err != nil { diff --git a/server/relay/store.go b/server/relay/store.go index e0ed1bc..e8e7f07 100644 --- a/server/relay/store.go +++ b/server/relay/store.go @@ -1,19 +1,17 @@ package relay import ( - "crypto/x509" - "encoding/json" + "errors" + "os" "path/filepath" - "github.com/connet-dev/connet/model" - "github.com/connet-dev/connet/pkg/certc" "github.com/connet-dev/connet/pkg/logc" ) type Stores interface { Config() (logc.KV[ConfigKey, ConfigValue], error) - Clients() (logc.KV[ClientKey, ClientValue], error) - Servers() (logc.KV[ServerKey, ServerValue], error) + + RemoveDeprecated() error } func NewFileStores(dir string) Stores { @@ -28,12 +26,11 @@ func (f *fileStores) Config() (logc.KV[ConfigKey, ConfigValue], error) { return logc.NewKV[ConfigKey, ConfigValue](filepath.Join(f.dir, "config")) } -func (f *fileStores) Clients() (logc.KV[ClientKey, ClientValue], error) { - return logc.NewKV[ClientKey, ClientValue](filepath.Join(f.dir, "clients")) -} - -func (f *fileStores) Servers() (logc.KV[ServerKey, ServerValue], error) { - return logc.NewKV[ServerKey, ServerValue](filepath.Join(f.dir, "servers")) +func (f *fileStores) RemoveDeprecated() error { + return errors.Join( + os.RemoveAll(filepath.Join(f.dir, "clients")), + os.RemoveAll(filepath.Join(f.dir, "servers")), + ) } type ConfigKey string @@ -49,104 +46,3 @@ type ConfigValue struct { String string `json:"string,omitempty"` Bytes []byte `json:"bytes,omitempty"` } - -type ClientKey struct { - Endpoint model.Endpoint `json:"endpoint"` - Role model.Role `json:"role"` - Key model.Key `json:"key"` -} - -type ClientValue struct { - Cert *x509.Certificate `json:"cert"` -} - -func (v ClientValue) MarshalJSON() ([]byte, error) { - return certc.MarshalJSONCert(v.Cert) -} - -func (v *ClientValue) UnmarshalJSON(b []byte) error { - cert, err := certc.UnmarshalJSONCert(b) - if err != nil { - return err - } - - *v = ClientValue{cert} - return nil -} - -type ServerKey struct { - Endpoint model.Endpoint `json:"endpoint"` -} - -type ServerValue struct { - Name string `json:"name"` - Cert *certc.Cert `json:"cert"` - Clients map[serverClientKey]ClientValue `json:"clients"` -} - -func (v ServerValue) MarshalJSON() ([]byte, error) { - cert, key, err := v.Cert.EncodeToMemory() - if err != nil { - return nil, err - } - - s := struct { - Name string `json:"name"` - Cert []byte `json:"cert"` - CertKey []byte `json:"cert_key"` - Clients []serverClientValue `json:"clients"` - }{ - Name: v.Name, - Cert: cert, - CertKey: key, - } - - for k, v := range v.Clients { - s.Clients = append(s.Clients, serverClientValue{ - Role: k.Role, - Value: v, - }) - } - - return json.Marshal(s) -} - -func (v *ServerValue) UnmarshalJSON(b []byte) error { - s := struct { - Name string `json:"name"` - Cert []byte `json:"cert"` - CertKey []byte `json:"cert_key"` - Clients []serverClientValue `json:"clients"` - }{} - if err := json.Unmarshal(b, &s); err != nil { - return err - } - - cert, err := certc.DecodeFromMemory(s.Cert, s.CertKey) - if err != nil { - return err - } - - sv := ServerValue{ - Name: s.Name, - Cert: cert, - Clients: map[serverClientKey]ClientValue{}, - } - - for _, cl := range s.Clients { - sv.Clients[serverClientKey{cl.Role, model.NewKey(cl.Value.Cert)}] = cl.Value - } - - *v = sv - return nil -} - -type serverClientKey struct { - Role model.Role `json:"role"` - Key model.Key `json:"key"` -} - -type serverClientValue struct { - Role model.Role `json:"role"` - Value ClientValue `json:"value"` -}