diff --git a/bin/cookie_extractor b/bin/cookie_extractor index 16b36a4..daacc64 100755 --- a/bin/cookie_extractor +++ b/bin/cookie_extractor @@ -2,10 +2,11 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "cookie_extractor")) -# TODO: detect firefox or chrome input file and/or locate it automatically +# TODO: Locate cookie dbs automatically filename = ARGV.first if filename - puts CookieExtractor::FirefoxCookieExtractor.new(filename).extract.join("\n") + extractor = CookieExtractor::BrowserDetector.new_extractor(filename) + puts extractor.extract.join("\n") else puts "Usage: cookie_extractor /path/to/cookies.sqlite" end diff --git a/lib/cookie_extractor.rb b/lib/cookie_extractor.rb index b9cd79e..8752ca1 100644 --- a/lib/cookie_extractor.rb +++ b/lib/cookie_extractor.rb @@ -2,6 +2,7 @@ require "cookie_extractor/version" require "cookie_extractor/common" require "cookie_extractor/firefox_cookie_extractor" require "cookie_extractor/chrome_cookie_extractor" +require "cookie_extractor/browser_detector" module CookieExtractor end diff --git a/lib/cookie_extractor/browser_detector.rb b/lib/cookie_extractor/browser_detector.rb new file mode 100644 index 0000000..48e870d --- /dev/null +++ b/lib/cookie_extractor/browser_detector.rb @@ -0,0 +1,29 @@ +module CookieExtractor + class BrowserDetector + + def self.new_extractor(db_filename) + browser = detect_browser(db_filename) + if browser + CookieExtractor.const_get("#{browser}CookieExtractor").new(db_filename) + else + raise "Could not detect browser type." + end + end + + def self.detect_browser(db_filename) + db = SQLite3::Database.new(db_filename) + browser = + if has_table?(db, 'moz_cookies') + 'Firefox' + elsif has_table?(db, 'cookies') + 'Chrome' + end + db.close + browser + end + + def self.has_table?(db, table_name) + db.table_info(table_name).size > 0 + end + end +end diff --git a/spec/browser_detector_spec.rb b/spec/browser_detector_spec.rb new file mode 100644 index 0000000..179cd5b --- /dev/null +++ b/spec/browser_detector_spec.rb @@ -0,0 +1,43 @@ +require File.join(File.dirname(__FILE__), "spec_helper") + +describe CookieExtractor::BrowserDetector, "determining the correct extractor to use" do + before :each do + @fake_cookie_db = double("cookie database", :close => true) + SQLite3::Database.should_receive(:new). + with('filename'). + and_return(@fake_cookie_db) + end + + describe "given a sqlite database with a 'moz_cookies' table" do + before :each do + @fake_cookie_db.should_receive(:table_info). + with("moz_cookies"). + and_return( + { 'name' => 'some_field', + 'type' => "some_type" }) + end + + it "should return a firefox extractor instance" do + extractor = CookieExtractor::BrowserDetector.new_extractor('filename') + extractor.instance_of?(CookieExtractor::FirefoxCookieExtractor).should be_true + end + end + + describe "given a sqlite database with a 'cookies' table" do + before :each do + @fake_cookie_db.should_receive(:table_info). + with("moz_cookies"). + and_return([]) + @fake_cookie_db.should_receive(:table_info). + with("cookies"). + and_return( + [{ 'name' => 'some_field', + 'type' => "some_type" }]) + end + + it "should return a chrome extractor instance" do + extractor = CookieExtractor::BrowserDetector.new_extractor('filename') + extractor.instance_of?(CookieExtractor::ChromeCookieExtractor).should be_true + end + end +end