vulndbhq 0.0.1.beta

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --order random
data/.travis.yml ADDED
@@ -0,0 +1,16 @@
1
+ language: ruby
2
+ matrix:
3
+ allow_failures:
4
+ - rvm: ruby-head
5
+ rvm:
6
+ - jruby-18mode
7
+ - jruby-19mode
8
+ - rbx-18mode
9
+ - rbx-19mode
10
+ - 1.8.7
11
+ - 1.9.2
12
+ - 1.9.3
13
+ - ruby-head
14
+ notifications:
15
+ email:
16
+ - daniel@securityroots.com
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vulndbhq.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Daniel Martin, Security Roots Ltd.
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,64 @@
1
+ # VulnDB HQ Ruby Gem [![Build Status](https://secure.travis-ci.org/securityroots/vulndbhq.png?branch=master)][travis] [![Dependency Status](https://gemnasium.com/securityroots/vulndbhq.png?travis)][gemnasium]
2
+
3
+ This gem provides a Ruby wrapper to the VulnDB HQ API (http://vulndbhq.com).
4
+
5
+ [travis]: http://travis-ci.org/securityroots/vulndbhq
6
+ [gemnasium]: https://gemnasium.com/securityroots/vulndbhq
7
+
8
+ ## Installation
9
+
10
+ DANGER, WILL ROBINSON!
11
+ DANGER, WILL ROBINSON!
12
+ DANGER, WILL ROBINSON!
13
+ THIS GEM IS IN EARLY BETA STAGE. EVERYTHING CAN CHANGE AT ANY POINT!!
14
+
15
+ THIS GEM USES API v2 WHICH WILL BE AVAILABLE SOON
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ gem 'vulndbhq'
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install vulndbhq
28
+
29
+
30
+ ## Configuration
31
+
32
+ To provide your access credentials:
33
+
34
+ ```ruby
35
+ require 'vulndbhq'
36
+
37
+ client = VulnDBHQ::client
38
+ client.host = 'https://you.vulndbhq.com'
39
+ client.user = 'your@email.com'
40
+ client.password = 'password'
41
+ ```
42
+
43
+ ## Usage examples
44
+
45
+ Return the first PrivatePage:
46
+
47
+ VulnDBHQ.private_pages
48
+
49
+ Get a PrivatePage by id:
50
+
51
+ ```ruby
52
+ private_page = client.private_page(1)
53
+
54
+ puts private_page.name
55
+ puts private_page.content
56
+ ```
57
+
58
+ ## Contributing
59
+
60
+ 1. Fork it
61
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
62
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
63
+ 4. Push to the branch (`git push origin my-new-feature`)
64
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :test => :spec
8
+ task :default => :spec
data/lib/vulndbhq.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'vulndbhq/client'
2
+
3
+ module VulnDBHQ
4
+ class << self
5
+
6
+ include VulnDBHQ::Configurable
7
+
8
+ def client
9
+ VulnDBHQ::Client.new(options)
10
+ end
11
+
12
+ # Delegate to a VulnDBHQ::Client
13
+ def respond_to?(method, include_private=false)
14
+ self.client.respond_to?(method, include_private) || super
15
+ end
16
+
17
+ def options
18
+ @options = {}
19
+ VulnDBHQ::Configurable.keys.each do |key|
20
+ @options[key] = instance_variable_get("@#{key}")
21
+ end
22
+ @options
23
+ end
24
+
25
+ def reset!
26
+ VulnDBHQ::Configurable.keys.each do |key|
27
+ instance_variable_set("@#{key}", VulnDBHQ::Default.options[key])
28
+ end
29
+ self
30
+ end
31
+ alias setup reset!
32
+
33
+ end
34
+ end
35
+
36
+ VulnDBHQ.setup
@@ -0,0 +1,95 @@
1
+ require 'vulndbhq/identity_map'
2
+
3
+ module VulnDBHQ
4
+ class Base
5
+ attr_reader :attrs
6
+ alias to_hash attrs
7
+
8
+ @@identity_map = IdentityMap.new
9
+
10
+ # Define methods that retrieve the value from an initialized instance variable Hash, using the attribute as a key
11
+ #
12
+ # @overload self. attr_reader(attr)
13
+ # @param attr [Symbol]
14
+ # @overload self. attr_reader(attrs)
15
+ # @param attrs [Array<Symbol>]
16
+ def self.attr_reader(*attrs)
17
+ attrs.each do |attribute|
18
+ class_eval do
19
+ define_method attribute do
20
+ @attrs[attribute.to_sym]
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ # Initializes a new object
27
+ #
28
+ # @param attrs [Hash]
29
+ # @return [VulnDBHQ::Base]
30
+ def initialize(attrs={})
31
+ self.update(attrs)
32
+ end
33
+
34
+ # Update the attributes of an object
35
+ #
36
+ # @param attrs [Hash]
37
+ # @return [VulnDBHQ::Base]
38
+ def update(attrs)
39
+ @attrs ||= {}
40
+ @attrs.update(attrs)
41
+ self
42
+ end
43
+
44
+ # Creates a new object and stores it in the identity map.
45
+ #
46
+ # @param attrs [Hash]
47
+ # @return [VulnDBHQ::Base]
48
+ def self.create(attrs={})
49
+ object = self.new(attrs)
50
+ self.store(object)
51
+ end
52
+
53
+ # Retrieves an object from the identity map.
54
+ #
55
+ # @param attrs [Hash]
56
+ # @return [VulnDBHQ::Base]
57
+ def self.fetch(attrs)
58
+ @@identity_map[self] ||= {}
59
+ if object = @@identity_map[self][Marshal.dump(attrs)]
60
+ return object
61
+ end
62
+
63
+ return yield if block_given?
64
+ raise VulnDBHQ::IdentityMapKeyError, 'key not found'
65
+ end
66
+
67
+ # Stores an object in the identity map.
68
+ #
69
+ # @param attrs [Hash]
70
+ # @return [VulnDBHQ::Base]
71
+ def self.store(object)
72
+ @@identity_map[self] ||= {}
73
+ @@identity_map[self][Marshal.dump(object.attrs)] = object
74
+ end
75
+
76
+ # Returns a new object based on the response hash
77
+ #
78
+ # @param attrs [Hash]
79
+ # @return [VulnDBHQ::Base]
80
+ def self.from_response(response={})
81
+ self.fetch_or_create(response[:body])
82
+ end
83
+
84
+ # Retrieves an object from the identity map, or stores it in the
85
+ # identity map if it doesn't already exist.
86
+ #
87
+ # @param attrs [Hash]
88
+ # @return [VulnDBHQ::Base]
89
+ def self.fetch_or_create(attrs={})
90
+ self.fetch(attrs) do
91
+ self.create(attrs)
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,130 @@
1
+ require 'faraday'
2
+ require 'multi_json'
3
+
4
+ require 'vulndbhq/base'
5
+ require 'vulndbhq/configurable'
6
+ require 'vulndbhq/default'
7
+ require 'vulndbhq/private_page'
8
+ require 'vulndbhq/response/parse_json'
9
+ require 'vulndbhq/version'
10
+
11
+ module VulnDBHQ
12
+ # Wrapper for the VulnDB HQ REST API
13
+ #
14
+ # @note All methods have been separated into modules as described in the API docs
15
+ # @see http://support.securityroots.com
16
+ class Client
17
+ include VulnDBHQ::Configurable
18
+
19
+ # Initializes a new Client object
20
+ #
21
+ # @param options [Hash]
22
+ # @return [VulnDBHQ::Client]
23
+ def initialize(options={})
24
+ VulnDBHQ::Configurable.keys.each do |key|
25
+ instance_variable_set("@#{key}", options[key] || VulnDBHQ.options[key])
26
+ end
27
+ end
28
+
29
+ # Returns a private page
30
+ #
31
+ # @see http://support.securityroots.com/vulndbhq_api_v2.html#model-private-page
32
+
33
+ # @authentication_required Yes
34
+ # @raise [VulnDBHQ::Error::Unauthorized] Error raised when supplied user credentials are not valid.
35
+ # @return [VulnDBHQ::PrivatePage] The requested messages.
36
+ # @param id [Integer] A VulnDB HQ private page ID.
37
+ # @param options [Hash] A customizable set of options.
38
+ # @example Return the private page with the id 87
39
+ # VulnDBHQ.private_page(87)
40
+ def private_page(id, options={})
41
+ response = get("/api/private_pages/#{id}", options)
42
+ VulnDBHQ::PrivatePage.from_response(response)
43
+ end
44
+
45
+ # Returns the collection of VulnDBHQ::PrivatePage for the account
46
+ #
47
+ # @see http://support.securityroots.com/vulndbhq_api_v2.html#model-private-page
48
+ # @authentication_required Yes
49
+ # @raise [VulnDBHQ::Error::Unauthorized] Error raised when supplied user credentials are not valid.
50
+ # @return [Array<VulnDBHQ::PrivatePage>] PrivatePages in the account associated with this user.
51
+ # @param options [Hash] A customizable set of options.
52
+ # @option options [nil] no options are supported yet.
53
+ # @example Return the private pages for the account
54
+ # VulnDBHQ.private_pages
55
+ def private_pages(options={})
56
+ response = get("/api/private_pages", options)
57
+ # collection_from_array(response[:body], VulnDBHQ::PrivatePage)
58
+ end
59
+
60
+ # Perform an HTTP GET request
61
+ def get(path, params={}, options={})
62
+ request(:get, path, params, options)
63
+ end
64
+
65
+ # Check whether credentials are present
66
+ #
67
+ # @return [Boolean]
68
+ def credentials?
69
+ credentials.values.all?
70
+ end
71
+
72
+ private
73
+
74
+ def collection_from_array(array, klass)
75
+ array.map do |element|
76
+ klass.fetch_or_create(element)
77
+ end
78
+ end
79
+
80
+ # Returns a Faraday::Connection object
81
+ #
82
+ # @return [Faraday::Connection]
83
+ def connection
84
+ @connection ||= Faraday.new(@host, @connection_options.merge(:builder => @middleware))
85
+ end
86
+
87
+ # Perform an HTTP request
88
+ def request(method, path, params, options)
89
+ uri = options[:host] || @host
90
+ uri = URI(uri) unless uri.respond_to?(:host)
91
+ uri += path
92
+ request_headers = {}
93
+ if self.credentials?
94
+ # When posting a file, don't sign any params
95
+ # signature_params = if [:post, :put].include?(method.to_sym) && params.values.any?{|value| value.is_a?(File) || (value.is_a?(Hash) && (value[:io].is_a?(IO) || value[:io].is_a?(StringIO)))}
96
+ # {}
97
+ # else
98
+ # params
99
+ # end
100
+ # authorization = SimpleOAuth::Header.new(method, uri, signature_params, credentials)
101
+ # request_headers[:authorization] = authorization.to_s
102
+ connection.basic_auth(credentials[:user], credentials[:password])
103
+ end
104
+ connection.url_prefix = options[:host] || @host
105
+ connection.run_request(method.to_sym, path, nil, request_headers) do |request|
106
+ unless params.empty?
107
+ case request.method
108
+ when :post, :put
109
+ request.body = params
110
+ else
111
+ request.params.update(params)
112
+ end
113
+ end
114
+ yield request if block_given?
115
+ end.env
116
+ rescue Faraday::Error::ClientError
117
+ raise VulnDBHQ::Error::ClientError
118
+ end
119
+
120
+ # Credentials hash
121
+ #
122
+ # @return [Hash]
123
+ def credentials
124
+ {
125
+ :user => @user,
126
+ :password => @password
127
+ }
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,29 @@
1
+ module VulnDBHQ
2
+ # Defines constants and methods related to configuration
3
+ module Configurable
4
+
5
+ # Convenience method to allow configuration options to be set in a block
6
+ def configure
7
+ yield self
8
+ self
9
+ end
10
+
11
+ # An array of valid keys in the options hash when configuring a {VulnDBHQ::Client}
12
+ CONFIG_KEYS = [
13
+ :connection_options,
14
+ :host,
15
+ :middleware
16
+ ]
17
+ attr_accessor *CONFIG_KEYS
18
+
19
+ AUTH_KEYS = [
20
+ :user,
21
+ :password
22
+ ]
23
+ attr_writer *AUTH_KEYS
24
+
25
+ def self.keys
26
+ @keys ||= CONFIG_KEYS + AUTH_KEYS
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,51 @@
1
+ module VulnDBHQ
2
+ module Default
3
+
4
+ def self.options
5
+ Hash[VulnDBHQ::Configurable.keys.map{|key| [key, send(key)]}]
6
+ end
7
+
8
+ # The Faraday connection options if none is set
9
+ def self.connection_options
10
+ @connection_options ||= {
11
+ :headers => {
12
+ :accept => 'application/vnd.vulndbhq; v=2',
13
+ :user_agent => "VulnDBHQ Ruby Gem #{VulnDBHQ::Version}"
14
+ },
15
+ :open_timeout => 5,
16
+ :raw => true,
17
+ :ssl => {:verify => false},
18
+ :timeout => 10,
19
+ }
20
+ end
21
+
22
+ # @note Faraday's middleware stack implementation is comparable to that of Rack middleware. The order of middleware is important: the first middleware on the list wraps all others, while the last middleware is the innermost one.
23
+ # @see https://github.com/technoweenie/faraday#advanced-middleware-usage
24
+ # @see http://mislav.uniqpath.com/2011/07/faraday-advanced-http/
25
+ def self.middleware
26
+ @middleware ||= Faraday::Builder.new(
27
+ &Proc.new do |builder|
28
+ builder.use Faraday::Request::UrlEncoded # Convert request params as "www-form-urlencoded"
29
+ builder.use VulnDBHQ::Response::ParseJson # Parse JSON response bodies using MultiJson
30
+ builder.adapter Faraday.default_adapter # Set Faraday's HTTP adapter
31
+ end
32
+ )
33
+ end
34
+
35
+ # The VulnDB HQ host
36
+ def self.host
37
+ ENV['VULNDBHQ_HOST']
38
+ end
39
+
40
+ # The VulnDB HQ user if none is set
41
+ def self.user
42
+ ENV['VULNDBHQ_USER']
43
+ end
44
+
45
+ # The VulnDB HQ password if none is set
46
+ def self.password
47
+ ENV['VULNDBHQ_PASSWORD']
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,10 @@
1
+ module VulnDBHQ
2
+ # Tracks objects to help ensure that each object gets loaded only once.
3
+ # See: http://www.martinfowler.com/eaaCatalog/identityMap.html
4
+ class IdentityMap < Hash
5
+ end
6
+
7
+ # Inherit from KeyError when Ruby 1.8 compatibility is removed
8
+ class IdentityMapKeyError < ::IndexError
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module VulnDBHQ
2
+ class PrivatePage < Base
3
+ attr_reader :name, :content
4
+ end
5
+ end
@@ -0,0 +1,26 @@
1
+ module VulnDBHQ
2
+ module Response
3
+ class ParseJson < Faraday::Response::Middleware
4
+
5
+ def parse(body)
6
+ case body
7
+ when ''
8
+ nil
9
+ when 'true'
10
+ true
11
+ when 'false'
12
+ false
13
+ else
14
+ MultiJson.load(body, :symbolize_keys => true)
15
+ end
16
+ end
17
+
18
+ def on_complete(env)
19
+ if respond_to?(:parse)
20
+ env[:body] = parse(env[:body]) unless [204, 304].include?(env[:status])
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ module VulnDBHQ
2
+ class Version #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+ PRE = "beta"
7
+
8
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
9
+
10
+ # @return [String]
11
+ def self.to_s
12
+ STRING
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ describe 'Faraday response' do
2
+
3
+ context "for valid object" do
4
+ let(:middleware) { VulnDBHQ::Response::ParseJson.new(lambda{|env| Faraday::Response.new(env)}) }
5
+
6
+ def process(body, content_type = nil)
7
+ env = {:body => body, :request_headers => Faraday::Utils::Headers.new}
8
+ env[:request_headers]['content-type'] = content_type if content_type
9
+ middleware.call(env)
10
+ end
11
+
12
+ it "parses response body (JSON) into a Hash" do
13
+ response = process('{"a":1,"b":"dos"}', 'application/json')
14
+ response.body.should be_a_kind_of(Hash)
15
+ response.body.keys.should include(:a)
16
+ response.body.keys.should include(:b)
17
+ response.body[:b].should eq('dos')
18
+ end
19
+ end
20
+
21
+ context "for invalid object" do
22
+ let(:client) { VulnDBHQ::Client.new }
23
+ pending "handles 404 responses"
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'Although not required, bundler is recommended for running the tests.'
5
+ end
6
+
7
+ # load the library
8
+ require 'vulndbhq'
9
+
10
+ # test libraries
11
+ require 'webmock/rspec'
12
+
13
+ # Requires supporting ruby files with custom matchers and macros, etc,
14
+ # in spec/support/ and its subdirectories.
15
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
16
+
17
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
18
+ RSpec.configure do |config|
19
+ config.treat_symbols_as_metadata_keys_with_true_values = true
20
+ config.run_all_when_everything_filtered = true
21
+ config.filter_run :focus
22
+ end
@@ -0,0 +1,5 @@
1
+ TEST_ENDPOINT = 'https://user.vulndbhq.com'
2
+
3
+ def stub_get(path, endpoint=TEST_ENDPOINT)
4
+ stub_request(:get, endpoint + path)
5
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe VulnDBHQ::Base do
4
+
5
+ before do
6
+ object = VulnDBHQ::Base.new(:id => 1)
7
+ @base = VulnDBHQ::Base.store(object)
8
+ end
9
+
10
+ describe "#to_hash" do
11
+ it "returns a hash" do
12
+ @base.to_hash.should be_a Hash
13
+ @base.to_hash[:id].should eq 1
14
+ end
15
+ end
16
+
17
+ describe '.fetch' do
18
+ it 'returns existing objects' do
19
+ VulnDBHQ::Base.fetch(:id => 1).should be
20
+ VulnDBHQ::Base.fetch(:id => 1).object_id.should eq(@base.object_id)
21
+ end
22
+
23
+ it "raises an error on objects that don't exist" do
24
+ lambda {
25
+ VulnDBHQ::Base.fetch(:id => 6)
26
+ }.should raise_error(VulnDBHQ::IdentityMapKeyError)
27
+ end
28
+ end
29
+
30
+ describe '.store' do
31
+ it 'stores VulnDBHQ::Base objects' do
32
+ object = VulnDBHQ::Base.new(:id => 4)
33
+ VulnDBHQ::Base.store(object).should be_a VulnDBHQ::Base
34
+ end
35
+ end
36
+
37
+ describe '.fetch_or_create' do
38
+ it 'returns existing objects' do
39
+ VulnDBHQ::Base.fetch_or_create(:id => 1).should be
40
+ VulnDBHQ::Base.fetch(:id => 1).object_id.should eq(@base.object_id)
41
+ end
42
+
43
+ it 'creates new objects and stores them' do
44
+ VulnDBHQ::Base.fetch_or_create(:id => 2).should be
45
+
46
+ VulnDBHQ::Base.fetch(:id => 2).should be
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe VulnDBHQ::Client do
4
+
5
+ pending "catches Faraday errors"
6
+ # it "catches Faraday errors" do
7
+ # subject.stub!(:connection).and_raise(Faraday::Error::ClientError.new("Oups"))
8
+ # lambda do
9
+ # subject.request(:get, "/path", {}, {})
10
+ # end.should raise_error(VulnDBHQ::Error::ClientError, "Oups")
11
+ # end
12
+
13
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe VulnDBHQ::PrivatePage do
4
+
5
+ it "loads :name and :content from the server's JSON body" do
6
+ stub_get('/api/private_pages/1').
7
+ to_return(:status => 200,
8
+ :body => "{\"content\":\"#[Title]#\\r\\nThis is my Private Page\\r\\n\\r\\n\",\"id\":1,\"name\":\"MyPrivatePage\"}",
9
+ :headers => {'Content-Type' => 'application/json; charset=utf-8'})
10
+ client = VulnDBHQ::client
11
+ client.host = TEST_ENDPOINT
12
+
13
+ private_page = client.private_page(1)
14
+ private_page.should be
15
+ private_page.should be_a(VulnDBHQ::PrivatePage)
16
+ private_page.name.should eq('MyPrivatePage')
17
+ private_page.content.should eq("#[Title]#\r\nThis is my Private Page\r\n\r\n")
18
+ end
19
+
20
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe VulnDBHQ do
4
+
5
+ describe '.respond_to?' do
6
+ it "delegates to VulnDBHQ::Client" do
7
+ VulnDBHQ.respond_to?(:private_pages).should be_true
8
+ end
9
+ it "takes an optional argument" do
10
+ VulnDBHQ.respond_to?(:private_pages, true).should be_true
11
+ end
12
+ end
13
+
14
+ describe ".client" do
15
+ it "returns a VulnDBHQ::Client" do
16
+ VulnDBHQ.client.should be_a VulnDBHQ::Client
17
+ end
18
+ end
19
+
20
+ describe ".configure" do
21
+ VulnDBHQ::Configurable.keys.each do |key|
22
+ it "sets the #{key.to_s.gsub('_', ' ')}" do
23
+ VulnDBHQ.configure do |config|
24
+ config.send("#{key}=", key)
25
+ end
26
+ VulnDBHQ.instance_variable_get("@#{key}").should eq key
27
+ end
28
+ end
29
+ end
30
+
31
+ VulnDBHQ::Configurable::CONFIG_KEYS.each do |key|
32
+ it "has a default #{key.to_s.gsub('_', ' ')}" do
33
+ VulnDBHQ.send(key).should eq VulnDBHQ::Default.options[key]
34
+ end
35
+ end
36
+ end
data/vulndbhq.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/vulndbhq/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ['Daniel Martin']
6
+ gem.email = ['<daniel@securityroots.com>']
7
+ gem.description = %q{A Ruby wrapper for the VulnDB HQ API.}
8
+ gem.summary = %q{VulnDB HQ API wrapper}
9
+ gem.homepage = 'http://vulndbhq.com'
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = 'vulndbhq'
15
+ gem.require_paths = ['lib']
16
+ gem.version = VulnDBHQ::Version
17
+
18
+ gem.add_runtime_dependency 'faraday', '~> 0.8'
19
+ gem.add_runtime_dependency 'multi_json', '~> 1.3'
20
+
21
+ gem.add_development_dependency 'rake', '~> 0.8'
22
+ gem.add_development_dependency 'rspec', '~> 2.8'
23
+ gem.add_development_dependency 'webmock'
24
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vulndbhq
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.beta
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Daniel Martin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: faraday
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '0.8'
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.8'
30
+ - !ruby/object:Gem::Dependency
31
+ name: multi_json
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
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.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '0.8'
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: '0.8'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '2.8'
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.8'
78
+ - !ruby/object:Gem::Dependency
79
+ name: webmock
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: A Ruby wrapper for the VulnDB HQ API.
95
+ email:
96
+ - <daniel@securityroots.com>
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - .rspec
103
+ - .travis.yml
104
+ - Gemfile
105
+ - LICENSE
106
+ - README.md
107
+ - Rakefile
108
+ - lib/vulndbhq.rb
109
+ - lib/vulndbhq/base.rb
110
+ - lib/vulndbhq/client.rb
111
+ - lib/vulndbhq/configurable.rb
112
+ - lib/vulndbhq/default.rb
113
+ - lib/vulndbhq/identity_map.rb
114
+ - lib/vulndbhq/private_page.rb
115
+ - lib/vulndbhq/response/parse_json.rb
116
+ - lib/vulndbhq/version.rb
117
+ - spec/faraday_spec.rb
118
+ - spec/spec_helper.rb
119
+ - spec/support/webmock.rb
120
+ - spec/vulndbhq/base_spec.rb
121
+ - spec/vulndbhq/client_spec.rb
122
+ - spec/vulndbhq/private_page_spec.rb
123
+ - spec/vulndbhq_spec.rb
124
+ - vulndbhq.gemspec
125
+ homepage: http://vulndbhq.com
126
+ licenses: []
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ segments:
138
+ - 0
139
+ hash: -4202230674895239362
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ! '>'
144
+ - !ruby/object:Gem::Version
145
+ version: 1.3.1
146
+ requirements: []
147
+ rubyforge_project:
148
+ rubygems_version: 1.8.24
149
+ signing_key:
150
+ specification_version: 3
151
+ summary: VulnDB HQ API wrapper
152
+ test_files:
153
+ - spec/faraday_spec.rb
154
+ - spec/spec_helper.rb
155
+ - spec/support/webmock.rb
156
+ - spec/vulndbhq/base_spec.rb
157
+ - spec/vulndbhq/client_spec.rb
158
+ - spec/vulndbhq/private_page_spec.rb
159
+ - spec/vulndbhq_spec.rb