Skip to content

Commit

Permalink
Return the partial success code override for all batch error types (#…
Browse files Browse the repository at this point in the history
…18310)

* Return the partial success code override for all batch error types

* changelog

* docs

* Lost the actual override logic. :)

* And don't hardcode 400

* gate on success
  • Loading branch information
sgmiller authored and AnPucel committed Jan 14, 2023
1 parent 3e302ce commit bd728c8
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 20 deletions.
26 changes: 14 additions & 12 deletions builtin/logical/transit/path_encrypt.go
Original file line number Diff line number Diff line change
Expand Up @@ -509,21 +509,23 @@ func (b *backend) pathEncryptWrite(ctx context.Context, req *logical.Request, d
// that user errors are non-retryable without making changes to the request, and should be surfaced
// to the user first.
func batchRequestResponse(d *framework.FieldData, resp *logical.Response, req *logical.Request, successesInBatch, userErrorInBatch, internalErrorInBatch bool) (*logical.Response, error) {
switch {
case userErrorInBatch:
code := http.StatusBadRequest
if successesInBatch {
if codeRaw, ok := d.GetOk("partial_failure_response_code"); ok {
code = codeRaw.(int)
if code < 1 || code > 599 {
resp.AddWarning("invalid HTTP response code override from partial_failure_response_code, reverting to HTTP 400")
code = http.StatusBadRequest
}
if userErrorInBatch || internalErrorInBatch {
var code int
switch {
case userErrorInBatch:
code = http.StatusBadRequest
case internalErrorInBatch:
code = http.StatusInternalServerError
}
if codeRaw, ok := d.GetOk("partial_failure_response_code"); ok && successesInBatch {
newCode := codeRaw.(int)
if newCode < 1 || newCode > 599 {
resp.AddWarning(fmt.Sprintf("invalid HTTP response code override from partial_failure_response_code, reverting to %d", code))
} else {
code = newCode
}
}
return logical.RespondWithStatusCode(resp, req, code)
case internalErrorInBatch:
return logical.RespondWithStatusCode(resp, req, http.StatusInternalServerError)
}

return resp, nil
Expand Down
3 changes: 3 additions & 0 deletions changelog/18310.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
secrets/transit: Honor `partial_success_response_code` on decryption failures.
```
22 changes: 14 additions & 8 deletions website/content/api-docs/secret/transit.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -661,10 +661,13 @@ will be returned.
impact the ciphertext's security.

- `partial_failure_response_code` `(int: 400)` Ordinarily, if a batch item fails
to encrypt due to a bad input, but other batch items succeed, the HTTP response
code is 400 (Bad Request). Some applications may want to treat partial failures
differently. Providing the parameter returns the given response code integer
instead of a 400 in this case. If all values fail HTTP 400 is still returned.
to encrypt due to a bad input, but other batch items succeed, the HTTP response
code is 400 (Bad Request). Some applications may want to treat partial failures
differently. Providing the parameter returns the given response code integer
instead of a failed status code in this case. If all values fail an error
code is still returned. Be warned that some failures (such as failure to
decrypt) could be indicative of a security breach and should not be
ignored.

~>**NOTE:** All plaintext data **must be base64-encoded**. The reason for this
requirement is that Vault does not require that the plaintext is "text". It
Expand Down Expand Up @@ -756,10 +759,13 @@ This endpoint decrypts the provided ciphertext using the named key.
]
```
- `partial_failure_response_code` `(int: 400)` Ordinarily, if a batch item fails
to encrypt due to a bad input, but other batch items succeed, the HTTP response
code is 400 (Bad Request). Some applications may want to treat partial failures
differently. Providing the parameter returns the given response code integer
instead of a 400 in this case. If all values fail HTTP 400 is still returned.
to encrypt due to a bad input, but other batch items succeed, the HTTP response
code is 400 (Bad Request). Some applications may want to treat partial failures
differently. Providing the parameter returns the given response code integer
instead of a failed status code in this case. If all values fail an error
code is still returned. Be warned that some failures (such as failure to
decrypt) could be indicative of a security breach and should not be
ignored.

### Sample Payload

Expand Down

0 comments on commit bd728c8

Please sign in to comment.