is_bot 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/LICENSE +0 -0
- data/README.markdown +40 -0
- data/Rakefile +14 -0
- data/VERSION +1 -0
- data/init.rb +4 -0
- data/lib/is_bot/is_bot.rb +29 -0
- data/lib/is_bot.rb +3 -0
- data/spec/database.yml +3 -0
- data/spec/is_bot_spec.rb +93 -0
- data/spec/models.rb +7 -0
- data/spec/schema.db +14 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +20 -0
- metadata +71 -0
data/.gitignore
ADDED
data/LICENSE
ADDED
File without changes
|
data/README.markdown
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
is_bot
|
2
|
+
======
|
3
|
+
|
4
|
+
About
|
5
|
+
-----
|
6
|
+
|
7
|
+
**is_bot** is a clean rewrite of **less_reverse_captcha**
|
8
|
+
|
9
|
+
It is a simple way to make your forms bot-proof. The effectiveness of the solution is open to discussion. I have used it on a low traffic site and it seems to have reduced the bot-attack considerably.
|
10
|
+
|
11
|
+
|
12
|
+
Usage
|
13
|
+
-----
|
14
|
+
It is very simple to use. Just install it in your rails app and perform the following steps.
|
15
|
+
|
16
|
+
In your model class:
|
17
|
+
|
18
|
+
class User < ActiveRecord::Base
|
19
|
+
validate_captcha
|
20
|
+
end
|
21
|
+
|
22
|
+
In your model's view:
|
23
|
+
|
24
|
+
form_for @user do |F|
|
25
|
+
f.captcha_reverse_field :user
|
26
|
+
end
|
27
|
+
|
28
|
+
And that's it.
|
29
|
+
|
30
|
+
|
31
|
+
Bugs
|
32
|
+
----
|
33
|
+
|
34
|
+
Please report the issues through gitHub's issues.
|
35
|
+
|
36
|
+
|
37
|
+
Authors
|
38
|
+
-------
|
39
|
+
|
40
|
+
* Anuj Dutta - [andHapp.com](http://www.andhapp.com/blog)
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |gemspec|
|
4
|
+
gemspec.name = "is_bot"
|
5
|
+
gemspec.summary = "Fight the bot."
|
6
|
+
gemspec.description = "Simple gem to reduce the spam attacks on sign-up, sign-in and other similar sorts of forms."
|
7
|
+
gemspec.email = "anuj@andhapp.com"
|
8
|
+
gemspec.homepage = "http://github.com/andhapp/is_bot"
|
9
|
+
gemspec.authors = ["Anuj Dutta"]
|
10
|
+
end
|
11
|
+
Jeweler::GemcutterTasks.new
|
12
|
+
rescue LoadError
|
13
|
+
puts "Jeweler not available. Install it with: sudo gem install jeweler"
|
14
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/init.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module IsBot
|
2
|
+
module CaptchaInReverse
|
3
|
+
def self.included(base)
|
4
|
+
base.class_eval do
|
5
|
+
extend ClassMethods
|
6
|
+
class_inheritable_accessor :captcha_in_reverse
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def validate_captcha(options = {})
|
12
|
+
configuration = { :message => 'can not create this because you are a bot.', :on => :save }
|
13
|
+
configuration.merge!(options)
|
14
|
+
validates_each :captcha_in_reverse, configuration do |record, attr, value|
|
15
|
+
record.errors.add attr, configuration[:message] if not value.blank?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module ViewHelper
|
22
|
+
def captcha_reverse_field(object, options={})
|
23
|
+
style = (options.delete(:style) || '') << ";"
|
24
|
+
style << "display: none;"
|
25
|
+
ActionView::Helpers::InstanceTag.new(object, :captcha_in_reverse, self).to_input_field_tag("text", options.merge(:style => style) )
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/lib/is_bot.rb
ADDED
data/spec/database.yml
ADDED
data/spec/is_bot_spec.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
%w(spec_helper ../init models).each{|path| require File.join(File.dirname(__FILE__), path) }
|
2
|
+
|
3
|
+
# ********************* SET-UP **************************
|
4
|
+
# ---------- Models
|
5
|
+
# There are two models that are used for describing IsBot
|
6
|
+
# 1. Bot
|
7
|
+
# 2. Robot
|
8
|
+
# Both the models can be found in the models.rb file
|
9
|
+
#
|
10
|
+
# ---------- Schema
|
11
|
+
# The schema is described in scehma.rb
|
12
|
+
#
|
13
|
+
# ---------- Database configuration
|
14
|
+
# The specs use sqlite3 adapter and the configuration is described in database.yml
|
15
|
+
|
16
|
+
describe IsBot do
|
17
|
+
context "ClassMethods" do
|
18
|
+
context "Set up" do
|
19
|
+
|
20
|
+
it "should be in the list of included modules" do
|
21
|
+
Bot.included_modules.should include(IsBot::CaptchaInReverse)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should add a virtual accessor 'captcha_in_reverse' to the class" do
|
25
|
+
bot = Bot.new
|
26
|
+
bot.should.respond_to?(:captcha_in_reverse)
|
27
|
+
bot.should.respond_to?(:captcha_in_reverse=)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should add a class method 'validate_captcha'" do
|
31
|
+
Bot.should.respond_to?(:validate_captcha)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "Validation" do
|
36
|
+
|
37
|
+
before(:each) do
|
38
|
+
@bot = Bot.new
|
39
|
+
end
|
40
|
+
|
41
|
+
# because a bot would fill in the hidden field really
|
42
|
+
it "should add to the errors if 'captcha_in_reverse' is not blank?" do
|
43
|
+
lambda {
|
44
|
+
@bot.captcha_in_reverse = "I am a Bot!"
|
45
|
+
@bot.valid?
|
46
|
+
}.should change(@bot.errors, :size).by(1)
|
47
|
+
@bot.errors.on "captcha_in_reverse" == "can not create this because you are a bot."
|
48
|
+
end
|
49
|
+
|
50
|
+
# because human is not expected to fill this field
|
51
|
+
it "should not add to errors when 'captcha_in_reverse' is blank? " do
|
52
|
+
lambda {
|
53
|
+
@bot.captcha_in_reverse = nil
|
54
|
+
@bot.valid?
|
55
|
+
}.should_not change(@bot.errors, :size).by(1)
|
56
|
+
end
|
57
|
+
|
58
|
+
context "Custom validation" do
|
59
|
+
it "should accept a custom error message" do
|
60
|
+
robot = Robot.new(:captcha_in_reverse => "I am a Bot!")
|
61
|
+
robot.valid?
|
62
|
+
robot.errors.on "captcha_in_reverse" == "You are a BOT. Go away."
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "Helper" do
|
70
|
+
context "set up" do
|
71
|
+
it "should include the defined custom helper module" do
|
72
|
+
ViewHelper::ViewField.included_modules.should include(IsBot::ViewHelper)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "input tag" do
|
77
|
+
it "should create one for adding captcha" do
|
78
|
+
ViewHelper::ViewField.new.should.respond_to?(:captcha_reverse_field)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should be hidden" do
|
82
|
+
captcha_field = ViewHelper::ViewField.new.captcha_reverse_field(:bot)
|
83
|
+
captcha_field.should include("style=\";display: none;\"")
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should include the custom defined styles" do
|
87
|
+
captcha_field = ViewHelper::ViewField.new.captcha_reverse_field(:bot, {:style => "color:red"})
|
88
|
+
captcha_field.should include("style=\"color:red;display: none;\"")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
data/spec/models.rb
ADDED
data/spec/schema.db
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
ActiveRecord::Schema.define(:version => 1) do
|
2
|
+
create_table "bots", :force => true do |t|
|
3
|
+
t.string "name"
|
4
|
+
t.datetime "created_at"
|
5
|
+
t.datetime "updated_at"
|
6
|
+
end
|
7
|
+
|
8
|
+
create_table "robots", :force => true do |t|
|
9
|
+
t.string "name"
|
10
|
+
t.datetime "created_at"
|
11
|
+
t.datetime "updated_at"
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "lib", "is_bot")
|
2
|
+
|
3
|
+
require 'activerecord'
|
4
|
+
require 'action_view'
|
5
|
+
require 'yaml'
|
6
|
+
require 'spec'
|
7
|
+
|
8
|
+
def connect(environment)
|
9
|
+
conf = YAML::load(File.open(File.dirname(__FILE__) + '/database.yml'))
|
10
|
+
ActiveRecord::Base.establish_connection(conf[environment])
|
11
|
+
end
|
12
|
+
|
13
|
+
connect('test')
|
14
|
+
load(File.join(File.dirname(__FILE__), "schema.db"))
|
15
|
+
|
16
|
+
module ViewHelper; class ViewField < ActionView::Base; end end
|
17
|
+
|
18
|
+
Spec::Runner.configure do |config|
|
19
|
+
config.include(ViewHelper)
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: is_bot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Anuj Dutta
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-20 00:00:00 +05:30
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Simple gem to reduce the spam attacks on sign-up, sign-in and other similar sorts of forms.
|
17
|
+
email: anuj@andhapp.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- LICENSE
|
24
|
+
- README.markdown
|
25
|
+
files:
|
26
|
+
- .gitignore
|
27
|
+
- LICENSE
|
28
|
+
- README.markdown
|
29
|
+
- Rakefile
|
30
|
+
- VERSION
|
31
|
+
- init.rb
|
32
|
+
- lib/is_bot.rb
|
33
|
+
- lib/is_bot/is_bot.rb
|
34
|
+
- spec/database.yml
|
35
|
+
- spec/is_bot_spec.rb
|
36
|
+
- spec/models.rb
|
37
|
+
- spec/schema.db
|
38
|
+
- spec/spec.opts
|
39
|
+
- spec/spec_helper.rb
|
40
|
+
has_rdoc: true
|
41
|
+
homepage: http://github.com/andhapp/is_bot
|
42
|
+
licenses: []
|
43
|
+
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options:
|
46
|
+
- --charset=UTF-8
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "0"
|
60
|
+
version:
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 1.3.5
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: Fight the bot.
|
68
|
+
test_files:
|
69
|
+
- spec/is_bot_spec.rb
|
70
|
+
- spec/models.rb
|
71
|
+
- spec/spec_helper.rb
|