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

Fix safe interpolation detection #48

Merged
merged 5 commits into from
Apr 26, 2024

Conversation

smortex
Copy link
Contributor

@smortex smortex commented Apr 8, 2024

Any variable interpolation is currently reported as unsafe.

The stdlib feature a stdlib::shell_escape() function (formerly shell_escape()) that escape the string passed as parameter. In such a case, an unsafe interpolation should not be detected.

Add detection of such escaped string and do not report an error in this case. stdlib::shell_escape() must be the last function called in the interpolation for it to not be reported as unsafe.

Fixes #39

Also include:

The rspec-collection_matchers documentation advise to require
rspec-collection_matchers form `spec_helper.rb`.

This fix:

```
Failure/Error: expect(problems).to have(1).problems

NoMethodError:
  undefined method `have' for #<RSpec::ExampleGroups::CheckUnsafeInterpolations::WithFixDisabled::ExecWithUnsafeInterpolationInCommand "detects an unsafe exec command argument" (./spec/puppet-lint/plugins/check_unsafe_interpolations_spec.rb:20)>
```
We produce 2 errors in this example.  We don't want to check that the
first one is present twice: we want to check that each warning is
present once.
These commands are supposed to be supported, but they are not tested, so
add tests to demonstrate that they work as intended.
When using the `unless` parameter of an `exec` resource with unsafe
string interpolation, the linter should warn about the issue.

It happen that it currently doesn't because unless is also a keyword.

Adjust the linter to cope with this.
Any variable interpolation is currently reported as unsafe.

The stdlib feature a `stdlib::shell_escape()` function (formerly
`shell_escape()`) that escape the string passed as parameter.  In such a
case, an unsafe interpolation should not be detected.

Add detection of such escaped string and do not report an error in this
case.  `stdlib::shell_escape()` must be the last function called in the
interpolation for it to not be reported as unsafe.
@smortex smortex force-pushed the fix-safe-interpolation-detection branch from 607323b to 80a991d Compare April 8, 2024 23:48
@david22swan
Copy link
Member

@smortex We are happy to merge this in, but we will not be able to add it into the default templates until such time as auto correct functionality for it has been added.

Thanks for putting in the work :)

@david22swan david22swan merged commit f843286 into puppetlabs:main Apr 26, 2024
2 checks passed
@smortex
Copy link
Contributor Author

smortex commented Apr 27, 2024

@smortex We are happy to merge this in, but we will not be able to add it into the default templates until such time as auto correct functionality for it has been added.

You mean into the PDK templates? I am not sure we can reliably auto-fix these issues as what has to be done is quite different from one context to another, and shell_espacing all variables will often work but sometimes completely break the code.

Yet this module is very valuable to find issues in code. Do you think we can do a new release to integrate this change?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

linter incorrectly reporting interpolation of "shell_escape"
4 participants