@@ -2407,6 +2407,49 @@ describe('beforeSave hooks', () => {
24072407 expect ( res . length ) . toEqual ( 1 ) ;
24082408 expect ( res [ 0 ] . get ( 'foo' ) ) . toEqual ( 'bar' ) ;
24092409 } ) ;
2410+
2411+ it ( 'should have access to plaintext password on signup for password policy enforcement' , async ( ) => {
2412+ let receivedPassword ;
2413+ Parse . Cloud . beforeSave ( Parse . User , req => {
2414+ receivedPassword = req . object . get ( 'password' ) ;
2415+ } ) ;
2416+
2417+ const user = new Parse . User ( ) ;
2418+ user . setUsername ( 'testuser' ) ;
2419+ user . setPassword ( 'securePassword123' ) ;
2420+ await user . signUp ( ) ;
2421+
2422+ expect ( receivedPassword ) . toBe ( 'securePassword123' ) ;
2423+ } ) ;
2424+
2425+ it ( 'should have access to plaintext password on password change for password policy enforcement' , async ( ) => {
2426+ const user = new Parse . User ( ) ;
2427+ user . setUsername ( 'testuser' ) ;
2428+ user . setPassword ( 'originalPassword' ) ;
2429+ await user . signUp ( ) ;
2430+
2431+ let receivedPassword ;
2432+ Parse . Cloud . beforeSave ( Parse . User , req => {
2433+ receivedPassword = req . object . get ( 'password' ) ;
2434+ } ) ;
2435+
2436+ user . setPassword ( 'newPassword456' ) ;
2437+ await user . save ( null , { sessionToken : user . getSessionToken ( ) } ) ;
2438+
2439+ expect ( receivedPassword ) . toBe ( 'newPassword456' ) ;
2440+ } ) ;
2441+
2442+ it ( 'should not expose plaintext password in API response' , async ( ) => {
2443+ Parse . Cloud . beforeSave ( Parse . User , ( ) => { } ) ;
2444+
2445+ const user = new Parse . User ( ) ;
2446+ user . setUsername ( 'testuser' ) ;
2447+ user . setPassword ( 'securePassword123' ) ;
2448+ const result = await user . signUp ( ) ;
2449+
2450+ expect ( result . get ( 'password' ) ) . toBeUndefined ( ) ;
2451+ expect ( result . get ( '_hashed_password' ) ) . toBeUndefined ( ) ;
2452+ } ) ;
24102453} ) ;
24112454
24122455describe ( 'afterSave hooks' , ( ) => {
0 commit comments