7zip/CPP/7zip/UI/Console/OpenCallbackConsole.h
Earnestly 2c37f6565d Support for reading passwords from a specified fd
This initial work adds the -pfd[N] flag to the 7z command so that an
alternate file descriptor (fd) may be specified for reading the password
instead of standard input (stdin).

By adding this flag it becomes possible for 7z to accept data from stdin
for use with the -si flag while also being being able to decrypt a
password protected achieve without revealing the password on the
command line.

For example, generating a secret key and storing it in an encrypted archive
without the need to expose any of the data to a filesystem:

    age-keygen | 7z a -pfd9 9< <(pass show archive) -siid.age archive.7z

As a side effect the password is not echoed to the terminal, however
this PR should not conflict with the work in #33.

Note that the -p flag is necessary if the archive does not exist but
should not be used if it does.
2026-02-16 00:51:36 +00:00

75 lines
1.4 KiB
C++

// OpenCallbackConsole.h
#ifndef ZIP7_INC_OPEN_CALLBACK_CONSOLE_H
#define ZIP7_INC_OPEN_CALLBACK_CONSOLE_H
#include "../../../Common/StdOutStream.h"
#include "../Common/ArchiveOpenCallback.h"
#include "PercentPrinter.h"
class COpenCallbackConsole: public IOpenCallbackUI
{
protected:
CPercentPrinter _percent;
CStdOutStream *_so;
CStdOutStream *_se;
// UInt64 _totalFiles;
UInt64 _totalBytes;
bool _totalFilesDefined;
// bool _totalBytesDefined;
bool NeedPercents() const { return _percent._so && !_percent.DisablePrint; }
public:
bool MultiArcMode;
void ClosePercents()
{
if (NeedPercents())
_percent.ClosePrint(true);
}
COpenCallbackConsole():
_totalBytes(0),
_totalFilesDefined(false),
// _totalBytesDefined(false),
MultiArcMode(false)
#ifndef Z7_NO_CRYPTO
, PasswordIsDefined(false)
// , PasswordWasAsked(false)
#endif
{}
virtual ~COpenCallbackConsole() {}
void Init(
CStdOutStream *outStream,
CStdOutStream *errorStream,
CStdOutStream *percentStream,
bool disablePercents)
{
_so = outStream;
_se = errorStream;
_percent._so = percentStream;
_percent.DisablePrint = disablePercents;
}
Z7_IFACE_IMP(IOpenCallbackUI)
#ifndef Z7_NO_CRYPTO
bool PasswordIsDefined;
// bool PasswordWasAsked;
UString Password;
int PasswordFd;
#endif
};
#endif