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.
- data/Gemfile.lock +3 -3
- data/README.md +99 -0
- data/VERSION +1 -1
- 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:
|
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.
|
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.
|
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
|
+
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
|
-
|
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
|
-
|
19
|
-
|
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:
|
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
|
-
|
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:
|
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
|
-
|
55
|
-
|
56
|
-
- 0
|
57
|
-
version: "0"
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
58
39
|
prerelease: false
|
59
|
-
|
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:
|
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
|
-
|
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:
|
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
|
-
|
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:
|
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
|
-
|
125
|
-
segments:
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
segments:
|
126
126
|
- 0
|
127
|
-
|
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
|
-
|
134
|
-
segments:
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
segments:
|
135
135
|
- 0
|
136
|
-
|
136
|
+
hash: -4137837794244479460
|
137
137
|
requirements: []
|
138
|
-
|
139
138
|
rubyforge_project:
|
140
|
-
rubygems_version: 1.8.
|
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
|
-
|