gtk2passwordapp 1.1.2 → 1.2.1
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/README.txt +11 -13
- data/bin/gtk2passwordapp +27 -20
- data/lib/gtk2passwordapp/appconfig.rb +48 -0
- data/{gtk2passwordapp → lib/gtk2passwordapp}/iocrypt.rb +0 -0
- data/{gtk2passwordapp → lib/gtk2passwordapp}/passwords.rb +11 -6
- data/{gtk2passwordapp → lib/gtk2passwordapp}/passwords_data.rb +0 -0
- data/{gtk2passwordapp/edit_box.rb → lib/gtk2passwordapp.rb} +44 -90
- data/pngs/icon.png +0 -0
- metadata +23 -14
- data/gtk2passwordapp/appconfig.rb +0 -29
data/README.txt
CHANGED
@@ -12,29 +12,28 @@ in the appropriate entry boxes.
|
|
12
12
|
To set a new password, either enter the password in the "New:" entry box, or
|
13
13
|
generate it by pressing "Random", "Alpha-Numeric", "Numeric", "Letters", or
|
14
14
|
"All-Caps". One can set the password length generated with the spin-box.
|
15
|
-
To make the password generated visible,
|
16
|
-
The "Current" button copies the current password to the primary clipboard.
|
17
|
-
The "Previous" button copies the previous password to the primary clipboard.
|
15
|
+
To make the password generated visible, un-check the check button.
|
18
16
|
|
17
|
+
Once one has edited the account, clicking the "Update Account" button finalizes the record.
|
18
|
+
Note, however, that the change is not yet permanent and saved on disk.
|
19
19
|
To delete an account, select the account in the entry/combo box, and
|
20
20
|
the press the "Delete Account" button.
|
21
|
+
Once one is done with all updates, one then needs to press "Save To Disk".
|
22
|
+
"Cancel All Changes" or closing the window without "Save To Disk" will ignore all of the sessions updates.
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
Once one is done with all updates, one then needs to press "Save".
|
25
|
-
"Cancel" or closing the window without "Save" will ignore all of the sessions updates.
|
24
|
+
The "Clip Current Password" button copies the current password to the primary clipboard.
|
25
|
+
The "Clip Previous Password" button copies the previous (old) password to the primary clipboard.
|
26
26
|
|
27
27
|
The "Change Data File Password" button will allow one the change
|
28
|
-
the master password.
|
28
|
+
the master password. Do not forget the master password!
|
29
29
|
|
30
30
|
Right click most anywhere on the app's window for the main menu.
|
31
|
-
"Close" will dock the app and has the same effect as "Cancel".
|
31
|
+
"Close" will dock the app and has the same effect as "Cancel All Changes".
|
32
32
|
|
33
33
|
Left click on the docked icon to bring back the editor window.
|
34
|
-
|
35
34
|
Right click on the docked icon to select one of the accounts to load
|
36
35
|
the password and username to the clipboard.
|
37
|
-
The password is copied
|
36
|
+
The password is copied to the primary clipboard and will paste on
|
38
37
|
middle mouse button click.
|
39
38
|
Right click on an entry box to paste the username (via the clipboard's menu).
|
40
39
|
|
@@ -43,9 +42,8 @@ Lastly, do not edit
|
|
43
42
|
It's used to "salt" the password... without it,
|
44
43
|
one will not be able to decrypt the datafile.
|
45
44
|
|
46
|
-
|
47
45
|
For full documentation and comments, see
|
48
46
|
|
49
47
|
http://ruby-gnome-apps.blogspot.com/search/label/Passwords
|
50
48
|
|
51
|
-
|
49
|
+
carlosjhr64@gmail.com
|
data/bin/gtk2passwordapp
CHANGED
@@ -1,31 +1,38 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
|
2
3
|
require 'rubygems'
|
3
|
-
gem 'gtk2applib', '~>
|
4
|
-
require 'gtk2applib
|
4
|
+
gem 'gtk2applib', '~> 7'
|
5
|
+
require 'gtk2applib'
|
5
6
|
|
6
|
-
|
7
|
+
include Gtk2AppLib
|
8
|
+
PROGRAM = Program.new( {
|
7
9
|
:name => 'Ruby-Gnome Password Manager',
|
8
10
|
:tooltip => 'Password Manager',
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
:icon_name => 'Passwords',
|
12
|
+
:FILE => __FILE__,
|
13
|
+
:lock => "Proceed anyways?",
|
14
|
+
} )
|
13
15
|
|
14
|
-
|
15
|
-
require 'gtk2passwordapp
|
16
|
-
passwords = Gtk2PasswordApp::Passwords.new
|
17
|
-
Gtk2PasswordApp.build_menu(passwords)
|
16
|
+
begin
|
17
|
+
require 'gtk2passwordapp'
|
18
|
+
passwords = Gtk2PasswordApp::Passwords.new
|
19
|
+
Gtk2PasswordApp.build_menu(passwords)
|
18
20
|
|
19
|
-
about = {
|
20
|
-
|
21
|
-
:comments => 'Ruby-Gtk2 Passsword Manager',
|
21
|
+
about = {
|
22
|
+
:authors => ['carlosjhr64@gmail.com'],
|
22
23
|
:website => 'http://ruby-gnome-apps.blogspot.com/search/label/Passwords',
|
23
24
|
:website_label => 'Ruby-Gnome Password Manager',
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
:license => 'GPL',
|
26
|
+
:copyright => '2010-08-04 16:39:30',
|
27
|
+
}
|
28
|
+
|
29
|
+
PROGRAM.window(about) do |window|
|
30
|
+
Gtk2PasswordApp.edit(window,passwords)
|
31
|
+
end
|
32
|
+
rescue Exception
|
33
|
+
$verbose = true
|
34
|
+
Gtk2AppLib.puts_bang!
|
35
|
+
ensure
|
36
|
+
PROGRAM.finalize
|
29
37
|
end
|
30
38
|
|
31
|
-
Gtk2App.finalize
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Note: you'll see in ~/.gtk2passwordapp-* a file called passphrase.txt.
|
2
|
+
# Do not edit or delete passphrase, or you'll loose your passwords data.
|
3
|
+
|
4
|
+
module Gtk2AppLib
|
5
|
+
module Configuration
|
6
|
+
# Note that the passwords data file name is auto generated, but...
|
7
|
+
# You can place your passwords data file in a directory other than ~/gtk2passwordapp-*
|
8
|
+
PASSWORDS_DATA_DIR = UserSpace::DIRECTORY
|
9
|
+
|
10
|
+
HILDON = (WRAPPER.to_s == 'HildonWrapper')
|
11
|
+
|
12
|
+
GO_BUTTON_LENGTH = 50
|
13
|
+
SPIN_BUTTON_LENGTH = 60
|
14
|
+
PADDING = 2
|
15
|
+
ENTRY_WIDTH = (HILDON)? 600: 300
|
16
|
+
LABEL_WIDTH = 75
|
17
|
+
|
18
|
+
|
19
|
+
# Switches the roles of PRIMARY and CLIPBOARD when true
|
20
|
+
SWITCH_CLIPBOARDS = HILDON
|
21
|
+
|
22
|
+
PASSWORD_EXPIRED = 60*60*24*30*3 # 3 months
|
23
|
+
|
24
|
+
URL_PATTERN = Regexp.new('^https?:\/\/[^\s\']+$')
|
25
|
+
|
26
|
+
if HILDON then
|
27
|
+
WIDGET_OPTIONS[:font] = FONT[:normal] = FONT[:large] = Pango::FontDescription.new( 'Arial 18' )
|
28
|
+
end
|
29
|
+
|
30
|
+
MENU[:close] = '_Close'
|
31
|
+
|
32
|
+
WINDOW_DEFAULT_SIZE[0],WINDOW_DEFAULT_SIZE[1] = 100,100
|
33
|
+
|
34
|
+
WIDGET_OPTIONS[:max] = 20 # MAX PASSWORD LENGTH
|
35
|
+
WIDGET_OPTIONS[:min] = 3 # MIN PASSWORD LENGTH
|
36
|
+
DEFAULT_PASSWORD_LENGTH = 7
|
37
|
+
|
38
|
+
WIDGET_OPTIONS[:spinbutton_width] = SPIN_BUTTON_LENGTH
|
39
|
+
WIDGET_OPTIONS[:padding] = PADDING
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.passwords_updated
|
43
|
+
# You may want to mirror Configuration::PASSWORDS_DATA_DIR.
|
44
|
+
# For example:
|
45
|
+
# system( "scp #{Configuration::PASSWORDS_DATA_DIR}/*.dat user@192.168.1.123:.gtk2passwordapp-1/")
|
46
|
+
# system( "scp #{Configuration::PASSWORDS_DATA_DIR}/passphrase.txt user@192.168.1.123:.gtk2passwordapp-1/passphrase.txt")
|
47
|
+
end
|
48
|
+
end
|
File without changes
|
@@ -25,7 +25,7 @@ class Passwords < PasswordsData
|
|
25
25
|
if File.exist?(@pfile) then
|
26
26
|
File.open(@pfile,'r'){|fh| passphrase = fh.read }
|
27
27
|
else
|
28
|
-
passphrase = _create_passphrase
|
28
|
+
passphrase = _create_passphrase
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -42,9 +42,14 @@ class Passwords < PasswordsData
|
|
42
42
|
return false
|
43
43
|
end
|
44
44
|
|
45
|
+
def self._get_salt(prompt)
|
46
|
+
(ret = Gtk2PasswordApp.get_salt(prompt,'Salt')) || exit
|
47
|
+
ret.strip
|
48
|
+
end
|
49
|
+
|
45
50
|
attr_reader :pfile
|
46
51
|
def initialize
|
47
|
-
@pwd =
|
52
|
+
@pwd = Passwords._get_salt('Short Password')
|
48
53
|
@pfile = nil
|
49
54
|
@pph = get_passphrase
|
50
55
|
super(@pwd+@pph)
|
@@ -57,17 +62,17 @@ class Passwords < PasswordsData
|
|
57
62
|
if has_datafile? # then
|
58
63
|
# Yes, it's got a datafile. Ask for password again.
|
59
64
|
while !self.exist? do
|
60
|
-
@pwd =
|
65
|
+
@pwd = Passwords._get_salt('Try again!')
|
61
66
|
super(@pwd+@pph)
|
62
67
|
end
|
63
68
|
self.load
|
64
69
|
else
|
65
70
|
# Else, must be a new install.
|
66
71
|
pwd = @pwd
|
67
|
-
@pwd =
|
72
|
+
@pwd = Passwords._get_salt('Verify New Password')
|
68
73
|
while !(pwd == @pwd) do
|
69
|
-
pwd =
|
70
|
-
@pwd =
|
74
|
+
pwd = Passwords._get_salt('Try again!')
|
75
|
+
@pwd = Passwords._get_salt('Verify New Password')
|
71
76
|
end
|
72
77
|
end
|
73
78
|
end
|
File without changes
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'gtk2passwordapp/passwords'
|
1
2
|
module Gtk2PasswordApp
|
2
3
|
include Configuration
|
3
4
|
PRIMARY = Gtk::Clipboard.get((SWITCH_CLIPBOARDS)? Gdk::Selection::CLIPBOARD: Gdk::Selection::PRIMARY)
|
@@ -6,58 +7,29 @@ module Gtk2PasswordApp
|
|
6
7
|
@@index = nil
|
7
8
|
def self.build_menu(passwords)
|
8
9
|
passwords.accounts.each {|account|
|
9
|
-
item =
|
10
|
+
item = PROGRAM.dock_menu.append_menu_item(account){
|
10
11
|
@@index = passwords.accounts.index(account)
|
11
12
|
PRIMARY.text = passwords.password_of(account)
|
12
13
|
CLIPBOARD.text = passwords.username_of(account)
|
13
14
|
}
|
14
15
|
item.child.modify_fg(Gtk::STATE_NORMAL, COLOR[:red]) if passwords.expired?(account)
|
15
16
|
}
|
16
|
-
|
17
|
+
PROGRAM.dock_menu.show_all
|
17
18
|
end
|
18
19
|
def self.rebuild_menu(passwords)
|
19
|
-
items =
|
20
|
+
items = PROGRAM.dock_menu.children
|
20
21
|
3.times{ items.shift } # shift out Quit, Run, and Spacer
|
21
22
|
while item = items.shift do
|
22
|
-
|
23
|
+
PROGRAM.dock_menu.remove(item)
|
23
24
|
item.destroy
|
24
25
|
end
|
25
26
|
Gtk2PasswordApp.build_menu(passwords)
|
26
27
|
end
|
27
28
|
|
28
|
-
def self.get_salt(title=
|
29
|
-
|
30
|
-
title,
|
31
|
-
nil, nil,
|
32
|
-
[ Gtk::Stock::QUIT, 0 ],
|
33
|
-
[ Gtk::Stock::OK, 1 ])
|
34
|
-
|
35
|
-
label = Gtk::Label.new(title)
|
36
|
-
label.justify = Gtk::JUSTIFY_LEFT
|
37
|
-
label.wrap = true
|
38
|
-
label.modify_font(Configuration::FONT[:normal])
|
39
|
-
dialog.vbox.add(label)
|
40
|
-
entry = Gtk::Entry.new
|
41
|
-
entry.visibility = false
|
42
|
-
entry.modify_font(Configuration::FONT[:normal])
|
43
|
-
dialog.vbox.add(entry)
|
44
|
-
dialog.show_all
|
45
|
-
|
46
|
-
entry.signal_connect('activate'){
|
47
|
-
dialog.response(1)
|
48
|
-
}
|
49
|
-
|
50
|
-
ret = nil
|
51
|
-
dialog.run {|response|
|
52
|
-
ret = entry.text.strip if response == 1
|
53
|
-
}
|
54
|
-
dialog.destroy
|
55
|
-
|
56
|
-
return ret
|
29
|
+
def self.get_salt(prompt,title=prompt)
|
30
|
+
Gtk2AppLib::DIALOGS.entry(prompt,{:title=>title,:visibility=>false})
|
57
31
|
end
|
58
32
|
|
59
|
-
DIALOGS = Gtk2App::Dialogs.new
|
60
|
-
|
61
33
|
EDITOR_LABELS = [
|
62
34
|
:account,
|
63
35
|
:url,
|
@@ -69,8 +41,9 @@ module Gtk2PasswordApp
|
|
69
41
|
|
70
42
|
EDITOR_BUTTONS = [
|
71
43
|
[ :random, :alphanum, :num, :alpha, :caps, ],
|
72
|
-
[ :
|
73
|
-
[ :
|
44
|
+
[ :cancel, :delete, :update, :save, ],
|
45
|
+
[ :cpwd ],
|
46
|
+
[ :current, :previous, ],
|
74
47
|
]
|
75
48
|
|
76
49
|
TEXT = {
|
@@ -80,77 +53,59 @@ module Gtk2PasswordApp
|
|
80
53
|
:password => 'New',
|
81
54
|
# Buttons
|
82
55
|
:username => 'Username',
|
83
|
-
:current => 'Current',
|
56
|
+
:current => 'Clip Current Password',
|
84
57
|
:url => 'Url',
|
85
58
|
:note => 'Note',
|
86
59
|
:edit => 'Edit',
|
87
|
-
:update => 'Update',
|
88
|
-
:visibility => 'Visible',
|
60
|
+
:update => 'Update Account',
|
89
61
|
:alphanum => 'Alpha-Numeric',
|
90
62
|
:num => 'Numeric',
|
91
63
|
:alpha => 'Letters',
|
92
64
|
:caps => 'All-Caps',
|
93
65
|
:random => 'Random',
|
94
|
-
:previous => 'Previous',
|
66
|
+
:previous => 'Clip Previous Password',
|
95
67
|
:quit => 'Quit',
|
96
|
-
:cancel => 'Cancel',
|
97
|
-
:save => 'Save',
|
68
|
+
:cancel => 'Cancel All Changes',
|
69
|
+
:save => 'Save To Disk',
|
98
70
|
:cpwd => 'Change Data File Password',
|
99
71
|
:delete => 'Delete Account',
|
100
72
|
}
|
101
73
|
|
102
74
|
def self.edit(window, passwords)
|
103
|
-
begin
|
104
75
|
dialog_options = {:window=>window}
|
105
76
|
updated = false # only saves data if data updated
|
106
77
|
|
107
|
-
vbox =
|
108
|
-
window.add(vbox)
|
78
|
+
vbox = Gtk2AppLib::VBox.new(window)
|
109
79
|
|
110
|
-
pwdlength =
|
111
|
-
pwdlength.value = DEFAULT_PASSWORD_LENGTH
|
112
|
-
pwdlength.width_request = SPIN_BUTTON_LENGTH
|
113
|
-
pwdlength.modify_font(FONT[:normal])
|
114
|
-
goto_url = Gtk::Button.new('Go')
|
115
|
-
goto_url.child.modify_font(FONT[:normal])
|
116
|
-
goto_url.width_request = GO_BUTTON_LENGTH
|
80
|
+
goto_url = pwdlength = visibility = nil
|
117
81
|
|
118
82
|
widget = {}
|
119
83
|
EDITOR_LABELS.each {|s|
|
120
|
-
hbox =
|
121
|
-
label =
|
122
|
-
|
123
|
-
|
124
|
-
widget[s] = (s==:account)?
|
125
|
-
|
126
|
-
(
|
127
|
-
((s == :url)? (GO_BUTTON_LENGTH+2*GUI[:padding]): 0))
|
128
|
-
widget[s].modify_font(FONT[:normal])
|
129
|
-
hbox.pack_start(widget[s], false, false, GUI[:padding])
|
130
|
-
vbox.pack_start(hbox, false, false, GUI[:padding])
|
131
|
-
hbox.pack_start(pwdlength, false, false, GUI[:padding]) if s == :password
|
132
|
-
hbox.pack_start(goto_url, false, false, GUI[:padding]) if s == :url
|
133
|
-
}
|
84
|
+
hbox = Gtk2AppLib::HBox.new(vbox)
|
85
|
+
label = Gtk2AppLib::Label.new(TEXT[s]+':',hbox,{:label_width=>LABEL_WIDTH})
|
86
|
+
dx = ((s == :password)? (SPIN_BUTTON_LENGTH+2*PADDING+30): ((s == :url)? (GO_BUTTON_LENGTH+2*PADDING): 0))
|
87
|
+
width = ENTRY_WIDTH - dx
|
88
|
+
widget[s] = (s==:account)?
|
89
|
+
Gtk2AppLib::ComboBoxEntry.new(passwords.accounts,hbox,{:comboboxentry_width=>width}) :
|
90
|
+
Gtk2AppLib::Entry.new('',hbox,{:entry_width=>width})
|
134
91
|
|
135
|
-
|
136
|
-
|
137
|
-
|
92
|
+
if s == :password then
|
93
|
+
visibility = Gtk2AppLib::CheckButton.new(hbox,{:active=>true})
|
94
|
+
pwdlength = Gtk2AppLib::SpinButton.new(hbox)
|
95
|
+
pwdlength.value = DEFAULT_PASSWORD_LENGTH
|
96
|
+
elsif s == :url then
|
97
|
+
goto_url = Gtk2AppLib::Button.new('Go',hbox,{:button_width=>GO_BUTTON_LENGTH}){
|
98
|
+
# The go button opens the url in a browser
|
99
|
+
system("#{APP[:browser]} #{widget[:url].text} > /dev/null 2> /dev/null &")
|
100
|
+
}
|
101
|
+
end
|
138
102
|
}
|
139
|
-
|
103
|
+
|
140
104
|
EDITOR_BUTTONS.each{|row|
|
141
|
-
hbox =
|
142
|
-
row.each {|s|
|
143
|
-
widget[s] = Gtk::Button.new(TEXT[s])
|
144
|
-
widget[s].child.modify_font(FONT[:normal])
|
145
|
-
hbox.pack_start(widget[s], false, false, GUI[:padding])
|
146
|
-
}
|
147
|
-
vbox.pack_start(hbox, false, false, GUI[:padding])
|
105
|
+
hbox = Gtk2AppLib::HBox.new(vbox)
|
106
|
+
row.each {|s| widget[s] = Gtk2AppLib::Button.new(TEXT[s],hbox) }
|
148
107
|
}
|
149
108
|
|
150
|
-
# Account
|
151
|
-
passwords.accounts.each { |account|
|
152
|
-
widget[:account].append_text( account )
|
153
|
-
}
|
154
109
|
widget[:account].active = @@index if @@index
|
155
110
|
account_changed = proc {
|
156
111
|
account = (widget[:account].active_text)? widget[:account].active_text.strip: ''
|
@@ -198,7 +153,7 @@ module Gtk2PasswordApp
|
|
198
153
|
end
|
199
154
|
end
|
200
155
|
else
|
201
|
-
DIALOGS.quick_message('Need url like http://www.site.com/page.html', dialog_options)
|
156
|
+
Gtk2AppLib::DIALOGS.quick_message('Need url like http://www.site.com/page.html', dialog_options)
|
202
157
|
end
|
203
158
|
}
|
204
159
|
|
@@ -248,7 +203,7 @@ module Gtk2PasswordApp
|
|
248
203
|
}
|
249
204
|
|
250
205
|
# Visibility
|
251
|
-
|
206
|
+
visibility.signal_connect('clicked'){
|
252
207
|
widget[:password].visibility = !widget[:password].visibility?
|
253
208
|
}
|
254
209
|
|
@@ -278,6 +233,7 @@ module Gtk2PasswordApp
|
|
278
233
|
end
|
279
234
|
#@pwd = pwd1
|
280
235
|
passwords.save(pwd1)
|
236
|
+
Gtk2AppLib.passwords_updated
|
281
237
|
end
|
282
238
|
end
|
283
239
|
}
|
@@ -286,10 +242,11 @@ module Gtk2PasswordApp
|
|
286
242
|
widget[:save].signal_connect('clicked'){
|
287
243
|
if updated then
|
288
244
|
passwords.save
|
245
|
+
Gtk2AppLib.passwords_updated
|
289
246
|
updated = false
|
290
247
|
Gtk2PasswordApp.rebuild_menu(passwords)
|
291
248
|
end
|
292
|
-
|
249
|
+
PROGRAM.close
|
293
250
|
}
|
294
251
|
|
295
252
|
# Delete
|
@@ -302,13 +259,13 @@ module Gtk2PasswordApp
|
|
302
259
|
widget[:account].remove_text(i)
|
303
260
|
@@index = (widget[:account].active = (i > 0)? i - 1: 0)
|
304
261
|
updated = true
|
305
|
-
DIALOGS.quick_message("#{account} deleted.", dialog_options)
|
262
|
+
Gtk2AppLib::DIALOGS.quick_message("#{account} deleted.", dialog_options)
|
306
263
|
end
|
307
264
|
end
|
308
265
|
}
|
309
266
|
|
310
267
|
# Cancel
|
311
|
-
widget[:cancel].signal_connect('clicked'){
|
268
|
+
widget[:cancel].signal_connect('clicked'){ PROGRAM.close }
|
312
269
|
window.signal_connect('destroy'){
|
313
270
|
if updated then
|
314
271
|
passwords.load # revert
|
@@ -317,8 +274,5 @@ module Gtk2PasswordApp
|
|
317
274
|
}
|
318
275
|
|
319
276
|
window.show_all
|
320
|
-
rescue Exception
|
321
|
-
puts_bang!
|
322
|
-
end
|
323
277
|
end
|
324
278
|
end
|
data/pngs/icon.png
ADDED
Binary file
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gtk2passwordapp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 1
|
7
|
-
- 1
|
8
8
|
- 2
|
9
|
-
|
9
|
+
- 1
|
10
|
+
version: 1.2.1
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- carlosjhr64@gmail.com
|
@@ -14,16 +15,18 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2010-
|
18
|
+
date: 2010-08-04 00:00:00 -07:00
|
18
19
|
default_executable: gtk2passwordapp
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: crypt-tea
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
24
26
|
requirements:
|
25
27
|
- - ~>
|
26
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 27
|
27
30
|
segments:
|
28
31
|
- 1
|
29
32
|
- 3
|
@@ -35,14 +38,14 @@ dependencies:
|
|
35
38
|
name: gtk2applib
|
36
39
|
prerelease: false
|
37
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
38
42
|
requirements:
|
39
43
|
- - ~>
|
40
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 13
|
41
46
|
segments:
|
42
|
-
-
|
43
|
-
|
44
|
-
- 0
|
45
|
-
version: 5.0.0
|
47
|
+
- 7
|
48
|
+
version: "7"
|
46
49
|
type: :runtime
|
47
50
|
version_requirements: *id002
|
48
51
|
description: |
|
@@ -58,13 +61,15 @@ extensions: []
|
|
58
61
|
extra_rdoc_files: []
|
59
62
|
|
60
63
|
files:
|
61
|
-
- ./gtk2passwordapp
|
62
|
-
- ./gtk2passwordapp/
|
63
|
-
- ./gtk2passwordapp/
|
64
|
-
- ./gtk2passwordapp/iocrypt.rb
|
65
|
-
- ./gtk2passwordapp/appconfig.rb
|
64
|
+
- ./lib/gtk2passwordapp.rb
|
65
|
+
- ./lib/gtk2passwordapp/passwords.rb
|
66
|
+
- ./lib/gtk2passwordapp/passwords_data.rb
|
67
|
+
- ./lib/gtk2passwordapp/iocrypt.rb
|
68
|
+
- ./lib/gtk2passwordapp/appconfig.rb
|
66
69
|
- ./pngs/logo.png
|
70
|
+
- ./pngs/icon.png
|
67
71
|
- README.txt
|
72
|
+
- bin/gtk2passwordapp
|
68
73
|
has_rdoc: true
|
69
74
|
homepage: http://ruby-gnome-apps.blogspot.com/search/label/Passwords
|
70
75
|
licenses: []
|
@@ -73,25 +78,29 @@ post_install_message:
|
|
73
78
|
rdoc_options: []
|
74
79
|
|
75
80
|
require_paths:
|
76
|
-
-
|
81
|
+
- lib
|
77
82
|
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
78
84
|
requirements:
|
79
85
|
- - ">="
|
80
86
|
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
81
88
|
segments:
|
82
89
|
- 0
|
83
90
|
version: "0"
|
84
91
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
85
93
|
requirements:
|
86
94
|
- - ">="
|
87
95
|
- !ruby/object:Gem::Version
|
96
|
+
hash: 3
|
88
97
|
segments:
|
89
98
|
- 0
|
90
99
|
version: "0"
|
91
100
|
requirements:
|
92
101
|
- gtk2
|
93
102
|
rubyforge_project: gtk2passwordapp
|
94
|
-
rubygems_version: 1.3.
|
103
|
+
rubygems_version: 1.3.7
|
95
104
|
signing_key:
|
96
105
|
specification_version: 3
|
97
106
|
summary: Ruby-Gnome Password Manager
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# Note: you'll see in ~/.gtk2passwordapp-* a file called passphrase.txt.
|
2
|
-
# Do not edit or delete passphrase, or you'll loose your passwords data.
|
3
|
-
|
4
|
-
module Configuration
|
5
|
-
# Note that the passwords data file name is auto generated, but...
|
6
|
-
# You can place your passwords data file in a directory other than ~/gtk2passwordapp-*
|
7
|
-
PASSWORDS_DATA_DIR = UserSpace::DIRECTORY
|
8
|
-
|
9
|
-
ENTRY_WIDTH = (Gtk2App::HILDON)? 600: 300
|
10
|
-
LABEL_WIDTH = 75
|
11
|
-
GO_BUTTON_LENGTH = 50
|
12
|
-
SPIN_BUTTON_LENGTH = 60
|
13
|
-
# PAD = 2 # cell padding
|
14
|
-
|
15
|
-
MAX_PASSWORD_LENGTH = 20
|
16
|
-
DEFAULT_PASSWORD_LENGTH = 7
|
17
|
-
MIN_PASSWORD_LENGTH = 3
|
18
|
-
|
19
|
-
# Switches the roles of PRIMARY and CLIPBOARD when true
|
20
|
-
SWITCH_CLIPBOARDS = Gtk2App::HILDON
|
21
|
-
|
22
|
-
PASSWORD_EXPIRED = 60*60*24*30*3 # 3 months
|
23
|
-
|
24
|
-
URL_PATTERN = Regexp.new('^https?:\/\/[^\s\']+$')
|
25
|
-
|
26
|
-
FONT[:normal] = FONT[:large] = Pango::FontDescription.new( 'Arial 18' ) if Gtk2App::HILDON
|
27
|
-
GUI[:window_size] = [100,100]
|
28
|
-
MENU[:close] = '_Close'
|
29
|
-
end
|