Allow snap builds to use keepassxc-proxy

* Updated browser extension settings for snap usage
* Support Snap 3.0 Changes
* Add missing stage packages
* Correct proxy communication with snaps
This commit is contained in:
Jonathan White 2019-03-19 08:31:05 -04:00
parent fb5746e4f7
commit 306bf0f292
4 changed files with 197 additions and 8 deletions

View File

@ -34,6 +34,7 @@ parts:
- -DKEEPASSXC_BUILD_TYPE=PreRelease
- -DWITH_TESTS=OFF
- -DWITH_XC_ALL=ON
- -DWITH_XC_KEESHARE_SECURE=ON
build-packages:
- g++
- libgcrypt20-dev
@ -50,6 +51,7 @@ parts:
- libsodium-dev
- libargon2-0-dev
- libqrencode-dev
- libquazip5-dev
stage-packages:
- dbus
- qttranslations5-l10n # common translations
@ -60,6 +62,9 @@ parts:
- libxtst6
- libqt5x11extras5
- libqt5svg5
- libqrencode3
- libqt5concurrent5
- libquazip5-1
- libusb-1.0-0
- qtwayland5
override-build: |
@ -71,3 +76,24 @@ parts:
- -opt
after: [desktop-qt5]
desktop-qt5:
source: https://github.com/ubuntu/snapcraft-desktop-helpers.git
source-subdir: qt
plugin: make
make-parameters: ["FLAVOR=qt5"]
build-packages:
- qtbase5-dev
- dpkg-dev
stage-packages:
- libxkbcommon0
- ttf-ubuntu-font-family
- dmz-cursor-theme
- light-themes
- adwaita-icon-theme
- gnome-themes-standard
- shared-mime-info
- libqt5gui5
- libgdk-pixbuf2.0-0
- libqt5svg5 # for loading icon themes which are svg
- try: [appmenu-qt5] # not available on core18
- locales-all

View File

@ -32,13 +32,24 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent)
{
m_ui->setupUi(this);
// clang-format off
QString snapInstructions;
#if defined(KEEPASSXC_DIST_SNAP)
snapInstructions = "<br /><br />" +
tr("Due to Snap sandboxing, you must run a script to enable browser integration."
"<br />"
"You can obtain this script from %1")
.arg("<a href=\"https://keepassxc.org/download#linux\">https://keepassxc.org</a>");
#endif
m_ui->extensionLabel->setOpenExternalLinks(true);
m_ui->extensionLabel->setText(
tr("KeePassXC-Browser is needed for the browser integration to work. <br />Download it for %1 and %2.")
tr("KeePassXC-Browser is needed for the browser integration to work. <br />Download it for %1 and %2.%3")
.arg("<a href=\"https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/\">Firefox</a>",
"<a "
"href=\"https://chrome.google.com/webstore/detail/keepassxc-browser/"
"oboonakemofpalcgghocfoadofidjkkk\">Google Chrome / Chromium / Vivaldi</a>"));
"<a href=\"https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk\">"
"Google Chrome / Chromium / Vivaldi</a>",
snapInstructions));
// clang-format on
m_ui->scriptWarningWidget->setVisible(false);
m_ui->scriptWarningWidget->setAutoHideTimeout(-1);
@ -119,10 +130,18 @@ void BrowserOptionDialog::loadSettings()
m_ui->supportBrowserProxy->setChecked(true);
m_ui->supportBrowserProxy->setEnabled(false);
#elif defined(KEEPASSXC_DIST_SNAP)
m_ui->enableBrowserSupport->setChecked(false);
m_ui->enableBrowserSupport->setEnabled(false);
// Disable settings that will not work
m_ui->supportBrowserProxy->setChecked(true);
m_ui->supportBrowserProxy->setEnabled(false);
m_ui->useCustomProxy->setChecked(false);
m_ui->useCustomProxy->setEnabled(false);
m_ui->browsersGroupBox->setVisible(false);
m_ui->browsersGroupBox->setEnabled(false);
m_ui->updateBinaryPath->setChecked(false);
m_ui->updateBinaryPath->setEnabled(false);
// Show notice to user
m_ui->browserGlobalWarningWidget->showMessage(
tr("We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment."),
tr("Please see special instructions for browser extension use below"),
MessageWidget::Warning);
m_ui->browserGlobalWarningWidget->setCloseButtonVisible(false);
m_ui->browserGlobalWarningWidget->setAutoHideTimeout(-1);

