Mike 2 лет назад
Родитель
Сommit
7ea843ea4a
10 измененных файлов с 30 добавлено и 20 удалено
  1. 2 2
      server/bucp.go
  2. 1 1
      server/buddy.go
  3. 1 1
      server/chat.go
  4. 1 1
      server/chat_nav.go
  5. 1 1
      server/feedbag.go
  6. 1 1
      server/icbm.go
  7. 1 1
      server/locate.go
  8. 1 1
      server/oservice.go
  9. 1 1
      server/pd.go
  10. 20 10
      server/protocol.go

+ 2 - 2
server/bucp.go

@@ -21,8 +21,8 @@ const (
 	BUCPRegistrationImageRequest        = 0x000C
 	BUCPRegistrationImageRequest        = 0x000C
 )
 )
 
 
-func routeBUCP(snac oscar.SnacFrame, w io.Writer, sequence *uint32) error {
-	return handleUnimplementedSNAC(snac, w, sequence)
+func routeBUCP() error {
+	return ErrUnimplementedSNAC
 }
 }
 
 
 func ReceiveAndSendAuthChallenge(cfg Config, fm *FeedbagStore, r io.Reader, w io.Writer, sequence *uint32, newUUID func() uuid.UUID) error {
 func ReceiveAndSendAuthChallenge(cfg Config, fm *FeedbagStore, r io.Reader, w io.Writer, sequence *uint32, newUUID func() uuid.UUID) error {

+ 1 - 1
server/buddy.go

@@ -27,7 +27,7 @@ func routeBuddy(snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32
 	case BuddyRightsQuery:
 	case BuddyRightsQuery:
 		return SendAndReceiveBuddyRights(snac, r, w, sequence)
 		return SendAndReceiveBuddyRights(snac, r, w, sequence)
 	default:
 	default:
-		return handleUnimplementedSNAC(snac, w, sequence)
+		return ErrUnimplementedSNAC
 	}
 	}
 }
 }
 
 

+ 1 - 1
server/chat.go

@@ -55,7 +55,7 @@ func routeChat(sess *Session, sm SessionManager, snac oscar.SnacFrame, r io.Read
 	case ChatChannelMsgTohost:
 	case ChatChannelMsgTohost:
 		return SendAndReceiveChatChannelMsgTohost(sess, sm, snac, r, w, sequence)
 		return SendAndReceiveChatChannelMsgTohost(sess, sm, snac, r, w, sequence)
 	default:
 	default:
-		return handleUnimplementedSNAC(snac, w, sequence)
+		return ErrUnimplementedSNAC
 	}
 	}
 }
 }
 
 

+ 1 - 1
server/chat_nav.go

@@ -30,7 +30,7 @@ func routeChatNav(sess *Session, cr *ChatRegistry, snac oscar.SnacFrame, r io.Re
 	case ChatNavCreateRoom:
 	case ChatNavCreateRoom:
 		return SendAndReceiveCreateRoom(sess, cr, NewChatRoom, snac, r, w, sequence)
 		return SendAndReceiveCreateRoom(sess, cr, NewChatRoom, snac, r, w, sequence)
 	default:
 	default:
-		return handleUnimplementedSNAC(snac, w, sequence)
+		return ErrUnimplementedSNAC
 	}
 	}
 }
 }
 
 

+ 1 - 1
server/feedbag.go

@@ -167,7 +167,7 @@ func routeFeedbag(sm SessionManager, sess *Session, fm *FeedbagStore, snac oscar
 	case FeedbagEndCluster:
 	case FeedbagEndCluster:
 		return ReceiveFeedbagEndCluster(snac, r, w, sequence)
 		return ReceiveFeedbagEndCluster(snac, r, w, sequence)
 	default:
 	default:
-		return handleUnimplementedSNAC(snac, w, sequence)
+		return ErrUnimplementedSNAC
 	}
 	}
 }
 }
 
 

+ 1 - 1
server/icbm.go

@@ -51,7 +51,7 @@ func routeICBM(sm SessionManager, fm *FeedbagStore, sess *Session, snac oscar.Sn
 	case ICBMClientEvent:
 	case ICBMClientEvent:
 		return SendAndReceiveClientEvent(sm, fm, sess, snac, r)
 		return SendAndReceiveClientEvent(sm, fm, sess, snac, r)
 	default:
 	default:
-		return handleUnimplementedSNAC(snac, w, sequence)
+		return ErrUnimplementedSNAC
 	}
 	}
 }
 }
 
 

+ 1 - 1
server/locate.go

@@ -60,7 +60,7 @@ func routeLocate(sess *Session, sm SessionManager, fm *FeedbagStore, snac oscar.
 	case LocateUserInfoQuery2:
 	case LocateUserInfoQuery2:
 		return SendAndReceiveUserInfoQuery2(sess, sm, fm, fm, snac, r, w, sequence)
 		return SendAndReceiveUserInfoQuery2(sess, sm, fm, fm, snac, r, w, sequence)
 	default:
 	default:
-		return handleUnimplementedSNAC(snac, w, sequence)
+		return ErrUnimplementedSNAC
 	}
 	}
 }
 }
 
 

+ 1 - 1
server/oservice.go

