Use ProtocolError on invalid requests #751
Draft
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The exceptions ProtocolError and PermissionDenied are both raised by qubesd to indicate various problems with requests. However, both cause clients to print the extremely unhelpful "Got empty response from qubesd" message.
ProtocolError must be used only for client programming errors (bugs), not for problems that the client could not have detected before making the request.
PermissionDenied must be used only for service authorization denials.
Therefore, a API handler can be arranged as:
Ideally, validation that may leak existence of a system property should be done after asking for administrative permission, but then it would not be possible to pass only safe values to "admin-api:" events.
If we are already leaking existence of a property, it makes sense to provide a useful exception class for it.
Fixes: QubesOS/qubes-issues#10345
It is a draft, just posting here for CI. It is more like an idea than a finished version. Logging messages should be okay now, it is only from trusted input.
From some open TODOs:
It seems that most checks that are done before
admin-permissionevents may leak some data but not sure of its sensitiveness.revisionis a datevolumesare always the samepoolandlabelshave a default that most people usetemplateandqubeexistence, not so niceBut without these checks, there is no good error message...