File: kwalletd.h

package info (click to toggle)
kde-runtime 4%3A17.08.3-2.1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 25,204 kB
  • sloc: cpp: 111,675; ansic: 5,030; perl: 1,579; xml: 793; sh: 407; makefile: 42; python: 28
file content (249 lines) | stat: -rw-r--r-- 9,372 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
// -*- indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*-
/*
   This file is part of the KDE libraries

   Copyright (c) 2002-2004 George Staikos <staikos@kde.org>
   Copyright (c) 2008 Michael Leupold <lemma@confuego.org>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.

*/
#ifndef _KWALLETD_H_
#define _KWALLETD_H_

#include <QtCore/QString>
#include <QImage>
#include <QtCore/QHash>
#include "kwalletbackend.h"
#include <QtCore/QPointer>
#include <time.h>
#include <stdlib.h>
#include <QtDBus/QtDBus>
#include <QDBusServiceWatcher>

#include "ktimeout.h"
#include "kwalletsessionstore.h"

class KDirWatch;
class KTimeout;

// @Private
class KWalletTransaction;
class KWalletSessionStore;

class KWalletD : public QObject, protected QDBusContext {
	Q_OBJECT
	
	public:
		KWalletD();
		virtual ~KWalletD();
	
	public Q_SLOTS:
		// Is the wallet enabled?  If not, all open() calls fail.
		bool isEnabled() const;

		// Open and unlock the wallet
		int open(const QString& wallet, qlonglong wId, const QString& appid);

		// Open and unlock the wallet with this path
		int openPath(const QString& path, qlonglong wId, const QString& appid);

		// Open the wallet asynchronously
		int openAsync(const QString& wallet, qlonglong wId, const QString& appid,
		              bool handleSession);

		// Open and unlock the wallet with this path asynchronously
		int openPathAsync(const QString& path, qlonglong wId, const QString& appid,
		                  bool handleSession);

		// Close and lock the wallet
		// If force = true, will close it for all users.  Behave.  This
		// can break applications, and is generally intended for use by
		// the wallet manager app only.
		int close(const QString& wallet, bool force);
		int close(int handle, bool force, const QString& appid);

		// Save to disk but leave open
		Q_NOREPLY void sync(int handle, const QString& appid);

		// Physically deletes the wallet from disk.
		int deleteWallet(const QString& wallet);

		// Returns true if the wallet is open
		bool isOpen(const QString& wallet);
		bool isOpen(int handle);

		// List the users of this wallet
		QStringList users(const QString& wallet) const;

		// Change the password of this wallet
		void changePassword(const QString& wallet, qlonglong wId, const QString& appid);

		// A list of all wallets
		QStringList wallets() const;

		// A list of all folders in this wallet
		QStringList folderList(int handle, const QString& appid);

		// Does this wallet have this folder?
		bool hasFolder(int handle, const QString& folder, const QString& appid);

		// Create this folder
		bool createFolder(int handle, const QString& folder, const QString& appid);

		// Remove this folder
		bool removeFolder(int handle, const QString& folder, const QString& appid);

		// List of entries in this folder
		QStringList entryList(int handle, const QString& folder, const QString& appid);

		// Read an entry.  If the entry does not exist, it just
		// returns an empty result.	 It is your responsibility to check
		// hasEntry() first.
		QByteArray readEntry(int handle, const QString& folder, const QString& key, const QString& appid);
		QByteArray readMap(int handle, const QString& folder, const QString& key, const QString& appid);
		QString readPassword(int handle, const QString& folder, const QString& key, const QString& appid);
		QVariantMap readEntryList(int handle, const QString& folder, const QString& key, const QString& appid);
		QVariantMap readMapList(int handle, const QString& folder, const QString& key, const QString& appid);
		QVariantMap readPasswordList(int handle, const QString& folder, const QString& key, const QString& appid);

		// Rename an entry.	 rc=0 on success.
		int renameEntry(int handle, const QString& folder, const QString& oldName, const QString& newName, const QString& appid);

		// Write an entry.	rc=0 on success.
		int writeEntry(int handle, const QString& folder, const QString& key, const QByteArray& value, int entryType, const QString& appid);
		int writeEntry(int handle, const QString& folder, const QString& key, const QByteArray& value, const QString& appid);
		int writeMap(int handle, const QString& folder, const QString& key, const QByteArray& value, const QString& appid);
		int writePassword(int handle, const QString& folder, const QString& key, const QString& value, const QString& appid);

