Skip to content

Commit 5bab42f

Browse files
committed
[Issue #8997] Handle Privilege HTTPError without logging exception
1 parent 13d29b1 commit 5bab42f

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

api/src/legacy_soap_api/legacy_soap_api_routes.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22

3+
from apiflask.exceptions import HTTPError
34
from flask import request
45

56
import src.adapters.db as db
@@ -98,8 +99,17 @@ def simpler_soap_api_route(
9899
return get_simpler_soap_response(
99100
soap_request, soap_proxy_response, db_session
100101
).to_flask_response()
102+
except HTTPError:
103+
msg = "Do not have the required privileges"
104+
logger.info(
105+
msg=msg,
106+
extra={
107+
"soap_api_event": LegacySoapApiEvent.ERROR_CALLING_SIMPLER,
108+
},
109+
)
110+
return soap_proxy_response.to_flask_response()
101111
except Exception:
102-
msg = "Unable to process Simpler SOAP proxy response"
112+
msg = "User did not have permission to access this application"
103113
logger.exception(
104114
msg=msg,
105115
extra={

api/tests/src/legacy_soap_api/test_legacy_soap_api_routes.py

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,24 @@
1+
import logging
12
from unittest import mock
23

34
from lxml import etree
45

5-
from src.legacy_soap_api.legacy_soap_api_auth import USE_SOAP_JWT_HEADER_KEY
6+
from src.constants.lookup_constants import Privilege
7+
from src.legacy_soap_api.legacy_soap_api_auth import (
8+
USE_SOAP_JWT_HEADER_KEY,
9+
SOAPAuth,
10+
SOAPClientCertificate,
11+
)
612
from src.legacy_soap_api.legacy_soap_api_utils import get_invalid_path_response
13+
from tests.lib.data_factories import setup_cert_user
14+
from tests.src.db.models.factories import (
15+
AgencyFactory,
16+
ApplicationFactory,
17+
ApplicationSubmissionFactory,
18+
CompetitionFactory,
19+
LegacyAgencyCertificateFactory,
20+
OpportunityFactory,
21+
)
722

823
NSMAP = {
924
"envelope": "http://schemas.xmlsoap.org/soap/envelope/",
@@ -15,6 +30,9 @@
1530
LEGACY_TRACKING_NUMBER = "GRANT00000008"
1631
GET_APPLICATION_PATH = f"{{{NSMAP['envelope']}}}Body/{{{NSMAP['application_request']}}}GetApplicationRequest/{{{NSMAP['tracking_number']}}}GrantsGovTrackingNumber"
1732
GET_APPLICATION_ZIP_PATH = f"{{{NSMAP['envelope']}}}Body/{{{NSMAP['application_request']}}}GetApplicationZipRequest/{{{NSMAP['tracking_number']}}}GrantsGovTrackingNumber"
33+
MOCK_FINGERPRINT = "123"
34+
MOCK_CERT = "456"
35+
MOCK_CERT_STR = "certstr"
1836

1937

2038
def test_successful_request(client, fixture_from_file, caplog) -> None:
@@ -244,3 +262,43 @@ def test_simpler_getapplicationzip_operation_returns_not_found_response_includes
244262
assert (
245263
response.headers["Set-Cookie"] == "JSESSIONID=xyz; Path=/grantsws-agency; Secure; HttpOnly"
246264
)
265+
266+
267+
def test_simpler_getapplicationzip_operation_raising_httperror_due_to_privileges_logs_info(
268+
client, fixture_from_file, enable_factory_create, caplog
269+
) -> None:
270+
caplog.set_level(logging.INFO)
271+
agency = AgencyFactory.create()
272+
user, role, soap_client_certificate = setup_cert_user(
273+
agency, {Privilege.LEGACY_AGENCY_GRANT_RETRIEVER}
274+
)
275+
opportunity = OpportunityFactory.create(agency_code=agency.agency_code)
276+
competition = CompetitionFactory(
277+
opportunity=opportunity,
278+
)
279+
application = ApplicationFactory.create(competition=competition)
280+
submission = ApplicationSubmissionFactory.create(application=application)
281+
full_path = "/grantsws-agency/services/v2/AgencyWebServicesSoapPort"
282+
fixture_path = "/legacy_soap_api/grantors/get_application_zip_request.xml"
283+
mock_data = fixture_from_file(fixture_path)
284+
envelope = etree.fromstring(mock_data)
285+
tracking_number = envelope.find(GET_APPLICATION_ZIP_PATH)
286+
tracking_number.text = f"GRANT{submission.legacy_tracking_number}"
287+
mock_client_cert = SOAPClientCertificate(
288+
cert=MOCK_CERT_STR,
289+
fingerprint=MOCK_FINGERPRINT,
290+
serial_number="1235",
291+
legacy_certificate=LegacyAgencyCertificateFactory.create(),
292+
)
293+
with mock.patch("src.legacy_soap_api.legacy_soap_api_routes.get_soap_auth") as mock_get_auth:
294+
mock_get_auth.return_value = SOAPAuth(certificate=mock_client_cert)
295+
response = client.post(
296+
full_path, data=etree.tostring(envelope), headers={"Use-Simpler-Override": "true"}
297+
)
298+
assert response.status_code == 500
299+
post_message = next(
300+
record
301+
for record in caplog.records
302+
if record.message == "User did not have permission to access this application"
303+
)
304+
assert post_message

0 commit comments

Comments
 (0)