cookie_extractor 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/cookie_extractor CHANGED
@@ -2,10 +2,22 @@
2
2
 
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "cookie_extractor"))
4
4
 
5
- # TODO: detect firefox or chrome input file and/or locate it automatically
5
+ # TODO: Locate cookie dbs automatically
6
6
  filename = ARGV.first
7
- if filename
8
- puts CookieExtractor::FirefoxCookieExtractor.new(filename).extract.join("\n")
7
+ unless filename
8
+ puts "Usage: (Firefox) cookie_extractor /path/to/cookies.sqlite"
9
+ puts " (Chrome) cookie_extractor /path/to/Cookies"
10
+ exit
11
+ end
12
+
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
9
21
  else
10
- puts "Usage: cookie_extractor /path/to/cookies.sqlite"
22
+ puts "Error: File '#{filename}' does not exist"
11
23
  end
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Jeff Dallien"]
9
9
  s.email = ["jeff@dallien.net"]
10
10
  s.homepage = "http://github.com/jdallien/cookie_extractor"
11
- s.summary = %q{Create cookies.txt from Firefox cookies}
12
- s.description = %q{Extract cookies from Firefox sqlite databases into a wget-compatible cookies.txt file.}
11
+ s.summary = %q{Create cookies.txt from Firefox or Chrome/Chromium cookies}
12
+ s.description = %q{Extract cookies from Firefox, Chrome or Chromium sqlite databases into a wget-compatible cookies.txt file.}
13
13
 
14
14
  s.rubyforge_project = "cookie_extractor"
15
15
 
@@ -18,6 +18,6 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_development_dependency "rspec"
22
- s.add_runtime_dependency "sqlite3-ruby"
21
+ s.add_development_dependency "rspec", "~> 2.8"
22
+ s.add_runtime_dependency "sqlite3-ruby", "~> 1.3"
23
23
  end
@@ -0,0 +1,31 @@
1
+ module CookieExtractor
2
+ class BrowserNotDetectedException < Exception; end
3
+
4
+ class BrowserDetector
5
+
6
+ def self.new_extractor(db_filename)
7
+ browser = detect_browser(db_filename)
8
+ if browser
9
+ CookieExtractor.const_get("#{browser}CookieExtractor").new(db_filename)
10
+ else
11
+ raise BrowserNotDetectedException, "Could not detect browser type."
12
+ end
13
+ end
14
+
15
+ def self.detect_browser(db_filename)
16
+ db = SQLite3::Database.new(db_filename)
17
+ browser =
18
+ if has_table?(db, 'moz_cookies')
19
+ 'Firefox'
20
+ elsif has_table?(db, 'cookies')
21
+ 'Chrome'
22
+ end
23
+ db.close
24
+ browser
25
+ end
26
+
27
+ def self.has_table?(db, table_name)
28
+ db.table_info(table_name).size > 0
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ require 'sqlite3'
2
+
3
+ module CookieExtractor
4
+ class ChromeCookieExtractor
5
+ include Common
6
+
7
+ def initialize(cookie_file)
8
+ @cookie_file = cookie_file
9
+ end
10
+
11
+ def extract
12
+ db = SQLite3::Database.new @cookie_file
13
+ db.results_as_hash = true
14
+ result = []
15
+ db.execute("SELECT * FROM cookies") do |row|
16
+ result << [ row['host_key'],
17
+ true_false_word(is_domain_wide(row['host_key'])),
18
+ row['path'],
19
+ true_false_word(row['secure']),
20
+ row['expires_utc'],
21
+ row['name'],
22
+ row['value']
23
+ ].join("\t")
24
+ end
25
+ db.close
26
+ result
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ module CookieExtractor
2
+ module Common
3
+ private
4
+
5
+ def is_domain_wide(hostname)
6
+ hostname[0..0] == "."
7
+ end
8
+
9
+ def true_false_word(value)
10
+ if value == "1" || value == 1 || value == true
11
+ "TRUE"
12
+ elsif value == "0" || value == 0 || value == false
13
+ "FALSE"
14
+ else
15
+ raise "Invalid value passed to true_false_word: #{value.inspect}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -2,6 +2,7 @@ require 'sqlite3'
2
2
 
3
3
  module CookieExtractor
4
4
  class FirefoxCookieExtractor
