phishtank 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,10 @@
1
+ # PhishTank
2
+ ## v0.1.1 / 2012-03-13
3
+ * Rename Request and Data to FeedRequest and FeedData
4
+ * This breaks semver, so to the none of you that have installed this, my apologies.
5
+ * Add URL search API interface.
6
+
7
+ ## v0.1.0 / 2012-03-13
8
+ * First release!
9
+ * Basic request handling, update checks, caching, and data parsing.
10
+ * Specs
data/README.md CHANGED
@@ -21,9 +21,9 @@ or w/ Bundler, add the following to the Gemfile.
21
21
  c.etag = "ETag" #optional
22
22
  end
23
23
 
24
- PhishTank.update!
24
+ PhishTank.update_feed!
25
25
 
26
- data = PhishTank::Data.new
26
+ data = PhishTank::FeedData.new
27
27
 
28
28
  data.entries.first
29
29
  # => #<OpenStruct:0x1021026f8
@@ -41,8 +41,10 @@ or w/ Bundler, add the following to the Gemfile.
41
41
  # }
42
42
  #>
43
43
 
44
+ PhishTank.search("http://www.google.com/") #=> false
45
+ PhishTank.search("http://suspiciousurl.com/") #=> OpenStruct w/ PhishTank details
46
+
44
47
  Read specs for more details.
45
48
 
46
49
  ## TODO
