keyring 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ == 0.1.0 / 2011-05-28
2
+
3
+ * 1 major enhancement
4
+ * Birthday!
@@ -0,0 +1,70 @@
1
+ keyring
2
+ ===========
3
+
4
+ A simple framework for storing passwords in certain keyring systems.
5
+ This gem is heavily inspired by python-keyring.
6
+
7
+ Examples
8
+ --------
9
+
10
+ The simplest case is to use a single global keyring instance:
11
+
12
+ require "keyring"
13
+ Keyring.set_password("service", "user", "password")
14
+ Keyring.get_password("service", "user") == "password"
15
+
16
+ This instance parses ./.rbkeyringrc and ~/.rbkeyringrc (in that order)
17
+ for a valid configuration. The configuration determines the default
18
+ module to use along with some parameters, e.g., the following
19
+ configuration uses the kwallet module (available as keyring-kwallet
20
+ gem):
21
+
22
+ ---
23
+ module: keyring-kwallet
24
+ params:
25
+ folder: myfolder
26
+ app: myapp
27
+
28
+ Alternatively you can create instances of your favourite keyring module:
29
+
30
+ simple = Keyring::SimpleKeyring.new
31
+ kwallet = Keyring::KWalletKeyring.new folder: "myfolder", app: "myapp"
32
+ simple.set_password("service", "user", kwallet.get_password("service", "user"))
33
+
34
+ The concrete parameters depend on the backend type.
35
+
36
+ Install
37
+ -------
38
+
39
+ gem install keyring
40
+
41
+ Author
42
+ ------
43
+
44
+ Original author: Frank Fischer
45
+
46
+ License
47
+ -------
48
+
49
+ (The MIT License) FIXME (different license?)
50
+
51
+ Copyright (c) 2011 FIXME (author's name)
52
+
53
+ Permission is hereby granted, free of charge, to any person obtaining
54
+ a copy of this software and associated documentation files (the
55
+ 'Software'), to deal in the Software without restriction, including
56
+ without limitation the rights to use, copy, modify, merge, publish,
57
+ distribute, sublicense, and/or sell copies of the Software, and to
58
+ permit persons to whom the Software is furnished to do so, subject to
59
+ the following conditions:
60
+
61
+ The above copyright notice and this permission notice shall be
62
+ included in all copies or substantial portions of the Software.
63
+
64
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
65
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
66
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
67
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
68
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
69
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
70
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,17 @@
1
+
2
+ begin
3
+ require 'bones'
4
+ rescue LoadError
5
+ abort '### Please install the "bones" gem ###'
6
+ end
7
+
8
+ task :default => 'spec:run'
9
+ task 'gem:release' => 'spec:run'
10
+
11
+ Bones {
12
+ name 'keyring'
13
+ authors 'Frank Fischer'
14
+ email 'frank.fischer@mathematik.tu-chemnitz.de'
15
+ url 'http://darcsden.com/lyro/keyring'
16
+ }
17
+
@@ -0,0 +1,15 @@
1
+
2
+ module Keyring
3
+
4
+ # :stopdoc:
5
+ LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
+ PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
+ VERSION = ::File.read(PATH + 'version.txt').strip
8
+
9
+ %w(Keyring.rb SimpleKeyring.rb).each do |fname|
10
+ require File.join(LIBPATH, "keyring", fname)
11
+ end
12
+
13
+ end # module Keyring
14
+
15
+
@@ -0,0 +1,95 @@
1
+ require 'yaml'
2
+
3
+ module Keyring
4
+
5
+ @keyring = nil
6
+ @backends = {}
7
+
8
+ # Registers a backend
9
+ def self.add_backend( name, backend )
10
+ @backends[name] = backend
11
+ end
12
+
13
+ # Changes the global default key-ring
14
+ def self.set_keyring( keyring )
15
+ raise ArgumentError, "Expected keyring" unless keyring.kind_of? Keyring
16
+ @keyring = keyring
17
+ end
18
+
19
+ # Returns the global default keyring
20
+ def self.keyring
21
+ unless @keyring
22
+ @backends.each_value do |backend|
23
+ keyring = backend.new
24
+ if keyring.supported?
25
+ @keyring = keyring
26
+ break if keyring.recommended?
27
+ end
28
+ end
29
+ end
30
+ @keyring
31
+ end
32
+
33
+ def self.method_missing(name, *args, &block)
34
+ keyring.send(name, *args, &block)
35
+ end
36
+
37
+ # Base class for all Keyrings.
38
+ # All keyring backends should inherit from this class.
39
+ class Keyring
40
+ # Determines if this keyring is supported by the current platform.
41
+ # @return [true, false] whether the keyring is supported by the current platform
42
+ def supported?
43
+ false
44
+ end
45
+
46
+ # Determines if this keyring is recommended by the current platform.
47
+ # @return [true, false] whether the keyring is recommended by the current platform
48
+ def recommended?
49
+ false
50
+ end
51
+
52
+ # Sets the user password for a certain service.
53
+ # @param [String] service the name of the service
54
+ # @param [String] username the name of the user
55
+ # @param [String, nil] password the new password to be stored
56
+ def set_password( service, username, password )
57
+ raise NotImplementedError, "Setting a password is not supported"
58
+ end
59
+
60
+ # Removes a user password for a certain service from the keyring.
61
+ # This is the same as setting the password to nil.
62
+ # @param [String] service the name of the service
63
+ # @param [String] username the name of the user
64
+ def delete_password( service, username )
65
+ set_password( service, username, nil )
66
+ end
67
+
68
+ # Returns the current user password for a certain service.
69
+ # @param [String] service the name of the service
70
+ # @param [String] username the name of the user
71
+ # @return [String, nil] the current password if available
72
+ def get_password( service, username )
73
+ raise NotImplementedError, "Retrieving a password is not supported"
74
+ end
75
+ end
76
+
77
+
78
+ # load keyring
79
+ [".rbkeyringrc", "#{File.join(ENV['HOME'], '.rbkeyringrc')}"].each do |fname|
80
+ begin
81
+ File.open(fname, "r") do |f|
82
+ puts "load #{fname}"
83
+ config = YAML::load(f.read)
84
+ if config
85
+ kr_module = config["module"]
86
+ require kr_module
87
+ set_keyring(@backends[kr_module].new config["parameters"])
88
+ break
89
+ end
90
+ end
91
+ rescue IOError, Errno::ENOENT
92
+ end
93
+ end
94
+
95
+ end
@@ -0,0 +1,38 @@
1
+ module Keyring
2
+
3
+ # Simple keyring holding all keys in memory.
4
+ class SimpleKeyring < Keyring
5
+ def initialize
6
+ @services = {}
7
+ end
8
+
9
+ def supported?
10
+ true
11
+ end
12
+
13
+ def recommended?
14
+ false
15
+ end
16
+
17
+ def get_password( service, username )
18
+ passwords = @services[service]
19
+ if passwords
20
+ passwords[username]
21
+ else
22
+ nil
23
+ end
24
+ end
25
+
26
+ def set_password( service, username, password )
27
+ passwords = @services[service]
28
+ unless passwords
29
+ passwords = {}
30
+ @services[service] = passwords
31
+ end
32
+ passwords[username] = password
33
+ end
34
+ end
35
+
36
+ add_backend("simple", SimpleKeyring)
37
+
38
+ end
@@ -0,0 +1,129 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
3
+
4
+ describe Keyring::Keyring, "after creation" do
5
+ before do
6
+ @keyring = Keyring::Keyring.new
7
+ end
8
+
9
+ it "should not be supported" do
10
+ @keyring.supported?.should == false
11
+ end
12
+
13
+ it "should not be recommended" do
14
+ @keyring.recommended?.should == false
15
+ end
16
+
17
+ it "should raise an error when getting a password" do
18
+ lambda{@keyring.get_password("service", "user")}.should raise_error
19
+ end
20
+
21
+ it "should raise an error when setting a password" do
22
+ lambda{@keyring.set_password("service", "user", "pass")}.should raise_error
23
+ end
24
+
25
+ it "should raise an error when deleting a password" do
26
+ lambda{@keyring.delete_password("service", "user", "pass")}.should raise_error
27
+ end
28
+ end
29
+
30
+
31
+ describe Keyring::SimpleKeyring, "after creation" do
32
+ before do
33
+ @keyring = Keyring::SimpleKeyring.new
34
+ end
35
+
36
+ it "should be supported" do
37
+ @keyring.supported?.should == true
38
+ end
39
+
40
+ it "should not be recommended" do
41
+ @keyring.recommended?.should == false
42
+ end
43
+
44
+ it "should return nil when getting a password" do
45
+ @keyring.get_password("service", "user").should == nil
46
+ end
47
+
48
+ it "should not raise an error when setting a password" do
49
+ lambda{@keyring.set_password("service", "user", "pass")}.should_not raise_error
50
+ end
51
+
52
+ it "should not raise an error when deleting a password" do
53
+ lambda{@keyring.delete_password("service", "user")}.should_not raise_error
54
+ end
55
+ end
56
+
57
+
58
+ describe Keyring::SimpleKeyring, "with a single password" do
59
+ before do
60
+ @keyring = Keyring::SimpleKeyring.new
61
+ @keyring.set_password "service", "user", "pass"
62
+ end
63
+
64
+ it "should contain the password" do
65
+ @keyring.get_password("service", "user").should == "pass"
66
+ end
67
+
68
+ it "should not contain a password for another user" do
69
+ @keyring.get_password("service", "user2").should == nil
70
+ end
71
+
72
+ it "should not contain a password for another service" do
73
+ @keyring.get_password("service2", "user").should == nil
74
+ end
75
+
76
+ it "should not contain a password after deletion" do
77
+ @keyring.delete_password("service", "user")
78
+ @keyring.get_password("service", "user").should == nil
79
+ end
80
+
81
+ it "should contain the password after deletion of another user" do
82
+ @keyring.delete_password("service", "user2")
83
+ @keyring.get_password("service", "user").should == "pass"
84
+ end
85
+
86
+ it "should contain the password after deletion of another service" do
87
+ @keyring.delete_password("service2", "user")
88
+ @keyring.get_password("service", "user").should == "pass"
89
+ end
90
+ end
91
+
92
+
93
+ describe Keyring::SimpleKeyring, "with a serveral passwords" do
94
+ before do
95
+ @keyring = Keyring::SimpleKeyring.new
96
+ @keyring.set_password "service", "user", "pass"
97
+ @keyring.set_password "service", "user2", "pass2"
98
+ @keyring.set_password "service2", "user", "pass21"
99
+ @keyring.set_password "service2", "user3", "pass23"
100
+ end
101
+
102
+ it "should contain all passwords" do
103
+ @keyring.get_password("service", "user").should == "pass"
104
+ @keyring.get_password("service", "user2").should == "pass2"
105
+ @keyring.get_password("service2", "user").should == "pass21"
106
+ @keyring.get_password("service2", "user3").should == "pass23"
107
+ end
108
+
109
+ it "should not contain a password for another user" do
110
+ @keyring.get_password("service", "user3").should == nil
111
+ @keyring.get_password("service2", "user2").should == nil
112
+ end
113
+
114
+ it "should not contain a password after deletion" do
115
+ @keyring.delete_password("service", "user")
116
+ @keyring.get_password("service", "user").should == nil
117
+ end
118
+
119
+ it "should contain the password after deletion of another user" do
120
+ @keyring.delete_password("service", "user2")
121
+ @keyring.get_password("service", "user").should == "pass"
122
+ end
123
+
124
+ it "should contain the password after deletion of another service" do
125
+ @keyring.delete_password("service2", "user")
126
+ @keyring.get_password("service", "user").should == "pass"
127
+ end
128
+ end
129
+
@@ -0,0 +1,15 @@
1
+
2
+ require File.expand_path(
3
+ File.join(File.dirname(__FILE__), %w[.. lib keyring]))
4
+
5
+ RSpec.configure do |config|
6
+ # == Mock Framework
7
+ #
8
+ # RSpec uses it's own mocking framework by default. If you prefer to
9
+ # use mocha, flexmock or RR, uncomment the appropriate line:
10
+ #
11
+ # config.mock_with :mocha
12
+ # config.mock_with :flexmock
13
+ # config.mock_with :rr
14
+ end
15
+
@@ -0,0 +1 @@
1
+ 0.1.0
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: keyring
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Frank Fischer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-05-28 00:00:00 +02:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: bones
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 3.6.5
25
+ type: :development
26
+ version_requirements: *id001
27
+ description: |-
28
+ A simple framework for storing passwords in certain keyring systems.
29
+ This gem is heavily inspired by python-keyring.
30
+ email: frank.fischer@mathematik.tu-chemnitz.de
31
+ executables: []
32
+
33
+ extensions: []
34
+
35
+ extra_rdoc_files:
36
+ - History.txt
37
+ files:
38
+ - History.txt
39
+ - README.md
40
+ - Rakefile
41
+ - lib/keyring.rb
42
+ - lib/keyring/Keyring.rb
43
+ - lib/keyring/SimpleKeyring.rb
44
+ - spec/keyring_spec.rb
45
+ - spec/spec_helper.rb
46
+ - version.txt
47
+ has_rdoc: true
48
+ homepage: http://darcsden.com/lyro/keyring
49
+ licenses: []
50
+
51
+ post_install_message:
52
+ rdoc_options:
53
+ - --main
54
+ - README.md
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ requirements: []
70
+
71
+ rubyforge_project: keyring
72
+ rubygems_version: 1.6.2
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: A simple framework for storing passwords in certain keyring systems.
76
+ test_files: []
77
+