honeypot-captcha 0.0.3 → 1.0.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
- SHA1:
3
- metadata.gz: 2dd95647b6ac0f214feeac282a66d4e683c87def
4
- data.tar.gz: 75dba6af51866d8c4fb4bbd65039a2c77a9bc94e
2
+ SHA256:
3
+ metadata.gz: 93a2779cd20a2bce72fbf2fe5b9998c9b0ba425581cd50446b909472963a4610
4
+ data.tar.gz: 2f49e4c15e9e209bf81f06571ab8b342a7bb91ba4d4a0245b55e7d2bcfa314e4
5
5
  SHA512:
6
- metadata.gz: cc2c415f608f2cb8b914bb5d7362e7d3a9d750a877b3066617fe193216e1edb868ba8fa2bda78cf7f654db824d651829fc8f2e05f7c307e399902cb385ec05ec
7
- data.tar.gz: a99e693dac0fd01e1e82214f4c5c4df5a018d8706c2131c2de64d58b7c44646c19fcaf2224c4ed5ee16b964fc7dc2bf9e7e57e56cbe5e700fb57e02f8a070807
6
+ metadata.gz: 9e541ea8ca330d5ef0eccf0a8db89153fb7c6086829f46523eb11cdbf0b17ff25ea4b33c55adf9d8603507433fd05ee64cdffd7a7ce304d78c7d5cb917eff617
7
+ data.tar.gz: 6df18e62d6a19d0ac04ec57d2e6ad54166b72b5b863e1bf4f4f6e991d496b9717d97a0bb9f3362f202686980b57b7f528decbf160e7879355bda3640682ee5e7
@@ -12,6 +12,10 @@ submitted with values. If they are, we assume that we encountered a spam bot.
12
12
  * [Honeypot Captcha by Phil Haack](http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx)
13
13
  * [Stopping spambots with hashes and honeypots](http://nedbatchelder.com/text/stopbots.html)
14
14
 
15
+ ## Requirements
16
+
17
+ * Rails >= 2.3.8
18
+
15
19
  ## Installation
16
20
 
17
21
  In your Gemfile, simply add
@@ -48,6 +52,14 @@ Simply specify that the form has a honeypot in the options hash:
48
52
  ...
49
53
  </form>
50
54
 
55
+ ### simple_form_for
56
+
57
+ Simply specify that the form has a honeypot in the HTML options hash:
58
+
59
+ <%= simple_form_for Comment.new, :html => { :honeypot => true } do |form| -%>
60
+ ...
61
+ <% end -%>
62
+
51
63
  ### Protection for actions other than `create` and `update`
52
64
 
53
65
  If you are submitting a form to a non-RESTful action and require
@@ -55,7 +67,7 @@ honeypot protection, simply add the before filter for that action
55
67
  in your controller. For example:
56
68
 
57
69
  class NewsletterController < ApplicationController
58
- prepend_before_filter :protect_from_spam, :only => [:subscribe]
70
+ prepend_before_action :protect_from_spam, :only => [:subscribe]
59
71
  ...
60
72
  end
61
73
 
@@ -71,6 +83,33 @@ add your own custom field names and values. For example:
71
83
  }
72
84
  end
73
85
 
86
+ NOTE: `honeypot_fields` hash keys are used at the beginning of the generated HTML id attributes. The HTML 4.01 spec states that ids must start with a letter ([A-Za-z]), so be aware of this when creating the hash keys. HTML5 is much less strict.
87
+
88
+ Override the `honeypot_string` method within `ApplicationController` to
89
+ disguise the string that will be included in the honeypot name. For example:
90
+
91
+ def honeypot_string
92
+ 'im-not-a-honeypot-at-all'
93
+ end
94
+
95
+ Override the `honeypot_style_class` method within `ApplicationController` to
96
+ provide a non-inline CSS class that will be applied to hide honeypot fields
97
+ (if nil, the style will be applied inline). For example:
98
+
99
+ def honeypot_style_class
100
+ 'display-none'
101
+ end
102
+
103
+ ... assigns an HTML class for styling purposes:
104
+
105
+ <div id="login_hp_1464171481" class="display-none">
106
+
107
+ ... which can be styled by a CSS style within app/assets/stylesheets:
108
+
109
+ .display-none {
110
+ display: none;
111
+ }
112
+
74
113
  ## Note on Patches/Pull Requests
75
114
 
76
115
  * Fork the project.
