Ver Fonte

fix: pidgin connectivity issue

siohaza há 2 anos atrás
pai
commit
34e7946dcd
5 ficheiros alterados com 56 adições e 30 exclusões
  1. 4 4
      cmd/server/main.go
  2. 13 5
      foodgroup/oservice.go
  3. 10 9
      foodgroup/oservice_test.go
  4. 3 3
      state/session.go
  5. 26 9
      wire/snacs.go

+ 4 - 4
cmd/server/main.go

@@ -48,7 +48,7 @@ func main() {
 		authService := foodgroup.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry, adjListBuddyListStore)
 		authService := foodgroup.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry, adjListBuddyListStore)
 		bartService := foodgroup.NewBARTService(logger, feedbagStore, sessionManager, feedbagStore, adjListBuddyListStore)
 		bartService := foodgroup.NewBARTService(logger, feedbagStore, sessionManager, feedbagStore, adjListBuddyListStore)
 		buddyService := foodgroup.NewBuddyService(sessionManager, feedbagStore, adjListBuddyListStore)
 		buddyService := foodgroup.NewBuddyService(sessionManager, feedbagStore, adjListBuddyListStore)
-		oServiceService := foodgroup.NewOServiceService(cfg, sessionManager, feedbagStore, adjListBuddyListStore)
+		oServiceService := foodgroup.NewOServiceService(cfg, sessionManager, feedbagStore, adjListBuddyListStore, logger)
 		oServiceServiceForBOS := foodgroup.NewOServiceServiceForBOS(*oServiceService, chatRegistry)
 		oServiceServiceForBOS := foodgroup.NewOServiceServiceForBOS(*oServiceService, chatRegistry)
 		locateService := foodgroup.NewLocateService(sessionManager, feedbagStore, feedbagStore, adjListBuddyListStore)
 		locateService := foodgroup.NewLocateService(sessionManager, feedbagStore, feedbagStore, adjListBuddyListStore)
 		newChatSessMgr := func() foodgroup.SessionManager { return state.NewInMemorySessionManager(logger) }
 		newChatSessMgr := func() foodgroup.SessionManager { return state.NewInMemorySessionManager(logger) }
