dark_domains 0.0.1
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/History.txt +4 -0
- data/Manifest.txt +13 -0
- data/PostInstall.txt +5 -0
- data/README.rdoc +54 -0
- data/Rakefile +34 -0
- data/lib/dark_domains.rb +9 -0
- data/lib/dark_domains/data/blacklist.txt +3426 -0
- data/lib/dark_domains/models/domain.rb +83 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/domain_spec.rb +79 -0
- data/spec/spec_helper.rb +5 -0
- metadata +81 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require "rubygems"
|
|
2
|
+
require "ruby-debug"
|
|
3
|
+
require "uri"
|
|
4
|
+
|
|
5
|
+
class Domain
|
|
6
|
+
|
|
7
|
+
DOMAIN_URI = /^\w[\w\.\-\_]+\.[\w\.]{2,7}$/i.freeze
|
|
8
|
+
|
|
9
|
+
# Keep it simple
|
|
10
|
+
attr_accessor :domain
|
|
11
|
+
|
|
12
|
+
# Class methods
|
|
13
|
+
#===========================================================================
|
|
14
|
+
|
|
15
|
+
# Return all of the banned domains
|
|
16
|
+
def self.banned_domains
|
|
17
|
+
@@banned_domains ||= {}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Return true if this is a known spam domain, false otherwise
|
|
21
|
+
def self.banned?(suspect_domain)
|
|
22
|
+
banned_domains[normalized_domain(suspect_domain)].eql?(true)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Ban a domain
|
|
26
|
+
def self.ban!(domain)
|
|
27
|
+
banned_domains[normalized_domain(domain)] = true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Return a normalized URL
|
|
31
|
+
def self.normalized_domain(domain)
|
|
32
|
+
# Strip www subdomains, but leave others
|
|
33
|
+
domain = domain.gsub(/www\./, '')
|
|
34
|
+
# Support protocols/ports/etc
|
|
35
|
+
domain =~ DOMAIN_URI ? domain : URI.parse(domain).host
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Instance
|
|
39
|
+
#===========================================================================
|
|
40
|
+
|
|
41
|
+
# Create a domain instance
|
|
42
|
+
def initialize(domain)
|
|
43
|
+
self.domain = domain
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Return true if we are a banned domain
|
|
47
|
+
def banned?
|
|
48
|
+
Domain.banned?(domain)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Ban this specific domain instance
|
|
52
|
+
def ban!
|
|
53
|
+
Domain.ban!(domain)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Blacklists
|
|
57
|
+
#===========================================================================
|
|
58
|
+
|
|
59
|
+
# Load existing known bad spammer domains, returns number of domains loaded
|
|
60
|
+
# @todo make this pull from a dynamic source on the net
|
|
61
|
+
def self.load_blacklist(absolute_path = nil)
|
|
62
|
+
absolute_path = default_blacklist_path if !absolute_path
|
|
63
|
+
|
|
64
|
+
raise "unable to find blacklist data file: #{ absolute_path }" \
|
|
65
|
+
unless File.exists?(absolute_path)
|
|
66
|
+
|
|
67
|
+
# keep for the total we'll return
|
|
68
|
+
existing_size = banned_domains.size
|
|
69
|
+
|
|
70
|
+
# Grab the domains, squash the newlines, ignore comments and blank lines
|
|
71
|
+
File.readlines(absolute_path).each{ |d| Domain.ban!(d.chomp) unless d =~ /(^\#|^\s+$)/ }
|
|
72
|
+
|
|
73
|
+
puts "loaded #{ banned_domains.size } banned domains." if $DEBUG
|
|
74
|
+
|
|
75
|
+
return banned_domains.size - existing_size
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Path to the default blacklist
|
|
79
|
+
def self.default_blacklist_path
|
|
80
|
+
File.expand_path(File.join(__FILE__, "..", "..", "data", "blacklist.txt"))
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
data/script/console
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# File: script/console
|
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
|
4
|
+
|
|
5
|
+
libs = " -r irb/completion"
|
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/dark_domains.rb'}"
|
|
9
|
+
puts "Loading dark_domains gem"
|
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'rubigen'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'rubigen'
|
|
9
|
+
end
|
|
10
|
+
require 'rubigen/scripts/destroy'
|
|
11
|
+
|
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'rubigen'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'rubigen'
|
|
9
|
+
end
|
|
10
|
+
require 'rubigen/scripts/generate'
|
|
11
|
+
|
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/spec/domain_spec.rb
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Domain do
|
|
4
|
+
|
|
5
|
+
context "(class)" do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@valid_domain = "socialface.com"
|
|
9
|
+
@banned_domain = "myspace.com"
|
|
10
|
+
|
|
11
|
+
Domain.ban!(@banned_domain)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should have a #banned_domains method" do
|
|
15
|
+
Domain.should respond_to(:banned_domains)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should have a #ban! method" do
|
|
19
|
+
Domain.should respond_to(:ban!)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should have a #banned? method" do
|
|
23
|
+
Domain.should respond_to(:banned?)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should return false for valid or unknown domains" do
|
|
27
|
+
Domain.banned?(@valid_domain).should be_false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should return true for known spam domains" do
|
|
31
|
+
Domain.banned?(@banned_domain).should be_true
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should ignore protocol information from domains" do
|
|
35
|
+
Domain.banned?("http://#{ @banned_domain }").should be_true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should ignore www subdomain prefixes" do
|
|
39
|
+
Domain.banned?("www.#{ @banned_domain }").should be_true
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context "(blacklists)" do
|
|
45
|
+
|
|
46
|
+
it "should load an existing default blacklist" do
|
|
47
|
+
lambda do
|
|
48
|
+
begin
|
|
49
|
+
Domain.load_blacklist
|
|
50
|
+
end
|
|
51
|
+
end.should change(Domain.banned_domains, :size)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should have the path to a default blacklist" do
|
|
55
|
+
File.exists?(Domain::default_blacklist_path).should be_true
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context "(instance)" do
|
|
61
|
+
|
|
62
|
+
before do
|
|
63
|
+
@valid_domain = Domain.new("socialface.com")
|
|
64
|
+
@banned_domain = Domain.new("myspace.com")
|
|
65
|
+
|
|
66
|
+
@banned_domain.ban!
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should return false if not banned" do
|
|
70
|
+
@valid_domain.banned?.should be_false
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "should return false if not banned" do
|
|
74
|
+
@banned_domain.banned?.should be_true
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dark_domains
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Often Void, Inc.
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
|
|
12
|
+
date: 2009-12-29 00:00:00 -06:00
|
|
13
|
+
default_executable:
|
|
14
|
+
dependencies:
|
|
15
|
+
- !ruby/object:Gem::Dependency
|
|
16
|
+
name: hoe
|
|
17
|
+
type: :development
|
|
18
|
+
version_requirement:
|
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
20
|
+
requirements:
|
|
21
|
+
- - ">="
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: 2.4.0
|
|
24
|
+
version:
|
|
25
|
+
description: A Ruby plugin to load and query banned domains.
|
|
26
|
+
email:
|
|
27
|
+
- admin@oftenvoid.com
|
|
28
|
+
executables: []
|
|
29
|
+
|
|
30
|
+
extensions: []
|
|
31
|
+
|
|
32
|
+
extra_rdoc_files:
|
|
33
|
+
- History.txt
|
|
34
|
+
- Manifest.txt
|
|
35
|
+
- PostInstall.txt
|
|
36
|
+
- lib/dark_domains/data/blacklist.txt
|
|
37
|
+
files:
|
|
38
|
+
- History.txt
|
|
39
|
+
- Manifest.txt
|
|
40
|
+
- PostInstall.txt
|
|
41
|
+
- README.rdoc
|
|
42
|
+
- Rakefile
|
|
43
|
+
- lib/dark_domains.rb
|
|
44
|
+
- lib/dark_domains/models/domain.rb
|
|
45
|
+
- script/console
|
|
46
|
+
- script/destroy
|
|
47
|
+
- script/generate
|
|
48
|
+
- spec/domain_spec.rb
|
|
49
|
+
- spec/spec_helper.rb
|
|
50
|
+
- lib/dark_domains/data/blacklist.txt
|
|
51
|
+
has_rdoc: true
|
|
52
|
+
homepage: http://github.com/oftenvoid/dark_domains
|
|
53
|
+
licenses: []
|
|
54
|
+
|
|
55
|
+
post_install_message: PostInstall.txt
|
|
56
|
+
rdoc_options:
|
|
57
|
+
- --main
|
|
58
|
+
- README.rdoc
|
|
59
|
+
require_paths:
|
|
60
|
+
- lib
|
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
|
+
requirements:
|
|
63
|
+
- - ">="
|
|
64
|
+
- !ruby/object:Gem::Version
|
|
65
|
+
version: "0"
|
|
66
|
+
version:
|
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
68
|
+
requirements:
|
|
69
|
+
- - ">="
|
|
70
|
+
- !ruby/object:Gem::Version
|
|
71
|
+
version: "0"
|
|
72
|
+
version:
|
|
73
|
+
requirements: []
|
|
74
|
+
|
|
75
|
+
rubyforge_project: dark_domains
|
|
76
|
+
rubygems_version: 1.3.5
|
|
77
|
+
signing_key:
|
|
78
|
+
specification_version: 3
|
|
79
|
+
summary: A Ruby plugin to load and query banned domains.
|
|
80
|
+
test_files: []
|
|
81
|
+
|