QtPass 1.5.1
Multi-platform GUI for pass, the standard unix password manager.
Loading...
Searching...
No Matches
util.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2016 Anne Jan Brouwer
2// SPDX-License-Identifier: GPL-3.0-or-later
3#include "util.h"
4#include <QDir>
5#include <QFileInfo>
6#ifdef Q_OS_WIN
7#include <windows.h>
8#else
9#include <sys/time.h>
10#endif
11#include "qtpasssettings.h"
12
13#ifdef QT_DEBUG
14#include "debughelper.h"
15#endif
16
17QProcessEnvironment Util::_env;
18bool Util::_envInitialised;
19
24void Util::initialiseEnvironment() {
25 if (!_envInitialised) {
26 _env = QProcessEnvironment::systemEnvironment();
27#ifdef __APPLE__
28 QString path = _env.value("PATH");
29 if (!path.contains("/usr/local/MacGPG2/bin") &&
30 QFile("/usr/local/MacGPG2/bin").exists())
31 path += ":/usr/local/MacGPG2/bin";
32 if (!path.contains("/usr/local/bin"))
33 path += ":/usr/local/bin";
34 _env.insert("PATH", path);
35#endif
36#ifdef Q_OS_WIN
37 QString path = _env.value("PATH");
38 if (!path.contains("C:\\Program Files\\WinGPG\\x86") &&
39 QFile("C:\\Program Files\\WinGPG\\x86").exists())
40 path += ";C:\\Program Files\\WinGPG\\x86";
41 if (!path.contains("C:\\Program Files\\GnuPG\\bin") &&
42 QFile("C:\\Program Files\\GnuPG\\bin").exists())
43 path += ";C:\\Program Files\\GnuPG\bin";
44 _env.insert("PATH", path);
45#endif
46#ifdef QT_DEBUG
47 dbg() << _env.value("PATH");
48#endif
49 _envInitialised = true;
50 }
51}
52
58auto Util::findPasswordStore() -> QString {
59 QString path;
60 initialiseEnvironment();
61 if (_env.contains("PASSWORD_STORE_DIR")) {
62 path = _env.value("PASSWORD_STORE_DIR");
63 } else {
64#ifdef Q_OS_WIN
65 path = QDir::homePath() + QDir::separator() + "password-store" +
66 QDir::separator();
67#else
68 path = QDir::homePath() + QDir::separator() + ".password-store" +
69 QDir::separator();
70#endif
71 }
72 return Util::normalizeFolderPath(path);
73}
74
81auto Util::normalizeFolderPath(QString path) -> QString {
82 if (!path.endsWith("/") && !path.endsWith(QDir::separator())) {
83 path += QDir::separator();
84 }
85 return QDir::toNativeSeparators(path);
86}
87
93auto Util::findBinaryInPath(QString binary) -> QString {
94 initialiseEnvironment();
95
96 QString ret = "";
97
98 binary.prepend(QDir::separator());
99
100 if (_env.contains("PATH")) {
101 QString path = _env.value("PATH");
102
103 QStringList entries;
104#ifndef Q_OS_WIN
105 entries = path.split(':');
106 if (entries.length() < 2) {
107#endif
108 entries = path.split(';');
109#ifndef Q_OS_WIN
110 }
111#endif
112
113 foreach (QString entry, entries) {
114 QScopedPointer<QFileInfo> qfi(new QFileInfo(entry.append(binary)));
115#ifdef Q_OS_WIN
116 if (!qfi->exists())
117 qfi.reset(new QFileInfo(entry.append(".exe")));
118
119#endif
120 if (!qfi->isExecutable()) {
121 continue;
122 }
123
124 ret = qfi->absoluteFilePath();
125 break;
126 }
127 }
128#ifdef Q_OS_WIN
129 if (ret.isEmpty()) {
130 binary.remove(0, 1);
131 binary.prepend("wsl ");
132 QString out, err;
133 if (Executor::executeBlocking(binary, {"--version"}, &out, &err) == 0 &&
134 !out.isEmpty() && err.isEmpty())
135 ret = binary;
136 }
137#endif
138
139 return ret;
140}
141
146auto Util::checkConfig() -> bool {
147 return !QFile(QDir(QtPassSettings::getPassStore()).filePath(".gpg-id"))
148 .exists() ||
150 ? !QtPassSettings::getPassExecutable().startsWith("wsl ") &&
151 !QFile(QtPassSettings::getPassExecutable()).exists()
152 : !QtPassSettings::getGpgExecutable().startsWith("wsl ") &&
153 !QFile(QtPassSettings::getGpgExecutable()).exists());
154}
155
164auto Util::getDir(const QModelIndex &index, bool forPass,
165 const QFileSystemModel &model, const StoreModel &storeModel)
166 -> QString {
167 QString abspath =
168 QDir(QtPassSettings::getPassStore()).absolutePath() + QDir::separator();
169 if (!index.isValid()) {
170 return forPass ? "" : abspath;
171 }
172 QFileInfo info = model.fileInfo(storeModel.mapToSource(index));
173 QString filePath =
174 (info.isFile() ? info.absolutePath() : info.absoluteFilePath());
175 if (forPass) {
176 filePath = QDir(abspath).relativeFilePath(filePath);
177 }
178 filePath += QDir::separator();
179 return filePath;
180}
181
187void Util::copyDir(const QString &src, const QString &dest) {
188 QDir srcDir(src);
189 if (!srcDir.exists()) {
190 return;
191 }
192 srcDir.mkpath(dest);
193 foreach (QString dir, srcDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
194 copyDir(src + QDir::separator() + dir, dest + QDir::separator() + dir);
195 }
196
197 foreach (QString file, srcDir.entryList(QDir::Files)) {
198 QFile::copy(src + QDir::separator() + file,
199 dest + QDir::separator() + file);
200 }
201}
202
203auto Util::endsWithGpg() -> const QRegularExpression & {
204 static const QRegularExpression expr{"\\.gpg$"};
205 return expr;
206}
207
208auto Util::protocolRegex() -> const QRegularExpression & {
209 static const QRegularExpression regex{
210 "((?:https?|ftp|ssh|sftp|ftps|webdav|webdavs)://[^\\s<>\"\\)\\]\\[]+)"};
211 return regex;
212}
213
214auto Util::newLinesRegex() -> const QRegularExpression & {
215 static const QRegularExpression regex{"[\r\n]"};
216 return regex;
217}
static auto executeBlocking(QString app, const QStringList &args, const QString &input=QString(), QString *process_out=nullptr, QString *process_err=nullptr) -> int
Executor::executeBlocking blocking version of the executor, takes input and presents it as stdin.
Definition executor.cpp:177
static auto isUsePass(const bool &defaultValue=QVariant().toBool()) -> bool
static auto getPassStore(const QString &defaultValue=QVariant().toString()) -> QString
static auto getGpgExecutable(const QString &defaultValue=QVariant().toString()) -> QString
static auto getPassExecutable(const QString &defaultValue=QVariant().toString()) -> QString
The QSortFilterProxyModel for handling filesystem searches.
Definition storemodel.h:13
static auto normalizeFolderPath(QString path) -> QString
Util::normalizeFolderPath let's always end folders with a QDir::separator()
Definition util.cpp:81
static auto protocolRegex() -> const QRegularExpression &
Definition util.cpp:208
static auto endsWithGpg() -> const QRegularExpression &
Definition util.cpp:203
static auto findPasswordStore() -> QString
Util::findPasswordStore look for common .password-store folder location.
Definition util.cpp:58
static auto getDir(const QModelIndex &index, bool forPass, const QFileSystemModel &model, const StoreModel &storeModel) -> QString
Util::getDir get selectd folder path.
Definition util.cpp:164
static auto checkConfig() -> bool
Util::checkConfig do we have prequisite settings?
Definition util.cpp:146
static auto newLinesRegex() -> const QRegularExpression &
Definition util.cpp:214
static auto findBinaryInPath(QString binary) -> QString
Util::findBinaryInPath search for executables.
Definition util.cpp:93
static void copyDir(const QString &src, const QString &dest)
Util::copyDir.
Definition util.cpp:187
#define dbg()
Definition debughelper.h:9