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

[Files] correct for anomalies in content disposition value for file downloads #176822

Conversation

eokoneyo
Copy link
Contributor

@eokoneyo eokoneyo commented Feb 13, 2024

Summary

closes; #173138

Looking into this, it turns out this issue was happening because the header value for content-disposition contained invalid characters given we were using the filename as is.

See Screenshot resulting from debugging the request;

Screenshot 2024-02-13 at 13 38 53

To fix this, I've opted to leverage the package content-disposition, in place of some custom approach to fix this res.file handler which correctly handles computation for content-disposition in place of res.ok and providing our own computation of the value for content-disposition.

Verifying the fix:

  • Navigate to cases, (found in the the nav menu for stack management)
  • create a new case, if there isn't one you can readily use
  • click the files tab and grab an image you'd like to upload, before you do rename said image to Screenshot 2023-12-11 at 1 29 07 PM keeping it's extension
  • on image upload complete, you should be able to view the preview for the just uploaded image.

@eokoneyo eokoneyo added release_note:fix Team:SharedUX Team label for AppEx-SharedUX (formerly Global Experience) labels Feb 13, 2024
@eokoneyo eokoneyo self-assigned this Feb 13, 2024
@eokoneyo eokoneyo marked this pull request as ready for review February 13, 2024 14:01
@eokoneyo eokoneyo requested a review from a team as a code owner February 13, 2024 14:01
@elasticmachine
Copy link
Contributor

Pinging @elastic/appex-sharedux (Team:SharedUX)

@eokoneyo eokoneyo linked an issue Feb 13, 2024 that may be closed by this pull request
@eokoneyo eokoneyo changed the title correct for anomalies in content disposition value for file downloads [Files] correct for anomalies in content disposition value for file downloads Feb 13, 2024
@eokoneyo eokoneyo force-pushed the fix/issue-downloading-files-with-special-characters branch 3 times, most recently from 2414fb6 to 939f3df Compare February 13, 2024 15:44
Copy link
Member

@tsullivan tsullivan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion to try using res.file in the route handlers

src/plugins/files/server/routes/common.ts Outdated Show resolved Hide resolved
Comment on lines -22 to -26
// Note, this name can be overridden by the client if set via a "download" attribute on the HTML tag.
'content-disposition': `attachment; filename="${fileName || getDownloadedFileName(file)}"`,
'cache-control': 'max-age=31536000, immutable',
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
'x-content-type-options': 'nosniff',
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The header fields content-disposition and x-content-type-options are removed because the handler res.file already takes care of providing these values.

@eokoneyo eokoneyo force-pushed the fix/issue-downloading-files-with-special-characters branch 2 times, most recently from b28a416 to e5e15f7 Compare February 14, 2024 03:03
@eokoneyo eokoneyo requested a review from tsullivan February 14, 2024 03:04
Copy link
Member

@tsullivan tsullivan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!!1

