loyal_simple_captcha 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/{README.rdoc → README.md} +0 -0
- data/Rakefile +0 -20
- data/lib/generators/simple_captcha_generator.rb +4 -3
- data/lib/generators/templates/migration.rb +2 -1
- data/lib/loyal_simple_captcha.rb +2 -0
- data/lib/simple_captcha.rb +1 -1
- data/lib/simple_captcha/active_record.rb +16 -3
- data/lib/simple_captcha/controller.rb +52 -23
- data/lib/simple_captcha/engine.rb +3 -1
- data/lib/simple_captcha/form_builder.rb +4 -3
- data/lib/simple_captcha/formtastic.rb +1 -0
- data/lib/simple_captcha/image.rb +1 -0
- data/lib/simple_captcha/middleware.rb +1 -1
- data/lib/simple_captcha/simple_captcha_data.rb +6 -1
- data/lib/simple_captcha/simple_captcha_data_mongoid.rb +1 -0
- data/lib/simple_captcha/utils.rb +46 -0
- data/lib/simple_captcha/version.rb +2 -2
- data/lib/simple_captcha/view.rb +28 -44
- metadata +10 -11
data/{README.rdoc → README.md}
RENAMED
File without changes
|
data/Rakefile
CHANGED
@@ -1,22 +1,2 @@
|
|
1
1
|
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/rdoctask'
|
4
2
|
|
5
|
-
desc 'Default: run unit tests.'
|
6
|
-
task :default => :test
|
7
|
-
|
8
|
-
desc 'Test the simple_captcha plugin.'
|
9
|
-
Rake::TestTask.new(:test) do |t|
|
10
|
-
t.libs << 'lib'
|
11
|
-
t.pattern = 'test/**/*_test.rb'
|
12
|
-
t.verbose = true
|
13
|
-
end
|
14
|
-
|
15
|
-
desc 'Generate documentation for the simple_captcha plugin.'
|
16
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
17
|
-
rdoc.rdoc_dir = 'rdoc'
|
18
|
-
rdoc.title = 'SimpleCaptcha'
|
19
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
20
|
-
rdoc.rdoc_files.include('README')
|
21
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
|
-
end
|
@@ -1,8 +1,9 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
require 'rails/generators'
|
2
3
|
|
3
4
|
class SimpleCaptchaGenerator < Rails::Generators::Base
|
4
5
|
include Rails::Generators::Migration
|
5
|
-
|
6
|
+
|
6
7
|
def self.source_root
|
7
8
|
@source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates/'))
|
8
9
|
end
|
@@ -10,11 +11,11 @@ class SimpleCaptchaGenerator < Rails::Generators::Base
|
|
10
11
|
def self.next_migration_number(dirname)
|
11
12
|
Time.now.strftime("%Y%m%d%H%M%S")
|
12
13
|
end
|
13
|
-
|
14
|
+
|
14
15
|
def create_partial
|
15
16
|
template "partial.erb", File.join('app/views', 'simple_captcha', "_simple_captcha.erb")
|
16
17
|
end
|
17
|
-
|
18
|
+
|
18
19
|
def create_migration
|
19
20
|
migration_template "migration.rb", File.join('db/migrate', "create_simple_captcha_data.rb")
|
20
21
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
class CreateSimpleCaptchaData < ActiveRecord::Migration
|
2
3
|
def self.up
|
3
4
|
create_table :simple_captcha_data do |t|
|
@@ -6,7 +7,7 @@ class CreateSimpleCaptchaData < ActiveRecord::Migration
|
|
6
7
|
t.timestamps
|
7
8
|
end
|
8
9
|
|
9
|
-
add_index :simple_captcha_data, :key
|
10
|
+
add_index :simple_captcha_data, :key
|
10
11
|
end
|
11
12
|
|
12
13
|
def self.down
|
data/lib/simple_captcha.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module SimpleCaptcha #:nodoc
|
2
3
|
module ModelHelpers #:nodoc
|
3
4
|
def self.included(base)
|
@@ -53,6 +54,10 @@ module SimpleCaptcha #:nodoc
|
|
53
54
|
def valid_with_captcha?
|
54
55
|
[valid?, is_captcha_valid?].all?
|
55
56
|
end
|
57
|
+
|
58
|
+
def simple_captcha_valid?
|
59
|
+
self.errors[:captcha].empty?
|
60
|
+
end
|
56
61
|
|
57
62
|
def is_captcha_valid?
|
58
63
|
return true if Rails.env.test?
|
@@ -61,12 +66,20 @@ module SimpleCaptcha #:nodoc
|
|
61
66
|
SimpleCaptcha::Utils::simple_captcha_passed!(captcha_key)
|
62
67
|
return true
|
63
68
|
else
|
64
|
-
message = simple_captcha_options[:message] || I18n.t(
|
65
|
-
|
69
|
+
message = simple_captcha_options[:message] || I18n.t(
|
70
|
+
self.class.model_name.downcase, :scope => [:simple_captcha, :message], :default => :default
|
71
|
+
)
|
72
|
+
|
73
|
+
# simple_captcha_options[:add_to_base] ? errors.add(:base, message) : errors.add(:captcha, message)
|
74
|
+
errors.add(:captcha, message)
|
66
75
|
return false
|
67
76
|
end
|
68
77
|
end
|
69
|
-
|
78
|
+
|
79
|
+
def update_attributes_with_captcha *args
|
80
|
+
valid_with_captcha? && update_attributes(*args)
|
81
|
+
end
|
82
|
+
|
70
83
|
def save_with_captcha
|
71
84
|
valid_with_captcha? && save(:validate => false)
|
72
85
|
end
|
@@ -1,28 +1,57 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module SimpleCaptcha #:nodoc
|
2
3
|
module ControllerHelpers #:nodoc
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
return
|
4
|
+
def self.included base
|
5
|
+
base.class_eval do
|
6
|
+
include InstanceMethods
|
7
|
+
helper_method :generate_simple_captcha_options
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceMethods
|
12
|
+
# This method is to validate the simple captcha in controller.
|
13
|
+
# It means when the captcha is controller based i.e. :object has not been passed to the method show_simple_captcha.
|
14
|
+
#
|
15
|
+
# *Example*
|
16
|
+
#
|
17
|
+
# If you want to save an object say @user only if the captcha is validated then do like this in action...
|
18
|
+
#
|
19
|
+
# if simple_captcha_valid?
|
20
|
+
# @user.save
|
21
|
+
# else
|
22
|
+
# flash[:notice] = "captcha did not match"
|
23
|
+
# redirect_to :action => "myaction"
|
24
|
+
# end
|
25
|
+
def simple_captcha_valid?
|
26
|
+
return true if Rails.env.test?
|
27
|
+
|
28
|
+
if params[:captcha]
|
29
|
+
data = SimpleCaptcha::Utils::simple_captcha_value(params[:captcha_key] || session[:captcha])
|
30
|
+
result = data == params[:captcha].delete(" ").upcase
|
31
|
+
SimpleCaptcha::Utils::simple_captcha_passed!(session[:captcha]) if result
|
32
|
+
return result
|
33
|
+
else
|
34
|
+
return false
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# 生成验证的信息
|
39
|
+
# options:
|
40
|
+
# - object
|
41
|
+
def generate_simple_captcha_options *args
|
42
|
+
options = args.extract_options!
|
43
|
+
|
44
|
+
key = SimpleCaptcha::Utils.generate_key_use_session(
|
45
|
+
session, options[:object]
|
46
|
+
)
|
47
|
+
|
48
|
+
{
|
49
|
+
:image_url => ::SimpleCaptcha::Utils.generate_image_url(key, request.base_url, options),
|
50
|
+
:label => options[:label] || I18n.t('simple_captcha.label'),
|
51
|
+
:captcha_key => ::SimpleCaptcha::Utils.set_simple_captcha_data(key, options),
|
52
|
+
:object => options[:object]
|
53
|
+
}
|
54
|
+
|
26
55
|
end
|
27
56
|
end
|
28
57
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# encoding: utf-8
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
2
|
require 'rails'
|
3
3
|
require 'simple_captcha'
|
4
4
|
|
@@ -14,6 +14,8 @@ module SimpleCaptcha
|
|
14
14
|
ActionView::Base.send(:include, SimpleCaptcha::ViewHelper)
|
15
15
|
ActionView::Helpers::FormBuilder.send(:include, SimpleCaptcha::FormBuilder)
|
16
16
|
|
17
|
+
ActionController::Base.send :include, ::SimpleCaptcha::ControllerHelpers
|
18
|
+
|
17
19
|
if Object.const_defined?("Formtastic")
|
18
20
|
if Formtastic.const_defined?("Helpers")
|
19
21
|
Formtastic::Helpers::FormHelper.builder = SimpleCaptcha::CustomFormBuilder
|
@@ -1,11 +1,12 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module SimpleCaptcha
|
2
3
|
module FormBuilder
|
3
4
|
def self.included(base)
|
4
5
|
base.send(:include, SimpleCaptcha::ViewHelper)
|
5
6
|
base.send(:include, SimpleCaptcha::FormBuilder::ClassMethods)
|
6
7
|
base.send(:include, ActionView::Helpers)
|
7
|
-
base.send(:include, Sprockets::Helpers::RailsHelper)
|
8
|
-
base.send(:include, Sprockets::Helpers::IsolatedHelper)
|
8
|
+
# base.send(:include, Sprockets::Helpers::RailsHelper)
|
9
|
+
# base.send(:include, Sprockets::Helpers::IsolatedHelper)
|
9
10
|
|
10
11
|
base.delegate :render, :session, :to => :template
|
11
12
|
end
|
@@ -34,7 +35,7 @@ module SimpleCaptcha
|
|
34
35
|
html[:placeholder] = options[:placeholder] || I18n.t('simple_captcha.placeholder')
|
35
36
|
|
36
37
|
text_field(:captcha, html) +
|
37
|
-
hidden_field(:captcha_key, {:value => options[:
|
38
|
+
hidden_field(:captcha_key, {:value => options[:captcha_key], :class => 'captcha-key'})
|
38
39
|
end
|
39
40
|
end
|
40
41
|
end
|
data/lib/simple_captcha/image.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module SimpleCaptcha
|
2
3
|
class SimpleCaptchaData < ::ActiveRecord::Base
|
3
4
|
def self.rails3?
|
4
5
|
::ActiveRecord::VERSION::MAJOR == 3
|
5
6
|
end
|
6
7
|
|
7
|
-
|
8
|
+
def self.rails4?
|
9
|
+
::ActiveRecord::VERSION::MAJOR == 4
|
10
|
+
end
|
11
|
+
|
12
|
+
if rails3? || rails4?
|
8
13
|
# Fixes deprecation warning in Rails 3.2:
|
9
14
|
# DEPRECATION WARNING: Calling set_table_name is deprecated. Please use `self.table_name = 'the_name'` instead.
|
10
15
|
self.table_name = "simple_captcha_data"
|
data/lib/simple_captcha/utils.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
require 'digest/sha1'
|
2
3
|
|
3
4
|
module SimpleCaptcha #:nodoc
|
@@ -32,5 +33,50 @@ module SimpleCaptcha #:nodoc
|
|
32
33
|
args << Time.now.to_s
|
33
34
|
Digest::SHA1.hexdigest(args.join)
|
34
35
|
end
|
36
|
+
|
37
|
+
def self.set_simple_captcha_data(key, options={})
|
38
|
+
code_type = options[:code_type]
|
39
|
+
|
40
|
+
data = SimpleCaptcha::SimpleCaptchaData.get_data(key)
|
41
|
+
data.value = generate_simple_captcha_data(code_type)
|
42
|
+
data.save
|
43
|
+
key
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.generate_simple_captcha_data(code)
|
47
|
+
value = ''
|
48
|
+
|
49
|
+
case code
|
50
|
+
when 'numeric' then
|
51
|
+
SimpleCaptcha.length.times{value << (48 + rand(10)).chr}
|
52
|
+
else
|
53
|
+
SimpleCaptcha.length.times{value << (65 + rand(26)).chr}
|
54
|
+
end
|
55
|
+
|
56
|
+
return value
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
def self.generate_image_url key, *args
|
61
|
+
options = args.extract_options!
|
62
|
+
|
63
|
+
defaults = {}
|
64
|
+
defaults[:time] = options[:time] || Time.now.to_i
|
65
|
+
|
66
|
+
base_url = args.first || ENV['RAILS_RELATIVE_URL_ROOT']
|
67
|
+
|
68
|
+
url = "#{base_url}/simple_captcha?code=#{key}&#{defaults.to_query}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.generate_key_use_session session, *args
|
72
|
+
options = args.extract_options!
|
73
|
+
key_name = args.first
|
74
|
+
|
75
|
+
if key_name.nil?
|
76
|
+
session[:captcha] ||= SimpleCaptcha::Utils.generate_key(session[:id].to_s, 'captcha')
|
77
|
+
else
|
78
|
+
SimpleCaptcha::Utils.generate_key(session[:id].to_s, key_name)
|
79
|
+
end
|
80
|
+
end
|
35
81
|
end
|
36
82
|
end
|
data/lib/simple_captcha/view.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module SimpleCaptcha #:nodoc
|
2
3
|
module ViewHelper #:nodoc
|
3
4
|
|
@@ -42,29 +43,35 @@ module SimpleCaptcha #:nodoc
|
|
42
43
|
# Find more detailed examples with sample images here on my blog http://EXPRESSICA.com
|
43
44
|
#
|
44
45
|
# All Feedbacks/CommentS/Issues/Queries are welcome.
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
#
|
47
|
+
#
|
48
|
+
# eg. show_simple_captcha :label => '', :captcha_key => '', :image_url => ''
|
49
|
+
def show_simple_captcha(*args)
|
50
|
+
options = args.extract_options!
|
51
|
+
|
52
|
+
options[:captcha_key] ||= set_simple_captcha_data(
|
53
|
+
(
|
54
|
+
args.first || simple_captcha_key(options[:object])
|
55
|
+
),
|
56
|
+
options
|
57
|
+
)
|
58
|
+
|
59
|
+
key = options[:captcha_key]
|
48
60
|
|
49
61
|
defaults = {
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
62
|
+
:image => simple_captcha_image(key, options),
|
63
|
+
:label => options[:label] || I18n.t('simple_captcha.label'),
|
64
|
+
:field => simple_captcha_field(options)
|
65
|
+
}
|
66
|
+
|
55
67
|
render :partial => 'simple_captcha/simple_captcha', :locals => { :simple_captcha_options => defaults }
|
56
68
|
end
|
57
69
|
|
58
70
|
private
|
59
71
|
|
60
|
-
def simple_captcha_image(
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
query = defaults.collect{ |key, value| "#{key}=#{value}" }.join('&')
|
65
|
-
url = "#{ENV['RAILS_RELATIVE_URL_ROOT']}/simple_captcha?code=#{simple_captcha_key}&#{query}"
|
66
|
-
|
67
|
-
tag('img', :src => url, :alt => 'captcha')
|
72
|
+
def simple_captcha_image(key, options = {})
|
73
|
+
url = options[:image_url] || ::SimpleCaptcha::Utils.generate_image_url(key, options)
|
74
|
+
tag('img', :src => url, :alt => 'captcha', :class => 'captcha-image')
|
68
75
|
end
|
69
76
|
|
70
77
|
def simple_captcha_field(options={})
|
@@ -74,42 +81,19 @@ module SimpleCaptcha #:nodoc
|
|
74
81
|
|
75
82
|
if options[:object]
|
76
83
|
text_field(options[:object], :captcha, html.merge(:value => '')) +
|
77
|
-
hidden_field(options[:object], :captcha_key, {:value => options[:
|
84
|
+
hidden_field(options[:object], :captcha_key, {:value => options[:captcha_key], :class => 'captcha-key'})
|
78
85
|
else
|
79
86
|
text_field_tag(:captcha, nil, html) +
|
80
|
-
hidden_field_tag(:captcha_key, options[:
|
87
|
+
hidden_field_tag(:captcha_key, options[:captcha_key], :class => 'captcha-key')
|
81
88
|
end
|
82
89
|
end
|
83
90
|
|
84
91
|
def set_simple_captcha_data(key, options={})
|
85
|
-
|
86
|
-
|
87
|
-
value = generate_simple_captcha_data(code_type)
|
88
|
-
data = SimpleCaptcha::SimpleCaptchaData.get_data(key)
|
89
|
-
data.value = value
|
90
|
-
data.save
|
91
|
-
key
|
92
|
+
::SimpleCaptcha::Utils.set_simple_captcha_data key, options
|
92
93
|
end
|
93
|
-
|
94
|
-
def generate_simple_captcha_data(code)
|
95
|
-
value = ''
|
96
|
-
|
97
|
-
case code
|
98
|
-
when 'numeric' then
|
99
|
-
SimpleCaptcha.length.times{value << (48 + rand(10)).chr}
|
100
|
-
else
|
101
|
-
SimpleCaptcha.length.times{value << (65 + rand(26)).chr}
|
102
|
-
end
|
103
|
-
|
104
|
-
return value
|
105
|
-
end
|
106
|
-
|
94
|
+
|
107
95
|
def simple_captcha_key(key_name = nil)
|
108
|
-
|
109
|
-
session[:captcha] ||= SimpleCaptcha::Utils.generate_key(session[:id].to_s, 'captcha')
|
110
|
-
else
|
111
|
-
SimpleCaptcha::Utils.generate_key(session[:id].to_s, key_name)
|
112
|
-
end
|
96
|
+
SimpleCaptcha::Utils.generate_key_use_session session, key_name
|
113
97
|
end
|
114
98
|
end
|
115
99
|
end
|
metadata
CHANGED
@@ -1,24 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loyal_simple_captcha
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
9
|
-
- Igor Galeta
|
8
|
+
- happy
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2013-03
|
12
|
+
date: 2013-08-03 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
|
-
description:
|
16
|
-
it provides the backward compatibility with previous versions of Rails.
|
17
|
-
email:
|
14
|
+
description: LoyalSimpleCaptcha is available to be used with Rails 3 or above and
|
15
|
+
also it provides the backward compatibility with previous versions of Rails.
|
16
|
+
email: andywang7259@gmail.com
|
18
17
|
executables: []
|
19
18
|
extensions: []
|
20
|
-
extra_rdoc_files:
|
21
|
-
- README.rdoc
|
19
|
+
extra_rdoc_files: []
|
22
20
|
files:
|
23
21
|
- lib/simple_captcha.rb
|
24
22
|
- lib/simple_captcha/view.rb
|
@@ -33,13 +31,14 @@ files:
|
|
33
31
|
- lib/simple_captcha/controller.rb
|
34
32
|
- lib/simple_captcha/image.rb
|
35
33
|
- lib/simple_captcha/middleware.rb
|
34
|
+
- lib/loyal_simple_captcha.rb
|
36
35
|
- lib/generators/USAGE
|
37
36
|
- lib/generators/simple_captcha_generator.rb
|
38
37
|
- lib/generators/templates/partial.erb
|
39
38
|
- lib/generators/templates/migration.rb
|
40
39
|
- Rakefile
|
41
|
-
- README.
|
42
|
-
homepage: http://github.com/
|
40
|
+
- README.md
|
41
|
+
homepage: http://github.com/xiuxian123/loyals
|
43
42
|
licenses: []
|
44
43
|
post_install_message:
|
45
44
|
rdoc_options: []
|