phishtank 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.rvmrc +48 -0
- data/.travis.yml +4 -0
- data/Gemfile +11 -0
- data/Guardfile +6 -0
- data/LICENSE +22 -0
- data/README.md +48 -0
- data/Rakefile +6 -0
- data/lib/phishtank.rb +39 -0
- data/lib/phishtank/configuration.rb +11 -0
- data/lib/phishtank/data.rb +37 -0
- data/lib/phishtank/request.rb +36 -0
- data/lib/phishtank/version.rb +3 -0
- data/phishtank.gemspec +23 -0
- data/spec/cassettes/no_update_needed.yml +58 -0
- data/spec/cassettes/update_needed.yml +58 -0
- data/spec/fixtures/online-valid.xml +109 -0
- data/spec/phishtank/configuration_spec.rb +11 -0
- data/spec/phishtank/data_spec.rb +50 -0
- data/spec/phishtank/request_spec.rb +50 -0
- data/spec/phishtank_spec.rb +28 -0
- data/spec/spec_helper.rb +21 -0
- metadata +147 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
|
+
# Only full ruby name is supported here, for short names use:
|
8
|
+
# echo "rvm use 1.9.3" > .rvmrc
|
9
|
+
environment_id="ruby-1.9.3-p125@phishtank"
|
10
|
+
|
11
|
+
# Uncomment the following lines if you want to verify rvm version per project
|
12
|
+
# rvmrc_rvm_version="1.10.3" # 1.10.1 seams as a safe start
|
13
|
+
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
|
14
|
+
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
|
15
|
+
# return 1
|
16
|
+
# }
|
17
|
+
|
18
|
+
# First we attempt to load the desired environment directly from the environment
|
19
|
+
# file. This is very fast and efficient compared to running through the entire
|
20
|
+
# CLI and selector. If you want feedback on which environment was used then
|
21
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
22
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
|
23
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
24
|
+
then
|
25
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
26
|
+
[[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
|
27
|
+
\. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
|
28
|
+
else
|
29
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
30
|
+
rvm --create "$environment_id" || {
|
31
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
32
|
+
return 1
|
33
|
+
}
|
34
|
+
fi
|
35
|
+
|
36
|
+
# If you use bundler, this might be useful to you:
|
37
|
+
if [[ -s Gemfile ]] && {
|
38
|
+
! builtin command -v bundle >/dev/null ||
|
39
|
+
builtin command -v bundle | grep $rvm_path/bin/bundle >/dev/null
|
40
|
+
}
|
41
|
+
then
|
42
|
+
printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
|
43
|
+
gem install bundler
|
44
|
+
fi
|
45
|
+
if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
|
46
|
+
then
|
47
|
+
bundle install | grep -vE '^Using|Your bundle is complete'
|
48
|
+
fi
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Ezekiel Templin
|
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,48 @@
|
|
1
|
+
# PhishTank
|
2
|
+
This is a Ruby interface to [OpenDNS's PhishTank developer API](http://www.phishtank.com/developer_info.php). The PhishTank dataset contains quite a bit of human-verified and classified phishing data, if you're into that sort of thing.
|
3
|
+
|
4
|
+
Tested against Ruby 1.9.2 and 1.9.3 w/ Travis-CI. Current Build Status: [![Build Status](https://secure.travis-ci.org/ezkl/phishtank.png?branch=master)](http://travis-ci.org/ezkl/phishtank)
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
From the Rubygems CLI:
|
8
|
+
|
9
|
+
`gem install phishtank`
|
10
|
+
|
11
|
+
or w/ Bundler, add the following to the Gemfile.
|
12
|
+
|
13
|
+
`gem 'phishtank'`
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
require 'phishtank'
|
18
|
+
PhishTank.configure do |c|
|
19
|
+
c.api_key = "YOUR_PHISHTANK_API_KEY" #required
|
20
|
+
c.temp_directory = "/path/to/temporary/directory" #optional - default: /tmp
|
21
|
+
c.etag = "ETag" #optional
|
22
|
+
end
|
23
|
+
|
24
|
+
PhishTank.update!
|
25
|
+
|
26
|
+
data = PhishTank::Data.new
|
27
|
+
|
28
|
+
data.entries.first
|
29
|
+
# => #<OpenStruct:0x1021026f8
|
30
|
+
# attr_reader :modifiable = true,
|
31
|
+
# attr_reader :table = {
|
32
|
+
# :url => "http://www.grovesgas.co.uk/TAMFidelidade/clientetam.htm",
|
33
|
+
# :phish_id => "1389753",
|
34
|
+
# :phish_detail_url => "http://www.phishtank.com/phish_detail.php?phish_id=1389753",
|
35
|
+
# :ip_address => "209.235.144.9",
|
36
|
+
# :submission_time => "2012-03-13T21:46:39+00:00",
|
37
|
+
# :verified => "yes",
|
38
|
+
# :verification_time => "2012-03-13T22:51:43+00:00",
|
39
|
+
# :online_status => "yes",
|
40
|
+
# :target => "TAM Fidelidade"
|
41
|
+
# }
|
42
|
+
#>
|
43
|
+
|
44
|
+
Read specs for more details.
|
45
|
+
|
46
|
+
## TODO
|
47
|
+
* Add interface for [checking URL's](http://www.phishtank.com/api_info.php)
|
48
|
+
* Add errors for service-specific rate limiting errors
|
data/Rakefile
ADDED
data/lib/phishtank.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require "phishtank/version"
|
2
|
+
require "phishtank/configuration"
|
3
|
+
require "phishtank/request"
|
4
|
+
require "phishtank/data"
|
5
|
+
|
6
|
+
module PhishTank
|
7
|
+
BASE_URI = "http://data.phishtank.com"
|
8
|
+
|
9
|
+
attr_accessor :configuration
|
10
|
+
|
11
|
+
def self.configure(&block)
|
12
|
+
yield configuration
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.configuration
|
16
|
+
@configuration ||= Configuration.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.update!
|
20
|
+
request = Request.new
|
21
|
+
request.get_update if request.update?
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.api_key
|
25
|
+
@configuration.api_key
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.api_key=(api_key)
|
29
|
+
@configuration = Configuration.new(api_key)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.temp_directory
|
33
|
+
@configuration.temp_directory
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.etag
|
37
|
+
@configuration.etag
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module PhishTank
|
5
|
+
class Data
|
6
|
+
attr_reader :file, :doc, :entries
|
7
|
+
|
8
|
+
def initialize(data_file_path = nil)
|
9
|
+
@file = data_file_path || "#{PhishTank.configuration.temp_directory}/online-valid.xml"
|
10
|
+
raise "Data File Not Found!" unless File.exists?(@file)
|
11
|
+
|
12
|
+
@doc = parse_data_file
|
13
|
+
@entries = []
|
14
|
+
process_data_file
|
15
|
+
end
|
16
|
+
|
17
|
+
def process_data_file
|
18
|
+
@doc.xpath("//entry").each do |entry_item|
|
19
|
+
entry = OpenStruct.new
|
20
|
+
entry.url = entry_item.at("url").text
|
21
|
+
entry.phish_id = entry_item.at("phish_id").text
|
22
|
+
entry.phish_detail_url = entry_item.at("phish_detail_url").text
|
23
|
+
entry.ip_address = entry_item.at("ip_address").text
|
24
|
+
entry.submission_time = entry_item.at("submission_time").text
|
25
|
+
entry.verified = entry_item.at("verified").text
|
26
|
+
entry.verification_time = entry_item.at("verification_time").text
|
27
|
+
entry.online_status = entry_item.at("online").text
|
28
|
+
entry.target = entry_item.at("target").text
|
29
|
+
@entries.push entry
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_data_file
|
34
|
+
Nokogiri::XML(File.read(@file))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'typhoeus'
|
2
|
+
|
3
|
+
module PhishTank
|
4
|
+
class Request
|
5
|
+
attr_accessor :etag
|
6
|
+
|
7
|
+
def initialize(etag = nil)
|
8
|
+
@etag = etag || PhishTank.configuration.etag
|
9
|
+
end
|
10
|
+
|
11
|
+
def update?
|
12
|
+
return true if @etag.nil?
|
13
|
+
response = head(update_uri, :headers => {"ETag" => @etag})
|
14
|
+
response.headers_hash['Etag'] != "\"#{@etag}\""
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_update
|
18
|
+
response = get(update_uri)
|
19
|
+
file = File.new("#{PhishTank.configuration.temp_directory}/online-valid.xml", 'w')
|
20
|
+
file.puts response.body
|
21
|
+
file.close
|
22
|
+
end
|
23
|
+
|
24
|
+
def update_uri
|
25
|
+
"#{BASE_URI}/data/#{PhishTank.configuration.api_key}/online-valid.xml"
|
26
|
+
end
|
27
|
+
|
28
|
+
def head(uri, opts = {})
|
29
|
+
Typhoeus::Request.head(uri, opts)
|
30
|
+
end
|
31
|
+
|
32
|
+
def get(uri, opts = {})
|
33
|
+
Typhoeus::Request.get(uri, opts)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/phishtank.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/phishtank/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Ezekiel Templin"]
|
6
|
+
gem.email = ["zeke@templ.in"]
|
7
|
+
gem.description = %q{Ruby interface to OpenDNS's PhishTank API}
|
8
|
+
gem.summary = %q{Provides a simple interface to work with OpenDNS's PhishTank developer API by handling caching and parsing of PhishTank data.}
|
9
|
+
gem.homepage = "https://github.com/ezkl/phishtank"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "phishtank"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = PhishTank::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency("typhoeus", "~> 0.3.3")
|
19
|
+
gem.add_dependency("nokogiri", "~> 1.5.2")
|
20
|
+
|
21
|
+
gem.add_development_dependency("rspec", "~> 2.8.0")
|
22
|
+
gem.add_development_dependency("vcr", "~> 2.0.0")
|
23
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: head
|
5
|
+
uri: http://data.phishtank.com/data/<API_KEY>/online-valid.xml
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
ETag:
|
11
|
+
- Tue, 14 Mar 2012 00:00:00
|
12
|
+
response:
|
13
|
+
status:
|
14
|
+
code: 200
|
15
|
+
message: !binary |-
|
16
|
+
T0s=
|
17
|
+
headers:
|
18
|
+
!binary "RGF0ZQ==":
|
19
|
+
- !binary |-
|
20
|
+
V2VkLCAxNCBNYXIgMjAxMiAwMDowNTozNCBHTVQ=
|
21
|
+
!binary "U2VydmVy":
|
22
|
+
- !binary |-
|
23
|
+
QXBhY2hlLzIuMi45IChEZWJpYW4pIFBIUC81LjIuNi0xK2xlbm55OSB3aXRo
|
24
|
+
IFN1aG9zaW4tUGF0Y2g=
|
25
|
+
!binary "WC1Qb3dlcmVkLUJ5":
|
26
|
+
- !binary |-
|
27
|
+
UEhQLzUuMi42LTErbGVubnk5
|
28
|
+
!binary "TGFzdC1Nb2RpZmllZA==":
|
29
|
+
- !binary |-
|
30
|
+
V2VkLCAxNCBNYXIgMjAxMiAwMDowMDowMCBHTVQ=
|
31
|
+
!binary "RXRhZw==":
|
32
|
+
- !binary |-
|
33
|
+
IldlZCwgMTQgTWFyIDIwMTIgMDA6MDA6MDAi
|
34
|
+
!binary "Q29udGVudC1EaXNwb3NpdGlvbg==":
|
35
|
+
- !binary |-
|
36
|
+
YXR0YWNobWVudDsgZmlsZW5hbWU9dmVyaWZpZWRfb25saW5lLnhtbA==
|
37
|
+
!binary "VmFyeQ==":
|
38
|
+
- !binary |-
|
39
|
+
QWNjZXB0LUVuY29kaW5n
|
40
|
+
!binary "Q29udGVudC1FbmNvZGluZw==":
|
41
|
+
- !binary |-
|
42
|
+
Z3ppcA==
|
43
|
+
!binary "Q29udGVudC1MZW5ndGg=":
|
44
|
+
- !binary |-
|
45
|
+
MjA=
|
46
|
+
!binary "Q29ubmVjdGlvbg==":
|
47
|
+
- !binary |-
|
48
|
+
Y2xvc2U=
|
49
|
+
!binary "Q29udGVudC1UeXBl":
|
50
|
+
- !binary |-
|
51
|
+
dGV4dC94bWw=
|
52
|
+
body:
|
53
|
+
encoding: ASCII-8BIT
|
54
|
+
string: !binary ""
|
55
|
+
http_version: !binary |-
|
56
|
+
MS4x
|
57
|
+
recorded_at: Wed, 14 Mar 2012 00:03:56 GMT
|
58
|
+
recorded_with: VCR 2.0.0
|
@@ -0,0 +1,58 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: head
|
5
|
+
uri: http://data.phishtank.com/data/<API_KEY>/online-valid.xml
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
ETag:
|
11
|
+
- Tue, 12 Mar 2012 22:00:00
|
12
|
+
response:
|
13
|
+
status:
|
14
|
+
code: 200
|
15
|
+
message: !binary |-
|
16
|
+
T0s=
|
17
|
+
headers:
|
18
|
+
!binary "RGF0ZQ==":
|
19
|
+
- !binary |-
|
20
|
+
V2VkLCAxNCBNYXIgMjAxMiAwMDowMjo1MSBHTVQ=
|
21
|
+
!binary "U2VydmVy":
|
22
|
+
- !binary |-
|
23
|
+
QXBhY2hlLzIuMi45IChEZWJpYW4pIFBIUC81LjIuNi0xK2xlbm55OSB3aXRo
|
24
|
+
IFN1aG9zaW4tUGF0Y2g=
|
25
|
+
!binary "WC1Qb3dlcmVkLUJ5":
|
26
|
+
- !binary |-
|
27
|
+
UEhQLzUuMi42LTErbGVubnk5
|
28
|
+
!binary "TGFzdC1Nb2RpZmllZA==":
|
29
|
+
- !binary |-
|
30
|
+
V2VkLCAxNCBNYXIgMjAxMiAwMDowMDowMCBHTVQ=
|
31
|
+
!binary "RXRhZw==":
|
32
|
+
- !binary |-
|
33
|
+
IldlZCwgMTQgTWFyIDIwMTIgMDA6MDA6MDAi
|
34
|
+
!binary "Q29udGVudC1EaXNwb3NpdGlvbg==":
|
35
|
+
- !binary |-
|
36
|
+
YXR0YWNobWVudDsgZmlsZW5hbWU9dmVyaWZpZWRfb25saW5lLnhtbA==
|
37
|
+
!binary "VmFyeQ==":
|
38
|
+
- !binary |-
|
39
|
+
QWNjZXB0LUVuY29kaW5n
|
40
|
+
!binary "Q29udGVudC1FbmNvZGluZw==":
|
41
|
+
- !binary |-
|
42
|
+
Z3ppcA==
|
43
|
+
!binary "Q29udGVudC1MZW5ndGg=":
|
44
|
+
- !binary |-
|
45
|
+
MjA=
|
46
|
+
!binary "Q29ubmVjdGlvbg==":
|
47
|
+
- !binary |-
|
48
|
+
Y2xvc2U=
|
49
|
+
!binary "Q29udGVudC1UeXBl":
|
50
|
+
- !binary |-
|
51
|
+
dGV4dC94bWw=
|
52
|
+
body:
|
53
|
+
encoding: ASCII-8BIT
|
54
|
+
string: !binary ""
|
55
|
+
http_version: !binary |-
|
56
|
+
MS4x
|
57
|
+
recorded_at: Wed, 14 Mar 2012 00:01:13 GMT
|
58
|
+
recorded_with: VCR 2.0.0
|
@@ -0,0 +1,109 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<output>
|
3
|
+
<meta>
|
4
|
+
<generated_at>2012-03-13T23:00:09+00:00</generated_at>
|
5
|
+
<total_entries>4</total_entries>
|
6
|
+
</meta>
|
7
|
+
<entries>
|
8
|
+
<entry>
|
9
|
+
<url>http://www.grovesgas.co.uk/TAMFidelidade/clientetam.htm</url>
|
10
|
+
<phish_id>1389753</phish_id>
|
11
|
+
<phish_detail_url>http://www.phishtank.com/phish_detail.php?phish_id=1389753</phish_detail_url>
|
12
|
+
<details>
|
13
|
+
<detail>
|
14
|
+
<ip_address>209.235.144.9</ip_address>
|
15
|
+
<cidr_block>209.235.144.0/21</cidr_block>
|
16
|
+
<announcing_network>30447</announcing_network>
|
17
|
+
<rir>arin</rir>
|
18
|
+
<detail_time>2012-03-13T21:47:18+00:00</detail_time>
|
19
|
+
</detail>
|
20
|
+
</details>
|
21
|
+
<submission>
|
22
|
+
<submission_time>2012-03-13T21:46:39+00:00</submission_time>
|
23
|
+
</submission>
|
24
|
+
<verification>
|
25
|
+
<verified>yes</verified>
|
26
|
+
<verification_time>2012-03-13T22:51:43+00:00</verification_time>
|
27
|
+
</verification>
|
28
|
+
<status>
|
29
|
+
<online>yes</online>
|
30
|
+
</status>
|
31
|
+
<target>TAM Fidelidade</target>
|
32
|
+
</entry>
|
33
|
+
<entry>
|
34
|
+
<url>http://www.grovesgas.co.uk/TAMFidelidade/</url>
|
35
|
+
<phish_id>1389752</phish_id>
|
36
|
+
<phish_detail_url>http://www.phishtank.com/phish_detail.php?phish_id=1389752</phish_detail_url>
|
37
|
+
<details>
|
38
|
+
<detail>
|
39
|
+
<ip_address>209.235.144.9</ip_address>
|
40
|
+
<cidr_block>209.235.144.0/21</cidr_block>
|
41
|
+
<announcing_network>30447</announcing_network>
|
42
|
+
<rir>arin</rir>
|
43
|
+
<detail_time>2012-03-13T21:47:18+00:00</detail_time>
|
44
|
+
</detail>
|
45
|
+
</details>
|
46
|
+
<submission>
|
47
|
+
<submission_time>2012-03-13T21:46:16+00:00</submission_time>
|
48
|
+
</submission>
|
49
|
+
<verification>
|
50
|
+
<verified>yes</verified>
|
51
|
+
<verification_time>2012-03-13T22:52:13+00:00</verification_time>
|
52
|
+
</verification>
|
53
|
+
<status>
|
54
|
+
<online>yes</online>
|
55
|
+
</status>
|
56
|
+
<target>TAM Fidelidade</target>
|
57
|
+
</entry>
|
58
|
+
<entry>
|
59
|
+
<url>http://intimvela.lv/administrator/.js/53453434/</url>
|
60
|
+
<phish_id>1389747</phish_id>
|
61
|
+
<phish_detail_url>http://www.phishtank.com/phish_detail.php?phish_id=1389747</phish_detail_url>
|
62
|
+
<details>
|
63
|
+
<detail>
|
64
|
+
<ip_address>92.240.69.19</ip_address>
|
65
|
+
<cidr_block>92.240.64.0/19</cidr_block>
|
66
|
+
<announcing_network>5538</announcing_network>
|
67
|
+
<rir>ripencc</rir>
|
68
|
+
<detail_time>2012-03-13T21:38:22+00:00</detail_time>
|
69
|
+
</detail>
|
70
|
+
</details>
|
71
|
+
<submission>
|
72
|
+
<submission_time>2012-03-13T21:37:40+00:00</submission_time>
|
73
|
+
</submission>
|
74
|
+
<verification>
|
75
|
+
<verified>yes</verified>
|
76
|
+
<verification_time>2012-03-13T22:19:48+00:00</verification_time>
|
77
|
+
</verification>
|
78
|
+
<status>
|
79
|
+
<online>yes</online>
|
80
|
+
</status>
|
81
|
+
<target>Santander UK</target>
|
82
|
+
</entry>
|
83
|
+
<entry>
|
84
|
+
<url>http://222.189.238.37/www.americanexpress.com/</url>
|
85
|
+
<phish_id>1389746</phish_id>
|
86
|
+
<phish_detail_url>http://www.phishtank.com/phish_detail.php?phish_id=1389746</phish_detail_url>
|
87
|
+
<details>
|
88
|
+
<detail>
|
89
|
+
<ip_address>222.189.238.37</ip_address>
|
90
|
+
<cidr_block>222.189.238.0/23</cidr_block>
|
91
|
+
<announcing_network>23650</announcing_network>
|
92
|
+
<rir>apnic</rir>
|
93
|
+
<detail_time>2012-03-13T21:38:21+00:00</detail_time>
|
94
|
+
</detail>
|
95
|
+
</details>
|
96
|
+
<submission>
|
97
|
+
<submission_time>2012-03-13T21:37:10+00:00</submission_time>
|
98
|
+
</submission>
|
99
|
+
<verification>
|
100
|
+
<verified>yes</verified>
|
101
|
+
<verification_time>2012-03-13T22:52:45+00:00</verification_time>
|
102
|
+
</verification>
|
103
|
+
<status>
|
104
|
+
<online>yes</online>
|
105
|
+
</status>
|
106
|
+
<target>Other</target>
|
107
|
+
</entry>
|
108
|
+
</entries>
|
109
|
+
</output>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe PhishTank::Configuration do
|
4
|
+
describe "defaults" do
|
5
|
+
subject { described_class.new }
|
6
|
+
|
7
|
+
its(:api_key) { should eq "" }
|
8
|
+
its(:etag) { should eq nil }
|
9
|
+
its(:temp_directory) { should eq "/tmp" }
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe PhishTank::Data do
|
4
|
+
context "success" do
|
5
|
+
before(:all) do
|
6
|
+
PhishTank.configure do |c|
|
7
|
+
c.temp_directory = fixture_path
|
8
|
+
end
|
9
|
+
@data = described_class.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should store the path to the data file at #file" do
|
13
|
+
@data.file.should eq fixture_path + '/online-valid.xml'
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should store the parsed Nokogiri XML document at #doc" do
|
17
|
+
@data.doc.should be_kind_of(Nokogiri::XML::Document)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return a list of entries at #entries" do
|
21
|
+
@data.entries.should be_kind_of(Array)
|
22
|
+
@data.entries.count.should >= 1
|
23
|
+
end
|
24
|
+
|
25
|
+
context "entry" do
|
26
|
+
subject { @data.entries.first }
|
27
|
+
|
28
|
+
its(:url) { should eq "http://www.grovesgas.co.uk/TAMFidelidade/clientetam.htm" }
|
29
|
+
its(:phish_id) { should eq "1389753" }
|
30
|
+
its(:phish_detail_url) { should eq "http://www.phishtank.com/phish_detail.php?phish_id=1389753" }
|
31
|
+
its(:ip_address) { should eq "209.235.144.9" }
|
32
|
+
its(:submission_time) { should eq "2012-03-13T21:46:39+00:00" }
|
33
|
+
its(:verified) { should eq "yes" }
|
34
|
+
its(:verification_time) { should eq "2012-03-13T22:51:43+00:00" }
|
35
|
+
its(:online_status) { should eq "yes" }
|
36
|
+
its(:target) { should eq "TAM Fidelidade" }
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
context "errors" do
|
42
|
+
it "should raise an error unless file exists in temporary directory" do
|
43
|
+
PhishTank.configure do |c|
|
44
|
+
c.temp_directory = "/tmp"
|
45
|
+
end
|
46
|
+
|
47
|
+
expect { described_class.new }.to raise_error("Data File Not Found!")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe PhishTank::Request do
|
4
|
+
describe "#update?" do
|
5
|
+
before(:all) do
|
6
|
+
PhishTank.api_key = API_KEY
|
7
|
+
end
|
8
|
+
let(:update_needed) { described_class.new("Tue, 12 Mar 2012 22:00:00") }
|
9
|
+
let(:no_update_needed) { described_class.new("Wed, 14 Mar 2012 00:00:00") }
|
10
|
+
|
11
|
+
it "should respond true if an update is available", :vcr => { :cassette_name => 'update_needed' } do
|
12
|
+
update_needed.update?.should eq true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should respond false if an update isn't available", :vcr => { :cassette_name => 'no_update_needed' } do
|
16
|
+
no_update_needed.update?.should eq false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#get_update" do
|
21
|
+
before(:all) do
|
22
|
+
PhishTank.configure do |c|
|
23
|
+
c.api_key = API_KEY
|
24
|
+
c.temp_directory = fixture_path
|
25
|
+
end
|
26
|
+
request = described_class.new
|
27
|
+
|
28
|
+
if File.exists?(fixture_path + "/online-valid.xml")
|
29
|
+
@response = File.read(fixture_path + "/online-valid.xml")
|
30
|
+
else
|
31
|
+
VCR.use_cassette("get_update") do
|
32
|
+
@response = request.get_update
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should create an XML file in the temporary directory" do
|
38
|
+
File.exists?(fixture_path + "/online-valid.xml").should eq true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#update_uri" do
|
43
|
+
subject do
|
44
|
+
PhishTank.api_key = "12345"
|
45
|
+
described_class.new
|
46
|
+
end
|
47
|
+
|
48
|
+
its(:update_uri) { should eq "http://data.phishtank.com/data/12345/online-valid.xml"}
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe PhishTank do
|
4
|
+
it "should have a BASE_URI" do
|
5
|
+
subject::BASE_URI.should eq "http://data.phishtank.com"
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should take an API key' do
|
9
|
+
subject.api_key = "12345"
|
10
|
+
subject.api_key.should eq "12345"
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#configure" do
|
14
|
+
before(:all) do
|
15
|
+
described_class.configure do |c|
|
16
|
+
c.api_key = "12345"
|
17
|
+
c.temp_directory = "/temporary"
|
18
|
+
c.etag = "123456"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
its(:api_key) { should eq "12345" }
|
23
|
+
its(:temp_directory) { should eq "/temporary" }
|
24
|
+
its(:etag) { should eq "123456" }
|
25
|
+
end
|
26
|
+
|
27
|
+
it { should respond_to(:update!) }
|
28
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'vcr'
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/phishtank')
|
3
|
+
|
4
|
+
API_KEY = "dad4255d1d50896dd9d981d0bde43176ed5020cda62ecd077a4e1652e12e1e3f"
|
5
|
+
|
6
|
+
def fixture_path
|
7
|
+
File.expand_path(File.dirname(__FILE__) + '/fixtures')
|
8
|
+
end
|
9
|
+
|
10
|
+
VCR.configure do |c|
|
11
|
+
c.cassette_library_dir = 'spec/cassettes'
|
12
|
+
c.hook_into :typhoeus
|
13
|
+
c.filter_sensitive_data('<API_KEY>') { API_KEY }
|
14
|
+
c.configure_rspec_metadata!
|
15
|
+
end
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
19
|
+
config.run_all_when_everything_filtered = true
|
20
|
+
config.filter_run :focus
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: phishtank
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ezekiel Templin
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: typhoeus
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.3.3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.3.3
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: nokogiri
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.5.2
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.5.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.8.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.8.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: vcr
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.0.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.0.0
|
78
|
+
description: Ruby interface to OpenDNS's PhishTank API
|
79
|
+
email:
|
80
|
+
- zeke@templ.in
|
81
|
+
executables: []
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- .gitignore
|
86
|
+
- .rspec
|
87
|
+
- .rvmrc
|
88
|
+
- .travis.yml
|
89
|
+
- Gemfile
|
90
|
+
- Guardfile
|
91
|
+
- LICENSE
|
92
|
+
- README.md
|
93
|
+
- Rakefile
|
94
|
+
- lib/phishtank.rb
|
95
|
+
- lib/phishtank/configuration.rb
|
96
|
+
- lib/phishtank/data.rb
|
97
|
+
- lib/phishtank/request.rb
|
98
|
+
- lib/phishtank/version.rb
|
99
|
+
- phishtank.gemspec
|
100
|
+
- spec/cassettes/no_update_needed.yml
|
101
|
+
- spec/cassettes/update_needed.yml
|
102
|
+
- spec/fixtures/online-valid.xml
|
103
|
+
- spec/phishtank/configuration_spec.rb
|
104
|
+
- spec/phishtank/data_spec.rb
|
105
|
+
- spec/phishtank/request_spec.rb
|
106
|
+
- spec/phishtank_spec.rb
|
107
|
+
- spec/spec_helper.rb
|
108
|
+
homepage: https://github.com/ezkl/phishtank
|
109
|
+
licenses: []
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
segments:
|
121
|
+
- 0
|
122
|
+
hash: 1039292126321332298
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ! '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
segments:
|
130
|
+
- 0
|
131
|
+
hash: 1039292126321332298
|
132
|
+
requirements: []
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 1.8.18
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: Provides a simple interface to work with OpenDNS's PhishTank developer API
|
138
|
+
by handling caching and parsing of PhishTank data.
|
139
|
+
test_files:
|
140
|
+
- spec/cassettes/no_update_needed.yml
|
141
|
+
- spec/cassettes/update_needed.yml
|
142
|
+
- spec/fixtures/online-valid.xml
|
143
|
+
- spec/phishtank/configuration_spec.rb
|
144
|
+
- spec/phishtank/data_spec.rb
|
145
|
+
- spec/phishtank/request_spec.rb
|
146
|
+
- spec/phishtank_spec.rb
|
147
|
+
- spec/spec_helper.rb
|