repost 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 998c57594b27cb1c140eb6e141b2e64467a5cde407410c58bd3547f3529e7d20
4
- data.tar.gz: d7fef86b10e728d49154e6883fdf53659bbbacd0f281283e6ff586f82cc67199
3
+ metadata.gz: 016666c656489330b6bcfe1eed7663fa1670210f211e2e7ad35cce82ea9a8322
4
+ data.tar.gz: 744a0637065596ddb685097a54dd9219d908fd659f69a731e94866f766ef8bd8
5
5
  SHA512:
6
- metadata.gz: 4ce51773149c3bb5afc481c415753a46e2136d2ef1e41aa17709028ec24682c95a44a913dddba3ea20c06a15bb201384478ab6cac42cb1f41eba97316d35e875
7
- data.tar.gz: 97a6ab774d780fbe9cf238ee6172764adbc10d6dd6b0282f3c8950e967f413b560cb4852179d419c27d62dc1dd5ee542c66108864d90444902388a8c8235af64
6
+ metadata.gz: f607b05add6ffde3b3f93c37ed5621818b2c6dec4cd5d24899a57083b5aec972d693bd6fc8e0f21663a39c7b9045ed9101c03211a9eaef8295d1c692b6c947b5
7
+ data.tar.gz: b8b2ed81ceb699f67445ad7c9c0cbbc6ce98fde6ef09634f9ea021cf995af06f069de000cbd77563eb75b55bb5867d78af35b314808a748ef9a32080dd15476c
data/lib/repost/action.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Repost
2
2
  class Action
3
- def self.perform(*args)
4
- action = new(*args)
3
+ def self.perform(*args, **kw_args)
4
+ action = new(*args, **kw_args)
5
5
  action.perform
6
6
  end
7
7
  end
@@ -3,12 +3,16 @@ if defined?(Rails) && defined?(ActiveSupport)
3
3
  class ::ActionController::Base
4
4
 
5
5
  def repost(url, params: {}, options: {})
6
+ status = options.delete(:status) || :ok
6
7
  authenticity_token = form_authenticity_token if ['auto', :auto].include?(options[:authenticity_token])
7
8
  render html: Repost::Senpai.perform(
8
9
  url,
9
10
  params: params,
10
- options: options.merge({authenticity_token: authenticity_token}.compact)
11
- ).html_safe
11
+ options: options.merge({
12
+ authenticity_token: authenticity_token,
13
+ autosubmit_nonce: content_security_policy_nonce,
14
+ }.compact)
15
+ ).html_safe, status: status
12
16
  end
13
17
 
14
18
  alias :redirect_post :repost
data/lib/repost/senpai.rb CHANGED
@@ -12,6 +12,7 @@ module Repost
12
12
  @charset = options.fetch(:charset, DEFAULT_CHARSET)
13
13
  @form_id = options.fetch(:form_id, generated_form_id)
14
14
  @autosubmit = options.fetch(:autosubmit, true)
15
+ @autosubmit_nonce = options.fetch(:autosubmit_nonce, nil)
15
16
  @section_classes = options.dig(:decor, :section, :classes)
16
17
  @section_html = options.dig(:decor, :section, :html)
17
18
  @submit_classes = options.dig(:decor, :submit, :classes)
@@ -31,10 +32,10 @@ module Repost
31
32
 
32
33
  attr_reader :url, :params, :options, :method, :form_id, :autosubmit,
33
34
  :section_classes, :section_html, :submit_classes,
34
- :submit_text, :authenticity_token, :charset
35
+ :submit_text, :authenticity_token, :charset, :autosubmit_nonce
35
36
 
36
37
  def form_head
37
- "<form id='#{form_id}' action='#{url}' method='#{method}' accept-charset='#{charset}'>"
38
+ %Q(<form id="#{form_id}" action="#{url}" method="#{method}" accept-charset="#{charset}">)
38
39
  end
39
40
 
40
41
  def form_body
@@ -46,34 +47,39 @@ module Repost
46
47
  end
47
48
 
48
49
  def form_input(key, value)
49
- if value.is_a?(Hash)
50
+ case value
51
+ when Hash
50
52
  value.map do |inner_key, inner_value|
51
53
  form_input("#{key}[#{inner_key}]", inner_value)
52
54
  end.join
55
+ when Array
56
+ value.map do |inner_value|
57
+ form_input("#{key}[]", inner_value)
58
+ end.join
53
59
  else
54
- "<input type='hidden' name='#{key}' value='#{value}'>"
60
+ %Q(<input type="hidden" name="#{key}" value=#{process_value(value)}>)
55
61
  end
56
62
  end
57
63
 
58
64
  def form_footer
59
- "</form>"
65
+ %Q(</form>)
60
66
  end
61
67
 
62
68
  def csrf_token
63
- "<input name='authenticity_token' value='#{authenticity_token}' type='hidden'>"
69
+ %Q(<input name="authenticity_token" value="#{authenticity_token}" type="hidden">)
64
70
  end
65
71
 
66
72
  def no_script
67
- "<noscript>
73
+ %Q(<noscript>
68
74
  #{submit_section}
69
- </noscript>"
75
+ </noscript>)
70
76
  end
71
77
 
72
78
  def submit_section
73
- "<div class='#{section_classes}'>
79
+ %Q(<div class="#{section_classes}">
74
80
  #{section_html}
75
- <input class='#{submit_classes}' type='submit' value='#{submit_text}'></input>
76
- </div>"
81
+ <input class="#{submit_classes}" type="submit" value="#{submit_text}"></input>
82
+ </div>)
77
83
  end
78
84
 
79
85
  def generated_form_id
@@ -81,9 +87,15 @@ module Repost
81
87
  end
82
88
 
83
89
  def auto_submit_script
84
- "<script>
85
- document.getElementById('#{form_id}').submit();
86
- </script>"
90
+ nonce_attr = %Q( nonce="#{autosubmit_nonce}") if autosubmit_nonce
91
+ %Q(<script#{nonce_attr}>
92
+ document.getElementById("#{form_id}").submit();
93
+ </script>)
94
+ end
95
+
96
+ def process_value(value)
97
+ return value if value.is_a?(Integer)
98
+ %Q("#{value.to_s.gsub("\"", '\'')}")
87
99
  end
88
100
  end
89
101
  end
@@ -1,3 +1,3 @@
1
1
  module Repost
2
- VERSION = "0.3.3"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repost
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - YaroslavO
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-17 00:00:00.000000000 Z
11
+ date: 2022-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -71,7 +71,7 @@ licenses:
71
71
  - MIT
72
72
  metadata:
73
73
  homepage_uri: https://vergilet.github.io/repost/
74
- post_install_message:
74
+ post_install_message:
75
75
  rdoc_options: []
76
76
  require_paths:
77
77
  - lib
@@ -86,8 +86,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  - !ruby/object:Gem::Version
87
87
  version: '0'
88
88
  requirements: []
89
- rubygems_version: 3.0.8
90
- signing_key:
89
+ rubygems_version: 3.2.15
90
+ signing_key:
91
91
  specification_version: 4
92
92
  summary: Gem implements Redirect using POST method
93
93
  test_files: []