47
- * Add interface for [checking URL's](http://www.phishtank.com/api_info.php)
48
- * Add errors for service-specific rate limiting errors
50
+ You can see and contribute to the list of TODO items in [issues](https://github.com/ezkl/phishtank/issues?sort=created&labels=todo&direction=desc&state=open).
@@ -1,7 +1,11 @@
1
+ require 'typhoeus'
2
+ require 'nokogiri'
3
+
1
4
  require "phishtank/version"
2
5
  require "phishtank/configuration"
3
- require "phishtank/request"
4
- require "phishtank/data"
6
+ require "phishtank/feed_request"
7
+ require "phishtank/feed_data"
8
+ require "phishtank/url_request"
5
9
 
6
10
  module PhishTank
7
11
  BASE_URI = "http://data.phishtank.com"
@@ -16,11 +20,15 @@ module PhishTank
16
20
  @configuration ||= Configuration.new
17
21
  end
18
22
 
19
- def self.update!
20
- request = Request.new
23
+ def self.update_feed!
24
+ request = FeedRequest.new
21
25
  request.get_update if request.update?
22
26
  end
23
27
 
28
+ def self.search(url)
29
+ URLRequest.new(url).search
30
+ end
31
+
24
32
  def self.api_key
25
33
  @configuration.api_key
26
34
  end
@@ -1,8 +1,7 @@
1
- require 'nokogiri'
2
1
  require 'ostruct'
3
2
 
4
3
  module PhishTank
5
- class Data
4
+ class FeedData
6
5
  attr_reader :file, :doc, :entries
7
6
 
8
7
  def initialize(data_file_path = nil)
@@ -1,7 +1,5 @@
1
- require 'typhoeus'
2
-
3
1
  module PhishTank
4
- class Request
2
+ class FeedRequest
5
3
  attr_accessor :etag
6
4
 
7
5
  def initialize(etag = nil)
@@ -0,0 +1,55 @@
1
+ require 'ostruct'
2
+
3
+ module PhishTank
4
+ class URLRequest
5
+ attr_reader :url, :doc
6
+
7
+ def initialize(url)
8
+ @url = URI.encode(url)
9
+ end
10
+
11
+ def search
12
+ response = Typhoeus::Request.post(search_uri, :params => params)
13
+ parse_response(response.body)
14
+
15
+ if in_database?
16
+ result_data
17
+ else
18
+ false
19
+ end
20
+ end
21
+
22
+ def in_database?
23
+ in_database = @doc.xpath("/response/results/url0/in_database").text
24
+ in_database =~ /true/ ? true : false
25
+ end
26
+
27
+ def result_data
28
+ search_result = @doc.xpath("/response/results/url0")
29
+ result = OpenStruct.new
30
+ result.url = search_result.at("url").text
31
+ result.in_database = true
32
+ result.phish_id = search_result.at("phish_id").text
33
+ result.detail_page = search_result.at("phish_detail_page").text
34
+ result.verified = search_result.at("verified").text
35
+ result.verified_at = search_result.at("verified_at").text
36
+ result.valid = search_result.at("valid").text
37
+ # result.submitted_at = search_result.at("submitted_at").text
38
+ result
39
+ end
40
+
41
+ def params
42
+ { :format => "XML",
43
+ :app_key => PhishTank.configuration.api_key,
44
+ :url => @url }
45
+ end
46
+
47
+ def search_uri
48
+ "http://checkurl.phishtank.com/checkurl/"
49
+ end
50
+
51
+ def parse_response(body)
52
+ @doc = Nokogiri::XML(body)
53
+ end
54
+ end
55
+ end
@@ -1,3 +1,3 @@
1
1
  module PhishTank
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -0,0 +1,65 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://checkurl.phishtank.com/checkurl/
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: !binary |-
14
+ T0s=
15
+ headers:
16
+ !binary "RGF0ZQ==":
17
+ - !binary |-
18
+ V2VkLCAxNCBNYXIgMjAxMiAwMjozNTo0NSBHTVQ=
19
+ !binary "U2VydmVy":
20
+ - !binary |-
21
+ QXBhY2hlLzIuMi45IChEZWJpYW4pIFBIUC81LjIuNi0xK2xlbm55OSB3aXRo
22
+ IFN1aG9zaW4tUGF0Y2g=
23
+ !binary "WC1Qb3dlcmVkLUJ5":
24
+ - !binary |-
25
+ UEhQLzUuMi42LTErbGVubnk5
26
+ !binary "WC1SZXF1ZXN0LUxpbWl0LUludGVydmFs":
27
+ - !binary |-
28
+ MzAwIFNlY29uZHM=
29
+ !binary "WC1SZXF1ZXN0LUxpbWl0":
30
+ - !binary |-
31
+ MjUw
32
+ !binary "WC1SZXF1ZXN0LUNvdW50":
33
+ - !binary |-
34
+ MQ==
35
+ !binary "VmFyeQ==":
36
+ - !binary |-
37
+ QWNjZXB0LUVuY29kaW5n
38
+ !binary "Q29udGVudC1FbmNvZGluZw==":
39
+ - !binary |-
40
+ Z3ppcA==
41
+ !binary "Q29udGVudC1MZW5ndGg=":
42
+ - !binary |-
43
+ Mjcw
44
+ !binary "Q29ubmVjdGlvbg==":
45
+ - !binary |-
46
+ Y2xvc2U=
47
+ !binary "Q29udGVudC1UeXBl":
48
+ - !binary |-
49
+ dGV4dC94bWw=
50
+ body:
51
+ encoding: ASCII-8BIT
52
+ string: !binary |-
53
+ PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KCTxyZXNw
54
+ b25zZT4KCQk8bWV0YT4KCQkJPHRpbWVzdGFtcD4yMDEyLTAzLTE0VDAyOjM1
55
+ OjQ1KzAwOjAwPC90aW1lc3RhbXA+CgkJCTxzZXJ2ZXJpZD5lNTZkZWZjYzwv
56
+ c2VydmVyaWQ+CgkJCTxyZXF1ZXN0aWQ+MTkyLjE2OC4wLjEwNy40ZjYwMDQw
57
+ MTM3ODBhNC4yMTIzNDUxMjwvcmVxdWVzdGlkPgoJCTwvbWV0YT4KCQk8cmVz
58
+ dWx0cz4KCQkJPHVybDA+CgkJCQk8dXJsPjwhW0NEQVRBW2h0dHA6Ly93d3cu
59
+ Z29vZ2xlLmNvbS8/cT1zZWFyY2ggcXVlcnldXT48L3VybD4KCQkJCTxpbl9k
60
+ YXRhYmFzZT5mYWxzZTwvaW5fZGF0YWJhc2U+CgkJCTwvdXJsMD4KCQk8L3Jl
61
+ c3VsdHM+Cgk8L3Jlc3BvbnNlPgo=
62
+ http_version: !binary |-
63
+ MS4x
64
+ recorded_at: Wed, 14 Mar 2012 02:34:06 GMT
65
+ recorded_with: VCR 2.0.0
@@ -0,0 +1,71 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://checkurl.phishtank.com/checkurl/
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: !binary |-
14
+ T0s=
15
+ headers:
16
+ !binary "RGF0ZQ==":
17
+ - !binary |-
18
+ V2VkLCAxNCBNYXIgMjAxMiAwMjo0NDoyMyBHTVQ=
19
+ !binary "U2VydmVy":
20
+ - !binary |-
21
+ QXBhY2hlLzIuMi45IChEZWJpYW4pIFBIUC81LjIuNi0xK2xlbm55OSB3aXRo
22
+ IFN1aG9zaW4tUGF0Y2g=
23
+ !binary "WC1Qb3dlcmVkLUJ5":
24
+ - !binary |-
25
+ UEhQLzUuMi42LTErbGVubnk5
26
+ !binary "WC1SZXF1ZXN0LUxpbWl0LUludGVydmFs":
27
+ - !binary |-
28
+ MzAwIFNlY29uZHM=
29
+ !binary "WC1SZXF1ZXN0LUxpbWl0":
30
+ - !binary |-
31
+ MjUw
32
+ !binary "WC1SZXF1ZXN0LUNvdW50":
33
+ - !binary |-
34
+ MQ==
35
+ !binary "VmFyeQ==":
36
+ - !binary |-
37
+ QWNjZXB0LUVuY29kaW5n
38
+ !binary "Q29udGVudC1FbmNvZGluZw==":
39
+ - !binary |-
40
+ Z3ppcA==
41
+ !binary "Q29udGVudC1MZW5ndGg=":
42
+ - !binary |-
43
+ Mzcx
44
+ !binary "Q29ubmVjdGlvbg==":
45
+ - !binary |-
46
+ Y2xvc2U=
47
+ !binary "Q29udGVudC1UeXBl":
48
+ - !binary |-
49
+ dGV4dC94bWw=
50
+ body:
51
+ encoding: ASCII-8BIT
52
+ string: !binary |-
53
+ PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KCTxyZXNw
54
+ b25zZT4KCQk8bWV0YT4KCQkJPHRpbWVzdGFtcD4yMDEyLTAzLTE0VDAyOjQ0
55
+ OjIzKzAwOjAwPC90aW1lc3RhbXA+CgkJCTxzZXJ2ZXJpZD4yZDVjMmNiPC9z
56
+ ZXJ2ZXJpZD4KCQkJPHJlcXVlc3RpZD4xOTIuMTY4LjAuMTA3LjRmNjAwNjA3
57
+ ZDBkZjMxLjAxMjQ2MjM1PC9yZXF1ZXN0aWQ+CgkJPC9tZXRhPgoJCTxyZXN1
58
+ bHRzPgoJCQk8dXJsMD4KCQkJCTx1cmw+PCFbQ0RBVEFbaHR0cDovL3d3dy5n
59
+ cm92ZXNnYXMuY28udWsvVEFNRmlkZWxpZGFkZS9jbGllbnRldGFtLmh0bV1d
60
+ PjwvdXJsPgoJCQkJPGluX2RhdGFiYXNlPnRydWU8L2luX2RhdGFiYXNlPgoJ
61
+ CQkJPHBoaXNoX2lkPjEzODk3NTM8L3BoaXNoX2lkPgoJCQkJPHBoaXNoX2Rl
62
+ dGFpbF9wYWdlPjwhW0NEQVRBW2h0dHA6Ly93d3cucGhpc2h0YW5rLmNvbS9w
63
+ aGlzaF9kZXRhaWwucGhwP3BoaXNoX2lkPTEzODk3NTNdXT48L3BoaXNoX2Rl
64
+ dGFpbF9wYWdlPgoJCQkJPHZlcmlmaWVkPnRydWU8L3ZlcmlmaWVkPgoJCQkJ
65
+ PHZlcmlmaWVkX2F0PjIwMTItMDMtMTNUMjI6NTE6NDMrMDA6MDA8L3Zlcmlm
66
+ aWVkX2F0PgoJCQkJPHZhbGlkPnRydWU8L3ZhbGlkPgoJCQk8L3VybDA+CgkJ
67
+ PC9yZXN1bHRzPgoJPC9yZXNwb25zZT4K
68
+ http_version: !binary |-
69
+ MS4x
70
+ recorded_at: Wed, 14 Mar 2012 02:41:45 GMT
71
+ recorded_with: VCR 2.0.0
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- describe PhishTank::Data do
3
+ describe PhishTank::FeedData do
4
4
  context "success" do
5
5
  before(:all) do
6
6
  PhishTank.configure do |c|
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- describe PhishTank::Request do
3
+ describe PhishTank::FeedRequest do
4
4
  describe "#update?" do
5
5
  before(:all) do
6
6
  PhishTank.api_key = API_KEY
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe PhishTank::URLRequest do
4
+ subject do
5
+ PhishTank.configure { |c| c.api_key = API_KEY }
6
+ described_class.new("http://www.google.com/?q=search query")
7
+ end
8
+
9
+ it "should URI-encode the search URL" do
10
+ subject.url.should eq "http://www.google.com/?q=search%20query"
11
+ end
12
+
13
+ it "should have a search URI" do
14
+ subject.search_uri.should eq "http://checkurl.phishtank.com/checkurl/"
15
+ end
16
+
17
+ it "should respond to search" do
18
+ subject.should respond_to(:search)
19
+ end
20
+
21
+ describe "#search" do
22
+ context "valid search", :vcr => { :cassette_name => "valid search" } do
23
+ subject { described_class.new("http://www.grovesgas.co.uk/TAMFidelidade/clientetam.htm").search }
24
+ it "should return a struct of data" do
25
+ subject.should be_kind_of(OpenStruct)
26
+ end
27
+
28
+ it "should have a bunch of attributes" do
29
+ subject.url.should eq "http://www.grovesgas.co.uk/TAMFidelidade/clientetam.htm"
30
+ subject.in_database.should eq true
31
+ subject.phish_id.should eq "1389753"
32
+ end
33
+ end
34
+
35
+ context "invalid search", :vcr => { :cassette_name => "invalid search" } do
36
+ it "should return false" do
37
+ subject.search.should eq false
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "#params" do
43
+ its(:params) { should include(:format => "XML") }
44
+ its(:params) { should include(:app_key => API_KEY)}
45
+ its(:params) { should include(:url => "http://www.google.com/?q=search%20query") }
46
+ end
47
+ end
@@ -24,5 +24,7 @@ describe PhishTank do
24
24
  its(:etag) { should eq "123456" }
25
25
  end
26
26
 
27
- it { should respond_to(:update!) }
27
+ it { should respond_to(:update_feed!) }
28
+
29
+ it { should respond_to(:search) }
28
30
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phishtank
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -86,6 +86,7 @@ files:
86
86
  - .rspec
87
87
  - .rvmrc
88
88
  - .travis.yml
89
+ - ChangeLog.md
89
90
  - Gemfile
90
91
  - Guardfile
91
92
  - LICENSE
@@ -93,16 +94,20 @@ files:
93
94
  - Rakefile
94
95
  - lib/phishtank.rb
95
96
  - lib/phishtank/configuration.rb
96
- - lib/phishtank/data.rb
97
- - lib/phishtank/request.rb
97
+ - lib/phishtank/feed_data.rb
98
+ - lib/phishtank/feed_request.rb
99
+ - lib/phishtank/url_request.rb
98
100
  - lib/phishtank/version.rb
99
101
  - phishtank.gemspec
102
+ - spec/cassettes/invalid_search.yml
100
103
  - spec/cassettes/no_update_needed.yml
101
104
  - spec/cassettes/update_needed.yml
105
+ - spec/cassettes/valid_search.yml
102
106
  - spec/fixtures/online-valid.xml
103
107
  - spec/phishtank/configuration_spec.rb
104
- - spec/phishtank/data_spec.rb
105
- - spec/phishtank/request_spec.rb
108
+ - spec/phishtank/feed_data_spec.rb
109
+ - spec/phishtank/feed_request_spec.rb
110
+ - spec/phishtank/url_request_spec.rb
106
111
  - spec/phishtank_spec.rb
107
112
  - spec/spec_helper.rb
108
113
  homepage: https://github.com/ezkl/phishtank
@@ -119,7 +124,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
124
  version: '0'
120
125
  segments:
121
126
  - 0
122
- hash: 1039292126321332298
127
+ hash: -3595057374130271825
123
128
  required_rubygems_version: !ruby/object:Gem::Requirement
124
129
  none: false
125
130
  requirements:
@@ -128,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
133
  version: '0'
129
134
  segments:
130
135
  - 0
131
- hash: 1039292126321332298
136
+ hash: -3595057374130271825
132
137
  requirements: []
133
138
  rubyforge_project:
134
139
  rubygems_version: 1.8.18
@@ -137,11 +142,14 @@ specification_version: 3
137
142
  summary: Provides a simple interface to work with OpenDNS's PhishTank developer API
138
143
  by handling caching and parsing of PhishTank data.
139
144
  test_files:
145
+ - spec/cassettes/invalid_search.yml
140
146
  - spec/cassettes/no_update_needed.yml
141
147
  - spec/cassettes/update_needed.yml
148
+ - spec/cassettes/valid_search.yml
142
149
  - spec/fixtures/online-valid.xml
143
150
  - spec/phishtank/configuration_spec.rb
144
- - spec/phishtank/data_spec.rb
145
- - spec/phishtank/request_spec.rb
151
+ - spec/phishtank/feed_data_spec.rb
152
+ - spec/phishtank/feed_request_spec.rb
153
+ - spec/phishtank/url_request_spec.rb
146
154
  - spec/phishtank_spec.rb
147
155
  - spec/spec_helper.rb