View File

@ -137,7 +137,9 @@ void NativeMessagingBase::sendReply(const QString& reply)
QString NativeMessagingBase::getLocalServerPath() const
{
const QString serverPath = "/kpxc_server";
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
#if defined(KEEPASSXC_DIST_SNAP)
return QProcessEnvironment::systemEnvironment().value("SNAP_COMMON") + serverPath;
#elif defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
// Use XDG_RUNTIME_DIR instead of /tmp if it's available
QString path = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
return path.isEmpty() ? QStandardPaths::writableLocation(QStandardPaths::TempLocation) + serverPath

142
utils/keepassxc-snap-helper.sh Executable file
View File

@ -0,0 +1,142 @@
#!/usr/bin/env bash
#
# KeePassXC Browser Extension Native Messaging Installer Tool
# Copyright (C) 2017 KeePassXC team <https://keepassxc.org/>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 or (at your option)
# version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
DEBUG=false
JSON_BASE=$(cat << EOF
{
"name": "org.keepassxc.keepassxc_browser",
"description": "KeePassXC integration with native messaging support",
"path": "/snap/bin/keepassxc.proxy",
"type": "stdio",
__EXT__
}
EOF
)
JSON_FIREFOX=$(cat << EOF
"allowed_extensions": [
"keepassxc-browser@keepassxc.org"
]
EOF
)
JSON_CHROME=$(cat << EOF
"allowed_origins": [
"chrome-extension://iopaggbpplllidnfmcghoonnokmjoicf/",
"chrome-extension://oboonakemofpalcgghocfoadofidjkkk/"
]
EOF
)
JSON_OUT=""
BASE_DIR="."
INSTALL_DIR=""
INSTALL_FILE="org.keepassxc.keepassxc_browser.json"
buildJson() {
if [[ ! -z $1 ]]; then
# Insert Firefox data
JSON_OUT="${JSON_BASE/__EXT__/$JSON_FIREFOX}"
else
# Insert Chrome data
JSON_OUT="${JSON_BASE/__EXT__/$JSON_CHROME}"
fi
}
askBrowserSnap() {
if (whiptail --title "Snap Choice" --defaultno \
--yesno "Is this browser installed as a snap (usually NO)?" 8 60); then
# BASE_DIR="$1"
whiptail --title "Snap Choice" --msgbox "Sorry, browsers installed as snaps are not supported at this time" 8 50
exit 0
fi
}
setupFirefox() {
askBrowserSnap "./snap/firefox/common"
buildJson "firefox"
INSTALL_DIR="${BASE_DIR}/.mozilla/native-messaging-hosts"
}
setupChrome() {
buildJson
INSTALL_DIR="${BASE_DIR}/.config/google-chrome/NativeMessagingHosts"
}
setupChromium() {
askBrowserSnap "./snap/chromium/current"
buildJson
INSTALL_DIR="${BASE_DIR}/.config/chromium/NativeMessagingHosts"
}
setupVivaldi() {
buildJson
INSTALL_DIR="${BASE_DIR}/.config/vivaldi/NativeMessagingHosts"
}
setupTorBrowser() {
buildJson "firefox"
INSTALL_DIR="${BASE_DIR}/.tor-browser/app/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts"
}
# --------------------------------
# Start of script
# --------------------------------
BROWSER=$(whiptail \
--title "Browser Selection" \
--menu "Choose a browser to integrate with KeePassXC:" \
15 60 5 \
"1" "Firefox" \
"2" "Chrome" \
"3" "Chromium" \
"4" "Vivaldi" \
"5" "Tor Browser" \
3>&1 1>&2 2>&3)
clear
exitstatus=$?
if [ $exitstatus = 0 ]; then
# Configure settings for the chosen browser
case "$BROWSER" in
1) setupFirefox ;;
2) setupChrome ;;
3) setupChromium ;;
4) setupVivaldi ;;
5) setupTorBrowser ;;
esac
# Install the JSON file
cd ~
mkdir -p "$INSTALL_DIR"
echo "$JSON_OUT" > ${INSTALL_DIR}/${INSTALL_FILE}
$DEBUG && echo "Installed to: ${INSTALL_DIR}/${INSTALL_FILE}"
whiptail \
--title "Installation Complete" \
--msgbox "You will need to restart your browser in order to connect to KeePassXC" \
8 50
else
whiptail --title "Installation Canceled" --msgbox "No changes were made to your system" 8 50
fi