@@ -66,7 +66,7 @@ func routeOService(cfg Config, ready OnReadyCB, cr *ChatRegistry, sm SessionMana
 	case OServiceSetUserinfoFields:
 	case OServiceSetUserinfoFields:
 		return ReceiveSetUserInfoFields(sess, sm, fm, snac, r, w, sequence)
 		return ReceiveSetUserInfoFields(sess, sm, fm, snac, r, w, sequence)
 	default:
 	default:
-		return handleUnimplementedSNAC(snac, w, sequence)
+		return ErrUnimplementedSNAC
 	}
 	}
 }
 }
 
 

+ 1 - 1
server/pd.go

@@ -25,7 +25,7 @@ func routePD(snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) e
 	case PDRightsQuery:
 	case PDRightsQuery:
 		return SendAndReceivePDRightsQuery(snac, r, w, sequence)
 		return SendAndReceivePDRightsQuery(snac, r, w, sequence)
 	default:
 	default:
-		return handleUnimplementedSNAC(snac, w, sequence)
+		return ErrUnimplementedSNAC
 	}
 	}
 }
 }
 
 

+ 20 - 10
server/protocol.go

@@ -56,13 +56,16 @@ var (
 	CapChat, _ = uuid.MustParse("748F2420-6287-11D1-8222-444553540000").MarshalBinary()
 	CapChat, _ = uuid.MustParse("748F2420-6287-11D1-8222-444553540000").MarshalBinary()
 )
 )
 
 
+var ErrUnimplementedSNAC = errors.New("snac is unimplemented")
+
 type Config struct {
 type Config struct {
-	OSCARHost   string `envconfig:"OSCAR_HOST" required:"true"`
-	OSCARPort   int    `envconfig:"OSCAR_PORT" default:"5190"`
 	BOSPort     int    `envconfig:"BOS_PORT" default:"5191"`
 	BOSPort     int    `envconfig:"BOS_PORT" default:"5191"`
 	ChatPort    int    `envconfig:"CHAT_PORT" default:"5192"`
 	ChatPort    int    `envconfig:"CHAT_PORT" default:"5192"`
-	DisableAuth bool   `envconfig:"DISABLE_AUTH" default:"false"`
 	DBPath      string `envconfig:"DB_PATH" required:"true"`
 	DBPath      string `envconfig:"DB_PATH" required:"true"`
+	DisableAuth bool   `envconfig:"DISABLE_AUTH" default:"false"`
+	FailFast    bool   `envconfig:"FAIL_FAST" default:"false"`
+	OSCARHost   string `envconfig:"OSCAR_HOST" required:"true"`
+	OSCARPort   int    `envconfig:"OSCAR_PORT" default:"5190"`
 }
 }
 
 
 func Address(host string, port int) string {
 func Address(host string, port int) string {
@@ -199,11 +202,6 @@ const (
 	FlapFrameKeepAlive       = 0x05
 	FlapFrameKeepAlive       = 0x05
 )
 )
 
 
-func handleUnimplementedSNAC(snac oscar.SnacFrame, w io.Writer, sequence *uint32) error {
-	fmt.Printf("unimplemented SNAC: %+v\n", snac)
-	return sendInvalidSNACErr(snac, w, sequence)
-}
-
 func sendInvalidSNACErr(snac oscar.SnacFrame, w io.Writer, sequence *uint32) error {
 func sendInvalidSNACErr(snac oscar.SnacFrame, w io.Writer, sequence *uint32) error {
 	snacFrameOut := oscar.SnacFrame{
 	snacFrameOut := oscar.SnacFrame{
 		FoodGroup: snac.FoodGroup,
 		FoodGroup: snac.FoodGroup,
@@ -285,7 +283,19 @@ func ReadBos(cfg Config, ready OnReadyCB, sess *Session, seq uint32, sm SessionM
 		select {
 		select {
 		case m := <-msgCh:
 		case m := <-msgCh:
 			if err := routeIncomingRequests(cfg, ready, sm, sess, fm, cr, rwc, &seq, m.snac, m.buf); err != nil {
 			if err := routeIncomingRequests(cfg, ready, sm, sess, fm, cr, rwc, &seq, m.snac, m.buf); err != nil {
-				return err
+				switch {
+				case errors.Is(err, ErrUnimplementedSNAC):
+					if err := sendInvalidSNACErr(m.snac, rwc, &seq); err != nil {
+						return err
+					}
+					msg := fmt.Sprintf("unimplemented SNAC: %+v", m.snac)
+					if cfg.FailFast {
+						panic(msg)
+					}
+					fmt.Println(msg)
+				default:
+					return err
+				}
 			}
 			}
 		case m := <-sess.RecvMessage():
 		case m := <-sess.RecvMessage():
 			if err := writeOutSNAC(oscar.SnacFrame{}, m.snacFrame, m.snacOut, &seq, rwc); err != nil {
 			if err := writeOutSNAC(oscar.SnacFrame{}, m.snacFrame, m.snacOut, &seq, rwc); err != nil {
@@ -328,7 +338,7 @@ func routeIncomingRequests(cfg Config, ready OnReadyCB, sm SessionManager, sess
 			return err
 			return err
 		}
 		}
 	case BUCP:
 	case BUCP:
-		if err := routeBUCP(snac, rw, sequence); err != nil {
+		if err := routeBUCP(); err != nil {
 			return err
 			return err
 		}
 		}
 	case CHAT:
 	case CHAT: