Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions server/control/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
14 changes: 14 additions & 0 deletions server/control/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package control
import (
"crypto/x509"
"encoding/json"
"errors"
"os"
"path/filepath"

"github.com/connet-dev/connet/model"
Expand All @@ -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 {
Expand All @@ -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 (
Expand Down
4 changes: 4 additions & 0 deletions server/relay/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
122 changes: 9 additions & 113 deletions server/relay/store.go
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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
Expand All @@ -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"`
}