Skip to content

Commit 1f9fae9

Browse files
authored
Merge branch 'develop' into bleo5
2 parents 9228401 + 4f8c204 commit 1f9fae9

18 files changed

+478
-37
lines changed

share/translations/keepassxc_en.ts

+48
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,10 @@
541541
<source>Export settings…</source>
542542
<translation type="unfinished"></translation>
543543
</message>
544+
<message>
545+
<source>Open browser on double clicking URL field in entry view</source>
546+
<translation type="unfinished"></translation>
547+
</message>
544548
</context>
545549
<context>
546550
<name>ApplicationSettingsWidgetSecurity</name>
@@ -2194,6 +2198,50 @@ removed from the database.</source>
21942198
<source>Autosave delay since last change checkbox</source>
21952199
<translation type="unfinished"></translation>
21962200
</message>
2201+
<message>
2202+
<source>Public Database Metadata</source>
2203+
<translation type="unfinished"></translation>
2204+
</message>
2205+
<message>
2206+
<source>Warning: the following settings are not encrypted.</source>
2207+
<translation type="unfinished"></translation>
2208+
</message>
2209+
<message>
2210+
<source>Display name:</source>
2211+
<translation type="unfinished"></translation>
2212+
</message>
2213+
<message>
2214+
<source>Publically visible display name used on the unlock dialog</source>
2215+
<translation type="unfinished"></translation>
2216+
</message>
2217+
<message>
2218+
<source>Database public display name</source>
2219+
<translation type="unfinished"></translation>
2220+
</message>
2221+
<message>
2222+
<source>Display color:</source>
2223+
<translation type="unfinished"></translation>
2224+
</message>
2225+
<message>
2226+
<source>Publically visible color used on the unlock dialog</source>
2227+
<translation type="unfinished"></translation>
2228+
</message>
2229+
<message>
2230+
<source>Database public display color chooser</source>
2231+
<translation type="unfinished"></translation>
2232+
</message>
2233+
<message>
2234+
<source>Clear</source>
2235+
<translation type="unfinished"></translation>
2236+
</message>
2237+
<message>
2238+
<source>Display icon:</source>
2239+
<translation type="unfinished"></translation>
2240+
</message>
2241+
<message>
2242+
<source>Select Database Icon</source>
2243+
<translation type="unfinished"></translation>
2244+
</message>
21972245
</context>
21982246
<context>
21992247
<name>DatabaseSettingsWidgetKeeShare</name>

src/core/Config.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ static const QHash<Config::ConfigKey, ConfigDirective> configStrings = {
6666
{Config::UseDirectWriteSaves,{QS("UseDirectWriteSaves"), Local, false}},
6767
{Config::SearchLimitGroup,{QS("SearchLimitGroup"), Roaming, false}},
6868
{Config::MinimizeOnOpenUrl,{QS("MinimizeOnOpenUrl"), Roaming, false}},
69+
{Config::OpenURLOnDoubleClick, {QS("OpenURLOnDoubleClick"), Roaming, true}},
6970
{Config::HideWindowOnCopy,{QS("HideWindowOnCopy"), Roaming, false}},
7071
{Config::MinimizeOnCopy,{QS("MinimizeOnCopy"), Roaming, true}},
7172
{Config::MinimizeAfterUnlock,{QS("MinimizeAfterUnlock"), Roaming, false}},

src/core/Config.h

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class Config : public QObject
4949
UseDirectWriteSaves,
5050
SearchLimitGroup,
5151
MinimizeOnOpenUrl,
52+
OpenURLOnDoubleClick,
5253
HideWindowOnCopy,
5354
MinimizeOnCopy,
5455
MinimizeAfterUnlock,

src/core/Database.cpp

+48
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,54 @@ QUuid Database::publicUuid()
10511051
return QUuid::fromRfc4122(publicCustomData()["KPXC_PUBLIC_UUID"].toByteArray());
10521052
}
10531053