@@ -77,7 +77,7 @@ func main() {
 	go func(logger *slog.Logger) {
 	go func(logger *slog.Logger) {
 		logger = logger.With("svc", "CHAT")
 		logger = logger.With("svc", "CHAT")
 		authService := foodgroup.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry, adjListBuddyListStore)
 		authService := foodgroup.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry, adjListBuddyListStore)
-		oServiceService := foodgroup.NewOServiceService(cfg, sessionManager, feedbagStore, adjListBuddyListStore)
+		oServiceService := foodgroup.NewOServiceService(cfg, sessionManager, feedbagStore, adjListBuddyListStore, logger)
 		chatService := foodgroup.NewChatService(chatRegistry)
 		chatService := foodgroup.NewChatService(chatRegistry)
 		oServiceServiceForChat := foodgroup.NewOServiceServiceForChat(*oServiceService, chatRegistry)
 		oServiceServiceForChat := foodgroup.NewOServiceServiceForChat(*oServiceService, chatRegistry)
 
 
@@ -96,7 +96,7 @@ func main() {
 	go func(logger *slog.Logger) {
 	go func(logger *slog.Logger) {
 		logger = logger.With("svc", "CHAT_NAV")
 		logger = logger.With("svc", "CHAT_NAV")
 		authService := foodgroup.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry, adjListBuddyListStore)
 		authService := foodgroup.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry, adjListBuddyListStore)
-		oServiceService := foodgroup.NewOServiceService(cfg, sessionManager, feedbagStore, adjListBuddyListStore)
+		oServiceService := foodgroup.NewOServiceService(cfg, sessionManager, feedbagStore, adjListBuddyListStore, logger)
 		oServiceServiceForChatNav := foodgroup.NewOServiceServiceForChatNav(*oServiceService, chatRegistry)
 		oServiceServiceForChatNav := foodgroup.NewOServiceServiceForChatNav(*oServiceService, chatRegistry)
 		newChatSessMgr := func() foodgroup.SessionManager { return state.NewInMemorySessionManager(logger) }
 		newChatSessMgr := func() foodgroup.SessionManager { return state.NewInMemorySessionManager(logger) }
 		chatNavService := foodgroup.NewChatNavService(logger, chatRegistry, state.NewChatRoom, newChatSessMgr)
 		chatNavService := foodgroup.NewChatNavService(logger, chatRegistry, state.NewChatRoom, newChatSessMgr)
@@ -116,7 +116,7 @@ func main() {
 	go func(logger *slog.Logger) {
 	go func(logger *slog.Logger) {
 		logger = logger.With("svc", "ALERT")
 		logger = logger.With("svc", "ALERT")
 		authService := foodgroup.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry, adjListBuddyListStore)
 		authService := foodgroup.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry, adjListBuddyListStore)
-		oServiceService := foodgroup.NewOServiceService(cfg, sessionManager, feedbagStore, adjListBuddyListStore)
+		oServiceService := foodgroup.NewOServiceService(cfg, sessionManager, feedbagStore, adjListBuddyListStore, logger)
 		oServiceServiceForAlert := foodgroup.NewOServiceServiceForAlert(*oServiceService)
 		oServiceServiceForAlert := foodgroup.NewOServiceServiceForAlert(*oServiceService)
 
 
 		oscar.AlertServer{
 		oscar.AlertServer{

+ 13 - 5
foodgroup/oservice.go

@@ -5,6 +5,7 @@ import (
 	"context"
 	"context"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
+	"log/slog"
 	"time"
 	"time"
 
 
 	"github.com/mk6i/retro-aim-server/config"
 	"github.com/mk6i/retro-aim-server/config"
@@ -18,12 +19,14 @@ func NewOServiceService(
 	messageRelayer MessageRelayer,
 	messageRelayer MessageRelayer,
 	feedbagManager FeedbagManager,
 	feedbagManager FeedbagManager,
 	legacyBuddyListManager LegacyBuddyListManager,
 	legacyBuddyListManager LegacyBuddyListManager,
+	logger *slog.Logger,
 ) *OServiceService {
 ) *OServiceService {
 	return &OServiceService{
 	return &OServiceService{
 		cfg:                    cfg,
 		cfg:                    cfg,
 		feedbagManager:         feedbagManager,
 		feedbagManager:         feedbagManager,
 		legacyBuddyListManager: legacyBuddyListManager,
 		legacyBuddyListManager: legacyBuddyListManager,
 		messageRelayer:         messageRelayer,
 		messageRelayer:         messageRelayer,
+		logger:                 logger,
 	}
 	}
 }
 }
 
 
@@ -34,6 +37,7 @@ type OServiceService struct {
 	feedbagManager         FeedbagManager
 	feedbagManager         FeedbagManager
 	legacyBuddyListManager LegacyBuddyListManager
 	legacyBuddyListManager LegacyBuddyListManager
 	messageRelayer         MessageRelayer
 	messageRelayer         MessageRelayer
+	logger                 *slog.Logger
 }
 }
 
 
 // ClientVersions informs the server what food group versions the client
 // ClientVersions informs the server what food group versions the client
@@ -418,19 +422,23 @@ func (s OServiceService) UserInfoQuery(_ context.Context, sess *state.Session, i
 // It returns SNAC wire.OServiceUserInfoUpdate containing the user's info.
 // It returns SNAC wire.OServiceUserInfoUpdate containing the user's info.
 func (s OServiceService) SetUserInfoFields(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x01_0x1E_OServiceSetUserInfoFields) (wire.SNACMessage, error) {
 func (s OServiceService) SetUserInfoFields(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x01_0x1E_OServiceSetUserInfoFields) (wire.SNACMessage, error) {
 	if status, hasStatus := inBody.Uint32(wire.OServiceUserInfoStatus); hasStatus {
 	if status, hasStatus := inBody.Uint32(wire.OServiceUserInfoStatus); hasStatus {
-		switch status {
-		case 0x0000:
+		if status == wire.OServiceUserFlagNormal {
 			sess.SetInvisible(false)
 			sess.SetInvisible(false)
 			if err := broadcastArrival(ctx, sess, s.messageRelayer, s.feedbagManager, s.legacyBuddyListManager); err != nil {
 			if err := broadcastArrival(ctx, sess, s.messageRelayer, s.feedbagManager, s.legacyBuddyListManager); err != nil {
 				return wire.SNACMessage{}, err
 				return wire.SNACMessage{}, err
 			}
 			}
-		case 0x0100:
+		}
+		if status&wire.OServiceUserFlagInvisible == wire.OServiceUserFlagInvisible {
 			sess.SetInvisible(true)
 			sess.SetInvisible(true)
 			if err := broadcastDeparture(ctx, sess, s.messageRelayer, s.feedbagManager, s.legacyBuddyListManager); err != nil {
 			if err := broadcastDeparture(ctx, sess, s.messageRelayer, s.feedbagManager, s.legacyBuddyListManager); err != nil {
 				return wire.SNACMessage{}, err
 				return wire.SNACMessage{}, err
 			}
 			}
-		default:
-			return wire.SNACMessage{}, fmt.Errorf("don't know what to do with status %d", status)
+			if status&wire.OServiceStatusDirectRequireAuth == wire.OServiceStatusDirectRequireAuth {
+				s.logger.InfoContext(ctx, "got unsupported status", "status", status)
+			}
+			if status&wire.OServiceStatusHideIP == wire.OServiceStatusHideIP {
+				s.logger.InfoContext(ctx, "got unsupported status", "status", status)
+			}
 		}
 		}
 	}
 	}
 	return wire.SNACMessage{
 	return wire.SNACMessage{

+ 10 - 9
foodgroup/oservice_test.go

@@ -1,6 +1,7 @@
 package foodgroup
 package foodgroup
 
 
 import (
 import (
+	"log/slog"
 	"testing"
 	"testing"
 	"time"
 	"time"
 
 
@@ -406,7 +407,7 @@ func TestSetUserInfoFields(t *testing.T) {
 			//
 			//
 			// send input SNAC
 			// send input SNAC
 			//
 			//
-			svc := NewOServiceService(config.Config{}, messageRelayer, feedbagManager, legacyBuddyListManager)
+			svc := NewOServiceService(config.Config{}, messageRelayer, feedbagManager, legacyBuddyListManager, slog.Default())
 			outputSNAC, err := svc.SetUserInfoFields(nil, tc.userSession, tc.inputSNAC.Frame,
 			outputSNAC, err := svc.SetUserInfoFields(nil, tc.userSession, tc.inputSNAC.Frame,
 				tc.inputSNAC.Body.(wire.SNAC_0x01_0x1E_OServiceSetUserInfoFields))
 				tc.inputSNAC.Body.(wire.SNAC_0x01_0x1E_OServiceSetUserInfoFields))
 			assert.ErrorIs(t, err, tc.expectErr)
 			assert.ErrorIs(t, err, tc.expectErr)
@@ -422,7 +423,7 @@ func TestSetUserInfoFields(t *testing.T) {
 }
 }
 
 
 func TestOServiceService_RateParamsQuery(t *testing.T) {
 func TestOServiceService_RateParamsQuery(t *testing.T) {
-	svc := NewOServiceService(config.Config{}, nil, nil, nil)
+	svc := NewOServiceService(config.Config{}, nil, nil, nil, slog.Default())
 
 
 	have := svc.RateParamsQuery(nil, wire.SNACFrame{RequestID: 1234})
 	have := svc.RateParamsQuery(nil, wire.SNACFrame{RequestID: 1234})
 	want := wire.SNACMessage{
 	want := wire.SNACMessage{
@@ -1347,7 +1348,7 @@ func TestOServiceService_RateParamsQuery(t *testing.T) {
 }
 }
 
 
 func TestOServiceServiceForBOS_OServiceHostOnline(t *testing.T) {
 func TestOServiceServiceForBOS_OServiceHostOnline(t *testing.T) {
-	svc := NewOServiceServiceForBOS(*NewOServiceService(config.Config{}, nil, nil, nil), nil)
+	svc := NewOServiceServiceForBOS(*NewOServiceService(config.Config{}, nil, nil, nil, slog.Default()), nil)
 
 
 	want := wire.SNACMessage{
 	want := wire.SNACMessage{
 		Frame: wire.SNACFrame{
 		Frame: wire.SNACFrame{
@@ -1373,7 +1374,7 @@ func TestOServiceServiceForBOS_OServiceHostOnline(t *testing.T) {
 }
 }
 
 
 func TestOServiceServiceForChat_OServiceHostOnline(t *testing.T) {
 func TestOServiceServiceForChat_OServiceHostOnline(t *testing.T) {
-	svc := NewOServiceServiceForChat(*NewOServiceService(config.Config{}, nil, nil, nil), nil)
+	svc := NewOServiceServiceForChat(*NewOServiceService(config.Config{}, nil, nil, nil, slog.Default()), nil)
 
 
 	want := wire.SNACMessage{
 	want := wire.SNACMessage{
 		Frame: wire.SNACFrame{
 		Frame: wire.SNACFrame{
@@ -1393,7 +1394,7 @@ func TestOServiceServiceForChat_OServiceHostOnline(t *testing.T) {
 }
 }
 
 
 func TestOServiceService_ClientVersions(t *testing.T) {
 func TestOServiceService_ClientVersions(t *testing.T) {
-	svc := NewOServiceService(config.Config{}, nil, nil, nil)
+	svc := NewOServiceService(config.Config{}, nil, nil, nil, slog.Default())
 
 
 	want := wire.SNACMessage{
 	want := wire.SNACMessage{
 		Frame: wire.SNACFrame{
 		Frame: wire.SNACFrame{
@@ -1416,7 +1417,7 @@ func TestOServiceService_ClientVersions(t *testing.T) {
 }
 }
 
 
 func TestOServiceService_UserInfoQuery(t *testing.T) {
 func TestOServiceService_UserInfoQuery(t *testing.T) {
-	svc := NewOServiceService(config.Config{}, nil, nil, nil)
+	svc := NewOServiceService(config.Config{}, nil, nil, nil, slog.Default())
 	sess := newTestSession("test-user")
 	sess := newTestSession("test-user")
 
 
 	want := wire.SNACMessage{
 	want := wire.SNACMessage{
@@ -1527,7 +1528,7 @@ func TestOServiceService_IdleNotification(t *testing.T) {
 					WhoAddedUser(params.userScreenName).
 					WhoAddedUser(params.userScreenName).
 					Return(params.result)
 					Return(params.result)
 			}
 			}
-			svc := NewOServiceService(config.Config{}, messageRelayer, feedbagManager, legacyBuddyListManager)
+			svc := NewOServiceService(config.Config{}, messageRelayer, feedbagManager, legacyBuddyListManager, slog.Default())
 
 
 			haveErr := svc.IdleNotification(nil, tt.sess, tt.bodyIn)
 			haveErr := svc.IdleNotification(nil, tt.sess, tt.bodyIn)
 			assert.ErrorIs(t, tt.wantErr, haveErr)
 			assert.ErrorIs(t, tt.wantErr, haveErr)
@@ -1897,7 +1898,7 @@ func TestOServiceServiceForChat_ClientOnline(t *testing.T) {
 }
 }
 
 
 func TestOServiceServiceForChatNav_HostOnline(t *testing.T) {
 func TestOServiceServiceForChatNav_HostOnline(t *testing.T) {
-	svc := NewOServiceServiceForChatNav(*NewOServiceService(config.Config{}, nil, nil, nil), nil)
+	svc := NewOServiceServiceForChatNav(*NewOServiceService(config.Config{}, nil, nil, nil, slog.Default()), nil)
 
 
 	want := wire.SNACMessage{
 	want := wire.SNACMessage{
 		Frame: wire.SNACFrame{
 		Frame: wire.SNACFrame{
@@ -1917,7 +1918,7 @@ func TestOServiceServiceForChatNav_HostOnline(t *testing.T) {
 }
 }
 
 
 func TestOServiceServiceForAlert_HostOnline(t *testing.T) {
 func TestOServiceServiceForAlert_HostOnline(t *testing.T) {
-	svc := NewOServiceServiceForAlert(*NewOServiceService(config.Config{}, nil, nil, nil))
+	svc := NewOServiceServiceForAlert(*NewOServiceService(config.Config{}, nil, nil, nil, slog.Default()))
 
 
 	want := wire.SNACMessage{
 	want := wire.SNACMessage{
 		Frame: wire.SNACFrame{
 		Frame: wire.SNACFrame{

+ 3 - 3
state/session.go

@@ -190,14 +190,14 @@ func (s *Session) userInfo() wire.TLVList {
 
 
 	// away message status
 	// away message status
 	if s.awayMessage != "" {
 	if s.awayMessage != "" {
-		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoUserFlags, wire.OServiceUserFlagOSCARFree|wire.OServiceUserFlagUnavailable))
+		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(wire.OServiceUserFlagOSCARFree|wire.OServiceUserFlagUnavailable)))
 	} else {
 	} else {
-		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoUserFlags, wire.OServiceUserFlagOSCARFree))
+		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(wire.OServiceUserFlagOSCARFree)))
 	}
 	}
 
 
 	// invisibility status
 	// invisibility status
 	if s.invisible {
 	if s.invisible {
-		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoStatus, wire.OServiceUserFlagInvisible))
+		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoStatus, uint16(wire.OServiceUserFlagInvisible)))
 	} else {
 	} else {
 		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0)))
 		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0)))
 	}
 	}

+ 26 - 9
wire/snacs.go

@@ -137,15 +137,32 @@ const (
 	OServiceBartQuery2        uint16 = 0x0022
 	OServiceBartQuery2        uint16 = 0x0022
 	OServiceBartReply2        uint16 = 0x0023
 	OServiceBartReply2        uint16 = 0x0023
 
 
-	OServiceUserInfoUserFlags   uint16 = 0x01
-	OServiceUserInfoSignonTOD   uint16 = 0x03
-	OServiceUserInfoIdleTime    uint16 = 0x04
-	OServiceUserInfoStatus      uint16 = 0x06
-	OServiceUserInfoOscarCaps   uint16 = 0x0D
-	OServiceUserFlagOSCARFree   uint16 = 0x0010 // AIM (not AOL) account
-	OServiceUserInfoBARTInfo    uint16 = 0x1D
-	OServiceUserFlagUnavailable uint16 = 0x0020 // user is away
-	OServiceUserFlagInvisible   uint16 = 0x0100 // user is invisible
+	OServiceUserInfoUserFlags uint16 = 0x01
+	OServiceUserInfoSignonTOD uint16 = 0x03
+	OServiceUserInfoIdleTime  uint16 = 0x04
+	OServiceUserInfoStatus    uint16 = 0x06
+	OServiceUserInfoOscarCaps uint16 = 0x0D
+	OServiceUserInfoBARTInfo  uint16 = 0x1D
+
+	OServiceUserFlagOSCARFree   uint32 = 0x00000010 // AIM (not AOL) account
+	OServiceUserFlagNormal      uint32 = 0x00000000 // user is normal
+	OServiceUserFlagAway        uint32 = 0x00000001 // user is also away
+	OServiceUserFlagDND         uint32 = 0x00000002 // don't disturb user
+	OServiceUserFlagOut         uint32 = 0x00000004 // user is not available
+	OServiceUserFlagBusy        uint32 = 0x00000010 // user is busy
+	OServiceUserFlagInvisible   uint32 = 0x00000100 // user is invisible
+	OServiceUserFlagUnavailable uint32 = 0x00000020 // user is away
+	OServiceUserFlagEvil        uint32 = 0x00003000 // user is evil
+	OServiceUserFlagDepression  uint32 = 0x00004000 // user is having a depression :(
+	OServiceUserFlagAtHome      uint32 = 0x00005000 // user is at home
+	OServiceUserFlagAtWork      uint32 = 0x00006000 // user is at work
+	OServiceUserFlagLunch       uint32 = 0x00002001 // user is having a lunch
+	OServiceUserFlagBirthday    uint32 = 0x00080000 // user is having a birthday :DDD
+
+	OServiceStatusWebAware          uint32 = 0x00010000
+	OServiceStatusHideIP            uint32 = 0x00020000
+	OServiceStatusICQHomePage       uint32 = 0x00200000
+	OServiceStatusDirectRequireAuth uint32 = 0x10000000
 
 
 	OServiceTLVTagsReconnectHere uint16 = 0x05
 	OServiceTLVTagsReconnectHere uint16 = 0x05
 	OServiceTLVTagsLoginCookie   uint16 = 0x06
 	OServiceTLVTagsLoginCookie   uint16 = 0x06