mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2024-10-01 01:26:01 -04:00
Add disambiguation info to source strings
This commit is contained in:
parent
3605bec8e0
commit
8da3efa2c2
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>456</width>
|
<width>523</width>
|
||||||
<height>385</height>
|
<height>456</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -130,7 +130,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="showNotification">
|
<widget class="QCheckBox" name="showNotification">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show a &notification when credentials are requested</string>
|
<string extracomment="Credentials mean login data requested via browser extension">Show a &notification when credentials are requested</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked">
|
<property name="checked">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -170,14 +170,14 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="sortByTitle">
|
<widget class="QRadioButton" name="sortByTitle">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Sort &matching credentials by title</string>
|
<string extracomment="Credentials mean login data requested via browser extension">Sort &matching credentials by title</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="sortByUsername">
|
<widget class="QRadioButton" name="sortByUsername">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Sort matching credentials by &username</string>
|
<string extracomment="Credentials mean login data requested via browser extension">Sort matching credentials by &username</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -260,14 +260,14 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="alwaysAllowAccess">
|
<widget class="QCheckBox" name="alwaysAllowAccess">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Never &ask before accessing credentials</string>
|
<string extracomment="Credentials mean login data requested via browser extension">Never &ask before accessing credentials</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="alwaysAllowUpdate">
|
<widget class="QCheckBox" name="alwaysAllowUpdate">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Never ask before &updating credentials</string>
|
<string extracomment="Credentials mean login data requested via browser extension">Never ask before &updating credentials</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -277,7 +277,7 @@
|
|||||||
<string>Only the selected database has to be connected with a client.</string>
|
<string>Only the selected database has to be connected with a client.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Searc&h in all opened databases for matching credentials</string>
|
<string extracomment="Credentials mean login data requested via browser extension">Searc&h in all opened databases for matching credentials</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -317,7 +317,7 @@
|
|||||||
<string>Use a custom proxy location if you installed a proxy manually.</string>
|
<string>Use a custom proxy location if you installed a proxy manually.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Use a &custom proxy location</string>
|
<string comment="Meant is the proxy for KeePassXC-Browser">Use a &custom proxy location</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -336,7 +336,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="customProxyLocationBrowseButton">
|
<widget class="QPushButton" name="customProxyLocationBrowseButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Browse...</string>
|
<string extracomment="Button for opening file dialog">Browse...</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -53,7 +53,7 @@ int Clip::execute(QStringList arguments)
|
|||||||
QObject::tr("Key file of the database."),
|
QObject::tr("Key file of the database."),
|
||||||
QObject::tr("path"));
|
QObject::tr("path"));
|
||||||
parser.addOption(keyFile);
|
parser.addOption(keyFile);
|
||||||
parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip."));
|
parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.", "clip = copy to clipboard"));
|
||||||
parser.addPositionalArgument(
|
parser.addPositionalArgument(
|
||||||
"timeout", QObject::tr("Timeout in seconds before clearing the clipboard."), QString("[timeout]"));
|
"timeout", QObject::tr("Timeout in seconds before clearing the clipboard."), QString("[timeout]"));
|
||||||
parser.process(arguments);
|
parser.process(arguments);
|
||||||
|
@ -671,7 +671,7 @@ Entry* Entry::clone(CloneFlags flags) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (flags & CloneRenameTitle)
|
if (flags & CloneRenameTitle)
|
||||||
entry->setTitle(entry->title() + tr(" - Clone"));
|
entry->setTitle(entry->title() + tr(" - Clone", "Suffix added to cloned entries"));
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
@ -298,6 +298,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
& KeePass2::VARIANTMAP_CRITICAL_MASK;
|
& KeePass2::VARIANTMAP_CRITICAL_MASK;
|
||||||
quint16 maxVersion = KeePass2::VARIANTMAP_VERSION & KeePass2::VARIANTMAP_CRITICAL_MASK;
|
quint16 maxVersion = KeePass2::VARIANTMAP_VERSION & KeePass2::VARIANTMAP_CRITICAL_MASK;
|
||||||
if (!ok || (version > maxVersion)) {
|
if (!ok || (version > maxVersion)) {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Unsupported KeePass variant map version."));
|
raiseError(tr("Unsupported KeePass variant map version."));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -310,6 +311,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
!= KeePass2::VariantMapFieldType::End)) {
|
!= KeePass2::VariantMapFieldType::End)) {
|
||||||
auto nameLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok);
|
auto nameLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map entry name length"));
|
raiseError(tr("Invalid variant map entry name length"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -317,6 +319,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
if (nameLen != 0) {
|
if (nameLen != 0) {
|
||||||
nameBytes = device->read(nameLen);
|
nameBytes = device->read(nameLen);
|
||||||
if (static_cast<quint32>(nameBytes.size()) != nameLen) {
|
if (static_cast<quint32>(nameBytes.size()) != nameLen) {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map entry name data"));
|
raiseError(tr("Invalid variant map entry name data"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -325,6 +328,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
|
|
||||||
auto valueLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok);
|
auto valueLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map entry value length"));
|
raiseError(tr("Invalid variant map entry value length"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -332,6 +336,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
if (valueLen != 0) {
|
if (valueLen != 0) {
|
||||||
valueBytes = device->read(valueLen);
|
valueBytes = device->read(valueLen);
|
||||||
if (static_cast<quint32>(valueBytes.size()) != valueLen) {
|
if (static_cast<quint32>(valueBytes.size()) != valueLen) {
|
||||||
|
//: Translation comment: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map entry value data"));
|
raiseError(tr("Invalid variant map entry value data"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -342,6 +347,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
if (valueLen == 1) {
|
if (valueLen == 1) {
|
||||||
vm.insert(name, QVariant(valueBytes.at(0) != 0));
|
vm.insert(name, QVariant(valueBytes.at(0) != 0));
|
||||||
} else {
|
} else {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map Bool entry value length"));
|
raiseError(tr("Invalid variant map Bool entry value length"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -351,6 +357,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
if (valueLen == 4) {
|
if (valueLen == 4) {
|
||||||
vm.insert(name, QVariant(Endian::bytesToSizedInt<qint32>(valueBytes, KeePass2::BYTEORDER)));
|
vm.insert(name, QVariant(Endian::bytesToSizedInt<qint32>(valueBytes, KeePass2::BYTEORDER)));
|
||||||
} else {
|
} else {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map Int32 entry value length"));
|
raiseError(tr("Invalid variant map Int32 entry value length"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -360,6 +367,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
if (valueLen == 4) {
|
if (valueLen == 4) {
|
||||||
vm.insert(name, QVariant(Endian::bytesToSizedInt<quint32>(valueBytes, KeePass2::BYTEORDER)));
|
vm.insert(name, QVariant(Endian::bytesToSizedInt<quint32>(valueBytes, KeePass2::BYTEORDER)));
|
||||||
} else {
|
} else {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map UInt32 entry value length"));
|
raiseError(tr("Invalid variant map UInt32 entry value length"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -369,6 +377,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
if (valueLen == 8) {
|
if (valueLen == 8) {
|
||||||
vm.insert(name, QVariant(Endian::bytesToSizedInt<qint64>(valueBytes, KeePass2::BYTEORDER)));
|
vm.insert(name, QVariant(Endian::bytesToSizedInt<qint64>(valueBytes, KeePass2::BYTEORDER)));
|
||||||
} else {
|
} else {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map Int64 entry value length"));
|
raiseError(tr("Invalid variant map Int64 entry value length"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -378,6 +387,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
if (valueLen == 8) {
|
if (valueLen == 8) {
|
||||||
vm.insert(name, QVariant(Endian::bytesToSizedInt<quint64>(valueBytes, KeePass2::BYTEORDER)));
|
vm.insert(name, QVariant(Endian::bytesToSizedInt<quint64>(valueBytes, KeePass2::BYTEORDER)));
|
||||||
} else {
|
} else {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map UInt64 entry value length"));
|
raiseError(tr("Invalid variant map UInt64 entry value length"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -392,12 +402,14 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map entry type"));
|
raiseError(tr("Invalid variant map entry type"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fieldTypeArray.size() != 1) {
|
if (fieldTypeArray.size() != 1) {
|
||||||
|
//: Translation: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Invalid variant map field type size"));
|
raiseError(tr("Invalid variant map field type size"));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db)
|
|||||||
}
|
}
|
||||||
int ivSize = SymmetricCipher::algorithmIvSize(algo);
|
int ivSize = SymmetricCipher::algorithmIvSize(algo);
|
||||||
if (ivSize < 0) {
|
if (ivSize < 0) {
|
||||||
raiseError(tr("Invalid symmetric cipher IV size."));
|
raiseError(tr("Invalid symmetric cipher IV size.", "IV = Initialization Vector for symmetric cipher"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,6 +82,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db)
|
|||||||
QVariantMap kdfParams = KeePass2::kdfToParameters(db->kdf());
|
QVariantMap kdfParams = KeePass2::kdfToParameters(db->kdf());
|
||||||
QByteArray kdfParamBytes;
|
QByteArray kdfParamBytes;
|
||||||
if (!serializeVariantMap(kdfParams, kdfParamBytes)) {
|
if (!serializeVariantMap(kdfParams, kdfParamBytes)) {
|
||||||
|
//: Translation comment: variant map = data structure for storing meta data
|
||||||
raiseError(tr("Failed to serialize KDF parameters variant map"));
|
raiseError(tr("Failed to serialize KDF parameters variant map"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1120,6 +1120,7 @@ QByteArray KdbxXmlReader::readCompressedBinary()
|
|||||||
|
|
||||||
QByteArray result;
|
QByteArray result;
|
||||||
if (!Tools::readAllFromDevice(&compressor, result)) {
|
if (!Tools::readAllFromDevice(&compressor, result)) {
|
||||||
|
//: Translator meant is a binary data inside an entry
|
||||||
raiseError(tr("Unable to decompress binary"));
|
raiseError(tr("Unable to decompress binary"));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -126,37 +126,37 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
|
|||||||
|
|
||||||
m_encryptionIV = m_device->read(16);
|
m_encryptionIV = m_device->read(16);
|
||||||
if (m_encryptionIV.size() != 16) {
|
if (m_encryptionIV.size() != 16) {
|
||||||
raiseError("Unable to read encryption IV");
|
raiseError(tr("Unable to read encryption IV", "IV = Initialization Vector for symmetric cipher"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto numGroups = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok);
|
auto numGroups = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
raiseError("Invalid number of groups");
|
raiseError(tr("Invalid number of groups"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto numEntries = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok);
|
auto numEntries = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
raiseError("Invalid number of entries");
|
raiseError(tr("Invalid number of entries"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_contentHashHeader = m_device->read(32);
|
m_contentHashHeader = m_device->read(32);
|
||||||
if (m_contentHashHeader.size() != 32) {
|
if (m_contentHashHeader.size() != 32) {
|
||||||
raiseError("Invalid content hash size");
|
raiseError(tr("Invalid content hash size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_transformSeed = m_device->read(32);
|
m_transformSeed = m_device->read(32);
|
||||||
if (m_transformSeed.size() != 32) {
|
if (m_transformSeed.size() != 32) {
|
||||||
raiseError("Invalid transform seed size");
|
raiseError(tr("Invalid transform seed size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_transformRounds = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok);
|
m_transformRounds = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
raiseError("Invalid number of transform rounds");
|
raiseError(tr("Invalid number of transform rounds"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
auto kdf = QSharedPointer<AesKdf>::create(true);
|
auto kdf = QSharedPointer<AesKdf>::create(true);
|
||||||
@ -191,7 +191,7 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!constructGroupTree(groups)) {
|
if (!constructGroupTree(groups)) {
|
||||||
raiseError("Unable to construct group tree");
|
raiseError(tr("Unable to construct group tree"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,7 +401,7 @@ QByteArray KeePass1Reader::key(const QByteArray& password, const QByteArray& key
|
|||||||
bool result = key.transform(*m_db->kdf(), transformedKey);
|
bool result = key.transform(*m_db->kdf(), transformedKey);
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
raiseError("Key transformation failed");
|
raiseError(tr("Key transformation failed"));
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,19 +445,19 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
|
|||||||
do {
|
do {
|
||||||
quint16 fieldType = Endian::readSizedInt<quint16>(cipherStream, KeePass1::BYTEORDER, &ok);
|
quint16 fieldType = Endian::readSizedInt<quint16>(cipherStream, KeePass1::BYTEORDER, &ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
raiseError("Invalid group field type number");
|
raiseError(tr("Invalid group field type number"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fieldSize = static_cast<int>(Endian::readSizedInt<quint32>(cipherStream, KeePass1::BYTEORDER, &ok));
|
int fieldSize = static_cast<int>(Endian::readSizedInt<quint32>(cipherStream, KeePass1::BYTEORDER, &ok));
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
raiseError("Invalid group field size");
|
raiseError(tr("Invalid group field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray fieldData = cipherStream->read(fieldSize);
|
QByteArray fieldData = cipherStream->read(fieldSize);
|
||||||
if (fieldData.size() != fieldSize) {
|
if (fieldData.size() != fieldSize) {
|
||||||
raiseError("Read group field data doesn't match size");
|
raiseError(tr("Read group field data doesn't match size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -467,7 +467,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
|
|||||||
break;
|
break;
|
||||||
case 0x0001:
|
case 0x0001:
|
||||||
if (fieldSize != 4) {
|
if (fieldSize != 4) {
|
||||||
raiseError("Incorrect group id field size");
|
raiseError(tr("Incorrect group id field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
groupId = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER);
|
groupId = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER);
|
||||||
@ -479,7 +479,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
|
|||||||
case 0x0003:
|
case 0x0003:
|
||||||
{
|
{
|
||||||
if (fieldSize != 5) {
|
if (fieldSize != 5) {
|
||||||
raiseError("Incorrect group creation time field size");
|
raiseError(tr("Incorrect group creation time field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
||||||
@ -491,7 +491,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
|
|||||||
case 0x0004:
|
case 0x0004:
|
||||||
{
|
{
|
||||||
if (fieldSize != 5) {
|
if (fieldSize != 5) {
|
||||||
raiseError("Incorrect group modification time field size");
|
raiseError(tr("Incorrect group modification time field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
||||||
@ -503,7 +503,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
|
|||||||
case 0x0005:
|
case 0x0005:
|
||||||
{
|
{
|
||||||
if (fieldSize != 5) {
|
if (fieldSize != 5) {
|
||||||
raiseError("Incorrect group access time field size");
|
raiseError(tr("Incorrect group access time field size"));
|
||||||
}
|
}
|
||||||
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
||||||
if (dateTime.isValid()) {
|
if (dateTime.isValid()) {
|
||||||
@ -514,7 +514,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
|
|||||||
case 0x0006:
|
case 0x0006:
|
||||||
{
|
{
|
||||||
if (fieldSize != 5) {
|
if (fieldSize != 5) {
|
||||||
raiseError("Incorrect group expiry time field size");
|
raiseError(tr("Incorrect group expiry time field size"));
|
||||||
}
|
}
|
||||||
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
||||||
if (dateTime.isValid()) {
|
if (dateTime.isValid()) {
|
||||||
@ -526,7 +526,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
|
|||||||
case 0x0007:
|
case 0x0007:
|
||||||
{
|
{
|
||||||
if (fieldSize != 4) {
|
if (fieldSize != 4) {
|
||||||
raiseError("Incorrect group icon field size");
|
raiseError(tr("Incorrect group icon field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
quint32 iconNumber = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER);
|
quint32 iconNumber = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER);
|
||||||
@ -536,7 +536,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
|
|||||||
case 0x0008:
|
case 0x0008:
|
||||||
{
|
{
|
||||||
if (fieldSize != 2) {
|
if (fieldSize != 2) {
|
||||||
raiseError("Incorrect group level field size");
|
raiseError(tr("Incorrect group level field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
groupLevel = Endian::bytesToSizedInt<quint16>(fieldData, KeePass1::BYTEORDER);
|
groupLevel = Endian::bytesToSizedInt<quint16>(fieldData, KeePass1::BYTEORDER);
|
||||||
@ -551,13 +551,13 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// invalid field
|
// invalid field
|
||||||
raiseError("Invalid group field type");
|
raiseError(tr("Invalid group field type"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
} while (!reachedEnd);
|
} while (!reachedEnd);
|
||||||
|
|
||||||
if (!groupIdSet || !groupLevelSet) {
|
if (!groupIdSet || !groupLevelSet) {
|
||||||
raiseError("Missing group id or level");
|
raiseError(tr("Missing group id or level"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -583,19 +583,19 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
|
|||||||
do {
|
do {
|
||||||
quint16 fieldType = Endian::readSizedInt<quint16>(cipherStream, KeePass1::BYTEORDER, &ok);
|
quint16 fieldType = Endian::readSizedInt<quint16>(cipherStream, KeePass1::BYTEORDER, &ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
raiseError("Missing entry field type number");
|
raiseError(tr("Missing entry field type number"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fieldSize = static_cast<int>(Endian::readSizedInt<quint32>(cipherStream, KeePass1::BYTEORDER, &ok));
|
int fieldSize = static_cast<int>(Endian::readSizedInt<quint32>(cipherStream, KeePass1::BYTEORDER, &ok));
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
raiseError("Invalid entry field size");
|
raiseError(tr("Invalid entry field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray fieldData = cipherStream->read(fieldSize);
|
QByteArray fieldData = cipherStream->read(fieldSize);
|
||||||
if (fieldData.size() != fieldSize) {
|
if (fieldData.size() != fieldSize) {
|
||||||
raiseError("Read entry field data doesn't match size");
|
raiseError(tr("Read entry field data doesn't match size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -605,7 +605,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
|
|||||||
break;
|
break;
|
||||||
case 0x0001:
|
case 0x0001:
|
||||||
if (fieldSize != 16) {
|
if (fieldSize != 16) {
|
||||||
raiseError("Invalid entry uuid field size");
|
raiseError(tr("Invalid entry uuid field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
m_entryUuids.insert(fieldData, entry.data());
|
m_entryUuids.insert(fieldData, entry.data());
|
||||||
@ -613,7 +613,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
|
|||||||
case 0x0002:
|
case 0x0002:
|
||||||
{
|
{
|
||||||
if (fieldSize != 4) {
|
if (fieldSize != 4) {
|
||||||
raiseError("Invalid entry group id field size");
|
raiseError(tr("Invalid entry group id field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
quint32 groupId = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER);
|
quint32 groupId = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER);
|
||||||
@ -623,7 +623,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
|
|||||||
case 0x0003:
|
case 0x0003:
|
||||||
{
|
{
|
||||||
if (fieldSize != 4) {
|
if (fieldSize != 4) {
|
||||||
raiseError("Invalid entry icon field size");
|
raiseError(tr("Invalid entry icon field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
quint32 iconNumber = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER);
|
quint32 iconNumber = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER);
|
||||||
@ -648,7 +648,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
|
|||||||
case 0x0009:
|
case 0x0009:
|
||||||
{
|
{
|
||||||
if (fieldSize != 5) {
|
if (fieldSize != 5) {
|
||||||
raiseError("Invalid entry creation time field size");
|
raiseError(tr("Invalid entry creation time field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
||||||
@ -660,7 +660,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
|
|||||||
case 0x000A:
|
case 0x000A:
|
||||||
{
|
{
|
||||||
if (fieldSize != 5) {
|
if (fieldSize != 5) {
|
||||||
raiseError("Invalid entry modification time field size");
|
raiseError(tr("Invalid entry modification time field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
||||||
@ -672,7 +672,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
|
|||||||
case 0x000B:
|
case 0x000B:
|
||||||
{
|
{
|
||||||
if (fieldSize != 5) {
|
if (fieldSize != 5) {
|
||||||
raiseError("Invalid entry creation time field size");
|
raiseError(tr("Invalid entry creation time field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
||||||
@ -684,7 +684,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
|
|||||||
case 0x000C:
|
case 0x000C:
|
||||||
{
|
{
|
||||||
if (fieldSize != 5) {
|
if (fieldSize != 5) {
|
||||||
raiseError("Invalid entry expiry time field size");
|
raiseError(tr("Invalid entry expiry time field size"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
QDateTime dateTime = dateFromPackedStruct(fieldData);
|
||||||
@ -707,7 +707,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// invalid field
|
// invalid field
|
||||||
raiseError("Invalid entry field type");
|
raiseError(tr("Invalid entry field type"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
} while (!reachedEnd);
|
} while (!reachedEnd);
|
||||||
|
@ -142,7 +142,7 @@ void DatabaseSettingsWidget::save()
|
|||||||
if (kdf->uuid() == KeePass2::KDF_ARGON2 && m_uiEncryption->transformRoundsSpinBox->value() > 10000) {
|
if (kdf->uuid() == KeePass2::KDF_ARGON2 && m_uiEncryption->transformRoundsSpinBox->value() > 10000) {
|
||||||
QMessageBox warning;
|
QMessageBox warning;
|
||||||
warning.setIcon(QMessageBox::Warning);
|
warning.setIcon(QMessageBox::Warning);
|
||||||
warning.setWindowTitle(tr("Number of rounds too high"));
|
warning.setWindowTitle(tr("Number of rounds too high", "Key transformation rounds"));
|
||||||
warning.setText(tr("You are using a very high number of key transform rounds with Argon2.\n\n"
|
warning.setText(tr("You are using a very high number of key transform rounds with Argon2.\n\n"
|
||||||
"If you keep this number, your database may take hours or days (or even longer) to open!"));
|
"If you keep this number, your database may take hours or days (or even longer) to open!"));
|
||||||
auto ok = warning.addButton(tr("Understood, keep number"), QMessageBox::ButtonRole::AcceptRole);
|
auto ok = warning.addButton(tr("Understood, keep number"), QMessageBox::ButtonRole::AcceptRole);
|
||||||
@ -156,7 +156,7 @@ void DatabaseSettingsWidget::save()
|
|||||||
&& m_uiEncryption->transformRoundsSpinBox->value() < 100000) {
|
&& m_uiEncryption->transformRoundsSpinBox->value() < 100000) {
|
||||||
QMessageBox warning;
|
QMessageBox warning;
|
||||||
warning.setIcon(QMessageBox::Warning);
|
warning.setIcon(QMessageBox::Warning);
|
||||||
warning.setWindowTitle(tr("Number of rounds too low"));
|
warning.setWindowTitle(tr("Number of rounds too low", "Key transformation rounds"));
|
||||||
warning.setText(tr("You are using a very low number of key transform rounds with AES-KDF.\n\n"
|
warning.setText(tr("You are using a very low number of key transform rounds with AES-KDF.\n\n"
|
||||||
"If you keep this number, your database may be too easy to crack!"));
|
"If you keep this number, your database may be too easy to crack!"));
|
||||||
auto ok = warning.addButton(tr("Understood, keep number"), QMessageBox::ButtonRole::AcceptRole);
|
auto ok = warning.addButton(tr("Understood, keep number"), QMessageBox::ButtonRole::AcceptRole);
|
||||||
|
@ -85,7 +85,7 @@ void DatabaseTabWidget::newDatabase()
|
|||||||
{
|
{
|
||||||
DatabaseManagerStruct dbStruct;
|
DatabaseManagerStruct dbStruct;
|
||||||
Database* db = new Database();
|
Database* db = new Database();
|
||||||
db->rootGroup()->setName(tr("Root"));
|
db->rootGroup()->setName(tr("Root", "Root group"));
|
||||||
dbStruct.dbWidget = new DatabaseWidget(db, this);
|
dbStruct.dbWidget = new DatabaseWidget(db, this);
|
||||||
|
|
||||||
CompositeKey emptyKey;
|
CompositeKey emptyKey;
|
||||||
|
@ -1277,7 +1277,7 @@ void DatabaseWidget::reloadDatabaseFile()
|
|||||||
|
|
||||||
if (! config()->get("AutoReloadOnChange").toBool()) {
|
if (! config()->get("AutoReloadOnChange").toBool()) {
|
||||||
// Ask if we want to reload the db
|
// Ask if we want to reload the db
|
||||||
QMessageBox::StandardButton mb = MessageBox::question(this, tr("Autoreload Request"),
|
QMessageBox::StandardButton mb = MessageBox::question(this, tr("File has changed"),
|
||||||
tr("The database file has changed. Do you want to load the changes?"),
|
tr("The database file has changed. Do you want to load the changes?"),
|
||||||
QMessageBox::Yes | QMessageBox::No);
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>800</width>
|
<width>800</width>
|
||||||
<height>21</height>
|
<height>34</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
@ -243,7 +243,7 @@
|
|||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Timed one-time password</string>
|
<string>Time-based one-time password</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionEntryCopyTotp"/>
|
<addaction name="actionEntryCopyTotp"/>
|
||||||
<addaction name="actionEntryTotp"/>
|
<addaction name="actionEntryTotp"/>
|
||||||
|
@ -283,16 +283,16 @@ void PasswordGeneratorWidget::colorStrengthIndicator(double entropy)
|
|||||||
// <https://community.kde.org/KDE_Visual_Design_Group/HIG/Color>
|
// <https://community.kde.org/KDE_Visual_Design_Group/HIG/Color>
|
||||||
if (entropy < 40) {
|
if (entropy < 40) {
|
||||||
m_ui->entropyProgressBar->setStyleSheet(style.arg("#c0392b"));
|
m_ui->entropyProgressBar->setStyleSheet(style.arg("#c0392b"));
|
||||||
m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Poor")));
|
m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Poor", "Password quality")));
|
||||||
} else if (entropy >= 40 && entropy < 65) {
|
} else if (entropy >= 40 && entropy < 65) {
|
||||||
m_ui->entropyProgressBar->setStyleSheet(style.arg("#f39c1f"));
|
m_ui->entropyProgressBar->setStyleSheet(style.arg("#f39c1f"));
|
||||||
m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Weak")));
|
m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Weak", "Password quality")));
|
||||||
} else if (entropy >= 65 && entropy < 100) {
|
} else if (entropy >= 65 && entropy < 100) {
|
||||||
m_ui->entropyProgressBar->setStyleSheet(style.arg("#11d116"));
|
m_ui->entropyProgressBar->setStyleSheet(style.arg("#11d116"));
|
||||||
m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Good")));
|
m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Good", "Password quality")));
|
||||||
} else {
|
} else {
|
||||||
m_ui->entropyProgressBar->setStyleSheet(style.arg("#27ae60"));
|
m_ui->entropyProgressBar->setStyleSheet(style.arg("#27ae60"));
|
||||||
m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Excellent")));
|
m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Excellent", "Password quality")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,14 @@
|
|||||||
<ui version="4.0">
|
<ui version="4.0">
|
||||||
<class>PasswordGeneratorWidget</class>
|
<class>PasswordGeneratorWidget</class>
|
||||||
<widget class="QWidget" name="PasswordGeneratorWidget">
|
<widget class="QWidget" name="PasswordGeneratorWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>547</width>
|
||||||
|
<height>352</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
@ -100,7 +108,7 @@ QProgressBar::chunk {
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>strength</string>
|
<string comment="Password strength">strength</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="textFormat">
|
<property name="textFormat">
|
||||||
<enum>Qt::PlainText</enum>
|
<enum>Qt::PlainText</enum>
|
||||||
|
@ -415,7 +415,7 @@
|
|||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> ms</string>
|
<string comment="Milliseconds"> ms</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefix">
|
<property name="prefix">
|
||||||
<string/>
|
<string/>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>595</width>
|
<width>595</width>
|
||||||
<height>443</height>
|
<height>446</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
@ -48,7 +48,7 @@
|
|||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> sec</string>
|
<string comment="Seconds"> sec</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@ -86,7 +86,7 @@
|
|||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> sec</string>
|
<string comment="Seconds"> sec</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>10</number>
|
<number>10</number>
|
||||||
|
@ -132,7 +132,7 @@
|
|||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> sec</string>
|
<string comment="Seconds"> sec</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>471</width>
|
<width>498</width>
|
||||||
<height>480</height>
|
<height>518</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -166,7 +166,7 @@
|
|||||||
<item row="3" column="2">
|
<item row="3" column="2">
|
||||||
<widget class="QPushButton" name="browseButton">
|
<widget class="QPushButton" name="browseButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Browse...</string>
|
<string extracomment="Button for opening file dialog">Browse...</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="showNotification">
|
<widget class="QCheckBox" name="showNotification">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Sh&ow a notification when credentials are requested</string>
|
<string extracomment="Credentials mean login data requested via browser extension">Sh&ow a notification when credentials are requested</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked">
|
<property name="checked">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
Loading…
Reference in New Issue
Block a user