yakg 0.0.1 → 0.0.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.
Files changed (4) hide show
  1. data/Gemfile.lock +3 -3
  2. data/README.md +99 -0
  3. data/VERSION +1 -1
  4. metadata +91 -93
data/Gemfile.lock CHANGED
@@ -1,6 +1,6 @@
1
1
  GIT
2
2
  remote: https://github.com/tmaher/corefoundation.git
3
- revision: 73a97c6e7d268d21d17f671c94e98185153c5e3f
3
+ revision: e4cb21a7985577c44cd0aa8f9f17e9b6b6e09141
4
4
  specs:
5
5
  corefoundation (0.1.4)
6
6
  ffi
@@ -8,7 +8,7 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- yakg (0.0.1)
11
+ yakg (0.0.2)
12
12
  corefoundation
13
13
  ffi
14
14
 
@@ -24,7 +24,7 @@ GEM
24
24
  rspec-core (~> 2.12.0)
25
25
  rspec-expectations (~> 2.12.0)
26
26
  rspec-mocks (~> 2.12.0)
27
- rspec-core (2.12.0)
27
+ rspec-core (2.12.1)
28
28
  rspec-expectations (2.12.0)
29
29
  diff-lcs (~> 1.1.3)
30
30
  rspec-mocks (2.12.0)
data/README.md ADDED
@@ -0,0 +1,99 @@
1
+ Yet Another Keyring Gem
2
+ =======================
3
+
4
+ Storing passwords in plaintext makes me a sad panda. Let's use Apple's
5
+ Keychain utility!
6
+
7
+ ```
8
+ tmaher@bananaweizen:~$ irb
9
+ irb(main):001:0> require 'yakg'
10
+ => true
11
+ irb(main):002:0> Yakg.set "someuser", "s3|<r1+"
12
+ => true
13
+ irb(main):003:0> Yakg.get "someuser"
14
+ => "s3|<r1+"
15
+ irb(main):004:0> Yakg.unset "someuser"
16
+ => true
17
+ irb(main):005:0> Yakg.get "someuser"
18
+ => nil
19
+ irb(main):006:0> Yakg.set "user1", "password1"
20
+ => true
21
+ irb(main):007:0> Yakg.set "user2", "2password"
22
+ => true
23
+ irb(main):008:0> Yakg.list
24
+ => ["user1", "user2"]
25
+ ```
26
+
27
+ In addition to usernames, Keychain also has the notion of "service
28
+ name". It's a free-form string, useful for namespacing different
29
+ accounts. Let's take a look...
30
+
31
+ ```
32
+ rb(main):009:0> Yakg.DEFAULT_SERVICE_NAME
33
+ => "ruby-yakg-gem"
34
+ irb(main):010:0> Yakg.DEFAULT_SERVICE_NAME = "awesome other service"
35
+ => "awesome other service"
36
+ irb(main):011:0> Yakg.list
37
+ => []
38
+ irb(main):012:0> Yakg.set "user1", "kitties!"
39
+ => true
40
+ irb(main):013:0> Yakg.set "harry.bovik", "dogs"
41
+ => true
42
+ irb(main):014:0> Yakg.list
43
+ => ["user1", "harry.bovik"]
44
+ irb(main):015:0> Yakg.list "ruby-yakg-gem"
45
+ => ["user1", "user2"]
46
+ irb(main):016:0> Yakg.get "user1", "ruby-yakg-gem"
47
+ => "password1"
48
+ irb(main):017:0> Yakg.get "user1"
49
+ => "kitties!"
50
+ irb(main):018:0> ^D
51
+ tmaher@bananaweizen:~$ irb
52
+ irb(main):001:0> require 'yakg'
53
+ => true
54
+ irb(main):002:0> Yakg.list
55
+ => ["user1", "user2"]
56
+ irb(main):003:0> Yakg.list "awesome other service"
57
+ => ["user1", "harry.bovik"]
58
+ irb(main):004:0> Yakg.list
59
+ => ["user1", "user2"]
60
+ irb(main):005:0> Yakg.unset "user1"
61
+ => true
62
+ irb(main):006:0> Yakg.list
63
+ => ["user2"]
64
+ irb(main):007:0> Yakg.list "awesome other service"
65
+ => ["user1", "harry.bovik"]
66
+ ```
67
+
68
+ Technical Details
69
+ =================
70
+
71
+ This gem wrapps Apple's Security Framework (a C library) using the
72
+ excellent `ffi` gem. References for the full Keychain Services API can
73
+ be found at
74
+ https://developer.apple.com/library/mac/#documentation/security/Reference/keychainservices/Reference/reference.html
75
+
76
+ My views on the virtues of wrapping Security Framework and calling it
77
+ from the Ruby process, as opposed to use of helper programs such as
78
+ `git-password`, can be found at https://gist.github.com/4116645
79
+
80
+
81
+ Related Work
82
+ ============
83
+
84
+ * https://github.com/xli/mac-keychain also wraps Security Framework
85
+ but with RubyCocoa. That makes it more difficult to use with local
86
+ Ruby builds
87
+
88
+ * https://github.com/seattlerb/osx_keychain uses RubyInline to call
89
+ into the underlying C library. That necessitates a C compiler.
90
+
91
+ * https://github.com/jprichardson/keychain_manager shells out to call
92
+ the `security` CLI tool. It's also less oriented around password
93
+ management, and more geared towards PKI.
94
+
95
+ * https://github.com/fcheung/keychain also wraps Security Framework
96
+ with ffi. It's far more feature-complete than Yakg, but I wanted a
97
+ more minimalist API. Both approaches absolutely have their place.
98
+ Yakg shares some code, specifically fcheung/corefoundation for error
99
+ message string handling, and I am indebted to Mr. Cheung for it.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
metadata CHANGED
@@ -1,104 +1,106 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: yakg
3
- version: !ruby/object:Gem::Version
4
- hash: 29
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
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
  - Tom Maher
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-11-25 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- version_requirements: &id001 !ruby/object:Gem::Requirement
22
- none: false
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- hash: 3
27
- segments:
28
- - 0
29
- version: "0"
30
- prerelease: false
31
- type: :runtime
12
+ date: 2012-11-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
32
15
  name: ffi
