yandex_captcha 0.4.3.4 → 0.4.3.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be95e31ba3d6a68c33cdfa89570809b3fd91014c
4
- data.tar.gz: f1911ec28d4c92681ef7f577796d5c2ecc2a0c66
3
+ metadata.gz: dec49d32aa312a91762b280c934c38aa8fc44890
4
+ data.tar.gz: 42b4f188c419dc203b5742e5bbbd0c8d5f0e560f
5
5
  SHA512:
6
- metadata.gz: aa809606627cf397ab5ebcb9b21ed99c4066612b968d668b120c5753ed7e9e28e69cc0bab09a913db81d2995a73f9c17b8a6128271e552549280329f17908992
7
- data.tar.gz: 5737ae2fa966463222ae144b33ae74ca532e8a1982f97335d133efd7ac4ce0c3e2564f3ef205b629fb33205a9cd421bafe5356233bed38040b45d60565f44707
6
+ metadata.gz: ba4557d65c6bbd374c806e01c846f6ff3c0e4f8e1df1523ced84905d754bb43af1afed921f52e300ca0cc18b3636b0789de68031dd6167d055daad3df0b9cc74
7
+ data.tar.gz: 0b64cb323d9b11471b83c648b20263159e6436b35911cbce215e3a6fd8995ec16ddb34f755a4946994428336cbaa766878149917c72be7945876cd9a7d0b445a
data/.travis.yml CHANGED
@@ -1,9 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.2
4
3
  - 1.9.3
5
4
  - 2.0.0
6
- - 2.1.0
7
5
  - 2.1.1
8
6
  notifications:
9
7
  email:
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  [![Code Climate](https://codeclimate.com/github/merqlove/yandex-captcha.png)](https://codeclimate.com/github/merqlove/yandex-captcha)
4
4
  [![Build Status](https://travis-ci.org/merqlove/yandex-captcha.svg)](https://travis-ci.org/merqlove/yandex-captcha)
5
+ [![Inline docs](http://inch-ci.org/github/merqlove/yandex-captcha.svg)](http://inch-ci.org/github/merqlove/yandex-captcha)
6
+ [![Dependency Status](https://gemnasium.com/merqlove/yandex-captcha.svg)](https://gemnasium.com/merqlove/yandex-captcha)
5
7
 
6
8
  Ruby wrapper for [Yandex Cleanweb](http://api.yandex.ru/cleanweb/) spam detector.
7
9
 
@@ -35,6 +37,17 @@ Tested:
35
37
 
36
38
  Get the api key: [http://api.yandex.ru/cleanweb/getkey.xml](http://api.yandex.ru/cleanweb/getkey.xml)
37
39
 
40
+ ### Configuration options
41
+
42
+ | Name | Value |
43
+ | :------------- |:-------------|
44
+ | api_key | Yandex.CleanWeb API key. (default `nil`) |
45
+ | captcha_type (optional) | Type of captcha (std,estd,lite,elite,rus,latl,elatl,latu,elatu,latm, elatm). (default `std`) |
46
+ | api_server_url (optional) | Yandex.CleanWeb API server URL. (default `http://cleanweb-api.yandex.ru/1.0`) |
47
+ | skip_verify_env (optional) | Custom error provider for non ajax mode. (default `['test', 'cucumber']`) |
48
+ | handle_timeouts_gracefull (optional) | Graceful error's on timeouts. (default `true`) |
49
+ | current_env (optional) | Current environment (default `ENV['RACK_ENV'] || ENV['RAILS_ENV']`) |
50
+
38
51
  ### Code
39
52
 
40
53
  ```ruby
@@ -52,10 +65,13 @@ end
52
65
 
53
66
  ### In Views
54
67
 
55
- #### View Helper Options
68
+ #### `captcha_tag` options
56
69
 
57
- - `ajax` = `true/false`
58
- - `noscript` = `true/false` Only for non ajax version.
70
+ | Name | Value |
71
+ | :------------- |:-------------|
72
+ | :ajax (optional) | Ajaxify your captcha, don't wait for it on any page. (default `false`) |
73
+ | :noscript (optional) | Adding <noscript></noscript> wrap around captcha. Works only for non ajax mode. (default `false`) |
74
+ | :error (optional) | Custom error provider for non ajax mode. (default `flash` or `nil`) |
59
75
 
60
76
  #### Code
61
77
 
@@ -75,6 +91,22 @@ or
75
91
 
76
92
  ### In Controllers
77
93
 
94
+ #### `valid_captcha?` options
95
+
96
+ | Name | Value |
97
+ | :------------- |:-------------|
98
+ | :captcha_id | Yandex.CleanWeb captcha id. (default `nil`) |
99
+ | :value | User response value. (default `nil`) |
100
+ | :request_id (optional) | Some unique request id (default `nil`) |
101
+
102
+ #### `get_captcha` options
103
+
104
+ | Name | Value |
105
+ | :------------- |:-------------|
106
+ | :request_id (optional) | Some unique request id (default `nil`) |
107
+
108
+ #### Example
109
+
78
110
  ```ruby
79
111
  # Rails / Sinatra / or if you included helpers
80
112
  if valid_captcha?(params[:captcha_response_id], params[:captcha_response_field])
@@ -133,4 +165,4 @@ If you use Yandex Captcha in Rails app, we recommend to set up the api key in `c
133
165
 
134
166
  ---
135
167
 
136
- Special respect to Evrone which gem `yandex-cleanweb` include most of code in `lib/yandex_captcha/verify.rb` and some examples on this page.
168
+ Special respect to Evrone which gem `yandex-cleanweb` include most of code in `lib/yandex_captcha/verify.rb` and some examples on this page.
@@ -3,7 +3,6 @@ require 'yandex_captcha/verify'
3
3
  require 'yandex_captcha/helpers/base'
4
4
 
5
5
  module YandexCaptcha
6
- module Helpers ; end
7
6
  class NoApiKeyException < Exception; end
8
7
  class BadResponseException < Exception; end
9
8
  class YandexCaptchaError < StandardError; end
@@ -24,6 +23,14 @@ module YandexCaptcha
24
23
  def self.configuration
25
24
  @configuration ||= Configuration.new
26
25
  end
26
+
27
+ def self.skip_env
28
+ if configuration.skip_verify_env.include? configuration.current_env
29
+ true
30
+ else
31
+ false
32
+ end
33
+ end
27
34
  end
28
35
 
29
36
  if defined?(Rails)
@@ -25,6 +25,10 @@ module YandexCaptcha
25
25
  # YandexCaptcha.configure do |config|
26
26
  # config.api_key = 'cw.1.1.gsdjdgskjhsdgjkgsdjsdjgkskhsgjkgsjhdkgsdghskd.sdgjhgsdsgdkjgdshkgds'
27
27
  # config.captcha_type = 'elite'
28
+ # config.api_server_url = 'http://cleanweb-api.yandex.ru/1.0'
29
+ # config.skip_verify_env = ["test", "cucumber"]
30
+ # config.handle_timeouts_gracefull = true'
31
+ # config.current_env = "test"
28
32
  # end
29
33
  #
30
34
  class Configuration
@@ -32,14 +36,16 @@ module YandexCaptcha
32
36
  :api_key,
33
37
  :skip_verify_env,
34
38
  :handle_timeouts_gracefully,
35
- :captcha_type
39
+ :captcha_type,
40
+ :current_env
36
41
 
37
42
  def initialize #:nodoc:
38
- @api_server_url = API_URL
39
- @captcha_type = CAPTCHA_TYPE
40
- @api_key = ENV['CAPTCHA_KEY']
43
+ @api_server_url = API_URL
44
+ @captcha_type = CAPTCHA_TYPE
45
+ @api_key = ENV['CAPTCHA_KEY']
41
46
  @skip_verify_env = SKIP_VERIFY_ENV
42
47
  @handle_timeouts_gracefully = HANDLE_TIMEOUTS_GRACEFULLY
48
+ @current_env = ENV['RACK_ENV'] || ENV['RAILS_ENV']
43
49
  end
44
50
 
45
51
  end
@@ -2,16 +2,16 @@ module YandexCaptcha
2
2
  module Helpers
3
3
  module Rails
4
4
  def captcha_tags(options = {})
5
+ return if YandexCaptcha.skip_env
5
6
 
6
- error = options[:error] ||= ((defined? flash) ? flash[:captcha_error] : "")
7
7
  if options[:ajax]
8
8
  render partial: "yandex_captcha/captcha_ajax"
9
9
  else
10
+ error = options[:error] ||= ((defined? flash) ? flash[:yandex_captcha_error] : "")
10
11
  captcha = YandexCaptcha::Verify.get_captcha
11
12
  render partial: "yandex_captcha/captcha", locals: { captcha: captcha, error: error, noscript: options[:noscript] } if captcha
12
13
  end
13
14
  end
14
-
15
15
  end
16
16
  end
17
17
  end
@@ -2,12 +2,15 @@ module YandexCaptcha
2
2
  module Helpers
3
3
  module Sinatra
4
4
  def captcha_tags(options = {})
5
+ return if YandexCaptcha.skip_env
6
+
5
7
  template = settings.captcha_ajax_template.to_s.to_sym
6
8
  if options[:ajax]
7
9
  render(current_engine, template, {layout: false}).to_s.html_safe
8
10
  else
11
+ error = options[:error] ||= ((defined? flash) ? flash[:yandex_captcha_error] : "")
9
12
  captcha = YandexCaptcha::Verify.get_captcha
10
- render(current_engine, template, {layout: false}, { captcha: captcha, noscript: options[:noscript] }).to_s.html_safe if captcha
13
+ render(current_engine, template, {layout: false}, { captcha: captcha, error: error, noscript: options[:noscript] }).to_s.html_safe if captcha
11
14
  end
12
15
  end
13
16
 
@@ -11,15 +11,18 @@ module YandexCaptcha
11
11
  doc = Nokogiri::XML(response)
12
12
 
13
13
  spam_result = doc.xpath('//check-spam-result')
14
+
15
+ raise BadResponseException unless spam_result
16
+
14
17
  request_id_tag = spam_result.xpath('id')
15
18
  spam_flag_tag = spam_result.xpath('text')
16
19
 
17
20
  raise BadResponseException if request_id_tag.size.zero?
18
21
 
19
- request_id = request_id_tag.first
20
- spam_flag = spam_flag_tag.first.attributes["spam-flag"]
22
+ request_id = request_id_tag.first.content
23
+ spam_flag = spam_flag_tag.first.attributes["spam-flag"].content
21
24
 
22
- spam_check request_id.content, spam_result, spam_flag.content
25
+ spam_flag_check request_id, spam_result, spam_flag
23
26
  end
24
27
 
25
28
  def get_captcha(request_id=nil)
@@ -33,6 +36,8 @@ module YandexCaptcha
33
36
  end
34
37
 
35
38
  def valid_captcha?(captcha_id=nil, value=nil, request_id=nil)
39
+ true if YandexCaptcha.skip_env
40
+
36
41
  response = api_check_captcha(request_id, captcha_id, value)
37
42
  doc = Nokogiri::XML(response)
38
43
  doc.xpath('//check-captcha-result/ok').any?
@@ -62,7 +67,7 @@ module YandexCaptcha
62
67
  uri = URI.parse(get_captcha_url)
63
68
  uri.query = URI.encode_www_form(params)
64
69
 
65
- Net::HTTP.get(uri)
70
+ request_uri(uri)
66
71
  end
67
72
 
68
73
  def api_check_spam(options)
@@ -78,12 +83,12 @@ module YandexCaptcha
78
83
 
79
84
  check_spam_url = "#{API_URL}/check-spam"
80
85
  uri = URI.parse(check_spam_url)
81
- response = Net::HTTP.post_form(uri, cleanweb_options)
86
+ response = request_uri(uri, cleanweb_options, :post)
82
87
  response.body
83
88
  end
84
89
 
85
- def spam_check(request_id, spam_result, spam_flag)
86
- return false unless request_id or spam_result or spam_flag
90
+ def spam_flag_check(request_id, spam_result, spam_flag)
91
+ return {id: request_id, links: []} unless spam_flag
87
92
 
88
93
  if spam_flag == 'yes'
89
94
  links = spam_result.xpath('links')
@@ -99,6 +104,31 @@ module YandexCaptcha
99
104
  end
100
105
  end
101
106
 
107
+ def request_uri(uri, options={}, type=:get)
108
+ begin
109
+ case type
110
+ when :post
111
+ Net::HTTP.post_form(uri, options)
112
+ else
113
+ Net::HTTP.get(uri)
114
+ end
115
+ rescue Timeout::Error
116
+ if YandexCaptcha.configuration.handle_timeouts_gracefully
117
+ if defined?(flash)
118
+ flash[:captcha_error] = if defined?(I18n)
119
+ I18n.translate('yandex_captcha.errors.cleanweb_unreachable', {:default => 'Yandex.CleanWeb unreachable.'})
120
+ else
121
+ 'Yandex.CleanWeb unreachable.'
122
+ end
123
+ end
124
+ else
125
+ raise YandexCaptchaError, "Yandex.CleanWeb unreachable."
126
+ end
127
+ rescue Exception => e
128
+ raise YandexCaptchaError, e.message, e.backtrace
129
+ end
130
+ end
131
+
102
132
  def prepare_api_key
103
133
  raise NoApiKeyException if YandexCaptcha.configuration.api_key.nil? || YandexCaptcha.configuration.api_key.empty?
104
134
 
@@ -1,3 +1,3 @@
1
1
  module YandexCaptcha
2
- VERSION = "0.4.3.4"
2
+ VERSION = "0.4.3.5"
3
3
  end
@@ -2,6 +2,33 @@
2
2
  require "test_helper"
3
3
 
4
4
  describe YandexCaptcha do
5
+ context "with test environment" do
6
+ before do
7
+ YandexCaptcha.configure do |config|
8
+ config.current_env = "test"
9
+ end
10
+ end
11
+
12
+ describe "#skip_env" do
13
+ it "skipping" do
14
+ YandexCaptcha.skip_env.must_equal true
15
+ end
16
+ end
17
+ end
18
+
19
+ context "with dev environment" do
20
+ before do
21
+ YandexCaptcha.configure do |config|
22
+ config.current_env = "development"
23
+ end
24
+ end
25
+
26
+ describe "#skip_env" do
27
+ it "working" do
28
+ YandexCaptcha.skip_env.must_equal false
29
+ end
30
+ end
31
+ end
5
32
 
6
33
  context "without api key" do
7
34
  before do
@@ -29,7 +56,7 @@ describe YandexCaptcha do
29
56
  describe "#valid_captcha?" do
30
57
  it "raise an error" do
31
58
  -> {
32
- YandexCaptcha::Verify.valid_captcha?("anything", "anything", 123)
59
+ YandexCaptcha::Verify.valid_captcha?("anything", 123, "anything")
33
60
  }.must_raise YandexCaptcha::NoApiKeyException
34
61
  end
35
62
  end
@@ -58,39 +85,38 @@ describe YandexCaptcha do
58
85
  end
59
86
  end
60
87
 
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
88
+ # describe "#spam?" do
89
+ #
90
+ # describe "simple check" do
91
+ # it "works" do
92
+ # YandexCaptcha::Verify.spam?("фраза").must_equal false
93
+ # YandexCaptcha::Verify.spam?("недорого увеличение пениса проститутки").must_equal false
94
+ # end
95
+ # end
96
+ #
97
+ # describe "advanced mode" do
98
+ # it "works" do
99
+ # YandexCaptcha::Verify.spam?(body_plain: "my text", ip: "80.80.40.3").must_equal false
100
+ # end
101
+ #
102
+ # it "with some html" do
103
+ # result = YandexCaptcha::Verify.spam?(body_html: "some spam <a href='http://spam.com'>spam link</a>")
104
+ #
105
+ # result[:id].wont_be_empty
106
+ # result[:links].must_be_empty
107
+ # end
108
+ # end
109
+ # end
83
110
 
84
111
  describe "#get_captcha + #valid_captcha?" do
85
112
 
86
113
  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])
114
+ captcha = YandexCaptcha::Verify.get_captcha
89
115
 
90
116
  captcha[:url].wont_be_empty
91
117
  captcha[:captcha].wont_be_empty
92
118
 
93
- valid = YandexCaptcha::Verify.valid_captcha?(result[:id], captcha[:captcha], "1234")
119
+ valid = YandexCaptcha::Verify.valid_captcha?(captcha[:captcha], "1234")
94
120
  valid.must_equal false
95
121
  end
96
122
  end
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency 'nokogiri'
21
21
 
22
22
  gem.add_development_dependency "rake"
23
- gem.add_development_dependency "minitest", "~> 3.0"
23
+ gem.add_development_dependency "minitest", "~> 5.0"
24
24
  gem.add_development_dependency "minitest-spec-context"
25
25
  gem.add_development_dependency "fakeweb"
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yandex_captcha
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3.4
4
+ version: 0.4.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Merkulov
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '3.0'
48
+ version: '5.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '3.0'
55
+ version: '5.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: minitest-spec-context
58
58
  requirement: !ruby/object:Gem::Requirement