Skip to content

Commit 2126cdd

Browse files
authored
ITEP-70317 User provided data sanitization (#476)
1 parent 336c373 commit 2126cdd

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

platform/services/user_directory/app/endpoints/user_management/password_reset.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
5360
def _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

Comments
 (0)