1054+
QString Database::publicName()
1055+
{
1056+
return publicCustomData().value("KPXC_PUBLIC_NAME").toString();
1057+
}
1058+
1059+
void Database::setPublicName(const QString& name)
1060+
{
1061+
if (name.isEmpty()) {
1062+
publicCustomData().remove("KPXC_PUBLIC_NAME");
1063+
} else {
1064+
publicCustomData().insert("KPXC_PUBLIC_NAME", name);
1065+
}
1066+
markAsModified();
1067+
}
1068+
1069+
QString Database::publicColor()
1070+
{
1071+
return publicCustomData().value("KPXC_PUBLIC_COLOR").toString();
1072+
}
1073+
1074+
void Database::setPublicColor(const QString& color)
1075+
{
1076+
if (color.isEmpty()) {
1077+
publicCustomData().remove("KPXC_PUBLIC_COLOR");
1078+
} else {
1079+
publicCustomData().insert("KPXC_PUBLIC_COLOR", color);
1080+
}
1081+
markAsModified();
1082+
}
1083+
1084+
int Database::publicIcon()
1085+
{
1086+
if (publicCustomData().contains("KPXC_PUBLIC_ICON")) {
1087+
return publicCustomData().value("KPXC_PUBLIC_ICON").toInt();
1088+
}
1089+
return -1;
1090+
}
1091+
1092+
void Database::setPublicIcon(int iconIndex)
1093+
{
1094+
if (iconIndex < 0) {
1095+
publicCustomData().remove("KPXC_PUBLIC_ICON");
1096+
} else {
1097+
publicCustomData().insert("KPXC_PUBLIC_ICON", iconIndex);
1098+
}
1099+
markAsModified();
1100+
}
1101+
10541102
void Database::markAsTemporaryDatabase()
10551103
{
10561104
m_isTemporaryDatabase = true;

src/core/Database.h

+7
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ class Database : public ModifiableObject
108108
QString canonicalFilePath() const;
109109
void setFilePath(const QString& filePath);
110110

111+
QString publicName();
112+
void setPublicName(const QString& name);
113+
QString publicColor();
114+
void setPublicColor(const QString& color);
115+
int publicIcon();
116+
void setPublicIcon(int iconIndex);
117+
111118
Metadata* metadata();
112119
const Metadata* metadata() const;
113120
Group* rootGroup();

src/format/KdbxWriter.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ void KdbxWriter::extractDatabase(QByteArray& xmlOutput, Database* db)
7171
QBuffer buffer;
7272
buffer.setBuffer(&xmlOutput);
7373
buffer.open(QIODevice::WriteOnly);
74-
KdbxXmlWriter writer(db->formatVersion());
74+
KdbxXmlWriter::BinaryIdxMap idxMap;
75+
KdbxXmlWriter writer(db->formatVersion(), idxMap);
7576
writer.disableInnerStreamProtection(true);
7677
writer.writeDatabase(&buffer, db);
7778
}

src/gui/ApplicationSettingsWidget.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ void ApplicationSettingsWidget::loadSettings()
225225
m_generalUi->autoReloadOnChangeCheckBox->setChecked(config()->get(Config::AutoReloadOnChange).toBool());
226226
m_generalUi->minimizeAfterUnlockCheckBox->setChecked(config()->get(Config::MinimizeAfterUnlock).toBool());
227227
m_generalUi->minimizeOnOpenUrlCheckBox->setChecked(config()->get(Config::MinimizeOnOpenUrl).toBool());
228+
m_generalUi->openUrlOnDoubleClick->setChecked(config()->get(Config::OpenURLOnDoubleClick).toBool());
228229
m_generalUi->hideWindowOnCopyCheckBox->setChecked(config()->get(Config::HideWindowOnCopy).toBool());
229230
hideWindowOnCopyCheckBoxToggled(m_generalUi->hideWindowOnCopyCheckBox->isChecked());
230231
m_generalUi->minimizeOnCopyRadioButton->setChecked(config()->get(Config::MinimizeOnCopy).toBool());
@@ -382,6 +383,7 @@ void ApplicationSettingsWidget::saveSettings()
382383
config()->set(Config::AutoReloadOnChange, m_generalUi->autoReloadOnChangeCheckBox->isChecked());
383384
config()->set(Config::MinimizeAfterUnlock, m_generalUi->minimizeAfterUnlockCheckBox->isChecked());
384385
config()->set(Config::MinimizeOnOpenUrl, m_generalUi->minimizeOnOpenUrlCheckBox->isChecked());
386+
config()->set(Config::OpenURLOnDoubleClick, m_generalUi->openUrlOnDoubleClick->isChecked());
385387
config()->set(Config::HideWindowOnCopy, m_generalUi->hideWindowOnCopyCheckBox->isChecked());
386388
config()->set(Config::MinimizeOnCopy, m_generalUi->minimizeOnCopyRadioButton->isChecked());
387389
config()->set(Config::DropToBackgroundOnCopy, m_generalUi->dropToBackgroundOnCopyRadioButton->isChecked());

