From 45300d1f90f930f60f993396f7f608e85f6ee904 Mon Sep 17 00:00:00 2001 From: Nikolay Petrov Date: Mon, 9 Feb 2026 22:55:35 -0500 Subject: [PATCH] remove deprecated protocols; rename relays --- client.go | 2 +- endpoint.go | 2 +- model/protos.go | 3 +-- peer.go | 8 +++--- proto/client.proto | 4 +-- proto/pbclient/client.pb.go | 50 ++++++++++++++++++------------------- server/control/clients.go | 8 +++--- server/control/relays.go | 14 +++++------ 8 files changed, 45 insertions(+), 46 deletions(-) diff --git a/client.go b/client.go index 4b77116..09fa148 100644 --- a/client.go +++ b/client.go @@ -307,7 +307,7 @@ func (c *Client) connect(ctx context.Context, transport *quic.Transport, retoken conn, err := transport.Dial(ctx, c.controlAddr, &tls.Config{ ServerName: c.controlHost, RootCAs: c.controlCAs, - NextProtos: iterc.MapVarStrings(model.ClientControlV03, model.ClientControlV02), + NextProtos: iterc.MapVarStrings(model.ClientControlV03), }, quicc.ClientConfig(c.handshakeIdleTimeout)) if err != nil { return nil, fmt.Errorf("dial server %s: %w", c.controlAddr, err) diff --git a/endpoint.go b/endpoint.go index 0ab2bd7..7b73c6c 100644 --- a/endpoint.go +++ b/endpoint.go @@ -283,7 +283,7 @@ func (ep *endpoint) runRelay(ctx context.Context, conn *quic.Conn) error { return fmt.Errorf("relay unexpected response") } - ep.peer.setRelays(resp.Relay.Directs) + ep.peer.setRelays(resp.Relay.Relays) } }) diff --git a/model/protos.go b/model/protos.go index cf856df..1465ec1 100644 --- a/model/protos.go +++ b/model/protos.go @@ -13,7 +13,7 @@ func (v ClientControlNextProto) String() string { func GetClientControlNextProto(conn *quic.Conn) ClientControlNextProto { proto := conn.ConnectionState().TLS.NegotiatedProtocol - for _, v := range []ClientControlNextProto{ClientControlV03, ClientControlV02} { + for _, v := range []ClientControlNextProto{ClientControlV03} { if v.string == proto { return v } @@ -23,7 +23,6 @@ func GetClientControlNextProto(conn *quic.Conn) ClientControlNextProto { var ( ClientControlUnknown = ClientControlNextProto{} - ClientControlV02 = ClientControlNextProto{"connet-client/0.2"} // 0.8.0 ClientControlV03 = ClientControlNextProto{"connet-client/0.3"} // 0.13.0 // Update GetClientControlNextProto when adding a new one ) diff --git a/peer.go b/peer.go index ca62d58..4916af6 100644 --- a/peer.go +++ b/peer.go @@ -29,7 +29,7 @@ import ( type peer struct { self *notify.V[*pbclient.Peer] - relays *notify.V[[]*pbclient.DirectRelay] + relays *notify.V[[]*pbclient.Relay] relayConns *notify.V[map[relayID]*quic.Conn] peers *notify.V[[]*pbclient.RemotePeer] @@ -119,7 +119,7 @@ func newPeer(direct *directServer, addrs *notify.V[advertiseAddrs], metadata str ClientCertificate: clientTLSCert.Leaf.Raw, }), - relays: notify.NewEmpty[[]*pbclient.DirectRelay](), + relays: notify.NewEmpty[[]*pbclient.Relay](), relayConns: notify.NewEmpty[map[relayID]*quic.Conn](), peers: notify.NewEmpty[[]*pbclient.RemotePeer](), @@ -135,7 +135,7 @@ func newPeer(direct *directServer, addrs *notify.V[advertiseAddrs], metadata str }, nil } -func (p *peer) setRelays(relays []*pbclient.DirectRelay) { +func (p *peer) setRelays(relays []*pbclient.Relay) { p.relays.Set(relays) } @@ -172,7 +172,7 @@ func (p *peer) runDirectAddrs(ctx context.Context) error { func (p *peer) runRelays(ctx context.Context) error { runningRelays := map[relayID]*relay{} - return p.relays.Listen(ctx, func(relays []*pbclient.DirectRelay) error { + return p.relays.Listen(ctx, func(relays []*pbclient.Relay) error { p.logger.Debug("relays updated", "len", len(relays)) activeRelays := map[relayID]struct{}{} diff --git a/proto/client.proto b/proto/client.proto index 41d12da..f200309 100644 --- a/proto/client.proto +++ b/proto/client.proto @@ -48,7 +48,7 @@ message Response { repeated RemotePeer peers = 1; } message Relays { - repeated DirectRelay directs = 2; + repeated Relay relays = 2; } } @@ -65,7 +65,7 @@ message RemotePeer { Peer peer = 8; } -message DirectRelay { +message Relay { string id = 1; // relay id as assigned by the control server repeated model.HostPort addresses = 2; bytes server_certificate = 3; // generic certificate used by this relay diff --git a/proto/pbclient/client.pb.go b/proto/pbclient/client.pb.go index 4381e9c..0eb9100 100644 --- a/proto/pbclient/client.pb.go +++ b/proto/pbclient/client.pb.go @@ -393,7 +393,7 @@ func (x *RemotePeer) GetPeer() *Peer { return nil } -type DirectRelay struct { +type Relay struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // relay id as assigned by the control server Addresses []*pbmodel.HostPort `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` @@ -404,20 +404,20 @@ type DirectRelay struct { sizeCache protoimpl.SizeCache } -func (x *DirectRelay) Reset() { - *x = DirectRelay{} +func (x *Relay) Reset() { + *x = Relay{} mi := &file_client_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DirectRelay) String() string { +func (x *Relay) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DirectRelay) ProtoMessage() {} +func (*Relay) ProtoMessage() {} -func (x *DirectRelay) ProtoReflect() protoreflect.Message { +func (x *Relay) ProtoReflect() protoreflect.Message { mi := &file_client_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -429,40 +429,40 @@ func (x *DirectRelay) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DirectRelay.ProtoReflect.Descriptor instead. -func (*DirectRelay) Descriptor() ([]byte, []int) { +// Deprecated: Use Relay.ProtoReflect.Descriptor instead. +func (*Relay) Descriptor() ([]byte, []int) { return file_client_proto_rawDescGZIP(), []int{6} } -func (x *DirectRelay) GetId() string { +func (x *Relay) GetId() string { if x != nil { return x.Id } return "" } -func (x *DirectRelay) GetAddresses() []*pbmodel.HostPort { +func (x *Relay) GetAddresses() []*pbmodel.HostPort { if x != nil { return x.Addresses } return nil } -func (x *DirectRelay) GetServerCertificate() []byte { +func (x *Relay) GetServerCertificate() []byte { if x != nil { return x.ServerCertificate } return nil } -func (x *DirectRelay) GetAuthentication() []byte { +func (x *Relay) GetAuthentication() []byte { if x != nil { return x.Authentication } return nil } -func (x *DirectRelay) GetMetadata() string { +func (x *Relay) GetMetadata() string { if x != nil { return x.Metadata } @@ -635,7 +635,7 @@ func (x *Response_Announce) GetPeers() []*RemotePeer { type Response_Relays struct { state protoimpl.MessageState `protogen:"open.v1"` - Directs []*DirectRelay `protobuf:"bytes,2,rep,name=directs,proto3" json:"directs,omitempty"` + Relays []*Relay `protobuf:"bytes,2,rep,name=relays,proto3" json:"relays,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -670,9 +670,9 @@ func (*Response_Relays) Descriptor() ([]byte, []int) { return file_client_proto_rawDescGZIP(), []int{3, 1} } -func (x *Response_Relays) GetDirects() []*DirectRelay { +func (x *Response_Relays) GetRelays() []*Relay { if x != nil { - return x.Directs + return x.Relays } return nil } @@ -701,15 +701,15 @@ const file_client_proto_rawDesc = "" + "\x05Relay\x12+\n" + "\bendpoint\x18\x01 \x01(\v2\x0f.model.EndpointR\bendpoint\x12\x1f\n" + "\x04role\x18\x02 \x01(\x0e2\v.model.RoleR\x04role\x12-\n" + - "\x12client_certificate\x18\x03 \x01(\fR\x11clientCertificate\"\x83\x02\n" + + "\x12client_certificate\x18\x03 \x01(\fR\x11clientCertificate\"\xfb\x01\n" + "\bResponse\x12\"\n" + "\x05error\x18\x01 \x01(\v2\f.error.ErrorR\x05error\x125\n" + "\bannounce\x18\x02 \x01(\v2\x19.client.Response.AnnounceR\bannounce\x12-\n" + "\x05relay\x18\x03 \x01(\v2\x17.client.Response.RelaysR\x05relay\x1a4\n" + "\bAnnounce\x12(\n" + - "\x05peers\x18\x01 \x03(\v2\x12.client.RemotePeerR\x05peers\x1a7\n" + - "\x06Relays\x12-\n" + - "\adirects\x18\x02 \x03(\v2\x13.client.DirectRelayR\adirects\"\xac\x01\n" + + "\x05peers\x18\x01 \x03(\v2\x12.client.RemotePeerR\x05peers\x1a/\n" + + "\x06Relays\x12%\n" + + "\x06relays\x18\x02 \x03(\v2\r.client.RelayR\x06relays\"\xac\x01\n" + "\x04Peer\x12)\n" + "\adirects\x18\x03 \x03(\v2\x0f.model.AddrPortR\adirects\x12\x1b\n" + "\trelay_ids\x18\x06 \x03(\tR\brelayIds\x12-\n" + @@ -719,8 +719,8 @@ const file_client_proto_rawDesc = "" + "RemotePeer\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1a\n" + "\bmetadata\x18\t \x01(\tR\bmetadata\x12 \n" + - "\x04peer\x18\b \x01(\v2\f.client.PeerR\x04peer\"\xbf\x01\n" + - "\vDirectRelay\x12\x0e\n" + + "\x04peer\x18\b \x01(\v2\f.client.PeerR\x04peer\"\xb9\x01\n" + + "\x05Relay\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12-\n" + "\taddresses\x18\x02 \x03(\v2\x0f.model.HostPortR\taddresses\x12-\n" + "\x12server_certificate\x18\x03 \x01(\fR\x11serverCertificate\x12&\n" + @@ -747,7 +747,7 @@ var file_client_proto_goTypes = []any{ (*Response)(nil), // 3: client.Response (*Peer)(nil), // 4: client.Peer (*RemotePeer)(nil), // 5: client.RemotePeer - (*DirectRelay)(nil), // 6: client.DirectRelay + (*Relay)(nil), // 6: client.Relay (*Request_Announce)(nil), // 7: client.Request.Announce (*Request_Relay)(nil), // 8: client.Request.Relay (*Response_Announce)(nil), // 9: client.Response.Announce @@ -768,14 +768,14 @@ var file_client_proto_depIdxs = []int32{ 10, // 6: client.Response.relay:type_name -> client.Response.Relays 12, // 7: client.Peer.directs:type_name -> model.AddrPort 4, // 8: client.RemotePeer.peer:type_name -> client.Peer - 13, // 9: client.DirectRelay.addresses:type_name -> model.HostPort + 13, // 9: client.Relay.addresses:type_name -> model.HostPort 14, // 10: client.Request.Announce.endpoint:type_name -> model.Endpoint 15, // 11: client.Request.Announce.role:type_name -> model.Role 4, // 12: client.Request.Announce.peer:type_name -> client.Peer 14, // 13: client.Request.Relay.endpoint:type_name -> model.Endpoint 15, // 14: client.Request.Relay.role:type_name -> model.Role 5, // 15: client.Response.Announce.peers:type_name -> client.RemotePeer - 6, // 16: client.Response.Relays.directs:type_name -> client.DirectRelay + 6, // 16: client.Response.Relays.relays:type_name -> client.Relay 17, // [17:17] is the sub-list for method output_type 17, // [17:17] is the sub-list for method input_type 17, // [17:17] is the sub-list for extension type_name diff --git a/server/control/clients.go b/server/control/clients.go index f1eb310..30a81ea 100644 --- a/server/control/clients.go +++ b/server/control/clients.go @@ -43,7 +43,7 @@ type ClientAuthentication []byte type ClientRelays interface { Directs(ctx context.Context, endpoint model.Endpoint, role model.Role, cert *x509.Certificate, auth ClientAuthentication, - notify func(map[RelayID]*pbclient.DirectRelay) error) error + notify func(map[RelayID]*pbclient.Relay) error) error } func newClientServer( @@ -274,7 +274,7 @@ func (s *clientServer) runListener(ctx context.Context, ingress Ingress) error { tlsConf := ingress.TLS.Clone() if len(tlsConf.NextProtos) == 0 { - tlsConf.NextProtos = iterc.MapVarStrings(model.ClientControlV03, model.ClientControlV02) + tlsConf.NextProtos = iterc.MapVarStrings(model.ClientControlV03) } quicConf := quicc.ServerConfig() @@ -711,11 +711,11 @@ func (s *clientStream) relay(ctx context.Context, req *pbclient.Request_Relay) e g.Go(func(ctx context.Context) error { defer s.conn.logger.Debug("completed direct relay notify") - return s.conn.server.relays.Directs(ctx, endpoint, role, clientCert, s.conn.auth, func(relays map[RelayID]*pbclient.DirectRelay) error { + return s.conn.server.relays.Directs(ctx, endpoint, role, clientCert, s.conn.auth, func(relays map[RelayID]*pbclient.Relay) error { s.conn.logger.Debug("updated direct relay list", "relays", len(relays)) if err := proto.Write(s.stream, &pbclient.Response{ Relay: &pbclient.Response_Relays{ - Directs: slices.Collect(maps.Values(relays)), + Relays: slices.Collect(maps.Values(relays)), }, }); err != nil { return fmt.Errorf("client relay response: %w", err) diff --git a/server/control/relays.go b/server/control/relays.go index 0e6fb1e..9ba1f15 100644 --- a/server/control/relays.go +++ b/server/control/relays.go @@ -63,7 +63,7 @@ func newRelayServer( directsCache[msg.Key.ID] = directRelay{ auth: msg.Value.Authentication, authSealKey: msg.Value.AuthenticationSealKey, - template: &pbclient.DirectRelay{ + template: &pbclient.Relay{ Id: msg.Key.ID.string, Addresses: model.PBsFromHostPorts(msg.Value.Hostports), ServerCertificate: msg.Value.Certificate.Raw, @@ -137,7 +137,7 @@ type relayServer struct { type directRelay struct { auth RelayAuthentication authSealKey *[32]byte - template *pbclient.DirectRelay + template *pbclient.Relay } func (s *relayServer) cachedDirects() (map[RelayID]directRelay, int64) { @@ -148,7 +148,7 @@ func (s *relayServer) cachedDirects() (map[RelayID]directRelay, int64) { } func (s *relayServer) Directs(ctx context.Context, endpoint model.Endpoint, role model.Role, cert *x509.Certificate, auth ClientAuthentication, - notify func(map[RelayID]*pbclient.DirectRelay) error) error { + notify func(map[RelayID]*pbclient.Relay) error) error { authenticationData, err := protobuf.Marshal(&pbrelay.ClientAuthentication{ Endpoint: endpoint.PB(), @@ -165,12 +165,12 @@ func (s *relayServer) Directs(ctx context.Context, endpoint model.Endpoint, role } directRelays, offset := s.cachedDirects() - localDirectRelays := map[RelayID]*pbclient.DirectRelay{} + localDirectRelays := map[RelayID]*pbclient.Relay{} for id, relay := range directRelays { if ok, err := s.auth.Allow(relay.auth, auth, endpoint); err != nil { return fmt.Errorf("auth allow error: %w", err) } else if ok { - localDirectRelays[id] = &pbclient.DirectRelay{ + localDirectRelays[id] = &pbclient.Relay{ Id: relay.template.Id, Addresses: relay.template.Addresses, ServerCertificate: relay.template.ServerCertificate, @@ -197,7 +197,7 @@ func (s *relayServer) Directs(ctx context.Context, endpoint model.Endpoint, role } else if ok, err := s.auth.Allow(msg.Value.Authentication, auth, endpoint); err != nil { return fmt.Errorf("auth allow error: %w", err) } else if ok { - localDirectRelays[msg.Key.ID] = &pbclient.DirectRelay{ + localDirectRelays[msg.Key.ID] = &pbclient.Relay{ Id: msg.Key.ID.string, Addresses: model.PBsFromHostPorts(msg.Value.Hostports), ServerCertificate: msg.Value.Certificate.Raw, @@ -305,7 +305,7 @@ func (s *relayServer) runDirectsCache(ctx context.Context) error { s.directsCache[msg.Key.ID] = directRelay{ auth: msg.Value.Authentication, authSealKey: msg.Value.AuthenticationSealKey, - template: &pbclient.DirectRelay{ + template: &pbclient.Relay{ Id: msg.Key.ID.string, Addresses: model.PBsFromHostPorts(msg.Value.Hostports), ServerCertificate: msg.Value.Certificate.Raw,