Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# API Configuration
API_KEY=your_api_key_here
KID=your_kid_here

# Environment (defaults to internal-dev if not set)
APIM_ENV=internal-dev
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ __pycache__/
.venv/

smoketest-report.xml
env
.env*
.dir-locals.el
*.pyc
test-report.xml
10 changes: 5 additions & 5 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
nodejs 16.14.2
python 3.8.15
poetry 2.1.1
shellcheck 0.9.0
actionlint 1.6.26
nodejs 20.19.5
python 3.12.3
poetry 2.2.1
shellcheck 0.11.0
actionlint 1.7.8
17 changes: 1 addition & 16 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 5 additions & 48 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<AssignMessage name="AssignMessage.AddDelegationHeaders">
<Add>
<Headers>
<Header name="X-NHSD-Delegated-Access">{nhsd.delegation.enabled}</Header>
<Header name="X-NHSD-Subject-NHS-Number">{nhsd.subject.nhs_number}</Header>
<!-- TODO: not required as already in NHSD-NHSLogin-User? -->

Check warning on line 6 in proxies/live/apiproxy/policies/AssignMessage.AddDelegationHeaders.xml

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Complete the task associated to this "TODO" comment.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZrkJyKnxcBG2T7dWAvg&open=AZrkJyKnxcBG2T7dWAvg&pullRequest=262
<Header name="X-NHSD-Actor-NHS-Number">{nhsd.actor.nhs_number}</Header>
<Header name="X-NHSD-Delegation-Context">{nhsd.delegation.context_b64}</Header>
</Headers>
</Add>
</AssignMessage>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<AssignMessage name="AssignMessage.EnableDelegatedAccess">
<Set>
<Properties>
<Property name="delegatedaccess.enabled">true</Property>
</Properties>
</Set>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</AssignMessage>
6 changes: 6 additions & 0 deletions proxies/live/apiproxy/policies/javascript.DelegationGate.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="javascript.DelegationGate">
<DisplayName>javascript.DelegationGate</DisplayName>
<Properties/>
<ResourceURL>jsc://DelegationGate.js</ResourceURL>
</Javascript>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="javascript.DelegationSetHeaders">
<DisplayName>javascript.DelegationSetHeaders</DisplayName>
<Properties/>
<ResourceURL>jsc://DelegationSetHeaders.js</ResourceURL>
</Javascript>
23 changes: 23 additions & 0 deletions proxies/live/apiproxy/resources/jsc/DelegationGate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// JS policy: DelegationGate.js
var productOpt = context.getVariable('api.product.attribute.nhsd.delegated_access'); // from GetOAuthV2Info

Check failure on line 2 in proxies/live/apiproxy/resources/jsc/DelegationGate.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unexpected var, use let or const instead.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0F6hfQqdQqEx9A5&open=AZpVH0F6hfQqdQqEx9A5&pullRequest=262
var proxyOpt = context.getVariable('delegatedaccess.enabled') || 'false';

Check failure on line 3 in proxies/live/apiproxy/resources/jsc/DelegationGate.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unexpected var, use let or const instead.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0F6hfQqdQqEx9A6&open=AZpVH0F6hfQqdQqEx9A6&pullRequest=262

var effectiveOptIn = (String(productOpt).toLowerCase() === 'true') && (String(proxyOpt).toLowerCase() === 'true');

Check failure on line 5 in proxies/live/apiproxy/resources/jsc/DelegationGate.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unexpected var, use let or const instead.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0F6hfQqdQqEx9A7&open=AZpVH0F6hfQqdQqEx9A7&pullRequest=262
context.setVariable('nhsd.delegation.enabled', effectiveOptIn);

var topClaims = context.getVariable('jwt.claims'); // JSON string if VerifyJWT set <OutputClaimVariables/>

Check failure on line 8 in proxies/live/apiproxy/resources/jsc/DelegationGate.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unexpected var, use let or const instead.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0F6hfQqdQqEx9A8&open=AZpVH0F6hfQqdQqEx9A8&pullRequest=262
var claims = topClaims ? JSON.parse(topClaims) : {};

Check failure on line 9 in proxies/live/apiproxy/resources/jsc/DelegationGate.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unexpected var, use let or const instead.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0F6hfQqdQqEx9A9&open=AZpVH0F6hfQqdQqEx9A9&pullRequest=262
var hasAct = !!claims.act;

Check failure on line 10 in proxies/live/apiproxy/resources/jsc/DelegationGate.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unexpected var, use let or const instead.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0F6hfQqdQqEx9A-&open=AZpVH0F6hfQqdQqEx9A-&pullRequest=262