		// Does the entry exist?
		bool hasEntry(int handle, const QString& folder, const QString& key, const QString& appid);

		// What type is the entry?
		int entryType(int handle, const QString& folder, const QString& key, const QString& appid);

		// Remove an entry.	 rc=0 on success.
		int removeEntry(int handle, const QString& folder, const QString& key, const QString& appid);

		// Disconnect an app from a wallet
		bool disconnectApplication(const QString& wallet, const QString& application);

		void reconfigure();

		// Determine
		bool folderDoesNotExist(const QString& wallet, const QString& folder);
		bool keyDoesNotExist(const QString& wallet, const QString& folder, const QString& key);

		void closeAllWallets();

		QString networkWallet();

		QString localWallet();

		void screenSaverChanged(bool);
      
      // Open a wallet using a pre-hashed password. This is only useful in cooperation
      // with the kwallet PAM module. It's also less secure than manually entering the
      // password as the password hash is transmitted using D-Bus.
      int pamOpen(const QString &wallet, const QByteArray &passwordHash, int sessionTimeout);

	Q_SIGNALS:
		void walletAsyncOpened(int id, int handle); // used to notify KWallet::Wallet
		void walletListDirty();
		void walletCreated(const QString& wallet);
		void walletOpened(const QString& wallet);
		void walletDeleted(const QString& wallet);
		void walletClosed(const QString& wallet);
		void walletClosed(int handle);
		void allWalletsClosed();
		void folderListUpdated(const QString& wallet);
		void folderUpdated(const QString&, const QString&);
		void applicationDisconnected(const QString& wallet, const QString& application);

	private Q_SLOTS:
		void slotServiceOwnerChanged(const QString& name, const QString &oldOwner,
		                             const QString &newOwner);
		void emitWalletListDirty();
		void timedOutClose(int handle);
		void timedOutSync(int handle);
		void notifyFailures();
		void processTransactions();
		void activatePasswordDialog();
        void connectToScreenSaver();

	private:
		// Internal - open a wallet
		int internalOpen(const QString& appid, const QString& wallet, bool isPath, WId w,
		                 bool modal, const QString& service);
		// Internal - close this wallet.
		int internalClose(KWallet::Backend *w, int handle, bool force);
		
		bool isAuthorizedApp(const QString& appid, const QString& wallet, WId w);
		// This also validates the handle.	May return NULL.
		KWallet::Backend* getWallet(const QString& appid, int handle);
		// Generate a new unique handle.
		int generateHandle();
		// Emit signals about closing wallets
		void doCloseSignals(int,const QString&);
		void emitFolderUpdated(const QString&, const QString&);
		// Implicitly allow access for this application
		bool implicitAllow(const QString& wallet, const QString& app);
		bool implicitDeny(const QString& wallet, const QString& app);

		void doTransactionChangePassword(const QString& appid, const QString& wallet, qlonglong wId);
		void doTransactionOpenCancelled(const QString& appid, const QString& wallet,
		                                const QString& service);
		int doTransactionOpen(const QString& appid, const QString& wallet, bool isPath,
		                      qlonglong wId, bool modal, const QString& service);
		void initiateSync(int handle);

		void setupDialog( QWidget* dialog, WId wId, const QString& appid, bool modal );
		void checkActiveDialog();

		QPair<int, KWallet::Backend*> findWallet(const QString& walletName) const;

		typedef QHash<int, KWallet::Backend *> Wallets;
		Wallets _wallets;
		KDirWatch *_dw;
		int _failed;

		// configuration values
		bool _leaveOpen, _closeIdle, _launchManager, _enabled;
		bool _openPrompt, _firstUse, _showingFailureNotify;
		int _idleTime;
		QMap<QString,QStringList> _implicitAllowMap, _implicitDenyMap;
		KTimeout _closeTimers;
		KTimeout _syncTimers;
		const int _syncTime;
      static bool _processing;

		KWalletTransaction *_curtrans; // current transaction
		QList<KWalletTransaction*> _transactions;
		QPointer< QWidget > activeDialog;
		
#ifdef Q_WS_X11
		QDBusInterface *screensaver;
#endif

		// sessions
		KWalletSessionStore _sessions;
        QDBusServiceWatcher _serviceWatcher;

        bool _useGpg;
};


#endif