@eokoneyo eokoneyo requested a review from a team as a code owner February 19, 2024 10:20
@eokoneyo eokoneyo force-pushed the fix/issue-downloading-files-with-special-characters branch from 2e829d8 to d734899 Compare February 19, 2024 10:21
@@ -72,7 +72,7 @@ describe('File kind HTTP API', () => {
.expect(200);

expect(header['content-type']).toEqual('image/png');
expect(header['content-disposition']).toEqual('attachment; filename="test.png"');
expect(header['content-disposition']).toEqual('attachment; filename=test.png');
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The res.file implementation provides the filename for content-disposition header without quotes, and is still a valid value, see the spec

@@ -310,7 +310,7 @@ export default ({ getService }: FtrProviderContext): void => {
});

expect(header['content-type']).to.eql('image/png');
expect(header['content-disposition']).to.eql('attachment; filename="test.png"');
expect(header['content-disposition']).to.eql('attachment; filename=test.png');
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See

@eokoneyo
Copy link
Contributor Author

/ci

@eokoneyo eokoneyo force-pushed the fix/issue-downloading-files-with-special-characters branch from d734899 to 9ac26a3 Compare February 19, 2024 11:36
@eokoneyo eokoneyo requested a review from a team as a code owner February 19, 2024 11:36
@botelastic botelastic bot added the Team:Fleet Team label for Observability Data Collection Fleet team label Feb 19, 2024
@elasticmachine
Copy link
Contributor

Pinging @elastic/fleet (Team:Fleet)

Copy link
Member

@cnasikas cnasikas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cases code LGTM! I tested and everything is working as expected.

Copy link
Contributor

@juliaElastic juliaElastic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fleet change LGTM

@eokoneyo eokoneyo force-pushed the fix/issue-downloading-files-with-special-characters branch from 9ac26a3 to 487695d Compare February 19, 2024 14:28
@eokoneyo eokoneyo enabled auto-merge (squash) February 19, 2024 15:48
@kibana-ci
Copy link
Collaborator

💛 Build succeeded, but was flaky

Failed CI Steps

Test Failures

  • [job] [logs] FTR Configs #92 / Actions and Triggers app Rules list rules list bulk actions should apply filters to bulk actions when using the select all button

Metrics [docs]

✅ unchanged

History

  • 💔 Build #194134 failed 9ac26a3171c61ebbfb1847e1348ffb5637b1056d
  • 💔 Build #193506 failed e5e15f7e420e2161f9d697067bec5a8cbad46086
  • 💚 Build #193339 succeeded 939f3dfc48419ef2fab8303adbb5c7a68c2bc0c6
  • 💔 Build #193313 failed 2414fb6b7a8e00564d4c37e0c8f145d6c2dd97f2
  • 💔 Build #193300 failed 7dad47c3f8c3edac2c9280c9f646c9b24c6dd651

To update your PR or re-run it, just comment with:
@elasticmachine merge upstream

cc @eokoneyo

@eokoneyo eokoneyo merged commit fccbd5c into elastic:main Feb 19, 2024
19 checks passed
@kibanamachine kibanamachine added v8.14.0 backport:skip This commit does not require backporting labels Feb 19, 2024
@eokoneyo eokoneyo deleted the fix/issue-downloading-files-with-special-characters branch February 19, 2024 15:51
fkanout pushed a commit to fkanout/kibana that referenced this pull request Mar 4, 2024
…ownloads (elastic#176822)

## Summary

closes; elastic#173138

Looking into this, it turns out this issue was happening because the
header value for `content-disposition` contained invalid characters
given we were using the filename as is.

See Screenshot resulting from debugging the request; 

<img width="846" alt="Screenshot 2024-02-13 at 13 38 53"
src="https://github.com/elastic/kibana/assets/7893459/c1fbc09c-53c3-4d5b-8ba9-8752a56a9a6b">


To fix this, I've opted to leverage the ~package
[content-disposition](https://github.com/jshttp/content-disposition), in
place of some custom approach to fix this~ `res.file` handler which
correctly handles computation for content-disposition in place of
`res.ok` ~and providing our own computation of the value for
content-disposition~.

## Verifying the fix:

- Navigate to cases, (found in the the nav menu for stack management)
- create a new case, if there isn't one you can readily use
- click the files tab and grab an image you'd like to upload, before you
do rename said image to `Screenshot 2023-12-11 at 1 29 07 PM` keeping
it's extension
- on image upload complete, you should be able to view the preview for
the just uploaded image.

<!-- 
### Checklist

Delete any items that are not applicable to this PR.

- [ ] Any text added follows [EUI's writing
guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses
sentence case text and includes [i18n
support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [ ] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [ ] Any UI touched in this PR is usable by keyboard only (learn more
about [keyboard accessibility](https://webaim.org/techniques/keyboard/))
- [ ] Any UI touched in this PR does not create any new axe failures
(run axe in browser:
[FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/),
[Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US))
- [ ] If a plugin configuration key changed, check if it needs to be
allowlisted in the cloud and added to the [docker
list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker)
- [ ] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [ ] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)


### Risk Matrix

Delete this section if it is not applicable to this PR.

Before closing this PR, invite QA, stakeholders, and other developers to
identify risks that should be tested prior to the change/feature
release.

When forming the risk matrix, consider some of the following examples
and how they may potentially impact the change:

| Risk | Probability | Severity | Mitigation/Notes |

|---------------------------|-------------|----------|-------------------------|
| Multiple Spaces&mdash;unexpected behavior in non-default Kibana Space.
| Low | High | Integration tests will verify that all features are still
supported in non-default Kibana Space and when user switches between
spaces. |
| Multiple nodes&mdash;Elasticsearch polling might have race conditions
when multiple Kibana nodes are polling for the same tasks. | High | Low
| Tasks are idempotent, so executing them multiple times will not result
in logical error, but will degrade performance. To test for this case we
add plenty of unit tests around this logic and document manual testing
procedure. |
| Code should gracefully handle cases when feature X or plugin Y are
disabled. | Medium | High | Unit tests will verify that any feature flag
or plugin combination still results in our service operational. |
| [See more potential risk
examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) |


### For maintainers

- [ ] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
 -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport:skip This commit does not require backporting release_note:fix Team:Fleet Team label for Observability Data Collection Fleet team Team:SharedUX Team label for AppEx-SharedUX (formerly Global Experience) v8.14.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Files] Cannot preview or download files with special characters
7 participants