password_manager 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in password_manager.gemspec
4
+ gemspec
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'password_manager'
5
+ require 'clipboard'
6
+
7
+ PasswordManager.config_path = File.expand_path '.pass_manage', '~'
8
+
9
+ case ARGV[0]
10
+ when 'generate'
11
+ PasswordManager.generate(ARGV[1])
12
+ when 'get'
13
+ Clipboard.copy PasswordManager.get ARGV[1], ARGV[2], ARGV[3]
14
+ when 'set'
15
+ puts PasswordManager.get ARGV[1], ARGV[2], ARGV[3]
16
+ when 'remove'
17
+ if PasswordManager.remove ARGV[1]
18
+ puts 'Group succesfully removed'
19
+ else
20
+ puts "Group can't be removed"
21
+ end
22
+ when 'change_password'
23
+ PasswordManager.change_password ARGV[1]
24
+ when 'import'
25
+ PasswordManager.import ARGV[1]
26
+ when 'export'
27
+ PasswordManager.export ARGV[1]
28
+ when 'list'
29
+ puts "Groups:"
30
+ PasswordManager.list.each do |group|
31
+ puts " * #{group}"
32
+ end
33
+ else
34
+ puts "Allowed commands: generate, get and set"
35
+ end
@@ -0,0 +1,86 @@
1
+ require 'highline'
2
+ require 'highline/import'
3
+
4
+ require 'openssl'
5
+ require 'base64'
6
+
7
+ module PasswordManager
8
+ def self.config_path=(config_path)
9
+ @config_path = config_path
10
+ Dir.mkdir(@config_path) unless Dir.exists?(@config_path)
11
+ end
12
+
13
+ def self.generate(group)
14
+ group ||= 'default'
15
+ key_pair = OpenSSL::PKey::RSA.generate 1024
16
+
17
+ password = ask_password false
18
+ store_keys group, key_pair, password
19
+ end
20
+
21
+ def self.change_password(group)
22
+ password = ask("Password:"){ |q| q.echo = '*' }
23
+ new_password = ask_password false
24
+
25
+ rsa = OpenSSL::PKey::RSA.new File.read( group_path(group) ), password
26
+ store_keys group, rsa, new_password
27
+ end
28
+
29
+ def self.export(group)
30
+ password = ask("Password:"){ |q| q.echo = '*' }
31
+ new_password = ask_password false
32
+
33
+ rsa = OpenSSL::PKey::RSA.new File.read( group_path(group) ), password
34
+ store_keys group, rsa, new_password, "#{group}.pem"
35
+ end
36
+
37
+ def self.import(group)
38
+ password = ask("Password:"){ |q| q.echo = '*' }
39
+ new_password = ask_password false
40
+
41
+ rsa = OpenSSL::PKey::RSA.new File.read( "#{group}.pem" ), password
42
+ store_keys group, rsa, new_password
43
+ end
44
+
45
+ def self.remove(group)
46
+ if self.get('whatever', group)
47
+ File.delete group_path(group)
48
+ else
49
+ false
50
+ end
51
+ rescue
52
+ false
53
+ end
54
+
55
+ def self.list
56
+ Dir.glob(File.join @config_path, "*.pem").map{ |x| File.basename(x).match(/([^\.]*)\./)[1] }
57
+ end
58
+
59
+ def self.get(service, group, size = nil)
60
+ group ||= 'default'
61
+ size ||= 16
62
+ rsa = OpenSSL::PKey::RSA.new File.read( group_path group ), ask_password
63
+ Base64.encode64(rsa.private_encrypt(service)).gsub(/[\+\/]/, '').chomp[0..size.to_i]
64
+ rescue
65
+ puts "Invalid password or group or something else"
66
+ end
67
+
68
+ def self.group_path(group)
69
+ File.join @config_path, "#{group}.pem"
70
+ end
71
+
72
+ def self.store_keys(group, rsa, password, path = group_path(group))
73
+ cipher = OpenSSL::Cipher::Cipher.new 'aes-256-cbc'
74
+ private_key = rsa.to_pem cipher, password
75
+ public_key = rsa.public_key.to_pem cipher, password
76
+ File.open(path, 'w'){ |f| f.puts(private_key + public_key) }
77
+ end
78
+
79
+ def self.ask_password(confirmed = true)
80
+ password = ask("Password:"){ |q| q.echo = '*' }
81
+ return password if confirmed
82
+
83
+ raise "Passwords didn't match" if ask("Confirm password:"){ |q| q.echo = '*' } != password
84
+ password
85
+ end
86
+ end
@@ -0,0 +1,3 @@
1
+ module PasswordManager
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "password_manager/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "password_manager"
7
+ s.version = PasswordManager::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Dalton Pinto"]
10
+ s.email = ["dalthon@alun.ita.br"]
11
+ s.homepage = ""
12
+ s.summary = %q{A very simple password manager for more secure passwords}
13
+ s.description = %q{A very simple password manager for more secure passwords}
14
+
15
+ s.rubyforge_project = "password_manager"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency 'clipboard', '>= 0.9.0'
23
+ s.add_dependency 'highline', '>= 1.6.2'
24
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: password_manager
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Dalton Pinto
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-06-22 00:00:00 -03:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: clipboard
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 59
30
+ segments:
31
+ - 0
32
+ - 9
33
+ - 0
34
+ version: 0.9.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: highline
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 11
46
+ segments:
47
+ - 1
48
+ - 6
49
+ - 2
50
+ version: 1.6.2
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ description: A very simple password manager for more secure passwords
54
+ email:
55
+ - dalthon@alun.ita.br
56
+ executables:
57
+ - pass_manage
58
+ extensions: []
59
+
60
+ extra_rdoc_files: []
61
+
62
+ files:
63
+ - .gitignore
64
+ - Gemfile
65
+ - Rakefile
66
+ - bin/pass_manage
67
+ - lib/password_manager.rb
68
+ - lib/password_manager/version.rb
69
+ - password_manager.gemspec
70
+ has_rdoc: true
71
+ homepage: ""
72
+ licenses: []
73
+
74
+ post_install_message:
75
+ rdoc_options: []
76
+
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ hash: 3
94
+ segments:
95
+ - 0
96
+ version: "0"
97
+ requirements: []
98
+
99
+ rubyforge_project: password_manager
100
+ rubygems_version: 1.6.2
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: A very simple password manager for more secure passwords
104
+ test_files: []
105
+