gtk2passwordapp 2.7.1 → 3.0.0
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 +7 -0
- data/README.txt +1 -1
- data/bin/{gtk2passwordapp2 → gtk2passwordapp3} +7 -35
- data/lib/gtk2passwordapp/appconfig.rb +34 -55
- data/lib/gtk2passwordapp/iocrypt.rb +24 -15
- data/lib/gtk2passwordapp/passwords_data.rb +1 -3
- data/lib/gtk2passwordapp.rb +2 -2
- metadata +41 -41
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e1f5fbf47b366cf245f90ca03e06a7aa53e4d6be
|
4
|
+
data.tar.gz: c5367dcbca6ae0bcd28eceac5c66c37c2bca587a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9d09e2b32fe1555bed2835a221aad56e542032b86b094136a85840a1b299782298c67e87bfa14d5ad0bc30a02a1b88ba69e7dc59c117e0f78f2b525d3f74dcc3
|
7
|
+
data.tar.gz: c9ab09470fda034eb759478005852f5904b0cda5649cfd1871f69912d12d33d2006beea25cbbb489786d2bc6c669360d9bafdc6069a18d219246970393e1815e
|
data/README.txt
CHANGED
@@ -1,54 +1,27 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require 'rubygems'
|
3
2
|
|
4
3
|
if (nogui = ARGV.include?('--no-gui')) || (ARGV.include?('--dump')) then
|
4
|
+
|
5
5
|
require 'gtk2passwordapp/passwords'
|
6
6
|
# Unfortunately, gtk2applib makes this awkard.
|
7
7
|
# Have to assume things...
|
8
|
-
pwfile = File.expand_path('~/.gtk2passwordapp-
|
8
|
+
pwfile = File.expand_path('~/.gtk2passwordapp-3/passwords.dat')
|
9
9
|
raise "Need #{pwfile}" unless File.exist?(pwfile)
|
10
10
|
# Note: user may want to send stdout to a file,
|
11
11
|
# so commicating with user via stderr.
|
12
12
|
$stderr.print "Warning: password will be shown.\nPassword: "
|
13
13
|
pwd = $stdin.gets.strip
|
14
|
-
|
15
|
-
|
16
|
-
otpr = `which otpr`
|
17
|
-
if otpr.length > 0 then
|
18
|
-
bucket = ''
|
19
|
-
while bucket == '' do
|
20
|
-
$stderr.print "Bucket: "
|
21
|
-
bucket = $stdin.gets.strip
|
22
|
-
$stderr.puts "Need Google Cloud Storage's bucket name. (Ctrl-C to break)" if bucket.length == 0
|
23
|
-
end
|
24
|
-
$stderr.print "Pad Name('gtk2passwordapp'): "
|
25
|
-
padname = $stdin.gets.strip
|
26
|
-
padname = 'gtk2passwordapp' if padname.length == 0
|
27
|
-
$stderr.puts "otpr -u #{bucket} #{padname}"
|
28
|
-
IO.popen( "otpr -u #{bucket} #{padname}", 'w+' ) do |pipe|
|
29
|
-
if pipe.gets then # asks for pin
|
30
|
-
pipe.puts pwd # give pin
|
31
|
-
pwd = pipe.gets.strip # get password
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
rescue Exception
|
36
|
-
# user probably wanted out of the loop
|
37
|
-
$stderr.puts
|
38
|
-
end
|
39
|
-
# Sending master password to standard out.
|
40
|
-
# The assumption here is that the user is doing a recovery...
|
41
|
-
# Why else would the user be using this --no-gui?
|
42
|
-
$stdout.puts pwd
|
43
|
-
end
|
14
|
+
|
15
|
+
pattern = nil
|
44
16
|
if nogui then
|
45
17
|
$stderr.print "Warning: selected passwords will be shown.\nEnter Account pattern: "
|
46
18
|
pattern = Regexp.new( $stdin.gets.strip, Regexp::IGNORECASE )
|
47
19
|
end
|
20
|
+
|
48
21
|
begin
|
49
22
|
passwords = Gtk2Password::Passwords.new(pwfile, pwd)
|
50
23
|
passwords.load
|
51
|
-
if
|
24
|
+
if ARGV.include?('--dump') then
|
52
25
|
require 'pp'
|
53
26
|
# puts to stdout
|
54
27
|
pp passwords
|
@@ -66,9 +39,9 @@ if (nogui = ARGV.include?('--no-gui')) || (ARGV.include?('--dump')) then
|
|
66
39
|
$stderr.puts $!
|
67
40
|
end
|
68
41
|
exit
|
42
|
+
|
69
43
|
end
|
70
44
|
|
71
|
-
gem 'gtk2applib', '~> 15.3'
|
72
45
|
$help = <<EOT
|
73
46
|
\t--no-gui\tcommand line access to passwords
|
74
47
|
\t--dump\t\tpp dump of data
|
@@ -85,4 +58,3 @@ rescue Exception
|
|
85
58
|
ensure
|
86
59
|
program.finalize
|
87
60
|
end
|
88
|
-
|
@@ -118,74 +118,53 @@ module Configuration
|
|
118
118
|
AGAIN = 'Again' # for when verifying new passwords.
|
119
119
|
RETRY = 'Retry' # for when you got your password wrong.
|
120
120
|
|
121
|
-
# These are the --no-gui dialogs...
|
122
|
-
COMMAND_LINE_MSG1 = "Warning: password will be shown.\nPassword:"
|
123
|
-
COMMAND_LINE_MSG2 = "Warning: selected passwords will be shown.\nEnter Account pattern:"
|
124
121
|
end
|
125
122
|
|
126
|
-
# Set OTP to true if you're going to use otpr, version 1 (search for it in rubygems.org)
|
127
|
-
OTP = false
|
128
|
-
|
129
|
-
# arguments for otpr
|
130
|
-
BUCKET = 'YourBucket' # <== put the name of your google cloud storage bucket here.
|
131
|
-
PADNAME = 'gtk2passwordapp' # <== suggested pad name, you can change it.
|
132
|
-
OTPBACKUP = '/media/1234-5678/.gtk2passwordapp-2/cipher.pad' # <== edit to your backup file on removable media.
|
133
|
-
|
134
|
-
# Do yoy have a custom backup script to run?
|
135
|
-
BACKUPSCRIPT = nil # File.expand_path('~/bin/backup')
|
136
|
-
|
137
123
|
# Here you can edit in your own backups.
|
138
124
|
def self.passwords_updated(password=nil)
|
139
125
|
begin
|
140
|
-
|
141
|
-
#
|
142
|
-
|
143
|
-
Gtk2Password.set_password_to_pad(password) if password && OTP
|
144
|
-
# you might want to backup your otp here
|
145
|
-
# here, backup is a custom script to backup the .otpr directory
|
146
|
-
system("#{BACKUPSCRIPT} otpr &") if BACKUPSCRIPT
|
147
|
-
Gtk2AppLib::DIALOGS.quick_message("Passwords Data Saved.",{:TITLE => 'Saved',:SCROLLED_WINDOW => false})
|
126
|
+
### you might want to backup your passwords file ###
|
127
|
+
# system('cp ~/.gtk2passwordapp-3/passwords.dat ~/Dropbox/Backups/passwords.dat')
|
128
|
+
# Gtk2AppLib::DIALOGS.quick_message("Passwords Data Saved.",{:TITLE => 'Saved',:SCROLLED_WINDOW => false})
|
148
129
|
rescue Exception
|
149
130
|
Gtk2AppLib::DIALOGS.quick_message("Warning: #{$!}",{:TITLE => 'Warning',:SCROLLED_WINDOW => false})
|
150
131
|
end
|
151
132
|
end
|
152
133
|
|
153
|
-
def self.set_password_to_pad(password)
|
154
|
-
begin
|
155
|
-
IO.popen("otpr --new #{BUCKET} #{PADNAME} #{OTPBACKUP}",'w+') do |pipe|
|
156
|
-
raise "WUT?" unless pipe.gets.strip == 'Password:'
|
157
|
-
pipe.puts password
|
158
|
-
return pipe.gets.strip
|
159
|
-
end
|
160
|
-
rescue Exception
|
161
|
-
return ''
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
def self.get_password_from_pad(pin)
|
166
|
-
begin
|
167
|
-
IO.popen("otpr #{BUCKET} #{PADNAME} #{OTPBACKUP}",'w+') do |pipe|
|
168
|
-
raise "WUT?" unless pipe.gets.strip == 'Pin:'
|
169
|
-
pipe.puts pin
|
170
|
-
return pipe.gets.strip
|
171
|
-
end
|
172
|
-
rescue Exception
|
173
|
-
return ''
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
134
|
def self.get_password(prompt,title=prompt)
|
178
135
|
if password = Gtk2AppLib::DIALOGS.entry( prompt, {:TITLE=>title, :Entry => [{:visibility= => false},'activate']} ) then
|
179
136
|
password.strip!
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
end
|
137
|
+
### Do your custom interventions to the password here ###
|
138
|
+
### For example ###
|
139
|
+
# if password.length == 0
|
140
|
+
# # User wants to enter the password via QR code
|
141
|
+
# qrc_png = File.join Gtk2AppLib::USERDIR, 'pngs', 'qrc.png'
|
142
|
+
# system("fswebcam -q #{qrc_png}")
|
143
|
+
# password = `zbarimg -q --raw #{qrc_png}`.strip
|
144
|
+
# system("shred -u #{qrc_png}")
|
145
|
+
# end
|
146
|
+
# if password =~ /^[23]\-[0123456789abcdef]+$/
|
147
|
+
# # User is using a shared secret, assuming 2 of 3....
|
148
|
+
# require 'open3'
|
149
|
+
# Open3.popen2('ssss-combine -t 2 -Q') do |stdin, stdout, stderr|
|
150
|
+
# stdin.puts '1-....' # script's shared secret
|
151
|
+
# stdin.puts password # user's shared secret
|
152
|
+
# stdin.close
|
153
|
+
# # Weird, ssss currently using stderr instead of stdout for output.
|
154
|
+
# password = stderr.read.strip.split.last # So get the last line of stderr.
|
155
|
+
# end
|
156
|
+
# end
|
157
|
+
# unless password.length > 7
|
158
|
+
# if password.length == 0
|
159
|
+
# Gtk2AppLib::DIALOGS.quick_message(
|
160
|
+
# "Sorry, could not get password.",
|
161
|
+
# {:TITLE => 'No Password',:SCROLLED_WINDOW => false})
|
162
|
+
# else
|
163
|
+
# Gtk2AppLib::DIALOGS.quick_message(
|
164
|
+
# "Warning, weak password!",
|
165
|
+
# {:TITLE => 'Weak!',:SCROLLED_WINDOW => false})
|
166
|
+
# end
|
167
|
+
# end
|
189
168
|
end
|
190
169
|
return password
|
191
170
|
end
|
@@ -1,30 +1,39 @@
|
|
1
1
|
require 'yaml'
|
2
|
-
require '
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# above is what works, but documentation shows this...
|
8
|
-
require 'crypt-tea'
|
9
|
-
end
|
2
|
+
require 'zlib'
|
3
|
+
require 'openssl'
|
4
|
+
require 'digest/sha2'
|
5
|
+
|
6
|
+
YAML::ENGINE.yamler = 'psych' # ensure it's psych
|
10
7
|
|
11
8
|
module Gtk2Password
|
12
|
-
# Wrapper around Crypt::XXTEA
|
13
|
-
class IOCrypt
|
14
|
-
LENGTH = 16
|
15
9
|
|
10
|
+
class IOCrypt
|
16
11
|
def initialize(passphrase)
|
17
|
-
@key =
|
12
|
+
@key = Digest::SHA256.digest passphrase
|
13
|
+
end
|
14
|
+
|
15
|
+
def _cipher(mode, data)
|
16
|
+
cipher = OpenSSL::Cipher::Cipher.new('bf-cbc').send(mode)
|
17
|
+
cipher.key = @key
|
18
|
+
cipher.update(data) << cipher.final
|
19
|
+
end
|
20
|
+
|
21
|
+
def _decrypt(e)
|
22
|
+
Zlib::Inflate.inflate(_cipher(:decrypt, e))
|
23
|
+
end
|
24
|
+
|
25
|
+
def _encrypt(p)
|
26
|
+
_cipher(:encrypt, Zlib::Deflate.deflate(p))
|
18
27
|
end
|
19
28
|
|
20
29
|
def load(dumpfile)
|
21
30
|
data = nil
|
22
31
|
begin
|
23
|
-
File.open(dumpfile,'r'){|fh| data = YAML.load(
|
32
|
+
File.open(dumpfile,'r'){|fh| data = YAML.load( _decrypt( fh.read ) ) }
|
24
33
|
rescue Psych::SyntaxError
|
25
34
|
# assume it's syck
|
26
35
|
YAML::ENGINE.yamler = 'syck'
|
27
|
-
File.open(dumpfile,'r'){|fh| data = YAML.load(
|
36
|
+
File.open(dumpfile,'r'){|fh| data = YAML.load( _decrypt( fh.read ) ) }
|
28
37
|
YAML::ENGINE.yamler = 'psych' # make it psych
|
29
38
|
end
|
30
39
|
return data
|
@@ -32,7 +41,7 @@ class IOCrypt
|
|
32
41
|
|
33
42
|
def dump(dumpfile, data)
|
34
43
|
count = nil
|
35
|
-
File.open(dumpfile,'w') { |fh| count = fh.write(
|
44
|
+
File.open(dumpfile,'w') { |fh| count = fh.write( _encrypt( YAML.dump( data ) ) ) }
|
36
45
|
return count
|
37
46
|
end
|
38
47
|
end
|
@@ -13,9 +13,7 @@ class PasswordsData
|
|
13
13
|
LAST_UPDATE = 5
|
14
14
|
|
15
15
|
def reset(password)
|
16
|
-
|
17
|
-
passphrase = Digest::MD5.digest( password )
|
18
|
-
@iocrypt = IOCrypt.new(passphrase)
|
16
|
+
@iocrypt = IOCrypt.new(password)
|
19
17
|
end
|
20
18
|
|
21
19
|
attr_reader :data
|
data/lib/gtk2passwordapp.rb
CHANGED
@@ -4,12 +4,12 @@ require 'gtk2passwordapp/rnd'
|
|
4
4
|
module Gtk2Password
|
5
5
|
|
6
6
|
ABOUT = {
|
7
|
-
'name' => 'Ruby-Gnome Password Manager
|
7
|
+
'name' => 'Ruby-Gnome Password Manager III',
|
8
8
|
'authors' => ['carlosjhr64@gmail.com'],
|
9
9
|
'website' => 'https://sites.google.com/site/gtk2applib/home/gtk2applib-applications/gtk2passwordapp',
|
10
10
|
'website-label' => 'Ruby-Gnome Password Manager',
|
11
11
|
'license' => 'GPL',
|
12
|
-
'copyright' => '
|
12
|
+
'copyright' => '2014-07-29 17:00:00',
|
13
13
|
}
|
14
14
|
|
15
15
|
PRIMARY = Gtk::Clipboard.get((Configuration::SWITCH_CLIPBOARDS)? Gdk::Selection::CLIPBOARD: Gdk::Selection::PRIMARY)
|
metadata
CHANGED
@@ -1,85 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gtk2passwordapp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 3.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- carlosjhr64@gmail.com
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-07-30 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement:
|
17
|
-
none: false
|
14
|
+
name: gtk2applib
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: '15.3'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: gtk2applib
|
27
|
-
requirement: &12380780 !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
29
23
|
requirements:
|
30
|
-
- - ~>
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
26
|
version: '15.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: gtk2
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.2'
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.2'
|
41
|
+
description: |
|
42
|
+
A Ruby-Gnome password manager.
|
43
|
+
Uses Blowfish to encrypt the datafile.
|
40
44
|
Features random password generator and clipboard use.
|
41
|
-
|
42
|
-
'
|
43
45
|
email: carlosjhr64@gmail.com
|
44
46
|
executables:
|
45
|
-
-
|
47
|
+
- gtk2passwordapp3
|
46
48
|
extensions: []
|
47
49
|
extra_rdoc_files: []
|
48
50
|
files:
|
49
|
-
- ./lib/gtk2passwordapp
|
50
|
-
- ./lib/gtk2passwordapp/
|
51
|
-
- ./lib/gtk2passwordapp/
|
52
|
-
- ./lib/gtk2passwordapp/
|
53
|
-
- ./lib/gtk2passwordapp/
|
54
|
-
- ./lib/gtk2passwordapp.rb
|
55
|
-
- ./pngs/icon.png
|
56
|
-
- ./pngs/logo.png
|
51
|
+
- "./lib/gtk2passwordapp.rb"
|
52
|
+
- "./lib/gtk2passwordapp/appconfig.rb"
|
53
|
+
- "./lib/gtk2passwordapp/iocrypt.rb"
|
54
|
+
- "./lib/gtk2passwordapp/passwords.rb"
|
55
|
+
- "./lib/gtk2passwordapp/passwords_data.rb"
|
56
|
+
- "./lib/gtk2passwordapp/rnd.rb"
|
57
|
+
- "./pngs/icon.png"
|
58
|
+
- "./pngs/logo.png"
|
57
59
|
- README.txt
|
58
|
-
- bin/
|
60
|
+
- bin/gtk2passwordapp3
|
59
61
|
homepage: https://sites.google.com/site/gtk2applib/home/gtk2applib-applications/gtk2passwordapp
|
60
|
-
licenses:
|
62
|
+
licenses:
|
63
|
+
- GPL
|
64
|
+
metadata: {}
|
61
65
|
post_install_message:
|
62
66
|
rdoc_options: []
|
63
67
|
require_paths:
|
64
68
|
- lib
|
65
69
|
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
70
|
requirements:
|
68
|
-
- -
|
71
|
+
- - ">="
|
69
72
|
- !ruby/object:Gem::Version
|
70
73
|
version: '0'
|
71
74
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
75
|
requirements:
|
74
|
-
- -
|
76
|
+
- - ">="
|
75
77
|
- !ruby/object:Gem::Version
|
76
78
|
version: '0'
|
77
|
-
requirements:
|
78
|
-
- gtk2
|
79
|
+
requirements: []
|
79
80
|
rubyforge_project:
|
80
|
-
rubygems_version:
|
81
|
+
rubygems_version: 2.2.0
|
81
82
|
signing_key:
|
82
|
-
specification_version:
|
83
|
+
specification_version: 4
|
83
84
|
summary: Ruby-Gnome Password Manager
|
84
85
|
test_files: []
|
85
|
-
has_rdoc: false
|