Răsfoiți Sursa

return ErrorCodeInvalidSnac for unknown SNACs

Mike 2 ani în urmă
părinte
comite
e86abc8c5a
10 a modificat fișierele cu 32 adăugiri și 316 ștergeri
  1. 2 19
      server/bucp.go
  2. 2 23
      server/buddy.go
  3. 2 83
      server/chat.go
  4. 2 13
      server/chat_nav.go
  5. 2 52
      server/feedbag.go
  6. 2 28
      server/icbm.go
  7. 3 27
      server/locate.go
  8. 2 50
      server/oservice.go
  9. 2 20
      server/pd.go
  10. 13 1
      server/protocol.go

+ 2 - 19
server/bucp.go

@@ -21,25 +21,8 @@ const (
 	BUCPRegistrationImageRequest        = 0x000C
 )
 
-func routeBUCP(snac oscar.SnacFrame) error {
-	switch snac.SubGroup {
-	case BUCPErr:
-		panic("not implemented")
-	case BUCPLoginRequest:
-		panic("not implemented")
-	case BUCPRegisterRequest:
-		panic("not implemented")
-	case BUCPChallengeRequest:
-		panic("not implemented")
-	case BUCPAsasnRequest:
-		panic("not implemented")
-	case BUCPSecuridRequest:
-		panic("not implemented")
-	case BUCPRegistrationImageRequest:
-		panic("not implemented")
-	}
-
-	return nil
+func routeBUCP(snac oscar.SnacFrame, w io.Writer, sequence *uint32) error {
+	return sendInvalidSNACErr(snac, w, sequence)
 }
 
 func ReceiveAndSendAuthChallenge(cfg Config, fm *FeedbagStore, r io.Reader, w io.Writer, sequence *uint32, newUUID func() uuid.UUID) error {

+ 2 - 23
server/buddy.go

@@ -24,32 +24,11 @@ const (
 func routeBuddy(snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
 
 	switch snac.SubGroup {
-	case BuddyErr:
-		panic("not implemented")
 	case BuddyRightsQuery:
 		return SendAndReceiveBuddyRights(snac, r, w, sequence)
-	case BuddyAddBuddies:
-		panic("not implemented")
-	case BuddyDelBuddies:
-		panic("not implemented")
-	case BuddyWatcherListQuery:
-		panic("not implemented")
-	case BuddyWatcherSubRequest:
-		panic("not implemented")
-	case BuddyWatcherNotification:
-		panic("not implemented")
-	case BuddyRejectNotification:
-		panic("not implemented")
-	case BuddyArrived:
-		panic("not implemented")
-	case BuddyDeparted:
-		panic("not implemented")
-	case BuddyAddTempBuddies:
-		panic("not implemented")
-	case BuddyDelTempBuddies:
-		panic("not implemented")
+	default:
+		return sendInvalidSNACErr(snac, w, sequence)
 	}
-	return nil
 }
 
 func SendAndReceiveBuddyRights(snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {

+ 2 - 83
server/chat.go

@@ -52,92 +52,11 @@ const (
 
 func routeChat(sess *Session, sm SessionManager, snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
 	switch snac.SubGroup {
-	case ChatErr:
-		panic("not implemented")
-	case ChatRoomInfoUpdate:
-		panic("not implemented")
-	case ChatUsersJoined:
-		panic("not implemented")
-	case ChatUsersLeft:
-		panic("not implemented")
 	case ChatChannelMsgTohost:
 		return SendAndReceiveChatChannelMsgTohost(sess, sm, snac, r, w, sequence)
-	case ChatChannelMsgToclient:
-		panic("not implemented")
-	case ChatEvilRequest:
-		panic("not implemented")
-	case ChatEvilReply:
-		panic("not implemented")
-	case ChatClientErr:
-		panic("not implemented")
-	case ChatPauseRoomReq:
-		panic("not implemented")
-	case ChatPauseRoomAck:
-		panic("not implemented")
-	case ChatResumeRoom:
-		panic("not implemented")
-	case ChatShowMyRow:
-		panic("not implemented")
-	case ChatShowRowByUsername:
-		panic("not implemented")
-	case ChatShowRowByNumber:
-		panic("not implemented")
-	case ChatShowRowByName:
-		panic("not implemented")
-	case ChatRowInfo:
-		panic("not implemented")
-	case ChatListRows:
-		panic("not implemented")
-	case ChatRowListInfo:
-		panic("not implemented")
-	case ChatMoreRows:
-		panic("not implemented")
-	case ChatMoveToRow:
-		panic("not implemented")
-	case ChatToggleChat:
-		panic("not implemented")
-	case ChatSendQuestion:
-		panic("not implemented")
-	case ChatSendComment:
-		panic("not implemented")
-	case ChatTallyVote:
-		panic("not implemented")
-	case ChatAcceptBid:
-		panic("not implemented")
-	case ChatSendInvite:
-		panic("not implemented")
-	case ChatDeclineInvite:
-		panic("not implemented")
-	case ChatAcceptInvite:
-		panic("not implemented")
-	case ChatNotifyMessage:
-		panic("not implemented")
-	case ChatGotoRow:
-		panic("not implemented")
-	case ChatStageUserJoin:
-		panic("not implemented")
-	case ChatStageUserLeft:
-		panic("not implemented")
-	case ChatUnnamedSnac22:
-		panic("not implemented")
-	case ChatClose:
-		panic("not implemented")
-	case ChatUserBan:
-		panic("not implemented")
-	case ChatUserUnban:
-		panic("not implemented")
-	case ChatJoined:
-		panic("not implemented")
-	case ChatUnnamedSnac27:
-		panic("not implemented")
-	case ChatUnnamedSnac28:
-		panic("not implemented")
-	case ChatUnnamedSnac29:
-		panic("not implemented")
-	case ChatRoomInfoOwner:
-		panic("not implemented")
+	default:
+		return sendInvalidSNACErr(snac, w, sequence)
 	}
-	return nil
 }
 
 func SendAndReceiveChatChannelMsgTohost(sess *Session, sm SessionManager, snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {

+ 2 - 13
server/chat_nav.go

@@ -23,26 +23,15 @@ const (
 
 func routeChatNav(sess *Session, cr *ChatRegistry, snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
 	switch snac.SubGroup {
-	case ChatNavErr:
-		panic("not implemented")
 	case ChatNavRequestChatRights:
 		return SendAndReceiveNextChatRights(snac, w, sequence)
-	case ChatNavRequestExchangeInfo:
-		panic("not implemented")
 	case ChatNavRequestRoomInfo:
 		return SendAndReceiveRequestRoomInfo(cr, snac, r, w, sequence)
-	case ChatNavRequestMoreRoomInfo:
-		panic("not implemented")
-	case ChatNavRequestOccupantList:
-		panic("not implemented")
-	case ChatNavSearchForRoom:
-		panic("not implemented")
 	case ChatNavCreateRoom:
 		return SendAndReceiveCreateRoom(sess, cr, NewChatRoom, snac, r, w, sequence)
-	case ChatNavNavInfo:
-		panic("not implemented")
+	default:
+		return sendInvalidSNACErr(snac, w, sequence)
 	}
-	return nil
 }
 
 type ChatCookie struct {

+ 2 - 52
server/feedbag.go

@@ -148,8 +148,6 @@ const (
 
 func routeFeedbag(sm SessionManager, sess *Session, fm *FeedbagStore, snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
 	switch snac.SubGroup {
-	case FeedbagErr:
-		panic("not implemented")
 	case FeedbagRightsQuery:
 		return SendAndReceiveFeedbagRightsQuery(snac, r, w, sequence)
 	case FeedbagQuery:
@@ -164,61 +162,13 @@ func routeFeedbag(sm SessionManager, sess *Session, fm *FeedbagStore, snac oscar
 		return ReceiveUpdateItem(sm, sess, fm, snac, r, w, sequence)
 	case FeedbagDeleteItem:
 		return ReceiveDeleteItem(sm, sess, fm, snac, r, w, sequence)
-	case FeedbagInsertClass:
-		panic("not implemented")
-	case FeedbagUpdateClass:
-		panic("not implemented")
-	case FeedbagDeleteClass:
-		panic("not implemented")
-	case FeedbagStatus:
-		panic("not implemented")
-	case FeedbagReplyNotModified:
-		panic("not implemented")
-	case FeedbagDeleteUser:
-		panic("not implemented")
 	case FeedbagStartCluster:
 		return ReceiveFeedbagStartCluster(snac, r, w, sequence)
 	case FeedbagEndCluster:
 		return ReceiveFeedbagEndCluster(snac, r, w, sequence)
-	case FeedbagAuthorizeBuddy:
-		panic("not implemented")
-	case FeedbagPreAuthorizeBuddy:
-		panic("not implemented")
-	case FeedbagPreAuthorizedBuddy:
-		panic("not implemented")
-	case FeedbagRemoveMe:
-		panic("not implemented")
-	case FeedbagRemoveMe2:
-		panic("not implemented")
-	case FeedbagRequestAuthorizeToHost:
-		panic("not implemented")
-	case FeedbagRequestAuthorizeToClient:
-		panic("not implemented")
-	case FeedbagRespondAuthorizeToHost:
-		panic("not implemented")
-	case FeedbagRespondAuthorizeToClient:
-		panic("not implemented")
-	case FeedbagBuddyAdded:
-		panic("not implemented")
-	case FeedbagRequestAuthorizeToBadog:
-		panic("not implemented")
-	case FeedbagRespondAuthorizeToBadog:
-		panic("not implemented")
-	case FeedbagBuddyAddedToBadog:
-		panic("not implemented")
-	case FeedbagTestSnac:
-		panic("not implemented")
-	case FeedbagForwardMsg:
-		panic("not implemented")
-	case FeedbagIsAuthRequiredQuery:
-		panic("not implemented")
-	case FeedbagIsAuthRequiredReply:
-		panic("not implemented")
-	case FeedbagRecentBuddyUpdate:
-		panic("not implemented")
+	default:
+		return sendInvalidSNACErr(snac, w, sequence)
 	}
-
-	return nil
 }
 
 func SendAndReceiveFeedbagRightsQuery(snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {

+ 2 - 28
server/icbm.go

@@ -38,47 +38,21 @@ const (
 
 func routeICBM(sm SessionManager, fm *FeedbagStore, sess *Session, snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
 	switch snac.SubGroup {
-	case ICBMErr:
-		panic("not implemented")
 	case ICBMAddParameters:
 		return ReceiveAddParameters(snac, r)
-	case ICBMDelParameters:
-		panic("not implemented")
 	case ICBMParameterQuery:
 		return SendAndReceiveICBMParameterReply(snac, r, w, sequence)
 	case ICBMChannelMsgTohost:
 		return SendAndReceiveChannelMsgTohost(sm, fm, sess, snac, r, w, sequence)
-	case ICBMChannelMsgToclient:
-		panic("not implemented")
 	case ICBMEvilRequest:
 		return SendAndReceiveEvilRequest(sm, fm, sess, snac, r, w, sequence)
-	case ICBMMissedCalls:
-		panic("not implemented")
 	case ICBMClientErr:
 		return ReceiveClientErr(snac, r)
-	case ICBMHostAck:
-		panic("not implemented")
-	case ICBMSinStored:
-		panic("not implemented")
-	case ICBMSinListQuery:
-		panic("not implemented")
-	case ICBMSinListReply:
-		panic("not implemented")
-	case ICBMSinRetrieve:
-		panic("not implemented")
-	case ICBMSinDelete:
-		panic("not implemented")
-	case ICBMNotifyRequest:
-		panic("not implemented")
-	case ICBMNotifyReply:
-		panic("not implemented")
 	case ICBMClientEvent:
 		return SendAndReceiveClientEvent(sm, fm, sess, snac, r)
-	case ICBMSinReply:
-		panic("not implemented")
+	default:
+		return sendInvalidSNACErr(snac, w, sequence)
 	}
-
-	return nil
 }
 
 func SendAndReceiveICBMParameterReply(snac oscar.SnacFrame, _ io.Reader, w io.Writer, sequence *uint32) error {

+ 3 - 27
server/locate.go

@@ -31,7 +31,7 @@ const (
 	LocateUserInfoQuery2              = 0x0015
 )
 
-var (
+const (
 	LocateTLVTagsInfoSigMime         uint16 = 0x01
 	LocateTLVTagsInfoSigData         uint16 = 0x02
 	LocateTLVTagsInfoUnavailableMime uint16 = 0x03
@@ -47,45 +47,21 @@ var (
 
 func routeLocate(sess *Session, sm SessionManager, fm *FeedbagStore, snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
 	switch snac.SubGroup {
-	case LocateErr:
-		panic("not implemented")
 	case LocateRightsQuery:
 		return SendAndReceiveLocateRights(snac, w, sequence)
 	case LocateSetInfo:
 		return ReceiveSetInfo(sess, sm, fm, snac, r)
-	case LocateUserInfoQuery:
-		panic("not implemented")
-	case LocateUserInfoReply:
-		panic("not implemented")
-	case LocateWatcherSubRequest:
-		panic("not implemented")
-	case LocateWatcherNotification:
-		panic("not implemented")
 	case LocateSetDirInfo:
 		return SendAndReceiveSetDirInfo(snac, r, w, sequence)
 	case LocateGetDirInfo:
 		return ReceiveLocateGetDirInfo(snac, r)
-	case LocateGetDirReply:
-		panic("not implemented")
-	case LocateGroupCapabilityQuery:
-		panic("not implemented")
-	case LocateGroupCapabilityReply:
-		panic("not implemented")
 	case LocateSetKeywordInfo:
 		return SendAndReceiveSetKeywordInfo(snac, r, w, sequence)
-	case LocateGetKeywordInfo:
-		panic("not implemented")
-	case LocateGetKeywordReply:
-		panic("not implemented")
-	case LocateFindListByEmail:
-		panic("not implemented")
-	case LocateFindListReply:
-		panic("not implemented")
 	case LocateUserInfoQuery2:
 		return SendAndReceiveUserInfoQuery2(sess, sm, fm, fm, snac, r, w, sequence)
+	default:
+		return sendInvalidSNACErr(snac, w, sequence)
 	}
-
-	return nil
 }
 
 func SendAndReceiveLocateRights(snac oscar.SnacFrame, w io.Writer, sequence *uint32) error {

+ 2 - 50
server/oservice.go

@@ -49,73 +49,25 @@ const (
 
 func routeOService(cfg Config, ready OnReadyCB, cr *ChatRegistry, sm SessionManager, fm *FeedbagStore, sess *Session, snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
 	switch snac.SubGroup {
-	case OServiceErr:
-		panic("not implemented")
 	case OServiceClientOnline:
 		return ReceiveClientOnline(ready, sess, sm, snac, r, w, sequence)
-	case OServiceHostOnline:
-		panic("not implemented")
 	case OServiceServiceRequest:
 		return ReceiveAndSendServiceRequest(cfg, cr, sess, snac, r, w, sequence)
 	case OServiceRateParamsQuery:
 		return ReceiveAndSendServiceRateParams(snac, r, w, sequence)
 	case OServiceRateParamsSubAdd:
 		return ReceiveRateParamsSubAdd(snac, r)
-	case OServiceRateDelParamSub:
-		panic("not implemented")
-	case OServiceRateParamChange:
-		panic("not implemented")
-	case OServicePauseReq:
-		panic("not implemented")
-	case OServicePauseAck:
-		panic("not implemented")
-	case OServiceResume:
-		panic("not implemented")
 	case OServiceUserInfoQuery:
 		return ReceiveAndSendServiceRequestSelfInfo(sess, snac, r, w, sequence)
-	case OServiceUserInfoUpdate:
-		panic("not implemented")
-	case OServiceEvilNotification:
-		panic("not implemented")
 	case OServiceIdleNotification:
 		return ReceiveIdleNotification(sess, sm, fm, snac, r)
-	case OServiceMigrateGroups:
-		panic("not implemented")
-	case OServiceMotd:
-		panic("not implemented")
-	case OServiceSetPrivacyFlags:
-		panic("not implemented")
-	case OServiceWellKnownUrls:
-		panic("not implemented")
-	case OServiceNoop:
-		panic("not implemented")
 	case OServiceClientVersions:
 		return ReceiveAndSendHostVersions(snac, r, w, sequence)
-	case OServiceMaxConfigQuery:
-		panic("not implemented")
-	case OServiceMaxConfigReply:
-		panic("not implemented")
-	case OServiceStoreConfig:
-		panic("not implemented")
-	case OServiceConfigQuery:
-		panic("not implemented")
-	case OServiceConfigReply:
-		panic("not implemented")
 	case OServiceSetUserinfoFields:
 		return ReceiveSetUserInfoFields(sess, sm, fm, snac, r, w, sequence)
-	case OServiceProbeReq:
-		panic("not implemented")
-	case OServiceProbeAck:
-		panic("not implemented")
-	case OServiceBartReply:
-		panic("not implemented")
-	case OServiceBartQuery2:
-		panic("not implemented")
-	case OServiceBartReply2:
-		panic("not implemented")
+	default:
+		return sendInvalidSNACErr(snac, w, sequence)
 	}
-
-	return nil
 }
 
 func WriteOServiceHostOnline(foodGroups []uint16, w io.Writer, sequence *uint32) error {

+ 2 - 20
server/pd.go

@@ -22,29 +22,11 @@ const (
 
 func routePD(snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
 	switch snac.SubGroup {
-	case PDErr:
-		panic("not implemented")
 	case PDRightsQuery:
 		return SendAndReceivePDRightsQuery(snac, r, w, sequence)
-	case PDSetGroupPermitMask:
-		panic("not implemented")
-	case PDAddPermListEntries:
-		panic("not implemented")
-	case PDDelPermListEntries:
-		panic("not implemented")
-	case PDAddDenyListEntries:
-		panic("not implemented")
-	case PDDelDenyListEntries:
-		panic("not implemented")
-	case PDBosErr:
-		panic("not implemented")
-	case PDAddTempPermitListEntries:
-		panic("not implemented")
-	case PDDelTempPermitListEntries:
-		panic("not implemented")
+	default:
+		return sendInvalidSNACErr(snac, w, sequence)
 	}
-
-	return nil
 }
 
 func SendAndReceivePDRightsQuery(snac oscar.SnacFrame, _ io.Reader, w io.Writer, sequence *uint32) error {

+ 13 - 1
server/protocol.go

@@ -199,6 +199,18 @@ const (
 	FlapFrameKeepAlive       = 0x05
 )
 
+func sendInvalidSNACErr(snac oscar.SnacFrame, w io.Writer, sequence *uint32) error {
+	fmt.Printf("unimplemented SNAC: %+v\n", snac)
+	snacFrameOut := oscar.SnacFrame{
+		FoodGroup: snac.FoodGroup,
+		SubGroup:  0x01, // error subgroup for all SNACs
+	}
+	snacPayloadOut := oscar.SnacError{
+		Code: ErrorCodeInvalidSnac,
+	}
+	return writeOutSNAC(snac, snacFrameOut, snacPayloadOut, sequence, w)
+}
+
 func readIncomingRequests(rw io.Reader, msgCh chan IncomingMessage, errCh chan error) {
 	defer close(msgCh)
 	defer close(errCh)
@@ -312,7 +324,7 @@ func routeIncomingRequests(cfg Config, ready OnReadyCB, sm SessionManager, sess
 			return err
 		}
 	case BUCP:
-		if err := routeBUCP(snac); err != nil {
+		if err := routeBUCP(snac, rw, sequence); err != nil {
 			return err
 		}
 	case CHAT: