import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import Toggle from 'react-toggle';
import AsyncSelect from 'react-select/async';
+import { NonceProvider } from 'react-select';
import SettingToggle from '../../notifications/components/setting_toggle';
const messages = defineMessages({
{this.modeLabel(mode)}
</span>
- <AsyncSelect
- isMulti
- autoFocus
- value={this.tags(mode)}
- onChange={this.onSelect(mode)}
- loadOptions={this.props.onLoad}
- className='column-select__container'
- classNamePrefix='column-select'
- name='tags'
- placeholder={this.props.intl.formatMessage(messages.placeholder)}
- noOptionsMessage={this.noOptionsMessage}
- />
+ <NonceProvider nonce={document.querySelector('meta[name=style-nonce]').content}>
+ <AsyncSelect
+ isMulti
+ autoFocus
+ value={this.tags(mode)}
+ onChange={this.onSelect(mode)}
+ loadOptions={this.props.onLoad}
+ className='column-select__container'
+ classNamePrefix='column-select'
+ name='tags'
+ placeholder={this.props.intl.formatMessage(messages.placeholder)}
+ noOptionsMessage={this.noOptionsMessage}
+ />
+ </NonceProvider>
</div>
);
}
= javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous'
= javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous'
= csrf_meta_tags
+ %meta{ name: 'style-nonce', content: request.content_security_policy_nonce }
= stylesheet_link_tag '/inert.css', skip_pipeline: true, media: 'all', id: 'inert-style'
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
# Rails.application.config.content_security_policy_report_only = true
+Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }
+
+# Monkey-patching Rails 5
+module ActionDispatch
+ class ContentSecurityPolicy
+ def nonce_directive?(directive)
+ directive == 'style-src'
+ end
+ end
+end
+
+# Rails 6 would require the following instead:
+# Rails.application.config.content_security_policy_nonce_directives = %w(style-src)
+
PgHero::HomeController.content_security_policy do |p|
p.script_src :self, :unsafe_inline, assets_host
p.style_src :self, :unsafe_inline, assets_host
end
+
+PgHero::HomeController.after_action do
+ request.content_security_policy_nonce_generator = nil
+end