ruby-pass-qt 2.1.0 → 2.1.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.
- checksums.yaml +4 -4
- data/lib/pass-qt/app/views/mainwindow/components/passinfowidget/helpers.rb +19 -19
- data/lib/pass-qt/app/views/mainwindow/components/passinfowidget.rb +1 -1
- data/lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/funcs/filter.rb +45 -0
- data/lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/funcs/refresh.rb +58 -0
- data/lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/funcs.rb +2 -0
- data/lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/helpers.rb +11 -11
- data/lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget.rb +9 -24
- data/lib/pass-qt/app/views/mainwindow/components/passlistwidget.rb +1 -1
- data/lib/pass-qt/version.rb +1 -1
- metadata +4 -3
- data/lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/treebuilder.rb +0 -46
- data/lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/treefilter.rb +0 -45
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c91b2943a3a656afdaa617f3bc534c2beab4dfeebb86c38f177054a2291cc202
|
|
4
|
+
data.tar.gz: 7d911ca4c201296c9259d755d643e500c15bc95fc2a7f723cef21e68882ed6d1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 35cb967283aa998c40e766d78e53d909e5f1034005130238608d20f5c2d072839d3dac7a5ac3547da7c6293205768928a0a4d7c750286ed4b2d95777d0101f0c
|
|
7
|
+
data.tar.gz: 7346a3732c5fad0a5c820340a462e2e150f525a15cfb2ab6f2da7d92f0472a8c1a544e16fcec6c84e154d097bc2081f8b7ffc76d667bab97ace3528576007616
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
class MainWindowPassInfoWidget < RubyQt6::Bando::QWidget
|
|
2
|
-
|
|
3
|
-
def self.parse_passfile(data)
|
|
4
|
-
lines = data["stdout"].lines
|
|
5
|
-
password = lines[0][..-2]
|
|
2
|
+
private
|
|
6
3
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
matched = line.match(/\A(\w+:\s*)?(.*)\n/)
|
|
11
|
-
next if matched.nil?
|
|
4
|
+
def hlpr_parse_passfile(data)
|
|
5
|
+
lines = data["stdout"].lines
|
|
6
|
+
password = lines[0][..-2]
|
|
12
7
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
8
|
+
username = ""
|
|
9
|
+
website = ""
|
|
10
|
+
lines.each do |line|
|
|
11
|
+
matched = line.match(/\A(\w+:\s*)?(.*)\n/)
|
|
12
|
+
next if matched.nil?
|
|
18
13
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
14
|
+
case matched[1]&.rstrip&.downcase
|
|
15
|
+
when "username:" then username = matched[2]
|
|
16
|
+
when "website:" then website = matched[2]
|
|
17
|
+
end
|
|
24
18
|
end
|
|
19
|
+
|
|
20
|
+
{
|
|
21
|
+
"password" => password,
|
|
22
|
+
"username" => username,
|
|
23
|
+
"website" => website
|
|
24
|
+
}
|
|
25
25
|
end
|
|
26
26
|
end
|
|
@@ -26,7 +26,7 @@ class MainWindowPassInfoWidget < RubyQt6::Bando::QWidget
|
|
|
26
26
|
activate_infoframe
|
|
27
27
|
|
|
28
28
|
Pass.show(@store, @passname, on_success: ->(data) {
|
|
29
|
-
formdata =
|
|
29
|
+
formdata = hlpr_parse_passfile(data)
|
|
30
30
|
if formdata["password"].start_with?("otpauth:")
|
|
31
31
|
activate_otpform(formdata)
|
|
32
32
|
else
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
2
|
+
class TreeWidget < RubyQt6::Bando::QTreeWidget
|
|
3
|
+
private
|
|
4
|
+
|
|
5
|
+
def filter_imp(text)
|
|
6
|
+
set_current_item(nil)
|
|
7
|
+
|
|
8
|
+
if text.empty?
|
|
9
|
+
@dataitems.each do |_, item|
|
|
10
|
+
item.treewidgetitem.set_hidden(false)
|
|
11
|
+
item.treewidgetitem.set_selected(false)
|
|
12
|
+
end
|
|
13
|
+
return
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
re_options = QRegularExpression::UnanchoredWildcardConversion | QRegularExpression::NonPathWildcardConversion
|
|
17
|
+
re = QRegularExpression.from_wildcard(text, nil, re_options)
|
|
18
|
+
|
|
19
|
+
filepath_matched = Set.new
|
|
20
|
+
filepath_matched_1st = nil
|
|
21
|
+
@dataitems.each do |filepath, item|
|
|
22
|
+
has_match = re.match(item.passname).has_match
|
|
23
|
+
next unless has_match
|
|
24
|
+
|
|
25
|
+
if filepath_matched_1st.nil?
|
|
26
|
+
filepath_matched_1st = filepath if hlpr_passfile?(filepath)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
loop do
|
|
30
|
+
filepath_matched << filepath
|
|
31
|
+
filepath = QFileInfo.new(filepath).absolute_path
|
|
32
|
+
break unless @dataitems.key?(filepath)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
@dataitems.each do |filepath, item|
|
|
37
|
+
visible = filepath_matched.include?(filepath)
|
|
38
|
+
item.treewidgetitem.set_hidden(!visible)
|
|
39
|
+
|
|
40
|
+
selected = filepath_matched_1st == filepath
|
|
41
|
+
item.treewidgetitem.set_selected(selected)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
2
|
+
class TreeWidget < RubyQt6::Bando::QTreeWidget
|
|
3
|
+
private
|
|
4
|
+
|
|
5
|
+
def refresh_imp(store, selected_passname:)
|
|
6
|
+
@store = store
|
|
7
|
+
@dataitems = {}
|
|
8
|
+
|
|
9
|
+
clear
|
|
10
|
+
refresh_imp_rebuild_tree
|
|
11
|
+
expand_all
|
|
12
|
+
|
|
13
|
+
if selected_passname.nil?
|
|
14
|
+
set_current_item(nil)
|
|
15
|
+
else
|
|
16
|
+
@dataitems.each do |_, item|
|
|
17
|
+
next if item.passname != selected_passname
|
|
18
|
+
set_current_item(item.treewidgetitem)
|
|
19
|
+
break
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def refresh_imp_rebuild_tree
|
|
25
|
+
file_icon_provider = QFileIconProvider.new
|
|
26
|
+
store_root_path = QDir.new(@store)
|
|
27
|
+
dirs = [@store]
|
|
28
|
+
until dirs.empty?
|
|
29
|
+
dir = dirs.shift
|
|
30
|
+
diritem = @dataitems[dir]&.treewidgetitem || invisible_root_item
|
|
31
|
+
|
|
32
|
+
entry_list = QDir.new(dir).entry_info_list(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)
|
|
33
|
+
entry_list.each do |entry|
|
|
34
|
+
next if entry.hidden?
|
|
35
|
+
next if entry.file_name.starts_with(".")
|
|
36
|
+
|
|
37
|
+
filepath = entry.absolute_file_path
|
|
38
|
+
next if @dataitems.key?(filepath)
|
|
39
|
+
|
|
40
|
+
if entry.dir?
|
|
41
|
+
dirs << filepath
|
|
42
|
+
passname = store_root_path.relative_file_path(filepath)
|
|
43
|
+
elsif entry.file?
|
|
44
|
+
next unless hlpr_passfile?(entry)
|
|
45
|
+
passname = store_root_path.relative_file_path(filepath)
|
|
46
|
+
passname = passname[0, passname.size - entry.suffix.size - 1]
|
|
47
|
+
else
|
|
48
|
+
next
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
item = QTreeWidgetItem.new(diritem, QStringList.new << entry.complete_base_name << filepath)
|
|
52
|
+
item.set_icon(0, file_icon_provider.icon(entry))
|
|
53
|
+
@dataitems[filepath] = DataItem.new(passname, item)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
2
2
|
class TreeWidget < RubyQt6::Bando::QTreeWidget
|
|
3
|
-
|
|
4
|
-
def self.passfile?(fileinfo)
|
|
5
|
-
case fileinfo
|
|
6
|
-
when QFileInfo then fileinfo.suffix.downcase == "gpg"
|
|
7
|
-
when QString then fileinfo.ends_with(".gpg", Qt::CaseInsensitive)
|
|
8
|
-
else raise "unreachable!"
|
|
9
|
-
end
|
|
10
|
-
end
|
|
3
|
+
private
|
|
11
4
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
def hlpr_passfile?(fileinfo)
|
|
6
|
+
case fileinfo
|
|
7
|
+
when QFileInfo then fileinfo.suffix.downcase == "gpg"
|
|
8
|
+
when QString then fileinfo.ends_with(".gpg", Qt::CaseInsensitive)
|
|
9
|
+
else raise "unreachable!"
|
|
15
10
|
end
|
|
16
11
|
end
|
|
12
|
+
|
|
13
|
+
def hlpr_folderpath(store, fileinfo)
|
|
14
|
+
folder = fileinfo.dir? ? fileinfo.absolute_file_path : fileinfo.absolute_path
|
|
15
|
+
QDir.new(store).relative_file_path(folder)
|
|
16
|
+
end
|
|
17
17
|
end
|
|
18
18
|
end
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
require_relative "treewidget/funcs"
|
|
1
2
|
require_relative "treewidget/helpers"
|
|
2
|
-
require_relative "treewidget/treebuilder"
|
|
3
|
-
require_relative "treewidget/treefilter"
|
|
4
3
|
require_relative "treewidget/ui"
|
|
5
4
|
|
|
6
5
|
class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
7
6
|
class TreeWidget < RubyQt6::Bando::QTreeWidget
|
|
7
|
+
DataItem = Struct.new(:passname, :treewidgetitem)
|
|
8
|
+
|
|
8
9
|
q_object do
|
|
9
10
|
signal "nil_selected(QString)"
|
|
10
11
|
signal "passfile_selected(QString,QString)"
|
|
@@ -33,27 +34,11 @@ class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
def refresh(store, selected_passname: nil)
|
|
36
|
-
|
|
37
|
-
@dataitems = {}
|
|
38
|
-
|
|
39
|
-
builder = TreeBuilder.new
|
|
40
|
-
builder.perform(self, @store, @dataitems)
|
|
41
|
-
|
|
42
|
-
expand_all
|
|
43
|
-
if selected_passname.nil?
|
|
44
|
-
set_current_item(nil)
|
|
45
|
-
else
|
|
46
|
-
@dataitems.each do |_, item|
|
|
47
|
-
next if item.passname != selected_passname
|
|
48
|
-
set_current_item(item.treewidgetitem)
|
|
49
|
-
break
|
|
50
|
-
end
|
|
51
|
-
end
|
|
37
|
+
refresh_imp(store, selected_passname:)
|
|
52
38
|
end
|
|
53
39
|
|
|
54
|
-
def
|
|
55
|
-
|
|
56
|
-
filter.perform(self, @dataitems, text)
|
|
40
|
+
def filter(text)
|
|
41
|
+
filter_imp(text)
|
|
57
42
|
end
|
|
58
43
|
|
|
59
44
|
private
|
|
@@ -66,7 +51,7 @@ class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
|
66
51
|
|
|
67
52
|
filepath = curr.data(1, Qt::DisplayRole).value
|
|
68
53
|
dataitem = @dataitems[filepath]
|
|
69
|
-
|
|
54
|
+
hlpr_passfile?(filepath) ?
|
|
70
55
|
passfile_selected.emit(@store, dataitem.passname) :
|
|
71
56
|
passfolder_selected.emit(@store, dataitem.passname)
|
|
72
57
|
end
|
|
@@ -75,7 +60,7 @@ class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
|
75
60
|
item = selected_items[0]
|
|
76
61
|
if item
|
|
77
62
|
filepath = item.data(1, Qt::DisplayRole).value
|
|
78
|
-
folder =
|
|
63
|
+
folder = hlpr_folderpath(@store, QFileInfo.new(filepath))
|
|
79
64
|
folder = "" if folder == "."
|
|
80
65
|
else
|
|
81
66
|
folder = ""
|
|
@@ -91,7 +76,7 @@ class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
|
91
76
|
item = selected_items[0]
|
|
92
77
|
if item
|
|
93
78
|
filepath = item.data(1, Qt::DisplayRole).value
|
|
94
|
-
folder =
|
|
79
|
+
folder = hlpr_folderpath(@store, QFileInfo.new(filepath))
|
|
95
80
|
folder = "" if folder == "."
|
|
96
81
|
else
|
|
97
82
|
folder = ""
|
data/lib/pass-qt/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ruby-pass-qt
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.1.
|
|
4
|
+
version: 2.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- John Doe
|
|
@@ -48,9 +48,10 @@ files:
|
|
|
48
48
|
- lib/pass-qt/app/views/mainwindow/components/passinfowidget/ui.rb
|
|
49
49
|
- lib/pass-qt/app/views/mainwindow/components/passlistwidget.rb
|
|
50
50
|
- lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget.rb
|
|
51
|
+
- lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/funcs.rb
|
|
52
|
+
- lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/funcs/filter.rb
|
|
53
|
+
- lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/funcs/refresh.rb
|
|
51
54
|
- lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/helpers.rb
|
|
52
|
-
- lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/treebuilder.rb
|
|
53
|
-
- lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/treefilter.rb
|
|
54
55
|
- lib/pass-qt/app/views/mainwindow/components/passlistwidget/treewidget/ui.rb
|
|
55
56
|
- lib/pass-qt/app/views/mainwindow/components/passlistwidget/ui.rb
|
|
56
57
|
- lib/pass-qt/app/views/mainwindow/ui.rb
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
2
|
-
class TreeWidget < RubyQt6::Bando::QTreeWidget
|
|
3
|
-
DataItem = Struct.new(:passname, :treewidgetitem)
|
|
4
|
-
|
|
5
|
-
class TreeBuilder
|
|
6
|
-
def initialize
|
|
7
|
-
@fileiconprovider = QFileIconProvider.new
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def perform(treewidget, store, dataitems)
|
|
11
|
-
treewidget.clear
|
|
12
|
-
|
|
13
|
-
store_root_path = QDir.new(store)
|
|
14
|
-
dirs = [store]
|
|
15
|
-
until dirs.empty?
|
|
16
|
-
dir = dirs.shift
|
|
17
|
-
diritem = dataitems[dir]&.treewidgetitem || treewidget.invisible_root_item
|
|
18
|
-
|
|
19
|
-
entry_list = QDir.new(dir).entry_info_list(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)
|
|
20
|
-
entry_list.each do |entry|
|
|
21
|
-
next if entry.hidden?
|
|
22
|
-
next if entry.file_name.starts_with(".")
|
|
23
|
-
|
|
24
|
-
filepath = entry.absolute_file_path
|
|
25
|
-
next if dataitems.key?(filepath)
|
|
26
|
-
|
|
27
|
-
if entry.dir?
|
|
28
|
-
dirs << filepath
|
|
29
|
-
passname = store_root_path.relative_file_path(filepath)
|
|
30
|
-
elsif entry.file?
|
|
31
|
-
next unless Helpers.passfile?(entry)
|
|
32
|
-
passname = store_root_path.relative_file_path(filepath)
|
|
33
|
-
passname = passname[0, passname.size - entry.suffix.size - 1]
|
|
34
|
-
else
|
|
35
|
-
next
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
item = QTreeWidgetItem.new(diritem, QStringList.new << entry.complete_base_name << filepath)
|
|
39
|
-
item.set_icon(0, @fileiconprovider.icon(entry))
|
|
40
|
-
dataitems[filepath] = DataItem.new(passname, item)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
class MainWindowPassListWidget < RubyQt6::Bando::QWidget
|
|
2
|
-
class TreeWidget < RubyQt6::Bando::QTreeWidget
|
|
3
|
-
class TreeFilter
|
|
4
|
-
def perform(treewidget, dataitems, text)
|
|
5
|
-
treewidget.set_current_item(nil)
|
|
6
|
-
|
|
7
|
-
if text.empty?
|
|
8
|
-
dataitems.each do |_, item|
|
|
9
|
-
item.treewidgetitem.set_hidden(false)
|
|
10
|
-
item.treewidgetitem.set_selected(false)
|
|
11
|
-
end
|
|
12
|
-
return
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
re_options = QRegularExpression::UnanchoredWildcardConversion | QRegularExpression::NonPathWildcardConversion
|
|
16
|
-
re = QRegularExpression.from_wildcard(text, nil, re_options)
|
|
17
|
-
|
|
18
|
-
filepath_matched = Set.new
|
|
19
|
-
filepath_matched_1st = nil
|
|
20
|
-
dataitems.each do |filepath, item|
|
|
21
|
-
has_match = re.match(item.passname).has_match
|
|
22
|
-
next unless has_match
|
|
23
|
-
|
|
24
|
-
if filepath_matched_1st.nil?
|
|
25
|
-
filepath_matched_1st = filepath if Helpers.passfile?(filepath)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
loop do
|
|
29
|
-
filepath_matched << filepath
|
|
30
|
-
filepath = QFileInfo.new(filepath).absolute_path
|
|
31
|
-
break unless dataitems.key?(filepath)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
dataitems.each do |filepath, item|
|
|
36
|
-
visible = filepath_matched.include?(filepath)
|
|
37
|
-
item.treewidgetitem.set_hidden(!visible)
|
|
38
|
-
|
|
39
|
-
selected = filepath_matched_1st == filepath
|
|
40
|
-
item.treewidgetitem.set_selected(selected)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|