src/gui/ApplicationSettingsWidgetGeneral.ui

+14-3
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@
5757
<property name="geometry">
5858
<rect>
5959
<x>0</x>
60-
<y>0</y>
61-
<width>568</width>
62-
<height>1153</height>
60+
<y>-419</y>
61+
<width>573</width>
62+
<height>1397</height>
6363
</rect>
6464
</property>
6565
<layout class="QVBoxLayout" name="verticalLayout_8">
@@ -543,6 +543,16 @@
543543
</property>
544544
</widget>
545545
</item>
546+
<item>
547+
<widget class="QCheckBox" name="openUrlOnDoubleClick">
548+
<property name="text">
549+
<string>Open browser on double clicking URL field in entry view</string>
550+
</property>
551+
<property name="checked">
552+
<bool>true</bool>
553+
</property>
554+
</widget>
555+
</item>
546556
<item>
547557
<widget class="QCheckBox" name="useGroupIconOnEntryCreationCheckBox">
548558
<property name="text">
@@ -1351,6 +1361,7 @@
13511361
<tabstop>alternativeSaveComboBox</tabstop>
13521362
<tabstop>ConfirmMoveEntryToRecycleBinCheckBox</tabstop>
13531363
<tabstop>EnableCopyOnDoubleClickCheckBox</tabstop>
1364+
<tabstop>openUrlOnDoubleClick</tabstop>
13541365
<tabstop>useGroupIconOnEntryCreationCheckBox</tabstop>
13551366
<tabstop>minimizeOnOpenUrlCheckBox</tabstop>
13561367
<tabstop>hideWindowOnCopyCheckBox</tabstop>

src/gui/DatabaseOpenWidget.cpp

+25-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
7272
font.setPointSize(font.pointSize() + 4);
7373
font.setBold(true);
7474
m_ui->labelHeadline->setFont(font);
75-
m_ui->labelHeadline->setText(tr("Unlock KeePassXC Database"));
7675

