simple_captcha_reloaded 0.0.1.beta1 → 0.1.0.beta1

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
  SHA1:
3
- metadata.gz: aa801cc85f0158820e305bf66357177b8c5bd510
4
- data.tar.gz: 132bf89c7a166597d1696da847e286ff660a51f7
3
+ metadata.gz: 8f4126818899ea31db41b60c51a036065f0fde3c
4
+ data.tar.gz: 479910c2d5ad2b20c5e0f9f3eeb0c3d1a693c0bb
5
5
  SHA512:
6
- metadata.gz: b1e5dde7410f5d751fac27564b03394854224b2f7bb6301574b3d238899fde52c5dc9f253e772f9d2d98c838529d50bf0e8389b2c5595418d1e9dfe8739f0819
7
- data.tar.gz: 2d0e18542d4e71e4ae8abdd4541a540ee944a10ea1027c8f499e503289b44ec29e8c58466dafb9fa93e930491e5b06d9be192b7773d3ad95bb145f0b47dcdcc0
6
+ metadata.gz: 9f69f5ad7cf1e8737d8ccdf91e4b1788d00d3235f80882b20a42a58c5cb598247a8691e316f0771a5342047089d215ab3e11a34d2001f3b86cc43ccdfc822b0f
7
+ data.tar.gz: 901e27f5873bed57c56ee6d637d49ebb78ece64bed5226ebef34678c4f8b19ca7347f30fb82e4432688459fd99a2c6150b333d14753e562e7cb7277e0de6d553
data/README.md ADDED
@@ -0,0 +1,194 @@
1
+ # Simple Captcha Reloaded
2
+
3
+ [![Build Status](https://travis-ci.org/zealot128/simple_captcha_reloaded.svg?branch=master)](https://travis-ci.org/zealot128/simple_captcha_reloaded)
4
+ [![Gem Version](https://badge.fury.io/rb/simple_captcha_reloaded.svg)](http://badge.fury.io/rb/simple_captcha_reloaded)
5
+
6
+ This is a rewrite of the popular Simple-Captcha Gem. Similarily to Simple-Captcha, it provides an easy way to integrate a Captcha into a Rails appliaction. In comparison to the older Gem(s), I decided to drop support for ancient versions of Rails + Formtastic + Mongoid, but also add specs and support for SimpleForm.
7
+
8
+ ## Features
9
+
10
+ * Works with Rails 4.1+, Ruby 2.0+ (keyword arguments)
11
+ * Integrated into Model validation flow
12
+ * Optional controller integration for custom flow
13
+ * Uses a database table to track random captchas
14
+ * Uses imagemagick to generate the captcha and stream it to the client, without file access
15
+
16
+ ## Prerequisites
17
+
18
+ This needs Rails (4.1+), ActiveRecord with a database (all should be fine) and imagemagick.
19
+
20
+ Mac:
21
+
22
+ ```
23
+ brew install imagemagick ghostscript
24
+ ```
25
+
26
+ Linux:
27
+
28
+ ```
29
+ apt-get install imagemagick ghostscript
30
+ ```
31
+
32
+ ## Usage
33
+
34
+ Put it into your Gemfile:
35
+
36
+ ```ruby
37
+ gem 'simple_captcha_reloaded'
38
+ ```
39
+
40
+ and run ``bundle install``.
41
+
42
+
43
+ ### Integration 1: Model based
44
+
45
+ Just integrate the module into on of your ActiveModel::Model compliant Models:
46
+
47
+ ```ruby
48
+ class Message < ActiveRecord::Base
49
+ include SimpleCaptchaReloaded::Model
50
+ end
51
+ ```
52
+
53
+ this adds 2 new methods: ``valid_with_captcha?`` and ``save_with_captcha`` to the model. Use it like this in controller:
54
+
55
+ ```ruby
56
+ class MessagesController < ApplicationController
57
+ def submit
58
+ @message = Message.new(message_params)
59
+ if @message.save_with_captcha
60
+ ...
61
+ else
62
+ render :new
63
+ end
64
+ end
65
+
66
+ def message_params
67
+ params.require(:message).permit(..., :captcha, :captcha_key)
68
+ end
69
+ end
70
+ ```
71
+
72
+ Make sure to whiteliste the attributes ``captcha`` and ``captcha_key`` with Strong Parameters.
73
+
74
+ To show the captcha, you can use the SimpleForm helper:
75
+
76
+ ### Simple Form
77
+
78
+ The Gem provides a custom input for SimpleForm:
79
+
80
+ ```slim
81
+ = simple_form_for @model do |f|
82
+ = f.input :captcha, as: :simple_captcha
83
+ = f.submit
84
+ ```
85
+
86
+ ### Formtastic
87
+
88
+ PLANNED
89
+
90
+ ### Manual by using default Rails view helper
91
+
92
+ Similar to "Displaying Captcha" below, just change the key and value calls of the ``simple_captcha`` helper method to match your model:
93
+
94
+ ```slim
95
+ = simple_captcha(key: 'user[captcha_key]', value: 'user[captcha]', refresh_button: true)
96
+ ```
97
+
98
+ ### Integration II - Controller
99
+
100
+ If you need to use the captcha without a model, you can do the show and validation by hand
101
+
102
+ ## Displaying Captcha
103
+
104
+ Within your form, call the function:
105
+
106
+ ```slim
107
+ = form_tag '' do |f|
108
+ = simple_captcha(key: :captcha_key, value: :captcha, refresh_button: true)
109
+ = submit_tag 'send'
110
+ ```
111
+
112
+ This method is a thin wrapper which will render the view ``simple_captcha_reloaded/simple_captcha_reloaded.html`` in the end. As this is a Rails engine, you can overwrite the view by creating a ``app/views/simple_captcha_reloaded/_simple_captcha_reloaded.html.erb`` in your project tree.
113
+
114
+ Adjust it to your needs:
115
+
116
+ ```erb
117
+ <div class='simple-captcha-wrapper' id='<%=id %>'>
118
+ <%= hidden_field_tag key, captcha[:captcha_id] %>
119
+ <%= image_tag captcha[:captcha_url], class: 'simple-captcha-image' %>
120
+ <%= text_field_tag value, '', class: 'simple-captcha-input' %>
121
+ <%- if refresh_button %>
122
+ <%=link_to t('simple_captcha_reloaded.refresh_button_html'), captcha[:refresh_url], data: { remote: true} %>
123
+ <% end %>
124
+ </div>
125
+ ```
126
+
127
+ ### Manual Validation
128
+
129
+ Now you can call a method in your controller to check if the captcha is valid:
130
+
131
+ ```ruby
132
+ def submit
133
+ if captcha_valid?(params[:captcha_key], params[:captcha])
134
+ ..
135
+ else
136
+ ... error
137
+ end
138
+ end
139
+ ```
140
+
141
+ ## Customizing
142
+
143
+ ### Captcha Options
144
+
145
+ ```ruby
146
+ # Default Options
147
+ SimpleCaptchaReloaded::Config.tap do |config|
148
+ config.captcha_path = '/simple_captcha'
149
+ config.image = SimpleCaptchaReloaded::Image.new
150
+ config.characters = %w[a b c d e f g h j k m n p q r s t u v w x y z 0 2 3 4 5 6 8 9]
151
+ config.length = 6
152
+ end
153
+ ```
154
+
155
+ To change the appearance of the Captcha, initialize a SimpleCaptchaReloaded::Image.new with different parameters (default parameters shown):
156
+
157
+ ```ruby
158
+ config.image = SimpleCaptchaReloaded::Image.new(implode: :medium,
159
+ distortion: :random,
160
+ image_styles: IMAGE_STYLES.slice('simply_red', 'simply_green', 'simply_blue'),
161
+ noise: 0,
162
+ size: '100x28',
163
+ image_magick_path: '',
164
+ tmp_path: nil
165
+ )
166
+
167
+ # whereas IMAGE_STYLES are:
168
+ IMAGE_STYLES = {
169
+ 'embosed_silver' => ['-fill darkblue', '-shade 20x60', '-background white'],
170
+ 'simply_red' => ['-fill darkred', '-background white'],
171
+ 'simply_green' => ['-fill darkgreen', '-background white'],
172
+ 'simply_blue' => ['-fill darkblue', '-background white'],
173
+ 'distorted_black' => ['-fill darkblue', '-edge 10', '-background white'],
174
+ 'all_black' => ['-fill darkblue', '-edge 2', '-background white'],
175
+ 'charcoal_grey' => ['-fill darkblue', '-charcoal 5', '-background white'],
176
+ 'almost_invisible' => ['-fill red', '-solarize 50', '-background white']
177
+ }
178
+ ```
179
+
180
+
181
+ ## Contributing
182
+
183
+ Report bugs/feature requests to the Github issues.
184
+ If you'd like to contribute, here a little setup guide.
185
+ The Gem uses **Appraisal**, to create various configuration Gem sets. For each Gem set, a new dummy app will be automatically created.
186
+
187
+ 1. Fork, and clone
188
+ 2. ``bundle``
189
+ 3. ``appraisal install``
190
+ 4. ``appraisal rails-stable make regenerate`` To build the dummy app with the Rails-Stable configuration
191
+ 4. ``appraisal rails-stable rspec`` To run tests
192
+
193
+ If you need to add new controller methods to the dummy app, have a look at ``spec/template.rb``
194
+
@@ -11,6 +11,15 @@ module SimpleCaptchaReloaded
11
11
  key
12
12
  end
13
13
 
14
+ def self.valid_captcha?(key,value)
15
+ element = find_by_key(key)
16
+ value && element && element.valid_captcha?(value)
17
+ end
18
+
19
+ def valid_captcha?(other)
20
+ other.present? and value == other.strip.downcase
21
+ end
22
+
14
23
  def self.clear
15
24
  SimpleCaptchaReloaded::Data.where('created_at < ?', 1.hour.ago).delete_all
16
25
  end
@@ -0,0 +1,8 @@
1
+ <div class='simple-captcha-wrapper' id='<%=id %>'>
2
+ <%= hidden_field_tag key, captcha[:captcha_id] %>
3
+ <%= image_tag captcha[:captcha_url], class: 'simple-captcha-image' %>
4
+ <%= text_field_tag value, '', class: 'simple-captcha-input' %>
5
+ <%- if refresh_button %>
6
+ <%=link_to t('simple_captcha_reloaded.refresh_button_html'), captcha[:refresh_url], data: { remote: true} %>
7
+ <% end %>
8
+ </div>
@@ -2,7 +2,7 @@ require 'simple_form/version'
2
2
  class SimpleCaptchaInput < SimpleForm::Inputs::StringInput
3
3
  def input(wrapper_options=nil)
4
4
  set_options
5
- code = get_code
5
+ @captcha = SimpleCaptchaReloaded.generate_captcha(id: options[:captcha][:id], request: template.request)
6
6
 
7
7
  if SimpleForm::VERSION[/^3\.0/]
8
8
  input = super()
@@ -10,13 +10,13 @@ class SimpleCaptchaInput < SimpleForm::Inputs::StringInput
10
10
  input = super
11
11
  end
12
12
  refresh = if options[:captcha][:refresh_button]
13
- refresh_button(code)
13
+ refresh_button(@captcha)
14
14
  else
15
15
  ""
16
16
  end
17
17
  [
18
- image_tag(code),
19
- captcha_key(code),
18
+ image_tag(@captcha),
19
+ captcha_key(@captcha),
20
20
  input,
21
21
  refresh
22
22
  ].join.html_safe
@@ -24,10 +24,9 @@ class SimpleCaptchaInput < SimpleForm::Inputs::StringInput
24
24
 
25
25
  protected
26
26
 
27
- def refresh_button(code)
27
+ def refresh_button(captcha)
28
28
  template.content_tag :div, class: 'simple-captcha-reload' do
29
- url = SimpleCaptchaReloaded::Config.refresh_url(template.request, options[:captcha][:id])
30
- template.link_to url, class: options[:captcha][:refresh_button_class], data: {remote: true} do
29
+ template.link_to captcha[:refresh_url], class: options[:captcha][:refresh_button_class], data: {remote: true} do
31
30
  I18n.t('simple_captcha_reloaded.refresh_button_html')
32
31
  end
33
32
  end
@@ -40,19 +39,12 @@ class SimpleCaptchaInput < SimpleForm::Inputs::StringInput
40
39
  options[:wrapper_html][:id] ||= options[:captcha][:id]
41
40
  end
42
41
 
43
- def get_code
44
- old_key = template.request.session[:captcha]
45
- SimpleCaptchaReloaded::Data.generate_captcha_id(old_key: old_key)
42
+ def image_tag(captcha)
43
+ template.content_tag(:img, nil, src: captcha[:captcha_url], alt: 'Captcha', class: 'simple-captcha-image')
46
44
  end
47
45
 
48
-
49
- def image_tag(code)
50
- url = SimpleCaptchaReloaded::Config.image_url(code, template.request)
51
- template.content_tag(:img, nil, src: url, alt: 'Captcha', class: 'simple-captcha-image')
52
- end
53
-
54
- def captcha_key(code)
55
- @builder.hidden_field :captcha_key, value: code
46
+ def captcha_key(captcha)
47
+ @builder.hidden_field :captcha_key, value: captcha[:captcha_id]
56
48
  end
57
49
 
58
50
  def default_options
@@ -0,0 +1,7 @@
1
+ module SimpleCaptchaReloaded
2
+ module ControllerHelper
3
+ def captcha_valid?(key, value)
4
+ SimpleCaptchaReloaded::Data.valid_captcha?(key, value)
5
+ end
6
+ end
7
+ end
@@ -1,3 +1,5 @@
1
+ require 'simple_captcha_reloaded/view_helper'
2
+ require 'simple_captcha_reloaded/controller_helper'
1
3
  module SimpleCaptchaReloaded
2
4
  class Engine < ::Rails::Engine
3
5
  isolate_namespace SimpleCaptchaReloaded
@@ -5,6 +7,10 @@ module SimpleCaptchaReloaded
5
7
  if defined?(SimpleForm)
6
8
  require 'simple_captcha_reloaded/adapters/simple_form'
7
9
  end
10
+ ActiveSupport.on_load :action_controller do
11
+ helper SimpleCaptchaReloaded::ViewHelper
12
+ ActionController::Base.send(:include, SimpleCaptchaReloaded::ControllerHelper)
13
+ end
8
14
  app.middleware.use SimpleCaptchaReloaded::Middleware
9
15
  end
10
16
 
@@ -19,7 +19,7 @@ module SimpleCaptchaReloaded::Model
19
19
  elsif !captcha.present?
20
20
  errors.add :captcha, I18n.t('simple_captcha_reloaded.errors.blank')
21
21
  false
22
- elsif data.value != captcha.downcase.strip
22
+ elsif not data.valid_captcha?(captcha)
23
23
  errors.add :captcha, I18n.t('simple_captcha_reloaded.errors.wrong')
24
24
  false
25
25
  else
@@ -1,3 +1,3 @@
1
1
  module SimpleCaptchaReloaded
2
- VERSION = "0.0.1.beta1"
2
+ VERSION = "0.1.0.beta1"
3
3
  end
@@ -0,0 +1,17 @@
1
+ module SimpleCaptchaReloaded
2
+ module ViewHelper
3
+ # key: params[key] for the captcha id
4
+ # value: params[value] for the user-answer
5
+ # refresh_button: show refresh button
6
+ # id: wrapper id for the element, to refresh the captcha
7
+ def simple_captcha(key: :captcha_key, value: :captcha, refresh_button: true, id: 'simple_captcha_wrapper')
8
+ captcha = SimpleCaptchaReloaded.generate_captcha(id: id, request: request)
9
+ render 'simple_captcha_reloaded/simple_captcha_reloaded',
10
+ key: key,
11
+ value: value,
12
+ captcha: captcha,
13
+ refresh_button: refresh_button,
14
+ id: id
15
+ end
16
+ end
17
+ end
@@ -5,4 +5,15 @@ require 'simple_captcha_reloaded/model'
5
5
  require 'simple_captcha_reloaded/middleware'
6
6
 
7
7
  module SimpleCaptchaReloaded
8
+ def self.generate_captcha(id:, request:, old_key: request.session[:captcha])
9
+ captcha_id = SimpleCaptchaReloaded::Data.generate_captcha_id(old_key: old_key)
10
+ captcha_url = SimpleCaptchaReloaded::Config.image_url(captcha_id, request)
11
+ refresh_url = SimpleCaptchaReloaded::Config.refresh_url(request, id)
12
+ {
13
+ captcha_id: captcha_id,
14
+ captcha_url: captcha_url,
15
+ refresh_url: refresh_url
16
+ }
17
+
18
+ end
8
19
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_captcha_reloaded
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.beta1
4
+ version: 0.1.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Wienert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-01 00:00:00.000000000 Z
11
+ date: 2014-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -186,13 +186,14 @@ extensions: []
186
186
  extra_rdoc_files: []
187
187
  files:
188
188
  - MIT-LICENSE
189
+ - README.md
189
190
  - Rakefile
190
191
  - app/assets/javascripts/simple_captcha_reloaded/application.js
191
192
  - app/assets/stylesheets/simple_captcha_reloaded/application.css
192
193
  - app/controllers/simple_captcha_reloaded/application_controller.rb
193
194
  - app/helpers/simple_captcha_reloaded/application_helper.rb
194
195
  - app/models/simple_captcha_reloaded/data.rb
195
- - app/views/layouts/simple_captcha_reloaded/application.html.erb
196
+ - app/views/simple_captcha_reloaded/_simple_captcha_reloaded.html.erb
196
197
  - config/environment.rb
197
198
  - config/locales/simple_captcha.en.yml
198
199
  - config/routes.rb
@@ -200,11 +201,13 @@ files:
200
201
  - lib/simple_captcha_reloaded.rb
201
202
  - lib/simple_captcha_reloaded/adapters/simple_form.rb
202
203
  - lib/simple_captcha_reloaded/config.rb
204
+ - lib/simple_captcha_reloaded/controller_helper.rb
203
205
  - lib/simple_captcha_reloaded/engine.rb
204
206
  - lib/simple_captcha_reloaded/image.rb
205
207
  - lib/simple_captcha_reloaded/middleware.rb
206
208
  - lib/simple_captcha_reloaded/model.rb
207
209
  - lib/simple_captcha_reloaded/version.rb
210
+ - lib/simple_captcha_reloaded/view_helper.rb
208
211
  - lib/tasks/simple_captcha_reloaded_tasks.rake
209
212
  homepage: https://github.com/zealot128/simple_captcha_reloaded
210
213
  licenses:
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>SimpleCaptchaReloaded</title>
5
- <%= stylesheet_link_tag "simple_captcha_reloaded/application", media: "all" %>
6
- <%= javascript_include_tag "simple_captcha_reloaded/application" %>
7
- <%= csrf_meta_tags %>
8
- </head>
9
- <body>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>