@@ -50,6 +50,13 @@ class PasswordResetData(BaseModel):
5050 token : str
5151
5252
53+ def _sanitize_input (input_data : str ) -> str :
54+ """
55+ Sanitize input data by removing newlines and carriage returns.
56+ """
57+ return input_data .replace ("\n " , "" ).replace ("\r " , "" )
58+
59+
5360def _send_password_reset_email (user : UserType , exp_period_in_min : int , server_address : str ):
5461 users_handler = UsersHandler (** AUTH_CONFIG )
5562 secret = get_secrets (
@@ -99,11 +106,13 @@ async def request_password_reset( # noqa: ANN201
99106 :param user_data: data payload containing user's email address.
100107 :param host: 'Host' header value in request
101108 """
102- server_address = host if host else "intel.com"
109+ server_address = _sanitize_input (host ) if host else "intel.com"
110+ sanitized_email = _sanitize_input (user_data .email )
103111 try :
104- UsersHandler .is_email_valid (user_data . email )
112+ UsersHandler .is_email_valid (sanitized_email )
105113 except InvalidEmail as msg :
106- logger .error (msg )
114+ sanitized_msg = _sanitize_input (str (msg ))
115+ logger .error (sanitized_msg )
107116 return PlainTextResponse (ErrorMessages .INVALID_EMAIL , status_code = HTTPStatus .UNPROCESSABLE_ENTITY )
108117
109118 with tracer .start_as_current_span ("get-expiration-time-from-cm" ):
@@ -117,10 +126,10 @@ async def request_password_reset( # noqa: ANN201
117126 return PlainTextResponse (ErrorMessages .SMTP_SERVER_NOT_CONFIGURED , status_code = HTTPStatus .BAD_REQUEST )
118127
119128 with tracer .start_as_current_span ("get-user-by-email" ):
120- user = await get_user_by_email (user_data . email )
129+ user = await get_user_by_email (sanitized_email )
121130
122131 if user is None :
123- logger .error (f"User does not exist { user_data . email } " )
132+ logger .error (f"User does not exist { sanitized_email } " )
124133 else :
125134 _send_password_reset_email (user = user , exp_period_in_min = exp_period_in_min , server_address = server_address )
126135
@@ -141,7 +150,8 @@ async def check_token_validity(token: str, request: Request, host: Annotated[str
141150 """
142151 Validate token, replace it with new one and redirect to UI page.
143152 """
144- server_address = host if host else "intel.com"
153+ server_address = _sanitize_input (host ) if host else "intel.com"
154+ sanitized_path = _sanitize_input (request .url .path )
145155 try :
146156 handler = UsersHandler (** AUTH_CONFIG )
147157 secret = get_secrets (
@@ -150,15 +160,15 @@ async def check_token_validity(token: str, request: Request, host: Annotated[str
150160 )["key" ]
151161 user = verify_jwt_token (handler , token ) # removes the token after successful verification
152162 new_token = handler .generate_replacing_jwt_token (uid = user ["uid" ], prev_token = token , secret = secret )
153- logger .info (f"Link { request . url . path } is valid to use" )
154- redirect_link = f"https://{ server_address } { request . url . path .replace ('/api/v1/users/' , '/' )} ?token={ new_token } "
163+ logger .info (f"Link { sanitized_path } is valid to use" )
164+ redirect_link = f"https://{ server_address } { sanitized_path .replace ('/api/v1/users/' , '/' )} ?token={ new_token } "
155165 logger .info (f"Redirecting to: { redirect_link } " )
156166 return RedirectResponse (url = redirect_link )
157167 except UserDoesNotExist :
158168 logger .exception ("User does not exist. Redirecting to error page." )
159169 return RedirectResponse (url = f"https://{ server_address } /registration/users/not-found" )
160170 except (ExpiredSignatureError , BadTokenError ):
161- logger .exception (f"Link { request [ 'path' ] } has already been used or expired. Redirecting to error page." )
171+ logger .exception (f"Link { sanitized_path } has already been used or expired. Redirecting to error page." )
162172 return RedirectResponse (url = f"https://{ server_address } /registration/invalid-link" )
163173
164174
0 commit comments