ruby-keychain 0.1.1 → 0.1.2

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6e04321838eb56846f4466e1445a61fc151e0277
4
+ data.tar.gz: e72847b0ff4e7ae119c5c28f73f3fa572fcc36b0
5
+ SHA512:
6
+ metadata.gz: cdaddc9163798d7310dbb46112f5b70840243c16d1635736a4b7b15f0f9ee16166e72cce2cb2bbd6028e0be6b2d859f4aa61f4f5a8dfddf7443eeac6c1124a3a
7
+ data.tar.gz: 62e46ccd6d53e9d9e5b9f87b8818c25ac447d324086ee6435545281dc66138f5c7c3c545e8c37d5d4dff829c7fbcb3234ade5c13091457f26a93f6e049595598
data/README.markdown CHANGED
@@ -1,4 +1,4 @@
1
- # @markup markdown
1
+ [![Build Status](https://travis-ci.org/fcheung/keychain.png)](https://travis-ci.org/fcheung/keychain)
2
2
 
3
3
  A set of ruby bindings for the OS X keychain, written using ffi
4
4
 
data/lib/keychain.rb CHANGED
@@ -54,6 +54,7 @@ module Keychain
54
54
  # @param [String] path Path to the keychain file
55
55
  # @return [Keychain::Keychain] a keychain object
56
56
  def open(path)
57
+ raise ArgumentError unless path
57
58
  out_buffer = FFI::MemoryPointer.new(:pointer)
58
59
  status = Sec.SecKeychainOpen(path,out_buffer);
59
60
  Sec.check_osstatus(status)
data/lib/keychain/item.rb CHANGED
@@ -85,6 +85,7 @@ class Keychain::Item < Sec::Base
85
85
  return @unsaved_password if @unsaved_password
86
86
  out_buffer = FFI::MemoryPointer.new(:pointer)
87
87
  status = Sec.SecItemCopyMatching({Sec::Query::ITEM_LIST => CF::Array.immutable([self]),
88
+ Sec::Query::SEARCH_LIST => [self.keychain],
88
89
  Sec::Query::CLASS => klass,
89
90
  Sec::Query::RETURN_DATA => true}.to_cf, out_buffer)
90
91
  Sec.check_osstatus(status)
@@ -131,7 +132,7 @@ class Keychain::Item < Sec::Base
131
132
  end
132
133
 
133
134
  def update
134
- status = Sec.SecItemUpdate({Sec::Query::ITEM_LIST => [self], Sec::INVERSE_ATTR_MAP[:klass] => klass}.to_cf, build_new_attributes);
135
+ status = Sec.SecItemUpdate({Sec::Query::SEARCH_LIST => [self.keychain], Sec::Query::ITEM_LIST => [self], Sec::INVERSE_ATTR_MAP[:klass] => klass}.to_cf, build_new_attributes);
135
136
  Sec.check_osstatus(status)
136
137
 
137
138
  result = FFI::MemoryPointer.new :pointer
@@ -167,6 +168,7 @@ class Keychain::Item < Sec::Base
167
168
 
168
169
  def build_refresh_query
169
170
  query = CF::Dictionary.mutable
171
+ query[Sec::Query::SEARCH_LIST] = CF::Array.immutable([self.keychain])
170
172
  query[Sec::Query::ITEM_LIST] = CF::Array.immutable([self])
171
173
  query[Sec::Query::RETURN_ATTRIBUTES] = CF::Boolean::TRUE
172
174
  query[Sec::Query::RETURN_REF] = CF::Boolean::TRUE
@@ -8,6 +8,9 @@ module Sec
8
8
  attach_function 'SecKeychainCreate', [:string, :uint32, :pointer, :char, :pointer, :pointer], :osstatus
9
9
  attach_function 'SecItemCopyMatching', [:pointer, :pointer], :osstatus
10
10
 
11
+ attach_function 'SecKeychainSetSearchList', [:pointer], :osstatus
12
+ attach_function 'SecKeychainCopySearchList', [:pointer], :osstatus
13
+
11
14
  #@private
12
15
  class KeychainSettings < FFI::Struct
13
16
  layout :version, :uint32,
@@ -40,6 +43,19 @@ module Keychain
40
43
  class Keychain < Sec::Base
41
44
  register_type 'SecKeychain'
42
45
 
46
+ # Add the keychain to the default searchlist
47
+ #
48
+ #
49
+ def add_to_search_list
50
+ list = FFI::MemoryPointer.new(:pointer)
51
+ status = Sec.SecKeychainCopySearchList(list)
52
+ Sec.check_osstatus(status)
53
+ ruby_list = CF::Base.typecast(list.read_pointer).to_ruby
54
+ ruby_list << self unless ruby_list.include?(self)
55
+ status = Sec.SecKeychainSetSearchList(CF::Array.immutable(ruby_list))
56
+ Sec.check_osstatus(status)
57
+ self
58
+ end
43
59
  # Returns whether the keychain will be locked if the machine goes to sleep
44
60
  #
45
61
  # @return [Boolean]
@@ -1,4 +1,4 @@
1
1
  module Keychain
2
2
  # The current version string
3
- VERSION = '0.1.1'
3
+ VERSION = '0.1.2'
4
4
  end
@@ -26,6 +26,10 @@ describe Keychain do
26
26
  keychain = Keychain.open(File.join(ENV['HOME'], 'Library','Keychains', 'login.keychain'))
27
27
  keychain.path.should == Keychain.default.path
28
28
  end
29
+
30
+ it 'should raise when passed a nil path' do
31
+ expect {Keychain.open(nil)}.to raise_error(ArgumentError)
32
+ end
29
33
  end
30
34
 
31
35
  describe 'create' do
@@ -106,10 +110,9 @@ describe Keychain do
106
110
  shared_examples_for 'item collection' do
107
111
 
108
112
  before(:each) do
109
- @keychain_1 = Keychain.create(File.join(Dir.tmpdir, "other_keychain_spec_#{Time.now.to_i}_#{Time.now.usec}_#{rand(1000)}.keychain"), 'pass')
110
- @keychain_2 = Keychain.create(File.join(Dir.tmpdir, "keychain_2_#{Time.now.to_i}_#{Time.now.usec}_#{rand(1000)}.keychain"), 'pass')
111
- @keychain_3 = Keychain.create(File.join(Dir.tmpdir, "keychain_3_#{Time.now.to_i}_#{Time.now.usec}_#{rand(1000)}.keychain"), 'pass')
112
-
113
+ @keychain_1 = Keychain.create(File.join(Dir.tmpdir, "other_keychain_spec_#{Time.now.to_i}_#{Time.now.usec}_#{rand(1000)}.keychain"), 'pass').add_to_search_list
114
+ @keychain_2 = Keychain.create(File.join(Dir.tmpdir, "keychain_2_#{Time.now.to_i}_#{Time.now.usec}_#{rand(1000)}.keychain"), 'pass').add_to_search_list
115
+ @keychain_3 = Keychain.create(File.join(Dir.tmpdir, "keychain_3_#{Time.now.to_i}_#{Time.now.usec}_#{rand(1000)}.keychain"), 'pass').add_to_search_list
113
116
  add_fixtures
114
117
  end
115
118
 
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-keychain
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
5
- prerelease:
4
+ version: 0.1.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Frederick Cheung
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-11-21 00:00:00.000000000 Z
11
+ date: 2013-11-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: ffi
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: corefoundation
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,52 +55,46 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rake
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: yard
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: redcarpet
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
- description: ! 'Ruby wrapper for OS X''s keychain '
97
+ description: 'Ruby wrapper for OS X''s keychain '
111
98
  email: frederick.cheung@gmail.com
112
99
  executables: []
113
100
  extensions: []
@@ -129,27 +116,26 @@ files:
129
116
  homepage: http://github.com/fcheung/keychain
130
117
  licenses:
131
118
  - MIT
119
+ metadata: {}
132
120
  post_install_message:
133
121
  rdoc_options: []
134
122
  require_paths:
135
123
  - lib
136
124
  required_ruby_version: !ruby/object:Gem::Requirement
137
- none: false
138
125
  requirements:
139
- - - ! '>='
126
+ - - '>='
140
127
  - !ruby/object:Gem::Version
141
128
  version: 1.9.2
142
129
  required_rubygems_version: !ruby/object:Gem::Requirement
143
- none: false
144
130
  requirements:
145
- - - ! '>='
131
+ - - '>='
146
132
  - !ruby/object:Gem::Version
147
133
  version: '0'
148
134
  requirements: []
149
135
  rubyforge_project:
150
- rubygems_version: 1.8.24
136
+ rubygems_version: 2.1.9
151
137
  signing_key:
152
- specification_version: 3
138
+ specification_version: 4
153
139
  summary: Ruby wrapper for OS X's keychain
154
140
  test_files: []
155
141
  has_rdoc: