cookie_extractor 0.1.0 → 0.2.0

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/README.md CHANGED
@@ -1,15 +1,26 @@
1
1
  cookie_extractor
2
2
  ----------------
3
3
 
4
- Extract cookies from Firefox sqlite cookie store (eventually Chrome also) into a wget-compatible cookies.txt file.
4
+ Extract cookies from Firefox, Chrome or Chromium sqlite cookie stores into a wget-compatible cookies.txt file.
5
5
 
6
6
  ### Install ###
7
7
 
8
- gem install cookie_extractor
8
+ gem install cookie_extractor
9
9
 
10
10
  ### Usage ###
11
11
 
12
- cookie_extractor /path/to/firefox/cookies.sqlite > cookies.txt
12
+ cookie_extractor /path/to/firefox/cookies.sqlite > cookies.txt
13
+
14
+ cookie_extractor --guess # Guess which browser to use and open corresponding file
15
+
16
+ cookie_extractor --browser chrome|chromium|firefox # Open corresponding DB
17
+
18
+
19
+ Typical locations for the cookies file on Linux are:
20
+
21
+ * Firefox: *~/.mozilla/firefox/(profile directory)/cookies.sqlite*
22
+ * Chrome: *~/.config/google-chrome/Default/Cookies*
23
+ * Chromium: *~/.config/chromium/Default/Cookies*
13
24
 
14
25
  ### License ###
15
26
 
data/bin/cookie_extractor CHANGED
@@ -2,22 +2,46 @@
2
2
 
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "cookie_extractor"))
4
4
 
5
- # TODO: Locate cookie dbs automatically
6
- filename = ARGV.first
7
- unless filename
8
- puts "Usage: (Firefox) cookie_extractor /path/to/cookies.sqlite"
9
- puts " (Chrome) cookie_extractor /path/to/Cookies"
5
+
6
+ def usage msg=nil
7
+ puts msg if msg
8
+ puts "Usage: cookie_extractor /path/to/cookies.sqlite Open a DB file"
9
+ puts " cookie_extractor --guess Guess which browser to use and open corresponding file"
10
+ puts " cookie_extractor --browser chrome|chromium|firefox Open DB corresponding to a particular browser"
10
11
  exit
11
12
  end
12
13
 
13
- if File.exists?(filename)
14
- begin
15
- extractor = CookieExtractor::BrowserDetector.new_extractor(filename)
16
- puts extractor.extract.join("\n")
17
- rescue SQLite3::NotADatabaseException,
18
- CookieExtractor::BrowserNotDetectedException
19
- puts "Error: File '#{filename}' is not a Firefox or Chrome cookie database"
20
- end
21
- else
22
- puts "Error: File '#{filename}' does not exist"
14
+
15
+ begin
16
+ extractor =
17
+ case ARGV.first
18
+ when '--guess', '-g'
19
+ begin
20
+ CookieExtractor::BrowserDetector.guess()
21
+ rescue CookieExtractor::NoCookieFileFoundException
22
+ abort "Error: we couldn't find any supported broswer's cookies"
23
+ end
24
+ when '--browser', '-b'
25
+ browser = ARGV[1]
26
+ usage "Error: Please supply a browser name" unless browser
27
+ begin
28
+ CookieExtractor::BrowserDetector.browser_extractor(browser)
29
+ rescue CookieExtractor::InvalidBrowserNameException
30
+ abort "Error: '#{browser}' is not a valid browser name"
31
+ rescue CookieExtractor::NoCookieFileFoundException
32
+ abort "Error: Could not locate cookie file for browser #{browser}"
33
+ end
34
+ when nil
35
+ usage
36
+ else
37
+ filename = ARGV.first
38
+ abort "Error: #{filename} does not exist" unless File.exists?(filename)
39
+ CookieExtractor::BrowserDetector.new_extractor(filename)
40
+ end
41
+ puts extractor.extract.join("\n")
42
+ rescue SQLite3::NotADatabaseException,
43
+ CookieExtractor::BrowserNotDetectedException
44
+ abort "Error: File '#{filename}' is not a Firefox or Chrome cookie database"
23
45
  end
46
+
47
+
@@ -1,7 +1,40 @@
1
1
  module CookieExtractor
2
2
  class BrowserNotDetectedException < Exception; end
3
+ class InvalidBrowserNameException < Exception; end
4
+ class NoCookieFileFoundException < Exception; end
3
5
 
4
6
  class BrowserDetector
