std::ofstream file(path, std::ofstream::trunc);
if (!file.good()) {
- LogError("Error while opening file stream.");
+ LogError("Error while opening file stream. file=" << path);
Throw(PasswordException::FStreamOpenError);
}
file.write(m_buffer.data(), m_buffer.size());
if (!file) {
- LogError("Failed to write data.");
+ LogError("Failed to write data. file=" << path);
Throw(PasswordException::FStreamWriteError);
}
file.flush();
if (::fsync(DPL::FstreamAccessors<std::ofstream>::GetFd(file)) != 0)
- LogError("Failed to synchronize a file's state.");
+ LogError("Failed to synchronize a file's state. file=" << path);
file.close();
}
std::ifstream file(path, std::ifstream::binary);
if (!file.good()) {
- LogError("Error while opening file stream.");
+ LogError("Error while opening file stream. file=" << path);
Throw(PasswordException::FStreamOpenError);
}
std::istreambuf_iterator<char>());
if (!file) {
- LogError("Failed to read data. Failbit: " << file.fail() << ", Badbit: " << file.bad());
+ LogError("Failed to read data. Failbit: " << file.fail()
+ << ", Badbit: " << file.bad() << ", file=" << path);
Throw(PasswordException::FStreamReadError);
}
}
// check if password file exists
if (!fileExists(pwdFile)) {
// if old format file exist - load it
- if (tryLoadMemoryFromOldFormatFile()) {
+ if (loadMemoryFromFile(oldVersionPwdFile)) {
// save in new format
writeMemoryToFile();
LogSecureDebug("PWD_DBG found " << m_user << " password file. Opening.");
try {
- loadMemoryFromFile();
+ loadMemoryFromFile(pwdFile);
} catch (...) {
LogError("Invalid " << pwdFile << " file format");
resetState();
}
void PasswordFile::writeMemoryToFile() const
+{
+ std::string pwdFile = createDir(RW_DATA_DIR, m_user) + PASSWORD_FILE;
+ writeMemoryToFile(pwdFile);
+}
+
+void PasswordFile::writeMemoryToFile(const std::string& passwdFilePath) const
{
PasswordFileBuffer pwdBuffer;
LogSecureDebug("User: " << m_user << ", saving max_att: " << m_maxAttempt <<
- ", history_size: " << m_maxHistorySize << ", m_expireTime: " <<
- m_expireTime << ", m_expireTimeLeft: " << m_expireTimeLeft <<
- ", isActive: " << m_passwordActive << ", isRcvActive: " <<
- m_passwordRcvActive << ", m_passwordType: " << m_passwordType);
+ ", history_size: " << m_maxHistorySize << ", m_expireTime: " <<
+ m_expireTime << ", m_expireTimeLeft: " << m_expireTimeLeft <<
+ ", isActive: " << m_passwordActive << ", isRcvActive: " <<
+ m_passwordRcvActive << ", m_passwordType: " << m_passwordType);
//serialize password attributes
Serialization::Serialize(pwdBuffer, CURRENT_FILE_VERSION);
Serialization::Serialize(pwdBuffer, m_maxAttempt);
Serialization::Serialize(pwdBuffer, m_passwordCurrent);
Serialization::Serialize(pwdBuffer, m_passwordHistory);
Serialization::Serialize(pwdBuffer, m_passwordType);
- std::string pwdFile = createDir(RW_DATA_DIR, m_user) + PASSWORD_FILE;
- pwdBuffer.Save(pwdFile);
- if (chmod(pwdFile.c_str(), FILE_MODE)) {
- LogError("Failed to chmod for " << pwdFile << " Error: " << errnoToString());
+ pwdBuffer.Save(passwdFilePath);
+ if (chmod(passwdFilePath.c_str(), FILE_MODE)) {
+ LogError("Failed to chmod for " << passwdFilePath << " Error: " << errnoToString());
Throw(PasswordException::ChmodError);
}
}
-void PasswordFile::loadMemoryFromFile()
+bool PasswordFile::loadMemoryFromFile(const std::string& passwdFilePath)
{
- PasswordFileBuffer pwdBuffer;
- std::string pwdFile = createDir(RW_DATA_DIR, m_user) + PASSWORD_FILE;
- pwdBuffer.Load(pwdFile);
- unsigned int fileVersion = 0;
- Deserialization::Deserialize(pwdBuffer, fileVersion);
-
- if (fileVersion != CURRENT_FILE_VERSION)
- Throw(PasswordException::FStreamReadError);
+ struct stat fileStat;
- m_passwordHistory.clear();
- Deserialization::Deserialize(pwdBuffer, m_maxAttempt);
- Deserialization::Deserialize(pwdBuffer, m_maxHistorySize);
- Deserialization::Deserialize(pwdBuffer, m_expireTime);
- Deserialization::Deserialize(pwdBuffer, m_expireTimeLeft);
- Deserialization::Deserialize(pwdBuffer, m_passwordRcvActive);
- Deserialization::Deserialize(pwdBuffer, m_passwordActive);
- Deserialization::Deserialize(pwdBuffer, m_passwordCurrent);
- Deserialization::Deserialize(pwdBuffer, m_passwordHistory);
- Deserialization::Deserialize(pwdBuffer, m_passwordType);
- LogSecureDebug("User: " << m_user << ", loaded max_att: " << m_maxAttempt <<
- ", history_size: " << m_maxHistorySize << ", m_expireTime: " <<
- m_expireTime << ", m_expireTimeLeft: " << m_expireTimeLeft <<
- ", isActive: " << m_passwordActive << ", isRcvActive: " <<
- m_passwordRcvActive<< ", m_passwordType: " << m_passwordType);
-}
-
-bool PasswordFile::tryLoadMemoryFromOldFormatFile()
-{
- struct stat oldFileStat;
- std::string oldVersionPwdFile = createDir(RW_DATA_DIR, m_user) + OLD_VERSION_PASSWORD_FILE;
-
- if (stat(oldVersionPwdFile.c_str(), &oldFileStat) != 0)
+ if (stat(passwdFilePath.c_str(), &fileStat) != 0)
return false;
PasswordFileBuffer pwdBuffer;
- pwdBuffer.Load(oldVersionPwdFile);
+ pwdBuffer.Load(passwdFilePath);
unsigned int fileVersion = 0;
Deserialization::Deserialize(pwdBuffer, fileVersion);
m_expireTime = PASSWORD_INFINITE_EXPIRATION_DAYS;
m_passwordRcvActive = false;
m_passwordType = 0; // Normal
+ // update file to new format
+ writeMemoryToFile(passwdFilePath);
break;
case 4:
Deserialization::Deserialize(pwdBuffer, m_maxAttempt);
LogError("Invaild password version: " << fileVersion);
Throw(PasswordException::FStreamReadError);
}
+
+ LogSecureDebug("loadMemoryFromFile: File=" << passwdFilePath <<
+ ":: User: " << m_user << ", loaded max_att: " << m_maxAttempt <<
+ ", history_size: " << m_maxHistorySize << ", m_expireTime: " <<
+ m_expireTime << ", m_expireTimeLeft: " << m_expireTimeLeft <<
+ ", isActive: " << m_passwordActive << ", isRcvActive: " <<
+ m_passwordRcvActive<< ", m_passwordType: " << m_passwordType);
return true;
}