ankh 0.1.3 → 0.2.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 +18 -0
- data/{spec/spec.opts → .rspec} +0 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/LICENSE +4 -2
- data/README.rdoc +15 -5
- data/Rakefile +6 -84
- data/ankh.gemspec +20 -67
- data/lib/..rb +5 -0
- data/lib/ankh.rb +4 -6
- data/lib/ankh/model.rb +18 -10
- data/lib/ankh/question.rb +1 -1
- data/lib/ankh/railtie.rb +8 -0
- data/lib/ankh/validations/{human.rb → human_validator.rb} +0 -12
- data/lib/ankh/version.rb +3 -0
- data/spec/ankh/model_spec.rb +10 -7
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/api_docs/api_authentication.markdown +70 -0
- data/spec/dummy/api_docs/api_user_creates_user.markdown +1170 -0
- data/spec/dummy/api_docs/partner_creation.markdown +78 -0
- data/spec/dummy/api_docs/topic_creation.markdown +76 -0
- data/spec/dummy/api_docs/user_creation.markdown +31 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +4 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/{features/step_definitions/ankh_steps.rb → spec/dummy/app/mailers/.gitkeep} +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/views/devise/confirmations/new.html.erb +15 -0
- data/spec/dummy/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/spec/dummy/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/spec/dummy/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/spec/dummy/app/views/devise/passwords/edit.html.erb +19 -0
- data/spec/dummy/app/views/devise/passwords/new.html.erb +15 -0
- data/spec/dummy/app/views/devise/registrations/edit.html.erb +22 -0
- data/spec/dummy/app/views/devise/registrations/new.html.erb +20 -0
- data/spec/dummy/app/views/devise/sessions/new.html.erb +15 -0
- data/spec/dummy/app/views/devise/sessions/new.mobile.erb +14 -0
- data/spec/dummy/app/views/devise/shared/_links.erb +25 -0
- data/spec/dummy/app/views/devise/unlocks/new.html.erb +15 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +45 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +20 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +30 -0
- data/spec/dummy/config/environments/production.rb +60 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +188 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/spec_helper.rb +10 -14
- metadata +205 -130
- data/features/ankh.feature +0 -9
- data/features/support/env.rb +0 -4
- data/lib/ankh/rails/legacy.rb +0 -41
- data/spec/support/active_record_spec_helper.rb +0 -44
data/.gitignore
ADDED
data/{spec/spec.opts → .rspec}
RENAMED
File without changes
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use default@ankh --create
|
data/Gemfile
ADDED
data/LICENSE
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
Copyright (c)
|
1
|
+
Copyright (c) 2011 Dan Pickett
|
2
|
+
|
3
|
+
MIT License
|
2
4
|
|
3
5
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
6
|
a copy of this software and associated documentation files (the
|
@@ -17,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
19
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
20
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
21
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -2,12 +2,23 @@
|
|
2
2
|
|
3
3
|
Ankh is the ancient Egyptian sign of life.
|
4
4
|
|
5
|
-
Use Ankh in your Rails (
|
5
|
+
Use Ankh in your Rails (>= 3.0) projects to protect against bots and other spam producers. It asks a simple
|
6
6
|
arithmatic question to verify that the poster is human.
|
7
7
|
|
8
|
-
In your model:
|
8
|
+
In your activerecord model:
|
9
9
|
|
10
|
-
|
10
|
+
class Post < ActiveRecord::Base
|
11
|
+
validates_human :on => :create
|
12
|
+
end
|
13
|
+
|
14
|
+
Ankh is also available for ActiveModel objects:
|
15
|
+
|
16
|
+
class Foo
|
17
|
+
include ActiveModel::Validations
|
18
|
+
extend Ankh::Model
|
19
|
+
validates_human :on => :create
|
20
|
+
end
|
21
|
+
|
11
22
|
|
12
23
|
In your view (Rails 2 syntax shown below):
|
13
24
|
|
@@ -22,7 +33,6 @@ In your view (Rails 2 syntax shown below):
|
|
22
33
|
|
23
34
|
* Nice form helpers
|
24
35
|
* I18n support
|
25
|
-
* automated testing of Rails 2.3.x vs. 3.0
|
26
36
|
|
27
37
|
== Note on Patches/Pull Requests
|
28
38
|
|
@@ -36,4 +46,4 @@ In your view (Rails 2 syntax shown below):
|
|
36
46
|
|
37
47
|
== Copyright
|
38
48
|
|
39
|
-
Copyright (c)
|
49
|
+
Copyright (c) 2011 Dan Pickett. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,91 +1,13 @@
|
|
1
|
-
|
2
|
-
require
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
3
|
|
4
4
|
begin
|
5
|
-
require '
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "ankh"
|
8
|
-
gem.summary = %Q{Protect against bots and other spam producers with simple mathematical questions}
|
9
|
-
gem.description = %Q{Use Ankh in your Rails (2.3.x or 3.0) projects to protect against bots and other spam producers. It asks a simple
|
10
|
-
arithmatic question to verify that the poster is human.}
|
11
|
-
gem.email = "dpickett@enlightsolutions.com"
|
12
|
-
gem.homepage = "http://github.com/dpickett/ankh"
|
13
|
-
gem.authors = ["Dan Pickett"]
|
14
|
-
gem.add_dependency "activerecord", ">= 2.3.4"
|
15
|
-
gem.add_dependency "activesupport", ">= 2.3.4"
|
16
|
-
gem.add_dependency "configatron", "2.6.3"
|
17
|
-
gem.add_development_dependency "rspec", ">= 1.2.9"
|
18
|
-
# gem.add_development_dependency "yard", ">= 0"
|
19
|
-
gem.add_development_dependency "cucumber", ">= 0"
|
20
|
-
gem.add_development_dependency "mocha"
|
21
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
22
|
-
end
|
23
|
-
Jeweler::GemcutterTasks.new
|
24
|
-
rescue LoadError
|
25
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
26
|
-
end
|
27
|
-
|
28
|
-
begin
|
29
|
-
require 'spec/rake/spectask'
|
30
|
-
Spec::Rake::SpecTask.new(:spec) do |spec|
|
31
|
-
spec.libs << 'lib' << 'spec'
|
32
|
-
spec.spec_files = FileList['spec/**/*_spec.rb']
|
33
|
-
end
|
34
|
-
|
35
|
-
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
36
|
-
spec.libs << 'lib' << 'spec'
|
37
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
38
|
-
spec.rcov = true
|
39
|
-
end
|
40
|
-
rescue LoadError
|
41
|
-
puts "Rspec (or a dependency) not available. gem install rspec"
|
42
|
-
end
|
43
|
-
|
44
|
-
task :spec => :check_dependencies
|
45
|
-
|
46
|
-
begin
|
47
|
-
require 'cucumber/rake/task'
|
48
|
-
Cucumber::Rake::Task.new(:features)
|
49
|
-
|
50
|
-
task :features => :check_dependencies
|
51
|
-
rescue LoadError
|
52
|
-
task :features do
|
53
|
-
abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
|
54
|
-
end
|
55
|
-
end
|
5
|
+
require 'rspec/core/rake_task'
|
56
6
|
|
57
|
-
|
58
|
-
|
59
|
-
Reek::RakeTask.new do |t|
|
60
|
-
t.fail_on_error = true
|
61
|
-
t.verbose = false
|
62
|
-
t.source_files = 'lib/**/*.rb'
|
63
|
-
end
|
64
|
-
rescue LoadError
|
65
|
-
task :reek do
|
66
|
-
abort "Reek is not available. In order to run reek, you must: sudo gem install reek"
|
7
|
+
desc "Run specs"
|
8
|
+
RSpec::Core::RakeTask.new do |t|
|
67
9
|
end
|
68
|
-
end
|
69
10
|
|
70
|
-
begin
|
71
|
-
require 'roodi'
|
72
|
-
require 'roodi_task'
|
73
|
-
RoodiTask.new do |t|
|
74
|
-
t.verbose = false
|
75
|
-
end
|
76
11
|
rescue LoadError
|
77
|
-
|
78
|
-
abort "Roodi is not available. In order to run roodi, you must: sudo gem install roodi"
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
task :default => :spec
|
83
|
-
|
84
|
-
begin
|
85
|
-
require 'yard'
|
86
|
-
YARD::Rake::YardocTask.new
|
87
|
-
rescue LoadError
|
88
|
-
task :yardoc do
|
89
|
-
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
90
|
-
end
|
12
|
+
puts "RSpec is not installed"
|
91
13
|
end
|
data/ankh.gemspec
CHANGED
@@ -1,74 +1,27 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/ankh/version', __FILE__)
|
5
3
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Dan Pickett"]
|
6
|
+
gem.email = ["dpickett@enlightsolutions.com"]
|
7
|
+
gem.description = %q{Protect against bots and other spam producers}
|
8
|
+
gem.summary = %q{Asks simple randomized questions to detect humans}
|
9
|
+
gem.homepage = ""
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
s.extra_rdoc_files = [
|
17
|
-
"LICENSE",
|
18
|
-
"README.rdoc"
|
19
|
-
]
|
20
|
-
s.files = [
|
21
|
-
".document",
|
22
|
-
"LICENSE",
|
23
|
-
"README.rdoc",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"ankh.gemspec",
|
27
|
-
"features/ankh.feature",
|
28
|
-
"features/step_definitions/ankh_steps.rb",
|
29
|
-
"features/support/env.rb",
|
30
|
-
"lib/ankh.rb",
|
31
|
-
"lib/ankh/model.rb",
|
32
|
-
"lib/ankh/question.rb",
|
33
|
-
"lib/ankh/rails/legacy.rb",
|
34
|
-
"lib/ankh/validations/human.rb",
|
35
|
-
"spec/ankh/model_spec.rb",
|
36
|
-
"spec/ankh/question_spec.rb",
|
37
|
-
"spec/ankh_spec.rb",
|
38
|
-
"spec/spec.opts",
|
39
|
-
"spec/spec_helper.rb",
|
40
|
-
"spec/support/active_record_spec_helper.rb"
|
41
|
-
]
|
42
|
-
s.homepage = %q{http://github.com/dpickett/ankh}
|
43
|
-
s.require_paths = ["lib"]
|
44
|
-
s.rubygems_version = %q{1.4.2}
|
45
|
-
s.summary = %q{Protect against bots and other spam producers with simple mathematical questions}
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "ankh"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Ankh::VERSION
|
46
17
|
|
47
|
-
|
48
|
-
|
18
|
+
gem.add_dependency "activesupport", "> 3.0"
|
19
|
+
gem.add_dependency "configatron"
|
49
20
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
s.add_development_dependency(%q<cucumber>, [">= 0"])
|
56
|
-
s.add_development_dependency(%q<mocha>, [">= 0"])
|
57
|
-
else
|
58
|
-
s.add_dependency(%q<activerecord>, [">= 2.3.4"])
|
59
|
-
s.add_dependency(%q<activesupport>, [">= 2.3.4"])
|
60
|
-
s.add_dependency(%q<configatron>, ["= 2.6.3"])
|
61
|
-
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
62
|
-
s.add_dependency(%q<cucumber>, [">= 0"])
|
63
|
-
s.add_dependency(%q<mocha>, [">= 0"])
|
64
|
-
end
|
65
|
-
else
|
66
|
-
s.add_dependency(%q<activerecord>, [">= 2.3.4"])
|
67
|
-
s.add_dependency(%q<activesupport>, [">= 2.3.4"])
|
68
|
-
s.add_dependency(%q<configatron>, ["= 2.6.3"])
|
69
|
-
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
70
|
-
s.add_dependency(%q<cucumber>, [">= 0"])
|
71
|
-
s.add_dependency(%q<mocha>, [">= 0"])
|
72
|
-
end
|
21
|
+
gem.add_development_dependency "sqlite3"
|
22
|
+
gem.add_development_dependency "rake"
|
23
|
+
gem.add_development_dependency "rails"
|
24
|
+
gem.add_development_dependency "rspec", "> 1.2.9"
|
25
|
+
gem.add_development_dependency "mocha"
|
73
26
|
end
|
74
27
|
|
data/lib/..rb
ADDED
data/lib/ankh.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require "active_record"
|
3
1
|
require "digest/sha1"
|
4
2
|
require "configatron"
|
5
3
|
|
6
|
-
require "ankh/rails/legacy"
|
7
|
-
|
8
4
|
require "ankh/question"
|
9
|
-
|
5
|
+
|
6
|
+
require "ankh/validations/human_validator"
|
10
7
|
|
11
8
|
require "ankh/model"
|
9
|
+
require "ankh/railtie" if defined?(Rails)
|
12
10
|
|
13
11
|
module Ankh
|
14
12
|
def self.salt=(salt)
|
@@ -22,4 +20,4 @@ module Ankh
|
|
22
20
|
def self.encrypt(item_to_encrypt)
|
23
21
|
Digest::SHA1.hexdigest("--#{salt}--#{item_to_encrypt}")
|
24
22
|
end
|
25
|
-
end
|
23
|
+
end
|
data/lib/ankh/model.rb
CHANGED
@@ -1,17 +1,25 @@
|
|
1
1
|
module Ankh
|
2
2
|
module Model
|
3
|
-
def
|
4
|
-
|
5
|
-
|
6
|
-
base.send(:attr_accessor, :salted_human_answer)
|
3
|
+
def validates_human(options = {})
|
4
|
+
include Ankh::Model::HelperMethods
|
5
|
+
validates_with Ankh::Validations::HumanValidator, options
|
7
6
|
end
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
|
8
|
+
module HelperMethods
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
attr_accessor :human_answer
|
13
|
+
attr_accessor :human_question
|
14
|
+
attr_accessor :salted_human_answer
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_human_question
|
18
|
+
question = Ankh::Question.generate
|
19
|
+
@human_question = question.question
|
20
|
+
self.salted_human_answer = Ankh.encrypt(question.answer)
|
21
|
+
end
|
13
22
|
end
|
14
23
|
end
|
15
24
|
end
|
16
25
|
|
17
|
-
ActiveRecord::Base.extend(Ankh::Validations::HelperMethods)
|
data/lib/ankh/question.rb
CHANGED
data/lib/ankh/railtie.rb
ADDED
@@ -17,17 +17,5 @@ module Ankh
|
|
17
17
|
record.salted_human_answer.present? && Ankh.encrypt(record.human_answer) != record.salted_human_answer
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
21
|
-
module HelperMethods
|
22
|
-
def validates_human(options = {})
|
23
|
-
self.send(:include, Ankh::Model) unless probably_included_already?
|
24
|
-
validates_with HumanValidator, options
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
def probably_included_already?
|
29
|
-
self.respond_to?(:human_question) && self.respond_to?(:human_answer)
|
30
|
-
end
|
31
|
-
end
|
32
20
|
end
|
33
21
|
end
|
data/lib/ankh/version.rb
ADDED
data/spec/ankh/model_spec.rb
CHANGED
@@ -2,7 +2,9 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Ankh::Model do
|
4
4
|
INVALID_ANSWER = "3241235" #this answer will never be valid due to constraints
|
5
|
-
class Post
|
5
|
+
class Post
|
6
|
+
include ActiveModel::Validations
|
7
|
+
extend Ankh::Model
|
6
8
|
validates_human
|
7
9
|
attr_accessor :name
|
8
10
|
validates_presence_of :name
|
@@ -26,19 +28,19 @@ describe Ankh::Model do
|
|
26
28
|
|
27
29
|
it "should not save if I do not specify a human answer" do
|
28
30
|
subject.human_answer = ""
|
29
|
-
subject.
|
31
|
+
subject.should_not be_valid
|
30
32
|
subject.errors[:human_answer].should_not be_nil
|
31
33
|
end
|
32
34
|
|
33
35
|
it "should clear out the human answer if validation fails" do
|
34
36
|
subject.human_answer = INVALID_ANSWER
|
35
|
-
subject.
|
37
|
+
subject.should_not be_valid
|
36
38
|
subject.human_answer.should be_blank
|
37
39
|
end
|
38
40
|
|
39
41
|
it "should not save if I do not match the intended answer" do
|
40
42
|
subject.human_answer = INVALID_ANSWER
|
41
|
-
subject.
|
43
|
+
subject.should_not be_valid
|
42
44
|
subject.errors[:human_answer].should_not be_nil
|
43
45
|
end
|
44
46
|
|
@@ -47,7 +49,7 @@ describe Ankh::Model do
|
|
47
49
|
Ankh::Question.expects(:generate).returns(question)
|
48
50
|
|
49
51
|
subject.human_answer = question.answer
|
50
|
-
subject.
|
52
|
+
subject.should be_valid
|
51
53
|
end
|
52
54
|
|
53
55
|
it "should clear the human answer if the model is not valid" do
|
@@ -55,7 +57,8 @@ describe Ankh::Model do
|
|
55
57
|
Ankh::Question.expects(:generate).returns(question)
|
56
58
|
subject.name = nil
|
57
59
|
subject.human_answer = question.answer
|
58
|
-
subject.
|
60
|
+
subject.should_not be_valid
|
59
61
|
subject.human_answer.should be_blank
|
60
62
|
end
|
61
|
-
end
|
63
|
+
end
|
64
|
+
|
data/spec/dummy/Rakefile
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
3
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
4
|
+
|
5
|
+
require File.expand_path('../config/application', __FILE__)
|
6
|
+
|
7
|
+
Dummy::Application.load_tasks
|