7776
m_ui->quickUnlockButton->setFont(font);
7877
m_ui->quickUnlockButton->setIcon(
@@ -229,6 +228,31 @@ void DatabaseOpenWidget::load(const QString& filename)
229228

230229
m_ui->fileNameLabel->setRawText(m_filename);
231230

231+
// Set the public name if defined
232+
auto label = tr("Unlock KeePassXC Database");
233+
if (!m_db->publicName().isEmpty()) {
234+
label.append(QString(": %1").arg(m_db->publicName()));
235+
}
236+
m_ui->labelHeadline->setText(label);
237+
238+
// Apply the public color to the central unlock stack if defined
239+
auto color = m_db->publicColor();
240+
if (!color.isEmpty()) {
241+
m_ui->centralStack->setStyleSheet(QString("QStackedWidget {border: 4px solid %1}").arg(color));
242+
} else {
243+
m_ui->centralStack->setStyleSheet("");
244+
}
245+
246+
// Show the database icon if defined
247+
auto iconIndex = m_db->publicIcon();
248+
if (iconIndex >= 0 && iconIndex < databaseIcons()->count()) {
249+
m_ui->dbIconLabel->setPixmap(databaseIcons()->icon(iconIndex, IconSize::Large));
250+
m_ui->dbIconLabel->setVisible(true);
251+
} else {
252+
m_ui->dbIconLabel->setPixmap({});
253+
m_ui->dbIconLabel->setVisible(false);
254+
}
255+
232256
if (config()->get(Config::RememberLastKeyFiles).toBool()) {
233257
auto lastKeyFiles = config()->get(Config::LastKeyFiles).toHash();
234258
if (lastKeyFiles.contains(m_filename)) {

src/gui/DatabaseOpenWidget.ui

+47-11
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,54 @@
5555
</spacer>
5656
</item>
5757
<item>
58-
<widget class="QLabel" name="labelHeadline">
59-
<property name="font">
60-
<font>
61-
<pointsize>12</pointsize>
62-
<weight>75</weight>
63-
<bold>true</bold>
64-
</font>
58+
<layout class="QHBoxLayout" name="horizontalLayout">
59+
<property name="spacing">
60+
<number>9</number>
6561
</property>
66-
<property name="text">
67-
<string>Unlock KeePassXC Database</string>
68-
</property>
69-
</widget>
62+
<item>
63+
<widget class="QLabel" name="dbIconLabel">
64+
<property name="minimumSize">
65+
<size>
66+
<width>32</width>
67+
<height>32</height>
68+
</size>
69+
</property>
70+
<property name="text">
71+
<string/>
72+
</property>
73+
<property name="scaledContents">
74+
<bool>true</bool>
75+
</property>
76+
</widget>
77+
</item>
78+
<item>
79+
<widget class="QLabel" name="labelHeadline">
80+
<property name="font">
81+
<font>
82+
<pointsize>12</pointsize>
83+
<weight>75</weight>
84+
<bold>true</bold>
85+
</font>
86+
</property>
87+
<property name="text">
88+
<string>Unlock KeePassXC Database</string>
89+
</property>
90+
</widget>
91+
</item>
92+
<item>
93+
<spacer name="horizontalSpacer_2">
94+
<property name="orientation">
95+
<enum>Qt::Horizontal</enum>
96+
</property>
97+
<property name="sizeHint" stdset="0">
98+
<size>
99+
<width>40</width>
100+
<height>20</height>
101+
</size>
102+
</property>
103+
</spacer>
104+
</item>
105+
</layout>
70106
</item>
71107
<item>
72108
<widget class="ElidedLabel" name="fileNameLabel">

src/gui/DatabaseWidget.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -1495,11 +1495,6 @@ void DatabaseWidget::entryActivationSignalReceived(Entry* entry, EntryModel::Mod
14951495
switchToEntryEdit(entry);
14961496
}
14971497
break;
1498-
case EntryModel::Url:
1499-
if (!entry->url().isEmpty()) {
1500-
openUrlForEntry(entry);
1501-
}
1502-
break;
15031498
case EntryModel::Totp:
15041499
if (entry->hasTotp()) {
15051500
setClipboardTextAndMinimize(entry->totp());
@@ -1520,6 +1515,13 @@ void DatabaseWidget::entryActivationSignalReceived(Entry* entry, EntryModel::Mod
15201515
// TODO: switch to 'Attachments' tab in details view/pane
15211516
// case EntryModel::Attachments:
15221517
// break;
1518+
case EntryModel::Url:
1519+
if (!entry->url().isEmpty() && config()->get(Config::OpenURLOnDoubleClick).toBool()) {
1520+
openUrlForEntry(entry);
1521+
break;
1522+
}
1523+
// Note, order matters here. We want to fall into the default case.
1524+
[[fallthrough]];
15231525
default:
15241526
switchToEntryEdit(entry);
15251527
}

0 commit comments

Comments
 (0)