@@ -83,12 +122,21 @@ add your own custom field names and values. For example:
83
122
  Created by [Curtis Miller](http://millarian.com) of Velocity Labs, a
84
123
  [Ruby on Rails development company](http://velocitylabs.io).
85
124
 
125
+ ### Collaborators
126
+
127
+ * [Dave Tapley](https://github.com/dukedave)
128
+
86
129
  ### Contributors
87
130
 
131
+ Thank you to all contributors!
132
+
88
133
  * [Eric Saxby](http://github.com/sax)
89
134
  * [Bernard Grymonpon](https://github.com/wonko)
90
- * [Dave Tapley](https://github.com/dukedave)
135
+ * [rchekaluk](https://github.com/rchekaluk)
136
+ * [Sunny Ripert](https://github.com/sunny)
137
+ * [RandieM](https://github.com/RandieM)
138
+ * [Wayne Steven See](https://github.com/weynsee)
91
139
 
92
140
  ## Copyright
93
141
 
94
- Copyright (c) 2010 Curtis Miller. See LICENSE for details.
142
+ Copyright (c) 2010-2019 Curtis Miller. See LICENSE for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 1.0.0
@@ -6,14 +6,26 @@ module HoneypotCaptcha
6
6
  { :a_comment_body => 'Do not fill in this field' }
7
7
  end
8
8
 
9
+ def honeypot_string
10
+ 'hp'
11
+ end
12
+
13
+ def honeypot_style_class
14
+ nil
15
+ end
16
+
9
17
  def protect_from_spam
10
18
  head :ok if honeypot_fields.any? { |f,l| !params[f].blank? }
11
19
  end
12
20
 
13
21
  def self.included(base) # :nodoc:
14
22
  base.send :helper_method, :honeypot_fields
23
+ base.send :helper_method, :honeypot_string
24
+ base.send :helper_method, :honeypot_style_class
15
25
 
16
- if base.respond_to? :before_filter
26
+ if base.respond_to? :before_action
27
+ base.send :prepend_before_action, :protect_from_spam, :only => [:create, :update]
28
+ elsif base.respond_to? :before_filter
17
29
  base.send :prepend_before_filter, :protect_from_spam, :only => [:create, :update]
18
30
  end
19
31
  end
@@ -4,33 +4,54 @@ module ActionView
4
4
  module FormTagHelper
5
5
  def form_tag_html_with_honeypot(options)
6
6
  honeypot = options.delete(:honeypot) || options.delete('honeypot')
7
- html = form_tag_html_without_honeypot(options)
7
+ html = form_tag_html_without_honeypot(options)
8
+
8
9
  if honeypot
9
- captcha = "".respond_to?(:html_safe) ? honey_pot_captcha.html_safe : honey_pot_captcha
10
+ captcha = honey_pot_captcha
11
+
10
12
  if block_given?
11
13
  html.insert(html.index('</form>'), captcha)
12
14
  else
13
15
  html += captcha
14
16
  end
15
17
  end
18
+
16
19
  html
17
20
  end
18
- alias_method_chain :form_tag_html, :honeypot
21
+ alias_method :form_tag_html_without_honeypot, :form_tag_html
22
+ alias_method :form_tag_html, :form_tag_html_with_honeypot
19
23
 
20
24
  private
21
25
 
22
26
  def honey_pot_captcha
23
- html_ids = []
24
- honeypot_fields.collect do |f, l|
25
- html_ids << (html_id = "#{f}_hp_#{Time.now.to_i}")
26
- content_tag :div, :id => html_id do
27
- content_tag(:style, :type => 'text/css', :media => 'screen', :scoped => "scoped") do
28
- "#{html_ids.map { |i| "##{i}" }.join(', ')} { display:none; }"
29
- end +
30
- label_tag(f, l) +
31
- send([:text_field_tag, :text_area_tag][rand(2)], f)
27
+ honeypot_fields.collect do |key, value|
28
+ html_id = sanitized_html_id(key)
29
+
30
+ content_tag :div, { :id => html_id }.merge(style_attributes) do
31
+ style_tag(html_id) +
32
+ label_tag(key, value) +
33
+ send([:text_field_tag, :text_area_tag][rand(2)], key)
32
34
  end
33
- end.join
35
+
36
+ end.join.html_safe
37
+ end
38
+
39
+ def sanitized_html_id(key)
40
+ "#{key}_#{honeypot_string}_#{Time.current.to_i + rand(999)}".gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_")
41
+ end
42
+
43
+ def style_attributes
44
+ return {} if honeypot_style_class.blank?
45
+
46
+ { :class => honeypot_style_class }
47
+ end
48
+
49
+ def style_tag(html_id)
50
+ return '' if honeypot_style_class.present?
51
+
52
+ content_tag(:style, :type => 'text/css', :media => 'screen', :scoped => "scoped") do
53
+ "[id='#{html_id}'] { display:none; }".html_safe
54
+ end.html_safe
34
55
  end
35
56
  end
36
57
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeypot-captcha
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - curtis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-12 00:00:00.000000000 Z
11
+ date: 2019-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -16,56 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.8.0
19
+ version: '3.8'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.8.0
26
+ version: '3.8'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rdoc
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.12'
33
+ version: '6.1'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.12'
40
+ version: '6.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.0'
47
+ version: '2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.0'
54
+ version: '2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: jeweler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 2.0.1
61
+ version: '2.3'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 2.0.1
68
+ version: '2.3'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -111,8 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
111
  - !ruby/object:Gem::Version
112
112
  version: '0'
113
113
  requirements: []
114
- rubyforge_project:
115
- rubygems_version: 2.4.5
114
+ rubygems_version: 3.0.2
116
115
  signing_key:
117
116
  specification_version: 4
118
117
  summary: A simple way to add honeypot captchas to Rails forms