context.setVariable('nhsd.delegation.has_act', hasAct);
if (hasAct && !effectiveOptIn) {
// Signal fault path
context.setVariable('nhsd.delegation.reject_reason', 'delegated_access_not_enabled');
context.setVariable('trigger.raisefault', true);
} else if (hasAct && effectiveOptIn) {
// Place nested actor token into a variable for VerifyJWT-Actor
// The structure indicates the actor's ID token is in act.sub
context.setVariable('jwt.actor.token', claims.act && claims.act.sub);

Check warning on line 20 in proxies/live/apiproxy/resources/jsc/DelegationGate.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Prefer using an optional chain expression instead, as it's more concise and easier to read.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0F6hfQqdQqEx9A_&open=AZpVH0F6hfQqdQqEx9A_&pullRequest=262
// Subject NHS number (patient)
if (claims.sub) context.setVariable('nhsd.subject.nhs_number', claims.sub);
}
16 changes: 16 additions & 0 deletions proxies/live/apiproxy/resources/jsc/DelegationSetHeaders.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// JS policy: DelegationSetHeaders.js
var actorSub = context.getVariable('jwt.claim.sub'); // from VJWT-Actor (overwrites claim vars)

Check failure on line 2 in proxies/live/apiproxy/resources/jsc/DelegationSetHeaders.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unexpected var, use let or const instead.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0DGhfQqdQqEx9A1&open=AZpVH0DGhfQqdQqEx9A1&pullRequest=262
var subjectNhs = context.getVariable('nhsd.subject.nhs_number');

Check failure on line 3 in proxies/live/apiproxy/resources/jsc/DelegationSetHeaders.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unexpected var, use let or const instead.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0DGhfQqdQqEx9A2&open=AZpVH0DGhfQqdQqEx9A2&pullRequest=262
if (actorSub) context.setVariable('nhsd.actor.nhs_number', actorSub);

// Build compact context header
var ctx = {

Check failure on line 7 in proxies/live/apiproxy/resources/jsc/DelegationSetHeaders.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unexpected var, use let or const instead.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZpVH0DGhfQqdQqEx9A3&open=AZpVH0DGhfQqdQqEx9A3&pullRequest=262
delegated_access: true,
subject: { nhs_number: subjectNhs },
actor: { nhs_number: actorSub }
};
// var ctxJson = JSON.stringify(ctx);
// var ctxB64 = org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString(
// new java.lang.String(ctxJson).getBytes("UTF-8")
// );
// context.setVariable('nhsd.delegation.context_b64', ctxB64);

Check warning on line 16 in proxies/live/apiproxy/resources/jsc/DelegationSetHeaders.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this commented out code.

See more on https://sonarcloud.io/project/issues?id=NHSDigital_prescriptions-for-patients&issues=AZrkLvsptqlHaTHcZjC2&open=AZrkLvsptqlHaTHcZjC2&pullRequest=262
19 changes: 15 additions & 4 deletions proxies/live/apiproxy/targets/target.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,18 @@
<Step>
<Name>AssignMessage.AddPatientAccessHeader</Name>
</Step>
<Step>
<Name>AssignMessage.EnableDelegatedAccess</Name>
</Step>
<Step>
<Name>javascript.DelegationGate</Name>
</Step>
<Step>
<Name>javascript.DelegationSetHeaders</Name>
</Step>
<Step>
<Name>AssignMessage.AddDelegationHeaders</Name>
</Step>
{% if ALLOW_NHS_NUMBER_OVERRIDE %}
<Step>
<Name>AssignMessage.OverridePatientAccessHeader</Name>
Expand Down Expand Up @@ -71,12 +83,11 @@
</FaultRules>
<!-- Replace HTTPTargetConnection with this for testing to AWS pull requesst

<HTTPTargetConnection>
<URL>https://pr-[aws_pull_request_id].dev.prescriptionsforpatients.national.nhs.uk</URL>
</HTTPTargetConnection>

DO NOT MERGE WITH A CUSTOM HTTPTargetConnection
-->
<HTTPTargetConnection>
<URL>https://pfp-pr-2147.dev.eps.national.nhs.uk</URL>
</HTTPTargetConnection>
<HTTPTargetConnection>
<SSLInfo>
<Enabled>true</Enabled>
Expand Down
14 changes: 6 additions & 8 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
[project]
python = ">=3.8,<3.9.0 || >3.9.1,<4.0"
name = "prescriptions-for-patients"
version = "0.0.1-alpha"
description = "Prescriptions for Patients API"
requires-python = ">=3.12, <4.0"
readme = 'README.md'
license = "MIT"

[tool.poetry]
name = "prescriptions-for-patients"
version = "0.0.1-alpha"
package-mode = false
description = "TODO"
authors = [
"eps team"
]
readme = 'README.md'
license = "MIT"
repository = "https://github.com/NHSDigital/prescriptions-for-patients"
homepage = "https://github.com/NHSDigital/prescriptions-for-patients"
keywords = ["healthcare", "uk", "nhs"] #TODO add additional keywords


[tool.poetry.dependencies]
python = "^3.8"
python = "^3.12"
pre-commit = "^3.5.0"
pytest-nhsd-apim = "^5.0.6"

Expand Down
Loading