7
+ COOKIE_LOCATIONS = {
8
+ "chrome" => "~/.config/google-chrome/Default/Cookies",
9
+ "chromium" => "~/.config/chromium/Default/Cookies",
10
+ "firefox" => "~/.mozilla/firefox/*.default/cookies.sqlite"
11
+ }
12
+
13
+ # Returns the extractor of the most recently used browser's cookies
14
+ # or raise NoCookieFileFoundException if there are no cookies
15
+ def self.guess
16
+ most_recently_used_detected_browsers.each { |browser, path|
17
+ begin
18
+ extractor = self.browser_extractor(browser)
19
+ rescue BrowserNotDetectedException, NoCookieFileFoundException
20
+ # better try the next one...
21
+ else
22
+ return extractor
23
+ end
24
+ }
25
+ # If we make it here, we've failed...
26
+ raise NoCookieFileFoundException, "Couldn't find any browser's cookies"
27
+ end
28
+
29
+ # Open a browser's cookie file using intelligent guesswork
30
+ def self.browser_extractor(browser)
31
+ raise InvalidBrowserNameException, "Browser must be one of: #{self.supported_browsers.join(', ')}" unless self.supported_browsers.include?(browser)
32
+ paths = Dir.glob(File.expand_path(COOKIE_LOCATIONS[browser]))
33
+ if paths.length < 1 or not File.exists?(paths.first)
34
+ raise NoCookieFileFoundException, "File #{paths.first} does not exist!"
35
+ end
36
+ self.new_extractor(paths.first)
37
+ end
5
38
 
6
39
  def self.new_extractor(db_filename)
7
40
  browser = detect_browser(db_filename)
@@ -12,6 +45,10 @@ module CookieExtractor
12
45
  end
13
46
  end
14
47
 
48
+ def self.supported_browsers
49
+ COOKIE_LOCATIONS.keys
50
+ end
51
+
15
52
  def self.detect_browser(db_filename)
16
53
  db = SQLite3::Database.new(db_filename)
17
54
  browser =
@@ -27,5 +64,15 @@ module CookieExtractor
27
64
  def self.has_table?(db, table_name)
28
65
  db.table_info(table_name).size > 0
29
66
  end
67
+
68
+ def self.most_recently_used_detected_browsers
69
+ COOKIE_LOCATIONS.select { |browser, path|
70
+ Dir.glob(File.expand_path(path)).any?
71
+ }.sort_by { |browser, path|
72
+ File.mtime(Dir.glob(File.expand_path(path)).first)
73
+ }.reverse
74
+ end
75
+
76
+ private_class_method :most_recently_used_detected_browsers
30
77
  end
31
78
  end
@@ -1,3 +1,3 @@
1
1
  module CookieExtractor
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,3 +1,6 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
1
4
  require "cookie_extractor/version"
2
5
  require "cookie_extractor/common"
3
6
  require "cookie_extractor/firefox_cookie_extractor"
@@ -41,3 +41,40 @@ describe CookieExtractor::BrowserDetector, "determining the correct extractor to
41
41
  end
42
42
  end
43
43
  end
44
+
45
+ describe CookieExtractor::BrowserDetector, "guessing the location of the cookie file" do
46
+ describe "when no cookie files are found in the standard locations" do
47
+ before :each do
48
+ Dir.stub!(:glob).and_return([])
49
+ end
50
+
51
+ it "should raise NoCookieFileFoundException" do
52
+ lambda { CookieExtractor::BrowserDetector.guess }.
53
+ should raise_error(CookieExtractor::NoCookieFileFoundException)
54
+ end
55
+ end
56
+
57
+ describe "when multiple cookie files are found in the standard locations" do
58
+ before :each do
59
+ cookie_locations = CookieExtractor::BrowserDetector::COOKIE_LOCATIONS
60
+ Dir.stub!(:glob).and_return([cookie_locations['chrome']],
61
+ [],
62
+ [cookie_locations['firefox']])
63
+ end
64
+
65
+ describe "and chrome was the most recently used" do
66
+ before :each do
67
+ File.should_receive(:mtime).twice.and_return(
68
+ Time.parse("July 2 2013 00:00:00"),
69
+ Time.parse("July 1 2013 00:00:00"))
70
+ end
71
+
72
+ it "should build a ChromeCookieExtractor" do
73
+ CookieExtractor::BrowserDetector.
74
+ should_receive(:browser_extractor).
75
+ once.with("chrome")
76
+ CookieExtractor::BrowserDetector.guess
77
+ end
78
+ end
79
+ end
80
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cookie_extractor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-23 00:00:00.000000000 Z
12
+ date: 2013-07-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &17748000 !ruby/object:Gem::Requirement
16
+ requirement: &16244180 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '2.8'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *17748000
24
+ version_requirements: *16244180
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sqlite3-ruby
27
- requirement: &17747360 !ruby/object:Gem::Requirement
27
+ requirement: &16243580 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '1.3'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *17747360
35
+ version_requirements: *16243580
36
36
  description: Extract cookies from Firefox, Chrome or Chromium sqlite databases into
37
37
  a wget-compatible cookies.txt file.
38
38
  email: