gitcredential 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.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NDY2YmFhZDg0YWI3OGQ1MWI0ZTg1YmE1YTUxMDAwOWJjMDY5YmNiMA==
5
+ data.tar.gz: !binary |-
6
+ ZDdhZmY5MjQ3NGE4OGU2NjliYmEyZDY3NjRlM2Q0OGY0MjliMDJkOA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZmZkZWQ3Y2I5MjBiYTNkNDU5M2Y2MjY0ODQwMTE5OWYyODE3NmRjOTkwMzQ0
10
+ YjBhOThiNTM5ZGMxNThmZjk2MDJhNTVkMTliZmY5ZDUzOTU2N2U0OTg0YzQ1
11
+ ZGZlMjExNGZmMGEzMGI5MjU5YzRhZGIxM2MzZjM4YzY1Zjg0OWE=
12
+ data.tar.gz: !binary |-
13
+ MWFmNWJiYjQzYjM3ZWVlNWFjNDE0MDY5YTUxYjczZWZjMjBhMGM1NmIzNDk3
14
+ NzIwNmZkNDk2ZjlkYmRlMWZjNTY4ZTk2YzAyODZjMjRiZjE4Yjc2YWRjNTFk
15
+ NjQ3NzE1MDEzNGU3NTFkNmU0NDk4MjQ0YThiNjM0MzMwYjRiZjU=
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,32 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ gitcredential (0.0.2)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.2.5)
10
+ excon (0.16.10)
11
+ highline (1.6.20)
12
+ rake (10.1.0)
13
+ rspec (2.14.1)
14
+ rspec-core (~> 2.14.0)
15
+ rspec-expectations (~> 2.14.0)
16
+ rspec-mocks (~> 2.14.0)
17
+ rspec-core (2.14.7)
18
+ rspec-expectations (2.14.4)
19
+ diff-lcs (>= 1.1.3, < 2.0)
20
+ rspec-mocks (2.14.4)
21
+ woof_util (0.0.18)
22
+ excon (~> 0.16.10)
23
+ highline (~> 1.6.15)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ gitcredential!
30
+ rake
31
+ rspec
32
+ woof_util (~> 0.0.18)
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ `git credential` wrapper gem
2
+ ============================
3
+
4
+ ```
5
+ require "gitcredential"
6
+
7
+ user_data = { :proto => "https", :host => "heroku.com", :path => "/",
8
+ :user => "bovik" }
9
+
10
+ gc = Gitcredential.new :backend => :default
11
+
12
+ cred = gc.get user_data
13
+ cred # => nil
14
+
15
+ result = gc.set(user_data.merge(:password => "s3kr1+"))
16
+ result # => true
17
+
18
+ cred = gc.get user_data
19
+ cred # => "s3kr1+"
20
+
21
+ gc.set(user_data.merge(:password => "aW3s0m3"))
22
+
23
+ cred = gc.get user_data
24
+ cred # => "aW3s0m3"
25
+
26
+ result = gc.unset user_data
27
+ result # => true
28
+
29
+ cred = gc.get user_data
30
+ cred # => nil
31
+
32
+ result = gc.unset user_data
33
+ result # => false
34
+ ```
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/setup"
2
+ require "rspec/core/rake_task"
3
+ require "woof_util/gem_rake_tasks"
4
+
5
+ RSpec::Core::RakeTask.new "spec"
6
+ WoofUtil::GemRakeTasks.create_tasks
7
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.2
@@ -0,0 +1,16 @@
1
+ require 'find'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'gitcredential'
5
+ s.version = File.read("VERSION").chomp
6
+ s.summary = 'Ruby Wrapper for `git credential`'
7
+ s.description = "Shells out to git-credential's various backends for secure credential management"
8
+ s.authors = ["Tom Maher"]
9
+ s.email = "tmaher@pw0n.me"
10
+ s.license = "MIT"
11
+ s.files = `git ls-files`.split("\n")
12
+ s.homepage = "https://github.com/tmaher/gitcredential"
13
+ s.add_development_dependency "woof_util", "~> 0.0.18"
14
+ s.add_development_dependency "rake"
15
+ s.add_development_dependency "rspec"
16
+ end
@@ -0,0 +1,73 @@
1
+ class Gitcredential
2
+
3
+ def self.default_backend
4
+ case RUBY_PLATFORM
5
+ when /-darwin[\d\.]+\z/
6
+ "osxkeychain"
7
+ when /win32/
8
+ "winstore"
9
+ else
10
+ "cache"
11
+ end
12
+ end
13
+
14
+ attr_accessor :backend
15
+ def initialize args = {}
16
+ @valid_backends = ["osxkeychain", "winstore", "cache", "store", "default"]
17
+ @search_dft = {:proto => "https", :path => "/"}
18
+ @backend = args[:backend] || Gitcredential.default_backend
19
+
20
+ raise Exception "no such backend" unless @valid_backends.include?(@backend)
21
+ end
22
+
23
+ def cmd
24
+ "git-credential-#{@backend}"
25
+ end
26
+
27
+ def get_payload search_data={}
28
+ u = @search_dft.merge search_data
29
+ <<-__EOS
30
+ protocol=#{u[:proto]}
31
+ host=#{u[:host]}
32
+ path=#{u[:path]}
33
+ username=#{u[:user]}
34
+ __EOS
35
+ end
36
+
37
+ def set_payload set_data={}
38
+ get_payload(set_data) + "password=#{set_data[:password]}\n"
39
+ end
40
+
41
+ def get u
42
+ out = nil
43
+ IO.popen([cmd, 'get'], mode='r+') { |fd|
44
+ fd.write(get_payload u)
45
+ fd.close_write
46
+ out = fd.read
47
+ }
48
+ return nil if (out.nil? or out.empty?)
49
+ out.sub!(/^password=/, '').chomp
50
+ end
51
+
52
+ def set u
53
+ unset(u) unless get(u).nil?
54
+ IO.popen([cmd, 'store'], mode='r+') { |fd|
55
+ fd.write(set_payload u)
56
+ fd.close_write
57
+ }
58
+ raise "can't save pw for #{u[:user]}" if get(u).nil?
59
+ true
60
+ end
61
+
62
+ def unset u
63
+ return true if get(u).nil?
64
+
65
+ IO.popen([cmd, 'erase'], mode='r+') { |fd|
66
+ fd.write(get_payload u)
67
+ fd.close_write
68
+ }
69
+
70
+ raise "deletion error on #{u[:user]}" unless get(u).nil?
71
+ true
72
+ end
73
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gitcredential do
4
+
5
+ user_one = "user1_#{SecureRandom.hex 8}"
6
+ user_two = "user2_#{SecureRandom.hex 8}"
7
+ pw_one = "pw1_#{SecureRandom.hex 8}"
8
+ pw_two = "pw2_#{SecureRandom.hex 8}"
9
+
10
+ user_data = { :proto => "https",
11
+ :host => "gitcredential.example.rspec",
12
+ :path => "/",
13
+ :user => user_one }
14
+
15
+ it "uses the default backend" do
16
+ Gitcredential.new.backend.should eq Gitcredential.default_backend
17
+ end
18
+
19
+ it "only allows known backends" do
20
+ expect { Gitcredential.new(:backend => "necronomicon") }.to raise_exception
21
+ Gitcredential.new(:backend => "osxkeychain").backend.should eq "osxkeychain"
22
+ end
23
+
24
+ it "doesn't find nonexistent users" do
25
+ gc = Gitcredential.new
26
+ gc.get(user_data).should be_nil
27
+ end
28
+
29
+ it "can save new user accounts" do
30
+ gc = Gitcredential.new
31
+ gc.set(user_data.merge(:password => pw_one)).should be_true
32
+ end
33
+
34
+ it "can retrieve user accounts" do
35
+ gc = Gitcredential.new
36
+ gc.get(user_data).should eq pw_one
37
+ end
38
+
39
+ it "can overwrite passwords" do
40
+ gc = Gitcredential.new
41
+ gc.set(user_data.merge(:password => pw_two))
42
+ gc.get(user_data).should eq pw_two
43
+ end
44
+
45
+ it "can delete user accounts" do
46
+ gc = Gitcredential.new
47
+ gc.unset(user_data).should be_true
48
+ gc.get(user_data).should be_nil
49
+ end
50
+
51
+ it "can handle multiple accounts concurrently" do
52
+ gc = Gitcredential.new
53
+ gc.get(user_data).should be_nil
54
+ gc.set(user_data.merge(:password => pw_one)).should be_true
55
+ gc.set(user_data.merge(:user => user_two, :password => pw_two)).should be_true
56
+ gc.get(user_data).should eq pw_one
57
+ gc.get(user_data.merge(:user => user_two)).should eq pw_two
58
+ end
59
+
60
+ it "does cleanup" do
61
+ gc = Gitcredential.new
62
+ gc.unset(user_data)
63
+ gc.unset(user_data.merge(:user => user_two))
64
+ end
65
+
66
+ 1
67
+
68
+ end
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ $: << File.dirname(__FILE__) + '/../lib'
5
+
6
+ require 'gitcredential'
7
+ require 'securerandom'
8
+
9
+ RSpec.configure do |config|
10
+ config.color_enabled = true
11
+ config.tty = true
12
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gitcredential
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Tom Maher
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: woof_util
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.18
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.18
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Shells out to git-credential's various backends for secure credential
56
+ management
57
+ email: tmaher@pw0n.me
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - Gemfile
63
+ - Gemfile.lock
64
+ - README.md
65
+ - Rakefile
66
+ - VERSION
67
+ - gitcredential.gemspec
68
+ - lib/gitcredential.rb
69
+ - spec/gitcredential_spec.rb
70
+ - spec/spec_helper.rb
71
+ homepage: https://github.com/tmaher/gitcredential
72
+ licenses:
73
+ - MIT
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.0.7
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Ruby Wrapper for `git credential`
95
+ test_files: []