From daaf16bbf8670121fd85bac5fa873fcb33884cf5 Mon Sep 17 00:00:00 2001 From: Joachim Bauch Date: Thu, 8 Jan 2026 14:19:34 +0100 Subject: [PATCH] Move session id codec to separate package. --- .codecov.yml | 4 ++ clientsession.go | 7 ++- cmd/proxy/proxy_server.go | 8 +-- hub.go | 27 ++++----- hub_test.go | 17 +++--- roomsessions_test.go | 3 +- session.go | 3 +- session.pb.go => session/session.pb.go | 58 +++++++++---------- session.proto => session/session.proto | 4 +- .../sessionid_codec.go | 4 +- .../sessionid_codec_test.go | 2 +- testclient_test.go | 3 +- virtualsession.go | 7 ++- 13 files changed, 79 insertions(+), 68 deletions(-) rename session.pb.go => session/session.pb.go (67%) rename session.proto => session/session.proto (96%) rename sessionid_codec.go => session/sessionid_codec.go (99%) rename sessionid_codec_test.go => session/sessionid_codec_test.go (99%) diff --git a/.codecov.yml b/.codecov.yml index 7960edb..1e6a59b 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -100,6 +100,10 @@ component_management: name: security paths: - security/** + - component_id: module_session + name: session + paths: + - session/** - component_id: module_sfu name: sfu paths: diff --git a/clientsession.go b/clientsession.go index b601f73..75696fe 100644 --- a/clientsession.go +++ b/clientsession.go @@ -41,6 +41,7 @@ import ( "github.com/strukturag/nextcloud-spreed-signaling/internal" "github.com/strukturag/nextcloud-spreed-signaling/log" "github.com/strukturag/nextcloud-spreed-signaling/nats" + "github.com/strukturag/nextcloud-spreed-signaling/session" "github.com/strukturag/nextcloud-spreed-signaling/sfu" "github.com/strukturag/nextcloud-spreed-signaling/talk" ) @@ -63,7 +64,7 @@ type ClientSession struct { events events.AsyncEvents privateId api.PrivateSessionId publicId api.PublicSessionId - data *SessionIdData + data *session.SessionIdData ctx context.Context closeFunc context.CancelFunc @@ -125,7 +126,7 @@ type ClientSession struct { responseHandlers map[string]ResponseHandlerFunc } -func NewClientSession(hub *Hub, privateId api.PrivateSessionId, publicId api.PublicSessionId, data *SessionIdData, backend *talk.Backend, hello *api.HelloClientMessage, auth *talk.BackendClientAuthResponse) (*ClientSession, error) { +func NewClientSession(hub *Hub, privateId api.PrivateSessionId, publicId api.PublicSessionId, data *session.SessionIdData, backend *talk.Backend, hello *api.HelloClientMessage, auth *talk.BackendClientAuthResponse) (*ClientSession, error) { ctx := log.NewLoggerContext(context.Background(), hub.logger) ctx, closeFunc := context.WithCancel(ctx) s := &ClientSession{ @@ -183,7 +184,7 @@ func (s *ClientSession) RoomSessionId() api.RoomSessionId { return s.roomSessionId } -func (s *ClientSession) Data() *SessionIdData { +func (s *ClientSession) Data() *session.SessionIdData { return s.data } diff --git a/cmd/proxy/proxy_server.go b/cmd/proxy/proxy_server.go index e242ca0..ec11ba7 100644 --- a/cmd/proxy/proxy_server.go +++ b/cmd/proxy/proxy_server.go @@ -48,7 +48,6 @@ import ( "github.com/gorilla/websocket" "github.com/prometheus/client_golang/prometheus/promhttp" - signaling "github.com/strukturag/nextcloud-spreed-signaling" "github.com/strukturag/nextcloud-spreed-signaling/api" "github.com/strukturag/nextcloud-spreed-signaling/async" "github.com/strukturag/nextcloud-spreed-signaling/client" @@ -57,6 +56,7 @@ import ( "github.com/strukturag/nextcloud-spreed-signaling/geoip" "github.com/strukturag/nextcloud-spreed-signaling/log" "github.com/strukturag/nextcloud-spreed-signaling/proxy" + "github.com/strukturag/nextcloud-spreed-signaling/session" "github.com/strukturag/nextcloud-spreed-signaling/sfu" "github.com/strukturag/nextcloud-spreed-signaling/sfu/janus" janusapi "github.com/strukturag/nextcloud-spreed-signaling/sfu/janus/janus" @@ -147,7 +147,7 @@ type ProxyServer struct { trustedProxies atomic.Pointer[container.IPList] sid atomic.Uint64 - cookie *signaling.SessionIdCodec + cookie *session.SessionIdCodec sessionsLock sync.RWMutex // +checklocks:sessionsLock sessions map[uint64]*ProxySession @@ -242,7 +242,7 @@ func NewProxyServer(ctx context.Context, r *mux.Router, version string, config * return nil, fmt.Errorf("could not generate random block key: %s", err) } - sessionIds, err := signaling.NewSessionIdCodec(hashKey, blockKey) + sessionIds, err := session.NewSessionIdCodec(hashKey, blockKey) if err != nil { return nil, fmt.Errorf("error creating session id codec: %w", err) } @@ -1507,7 +1507,7 @@ func (s *ProxyServer) NewSession(hello *proxy.HelloClientMessage) (*ProxySession sid = s.sid.Add(1) } - sessionIdData := &signaling.SessionIdData{ + sessionIdData := &session.SessionIdData{ Sid: sid, Created: time.Now().UnixMicro(), } diff --git a/hub.go b/hub.go index 61d43e8..090af33 100644 --- a/hub.go +++ b/hub.go @@ -62,6 +62,7 @@ import ( "github.com/strukturag/nextcloud-spreed-signaling/grpc" "github.com/strukturag/nextcloud-spreed-signaling/internal" "github.com/strukturag/nextcloud-spreed-signaling/log" + "github.com/strukturag/nextcloud-spreed-signaling/session" "github.com/strukturag/nextcloud-spreed-signaling/sfu" "github.com/strukturag/nextcloud-spreed-signaling/sfu/janus" "github.com/strukturag/nextcloud-spreed-signaling/talk" @@ -159,7 +160,7 @@ type Hub struct { logger log.Logger events events.AsyncEvents upgrader websocket.Upgrader - sessionIds *SessionIdCodec + sessionIds *session.SessionIdCodec info *api.WelcomeServerMessage infoInternal *api.WelcomeServerMessage welcome atomic.Value // *api.ServerMessage @@ -192,7 +193,7 @@ type Hub struct { // +checklocks:mu virtualSessions map[api.PublicSessionId]uint64 - decodeCaches []*container.LruCache[*SessionIdData] + decodeCaches []*container.LruCache[*session.SessionIdData] mcu sfu.SFU mcuTimeout time.Duration @@ -258,7 +259,7 @@ func NewHub(ctx context.Context, cfg *goconf.ConfigFile, events events.AsyncEven return nil, fmt.Errorf("the sessions block key must be 16, 24 or 32 bytes but is %d bytes", len(blockKey)) } - sessionIds, err := NewSessionIdCodec([]byte(hashKey), blockBytes) + sessionIds, err := session.NewSessionIdCodec([]byte(hashKey), blockBytes) if err != nil { return nil, fmt.Errorf("error creating session id codec: %w", err) } @@ -320,9 +321,9 @@ func NewHub(ctx context.Context, cfg *goconf.ConfigFile, events events.AsyncEven logger.Printf("No trusted proxies configured, only allowing for %s", trustedProxiesIps) } - decodeCaches := make([]*container.LruCache[*SessionIdData], 0, numDecodeCaches) + decodeCaches := make([]*container.LruCache[*session.SessionIdData], 0, numDecodeCaches) for range numDecodeCaches { - decodeCaches = append(decodeCaches, container.NewLruCache[*SessionIdData](decodeCacheSize)) + decodeCaches = append(decodeCaches, container.NewLruCache[*session.SessionIdData](decodeCacheSize)) } roomSessions, err := NewBuiltinRoomSessions(rpcClients) @@ -632,7 +633,7 @@ func (h *Hub) Reload(ctx context.Context, config *goconf.ConfigFile) { h.rpcClients.Reload(config) } -func (h *Hub) getDecodeCache(cache_key string) *container.LruCache[*SessionIdData] { +func (h *Hub) getDecodeCache(cache_key string) *container.LruCache[*session.SessionIdData] { hash := fnv.New32a() // Make sure we don't have a temporary allocation for the string -> []byte conversion. hash.Write(unsafe.Slice(unsafe.StringData(cache_key), len(cache_key))) // nolint @@ -657,15 +658,15 @@ func (h *Hub) invalidateSessionId(id string) { cache.Remove(id) } -func (h *Hub) setDecodedPublicSessionId(id api.PublicSessionId, data *SessionIdData) { +func (h *Hub) setDecodedPublicSessionId(id api.PublicSessionId, data *session.SessionIdData) { h.setDecodedSessionId(string(id), data) } -func (h *Hub) setDecodedPrivateSessionId(id api.PrivateSessionId, data *SessionIdData) { +func (h *Hub) setDecodedPrivateSessionId(id api.PrivateSessionId, data *session.SessionIdData) { h.setDecodedSessionId(string(id), data) } -func (h *Hub) setDecodedSessionId(id string, data *SessionIdData) { +func (h *Hub) setDecodedSessionId(id string, data *session.SessionIdData) { if len(id) == 0 { return } @@ -674,7 +675,7 @@ func (h *Hub) setDecodedSessionId(id string, data *SessionIdData) { cache.Set(id, data) } -func (h *Hub) decodePrivateSessionId(id api.PrivateSessionId) *SessionIdData { +func (h *Hub) decodePrivateSessionId(id api.PrivateSessionId) *session.SessionIdData { if len(id) == 0 { return nil } @@ -694,7 +695,7 @@ func (h *Hub) decodePrivateSessionId(id api.PrivateSessionId) *SessionIdData { return data } -func (h *Hub) decodePublicSessionId(id api.PublicSessionId) *SessionIdData { +func (h *Hub) decodePublicSessionId(id api.PublicSessionId) *session.SessionIdData { if len(id) == 0 { return nil } @@ -950,12 +951,12 @@ func (h *Hub) unregisterRemoteSession(session *RemoteSession) { delete(h.remoteSessions, session) } -func (h *Hub) newSessionIdData(backend *talk.Backend) *SessionIdData { +func (h *Hub) newSessionIdData(backend *talk.Backend) *session.SessionIdData { sid := h.sid.Add(1) for sid == 0 { sid = h.sid.Add(1) } - sessionIdData := &SessionIdData{ + sessionIdData := &session.SessionIdData{ Sid: sid, Created: time.Now().UnixMicro(), BackendId: backend.Id(), diff --git a/hub_test.go b/hub_test.go index 8fce006..e9de42a 100644 --- a/hub_test.go +++ b/hub_test.go @@ -63,6 +63,7 @@ import ( "github.com/strukturag/nextcloud-spreed-signaling/log" "github.com/strukturag/nextcloud-spreed-signaling/mock" "github.com/strukturag/nextcloud-spreed-signaling/nats" + "github.com/strukturag/nextcloud-spreed-signaling/session" sfutest "github.com/strukturag/nextcloud-spreed-signaling/sfu/test" "github.com/strukturag/nextcloud-spreed-signaling/talk" "github.com/strukturag/nextcloud-spreed-signaling/test" @@ -823,17 +824,17 @@ func registerBackendHandlerUrl(t *testing.T, router *mux.Router, url string) { func Benchmark_DecodePrivateSessionIdCached(b *testing.B) { require := require.New(b) - decodeCaches := make([]*container.LruCache[*SessionIdData], 0, numDecodeCaches) + decodeCaches := make([]*container.LruCache[*session.SessionIdData], 0, numDecodeCaches) for range numDecodeCaches { - decodeCaches = append(decodeCaches, container.NewLruCache[*SessionIdData](decodeCacheSize)) + decodeCaches = append(decodeCaches, container.NewLruCache[*session.SessionIdData](decodeCacheSize)) } backend := talk.NewCompatBackend(nil) - data := &SessionIdData{ + data := &session.SessionIdData{ Sid: 1, Created: time.Now().UnixMicro(), BackendId: backend.Id(), } - codec, err := NewSessionIdCodec([]byte("12345678901234567890123456789012"), []byte("09876543210987654321098765432109")) + codec, err := session.NewSessionIdCodec([]byte("12345678901234567890123456789012"), []byte("09876543210987654321098765432109")) require.NoError(err) sid, err := codec.EncodePrivate(data) require.NoError(err, "could not create session id") @@ -850,17 +851,17 @@ func Benchmark_DecodePrivateSessionIdCached(b *testing.B) { func Benchmark_DecodePublicSessionIdCached(b *testing.B) { require := require.New(b) - decodeCaches := make([]*container.LruCache[*SessionIdData], 0, numDecodeCaches) + decodeCaches := make([]*container.LruCache[*session.SessionIdData], 0, numDecodeCaches) for range numDecodeCaches { - decodeCaches = append(decodeCaches, container.NewLruCache[*SessionIdData](decodeCacheSize)) + decodeCaches = append(decodeCaches, container.NewLruCache[*session.SessionIdData](decodeCacheSize)) } backend := talk.NewCompatBackend(nil) - data := &SessionIdData{ + data := &session.SessionIdData{ Sid: 1, Created: time.Now().UnixMicro(), BackendId: backend.Id(), } - codec, err := NewSessionIdCodec([]byte("12345678901234567890123456789012"), []byte("09876543210987654321098765432109")) + codec, err := session.NewSessionIdCodec([]byte("12345678901234567890123456789012"), []byte("09876543210987654321098765432109")) require.NoError(err) sid, err := codec.EncodePublic(data) require.NoError(err, "could not create session id") diff --git a/roomsessions_test.go b/roomsessions_test.go index 0a8d5b5..20d2122 100644 --- a/roomsessions_test.go +++ b/roomsessions_test.go @@ -32,6 +32,7 @@ import ( "github.com/stretchr/testify/require" "github.com/strukturag/nextcloud-spreed-signaling/api" + "github.com/strukturag/nextcloud-spreed-signaling/session" "github.com/strukturag/nextcloud-spreed-signaling/talk" ) @@ -55,7 +56,7 @@ func (s *DummySession) ClientType() api.ClientType { return "" } -func (s *DummySession) Data() *SessionIdData { +func (s *DummySession) Data() *session.SessionIdData { return nil } diff --git a/session.go b/session.go index 606cccf..cf35bde 100644 --- a/session.go +++ b/session.go @@ -29,6 +29,7 @@ import ( "time" "github.com/strukturag/nextcloud-spreed-signaling/api" + "github.com/strukturag/nextcloud-spreed-signaling/session" "github.com/strukturag/nextcloud-spreed-signaling/talk" ) @@ -37,7 +38,7 @@ type Session interface { PrivateId() api.PrivateSessionId PublicId() api.PublicSessionId ClientType() api.ClientType - Data() *SessionIdData + Data() *session.SessionIdData UserId() string UserData() json.RawMessage diff --git a/session.pb.go b/session/session.pb.go similarity index 67% rename from session.pb.go rename to session/session.pb.go index a998ae3..0bf63ee 100644 --- a/session.pb.go +++ b/session/session.pb.go @@ -20,9 +20,9 @@ // along with this program. If not, see . // Code generated by protoc-gen-go. DO NOT EDIT. -// source: session.proto +// source: session/session.proto -package signaling +package session import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -50,7 +50,7 @@ type SessionIdData struct { func (x *SessionIdData) Reset() { *x = SessionIdData{} - mi := &file_session_proto_msgTypes[0] + mi := &file_session_session_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -62,7 +62,7 @@ func (x *SessionIdData) String() string { func (*SessionIdData) ProtoMessage() {} func (x *SessionIdData) ProtoReflect() protoreflect.Message { - mi := &file_session_proto_msgTypes[0] + mi := &file_session_session_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -75,7 +75,7 @@ func (x *SessionIdData) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionIdData.ProtoReflect.Descriptor instead. func (*SessionIdData) Descriptor() ([]byte, []int) { - return file_session_proto_rawDescGZIP(), []int{0} + return file_session_session_proto_rawDescGZIP(), []int{0} } func (x *SessionIdData) GetSid() uint64 { @@ -99,33 +99,33 @@ func (x *SessionIdData) GetBackendId() string { return "" } -var File_session_proto protoreflect.FileDescriptor +var File_session_session_proto protoreflect.FileDescriptor -const file_session_proto_rawDesc = "" + +const file_session_session_proto_rawDesc = "" + "\n" + - "\rsession.proto\x12\tsignaling\"Y\n" + + "\x15session/session.proto\x12\asession\"Y\n" + "\rSessionIdData\x12\x10\n" + "\x03Sid\x18\x01 \x01(\x04R\x03Sid\x12\x18\n" + "\aCreated\x18\x02 \x01(\x03R\aCreated\x12\x1c\n" + - "\tBackendId\x18\x03 \x01(\tR\tBackendIdB. */ -package signaling +package session import ( "crypto/aes" @@ -86,7 +86,7 @@ func (p *bytesPool) Put(b []byte) { // SessionIdCodec encodes and decodes session ids. // // Inspired by https://github.com/gorilla/securecookie -type SessionIdCodec struct { +type SessionIdCodec struct { // nolint hashKey []byte cipher cipher.Block diff --git a/sessionid_codec_test.go b/session/sessionid_codec_test.go similarity index 99% rename from sessionid_codec_test.go rename to session/sessionid_codec_test.go index 7504c27..f932bcf 100644 --- a/sessionid_codec_test.go +++ b/session/sessionid_codec_test.go @@ -19,7 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -package signaling +package session import ( "testing" diff --git a/testclient_test.go b/testclient_test.go index 7fe62ef..9931c02 100644 --- a/testclient_test.go +++ b/testclient_test.go @@ -44,6 +44,7 @@ import ( "github.com/strukturag/nextcloud-spreed-signaling/api" "github.com/strukturag/nextcloud-spreed-signaling/internal" + "github.com/strukturag/nextcloud-spreed-signaling/session" ) var ( @@ -71,7 +72,7 @@ func getWebsocketUrl(url string) string { } } -func getPubliceSessionIdData(h *Hub, publicId api.PublicSessionId) *SessionIdData { +func getPubliceSessionIdData(h *Hub, publicId api.PublicSessionId) *session.SessionIdData { decodedPublic := h.decodePublicSessionId(publicId) if decodedPublic == nil { panic("invalid public session id") diff --git a/virtualsession.go b/virtualsession.go index 4a34810..817cb5c 100644 --- a/virtualsession.go +++ b/virtualsession.go @@ -34,6 +34,7 @@ import ( "github.com/strukturag/nextcloud-spreed-signaling/internal" "github.com/strukturag/nextcloud-spreed-signaling/log" "github.com/strukturag/nextcloud-spreed-signaling/nats" + "github.com/strukturag/nextcloud-spreed-signaling/session" "github.com/strukturag/nextcloud-spreed-signaling/talk" ) @@ -49,7 +50,7 @@ type VirtualSession struct { session *ClientSession privateId api.PrivateSessionId publicId api.PublicSessionId - data *SessionIdData + data *session.SessionIdData ctx context.Context closeFunc context.CancelFunc room atomic.Pointer[Room] @@ -70,7 +71,7 @@ func GetVirtualSessionId(session Session, sessionId api.PublicSessionId) api.Pub return session.PublicId() + "|" + sessionId } -func NewVirtualSession(session *ClientSession, privateId api.PrivateSessionId, publicId api.PublicSessionId, data *SessionIdData, msg *api.AddSessionInternalClientMessage) (*VirtualSession, error) { +func NewVirtualSession(session *ClientSession, privateId api.PrivateSessionId, publicId api.PublicSessionId, data *session.SessionIdData, msg *api.AddSessionInternalClientMessage) (*VirtualSession, error) { ctx := log.NewLoggerContext(session.Context(), session.hub.logger) ctx, closeFunc := context.WithCancel(ctx) @@ -138,7 +139,7 @@ func (s *VirtualSession) SetInCall(inCall int) bool { return s.inCall.Set(uint32(inCall)) } -func (s *VirtualSession) Data() *SessionIdData { +func (s *VirtualSession) Data() *session.SessionIdData { return s.data }