QtPass 1.7.0
Multi-platform GUI for pass, the standard unix password manager.
Loading...
Searching...
No Matches
pass.h
1// SPDX-FileCopyrightText: 2016 Anne Jan Brouwer
2// SPDX-License-Identifier: GPL-3.0-or-later
3#ifndef SRC_PASS_H_
4#define SRC_PASS_H_
5
6#include "enums.h"
7#include "executor.h"
8#include "userinfo.h"
9
10#include <QProcess>
11#include <QQueue>
12#include <QString>
13#include <QStringList>
14#include <cassert>
15#include <map>
16
29 QString program;
34 QStringList arguments;
35};
36
50class Pass : public QObject {
51 Q_OBJECT
52
53 bool wrapperRunning;
54 QStringList env;
55
56protected:
61
66
67public:
75 void init();
80 static bool gpgSupportsEd25519();
85 static QString getDefaultKeyTemplate();
86
87 ~Pass() override = default;
88
89 // Git operations
93 virtual void GitInit() = 0;
97 virtual void GitPull() = 0;
101 virtual void GitPull_b() = 0;
105 virtual void GitPush() = 0;
106
107 // Password operations
112 virtual void Show(QString file) = 0;
117 virtual void OtpGenerate(QString file) = 0;
124 virtual void Insert(QString file, QString value, bool force) = 0;
130 virtual void Remove(QString file, bool isDir) = 0;
137 virtual void Move(const QString srcDir, const QString dest,
138 const bool force = false) = 0;
145 virtual void Copy(const QString srcDir, const QString dest,
146 const bool force = false) = 0;
152 virtual void Init(QString path, const QList<UserInfo> &users) = 0;
158 virtual void Grep(QString pattern, bool caseInsensitive = false) = 0;
159
166 virtual auto generatePassword(unsigned int length, const QString &charset)
167 -> QString;
168
169 // GPG operations
174 void GenerateGPGKeys(QString batch);
181 auto listKeys(QStringList keystrings, bool secret = false) -> QList<UserInfo>;
188 auto listKeys(const QString &keystring = "", bool secret = false)
189 -> QList<UserInfo>;
193 void updateEnv();
194
195 // Static helpers
201 static auto resolveGpgconfCommand(const QString &gpgPath)
208 static auto getGpgIdPath(const QString &for_file) -> QString;
214 static auto getRecipientList(const QString &for_file) -> QStringList;
222 static auto getRecipientString(const QString &for_file,
223 const QString &separator = " ",
224 int *count = nullptr) -> QStringList;
225
226protected:
235 void executeWrapper(PROCESS id, const QString &app, const QStringList &args,
236 bool readStdout = true, bool readStderr = true);
243 auto generateRandomPassword(const QString &charset, unsigned int length)
244 -> QString;
250 auto boundedRandom(quint32 bound) -> quint32;
256 void setEnvVar(const QString &key, const QString &value);
257
267 virtual void executeWrapper(PROCESS id, const QString &app,
268 const QStringList &args, QString input,
269 bool readStdout = true, bool readStderr = true);
270
271protected slots:
279 virtual void finished(int id, int exitCode, const QString &out,
280 const QString &err);
281
282private:
283 void handleProcessError(PROCESS pid, int exitCode, const QString &out,
284 const QString &err);
285 void handleGrepError(int exitCode, const QString &err);
286 auto formatInsertError(const QString &friendly, const QString &err)
287 -> QString;
288 void emitProcessFinishedSignal(PROCESS pid, const QString &out,
289 const QString &err);
290
291signals:
295 void error(QProcess::ProcessError);
305 void statusMsg(const QString &msg, int timeout);
311 void critical(const QString &title, const QString &message);
312
318 void processErrorExit(int exitCode, const QString &err);
319
325 void finishedAny(const QString &out, const QString &err);
331 void finishedGitInit(const QString &out, const QString &err);
337 void finishedGitPull(const QString &out, const QString &err);
343 void finishedGitPush(const QString &out, const QString &err);
348 void finishedShow(const QString &out);
353 void finishedOtpGenerate(const QString &out);
359 void finishedInsert(const QString &out, const QString &err);
365 void finishedRemove(const QString &out, const QString &err);
371 void finishedInit(const QString &out, const QString &err);
377 void finishedMove(const QString &out, const QString &err);
383 void finishedCopy(const QString &out, const QString &err);
389 void finishedGenerate(const QString &out, const QString &err);
395 void finishedGenerateGPGKeys(const QString &out, const QString &err);
400 void finishedGrep(const QList<QPair<QString, QStringList>> &results);
401};
402
415QString gpgErrorMessage(const QString &err);
416
423QList<QPair<QString, QStringList>> parseGrepOutput(const QString &rawOut);
424
425#endif // SRC_PASS_H_
Runs non-interactive external commands in FIFO order using a single QProcess.
Definition executor.h:20
void init()
Initialize the Pass instance.
void startingExecuteWrapper()
Emitted before executing a command.
virtual void executeWrapper(PROCESS id, const QString &app, const QStringList &args, QString input, bool readStdout=true, bool readStderr=true)
Execute wrapper with input.
void finishedGenerate(const QString &out, const QString &err)
Emitted when generate finishes.
void GenerateGPGKeys(QString batch)
Generate GPG keys using batch script.
void finishedInsert(const QString &out, const QString &err)
Emitted when insert finishes.
auto listKeys(const QString &keystring="", bool secret=false) -> QList< UserInfo >
List GPG keys.
static QString getDefaultKeyTemplate()
Get default key template for new GPG keys.
virtual void Copy(const QString srcDir, const QString dest, const bool force=false)=0
Copy password file or directory.
virtual void GitInit()=0
Initialize Git repository in password store.
void finishedOtpGenerate(const QString &out)
Emitted when OTP generation finishes.
void finishedGenerateGPGKeys(const QString &out, const QString &err)
Emitted when GPG key generation finishes.
Enums::PROCESS PROCESS
Alias for Enums::PROCESS used throughout this class.
Definition pass.h:65
virtual void GitPull()=0
Pull changes from remote Git repository.
void statusMsg(const QString &msg, int timeout)
Emit status message.
static auto resolveGpgconfCommand(const QString &gpgPath) -> ResolvedGpgconfCommand
Resolve the gpgconf command to kill agents.
void setEnvVar(const QString &key, const QString &value)
Set or remove an environment variable.
auto boundedRandom(quint32 bound) -> quint32
Generate random number in range.
void finishedAny(const QString &out, const QString &err)
Emitted when any operation finishes.
virtual void Remove(QString file, bool isDir)=0
Remove password file or directory.
Pass()
Construct a Pass instance.
void finishedCopy(const QString &out, const QString &err)
Emitted when copy finishes.
virtual void Show(QString file)=0
Show decrypted password file.
static auto getRecipientString(const QString &for_file, const QString &separator=" ", int *count=nullptr) -> QStringList
Get recipients as string.
void finishedMove(const QString &out, const QString &err)
Emitted when move finishes.
void executeWrapper(PROCESS id, const QString &app, const QStringList &args, bool readStdout=true, bool readStderr=true)
Execute external wrapper command.
auto listKeys(QStringList keystrings, bool secret=false) -> QList< UserInfo >
List GPG keys matching patterns.
void finishedGrep(const QList< QPair< QString, QStringList > > &results)
Emitted when grep finishes with matching results.
virtual void GitPull_b()=0
Pull with rebase from remote.
void finishedGitPull(const QString &out, const QString &err)
Emitted when Git pull finishes.
virtual void GitPush()=0
Push changes to remote Git repository.
void finishedGitPush(const QString &out, const QString &err)
Emitted when Git push finishes.
virtual void Insert(QString file, QString value, bool force)=0
Insert or update password.
static auto getRecipientList(const QString &for_file) -> QStringList
Get list of recipients for a password file.
virtual void finished(int id, int exitCode, const QString &out, const QString &err)
Handle process completion.
Executor exec
Internal command executor for queuing and running subprocesses.
Definition pass.h:60
static bool gpgSupportsEd25519()
Check if GPG supports Ed25519 encryption.
void processErrorExit(int exitCode, const QString &err)
Emitted on process error exit.
void finishedGitInit(const QString &out, const QString &err)
Emitted when Git init finishes.
virtual void Move(const QString srcDir, const QString dest, const bool force=false)=0
Move password file or directory.
virtual auto generatePassword(unsigned int length, const QString &charset) -> QString
Generate random password.
virtual void OtpGenerate(QString file)=0
Generate OTP for password file.
void updateEnv()
Update environment for subprocesses.
void finishedInit(const QString &out, const QString &err)
Emitted when init finishes.
void error(QProcess::ProcessError)
Emitted when a process error occurs.
void critical(const QString &title, const QString &message)
Emit critical error.
static auto getGpgIdPath(const QString &for_file) -> QString
Get .gpg-id file path for a password file.
virtual void Grep(QString pattern, bool caseInsensitive=false)=0
Search password content for a pattern.
virtual void Init(QString path, const QList< UserInfo > &users)=0
Initialize new password store.
void finishedRemove(const QString &out, const QString &err)
Emitted when remove finishes.
auto generateRandomPassword(const QString &charset, unsigned int length) -> QString
Generate random password from charset.
void finishedShow(const QString &out)
Emitted when show finishes.
PROCESS
Identifies different subprocess operations used in QtPass.
Definition enums.h:26
Represents a command invocation for gpgconf operations.
Definition pass.h:24
QStringList arguments
Full argv list, including any wrapper/prefix args followed by the actual gpgconf operation flags (e....
Definition pass.h:34
QString program
Executable to run — may be a bare name resolved via PATH or a wrapper (e.g. wsl.exe) rather than a di...
Definition pass.h:29