gtk2passwordapp 1.1.2 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|