summaryrefslogtreecommitdiffabout
path: root/pwmanager
Unidiff
Diffstat (limited to 'pwmanager') (more/less context) (ignore whitespace changes)
-rw-r--r--pwmanager/pwmanager/pwmanagerE.pro11
-rw-r--r--pwmanager/pwmanager/pwmdoc.cpp2
2 files changed, 9 insertions, 4 deletions
diff --git a/pwmanager/pwmanager/pwmanagerE.pro b/pwmanager/pwmanager/pwmanagerE.pro
index 4c3a568..6aa0571 100644
--- a/pwmanager/pwmanager/pwmanagerE.pro
+++ b/pwmanager/pwmanager/pwmanagerE.pro
@@ -1,163 +1,168 @@
1 TEMPLATE= app 1 TEMPLATE= app
2 CONFIG += qt warn_on 2 CONFIG += qt warn_on
3 3
4 4
5 TARGET = pwmpi 5 TARGET = pwmpi
6OBJECTS_DIR = obj/$(PLATFORM) 6OBJECTS_DIR = obj/$(PLATFORM)
7MOC_DIR = moc/$(PLATFORM) 7MOC_DIR = moc/$(PLATFORM)
8DESTDIR=$(QPEDIR)/bin 8DESTDIR=$(QPEDIR)/bin
9 9
10INCLUDEPATH += . ../../ ../../qtcompat ../../qtcompat/xml ../../libkdepim ../../microkde ../../microkde/kdecore ../../microkde/kdeui ../../microkde/kutils $(QPEDIR)/include 10INCLUDEPATH += . ../../ ../../qtcompat ../../qtcompat/xml ../../libkdepim ../../microkde ../../microkde/kdecore ../../microkde/kdeui ../../microkde/kutils $(QPEDIR)/include
11DEFINES += PWM_EMBEDDED CONFIG_PWMANAGER_GCRY 11DEFINES += PWM_EMBEDDED CONFIG_PWMANAGER_GCRY
12 12
13#enable this setting if you want debugoutput for pwmanager 13#enable this setting if you want debugoutput for pwmanager
14#DEFINES += CONFIG_DEBUG 14#DEFINES += CONFIG_DEBUG
15 15LIBS += -L../libcrypt/$(PLATFORM)
16LIBS += -lmicrokde 16LIBS += -lmicrokde
17LIBS += -lmicroqtcompat 17LIBS += -lmicroqtcompat
18LIBS += -lmicrokdepim 18LIBS += -lmicrokdepim
19LIBS += -L$(QPEDIR)/lib 19LIBS += -L$(QPEDIR)/lib
20LIBS += -lqpe 20LIBS += -lqpe
21LIBS += -lz 21LIBS += -lzlib
22#LIBS += -lbz2 22#LIBS += -lbz2
23LIBS += -lgcrypt 23#LIBS += -lkpmicrogcrypt
24LIBS += -ljpeg
24LIBS += $(QTOPIALIB) 25LIBS += $(QTOPIALIB)
26LIBS += -lkpmicrocipher
27LIBS += -lkpmicroerror
28LIBS += -lkpmicrompi
29LIBS += -lstdc++
25 30
26#INTERFACES = \ 31#INTERFACES = \
27#addentrywnd.ui \ 32#addentrywnd.ui \
28#configwnd.ui \ 33#configwnd.ui \
29#findwnd.ui \ 34#findwnd.ui \
30#getmasterpwwnd.ui \ 35#getmasterpwwnd.ui \
31#pwgenwnd.ui \ 36#pwgenwnd.ui \
32#setmasterpwwnd.ui \ 37#setmasterpwwnd.ui \
33#subtbledit.ui 38#subtbledit.ui
34 39
35#INTERFACES = \ 40#INTERFACES = \
36#subtbledit.ui \ 41#subtbledit.ui \
37 42
38 43
39 44
40#HEADERS = \ 45#HEADERS = \
41#configuration_31compat.h \ 46#configuration_31compat.h \
42#configuration.h \ 47#configuration.h \
43#configwnd.h \ 48#configwnd.h \
44#configwndimpl.h \ 49#configwndimpl.h \
45#selftest.h 50#selftest.h
46#subtbledit.h \ 51#subtbledit.h \
47#subtbleditimpl.h \ 52#subtbleditimpl.h \
48#compressbzip2.h \ 53#compressbzip2.h \
49 54
50HEADERS = \ 55HEADERS = \
51addentrywnd_emb.h \ 56addentrywnd_emb.h \
52addentrywndimpl.h \ 57addentrywndimpl.h \
53base64.h \ 58base64.h \
54binentrygen.h \ 59binentrygen.h \
55blowfish.h \ 60blowfish.h \
56commentbox.h \ 61commentbox.h \
57compiler.h \ 62compiler.h \
58compressgzip.h \ 63compressgzip.h \
59findwnd_emb.h \ 64findwnd_emb.h \
60findwndimpl.h \ 65findwndimpl.h \
61genpasswd.h \ 66genpasswd.h \
62getkeycardwnd.h \ 67getkeycardwnd.h \
63getmasterpwwnd_emb.h \ 68getmasterpwwnd_emb.h \
64getmasterpwwndimpl.h \ 69getmasterpwwndimpl.h \
65globalstuff.h \ 70globalstuff.h \
66gpasmanfile.h \ 71gpasmanfile.h \
67htmlgen.h \ 72htmlgen.h \
68htmlparse.h \ 73htmlparse.h \
69ipc.h \ 74ipc.h \
70libgcryptif.h \ 75libgcryptif.h \
71listobjselectwnd.h \ 76listobjselectwnd.h \
72listviewpwm.h \ 77listviewpwm.h \
73printtext.h \ 78printtext.h \
74pwgenwnd_emb.h \ 79pwgenwnd_emb.h \
75pwgenwndimpl.h \ 80pwgenwndimpl.h \
76pwmdoc.h \ 81pwmdoc.h \
77pwmdocui.h \ 82pwmdocui.h \
78pwmexception.h \ 83pwmexception.h \
79pwm.h \ 84pwm.h \
80pwminit.h \ 85pwminit.h \
81pwmprefs.h \ 86pwmprefs.h \
82pwmprint.h \ 87pwmprint.h \
83pwmtray.h \ 88pwmtray.h \
84pwmview.h \ 89pwmview.h \
85pwmviewstyle_0.h \ 90pwmviewstyle_0.h \
86pwmviewstyle_1.h \ 91pwmviewstyle_1.h \
87pwmviewstyle.h \ 92pwmviewstyle.h \
88randomizer.h \ 93randomizer.h \
89rc2.h \ 94rc2.h \
90rencatwnd.h \ 95rencatwnd.h \
91serializer.h \ 96serializer.h \
92setmasterpwwnd_emb.h \ 97setmasterpwwnd_emb.h \
93setmasterpwwndimpl.h \ 98setmasterpwwndimpl.h \
94sha1.h \ 99sha1.h \
95waitwnd.h \ 100waitwnd.h \
96kcmconfigs/kcmpwmconfig.h \ 101kcmconfigs/kcmpwmconfig.h \
97kcmconfigs/pwmconfigwidget.h 102kcmconfigs/pwmconfigwidget.h
98 103
99#sources that need not be build 104#sources that need not be build
100#SOURCES = \ 105#SOURCES = \
101#advcommeditimpl.cpp \ 106#advcommeditimpl.cpp \
102#configuration.cpp \ 107#configuration.cpp \
103#configwnd.cpp \ 108#configwnd.cpp \
104#configwndimpl.cpp \ 109#configwndimpl.cpp \
105#configuration_31compat.cpp \ 110#configuration_31compat.cpp \
106#htmlparse.cpp \ 111#htmlparse.cpp \
107#printtext.cpp \ 112#printtext.cpp \
108#selftest.cpp \ 113#selftest.cpp \
109#pwmprint.cpp \ 114#pwmprint.cpp \
110#spinforsignal.cpp 115#spinforsignal.cpp
111#subtbledit.cpp \ 116#subtbledit.cpp \
112#subtbleditimpl.cpp \ 117#subtbleditimpl.cpp \
113#compressbzip2.cpp 118#compressbzip2.cpp
114 119
115 120
116SOURCES = \ 121SOURCES = \
117addentrywnd_emb.cpp \ 122addentrywnd_emb.cpp \
118addentrywndimpl.cpp \ 123addentrywndimpl.cpp \
119base64.cpp \ 124base64.cpp \
120binentrygen.cpp \ 125binentrygen.cpp \
121blowfish.cpp \ 126blowfish.cpp \
122commentbox.cpp \ 127commentbox.cpp \
123compressgzip.cpp \ 128compressgzip.cpp \
124findwnd_emb.cpp \ 129findwnd_emb.cpp \
125findwndimpl.cpp \ 130findwndimpl.cpp \
126genpasswd.cpp \ 131genpasswd.cpp \
127getkeycardwnd.cpp \ 132getkeycardwnd.cpp \
128getmasterpwwnd_emb.cpp \ 133getmasterpwwnd_emb.cpp \
129getmasterpwwndimpl.cpp \ 134getmasterpwwndimpl.cpp \
130globalstuff.cpp \ 135globalstuff.cpp \
131gpasmanfile.cpp \ 136gpasmanfile.cpp \
132htmlgen.cpp \ 137htmlgen.cpp \
133ipc.cpp \ 138ipc.cpp \
134libgcryptif.cpp \ 139libgcryptif.cpp \
135listobjselectwnd.cpp \ 140listobjselectwnd.cpp \
136listviewpwm.cpp \ 141listviewpwm.cpp \
137main.cpp \ 142main.cpp \
138pwgenwnd_emb.cpp \ 143pwgenwnd_emb.cpp \
139pwgenwndimpl.cpp \ 144pwgenwndimpl.cpp \
140pwm.cpp \ 145pwm.cpp \
141pwmdoc.cpp \ 146pwmdoc.cpp \
142pwmdocui.cpp \ 147pwmdocui.cpp \
143pwmexception.cpp \ 148pwmexception.cpp \
144pwminit.cpp \ 149pwminit.cpp \
145pwmprefs.cpp \ 150pwmprefs.cpp \
146pwmtray.cpp \ 151pwmtray.cpp \
147pwmview.cpp \ 152pwmview.cpp \
148pwmviewstyle_0.cpp \ 153pwmviewstyle_0.cpp \
149pwmviewstyle_1.cpp \ 154pwmviewstyle_1.cpp \
150pwmviewstyle.cpp \ 155pwmviewstyle.cpp \
151randomizer.cpp \ 156randomizer.cpp \
152rc2.cpp \ 157rc2.cpp \
153rencatwnd.cpp \ 158rencatwnd.cpp \
154serializer.cpp \ 159serializer.cpp \
155setmasterpwwnd_emb.cpp \ 160setmasterpwwnd_emb.cpp \
156setmasterpwwndimpl.cpp \ 161setmasterpwwndimpl.cpp \
157sha1.cpp \ 162sha1.cpp \
158waitwnd.cpp \ 163waitwnd.cpp \
159kcmconfigs/kcmpwmconfig.cpp \ 164kcmconfigs/kcmpwmconfig.cpp \
160kcmconfigs/pwmconfigwidget.cpp 165kcmconfigs/pwmconfigwidget.cpp
161 166
162 167
163 168
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp
index f4a1636..e29e3d1 100644
--- a/pwmanager/pwmanager/pwmdoc.cpp
+++ b/pwmanager/pwmanager/pwmdoc.cpp
@@ -157,385 +157,385 @@ DocTimer::DocTimer(PwMDoc *_doc)
157 connect(autoLockTimer, SIGNAL(timeout()), 157 connect(autoLockTimer, SIGNAL(timeout()),
158 this, SLOT(autoLockTimeout())); 158 this, SLOT(autoLockTimeout()));
159 connect(metaCheckTimer, SIGNAL(timeout()), 159 connect(metaCheckTimer, SIGNAL(timeout()),
160 this, SLOT(metaCheckTimeout())); 160 this, SLOT(metaCheckTimeout()));
161} 161}
162 162
163DocTimer::~DocTimer() 163DocTimer::~DocTimer()
164{ 164{
165 delete mpwTimer; 165 delete mpwTimer;
166 delete autoLockTimer; 166 delete autoLockTimer;
167 delete metaCheckTimer; 167 delete metaCheckTimer;
168} 168}
169 169
170void DocTimer::start(TimerIDs timer) 170void DocTimer::start(TimerIDs timer)
171{ 171{
172 switch (timer) { 172 switch (timer) {
173 case id_mpwTimer: 173 case id_mpwTimer:
174 if (mpwTimer->isActive()) 174 if (mpwTimer->isActive())
175 mpwTimer->stop(); 175 mpwTimer->stop();
176 doc->setDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); 176 doc->setDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW);
177 mpwTimer->start(conf()->confGlobPwTimeout() * 1000, true); 177 mpwTimer->start(conf()->confGlobPwTimeout() * 1000, true);
178 break; 178 break;
179 case id_autoLockTimer: 179 case id_autoLockTimer:
180 if (autoLockTimer->isActive()) 180 if (autoLockTimer->isActive())
181 autoLockTimer->stop(); 181 autoLockTimer->stop();
182 if (conf()->confGlobLockTimeout() > 0) 182 if (conf()->confGlobLockTimeout() > 0)
183 autoLockTimer->start(conf()->confGlobLockTimeout() * 1000, true); 183 autoLockTimer->start(conf()->confGlobLockTimeout() * 1000, true);
184 break; 184 break;
185 case id_metaCheckTimer: 185 case id_metaCheckTimer:
186 if (metaCheckTimer->isActive()) 186 if (metaCheckTimer->isActive())
187 metaCheckTimer->stop(); 187 metaCheckTimer->stop();
188 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 188 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
189 break; 189 break;
190 } 190 }
191} 191}
192 192
193void DocTimer::stop(TimerIDs timer) 193void DocTimer::stop(TimerIDs timer)
194{ 194{
195 switch (timer) { 195 switch (timer) {
196 case id_mpwTimer: 196 case id_mpwTimer:
197 mpwTimer->stop(); 197 mpwTimer->stop();
198 break; 198 break;
199 case id_autoLockTimer: 199 case id_autoLockTimer:
200 autoLockTimer->stop(); 200 autoLockTimer->stop();
201 break; 201 break;
202 case id_metaCheckTimer: 202 case id_metaCheckTimer:
203 metaCheckTimer->stop(); 203 metaCheckTimer->stop();
204 break; 204 break;
205 } 205 }
206} 206}
207 207
208void DocTimer::getLock(TimerIDs timer) 208void DocTimer::getLock(TimerIDs timer)
209{ 209{
210 switch (timer) { 210 switch (timer) {
211 case id_mpwTimer: 211 case id_mpwTimer:
212 ++mpwLock; 212 ++mpwLock;
213 break; 213 break;
214 case id_autoLockTimer: 214 case id_autoLockTimer:
215 ++autoLockLock; 215 ++autoLockLock;
216 break; 216 break;
217 case id_metaCheckTimer: 217 case id_metaCheckTimer:
218 ++metaCheckLock; 218 ++metaCheckLock;
219 break; 219 break;
220 } 220 }
221} 221}
222 222
223void DocTimer::putLock(TimerIDs timer) 223void DocTimer::putLock(TimerIDs timer)
224{ 224{
225 switch (timer) { 225 switch (timer) {
226 case id_mpwTimer: 226 case id_mpwTimer:
227 if (mpwLock) 227 if (mpwLock)
228 --mpwLock; 228 --mpwLock;
229 break; 229 break;
230 case id_autoLockTimer: 230 case id_autoLockTimer:
231 if (autoLockLock) 231 if (autoLockLock)
232 --autoLockLock; 232 --autoLockLock;
233 break; 233 break;
234 case id_metaCheckTimer: 234 case id_metaCheckTimer:
235 if (metaCheckLock) 235 if (metaCheckLock)
236 --metaCheckLock; 236 --metaCheckLock;
237 break; 237 break;
238 } 238 }
239} 239}
240 240
241void DocTimer::mpwTimeout() 241void DocTimer::mpwTimeout()
242{ 242{
243 if (mpwLock) { 243 if (mpwLock) {
244 mpwTimer->start(1000, true); 244 mpwTimer->start(1000, true);
245 return; 245 return;
246 } 246 }
247 doc->unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); 247 doc->unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW);
248} 248}
249 249
250void DocTimer::autoLockTimeout() 250void DocTimer::autoLockTimeout()
251{ 251{
252 if (autoLockLock) { 252 if (autoLockLock) {
253 autoLockTimer->start(1000, true); 253 autoLockTimer->start(1000, true);
254 return; 254 return;
255 } 255 }
256 if (conf()->confGlobAutoDeepLock() && 256 if (conf()->confGlobAutoDeepLock() &&
257 doc->filename != QString::null && 257 doc->filename != QString::null &&
258 doc->filename != "") { 258 doc->filename != "") {
259 doc->deepLock(true); 259 doc->deepLock(true);
260 } else { 260 } else {
261 doc->lockAll(true); 261 doc->lockAll(true);
262 } 262 }
263} 263}
264 264
265void DocTimer::metaCheckTimeout() 265void DocTimer::metaCheckTimeout()
266{ 266{
267 if (metaCheckLock) { 267 if (metaCheckLock) {
268 // check again in one second. 268 // check again in one second.
269 metaCheckTimer->start(1000, true); 269 metaCheckTimer->start(1000, true);
270 return; 270 return;
271 } 271 }
272 if (doc->isDeepLocked()) { 272 if (doc->isDeepLocked()) {
273 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 273 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
274 return; 274 return;
275 } 275 }
276 if (doc->isDocEmpty()) { 276 if (doc->isDocEmpty()) {
277 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 277 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
278 return; 278 return;
279 } 279 }
280#ifdef CONFIG_KWALLETIF 280#ifdef CONFIG_KWALLETIF
281 KWalletEmu *kwlEmu = doc->init->kwalletEmu(); 281 KWalletEmu *kwlEmu = doc->init->kwalletEmu();
282 if (kwlEmu) 282 if (kwlEmu)
283 kwlEmu->suspendDocSignals(); 283 kwlEmu->suspendDocSignals();
284#endif // CONFIG_KWALLETIF 284#endif // CONFIG_KWALLETIF
285 /* We simply trigger all views to update their 285 /* We simply trigger all views to update their
286 * displayed values. This way they have a chance 286 * displayed values. This way they have a chance
287 * to get notified when some meta changes over time. 287 * to get notified when some meta changes over time.
288 * (for example an entry expired). 288 * (for example an entry expired).
289 * The _view_ is responsive for not updating its 289 * The _view_ is responsive for not updating its
290 * contents if nothing really changed! 290 * contents if nothing really changed!
291 */ 291 */
292 emit doc->dataChanged(doc); 292 emit doc->dataChanged(doc);
293#ifdef CONFIG_KWALLETIF 293#ifdef CONFIG_KWALLETIF
294 if (kwlEmu) 294 if (kwlEmu)
295 kwlEmu->resumeDocSignals(); 295 kwlEmu->resumeDocSignals();
296#endif // CONFIG_KWALLETIF 296#endif // CONFIG_KWALLETIF
297 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 297 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
298} 298}
299 299
300 300
301 301
302PwMDocList PwMDoc::openDocList; 302PwMDocList PwMDoc::openDocList;
303unsigned int PwMDocList::unnamedDocCnt = 1; 303unsigned int PwMDocList::unnamedDocCnt = 1;
304 304
305PwMDoc::PwMDoc(QObject *parent, const char *name) 305PwMDoc::PwMDoc(QObject *parent, const char *name)
306 : PwMDocUi(parent, name) 306 : PwMDocUi(parent, name)
307 , dataChangedLock (0) 307 , dataChangedLock (0)
308{ 308{
309 deleted = false; 309 deleted = false;
310 unnamedNum = 0; 310 unnamedNum = 0;
311 getOpenDocList()->add(this, getTitle().latin1()); 311 getOpenDocList()->add(this, getTitle().latin1());
312 curDocStat = 0; 312 curDocStat = 0;
313 setMaxNumEntries(); 313 setMaxNumEntries();
314 _timer = new DocTimer(this); 314 _timer = new DocTimer(this);
315 timer()->start(DocTimer::id_mpwTimer); 315 timer()->start(DocTimer::id_mpwTimer);
316 timer()->start(DocTimer::id_autoLockTimer); 316 timer()->start(DocTimer::id_autoLockTimer);
317 timer()->start(DocTimer::id_metaCheckTimer); 317 timer()->start(DocTimer::id_metaCheckTimer);
318 addCategory(DEFAULT_CATEGORY, 0, false); 318 addCategory(DEFAULT_CATEGORY, 0, false);
319 listView = 0; 319 listView = 0;
320 emit docCreated(this); 320 emit docCreated(this);
321} 321}
322 322
323PwMDoc::~PwMDoc() 323PwMDoc::~PwMDoc()
324{ 324{
325 emit docClosed(this); 325 emit docClosed(this);
326 getOpenDocList()->del(this); 326 getOpenDocList()->del(this);
327 delete _timer; 327 delete _timer;
328} 328}
329 329
330PwMerror PwMDoc::saveDoc(char compress, const QString *file) 330PwMerror PwMDoc::saveDoc(char compress, const QString *file)
331{ 331{
332 PwMerror ret, e; 332 PwMerror ret, e;
333 string serialized; 333 string serialized;
334 QFile f; 334 QFile f;
335 QString tmpFileMoved(QString::null); 335 QString tmpFileMoved(QString::null);
336 bool wasDeepLocked; 336 bool wasDeepLocked;
337 QString savedFilename(filename); 337 QString savedFilename(filename);
338 338
339 if (!file) { 339 if (!file) {
340 if (filename == "") 340 if (filename == "")
341 return e_filename; 341 return e_filename;
342 if (isDeepLocked()) { 342 if (isDeepLocked()) {
343 /* We don't need to save any data. 343 /* We don't need to save any data.
344 * It's already all on disk, because 344 * It's already all on disk, because
345 * we are deeplocked. 345 * we are deeplocked.
346 */ 346 */
347 unsetDocStatFlag(DOC_STAT_DISK_DIRTY); 347 unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
348 ret = e_success; 348 ret = e_success;
349 goto out; 349 return ret;
350 } 350 }
351 } else { 351 } else {
352 if (*file == "" && filename == "") 352 if (*file == "" && filename == "")
353 return e_filename; 353 return e_filename;
354 if (*file != "") 354 if (*file != "")
355 filename = *file; 355 filename = *file;
356 } 356 }
357 357
358 wasDeepLocked = isDeepLocked(); 358 wasDeepLocked = isDeepLocked();
359 if (wasDeepLocked) { 359 if (wasDeepLocked) {
360 /* We are deeplocked. That means all data is already 360 /* We are deeplocked. That means all data is already
361 * on disk. BUT we need to do saving procedure, 361 * on disk. BUT we need to do saving procedure,
362 * because *file != savedFilename. 362 * because *file != savedFilename.
363 * Additionally we need to tempoarly restore 363 * Additionally we need to tempoarly restore
364 * the old "filename", because deepLock() references it. 364 * the old "filename", because deepLock() references it.
365 */ 365 */
366 QString newFilename(filename); 366 QString newFilename(filename);
367 filename = savedFilename; 367 filename = savedFilename;
368 getDataChangedLock(); 368 getDataChangedLock();
369 e = deepLock(false); 369 e = deepLock(false);
370 putDataChangedLock(); 370 putDataChangedLock();
371 filename = newFilename; 371 filename = newFilename;
372 switch (e) { 372 switch (e) {
373 case e_success: 373 case e_success:
374 break; 374 break;
375 case e_wrongPw: 375 case e_wrongPw:
376 case e_noPw: 376 case e_noPw:
377 emitDataChanged(this); 377 emitDataChanged(this);
378 return e; 378 return e;
379 default: 379 default:
380 emitDataChanged(this); 380 emitDataChanged(this);
381 return e_openFile; 381 return e_openFile;
382 } 382 }
383 } 383 }
384 384
385 if (!isPwAvailable()) { 385 if (!isPwAvailable()) {
386 /* password is not available. This means, the 386 /* password is not available. This means, the
387 * document wasn't saved, yet. 387 * document wasn't saved, yet.
388 */ 388 */
389 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD); 389 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD);
390 QString pw(requestNewMpw(&useChipcard)); 390 QString pw(requestNewMpw(&useChipcard));
391 if (pw != "") { 391 if (pw != "") {
392 currentPw = pw; 392 currentPw = pw;
393 } else { 393 } else {
394 return e_noPw; 394 return e_noPw;
395 } 395 }
396 if (useChipcard) { 396 if (useChipcard) {
397 setDocStatFlag(DOC_STAT_USE_CHIPCARD); 397 setDocStatFlag(DOC_STAT_USE_CHIPCARD);
398 } else { 398 } else {
399 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); 399 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD);
400 } 400 }
401 } 401 }
402 402
403 int _cryptAlgo = conf()->confGlobCryptAlgo(); 403 int _cryptAlgo = conf()->confGlobCryptAlgo();
404 int _hashAlgo = conf()->confGlobHashAlgo(); 404 int _hashAlgo = conf()->confGlobHashAlgo();
405 405
406 // sanity check for the selected algorithms 406 // sanity check for the selected algorithms
407 if (_cryptAlgo < PWM_CRYPT_BLOWFISH || 407 if (_cryptAlgo < PWM_CRYPT_BLOWFISH ||
408 _cryptAlgo > PWM_CRYPT_TWOFISH128) { 408 _cryptAlgo > PWM_CRYPT_TWOFISH128) {
409 printWarn("Invalid Crypto-Algorithm selected! " 409 printWarn("Invalid Crypto-Algorithm selected! "
410 "Config-file seems to be corrupt. " 410 "Config-file seems to be corrupt. "
411 "Falling back to Blowfish."); 411 "Falling back to Blowfish.");
412 _cryptAlgo = PWM_CRYPT_BLOWFISH; 412 _cryptAlgo = PWM_CRYPT_BLOWFISH;
413 } 413 }
414 if (_hashAlgo < PWM_HASH_SHA1 || 414 if (_hashAlgo < PWM_HASH_SHA1 ||
415 _hashAlgo > PWM_HASH_TIGER) { 415 _hashAlgo > PWM_HASH_TIGER) {
416 printWarn("Invalid Hash-Algorithm selected! " 416 printWarn("Invalid Hash-Algorithm selected! "
417 "Config-file seems to be corrupt. " 417 "Config-file seems to be corrupt. "
418 "Falling back to SHA1."); 418 "Falling back to SHA1.");
419 _hashAlgo = PWM_HASH_SHA1; 419 _hashAlgo = PWM_HASH_SHA1;
420 } 420 }
421 char cryptAlgo = static_cast<char>(_cryptAlgo); 421 char cryptAlgo = static_cast<char>(_cryptAlgo);
422 char hashAlgo = static_cast<char>(_hashAlgo); 422 char hashAlgo = static_cast<char>(_hashAlgo);
423 423
424 if (conf()->confGlobMakeFileBackup()) { 424 if (conf()->confGlobMakeFileBackup()) {
425 if (!backupFile(filename)) 425 if (!backupFile(filename))
426 return e_fileBackup; 426 return e_fileBackup;
427 } 427 }
428 if (QFile::exists(filename)) { 428 if (QFile::exists(filename)) {
429 /* Move the existing file to some tmp file. 429 /* Move the existing file to some tmp file.
430 * When saving file succeeds, delete tmp file. Otherwise 430 * When saving file succeeds, delete tmp file. Otherwise
431 * move tmp file back. See below. 431 * move tmp file back. See below.
432 */ 432 */
433 Randomizer *rnd = Randomizer::obj(); 433 Randomizer *rnd = Randomizer::obj();
434 char rnd_buf[5]; 434 char rnd_buf[5];
435 sprintf(rnd_buf, "%X%X%X%X", rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF, 435 sprintf(rnd_buf, "%X%X%X%X", rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF,
436 rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF); 436 rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF);
437 tmpFileMoved = filename + "." + rnd_buf + ".mv"; 437 tmpFileMoved = filename + "." + rnd_buf + ".mv";
438 if (!copyFile(filename, tmpFileMoved)) 438 if (!copyFile(filename, tmpFileMoved))
439 return e_openFile; 439 return e_openFile;
440 if (!QFile::remove(filename)) { 440 if (!QFile::remove(filename)) {
441 printWarn(string("removing orig file ") 441 printWarn(string("removing orig file ")
442 + filename.latin1() 442 + filename.latin1()
443 + " failed!"); 443 + " failed!");
444 } 444 }
445 } 445 }
446 f.setName(filename); 446 f.setName(filename);
447 if (!f.open(IO_ReadWrite)) { 447 if (!f.open(IO_ReadWrite)) {
448 ret = e_openFile; 448 ret = e_openFile;
449 goto out_moveback; 449 goto out_moveback;
450 } 450 }
451 e = writeFileHeader(hashAlgo, hashAlgo, 451 e = writeFileHeader(hashAlgo, hashAlgo,
452 cryptAlgo, compress, 452 cryptAlgo, compress,
453 &currentPw, &f); 453 &currentPw, &f);
454 if (e == e_hashNotImpl) { 454 if (e == e_hashNotImpl) {
455 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed: e_hashNotImpl"); 455 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed: e_hashNotImpl");
456 f.close(); 456 f.close();
457 ret = e_hashNotImpl; 457 ret = e_hashNotImpl;
458 goto out_moveback; 458 goto out_moveback;
459 } else if (e != e_success) { 459 } else if (e != e_success) {
460 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed"); 460 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed");
461 f.close(); 461 f.close();
462 ret = e_writeHeader; 462 ret = e_writeHeader;
463 goto out_moveback; 463 goto out_moveback;
464 } 464 }
465 if (!serializeDta(&serialized)) { 465 if (!serializeDta(&serialized)) {
466 printDebug("PwMDoc::saveDoc(): serializeDta() failed"); 466 printDebug("PwMDoc::saveDoc(): serializeDta() failed");
467 f.close(); 467 f.close();
468 ret = e_serializeDta; 468 ret = e_serializeDta;
469 goto out_moveback; 469 goto out_moveback;
470 } 470 }
471 e = writeDataHash(hashAlgo, &serialized, &f); 471 e = writeDataHash(hashAlgo, &serialized, &f);
472 if (e == e_hashNotImpl) { 472 if (e == e_hashNotImpl) {
473 printDebug("PwMDoc::saveDoc(): writeDataHash() failed: e_hashNotImpl"); 473 printDebug("PwMDoc::saveDoc(): writeDataHash() failed: e_hashNotImpl");
474 f.close(); 474 f.close();
475 ret = e_hashNotImpl; 475 ret = e_hashNotImpl;
476 goto out_moveback; 476 goto out_moveback;
477 } else if (e != e_success) { 477 } else if (e != e_success) {
478 printDebug("PwMDoc::saveDoc(): writeDataHash() failed"); 478 printDebug("PwMDoc::saveDoc(): writeDataHash() failed");
479 f.close(); 479 f.close();
480 ret = e_writeHeader; 480 ret = e_writeHeader;
481 goto out_moveback; 481 goto out_moveback;
482 } 482 }
483 if (!compressDta(&serialized, compress)) { 483 if (!compressDta(&serialized, compress)) {
484 printDebug("PwMDoc::saveDoc(): compressDta() failed"); 484 printDebug("PwMDoc::saveDoc(): compressDta() failed");
485 f.close(); 485 f.close();
486 ret = e_enc; 486 ret = e_enc;
487 goto out_moveback; 487 goto out_moveback;
488 } 488 }
489 e = encrypt(&serialized, &currentPw, &f, cryptAlgo); 489 e = encrypt(&serialized, &currentPw, &f, cryptAlgo);
490 if (e == e_weakPw) { 490 if (e == e_weakPw) {
491 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_weakPw"); 491 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_weakPw");
492 f.close(); 492 f.close();
493 ret = e_weakPw; 493 ret = e_weakPw;
494 goto out_moveback; 494 goto out_moveback;
495 } else if (e == e_cryptNotImpl) { 495 } else if (e == e_cryptNotImpl) {
496 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_cryptNotImpl"); 496 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_cryptNotImpl");
497 f.close(); 497 f.close();
498 ret = e_cryptNotImpl; 498 ret = e_cryptNotImpl;
499 goto out_moveback; 499 goto out_moveback;
500 } else if (e != e_success) { 500 } else if (e != e_success) {
501 printDebug("PwMDoc::saveDoc(): encrypt() failed"); 501 printDebug("PwMDoc::saveDoc(): encrypt() failed");
502 f.close(); 502 f.close();
503 ret = e_enc; 503 ret = e_enc;
504 goto out_moveback; 504 goto out_moveback;
505 } 505 }
506 unsetDocStatFlag(DOC_STAT_DISK_DIRTY); 506 unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
507 f.close(); 507 f.close();
508 if (chmod(filename.latin1(), 508 if (chmod(filename.latin1(),
509 conf()->confGlobFilePermissions())) { 509 conf()->confGlobFilePermissions())) {
510 printWarn(string("chmod failed: ") + strerror(errno)); 510 printWarn(string("chmod failed: ") + strerror(errno));
511 } 511 }
512 openDocList.edit(this, getTitle().latin1()); 512 openDocList.edit(this, getTitle().latin1());
513 if (wasDeepLocked) { 513 if (wasDeepLocked) {
514 /* Do _not_ save the data with the deepLock() 514 /* Do _not_ save the data with the deepLock()
515 * call, because this will recurse 515 * call, because this will recurse
516 * into saveDoc() 516 * into saveDoc()
517 */ 517 */
518 deepLock(true, false); 518 deepLock(true, false);
519 /* We don't check return value here, because 519 /* We don't check return value here, because
520 * it won't fail. See NOTE in deepLock() 520 * it won't fail. See NOTE in deepLock()
521 */ 521 */
522 } 522 }
523 if (tmpFileMoved != QString::null) { 523 if (tmpFileMoved != QString::null) {
524 // now remove the moved file. 524 // now remove the moved file.
525 if (!QFile::remove(tmpFileMoved)) { 525 if (!QFile::remove(tmpFileMoved)) {
526 printWarn(string("removing file ") 526 printWarn(string("removing file ")
527 + tmpFileMoved.latin1() 527 + tmpFileMoved.latin1()
528 + " failed!"); 528 + " failed!");
529 } 529 }
530 } 530 }
531 ret = e_success; 531 ret = e_success;
532 printDebug(string("writing file { name: ") 532 printDebug(string("writing file { name: ")
533 + filename.latin1() + " compress: " 533 + filename.latin1() + " compress: "
534 + tostr(static_cast<int>(compress)) + " cryptAlgo: " 534 + tostr(static_cast<int>(compress)) + " cryptAlgo: "
535 + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: " 535 + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: "
536 + tostr(static_cast<int>(hashAlgo)) 536 + tostr(static_cast<int>(hashAlgo))
537 + " }"); 537 + " }");
538 goto out; 538 goto out;
539out_moveback: 539out_moveback:
540 if (tmpFileMoved != QString::null) { 540 if (tmpFileMoved != QString::null) {
541 if (copyFile(tmpFileMoved, filename)) { 541 if (copyFile(tmpFileMoved, filename)) {