Fix unlocking multiple databases with pw-stdin when input is a pipe

This works:

```
$ keepassxc test1.kdbx test2.kdbx --pw-stdin
Database password: <manual input 1234>
Database password: <manual input 4321>
```

But this doesn't (only `test1.kdbx` is unlocked):

```
$ printf '%s\n' 1234 4321 | keepassxc test1.kdbx test2.kdbx --pw-stdin
Database password:
Database password:
```

The problem is that `Utils::setDefaultTextStreams()` is called multiple times
when unlocking multiple databases with `--pw-stdin`, which appears to break the
pipe. Simply call it once to avoid the problem.

Fixes: #5012 (as far as I can tell by simulating the script in Linux)
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
This commit is contained in:
Joan Bruguera 2021-04-07 18:50:31 +02:00 committed by Jonathan White
parent 486779cce7
commit e6bf8463d9

View File

@ -166,6 +166,9 @@ int main(int argc, char** argv)
#endif
const bool pwstdin = parser.isSet(pwstdinOption);
if (!fileNames.isEmpty() && pwstdin) {
Utils::setDefaultTextStreams();
}
for (const QString& filename : fileNames) {
QString password;
if (pwstdin) {
@ -173,7 +176,6 @@ int main(int argc, char** argv)
// buffer for native messaging, even if the specified file does not exist
QTextStream out(stdout, QIODevice::WriteOnly);
out << QObject::tr("Database password: ") << flush;
Utils::setDefaultTextStreams();
password = Utils::getPassword();
}