ss2 0.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 31cbaa4795a63248ad3387dec031471ed1a78b88
4
+ data.tar.gz: 77728dccb2ceaaab6153ff33335c06cc1e4895c4
5
+ SHA512:
6
+ metadata.gz: a478350d3b004bcf05b66b82a383bdae597b27db485a79cc4481195c6960054e421045430ab0fa78640bb8ce04afa756eb14ad0fb65153fccfdf9e165a433e01
7
+ data.tar.gz: ab2086624dab8e9ff0ab6852a0fb3476857eb2a2947582131eb2f1a215ce713ddf4ba3a14432aed66faa3359759e692079b9e0f45bc468b9e3dbd9007978ae8a
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in shield_square.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Saravanaselvan
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # ShieldSquare
2
+
3
+ Rails connector to access shield square bot detection API
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'ss2', :git => "https://github.com/kvsrikanth/shield_square"
11
+ ```
12
+ Run the bundle command to install the gem.
13
+
14
+ After you install the gem, run the generator:
15
+
16
+ ```
17
+ rails generate ss2:install
18
+ ```
19
+
20
+ The generator will install an initializer ss2_config.rb with default configuration to access shield square API. Update the configuration file with your subscriber id, server etc.
21
+
22
+ Update your view file with the code to access shield shquare API and JS snippet
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,16 @@
1
+ module Ss2
2
+ class GetDataController < ApplicationController
3
+ skip_before_filter :authenticate_user!
4
+
5
+ def create
6
+ if params['jsonString'] != ""
7
+ error_code = Ss2.send_js_request request, params
8
+ end
9
+ respond_to do |format|
10
+ format.json {
11
+ render :json => { error_code: error_code}
12
+ }
13
+ end
14
+ end
15
+ end
16
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ resource :get_data, :module => "ss2", :path => "getData"
3
+ end
@@ -0,0 +1,13 @@
1
+ require 'rails'
2
+
3
+ module Ss2
4
+ class InstallGenerator < Rails::Generators::Base
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ desc "Creates ss2_config initializer"
8
+
9
+ def copy_initializer
10
+ template '../templates/ss2_config.rb', 'config/initializers/ss2_config.rb'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ Ss2.setup do |config|
2
+ # Set the ShieldSquare domain based on your Server Locations
3
+
4
+ #Asia/India - ss_sa.shieldsquare.net
5
+ #North America - ss_scus.shieldsquare.net
6
+ #Europe - ss_ew.shieldsquare.net
7
+ #Australia - ss_au.shieldsquare.net
8
+ config.ss2_domain = '130.211.186.67'
9
+
10
+ #Enter your SID
11
+ config.sid = "77a4362b-d035-4d7b-afb3-6050be9e0738"
12
+
13
+ #Please specify the mode in which you want to operate
14
+ #mode = 'Active'
15
+ #mode = 'Monitor'
16
+ config.mode = 'Monitor'
17
+
18
+ #Asynchronous HTTP Data Post
19
+ #Setting this value to true will reduce the page load time when you are in Monitor mode.
20
+ #Note: Enable this only if you are hosting your applications on Linux environments.
21
+ config.async_http_post = true
22
+
23
+ #* Timeout in Seconds or Milliseconds
24
+ config.timeout_value = 500
25
+
26
+ #* Enter the URL fo the JavaScript Data Collector
27
+ config.js_url = '/getData'
28
+ end
data/lib/ss2/engine.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Ss2
2
+ class Engine < Rails::Engine; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Ss2
2
+ VERSION = "0.0.2"
3
+ end
data/lib/ss2.rb ADDED
@@ -0,0 +1,263 @@
1
+ require "ss2/version"
2
+ require 'ss2/engine'
3
+ require 'cgi'
4
+ require 'httparty'
5
+ require 'addressable/uri'
6
+
7
+ module Ss2
8
+ class URI::Parser
9
+ def split url
10
+ a = Addressable::URI::parse url
11
+ [a.scheme, a.userinfo, a.host, a.port, nil, a.path, nil, a.query, a.fragment]
12
+ end
13
+ end
14
+
15
+ mattr_accessor :ss2_domain
16
+ mattr_accessor :sid
17
+ mattr_accessor :mode
18
+ mattr_accessor :async_http_post
19
+ mattr_accessor :timeout_value
20
+ mattr_accessor :js_url
21
+
22
+ def self.setup
23
+ yield self
24
+ end
25
+ #Request Variables
26
+ $ShieldsquareRequest_zpsbd0 = false
27
+ $ShieldsquareRequest_zpsbd1 = ""
28
+ $ShieldsquareRequest_zpsbd2 = ""
29
+ $ShieldsquareRequest_zpsbd3 = ""
30
+ $ShieldsquareRequest_zpsbd4 = ""
31
+ $ShieldsquareRequest_zpsbd5 = ""
32
+ $ShieldsquareRequest_zpsbd6 = ""
33
+ $ShieldsquareRequest_zpsbd7 = ""
34
+ $ShieldsquareRequest_zpsbd8 = ""
35
+ $ShieldsquareRequest_zpsbd9 = ""
36
+ $ShieldsquareRequest_zpsbda = ""
37
+ $ShieldsquareRequest__uzma = ""
38
+ $ShieldsquareRequest__uzmb = 0
39
+ $ShieldsquareRequest__uzmc = ""
40
+ $ShieldsquareRequest__uzmd = 0
41
+
42
+ #Curl Response Variables
43
+ $ShieldsquareCurlResponseCode_error_string = ""
44
+ $ShieldsquareCurlResponseCode_responsecode = 0
45
+
46
+ #Response Variables
47
+ $ShieldsquareResponse_pid = ""
48
+ $ShieldsquareResponse_responsecode= 0
49
+ $ShieldsquareResponse_url = ""
50
+ $ShieldsquareResponse_reason =""
51
+
52
+ #Codes Variables
53
+ $ShieldsquareCodes_ALLOW = 0
54
+ $ShieldsquareCodes_MONITOR = 1
55
+ $ShieldsquareCodes_CAPTCHA = 2
56
+ $ShieldsquareCodes_BLOCK = 3
57
+ $ShieldsquareCodes_FFD = 4
58
+ $ShieldsquareCodes_ALLOW_EXP = -1
59
+
60
+ $IP_ADDRESS = ""
61
+
62
+ def self.shieldsquare_ValidateRequest( shieldsquare_username, shieldsquare_calltype, shieldsquare_pid, request, cookies )
63
+ shieldsquare_low = 10000
64
+ shieldsquare_high = 99999
65
+ shieldsquare_a = 1
66
+ shieldsquare_b = 3
67
+ shieldsquare_c = 7
68
+ shieldsquare_d = 1
69
+ shieldsquare_e = 5
70
+ shieldsquare_f = 10
71
+ shieldsquare_service_url = "http://" + @@ss2_domain + "/getRequestData"
72
+ $IP_ADDRESS = request.remote_ip
73
+
74
+ if @@timeout_value > 1000
75
+ puts "Content-type: text/html"
76
+ puts ''
77
+ puts 'ShieldSquare Timeout cant be greater then 1000 Milli seconds'
78
+ exit
79
+ end
80
+
81
+ if shieldsquare_calltype == 1
82
+ shieldsquare_pid = shieldsquare_generate_pid @@sid
83
+ else
84
+
85
+ if shieldsquare_pid.length == 0
86
+ puts "Content-type: text/html"
87
+ puts ''
88
+ puts 'PID Cant be null'
89
+ exit
90
+ end
91
+ end
92
+
93
+ if cookies['__uzma']!="" and (cookies['__uzma'].to_s).length > 3
94
+ shieldsquare_lastaccesstime = cookies['__uzmd']
95
+ shieldsquare_uzmc=0
96
+ shieldsquare_uzmc= cookies['__uzmc']
97
+ shieldsquare_uzmc=shieldsquare_uzmc[shieldsquare_e..shieldsquare_e+1]
98
+ shieldsquare_a = ((shieldsquare_uzmc.to_i-shieldsquare_c)/shieldsquare_b) + shieldsquare_d
99
+ shieldsquare_uzmc= rand(shieldsquare_low..shieldsquare_high).to_s + (shieldsquare_c+shieldsquare_a*shieldsquare_b).to_s + rand(shieldsquare_low..shieldsquare_high).to_s
100
+ cookies[:__uzmc] = { :value => shieldsquare_uzmc, :expires => Time.now + 3600*24*365*10}
101
+ cookies[:__uzmd] = { :value => Time.now.to_i.to_s, :expires => Time.now + 3600*24*365*10}
102
+ $ShieldsquareRequest__uzma = cookies["__uzma"]
103
+ $ShieldsquareRequest__uzmb = cookies["__uzmb"]
104
+ $ShieldsquareRequest__uzmc = shieldsquare_uzmc
105
+ $ShieldsquareRequest__uzmd = shieldsquare_lastaccesstime
106
+
107
+ else
108
+
109
+ id = DateTime.now.strftime('%Q')# Get current date to the milliseconds
110
+ # Reverse it
111
+ shieldsquare_uzma = id.to_i(36).to_s
112
+ shieldsquare_lastaccesstime = Time.now.to_i
113
+ shieldsquare_uzmc= rand(shieldsquare_low..shieldsquare_high).to_s + (shieldsquare_c+shieldsquare_a*shieldsquare_b).to_s + rand(shieldsquare_low..shieldsquare_high).to_s
114
+ cookies[:__uzma] = { :value => shieldsquare_uzma, :expires => Time.now + 3600*24*365*10}
115
+ cookies[:__uzmb] = { :value => Time.now.to_i.to_s, :expires => Time.now + 3600*24*365*10}
116
+ cookies[:__uzmc] = { :value => shieldsquare_uzmc, :expires => Time.now + 3600*24*365*10}
117
+ cookies[:__uzmd] = { :value => Time.now.to_i.to_s, :expires => Time.now + 3600*24*365*10}
118
+ $ShieldsquareRequest__uzma = shieldsquare_uzma
119
+ $ShieldsquareRequest__uzmb = Time.now.to_i
120
+ $ShieldsquareRequest__uzmc = shieldsquare_uzmc
121
+ $ShieldsquareRequest__uzmd = shieldsquare_lastaccesstime
122
+ end
123
+ if @@mode == 'Active'
124
+ $ShieldsquareRequest_zpsbd0 = true;
125
+ else
126
+ $ShieldsquareRequest_zpsbd0 = false;
127
+ end
128
+ $ShieldsquareRequest_zpsbd1 = @@sid
129
+ $ShieldsquareRequest_zpsbd2 = shieldsquare_pid
130
+ $ShieldsquareRequest_zpsbd3 = request.headers['HTTP_REFERER']
131
+ $ShieldsquareRequest_zpsbd4 = request.headers['REQUEST_URI']
132
+ $ShieldsquareRequest_zpsbd5 = request.session_options[:id]
133
+ $ShieldsquareRequest_zpsbd6 = $IP_ADDRESS
134
+ $ShieldsquareRequest_zpsbd7 = request.headers['HTTP_USER_AGENT']
135
+ $ShieldsquareRequest_zpsbd8 = shieldsquare_calltype
136
+ $ShieldsquareRequest_zpsbd9 = shieldsquare_username
137
+ $ShieldsquareRequest_zpsbda = Time.now.to_i
138
+ my_hash = {:_zpsbd0 => $ShieldsquareRequest_zpsbd0,:_zpsbd1 => $ShieldsquareRequest_zpsbd1,:_zpsbd2 => $ShieldsquareRequest_zpsbd2,:_zpsbd3 => $ShieldsquareRequest_zpsbd3,:_zpsbd4 => $ShieldsquareRequest_zpsbd4,:_zpsbd5 => $ShieldsquareRequest_zpsbd5,:_zpsbd6 => $ShieldsquareRequest_zpsbd6,:_zpsbd7 => $ShieldsquareRequest_zpsbd7,:_zpsbd8 => $ShieldsquareRequest_zpsbd8,:_zpsbd9 => $ShieldsquareRequest_zpsbd9,:_zpsbda => $ShieldsquareRequest_zpsbda,:__uzma => $ShieldsquareRequest__uzma,:__uzmb => $ShieldsquareRequest__uzmb,:__uzmc => $ShieldsquareRequest__uzmc,:__uzmd => $ShieldsquareRequest__uzmd }
139
+
140
+ shieldsquare_json_obj = JSON.generate(my_hash)
141
+ $ShieldsquareResponse_pid = shieldsquare_pid
142
+ $ShieldsquareResponse_url = @@js_url
143
+
144
+ if @@mode == 'Active'
145
+ shieldsquareCurlResponseCode=shieldsquare_post_sync shieldsquare_service_url, shieldsquare_json_obj,@@timeout_value
146
+ if shieldsquareCurlResponseCode['response'] != 200
147
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_ALLOW_EXP
148
+ $ShieldsquareResponse_reason = shieldsquareCurlResponseCode['output']
149
+ else
150
+ shieldsquareResponse_from_ss = JSON.parse(shieldsquareCurlResponseCode['output'])
151
+ $ShieldsquareResponse_dynamic_JS = shieldsquareResponse_from_ss['dynamic_JS']
152
+ n=shieldsquareResponse_from_ss['ssresp'].to_i
153
+ if n==0
154
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_ALLOW
155
+ elsif n==1
156
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_MONITOR
157
+ elsif n==2
158
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_CAPTCHA
159
+ elsif n==3
160
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_BLOCK
161
+ elsif n==4
162
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_FFD
163
+ else
164
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_ALLOW_EXP
165
+ $ShieldsquareResponse_reason = shieldsquareCurlResponseCode['output']
166
+ end
167
+ end
168
+
169
+ else
170
+
171
+ if @@async_http_post == true
172
+ asyncresponse=shieldsquare_post_async shieldsquare_service_url, shieldsquare_json_obj,@@timeout_value.to_s
173
+ if asyncresponse['response'] == false
174
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_ALLOW_EXP
175
+ $ShieldsquareResponse_reason = "Request Timed Out/Server Not Reachable"
176
+ else
177
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_ALLOW
178
+ end
179
+ else
180
+ syncresponse=shieldsquare_post_sync shieldsquare_service_url, shieldsquare_json_obj,@@timeout_value
181
+ if syncresponse['response'] != 200
182
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_ALLOW_EXP
183
+ $ShieldsquareResponse_reason = syncresponse['output']
184
+ else
185
+ $ShieldsquareResponse_responsecode = $ShieldsquareCodes_ALLOW
186
+ end
187
+ end
188
+ $ShieldsquareResponse_dynamic_JS = "var __uzdbm_c = 2+2"
189
+ end
190
+
191
+ shieldsquareResponse = Hash["pid" => $ShieldsquareResponse_pid, "responsecode" => $ShieldsquareResponse_responsecode,"url" => $ShieldsquareResponse_url,"reason" => $ShieldsquareResponse_reason,"dynamic_JS" =>$ShieldsquareResponse_dynamic_JS]
192
+ return shieldsquareResponse
193
+ end
194
+
195
+ def self.shieldsquare_post_async(url, payload, timeout)
196
+
197
+ cmd = 'curl -X POST -H "Accept: Application/json" -H "Content-Type: application/json" -m '+ timeout + ' ' + url + " -d '"+ CGI::escape(payload) + "'"
198
+ output=`#{cmd}`
199
+
200
+ result = $?.success?
201
+ response=Hash["response"=>result,"output"=>output]
202
+ return response
203
+ end
204
+
205
+ def self.shieldsquare_post_sync(url, payload, timeout)
206
+ # Sendind the Data to the ShieldSquare Server
207
+ params=payload
208
+ headers={}
209
+ headers['Content-Type']='application/json'
210
+ headers['Accept']='application/json'
211
+ begin
212
+ response = HTTParty.post(url, :query => params,:headers => headers, :timeout => timeout)
213
+ rescue Exception => e
214
+ response=Hash["response"=>0,"output"=>"Request Timed Out/Server Not Reachable"]
215
+ end
216
+ return response
217
+ end
218
+
219
+ def self.microtime()
220
+ epoch_mirco = Time.now.to_f
221
+ epoch_full = Time.now.to_i
222
+ epoch_fraction = epoch_mirco - epoch_full
223
+ return epoch_fraction.to_s + ' ' + epoch_full.to_s
224
+ end
225
+
226
+ def self.shieldsquare_generate_pid(shieldsquare_sid)
227
+ t=microtime
228
+ dt=t.split(" ")
229
+ p = @@sid.split("-")
230
+ sid_min = p[3].to_i(16)
231
+ rmstr1=("00000000"+(dt[1].to_i).to_s(16)).split(//).last(4).join("").to_s
232
+ rmstr2=("0000" + ((dt[0].to_f * 65536).round).to_s(16)).split(//).last(4).join("").to_s
233
+ return sprintf('%08s-%04x-%04s-%04s-%04x%04x%04x', shieldsquare_IP2Hex(),sid_min,rmstr1,rmstr2,(rand() * 0xffff).to_i,(rand() * 0xffff).to_i,(rand() * 0xffff).to_i)
234
+ end
235
+
236
+ def self.shieldsquare_IP2Hex()
237
+ hexx=""
238
+ ip=$IP_ADDRESS
239
+ part=ip.split('.')
240
+ hexx=''
241
+ for i in 0..part.count-1
242
+ hexx= hexx + ("0"+(part[i].to_i).to_s(16)).split(//).last(2).join("").to_s
243
+ end
244
+ return hexx
245
+ end
246
+
247
+ def self.send_js_request(request, params)
248
+ data = params['jsonString']
249
+ url = 'http://' + @@ss2_domain + '/getss2data'
250
+ data.delete! '\\'
251
+ data.delete! '['
252
+ data.delete! ']'
253
+ shieldsquare_request = JSON.parse(data)
254
+ shieldsquare_request["sid"] = @@sid
255
+ shieldsquare_request["host"] = request.remote_ip
256
+ shieldsquare_post_data = JSON.generate(shieldsquare_request)
257
+ if @@async_http_post == true
258
+ shieldsquare_post_async url, shieldsquare_post_data, @@timeout_value.to_s
259
+ else
260
+ shieldsquare_post_sync url, shieldsquare_post_data, @@timeout_value
261
+ end
262
+ end
263
+ end
data/ss2.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ss2/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ss2"
8
+ spec.version = Ss2::VERSION
9
+ spec.authors = ["Saravanaselvan"]
10
+ spec.email = ["spsaravanaselvan@gmail.com"]
11
+ spec.summary = %q{Connect with shield square bot detection API}
12
+ spec.description = %q{Connect with shield square bot detection API}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "addressable"
22
+ spec.add_dependency "httparty"
23
+ spec.add_development_dependency "bundler", "~> 1.7"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ end
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ss2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Saravanaselvan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httparty
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ description: Connect with shield square bot detection API
70
+ email:
71
+ - spsaravanaselvan@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - app/controllers/ss2/get_data_controller.rb
82
+ - config/routes.rb
83
+ - lib/generators/ss2/install_generator.rb
84
+ - lib/generators/ss2/templates/ss2_config.rb
85
+ - lib/ss2.rb
86
+ - lib/ss2/engine.rb
87
+ - lib/ss2/version.rb
88
+ - ss2.gemspec
89
+ homepage: ''
90
+ licenses:
91
+ - MIT
92
+ metadata: {}
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project:
109
+ rubygems_version: 2.2.2
110
+ signing_key:
111
+ specification_version: 4
112
+ summary: Connect with shield square bot detection API
113
+ test_files: []