summaryrefslogtreecommitdiffabout
authorulf69 <ulf69>2004-10-19 18:19:48 (UTC)
committer ulf69 <ulf69>2004-10-19 18:19:48 (UTC)
commit3b4dc5931f729bd1385ec83f8c9b82a1eb42ef36 (patch) (side-by-side diff)
tree0c39138398640a7996ea4eea4c0f8196dbdc2bef
parent695c64501950e0503ed558fbe8d8c06993776eaa (diff)
downloadkdepimpi-3b4dc5931f729bd1385ec83f8c9b82a1eb42ef36.zip
kdepimpi-3b4dc5931f729bd1385ec83f8c9b82a1eb42ef36.tar.gz
kdepimpi-3b4dc5931f729bd1385ec83f8c9b82a1eb42ef36.tar.bz2
merging of two bugfixes provided by Michael:
1) files were getting stored always twice 2) "Save As..." returned a No permission dialogbox when executed right after starting the application
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--pwmanager/pwmanager/pwmdoc.cpp65
-rw-r--r--pwmanager/pwmanager/pwmdoc.h2
-rw-r--r--pwmanager/pwmanager/pwmdocui.cpp12
3 files changed, 67 insertions, 12 deletions
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp
index e9906a4..f4a1636 100644
--- a/pwmanager/pwmanager/pwmdoc.cpp
+++ b/pwmanager/pwmanager/pwmdoc.cpp
@@ -6,17 +6,17 @@
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License version 2 *
* as published by the Free Software Foundation. *
* *
***************************************************************************/
/***************************************************************************
* copyright (C) 2004 by Ulf Schenk
- * This file is originaly based on version 2.0 of pwmanager
+ * This file is originaly based on version 1.1 of pwmanager
* and was modified to run on embedded devices that run microkde
*
* $Id$
**************************************************************************/
#include "pwmdoc.h"
#include "pwmview.h"
#include "blowfish.h"
@@ -325,30 +325,66 @@ PwMDoc::~PwMDoc()
emit docClosed(this);
getOpenDocList()->del(this);
delete _timer;
}
PwMerror PwMDoc::saveDoc(char compress, const QString *file)
{
PwMerror ret, e;
+ string serialized;
+ QFile f;
+ QString tmpFileMoved(QString::null);
+ bool wasDeepLocked;
+ QString savedFilename(filename);
+
if (!file) {
if (filename == "")
return e_filename;
- } else {
+ if (isDeepLocked()) {
+ /* We don't need to save any data.
+ * It's already all on disk, because
+ * we are deeplocked.
+ */
+ unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
+ ret = e_success;
+ goto out;
+ }
+ } else {
if (*file == "" && filename == "")
return e_filename;
if (*file != "")
filename = *file;
}
- bool wasDeepLocked = isDeepLocked();
+ wasDeepLocked = isDeepLocked();
if (wasDeepLocked) {
- if (deepLock(false) != e_success)
- return e_noPw;
+ /* We are deeplocked. That means all data is already
+ * on disk. BUT we need to do saving procedure,
+ * because *file != savedFilename.
+ * Additionally we need to tempoarly restore
+ * the old "filename", because deepLock() references it.
+ */
+ QString newFilename(filename);
+ filename = savedFilename;
+ getDataChangedLock();
+ e = deepLock(false);
+ putDataChangedLock();
+ filename = newFilename;
+ switch (e) {
+ case e_success:
+ break;
+ case e_wrongPw:
+ case e_noPw:
+ emitDataChanged(this);
+ return e;
+ default:
+ emitDataChanged(this);
+ return e_openFile;
+ }
}
if (!isPwAvailable()) {
/* password is not available. This means, the
* document wasn't saved, yet.
*/
bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD);
QString pw(requestNewMpw(&useChipcard));
@@ -384,17 +420,16 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file)
}
char cryptAlgo = static_cast<char>(_cryptAlgo);
char hashAlgo = static_cast<char>(_hashAlgo);
if (conf()->confGlobMakeFileBackup()) {
if (!backupFile(filename))
return e_fileBackup;
}
- QString tmpFileMoved(QString::null);
if (QFile::exists(filename)) {
/* Move the existing file to some tmp file.
* When saving file succeeds, delete tmp file. Otherwise
* move tmp file back. See below.
*/
Randomizer *rnd = Randomizer::obj();
char rnd_buf[5];
sprintf(rnd_buf, "%X%X%X%X", rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF,
@@ -403,18 +438,17 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file)
if (!copyFile(filename, tmpFileMoved))
return e_openFile;
if (!QFile::remove(filename)) {
printWarn(string("removing orig file ")
+ filename.latin1()
+ " failed!");
}
}
- QFile f(filename);
- string serialized;
+ f.setName(filename);
if (!f.open(IO_ReadWrite)) {
ret = e_openFile;
goto out_moveback;
}
e = writeFileHeader(hashAlgo, hashAlgo,
cryptAlgo, compress,
&currentPw, &f);
if (e == e_hashNotImpl) {
@@ -471,18 +505,26 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file)
}
unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
f.close();
if (chmod(filename.latin1(),
conf()->confGlobFilePermissions())) {
printWarn(string("chmod failed: ") + strerror(errno));
}
openDocList.edit(this, getTitle().latin1());
- if (wasDeepLocked)
- deepLock(true);
+ if (wasDeepLocked) {
+ /* Do _not_ save the data with the deepLock()
+ * call, because this will recurse
+ * into saveDoc()
+ */
+ deepLock(true, false);
+ /* We don't check return value here, because
+ * it won't fail. See NOTE in deepLock()
+ */
+ }
if (tmpFileMoved != QString::null) {
// now remove the moved file.
if (!QFile::remove(tmpFileMoved)) {
printWarn(string("removing file ")
+ tmpFileMoved.latin1()
+ " failed!");
}
}
@@ -1764,16 +1806,19 @@ bool PwMDoc::unlockAll_tempoary(bool revert)
}
return true;
}
PwMerror PwMDoc::deepLock(bool lock, bool saveToFile)
{
PwMerror ret;
+ /* NOTE: saveDoc() depends on this function to return
+ * e_success if saveToFile == false
+ */
if (lock) {
if (isDeepLocked())
return e_lock;
if (saveToFile) {
if (isDocEmpty())
return e_docIsEmpty;
ret = saveDoc(conf()->confGlobCompression());
diff --git a/pwmanager/pwmanager/pwmdoc.h b/pwmanager/pwmanager/pwmdoc.h
index 535fb92..a6e5f58 100644
--- a/pwmanager/pwmanager/pwmdoc.h
+++ b/pwmanager/pwmanager/pwmdoc.h
@@ -6,17 +6,17 @@
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License version 2 *
* as published by the Free Software Foundation. *
* *
***************************************************************************/
/***************************************************************************
* copyright (C) 2004 by Ulf Schenk
- * This file is originaly based on version 2.0 of pwmanager
+ * This file is originaly based on version 1.1 of pwmanager
* and was modified to run on embedded devices that run microkde
*
* $Id$
**************************************************************************/
#ifndef __PWMDOC_H
#define __PWMDOC_H
diff --git a/pwmanager/pwmanager/pwmdocui.cpp b/pwmanager/pwmanager/pwmdocui.cpp
index 7b8e0ee..6ddb6f5 100644
--- a/pwmanager/pwmanager/pwmdocui.cpp
+++ b/pwmanager/pwmanager/pwmdocui.cpp
@@ -268,16 +268,21 @@ bool PwMDocUi::saveDocUi(PwMDoc *doc)
doc->timer()->putLock(DocTimer::id_autoLockTimer);
return false;
} else if (ret == e_fileBackup) {
KMessageBox::error(currentView,
i18n("Error: Couldn't make backup-file!"),
i18n("backup failed"));
doc->timer()->putLock(DocTimer::id_autoLockTimer);
return false;
+ } else if (ret == e_noPw ||
+ ret == e_wrongPw ||
+ ret == e_openFile) {
+ doc->timer()->putLock(DocTimer::id_autoLockTimer);
+ return false;
} else if (ret != e_success) {
KMessageBox::error(currentView,
i18n("Error: Couldn't write to file.\n"
"Please check if you have permission to\n"
"write to the file in that directory."),
i18n("error while writing"));
doc->timer()->putLock(DocTimer::id_autoLockTimer);
return false;
@@ -313,17 +318,22 @@ bool PwMDocUi::saveAsDocUi(PwMDoc *doc)
if (fn == "") {
doc->timer()->putLock(DocTimer::id_autoLockTimer);
return false;
}
if (fn.right(4) != ".pwm")
fn += ".pwm";
PwMerror ret = doc->saveDoc(conf()->confGlobCompression(), &fn);
- if (ret != e_success) {
+ if (ret == e_noPw ||
+ ret == e_wrongPw ||
+ ret == e_openFile) {
+ doc->timer()->putLock(DocTimer::id_autoLockTimer);
+ return false;
+ } else if (ret != e_success) {
KMessageBox::error(currentView,
i18n("Error: Couldn't write to file.\n"
"Please check if you have permission to\n"
"write to the file in that directory."),
i18n("error while writing"));
doc->timer()->putLock(DocTimer::id_autoLockTimer);
return false;
}