cryptkeeper 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cryptkeeper}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Adam Medeiros"]
12
- s.date = %q{2011-02-14}
12
+ s.date = %q{2011-02-15}
13
13
  s.description = %q{Use cryptkeeper to talk to Google Storage}
14
14
  s.email = %q{adammede@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  "cryptkeeper.gemspec",
23
23
  "lib/buckets.rb",
24
24
  "lib/crypt_keeper.rb",
25
+ "lib/crypt_keeper_http.rb",
25
26
  "lib/objects.rb"
26
27
  ]
27
28
  s.homepage = %q{http://github.com/adamthedeveloper/cryptkeeper}
@@ -1,52 +1,67 @@
1
+ require 'hpricot'
1
2
  module Buckets
2
3
  # GET Service
3
4
  # lists all of the buckets that you own
4
5
  # return an array of Bucket objects
5
6
  def buckets
6
- res = nil
7
- time = request_time
8
- Net::HTTP.start(@host[:address]) do |http|
9
-
10
- req = Net::HTTP::Get.new("/")
11
- req.add_field('Host', @host[:address])
12
- req.add_field('Date', time)
13
- req.add_field('Content-Length',0)
14
-
15
- sig = signature("GET\n\n\n#{time}\n/")
16
-
17
- req.add_field('Authorization', "#{@signature_id} #{@access_key}:#{sig}")
18
- res = http.request(req)
19
- end
20
-
21
- hpr = Hpricot(res.body)
22
- bucket_hashes = hpr.search("bucket").map do |el|
23
- {
24
- :name => el.search("name").inner_html,
25
- :created_at => el.search("creationdate").inner_html
7
+ Hpricot(CryptKeeper::Connection.http_instance.get("/")).search("bucket").map do |el|
8
+ hsh = {
9
+ :name => el.search("name").inner_html,
10
+ :created_at => el.search("creationdate").inner_html
26
11
  }
12
+ Bucket.new(hsh)
27
13
  end
28
-
29
- bucket_hashes.collect { |h| Bucket.new(h) }
30
14
  end
31
15
 
32
16
  # GET Bucket
33
17
  # lists the contents of a bucket or retrieves the ACLs that are
34
18
  # applied to a bucket.
35
- # return a Bucket object
36
- def bucket(*args)
19
+ # return an array of BucketObjects
20
+ def bucket_meta_objects(bucket_name, *args)
21
+ options = {
22
+ :delimeter => nil,
23
+ :marker => nil,
24
+ :max_keys => nil,
25
+ :prefix => nil
26
+ }
27
+ options.merge!(args.pop) if args.last.is_a? Hash
28
+
29
+ path = "/?"
30
+ path << "delimeter=#{options[:delimeter]}&" if !options[:delimeter].nil?
31
+ path << "marker=#{options[:marker]}&" if !options[:marker].nil?
32
+ path << "max-keys=#{options[:max_keys]}&" if !options[:max_keys].nil?
33
+ path << "prefix=#{options[:prefix]}&" if !options[:prefix].nil?
34
+ path.gsub!(/[&]$/, '')
37
35
 
36
+ hpr = Hpricot(CryptKeeper::Connection.http_instance.get(path, bucket_name))
37
+ obj_hashes = hpr.search("contents").map do |el|
38
+ {
39
+ :bucket_name => bucket_name,
40
+ :key => el.search("key").inner_html,
41
+ :last_modified => el.search("lastmodified").inner_html,
42
+ :e_tag => el.search("etag").inner_html,
43
+ :size => el.search("size").inner_html,
44
+ :storage_class => el.search("storageclass").inner_html,
45
+ :owner_id => el.search("id").inner_html,
46
+ :owner_display_name => el.search("displayname").inner_html
47
+ }
48
+ end
49
+ obj_hashes.map { |obj| BucketMetaObject.new(obj) }
38
50
  end
39
51
 
40
52
  def create_bucket(*args)
41
-
53
+
42
54
  end
43
55
 
56
+
57
+
44
58
  class Bucket
45
59
  attr_accessor :name, :created_at
60
+
46
61
  def initialize(*args)
47
62
  options = {}
48
63
  options.merge!(args.pop) if args.last.is_a? Hash
49
- @name = options[:name]
64
+ @name = options[:name]
50
65
  @created_at = options[:created_at]
51
66
  end
52
67
 
@@ -57,9 +72,32 @@ module Buckets
57
72
  def update(*args)
58
73
 
59
74
  end
75
+ end
76
+
77
+ class BucketMetaObject
78
+ attr_accessor :properties,
79
+ :key, :last_modified, :e_tag, :size, :storage_class,
80
+ :owner_id, :owner_display_name,
81
+ :bucket_name
82
+
83
+ def initialize(*args)
84
+ @properties = args.first
85
+ @bucket_name = @properties[:bucket_name]
86
+ @key = @properties[:key]
87
+ @last_modified = @properties[:last_modified]
88
+ @e_tag = @properties[:e_tag]
89
+ @size = @properties[:size]
90
+ @storage_class = @properties[:storage_class]
91
+ @owner_id = @properties[:owner_id]
92
+ @owner_display_name = @properties[:owner_display_name]
93
+ end
60
94
 
61
- def destroy
95
+ def object
96
+ @object ||= object!
97
+ end
62
98
 
99
+ def object!
100
+ CryptKeeper::Connection.http_instance.get("/#{URI.escape(@key)}", @bucket_name)
63
101
  end
64
102
  end
65
103
  end
@@ -1,47 +1,31 @@
1
- require Dir.pwd << '/lib/buckets.rb'
2
- require Dir.pwd << '/lib/objects.rb'
3
- require 'net/http'
4
- require 'iconv'
5
- require 'hmac-sha1'
6
- require 'base64'
1
+ ck_path = File.expand_path(File.dirname(__FILE__))
2
+ require ck_path + '/buckets.rb'
3
+ require ck_path + '/crypt_keeper_http.rb'
7
4
  require 'uri'
8
- require 'hpricot'
9
5
 
10
6
  module CryptKeeper
11
- VERSION = "0.2.1"
7
+ VERSION = "0.2.2"
12
8
  class Connection
9
+ @@http_instance = nil
10
+ def self.http_instance
11
+ @@http_instance
12
+ end
13
13
  def initialize(*args)
14
14
  options = {
15
15
  :signature_identifier => "GOOG1",
16
- :host => "commondatastorage.googleapis.com",
17
- :port => "80"
16
+ :host => "commondatastorage.googleapis.com",
17
+ :port => "80"
18
18
  }
19
19
 
20
20
  options.merge!(args.pop) if args.last.kind_of? Hash
21
-
22
- @access_key = options[:access_key]
23
- @secret_key = options[:secret_key]
21
+ @host = options[:host]
22
+ @access_key = options[:access_key]
23
+ @secret_key = options[:secret_key]
24
24
  @signature_id = options[:signature_identifier]
25
- @host = {
26
- :address => options[:host],
27
- :port => options[:port]
28
- }
29
- @ic_utf8 = Iconv.new('ascii//TRANSLIT//IGNORE', 'UTF-8')
30
- end
31
-
32
- def signature(message)
33
- utf8_message = @ic_utf8.iconv(message)
34
- utf8_key = @ic_utf8.iconv(@secret_key)
35
- sha1 = HMAC::SHA1.digest(utf8_key, utf8_message)
36
- Base64.encode64(sha1).strip
37
- end
38
-
39
- def request_time
40
- Time.now.strftime("%a, %d %b %Y %H:%M:%S %z")
25
+ @@http_instance = CryptKeeperHttp.new(@host, @access_key, @secret_key, @signature_id)
41
26
  end
42
27
 
43
28
  include Buckets
44
- include Objects
45
29
  end
46
30
 
47
31
  end
@@ -0,0 +1,43 @@
1
+ require 'net/http'
2
+ require 'iconv'
3
+ require 'hmac-sha1'
4
+ require 'base64'
5
+ class CryptKeeperHttp
6
+ def initialize(address, access_key, secret_key, signature_id)
7
+ @address = address
8
+ @access_key = access_key
9
+ @secret_key = secret_key
10
+ @signature_id = signature_id
11
+ end
12
+
13
+ def signature(message)
14
+ ic_utf8 = Iconv.new('ascii//TRANSLIT//IGNORE', 'UTF-8')
15
+ utf8_message = ic_utf8.iconv(message)
16
+ utf8_key = ic_utf8.iconv(@secret_key)
17
+ sha1 = HMAC::SHA1.digest(utf8_key, utf8_message)
18
+ Base64.encode64(sha1).strip
19
+ end
20
+
21
+ def get(path, bucket_name='', additional_headers={})
22
+ bucket_name = "#{bucket_name}." if !bucket_name.empty?
23
+ res = nil
24
+ time = Time.now.strftime("%a, %d %b %Y %H:%M:%S %z")
25
+ Net::HTTP.start(@address) do |http|
26
+
27
+ req = Net::HTTP::Get.new(path)
28
+ req.add_field('Host', "#{bucket_name}#{@address}")
29
+
30
+ if !additional_headers.empty?
31
+ additional_headers.each { |k, v| req.add_field(k, v) }
32
+ end
33
+
34
+ req.add_field('Date', time)
35
+ req.add_field('Content-Length', 0)
36
+ sig = signature("GET\n\n\n#{time}\n#{!bucket_name.empty? ? "/#{bucket_name.gsub(/[\.]$/, path.gsub(/\?.*$/,''))}" : "/"}")
37
+ req.add_field('Authorization', "#{@signature_id} #{@access_key}:#{sig}")
38
+ res = http.request(req)
39
+ end
40
+ return res.body if res
41
+ nil
42
+ end
43
+ end
@@ -1,3 +0,0 @@
1
- module Objects
2
-
3
- end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 1
9
- version: 0.2.1
8
+ - 2
9
+ version: 0.2.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Adam Medeiros
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-02-14 00:00:00 -08:00
17
+ date: 2011-02-15 00:00:00 -08:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -71,6 +71,7 @@ files:
71
71
  - cryptkeeper.gemspec
72
72
  - lib/buckets.rb
73
73
  - lib/crypt_keeper.rb
74
+ - lib/crypt_keeper_http.rb
74
75
  - lib/objects.rb
75
76
  has_rdoc: true
76
77
  homepage: http://github.com/adamthedeveloper/cryptkeeper