5
+ include Common
5
6
 
6
7
  def initialize(cookie_file)
7
8
  @cookie_file = cookie_file
@@ -10,9 +11,9 @@ module CookieExtractor
10
11
  def extract
11
12
  db = SQLite3::Database.new @cookie_file
12
13
  db.results_as_hash = true
13
- @result = []
14
+ result = []
14
15
  db.execute("SELECT * FROM moz_cookies") do |row|
15
- @result << [ row['host'],
16
+ result << [ row['host'],
16
17
  true_false_word(is_domain_wide(row['host'])),
17
18
  row['path'],
18
19
  true_false_word(row['isSecure']),
@@ -21,23 +22,8 @@ module CookieExtractor
21
22
  row['value']
22
23
  ].join("\t")
23
24
  end
24
- @result
25
- end
26
-
27
- private
28
-
29
- def is_domain_wide(hostname)
30
- hostname[0..0] == "."
31
- end
32
-
33
- def true_false_word(value)
34
- if value == "1" || value == 1 || value == true
35
- "TRUE"
36
- elsif value == "0" || value == 0 || value == false
37
- "FALSE"
38
- else
39
- raise "Invalid value passed to true_false_word: #{value.inspect}"
40
- end
25
+ db.close
26
+ result
41
27
  end
42
28
  end
43
29
  end
@@ -1,3 +1,3 @@
1
1
  module CookieExtractor
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1,5 +1,8 @@
1
1
  require "cookie_extractor/version"
2
+ require "cookie_extractor/common"
2
3
  require "cookie_extractor/firefox_cookie_extractor"
4
+ require "cookie_extractor/chrome_cookie_extractor"
5
+ require "cookie_extractor/browser_detector"
3
6
 
4
7
  module CookieExtractor
5
8
  end
@@ -0,0 +1,43 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe CookieExtractor::BrowserDetector, "determining the correct extractor to use" do
4
+ before :each do
5
+ @fake_cookie_db = double("cookie database", :close => true)
6
+ SQLite3::Database.should_receive(:new).
7
+ with('filename').
8
+ and_return(@fake_cookie_db)
9
+ end
10
+
11
+ describe "given a sqlite database with a 'moz_cookies' table" do
12
+ before :each do
13
+ @fake_cookie_db.should_receive(:table_info).
14
+ with("moz_cookies").
15
+ and_return(
16
+ { 'name' => 'some_field',
17
+ 'type' => "some_type" })
18
+ end
19
+
20
+ it "should return a firefox extractor instance" do
21
+ extractor = CookieExtractor::BrowserDetector.new_extractor('filename')
22
+ extractor.instance_of?(CookieExtractor::FirefoxCookieExtractor).should be_true
23
+ end
24
+ end
25
+
26
+ describe "given a sqlite database with a 'cookies' table" do
27
+ before :each do
28
+ @fake_cookie_db.should_receive(:table_info).
29
+ with("moz_cookies").
30
+ and_return([])
31
+ @fake_cookie_db.should_receive(:table_info).
32
+ with("cookies").
33
+ and_return(
34
+ [{ 'name' => 'some_field',
35
+ 'type' => "some_type" }])
36
+ end
37
+
38
+ it "should return a chrome extractor instance" do
39
+ extractor = CookieExtractor::BrowserDetector.new_extractor('filename')
40
+ extractor.instance_of?(CookieExtractor::ChromeCookieExtractor).should be_true
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,126 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe CookieExtractor::ChromeCookieExtractor do
4
+ before :each do
5
+ @fake_cookie_db = double("cookie database",
6
+ :results_as_hash= => true,
7
+ :close => true)
8
+ SQLite3::Database.should_receive(:new).
9
+ with('filename').
10
+ and_return(@fake_cookie_db)
11
+ end
12
+
13
+ describe "opening and closing a sqlite db" do
14
+ before :each do
15
+ @fake_cookie_db.should_receive(:execute).and_yield(
16
+ { 'host_key' => '.dallien.net',
17
+ 'path' => '/',
18
+ 'secure' => '0',
19
+ 'expires_utc' => '1234567890',
20
+ 'name' => 'NAME',
21
+ 'value' => 'VALUE'})
22
+ @extractor = CookieExtractor::ChromeCookieExtractor.new('filename')
23
+ end
24
+
25
+ it "should close the db when finished" do
26
+ @fake_cookie_db.should_receive(:close)
27
+ @extractor.extract
28
+ end
29
+ end
30
+
31
+ describe "with a cookie that has a host starting with a dot" do
32
+ before :each do
33
+ @fake_cookie_db.should_receive(:execute).and_yield(
34
+ { 'host_key' => '.dallien.net',
35
+ 'path' => '/',
36
+ 'secure' => '0',
37
+ 'expires_utc' => '1234567890',
38
+ 'name' => 'NAME',
39
+ 'value' => 'VALUE'})
40
+ @extractor = CookieExtractor::ChromeCookieExtractor.new('filename')
41
+ @result = @extractor.extract
42
+ end
43
+
44
+ it "should return one cookie string" do
45
+ @result.size.should == 1
46
+ end
47
+
48
+ it "should put TRUE in the domain wide field" do
49
+ cookie_string = @result.first
50
+ cookie_string.split("\t")[1].should == "TRUE"
51
+ end
52
+
53
+ it "should build the correct cookie string" do
54
+ cookie_string = @result.first
55
+ cookie_string.should ==
56
+ ".dallien.net\tTRUE\t/\tFALSE\t1234567890\tNAME\tVALUE"
57
+ end
58
+ end
59
+
60
+ describe "with a cookie that has a host not starting with a dot" do
61
+ before :each do
62
+ @fake_cookie_db.should_receive(:execute).and_yield(
63
+ { 'host_key' => 'jeff.dallien.net',
64
+ 'path' => '/path',
65
+ 'secure' => '1',
66
+ 'expires_utc' => '1234567890',
67
+ 'name' => 'NAME',
68
+ 'value' => 'VALUE'})
69
+ @extractor = CookieExtractor::ChromeCookieExtractor.new('filename')
70
+ @result = @extractor.extract
71
+ end
72
+
73
+ it "should return one cookie string" do
74
+ @result.size.should == 1
75
+ end
76
+
77
+ it "should put FALSE in the domain wide field" do
78
+ cookie_string = @result.first
79
+ cookie_string.split("\t")[1].should == "FALSE"
80
+ end
81
+
82
+ it "should build the correct cookie string" do
83
+ cookie_string = @result.first
84
+ cookie_string.should ==
85
+ "jeff.dallien.net\tFALSE\t/path\tTRUE\t1234567890\tNAME\tVALUE"
86
+ end
87
+ end
88
+
89
+ describe "with a cookie that is not marked as secure" do
90
+ before :each do
91
+ @fake_cookie_db.should_receive(:execute).and_yield(
92
+ { 'host_key' => '.dallien.net',
93
+ 'path' => '/',
94
+ 'secure' => '0',
95
+ 'expires_utc' => '1234567890',
96
+ 'name' => 'NAME',
97
+ 'value' => 'VALUE'})
98
+ @extractor = CookieExtractor::ChromeCookieExtractor.new('filename')
99
+ @result = @extractor.extract
100
+ end
101
+
102
+ it "should put FALSE in the secure field" do
103
+ cookie_string = @result.first
104
+ cookie_string.split("\t")[3].should == "FALSE"
105
+ end
106
+ end
107
+
108
+ describe "with a cookie that is marked as secure" do
109
+ before :each do
110
+ @fake_cookie_db.should_receive(:execute).and_yield(
111
+ { 'host_key' => '.dallien.net',
112
+ 'path' => '/',
113
+ 'secure' => '1',
114
+ 'expires_utc' => '1234567890',
115
+ 'name' => 'NAME',
116
+ 'value' => 'VALUE'})
117
+ @extractor = CookieExtractor::ChromeCookieExtractor.new('filename')
118
+ @result = @extractor.extract
119
+ end
120
+
121
+ it "should put TRUE in the secure field" do
122
+ cookie_string = @result.first
123
+ cookie_string.split("\t")[3].should == "TRUE"
124
+ end
125
+ end
126
+ end
@@ -2,12 +2,32 @@ require File.join(File.dirname(__FILE__), "spec_helper")
2
2
 
3
3
  describe CookieExtractor::FirefoxCookieExtractor do
4
4
  before :each do
5
- @fake_cookie_db = double("cookie database", :results_as_hash= => true)
5
+ @fake_cookie_db = double("cookie database",
6
+ :results_as_hash= => true,
7
+ :close => true)
6
8
  SQLite3::Database.should_receive(:new).
7
9
  with('filename').
8
10
  and_return(@fake_cookie_db)
9
11
  end
10
12
 
13
+ describe "opening and closing a sqlite db" do
14
+ before :each do
15
+ @fake_cookie_db.should_receive(:execute).and_yield(
16
+ {'host' => '.dallien.net',
17
+ 'path' => '/',
18
+ 'isSecure' => '0',
19
+ 'expiry' => '1234567890',
20
+ 'name' => 'NAME',
21
+ 'value' => 'VALUE'})
22
+ @extractor = CookieExtractor::FirefoxCookieExtractor.new('filename')
23
+ end
24
+
25
+ it "should close the db when finished" do
26
+ @fake_cookie_db.should_receive(:close)
27
+ @extractor.extract
28
+ end
29
+ end
30
+
11
31
  describe "with a cookie that has a host starting with a dot" do
12
32
  before :each do
13
33
  @fake_cookie_db.should_receive(:execute).and_yield(
metadata CHANGED
@@ -1,61 +1,47 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: cookie_extractor
3
- version: !ruby/object:Gem::Version
4
- hash: 29
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Jeff Dallien
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-02-20 00:00:00 -05:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2012-02-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: rspec
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &17748000 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.8'
33
22
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: sqlite3-ruby
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *17748000
25
+ - !ruby/object:Gem::Dependency
26
+ name: sqlite3-ruby
27
+ requirement: &17747360 !ruby/object:Gem::Requirement
39
28
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '1.3'
47
33
  type: :runtime
48
- version_requirements: *id002
49
- description: Extract cookies from Firefox sqlite databases into a wget-compatible cookies.txt file.
50
- email:
34
+ prerelease: false
35
+ version_requirements: *17747360
36
+ description: Extract cookies from Firefox, Chrome or Chromium sqlite databases into
37
+ a wget-compatible cookies.txt file.
38
+ email:
51
39
  - jeff@dallien.net
52
- executables:
40
+ executables:
53
41
  - cookie_extractor
54
42
  extensions: []
55
-
56
43
  extra_rdoc_files: []
57
-
58
- files:
44
+ files:
59
45
  - .gitignore
60
46
  - .rvmrc
61
47
  - Gemfile
@@ -65,44 +51,38 @@ files:
65
51
  - bin/cookie_extractor
66
52
  - cookie_extractor.gemspec
67
53
  - lib/cookie_extractor.rb
54
+ - lib/cookie_extractor/browser_detector.rb
55
+ - lib/cookie_extractor/chrome_cookie_extractor.rb
56
+ - lib/cookie_extractor/common.rb
68
57
  - lib/cookie_extractor/firefox_cookie_extractor.rb
69
58
  - lib/cookie_extractor/version.rb
59
+ - spec/browser_detector_spec.rb
60
+ - spec/chrome_cookie_extractor_spec.rb
70
61
  - spec/cookie_extractor_spec.rb
71
62
  - spec/firefox_cookie_extractor_spec.rb
72
63
  - spec/spec_helper.rb
73
- has_rdoc: true
74
64
  homepage: http://github.com/jdallien/cookie_extractor
75
65
  licenses: []
76
-
77
66
  post_install_message:
78
67
  rdoc_options: []
79
-
80
- require_paths:
68
+ require_paths:
81
69
  - lib
82
- required_ruby_version: !ruby/object:Gem::Requirement
70
+ required_ruby_version: !ruby/object:Gem::Requirement
83
71
  none: false
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- hash: 3
88
- segments:
89
- - 0
90
- version: "0"
91
- required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
77
  none: false
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- hash: 3
97
- segments:
98
- - 0
99
- version: "0"
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
100
82
  requirements: []
101
-
102
83
  rubyforge_project: cookie_extractor
103
- rubygems_version: 1.4.2
84
+ rubygems_version: 1.8.6
104
85
  signing_key:
105
86
  specification_version: 3
106
- summary: Create cookies.txt from Firefox cookies
87
+ summary: Create cookies.txt from Firefox or Chrome/Chromium cookies
107
88
  test_files: []
108
-