legitbot 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b14d74ce5edae0b0422d2c094d6ad2a90fc27b82437985dea65f627800db95aa
4
- data.tar.gz: b1834d8450279a73203adf3af6876bda25fc61c2c4f82fc0a9de766918002573
3
+ metadata.gz: ae1f2268a473ad5c04afb57f84e947bface5de9fc0b126639ecd9d492f1fefa0
4
+ data.tar.gz: 315a78cf41895bf503de265c77774152d944832959d22c9759576080b5d8d390
5
5
  SHA512:
6
- metadata.gz: f7b7ca927a817ed0360751954245b3a85f5f2cc00affcf55a1da459ee719d82f910239f37ac0ccfabe7e44d477c340edbf5a6bcba1c01edde4c3e0f17f35345c
7
- data.tar.gz: 8d87d281b096eeb42675f92080fc3fefbf6c3c8fc980b7f62cb3ae3fad856310a1fde519efd6cb7420644e4408006e4831f8142131b277de548f4de2590d76df
6
+ metadata.gz: 5caded01279b6e06f3979ea29722b55981d54b69e692a4da27e1f818704dc8c6c486353dfff8723c5afdad241950072047a4ffaf4105f17eb38f32e44fa95836
7
+ data.tar.gz: 2d9f49178129bf04ee6112d6f3f8eca8ca2fb2878daecb26a76b38ea28de63befca2744ecc5087b2a37b09e184621cde8a0016a6513be5556df7fc7e907cb3ad
data/.travis.yml CHANGED
@@ -4,6 +4,9 @@ cache: bundler
4
4
  rvm:
5
5
  - 2.5
6
6
  - 2.3
7
- - jruby
7
+ - jruby-head
8
8
  jdk:
9
9
  - openjdk8
10
+ before_install:
11
+ - gem update --system
12
+ - gem install bundler
data/legitbot.gemspec CHANGED
@@ -10,13 +10,13 @@ Gem::Specification.new do |spec|
10
10
  spec.author = "Alexander Azarov"
11
11
  spec.email = "self@alaz.me"
12
12
  spec.homepage = "https://github.com/alaz/legitbot"
13
- spec.summary = %q{Validate Web request was made by legitimate search engine}
13
+ spec.summary = %q{Validate requests from Web crawlers: impersonating or not?}
14
14
  spec.description = "A library to make sure a Web request has been "\
15
- "made by a real search engine, not a fake"
15
+ "made by a real search engine, not a malicious agent"
16
16
 
17
17
  spec.required_ruby_version = '>= 2.3.0'
18
18
  spec.add_dependency "irrc", ">= 0.2.1"
19
- spec.add_dependency "segment_tree"
19
+ spec.add_dependency "augmented_interval_tree", ">= 0.1.1"
20
20
  spec.add_development_dependency "rake"
21
21
  spec.add_development_dependency "minitest"
22
22
 
@@ -1,6 +1,6 @@
1
1
  require 'ipaddr'
2
2
  require 'irrc'
3
- require 'segment_tree'
3
+ require 'interval_tree'
4
4
 
5
5
  module Legitbot
6
6
  # https://developers.facebook.com/docs/sharing/webmasters/crawler
@@ -10,7 +10,7 @@ module Legitbot
10
10
 
11
11
  def valid?
12
12
  ip = IPAddr.new(@ip)
13
- Facebook.valid_ips[ip.ipv4? ? :ipv4 : :ipv6].find(ip)
13
+ Facebook.valid_ips[ip.ipv4? ? :ipv4 : :ipv6].search(ip.to_i).size > 0
14
14
  end
15
15
 
16
16
  @mutex = Mutex.new
@@ -24,15 +24,24 @@ module Legitbot
24
24
  end
25
25
 
26
26
  def self.load_ips
27
+ whois.map do |(family, records)|
28
+ ranges = records.map do |cidr|
29
+ range = IPAddr.new(cidr).to_range
30
+ (range.begin.to_i..range.end.to_i)
31
+ end
32
+ [family, IntervalTree::Tree.new(ranges)]
33
+ end.to_h
34
+ end
35
+
36
+ def self.whois
27
37
  client = Irrc::Client.new
28
38
  client.query :radb, AS
29
39
  results = client.perform
30
40
 
31
- Hash[%i(ipv4 ipv6).map { |k|
32
- [k, SegmentTree.new(results[AS][k][AS].map { |cidr|
33
- [IPAddr.new(cidr).to_range, true]
34
- })]
35
- }]
41
+ %i(ipv4 ipv6).map do |family|
42
+ [family, results[AS][family][AS]]
43
+ end.to_h
44
+ # { ipv4: results[AS][:ipv4][AS], ipv6: results[AS][:ipv6][AS] }
36
45
  end
37
46
  end
38
47
 
@@ -1,3 +1,3 @@
1
1
  module Legitbot
2
- VERSION = '0.2.6'
2
+ VERSION = '0.2.7'
3
3
  end
@@ -1,11 +1,26 @@
1
1
  require 'minitest/autorun'
2
2
  require 'legitbot'
3
3
 
4
+ module Legitbot
5
+ class Facebook
6
+ def self.whois
7
+ {
8
+ ipv4: ["69.63.176.0/20", "66.220.144.0/20", "66.220.144.0/21", "69.63.184.0/21", "69.63.176.0/21", "74.119.76.0/22", "69.171.255.0/24", "173.252.64.0/18", "69.171.224.0/19", "69.171.224.0/20", "103.4.96.0/22", "69.63.176.0/24", "173.252.64.0/19", "173.252.70.0/24", "31.13.64.0/18", "31.13.24.0/21", "66.220.152.0/21", "66.220.159.0/24", "69.171.239.0/24", "69.171.240.0/20", "31.13.64.0/19", "31.13.64.0/24", "31.13.65.0/24", "31.13.67.0/24", "31.13.68.0/24", "31.13.69.0/24", "31.13.70.0/24", "31.13.71.0/24", "31.13.72.0/24", "31.13.73.0/24", "31.13.74.0/24", "31.13.75.0/24", "31.13.76.0/24", "31.13.77.0/24", "31.13.96.0/19", "31.13.66.0/24", "173.252.96.0/19", "69.63.178.0/24", "31.13.78.0/24", "31.13.79.0/24", "31.13.80.0/24", "31.13.82.0/24", "31.13.83.0/24", "31.13.84.0/24", "31.13.85.0/24", "31.13.86.0/24", "31.13.87.0/24", "31.13.88.0/24", "31.13.89.0/24", "31.13.90.0/24", "31.13.91.0/24", "31.13.92.0/24", "31.13.93.0/24", "31.13.94.0/24", "31.13.95.0/24", "69.171.253.0/24", "69.63.186.0/24", "31.13.81.0/24", "179.60.192.0/22", "179.60.192.0/24", "179.60.193.0/24", "179.60.194.0/24", "179.60.195.0/24", "185.60.216.0/22", "45.64.40.0/22", "185.60.216.0/24", "185.60.217.0/24", "185.60.218.0/24", "185.60.219.0/24", "129.134.0.0/16", "157.240.0.0/16", "157.240.8.0/24", "157.240.0.0/24", "157.240.1.0/24", "157.240.2.0/24", "157.240.3.0/24", "157.240.4.0/24", "157.240.5.0/24", "157.240.6.0/24", "157.240.7.0/24", "157.240.9.0/24", "157.240.10.0/24", "157.240.16.0/24", "157.240.19.0/24", "157.240.11.0/24", "157.240.12.0/24", "157.240.13.0/24", "157.240.14.0/24", "157.240.15.0/24", "157.240.17.0/24", "157.240.18.0/24", "157.240.20.0/24", "157.240.21.0/24", "157.240.22.0/24", "157.240.23.0/24", "157.240.0.0/17", "69.171.250.0/24", "157.240.24.0/24", "157.240.25.0/24", "199.201.64.0/24", "199.201.65.0/24", "199.201.64.0/22", "204.15.20.0/22", "157.240.192.0/24", "129.134.0.0/17", "157.240.198.0/24"],
9
+ ipv6: []
10
+ }
11
+ end
12
+ end
13
+ end
14
+
4
15
  class FacebookTest < Minitest::Test
5
16
  def test_valid_ip
6
17
  ip = "69.63.186.89"
7
18
  match = Legitbot::Facebook.new(ip)
8
19
  assert match.valid?, msg: "#{ip} is a valid Facebook IP"
20
+
21
+ ip = '69.171.251.1'
22
+ match = Legitbot::Facebook.new(ip)
23
+ assert match.valid?, msg: "#{ip} is a valid Facebook IP"
9
24
  end
10
25
 
11
26
  def test_invalid_ip
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legitbot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Azarov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-14 00:00:00.000000000 Z
11
+ date: 2019-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: irrc
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.2.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: segment_tree
28
+ name: augmented_interval_tree
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 0.1.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 0.1.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  description: A library to make sure a Web request has been made by a real search engine,
70
- not a fake
70
+ not a malicious agent
71
71
  email: self@alaz.me
72
72
  executables: []
73
73
  extensions: []
@@ -123,7 +123,7 @@ rubyforge_project:
123
123
  rubygems_version: 2.7.6.2
124
124
  signing_key:
125
125
  specification_version: 4
126
- summary: Validate Web request was made by legitimate search engine
126
+ summary: 'Validate requests from Web crawlers: impersonating or not?'
127
127
  test_files:
128
128
  - test/legitbot_test.rb
129
129
  - test/pinterest_test.rb