kwalletd5-wrapper 1.0.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/kwalletd5-wrapper.rb +166 -0
  3. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c803e2108e1ffe1d78230bd0f7a3d3184a552150123c0d2c0fb0078bcf13577b
4
+ data.tar.gz: f46d867ad0a9bd900ccdb8f644be93dca6c6c58fbc27d82d129ae830fd95f334
5
+ SHA512:
6
+ metadata.gz: 449d64ef73077aa8669bff7e4d041216869fad6b701f7b72c48d47600696679b35611c65ddb2c594ae47302a3cf4828eb54ebf398ec65697f3ef6b427d01effc
7
+ data.tar.gz: 4af62b72313eb951cac0f83e5eaf626375febd38d48d736c33db90d848916d6206575883dd850911332bea7753be2dd7d29582cc944fe7b98c13a1d7fe3ddc5d
@@ -0,0 +1,166 @@
1
+ #!/snap/bin/ruby
2
+ #
3
+ # Author: Eric Power
4
+ #
5
+ # Description:
6
+ # A module that provides an interface for communicating with the KDE wallet
7
+ # provided in Plasma 5.
8
+ #
9
+ # The interface is split into two categories:
10
+ # 1. A KwalletConnection
11
+ # initializing a KwalletConnection Object will ensure that the wallet
12
+ # is open (KWallet will prompt the user if required), and make reading
13
+ # and writing from that wallet easy.
14
+ # 2. Direct functions
15
+ # These functions provide tools to interact with KDE Wallet outside
16
+ # of a particular wallet. This includes things like checking which
17
+ # wallets exist, creating new wallets, pinging the Kwallet daemon,
18
+ # setting priorities, and more.
19
+ #
20
+ # This module will raise StandardErrors if qdbus or kwalletd5 is not available
21
+ # on the local machine.
22
+ #
23
+ # All calls to this module will raise StandardErrors if the call to qdbus
24
+ # fails. Check the associated error message for information on why the call
25
+ # failed.
26
+ #
27
+ # Released under the MIT License.
28
+ # Full license at https://github.com/epwr/kwalletd5-ruby-interface/LICENSE
29
+
30
+ # Dependencies
31
+ require 'open3'
32
+
33
+ if `which kwalletd5 2>&1` == ""
34
+ raise "Kwalletd5 Ruby Interface requires `kwalletd5` be installed on your system."
35
+ elsif `which qdbus 2>&1` == ""
36
+ raise "Kwalletd5 Ruby Interface requires `qdbus` be installed on your system."
37
+ end
38
+
39
+
40
+ module KWalletd5
41
+
42
+ # KWalletConnection
43
+ # Used to either open or create a wallet. The user will be prompted if KDE
44
+ # Wallet requires their authorization. The prompt will include app_name,
45
+ # so make sure that the user will recognize your app_name.
46
+ class KWalletConnection
47
+
48
+ def initialize(wallet_name, app_name, window_id: "0")
49
+ # TODO: explain window_id here.
50
+ @app_name = app_name
51
+ @wallet_id = message_kwd5("open", wallet_name, window_id, app_name)
52
+ @wallet_name = wallet_name
53
+ end
54
+
55
+ def replace_key(folder, old_key, new_key)
56
+ message_kwd5("renameEntry", @wallet_id, folder, old_key, new_key, @app_name)
57
+ end
58
+
59
+ def list_keys(folder)
60
+ message_kwd5("entryList", @wallet_id, folder, @app_name).split("\n")
61
+ end
62
+
63
+ def does_key_exist(folder, key)
64
+ message_kwd5("entryList", @wallet_id, folder, @app_name).split("\n").include?(key)
65
+ end
66
+
67
+ def write_entry(folder, key, value)
68
+ message_kwd5("writeEntry", @wallet_id, folder, key, value, @app_name)
69
+ end
70
+
71
+ def lookup_entry(folder, key)
72
+ message_kwd5("readEntry", @wallet_id, folder, key, @app_name)
73
+ end
74
+
75
+ def delete_entry(folder, key)
76
+ message_kwd5("removeEntry", @wallet_id, folder, key, @app_name)
77
+ end
78
+
79
+ def write_password(folder, key, value)
80
+ message_kwd5("writePassword", @wallet_id, folder, key, value, @app_name)
81
+ end
82
+
83
+ def lookup_password(folder, key)
84
+ message_kwd5("readPassword", @wallet_id, folder, key, @app_name)
85
+ end
86
+
87
+ def write_map(folder, key, value)
88
+ message_kwd5("writeMap", @wallet_id, folder, key, value, @app_name)
89
+ end
90
+
91
+ def lookup_map(folder, key)
92
+ message_kwd5("readMap", @wallet_id, folder, key, @app_name)
93
+ end
94
+
95
+ def create_folder(folder)
96
+ message_kwd5("createFolder", @wallet_id, folder, @app_name)
97
+ end
98
+
99
+ def delete_folder(folder)
100
+ message_kwd5("removeFolder", @wallet_id, folder, @app_name)
101
+ end
102
+
103
+ def list_folders
104
+ message_kwd5("folderList", @wallet_id, @app_name)
105
+ end
106
+
107
+ def does_folder_exist(folder)
108
+ message_kwd5("hasFolder", @wallet_id, folder, @app_name) == "true"
109
+ end
110
+
111
+ def is_open
112
+ msg = message_kwd5("isOpen", @wallet_name) == "true"
113
+ end
114
+
115
+ def close!
116
+ message_kwd5("close", @wallet_id, true, @app_name)
117
+ end
118
+ end
119
+
120
+ # Direct Functions
121
+
122
+ def change_wallet_password(wallet_name, app_name, window_id: "0")
123
+ # Kwalletd5 returns "-1" if the prompt opens properly. No way of telling if
124
+ # the password was actually changed (at least not via qdbus).
125
+ message_kwd5("changePassword", wallet_name, app_name, window_id) == "-1"
126
+ end
127
+
128
+ def list_wallets
129
+ message_kwd5("wallets")
130
+ end
131
+
132
+ def list_users(wallet_name)
133
+ message_kwd5("users", wallet_name)
134
+ end
135
+
136
+ def delete_wallet(wallet_name)
137
+ message_kwd5("deleteWallet", wallet_name)
138
+ end
139
+
140
+ def is_wallet_open(wallet_name)
141
+ message_kwd5("isOpen", wallet_name) == "true"
142
+ end
143
+
144
+ def does_wallet_exist(wallet_name)
145
+ message_kwd5("wallets").split("\n").include?(wallet_name)
146
+ end
147
+
148
+ # Private helper functions
149
+
150
+ private
151
+ def message_kwd5(method, *args, path: "/modules/kwalletd5")
152
+ # TODO: Test if capture3 handles escaping characters.
153
+ # TODO: handle the case where a string contains "\;" already (escape both?)
154
+ # args.each{ |arg| arg.split(";").join("\;") }
155
+ stdout, stderr, status = Open3.capture3("qdbus org.kde.kwalletd5 #{path} #{method} #{args.join(" ")}")
156
+ unless stderr == ""
157
+ raise stderr + " -- ran: qdbus org.kde.kwalletd5 #{path} #{method} #{args.join(" ")}"
158
+ end
159
+ unless status == 0
160
+ raise "Method call returned error code: #{status}. stdout = '#{stdout}', stderr = '#{stderr}'" +
161
+ " -- ran: qdbus org.kde.kwalletd5 #{path} #{method} #{args.join(" ")}"
162
+ end
163
+ stdout.strip()
164
+ end
165
+
166
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kwalletd5-wrapper
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Eric Power
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-09-09 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A gem that provides access to as much of the kwalletd5 api as could be
14
+ useful.
15
+ email: ericpower@outlook.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/kwalletd5-wrapper.rb
21
+ homepage: https://github.com/epwr/kwalletd5-ruby-wrapper
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubygems_version: 3.2.22
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: A gem that provides access to the kwalletd5 dbus api.
44
+ test_files: []