Răsfoiți Sursa

don't auto-create accts with malformatted screen names

Mike 1 an în urmă
părinte
comite
775140c708
2 a modificat fișierele cu 104 adăugiri și 13 ștergeri
  1. 24 13
      foodgroup/auth.go
  2. 80 0
      foodgroup/auth_test.go

+ 24 - 13
foodgroup/auth.go

@@ -338,11 +338,8 @@ func (s AuthService) login(
 	if user == nil {
 		// user not found
 		if s.config.DisableAuth {
-			// auth disabled, create the user and return success
-			if err := s.createUser(props, newUserFn); err != nil {
-				return wire.TLVRestBlock{}, err
-			}
-			return s.loginSuccessResponse(props)
+			// auth disabled, create the user
+			return s.createUser(props, newUserFn)
 		}
 		// auth enabled, return separate login errors for ICQ and AIM
 		loginErr := wire.LoginErrInvalidUsernameOrPassword
@@ -373,23 +370,37 @@ func (s AuthService) login(
 func (s AuthService) createUser(
 	props loginProperties,
 	newUserFn func(screenName state.DisplayScreenName) (state.User, error),
-) error {
+) (wire.TLVRestBlock, error) {
 
-	handleValid := false
+	var err error
 	if props.screenName.IsUIN() {
-		handleValid = props.screenName.ValidateUIN() == nil
+		err = props.screenName.ValidateUIN()
 	} else {
-		handleValid = props.screenName.ValidateAIMHandle() == nil
+		err = props.screenName.ValidateAIMHandle()
 	}
-	if !handleValid {
-		return nil
+
+	if err != nil {
+		switch {
+		case errors.Is(err, state.ErrAIMHandleInvalidFormat) || errors.Is(err, state.ErrAIMHandleLength):
+			return loginFailureResponse(props, wire.LoginErrInvalidUsernameOrPassword), nil
+		case errors.Is(err, state.ErrICQUINInvalidFormat):
+			return loginFailureResponse(props, wire.LoginErrICQUserErr), nil
+		default:
+			return wire.TLVRestBlock{}, err
+		}
 	}
 
 	newUser, err := newUserFn(props.screenName)
 	if err != nil {
-		return err
+		return wire.TLVRestBlock{}, err
 	}
-	return s.userManager.InsertUser(newUser)
+
+	err = s.userManager.InsertUser(newUser)
+	if err != nil {
+		return wire.TLVRestBlock{}, err
+	}
+
+	return s.loginSuccessResponse(props)
 }
 
 func (s AuthService) loginSuccessResponse(props loginProperties) (wire.TLVRestBlock, error) {

+ 80 - 0
foodgroup/auth_test.go

@@ -334,6 +334,86 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
 				},
 			},
 		},
+		{
+			name: "AIM account doesn't exist, authentication is disabled, screen name has bad format, login fails",
+			cfg: config.Config{
+				OSCARHost:   "127.0.0.1",
+				BOSPort:     "1234",
+				DisableAuth: true,
+			},
+			inputSNAC: wire.SNAC_0x17_0x02_BUCPLoginRequest{
+				TLVRestBlock: wire.TLVRestBlock{
+					TLVList: wire.TLVList{
+						wire.NewTLVBE(wire.LoginTLVTagsScreenName, "2coolforschool"),
+						wire.NewTLVBE(wire.LoginTLVTagsPasswordHash, user.StrongMD5Pass),
+					},
+				},
+			},
+			mockParams: mockParams{
+				userManagerParams: userManagerParams{
+					getUserParams: getUserParams{
+						{
+							screenName: state.NewIdentScreenName("2coolforschool"),
+							result:     nil,
+						},
+					},
+				},
+			},
+			expectOutput: wire.SNACMessage{
+				Frame: wire.SNACFrame{
+					FoodGroup: wire.BUCP,
+					SubGroup:  wire.BUCPLoginResponse,
+				},
+				Body: wire.SNAC_0x17_0x03_BUCPLoginResponse{
+					TLVRestBlock: wire.TLVRestBlock{
+						TLVList: wire.TLVList{
+							wire.NewTLVBE(wire.LoginTLVTagsScreenName, state.NewIdentScreenName("2coolforschool")),
+							wire.NewTLVBE(wire.LoginTLVTagsErrorSubcode, wire.LoginErrInvalidUsernameOrPassword),
+						},
+					},
+				},
+			},
+		},
+		{
+			name: "ICQ account doesn't exist, authentication is disabled, UIN has bad format, login fails",
+			cfg: config.Config{
+				OSCARHost:   "127.0.0.1",
+				BOSPort:     "1234",
+				DisableAuth: true,
+			},
+			inputSNAC: wire.SNAC_0x17_0x02_BUCPLoginRequest{
+				TLVRestBlock: wire.TLVRestBlock{
+					TLVList: wire.TLVList{
+						wire.NewTLVBE(wire.LoginTLVTagsScreenName, "99"),
+						wire.NewTLVBE(wire.LoginTLVTagsPasswordHash, user.StrongMD5Pass),
+					},
+				},
+			},
+			mockParams: mockParams{
+				userManagerParams: userManagerParams{
+					getUserParams: getUserParams{
+						{
+							screenName: state.NewIdentScreenName("99"),
+							result:     nil,
+						},
+					},
+				},
+			},
+			expectOutput: wire.SNACMessage{
+				Frame: wire.SNACFrame{
+					FoodGroup: wire.BUCP,
+					SubGroup:  wire.BUCPLoginResponse,
+				},
+				Body: wire.SNAC_0x17_0x03_BUCPLoginResponse{
+					TLVRestBlock: wire.TLVRestBlock{
+						TLVList: wire.TLVList{
+							wire.NewTLVBE(wire.LoginTLVTagsScreenName, state.NewIdentScreenName("99")),
+							wire.NewTLVBE(wire.LoginTLVTagsErrorSubcode, wire.LoginErrICQUserErr),
+						},
+					},
+				},
+			},
+		},
 		{
 			name: "account exists, password is invalid, authentication is disabled, login succeeds",
 			cfg: config.Config{