33
- requirement: *id001
34
- - !ruby/object:Gem::Dependency
35
- version_requirements: &id002 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
36
17
  none: false
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- hash: 3
41
- segments:
42
- - 0
43
- version: "0"
44
- prerelease: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
45
22
  type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
46
31
  name: corefoundation
47
- requirement: *id002
48
- - !ruby/object:Gem::Dependency
49
- version_requirements: &id003 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
50
33
  none: false
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- hash: 3
55
- segments:
56
- - 0
57
- version: "0"
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
58
39
  prerelease: false
59
- type: :development
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
60
47
  name: woof_util
61
- requirement: *id003
62
- - !ruby/object:Gem::Dependency
63
- version_requirements: &id004 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
64
49
  none: false
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- hash: 3
69
- segments:
70
- - 0
71
- version: "0"
72
- prerelease: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
73
54
  type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
74
63
  name: rake
75
- requirement: *id004
76
- - !ruby/object:Gem::Dependency
77
- version_requirements: &id005 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
78
65
  none: false
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- hash: 3
83
- segments:
84
- - 0
85
- version: "0"
86
- prerelease: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
87
70
  type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
88
79
  name: rspec
89
- requirement: *id005
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
90
94
  description: Use Ruby's DL mechanism to access the MacOS Keychain
91
95
  email: tmaher@tursom.org
92
96
  executables: []
93
-
94
97
  extensions: []
95
-
96
98
  extra_rdoc_files: []
97
-
98
- files:
99
+ files:
99
100
  - .gitignore
100
101
  - Gemfile
101
102
  - Gemfile.lock
103
+ - README.md
102
104
  - Rakefile
103
105
  - VERSION
104
106
  - lib/yakg.rb
@@ -110,36 +112,32 @@ files:
110
112
  - yakg.gemspec
111
113
  homepage: https://github.com/tmaher/yakg
112
114
  licenses: []
113
-
114
115
  post_install_message:
115
116
  rdoc_options: []
116
-
117
- require_paths:
117
+ require_paths:
118
118
  - lib
119
- required_ruby_version: !ruby/object:Gem::Requirement
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
120
  none: false
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- hash: 3
125
- segments:
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ segments:
126
126
  - 0
127
- version: "0"
128
- required_rubygems_version: !ruby/object:Gem::Requirement
127
+ hash: -4137837794244479460
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
129
  none: false
130
- requirements:
131
- - - ">="
132
- - !ruby/object:Gem::Version
133
- hash: 3
134
- segments:
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ segments:
135
135
  - 0
136
- version: "0"
136
+ hash: -4137837794244479460
137
137
  requirements: []
138
-
139
138
  rubyforge_project:
140
- rubygems_version: 1.8.24
139
+ rubygems_version: 1.8.23
141
140
  signing_key:
142
141
  specification_version: 3
143
142
  summary: Yet Another Keyring Gem
144
143
  test_files: []
145
-