Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Credentials module doesn't validate required endpoints #54

Open
andacata opened this issue Dec 28, 2023 · 3 comments
Open

Credentials module doesn't validate required endpoints #54

andacata opened this issue Dec 28, 2023 · 3 comments
Labels

Comments

@andacata
Copy link
Contributor

The platforms may require some endpoints to be available on the other platform.

I'm requesting proposals for approaches to implement it.

@lilgallon
Copy link
Member

lilgallon commented Dec 28, 2023

What do you mean exactly ? As of now, endpoints are secured by the implementation of Http4TransportServer. Example here:

.also { httpRequest ->
if (secured) runBlocking { secureFilter(httpRequest) }
}

The secureFilter is that method in HttpUtils:

suspend fun PartnerRepository.checkToken(
httpRequest: HttpRequest
) {
val token = httpRequest.parseAuthorizationHeader()
/**
* From OCPI 2.2.1 doc:
* When a server receives a request with a valid CREDENTIALS_TOKEN_A, on another module than: credentials or
* versions, the server SHALL respond with an HTTP 401 - Unauthorized status code.
*
* So, we allow token A only if we are in this case.
*/
val allowTokenA = httpRequest.path.contains("versions") ||
httpRequest.path.contains("/{versionNumber}") ||
httpRequest.path.contains("credentials")
val validToken = (allowTokenA && isCredentialsTokenAValid(token)) ||
isCredentialsServerTokenValid(token)
if (!validToken) {
throw OcpiClientInvalidParametersException("Invalid server token (token A allowed: $allowTokenA): $token")
}
}

The secured boolean is set to true by default in transportServer.handle().

suspend fun handle(
method: HttpMethod,
path: List<PathSegment>,
queryParams: List<String> = emptyList(),
secured: Boolean = true,
filters: List<(request: HttpRequest) -> Unit> = emptyList(),
callback: suspend (request: HttpRequest) -> HttpResponse
)

It is used by every OCPI module server implementation. Example in LocationsCpoServer.kt :

transportServer.handle(
method = HttpMethod.GET,
path = basePathSegments + listOf(
VariablePathSegment("locationId")
)
) { req ->
req.httpResponse {
service
.getLocation(
locationId = req.pathParams["locationId"]!!
)
}
}

@andacata
Copy link
Contributor Author

andacata commented Dec 28, 2023

Oh, sorry. I'm talking about the required endpoints from the other platform. From the documentation:

7.1.6. Required endpoints not available
When two platforms connect, it might happen that one of the platforms expects a certain endpoint to be available at the other platform.
For example: a Platform with a CPO role could only want to connect when the CDRs endpoint is available in an platform with an eMSP role.
In case the Sender (starting the credentials exchange process) cannot find the endpoints it expects, it is expected NOT to send the POST request with credentials to the Receiver. Log a message/notify the administrator to contact the administrator of the Receiver platform.
In case the Receiver platform that cannot find the endpoints it expects, then it is expected to respond to the request with the status code 3003.

@lilgallon
Copy link
Member

For that to be implemented, we would need to add a nullable parameter that would be something like "expectedEndpoints". If this is set, during client registration, we need to stop it if the expected endpoints are not available on the receiver

@lilgallon lilgallon added enhancement New feature or request module: credentials labels Jan 4, 2024
lilgallon added a commit that referenced this issue Jan 11, 2024
…points

feat(credentials) #54: validate required endpoints
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants