gtk2passwordapp 5.0.0 → 6.1.210628

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,317 @@
1
+ class Gtk2PasswordApp
2
+ def initialize(stage, toolbar, options)
3
+ @primary = Gtk::Clipboard.get(Gdk::Selection::PRIMARY)
4
+ @clipboard = Gtk::Clipboard.get(Gdk::Selection::CLIPBOARD)
5
+ @accounts = Accounts.new(CONFIG[:PwdFile])
6
+ @toolbox = Such::Box.new toolbar, :toolbox!
7
+ @pages = Such::Box.new stage, :pages!
8
+ @recent = []
9
+ @reset = @on_main_page = false
10
+ @red,@green,@blue = [:Red,:Green,:Blue].map{Gdk::RGBA.parse(CONFIG[_1])}
11
+ @tools = @password_page = @add_page = @edit_page = @main_page = @menu = nil
12
+ build_password_page
13
+ build_logo_menu
14
+ end
15
+
16
+ def build_logo_menu
17
+ Gtk3App.logo_press_event do |button|
18
+ next unless @on_main_page
19
+ case button
20
+ when 1
21
+ popup_accounts_menu unless @accounts.data.empty?
22
+ when 2
23
+ reset_password
24
+ when 3
25
+ # Gets captured by Gtk3App's main menu
26
+ end
27
+ end
28
+ end
29
+
30
+ def reset_password
31
+ ursure = Gtk3App::YesNoDialog.new :reset_ursure!
32
+ Gtk3App.transient ursure
33
+ if ursure.ok?
34
+ @reset = true
35
+ hide_main_page
36
+ @password_page.show
37
+ end
38
+ end
39
+
40
+ def popup_accounts_menu
41
+ @menu = Such::Menu.new :main_menu!
42
+ @recent.each do |name| add_menu_item(name, @green) end
43
+ @accounts.data.keys.sort{|a,b|a.upcase<=>b.upcase}.each do |name| add_menu_item(name) end
44
+ @menu.show_all
45
+ @menu.popup_at_pointer
46
+ end
47
+
48
+ def add_menu_item(name, color=nil)
49
+ menu_item = Such::MenuItem.new [label:name], :main_menu_item, 'activate' do selected_account(name) end
50
+ account = @accounts.get name
51
+ color = (Time.now.to_i - account.updated > CONFIG[:TooOld])? @red : @blue unless color
52
+ menu_item.override_color :normal, color
53
+ @menu.append menu_item
54
+ end
55
+
56
+ def selected_account(name)
57
+ @recent.unshift name; @recent.uniq!; @recent.pop if @recent.length>3
58
+ account = @accounts.get name
59
+ setup_main_page account
60
+ setup_edit_page account
61
+ copy2clipboard(account.password, account.username)
62
+ end
63
+
64
+ def copy2clipboard(pwd, user)
65
+ @primary.text, @clipboard.text = pwd, user
66
+ GLib::Timeout.add_seconds(CONFIG[:ClipboardTimeout]) do
67
+ @primary.text = '' if @primary.wait_for_text == pwd
68
+ @clipboard.text = '' if @clipboard.wait_for_text == user
69
+ false
70
+ end
71
+ end
72
+
73
+ def view_row(page, label)
74
+ row = Such::Box.new page, :field_row!
75
+ Such::Label.new(row, label, :field_label)
76
+ Such::Label.new(row, :field_view!)
77
+ end
78
+
79
+ def field_row(page, label, entry=:field_entry!, &block)
80
+ row = Such::Box.new page, :field_row!
81
+ Such::Label.new(row, label, :field_label)
82
+ Such::Entry.new(row, entry, ((block)? 'activate' : ''), &block)
83
+ end
84
+
85
+ def show_main_page
86
+ @on_main_page = true
87
+ @main_page.show_all
88
+ @toolbox.show_all
89
+ end
90
+
91
+ def hide_main_page
92
+ @on_main_page = false
93
+ @main_page.hide
94
+ @toolbox.hide
95
+ end
96
+
97
+ def bootstrap_setups
98
+ names = @accounts.data.keys
99
+ account = (names.empty?)? nil : @accounts.get(names[rand(names.length)])
100
+ setup_edit_page(account) if account
101
+ setup_main_page(account)
102
+ end
103
+
104
+ def rehash(pwd)
105
+ pwd += CONFIG[:Salt] if pwd.length < CONFIG[:LongPwd]
106
+ pwd = Digest::SHA256.hexdigest(pwd).upcase
107
+ H2Q.convert pwd
108
+ end
109
+
110
+ def build_password_page
111
+ @password_page = Such::Box.new @pages, :page!
112
+ Such::Label.new @password_page, :PASSWORD_PAGE_LABEL, :page_label
113
+ error_label,previous = nil,'' # updates below
114
+ password_entry = field_row(@password_page, :PASSWORD, :password_entry!) do
115
+ pwd = password_entry.text.strip
116
+ password_entry.text = ''
117
+ raise CONFIG[:TooShort] if pwd.length < CONFIG[:MinPwdLen]
118
+ if not @reset and @accounts.exist?
119
+ @accounts.load rehash pwd
120
+ else
121
+ raise CONFIG[:Confirm] unless pwd==previous
122
+ @accounts.save rehash pwd
123
+ @reset = false
124
+ end
125
+ @password_page.hide
126
+ build_add_page unless @add_page
127
+ build_edit_page unless @edit_page
128
+ build_main_page unless @main_page
129
+ build_tools unless @tools
130
+ bootstrap_setups
131
+ show_main_page
132
+ rescue
133
+ error_label.text = $!.message
134
+ previous = pwd
135
+ end
136
+ error_label = Such::Label.new @password_page, :error_label!
137
+ end
138
+
139
+ def build_add_page
140
+ @add_page = Such::Box.new @pages, :page!
141
+ Such::Label.new @add_page, :ADD_PAGE_LABEL, :page_label
142
+ error_label = nil # updates below
143
+ add_account_entry = field_row(@add_page, :NAME) do
144
+ name = add_account_entry.text.strip
145
+ @accounts.add name
146
+ @accounts.save
147
+ account = @accounts.get name
148
+ setup_edit_page(account)
149
+ setup_main_page(account)
150
+ @add_page.hide
151
+ add_account_entry.text = ''
152
+ @edit_page.show_all
153
+ rescue
154
+ error_label.text = $!.message
155
+ end
156
+ Such::Button.new @add_page, :CANCEL, :tool_button do
157
+ @add_page.hide
158
+ add_account_entry.text = ''
159
+ show_main_page
160
+ end
161
+ error_label = Such::Label.new @add_page, :error_label!
162
+ end
163
+
164
+ def visibility_toggleling(entry)
165
+ entry.signal_connect('enter-notify-event') do
166
+ entry.set_visibility true unless entry.has_focus?
167
+ end
168
+ entry.signal_connect('leave-notify-event') do
169
+ entry.set_visibility false unless entry.has_focus?
170
+ end
171
+ entry.signal_connect('focus-in-event') do
172
+ entry.set_visibility true
173
+ end
174
+ entry.signal_connect('focus-out-event') do
175
+ entry.set_visibility false
176
+ end
177
+ end
178
+
179
+ def show_toggleling(label)
180
+ label.signal_connect('button-press-event') do |_,e|
181
+ if e.button==1 and not (pwd=label.text).empty?
182
+ case pwd
183
+ when CONFIG[:HiddenPwd]
184
+ label.text = @accounts.get(@name.text).password
185
+ when TOTPx
186
+ label.text = TOTP.passwords(label.text)[1].to_s
187
+ else
188
+ label.text = CONFIG[:HiddenPwd]
189
+ end
190
+ end
191
+ end
192
+ end
193
+
194
+ def build_edit_page
195
+ @edit_page = Such::Box.new @pages, :page!
196
+ Such::Label.new @edit_page, :EDIT_PAGE_LABEL, :page_label
197
+
198
+ @edit_name = view_row @edit_page, :NAME
199
+ @edit_url = field_row @edit_page, :URL
200
+ @edit_note = field_row @edit_page, :NOTE
201
+ @edit_username = field_row @edit_page, :USERNAME
202
+ @edit_password = field_row @edit_page, :PASSWORD, :password_entry!
203
+
204
+ visibility_toggleling @edit_password
205
+
206
+ generator = Such::Box.new @edit_page, :toolbox!
207
+ pwdlen=rndpwd=nil
208
+ Such::Button.new generator, :RAND, :tool_button do
209
+ rndpwd = H2Q.convert RND.hexadecimal
210
+ @edit_password.text = rndpwd[0...pwdlen.value]
211
+ end
212
+ pwdlen = Such::SpinButton.new generator, :pwdlen!, 'value-changed' do
213
+ @edit_password.text = rndpwd[0...pwdlen.value] if rndpwd
214
+ end
215
+
216
+ toolbox = Such::Box.new @edit_page, :toolbox!
217
+ error_label = Such::Label.new @edit_page, :error_label!
218
+
219
+ Such::Button.new toolbox, :SAVE, :tool_button do
220
+ account = @accounts.get @edit_name.text.strip
221
+ account.url = @edit_url.text.strip
222
+ account.note = @edit_note.text.strip
223
+ account.username = @edit_username.text.strip
224
+ account.password = @edit_password.text.strip
225
+ @accounts.save
226
+ rndpwd = nil
227
+ @edit_page.hide
228
+ setup_main_page(account)
229
+ show_main_page
230
+ rescue
231
+ error_label.text = $!.message
232
+ end
233
+ Such::Button.new toolbox, :CANCEL, :tool_button do
234
+ account = @accounts.get @edit_name.text
235
+ rndpwd = nil
236
+ @edit_page.hide
237
+ setup_edit_page(account) # restore values
238
+ show_main_page
239
+ end
240
+ Such::Button.new toolbox, :DELETE, :tool_button do
241
+ ursure = Gtk3App::YesNoDialog.new :delete_ursure!
242
+ Gtk3App.transient ursure
243
+ if ursure.ok?
244
+ @recent.delete @edit_name.text
245
+ @accounts.delete @edit_name.text
246
+ @accounts.save
247
+ rndpwd = nil
248
+ @edit_page.hide
249
+ bootstrap_setups
250
+ show_main_page
251
+ end
252
+ end
253
+ end
254
+
255
+ def setup_edit_page(account)
256
+ @edit_name.text = account.name
257
+ @edit_url.text = account.url
258
+ @edit_note.text = account.note
259
+ @edit_username.text = account.username
260
+ @edit_password.text = account.password
261
+ end
262
+
263
+ def build_main_page
264
+ @main_page = Such::Box.new @pages, :page!
265
+ Such::Label.new @main_page, :MAIN_PAGE_LABEL, :page_label
266
+
267
+ @name = view_row @main_page, :NAME
268
+ @url = view_row @main_page, :URL
269
+ @note = view_row @main_page, :NOTE
270
+ @username = view_row @main_page, :USERNAME
271
+ @password = view_row @main_page, :PASSWORD
272
+
273
+ show_toggleling @password
274
+ end
275
+
276
+ def setup_main_page(account)
277
+ @name.text = account&.name || ''
278
+ @url.text = account&.url || ''
279
+ @note.text = account&.note || ''
280
+ @username.text = account&.username || ''
281
+ @password.text =(account&.password&.>'')? CONFIG[:HiddenPwd] : ''
282
+ end
283
+
284
+ def build_tools
285
+ @tools = true
286
+ Such::Button.new @toolbox, :ADD, :tool_button do
287
+ hide_main_page
288
+ @add_page.show_all
289
+ end
290
+ Such::Button.new @toolbox, :EDIT, :tool_button do
291
+ unless (name=@name.text).empty?
292
+ hide_main_page
293
+ @edit_page.show_all
294
+ end
295
+ end
296
+ Such::Button.new @toolbox, :GO, :tool_button do
297
+ unless (name=@name.text).empty?
298
+ url = @accounts.get(name).url
299
+ system(Gtk3App::CONFIG[:Open], url) unless url.empty?
300
+ end
301
+ end
302
+ Such::Button.new @toolbox, :CURRENT, :tool_button do
303
+ unless (name=@name.text).empty?
304
+ account = @accounts.get name
305
+ copy2clipboard(account.password, account.username)
306
+ end
307
+ end
308
+ Such::Button.new @toolbox, :PREVIOUS, :tool_button do
309
+ unless (name=@name.text).empty?
310
+ account = @accounts.get name
311
+ copy2clipboard(account.previous, account.password)
312
+ end
313
+ end
314
+ end
315
+
316
+ def self.run = Gtk3App.run(klass:Gtk2PasswordApp)
317
+ end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gtk2passwordapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 6.1.210628
5
5
  platform: ruby
6
6
  authors:
7
7
  - carlosjhr64
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-22 00:00:00.000000000 Z
11
+ date: 2021-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: gtk3app
14
+ name: yaml_zlib_blowfish
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '2.0'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 2.0.0
22
+ version: 2.0.210127
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,118 +29,121 @@ dependencies:
29
29
  version: '2.0'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 2.0.0
32
+ version: 2.0.210127
33
33
  - !ruby/object:Gem::Dependency
34
- name: yaml_zlib_blowfish
34
+ name: base_convert
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '1.0'
39
+ version: '6.0'
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 1.0.0
42
+ version: 6.0.210201
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: '1.0'
49
+ version: '6.0'
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: 1.0.0
52
+ version: 6.0.210201
53
53
  - !ruby/object:Gem::Dependency
54
- name: super_random
54
+ name: gtk3app
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: '1.0'
59
+ version: '5.1'
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: 1.0.0
62
+ version: 5.1.210203
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '1.0'
69
+ version: '5.1'
70
70
  - - ">="
71
71
  - !ruby/object:Gem::Version
72
- version: 1.0.0
72
+ version: 5.1.210203
73
73
  - !ruby/object:Gem::Dependency
74
- name: base_convert
74
+ name: base32
75
75
  requirement: !ruby/object:Gem::Requirement
76
76
  requirements:
77
- - - "~>"
77
+ - - '='
78
78
  - !ruby/object:Gem::Version
79
- version: '2.0'
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: 2.0.0
79
+ version: 0.3.4
83
80
  type: :runtime
84
81
  prerelease: false
85
82
  version_requirements: !ruby/object:Gem::Requirement
86
83
  requirements:
87
- - - "~>"
84
+ - - '='
88
85
  - !ruby/object:Gem::Version
89
- version: '2.0'
90
- - - ">="
86
+ version: 0.3.4
87
+ - !ruby/object:Gem::Dependency
88
+ name: totp
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - '='
91
92
  - !ruby/object:Gem::Version
92
- version: 2.0.0
93
+ version: 1.0.0
94
+ type: :runtime
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - '='
99
+ - !ruby/object:Gem::Version
100
+ version: 1.0.0
93
101
  - !ruby/object:Gem::Dependency
94
- name: helpema
102
+ name: super_random
95
103
  requirement: !ruby/object:Gem::Requirement
96
104
  requirements:
97
105
  - - "~>"
98
106
  - !ruby/object:Gem::Version
99
- version: '0.2'
107
+ version: '2.0'
100
108
  - - ">="
101
109
  - !ruby/object:Gem::Version
102
- version: 0.2.0
110
+ version: 2.0.210126
103
111
  type: :runtime
104
112
  prerelease: false
105
113
  version_requirements: !ruby/object:Gem::Requirement
106
114
  requirements:
107
115
  - - "~>"
108
116
  - !ruby/object:Gem::Version
109
- version: '0.2'
117
+ version: '2.0'
110
118
  - - ">="
111
119
  - !ruby/object:Gem::Version
112
- version: 0.2.0
120
+ version: 2.0.210126
113
121
  description: |
114
122
  Ruby-Gnome Password Manager.
115
123
 
116
124
  Uses Blowfish to encrypt the datafile.
117
- Features random password generator and clipboard use.
125
+ Features random password generator, clipboard use, and TOTP.
118
126
  email: carlosjhr64@gmail.com
119
127
  executables:
120
- - gtk2pwdV
128
+ - gtk2passwordapp
121
129
  extensions: []
122
- extra_rdoc_files:
123
- - README.rdoc
130
+ extra_rdoc_files: []
124
131
  files:
125
- - README.rdoc
126
- - bin/gtk2pwdV
127
- - data/VERSION
132
+ - README.md
133
+ - bin/gtk2passwordapp
128
134
  - data/logo.png
129
135
  - lib/gtk2passwordapp.rb
130
136
  - lib/gtk2passwordapp/account.rb
131
137
  - lib/gtk2passwordapp/accounts.rb
138
+ - lib/gtk2passwordapp/cli.rb
132
139
  - lib/gtk2passwordapp/config.rb
133
- - lib/gtk2passwordapp/gtk2pwdv.rb
134
- - lib/gtk2passwordapp/such_parts.rb
135
- - lib/gtk2passwordapp/version.rb
140
+ - lib/gtk2passwordapp/gui.rb
136
141
  homepage: https://github.com/carlosjhr64/gtk2passwordapp
137
142
  licenses:
138
143
  - MIT
139
144
  metadata: {}
140
- post_install_message:
141
- rdoc_options:
142
- - "--main"
143
- - README.rdoc
145
+ post_install_message:
146
+ rdoc_options: []
144
147
  require_paths:
145
148
  - lib
146
149
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -154,10 +157,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
154
157
  - !ruby/object:Gem::Version
155
158
  version: '0'
156
159
  requirements:
157
- - 'ruby: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]'
158
- rubyforge_project:
159
- rubygems_version: 2.6.11
160
- signing_key:
160
+ - 'ruby: ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-linux]'
161
+ rubygems_version: 3.2.15
162
+ signing_key:
161
163
  specification_version: 4
162
164
  summary: Ruby-Gnome Password Manager.
163
165
  test_files: []