yandex_captcha 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ae23241bb45bcf89f041f848941187d5200b81f0
4
+ data.tar.gz: 7fa96c268f0025bc5e9dbc06b4db2cca060278a6
5
+ SHA512:
6
+ metadata.gz: fd7ebb30538e31051761bba8432f30c25ea9c57188ee238a9ba49434948feee5870093ae951db45f7534914e4a7c26158f516898fff28634357091a4deafde2a
7
+ data.tar.gz: 3c38f97fdab8cafb79b7a9745cba9fb50570faabd8e5a6aff7f952abfb0493726c75ba284f968b8c14da193ef7579c0a34ee968148d7c6d6e3c8064e4f8d52de
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .idea
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ .irb_history
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.2
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
7
+ - 2.1.1
8
+ notifications:
9
+ email:
10
+ - api@mrcr.ru
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in yandex_captcha.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,23 @@
1
+ Copyright (c) 2014 Alexander Merkulov
2
+ Copyright (c) 2012 Kir Shatrov
3
+
4
+ MIT License
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ "Software"), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,103 @@
1
+ # Yandex Captcha
2
+
3
+ [![Code Climate](https://codeclimate.com/github/merqlove/yandex-captcha.png)](https://codeclimate.com/github/merqlove/yandex-captcha)
4
+ [![Build Status](https://travis-ci.org/merqlove/yandex-captcha.svg)](https://travis-ci.org/merqlove/yandex-captcha)
5
+
6
+ Ruby wrapper for [Yandex Cleanweb](http://api.yandex.ru/cleanweb/) spam detector.
7
+
8
+ Unfortunatelly, this gem *is not capable with MRI 1.8.7* because of MRI 1.8.7 doesn't have `URI.encode_www_form` method.
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'yandex_captcha', '~> 0.4.0'
15
+
16
+ Or:
17
+
18
+ gem 'yandex_captcha', github: 'merqlove/yandex-captcha'
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install yandex_captcha
27
+
28
+ ## Usage
29
+
30
+ Get the api key: [http://api.yandex.ru/cleanweb/getkey.xml](http://api.yandex.ru/cleanweb/getkey.xml)
31
+
32
+ ```ruby
33
+ # Rails routes
34
+ mount YandexCaptcha::Engine, at: '/yandex_captcha/'
35
+
36
+ # Sinatra
37
+ register YandexCaptcha::Sinatra
38
+
39
+ # Configuration
40
+ YandexCaptcha.configure do |config|
41
+ config.api_key = "your_key"
42
+ end
43
+ ```
44
+
45
+ In Views:
46
+
47
+ ```erb
48
+ <%= captcha_tags %>
49
+ <%= captcha_tags ajax:true %>
50
+ <%= captcha_tags noscript:true %>
51
+ ```
52
+
53
+ In Controllers:
54
+
55
+ ```ruby
56
+ if YandexCaptcha::Verify.valid_captcha?(params[:captcha_response_id], params[:captcha_response_field])
57
+ # some
58
+ end
59
+ ```
60
+
61
+ Other examples:
62
+
63
+ ```ruby
64
+ # Methods
65
+ YandexCaptcha::Verify.spam?("just phrase")
66
+ => false
67
+
68
+ YandexCaptcha::Verify.spam?(body_plain: "my text", ip: "80.80.40.3")
69
+ => false
70
+
71
+ YandexCaptcha::Verify.spam?(body_html: "some spam <a href='http://spam.com'>spam link</a>")
72
+ => { id: "request id", links: [ ['http://spam.com', true] ] }
73
+ ```
74
+
75
+ More complex example:
76
+
77
+ ```ruby
78
+
79
+ user_input = "download free porn <a>...</a>"
80
+ if spam_check = YandexCaptcha::Verify.spam?(user_input, ip: current_user.ip)
81
+ captcha = YandexCaptcha::Verify.get_captcha(spam_check[:id])
82
+
83
+ # now you can show captcha[:url] to user
84
+ # but remember to write captcha[:captcha] to session
85
+
86
+ # to check is captcha enterred by user is valid:
87
+ captcha_valid = YandexCaptcha::Verify.valid_captcha?(result[:id], captcha[:captcha], user_captcha)
88
+ end
89
+ ```
90
+
91
+ If you use Yandex Captcha in Rails app, we recommend to set up the api key in `config/initializers/yandex_captcha.rb`
92
+
93
+ ## Contributing
94
+
95
+ 1. Fork it
96
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
97
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
98
+ 4. Push to the branch (`git push origin my-new-feature`)
99
+ 5. Create new Pull Request
100
+
101
+ ---
102
+
103
+ Special respect to Evrone which gem `yandex-cleanweb` include most of code in `lib/yandex_captcha/verify.rb` and some examples on this page.
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ task :default => :test
7
+
8
+ Rake::TestTask.new do |t|
9
+ t.libs << "lib"
10
+ t.libs << "test"
11
+ t.test_files = FileList["test/**/*_test.rb"]
12
+ t.verbose = true
13
+ end
@@ -0,0 +1,4 @@
1
+ $ ->
2
+ $.getJSON "<%= YandexCaptcha::Engine.routes.url_helpers.captcha_path %>", (data) ->
3
+ $("#captcha_image img").attr("src", data.url)
4
+ $("#captcha_widget input[name=captcha_response_id]").attr("value", data.captcha)
@@ -0,0 +1,3 @@
1
+ #captcha_widget #captcha_image{
2
+ min-height: 65px;
3
+ }
@@ -0,0 +1,6 @@
1
+ module YandexCaptcha
2
+ class ApplicationController < ActionController::Base
3
+ layout false
4
+ protect_from_forgery
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ module YandexCaptcha
2
+ class CaptchaController < YandexCaptcha::ApplicationController
3
+ respond_to :json
4
+ def show
5
+ respond_with YandexCaptcha::Verify.get_captcha
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ <% if noscript %>
2
+ <noscript>
3
+ <% end %>
4
+ <div id="captcha_widget">
5
+ <% if error %>
6
+ <div id="captcha_error"><%= error %></div>
7
+ <% end %>
8
+ <div id="captcha_image">
9
+ <img src="<%= captcha[:url] %>" />
10
+ </div>
11
+ <input type="text" id="captcha_response_field" name="captcha_response_field" placeholder="Введите цифры" />
12
+ <input type="hidden" name="captcha_response_id" value="<%= captcha[:captcha] %>" />
13
+ </div>
14
+ <% if noscript %>
15
+ </noscript>
16
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <div id="captcha_widget">
2
+ <div id="captcha_image">
3
+ <img src="<%= asset_path("yandex_captcha/loading.gif") %>" />
4
+ </div>
5
+ <input type="text" id="captcha_response_field" name="captcha_response_field" placeholder="Введите цифры" />
6
+ <input type="hidden" name="captcha_response_id" value="" />
7
+ </div>
8
+ <%= javascript_include_tag "yandex_captcha/captcha" %>
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ YandexCaptcha::Engine.routes.draw do
2
+ match 'captcha' => 'captcha#show'
3
+ end
@@ -0,0 +1,46 @@
1
+ module YandexCaptcha
2
+ # This class enables detailed configuration of the Yandex CleanWeb services.
3
+ #
4
+ # By calling
5
+ #
6
+ # YandexCaptcha.configuration # => instance of YandexCaptcha::Configuration
7
+ #
8
+ # or
9
+ # YandexCaptcha.configure do |config|
10
+ # config # => instance of YandexCaptcha::Configuration
11
+ # end
12
+ #
13
+ # you are able to perform configuration updates.
14
+ #
15
+ # Your are able to customize all attributes listed below. All values have
16
+ # sensitive default and will very likely not need to be changed.
17
+ #
18
+ # Please note that the public and private key for the Yandex CleanWeb API Access
19
+ # have no useful default value. The keys may be set via the Shell enviroment
20
+ # or using this configuration. Settings within this configuration always take
21
+ # precedence.
22
+ #
23
+ # Setting the keys with this Configuration
24
+ #
25
+ # YandexCaptcha.configure do |config|
26
+ # config.api_key = 'cw.1.1.gsdjdgskjhsdgjkgsdjsdjgkskhsgjkgsjhdkgsdghskd.sdgjhgsdsgdkjgdshkgds'
27
+ # config.captcha_type = 'elite'
28
+ # end
29
+ #
30
+ class Configuration
31
+ attr_accessor :api_server_url,
32
+ :api_key,
33
+ :skip_verify_env,
34
+ :handle_timeouts_gracefully,
35
+ :captcha_type
36
+
37
+ def initialize #:nodoc:
38
+ @api_server_url = API_URL
39
+ @captcha_type = CAPTCHA_TYPE
40
+ @api_key = ENV['CAPTCHA_KEY']
41
+ @skip_verify_env = SKIP_VERIFY_ENV
42
+ @handle_timeouts_gracefully = HANDLE_TIMEOUTS_GRACEFULLY
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,19 @@
1
+ module YandexCaptcha
2
+ class Engine < Rails::Engine
3
+ isolate_namespace YandexCaptcha
4
+ engine_name 'yandex_captcha'
5
+
6
+ if Rails.version >= '3.1'
7
+ initializer :assets do |app|
8
+ app.config.assets.precompile += %w( yandex_captcha/captcha.js yandex_captcha/captcha.css yandex_captcha/loading.gif )
9
+ end
10
+ end
11
+
12
+ initializer "setup config" do
13
+ begin
14
+ ActionView::Base.send(:include, ::YandexCaptcha::Helpers::Rails)
15
+ ActionController::Base.send(:include, ::YandexCaptcha::Verify)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module YandexCaptcha
2
+ module Helpers
3
+ module Rails
4
+
5
+ def captcha_tags(options = {})
6
+
7
+ error = options[:error] ||= ((defined? flash) ? flash[:captcha_error] : "")
8
+ if options[:ajax]
9
+ render "yandex_captcha/captcha_ajax"
10
+ else
11
+ captcha = YandexCaptcha::Verify.get_captcha
12
+ render "yandex_captcha/captcha", locals: { captcha: captcha, error: error, noscript: options[:noscript] } if captcha
13
+ end
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module YandexCaptcha
2
+ module Helpers
3
+ module Sinatra
4
+
5
+ def captcha_tags(options = {})
6
+ template = settings.captcha_ajax_template.to_s.to_sym
7
+ if options[:ajax]
8
+ render(current_engine, template, {layout: false}).to_s.html_safe
9
+ else
10
+ captcha = YandexCaptcha::Verify.get_captcha
11
+ render(current_engine, template, {layout: false}, { captcha: captcha, noscript: options[:noscript] }).to_s.html_safe if captcha
12
+ end
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ require "yandex_captcha"
2
+ require 'yandex_captcha/engine'
3
+ require 'yandex_captcha/helpers/rails'
@@ -0,0 +1,19 @@
1
+ require 'sinatra/base'
2
+ require 'yandex_captcha/helpers/sinatra'
3
+
4
+ module YandexCaptcha
5
+ module Sinatra
6
+ def self.registered(app)
7
+ app.set :captcha_ajax_template, "yandex_captcha/captcha_ajax" unless app.settings.captcha_ajax_template
8
+ app.set :captcha_template, "yandex_captcha/captcha" unless app.settings.captcha_template
9
+ app.set :captcha_url, "/get_captcha" unless app.settings.captcha_url
10
+
11
+ app.get app.settings.captcha_url do
12
+ content_type :json
13
+ YandexCaptcha::Verify.get_captcha.to_json
14
+ end
15
+
16
+ app.helpers Helpers::Sinatra
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,109 @@
1
+ require "uri"
2
+ require "nokogiri"
3
+ require "net/http"
4
+
5
+ module YandexCaptcha
6
+ module Verify
7
+ class << self
8
+
9
+ def spam?(*options)
10
+ response = api_check_spam(options)
11
+ doc = Nokogiri::XML(response)
12
+
13
+ spam_result = doc.xpath('//check-spam-result')
14
+ request_id_tag = spam_result.xpath('id')
15
+ spam_flag_tag = spam_result.xpath('text')
16
+
17
+ raise BadResponseException if request_id_tag.size.zero?
18
+
19
+ request_id = request_id_tag.first
20
+ spam_flag = spam_flag_tag.first.attributes["spam-flag"]
21
+
22
+ spam_check request_id.content, spam_result, spam_flag.content
23
+ end
24
+
25
+ def get_captcha(request_id=nil)
26
+ response = api_get_captcha(request_id)
27
+ doc = Nokogiri::XML(response)
28
+
29
+ url = doc.xpath('//get-captcha-result/url').text
30
+ captcha_id = doc.xpath('//get-captcha-result/captcha').text
31
+
32
+ { url: url, captcha: captcha_id }
33
+ end
34
+
35
+ def valid_captcha?(captcha_id=nil, value=nil, request_id=nil)
36
+ response = api_check_captcha(request_id, captcha_id, value)
37
+ doc = Nokogiri::XML(response)
38
+ doc.xpath('//check-captcha-result/ok').any?
39
+ end
40
+
41
+ private
42
+
43
+ def api_check_captcha(request_id, captcha_id, value)
44
+ check_captcha_url = "#{API_URL}/check-captcha"
45
+ params = {
46
+ key: prepare_api_key,
47
+ id: request_id,
48
+ captcha: captcha_id,
49
+ value: value
50
+ }
51
+
52
+ uri = URI.parse(check_captcha_url)
53
+ uri.query = URI.encode_www_form(params)
54
+
55
+ Net::HTTP.get(uri)
56
+ end
57
+
58
+ def api_get_captcha(request_id)
59
+ get_captcha_url = "#{API_URL}/get-captcha"
60
+ params = { key: prepare_api_key, id: request_id, type: YandexCaptcha.configuration.captcha_type }
61
+
62
+ uri = URI.parse(get_captcha_url)
63
+ uri.query = URI.encode_www_form(params)
64
+
65
+ Net::HTTP.get(uri)
66
+ end
67
+
68
+ def api_check_spam(options)
69
+ cleanweb_options = { key: prepare_api_key }
70
+ run_options = options[0]
71
+
72
+ if run_options.is_a?(String) # quick check
73
+ cleanweb_options[:body_plain] = run_options
74
+ else
75
+ options = run_options
76
+ cleanweb_options.merge!(Hash[options.map{ |k,v| [k.to_s.gsub("_","-"), v] }])
77
+ end
78
+
79
+ check_spam_url = "#{API_URL}/check-spam"
80
+ uri = URI.parse(check_spam_url)
81
+ response = Net::HTTP.post_form(uri, cleanweb_options)
82
+ response.body
83
+ end
84
+
85
+ def spam_check(request_id, spam_result, spam_flag)
86
+ return false unless request_id or spam_result or spam_flag
87
+
88
+ if spam_flag == 'yes'
89
+ links = spam_result.xpath('links')
90
+ links_childrens = links.first.children
91
+
92
+ links_childrens.map do |el|
93
+ [el.attributes["url"], el.attributes["spam_flag"] == 'yes']
94
+ end
95
+
96
+ { id: request_id, links: links_childrens }
97
+ else
98
+ false
99
+ end
100
+ end
101
+
102
+ def prepare_api_key
103
+ raise NoApiKeyException if YandexCaptcha.configuration.api_key.nil? || YandexCaptcha.configuration.api_key.empty?
104
+
105
+ YandexCaptcha.configuration.api_key
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,3 @@
1
+ module YandexCaptcha
2
+ VERSION = "0.4.0"
3
+ end
@@ -0,0 +1,53 @@
1
+ require 'yandex_captcha/configuration'
2
+ require 'yandex_captcha/verify'
3
+
4
+ module YandexCaptcha
5
+ class NoApiKeyException < Exception; end
6
+ class BadResponseException < Exception; end
7
+
8
+ API_URL = 'http://cleanweb-api.yandex.ru/1.0'
9
+ CAPTCHA_TYPE = 'std'
10
+ HANDLE_TIMEOUTS_GRACEFULLY = true
11
+ SKIP_VERIFY_ENV = ['test', 'cucumber']
12
+
13
+ # Gives access to the current Configuration.
14
+ def self.configuration
15
+ @configuration ||= Configuration.new
16
+ end
17
+
18
+ # Allows easy setting of multiple configuration options. See Configuration
19
+ # for all available options.
20
+ #--
21
+ # The temp assignment is only used to get a nicer rdoc. Feel free to remove
22
+ # this hack.
23
+ #++
24
+ def self.configure
25
+ config = configuration
26
+ yield(config)
27
+ end
28
+
29
+ def self.with_configuration(config)
30
+ original_config = {}
31
+
32
+ config.each do |key, value|
33
+ original_config[key] = configuration.send(key)
34
+ configuration.send("#{key}=", value)
35
+ end
36
+
37
+ result = yield if block_given?
38
+
39
+ original_config.each { |key, value| configuration.send("#{key}=", value) }
40
+ result
41
+ end
42
+
43
+ class YandexCleanwebError < StandardError
44
+ end
45
+ end
46
+
47
+ if defined?(Rails)
48
+ require 'yandex_captcha/rails'
49
+ end
50
+
51
+ if defined?(Sinatra) and Sinatra.respond_to? :register
52
+ require 'yandex_captcha/sinatra'
53
+ end
@@ -0,0 +1,9 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+
3
+ require "minitest/autorun"
4
+ require "minitest/spec"
5
+ require "minitest/pride"
6
+ require "minitest-spec-context"
7
+ require "fakeweb"
8
+
9
+ require "yandex_captcha"
@@ -0,0 +1,109 @@
1
+ # encoding: utf-8
2
+ require "test_helper"
3
+
4
+ describe YandexCaptcha do
5
+
6
+ context "without api key" do
7
+ before do
8
+ YandexCaptcha.configure do |config|
9
+ config.api_key = nil
10
+ end
11
+ end
12
+
13
+ describe "#spam?" do
14
+ it "raise an error" do
15
+ -> {
16
+ YandexCaptcha::Verify.spam?("anything")
17
+ }.must_raise YandexCaptcha::NoApiKeyException
18
+ end
19
+ end
20
+
21
+ describe "#get_captcha" do
22
+ it "raise an error" do
23
+ -> {
24
+ YandexCaptcha::Verify.get_captcha("anything")
25
+ }.must_raise YandexCaptcha::NoApiKeyException
26
+ end
27
+ end
28
+
29
+ describe "#valid_captcha?" do
30
+ it "raise an error" do
31
+ -> {
32
+ YandexCaptcha::Verify.valid_captcha?("anything", "anything", 123)
33
+ }.must_raise YandexCaptcha::NoApiKeyException
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ context "with empty api key" do
40
+ before do
41
+ YandexCaptcha.configure do |config|
42
+ config.api_key = ""
43
+ end
44
+ end
45
+
46
+ it "raise an error" do
47
+ -> {
48
+ YandexCaptcha::Verify.spam?("anything")
49
+ }.must_raise YandexCaptcha::NoApiKeyException
50
+ end
51
+ end
52
+
53
+ context "with api key" do
54
+
55
+ before do
56
+ YandexCaptcha.configure do |config|
57
+ config.api_key = "cw.1.1.20121227T080449Z.51de1ee126e5ced6.f4f417fb55727520d7e39b00cf5393d4b1ca5e78"
58
+ end
59
+ end
60
+
61
+ describe "#spam?" do
62
+
63
+ describe "simple check" do
64
+ it "works" do
65
+ YandexCaptcha::Verify.spam?("фраза").must_equal false
66
+ YandexCaptcha::Verify.spam?("недорого увеличение пениса проститутки").must_equal false
67
+ end
68
+ end
69
+
70
+ describe "advanced mode" do
71
+ it "works" do
72
+ YandexCaptcha::Verify.spam?(body_plain: "my text", ip: "80.80.40.3").must_equal false
73
+ end
74
+
75
+ it "with some html" do
76
+ result = YandexCaptcha::Verify.spam?(body_html: "some spam <a href='http://spam.com'>spam link</a>")
77
+
78
+ result[:id].wont_be_empty
79
+ result[:links].must_be_empty
80
+ end
81
+ end
82
+ end
83
+
84
+ describe "#get_captcha + #valid_captcha?" do
85
+
86
+ it "works for not valid captchas" do
87
+ result = YandexCaptcha::Verify.spam?(body_html: "some spam <a href='http://spam.com'>spam link</a>")
88
+ captcha = YandexCaptcha::Verify.get_captcha(result[:id])
89
+
90
+ captcha[:url].wont_be_empty
91
+ captcha[:captcha].wont_be_empty
92
+
93
+ valid = YandexCaptcha::Verify.valid_captcha?(result[:id], captcha[:captcha], "1234")
94
+ valid.must_equal false
95
+ end
96
+ end
97
+
98
+ describe "raises BadResponseException in case of empty result" do
99
+ before do
100
+ FakeWeb.clean_registry
101
+ end
102
+
103
+ it "check for spam" do
104
+ FakeWeb.register_uri(:post, "http://cleanweb-api.yandex.ru/1.0/check-spam", body: "")
105
+ proc { YandexCaptcha::Verify.spam?(body_plain: "any text") }.must_raise(YandexCaptcha::BadResponseException)
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'yandex_captcha/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "yandex_captcha"
8
+ gem.version = YandexCaptcha::VERSION
9
+ gem.authors = ["Alexander Merkulov","Kir Shatrov"]
10
+ gem.email = ["sasha@merqlove.ru","shatrov@me.com"]
11
+ gem.description = %q{Ruby wrapper for Yandex.Cleanweb}
12
+ gem.summary = %q{Ruby wrapper for Yandex.Cleanweb spam detector}
13
+ gem.homepage = "https://github.com/merqlove/yandex-captcha"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency 'nokogiri'
21
+
22
+ gem.add_development_dependency "rake"
23
+ gem.add_development_dependency "minitest", "~> 3.0"
24
+ gem.add_development_dependency "minitest-spec-context"
25
+ gem.add_development_dependency "fakeweb"
26
+ end
metadata ADDED
@@ -0,0 +1,144 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yandex_captcha
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Merkulov
8
+ - Kir Shatrov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: minitest
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: minitest-spec-context
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: fakeweb
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ description: Ruby wrapper for Yandex.Cleanweb
85
+ email:
86
+ - sasha@merqlove.ru
87
+ - shatrov@me.com
88
+ executables: []
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - ".gitignore"
93
+ - ".ruby-version"
94
+ - ".travis.yml"
95
+ - Gemfile
96
+ - LICENSE.txt
97
+ - README.md
98
+ - Rakefile
99
+ - app/assets/images/yandex_captcha/loading.gif
100
+ - app/assets/javascripts/yandex_captcha/captcha.coffee.erb
101
+ - app/assets/stylesheets/yandex_captcha/captcha.css
102
+ - app/controllers/yandex_captcha/application_controller.rb
103
+ - app/controllers/yandex_captcha/captcha_controller.rb
104
+ - app/views/yandex_captcha/_captcha.html.erb
105
+ - app/views/yandex_captcha/_captcha_ajax.html.erb
106
+ - config/routes.rb
107
+ - lib/yandex_captcha.rb
108
+ - lib/yandex_captcha/configuration.rb
109
+ - lib/yandex_captcha/engine.rb
110
+ - lib/yandex_captcha/helpers/rails.rb
111
+ - lib/yandex_captcha/helpers/sinatra.rb
112
+ - lib/yandex_captcha/rails.rb
113
+ - lib/yandex_captcha/sinatra.rb
114
+ - lib/yandex_captcha/verify.rb
115
+ - lib/yandex_captcha/version.rb
116
+ - test/test_helper.rb
117
+ - test/yandex_cleanweb_test.rb
118
+ - yandex_captcha.gemspec
119
+ homepage: https://github.com/merqlove/yandex-captcha
120
+ licenses: []
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.2.2
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Ruby wrapper for Yandex.Cleanweb spam detector
142
+ test_files:
143
+ - test/test_helper.rb
144
+ - test/yandex_cleanweb_test.rb