diff --git a/Makefile b/Makefile index d68752e..d7ab5d9 100644 --- a/Makefile +++ b/Makefile @@ -233,6 +233,10 @@ install-common: install-doc install qubes-rpc/qvm-copy-to-vm.gnome $(DESTDIR)$(LIBDIR)/qubes install qubes-rpc/qvm-move-to-vm.kde $(DESTDIR)$(LIBDIR)/qubes install qubes-rpc/qvm-move-to-vm.gnome $(DESTDIR)$(LIBDIR)/qubes + install qubes-rpc/qvm-actions.sh $(DESTDIR)$(LIBDIR)/qubes + install -m 0644 misc/uca_qubes.xml $(DESTDIR)$(LIBDIR)/qubes + mkdir -p $(DESTDIR)/etc/xdg/xfce4/xfconf/xfce-perchannel-xml + install -m 0644 misc/thunar.xml $(DESTDIR)/etc/xdg/xfce4/xfconf/xfce-perchannel-xml install qubes-rpc/xdg-icon $(DESTDIR)$(LIBDIR)/qubes install qubes-rpc/{vm-file-editor,qfile-agent,qopen-in-vm} $(DESTDIR)$(LIBDIR)/qubes install qubes-rpc/qubes-open $(DESTDIR)$(BINDIR) diff --git a/debian/control b/debian/control index 3ec505a..aa58554 100644 --- a/debian/control +++ b/debian/control @@ -97,6 +97,16 @@ Breaks: qubes-core-agent (<< 4.0.0-1) Description: Qubes integration for Nautilus Nautilus addons for inter-VM file copy/move/open. +Package: qubes-core-agent-thunar +Architecture: any +Depends: + thunar, + qubes-core-agent-qrexec, +Replaces: qubes-core-agent (<< 4.0.0-1) +Breaks: qubes-core-agent (<< 4.0.0-1) +Description: Qubes integration for Thunar + Thunar addons for inter-VM file copy/move/open. + Package: qubes-core-agent-dom0-updates Architecture: any Depends: diff --git a/debian/qubes-core-agent-thunar.install b/debian/qubes-core-agent-thunar.install new file mode 100644 index 0000000..388f13b --- /dev/null +++ b/debian/qubes-core-agent-thunar.install @@ -0,0 +1,3 @@ +usr/lib/qubes/qvm-actions.sh +usr/lib/qubes/uca_qubes.xml +etc/xdg/xfce4/xfconf/xfce-perchannel-xml/thunar.xml diff --git a/debian/qubes-core-agent-thunar.postinst b/debian/qubes-core-agent-thunar.postinst new file mode 100755 index 0000000..b4e829d --- /dev/null +++ b/debian/qubes-core-agent-thunar.postinst @@ -0,0 +1,58 @@ +#!/bin/bash +# postinst script for core-agent-linux +# +# see: dh_installdeb(1) + +set -e + +# The postinst script may be called in the following ways: +# * 'configure' +# * 'abort-upgrade' +# * 'abort-remove' 'in-favour' +# +# * 'abort-remove' +# * 'abort-deconfigure' 'in-favour' +# 'removing' +# +# +# For details, see http://www.debian.org/doc/debian-policy/ or +# https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html or +# the debian-policy package + + +case "${1}" in + configure) + # There is no system-wide Thunar custom actions. There is only a default + # file and a user file created from the default one. Qubes actions need + # to be placed after all already defined actions and before + # the end of file. + if [ -f /etc/xdg/Thunar/uca.xml ] ; then + cp -p /etc/xdg/Thunar/uca.xml /etc/xdg/Thunar/uca.xml.bak + #shellcheck disable=SC2016 + sed -i '$e cat /usr/lib/qubes/uca_qubes.xml' /etc/xdg/Thunar/uca.xml + fi + if [ -f /home/user/.config/Thunar/uca.xml ] ; then + cp -p /home/user/.config/Thunar/uca.xml /home/user/.config/Thunar/uca.xml.bak + #shellcheck disable=SC2016 + sed -i '$e cat /usr/lib/qubes/uca_qubes.xml' /home/user/.config/Thunar/uca.xml + fi + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + exit 0 + ;; + + *) + echo "postinst called with unknown argument \`${1}'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + +# vim: set ts=4 sw=4 sts=4 et : diff --git a/debian/qubes-core-agent-thunar.postrm b/debian/qubes-core-agent-thunar.postrm new file mode 100755 index 0000000..afcd82c --- /dev/null +++ b/debian/qubes-core-agent-thunar.postrm @@ -0,0 +1,57 @@ +#!/bin/sh +# postrm script for core-agent-linux +# +# see: dh_installdeb(1) + +set -e + +# The prerm script may be called in the following ways: +# * 'remove' +# * 'purge' +# * 'upgrade' +# * 'disappear' +# +# The postrm script is called after the package's files have been removed +# or replaced. The package whose postrm is being called may have previously been +# deconfigured and only be "Unpacked", at which point subsequent package changes +# do not consider its dependencies. Therefore, all postrm actions may only rely +# on essential packages and must gracefully skip any actions that require the +# package's dependencies if those dependencies are unavailable.[48] +# +# * 'failed-upgrade' +# +# Called when the old postrm upgrade action fails. The new package will be +# unpacked, but only essential packages and pre-dependencies can be relied on. +# Pre-dependencies will either be configured or will be "Unpacked" or +# "Half-Configured" but previously had been configured and was never removed. +# +# * 'abort-install' +# * 'abort-install' +# * 'abort-upgrade' +# +# Called before unpacking the new package as part of the error handling of +# preinst failures. May assume the same state as preinst can assume. +# +# For details, see http://www.debian.org/doc/debian-policy/ or +# https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html or +# the debian-policy package + +if [ "${1}" = "remove" ] ; then + if [ -f /etc/xdg/Thunar/uca.xml ] ; then + mv /etc/xdg/Thunar/uca.xml /etc/xdg/Thunar/uca.xml.uninstall + mv /etc/xdg/Thunar/uca.xml.bak /etc/xdg/Thunar/uca.xml + fi + if [ -f /home/user/.config/Thunar/uca.xml ] ; then + mv /home/user/.config/Thunar/uca.xml /home/user/.config/Thunar/uca.xml.uninstall + mv /home/user/.config/Thunar/uca.xml.bak /home/user/.config/Thunar/uca.xml + fi +fi + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + +# vim: set ts=4 sw=4 sts=4 et : diff --git a/misc/thunar.xml b/misc/thunar.xml new file mode 100644 index 0000000..71bfd6c --- /dev/null +++ b/misc/thunar.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/misc/uca_qubes.xml b/misc/uca_qubes.xml new file mode 100644 index 0000000..2e4ad8d --- /dev/null +++ b/misc/uca_qubes.xml @@ -0,0 +1,72 @@ + + folder-copy + Copy to VM + 1507455450991127-4 + /usr/lib/qubes/qvm-actions.sh copy %F + + * + + + + + + + + + folder-move + Move to VM + 1507455437157027-3 + /usr/lib/qubes/qvm-actions.sh move %F + + * + + + + + + + + + document-open + Open in VM + 1507455471075266-5 + /usr/lib/qubes/qvm-actions.sh openvm %F + + * + + + + + + + + gtk-convert + Convert in DisposableVM + 1507455488971315-6 + /usr/lib/qubes/qvm-actions.sh pdf %F + + *.pdf + + + + gtk-convert + Convert in DisposableVM + 1507455503129941-7 + /usr/lib/qubes/qvm-actions.sh img %F + + * + + + + document-open + Open in DisposableVM + 1507455559234996-8 + /usr/lib/qubes/qvm-actions.sh opendvm %F + + * + + + + + + diff --git a/qubes-rpc/qvm-actions.sh b/qubes-rpc/qvm-actions.sh new file mode 100755 index 0000000..691b3f2 --- /dev/null +++ b/qubes-rpc/qvm-actions.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# Check if at least two arguments are provided: actions + file(s) +if [ "$#" -le 1 ]; then + echo "Not enough arguments provided. Aborting..." +fi + +# Action +action="$1" + +shift + +# copy and move handle a list of files where other actions don't +case "$action" in + copy) + #shellcheck disable=SC2016 + qvm-copy-to-vm '$default' "$@" | zenity --notification --text="Copying files..." --timeout 3 + ;; + move) + #shellcheck disable=SC2016 + qvm-move-to-vm '$default' "$@" | zenity --notification --text="Moving files..." --timeout 3 + ;; + img) + for file in "$@" + do + /usr/lib/qubes/qvm-convert-img.gnome "$file" + done + ;; + pdf) + for file in "$@" + do + /usr/lib/qubes/qvm-convert-pdf.gnome "$file" + done + ;; + openvm) + for file in "$@" + do + #shellcheck disable=SC2016 + qvm-open-in-vm '$default' "$file" | zenity --notification --text "Opening $file in VM..." --timeout 3 & + done + ;; + opendvm) + for file in "$@" + do + qvm-open-in-dvm "$file" | zenity --notification --text "Opening $file in DisposableVM..." --timeout 3 & + done + ;; + *) + echo "Unknown action. Aborting..." + exit 1 + ;; +esac diff --git a/rpm_spec/core-agent.spec b/rpm_spec/core-agent.spec index cea656f..3ec9e73 100644 --- a/rpm_spec/core-agent.spec +++ b/rpm_spec/core-agent.spec @@ -269,6 +269,13 @@ switching from user to root. Since all the user data in a VM is accessible already from normal user account, there is not much more to guard there. Qubes VM is a single user system. +%package thunar +Summary: Thunar support for Qubes VM tools +Requires: Thunar + +%description thunar +Thunar support for Qubes VM tools + %define _builddir %(pwd) %define kde_service_dir /usr/share/kde4/services @@ -464,6 +471,22 @@ sed 's/^net.ipv4.ip_forward.*/#\0/' -i /etc/sysctl.conf %post qrexec %systemd_post qubes-qrexec-agent.service +%post thunar +if [ "$1" = 1 ]; then + # There is no system-wide Thunar custom actions. There is only a default + # file and a user file created from the default one. Qubes actions need + # to be placed after all already defined actions and before + # the end of file. + if [ -f /etc/xdg/Thunar/uca.xml ] ; then + cp -p /etc/xdg/Thunar/uca.xml{,.bak} + sed -i '$e cat /usr/lib/qubes/uca_qubes.xml' /etc/xdg/Thunar/uca.xml + fi + if [ -f /home/user/.config/Thunar/uca.xml ] ; then + cp -p /home/user/.config/Thunar/uca.xml{,.bak} + sed -i '$e cat /usr/lib/qubes/uca_qubes.xml' /home/user/.config/Thunar/uca.xml + fi +fi + %preun if [ "$1" = 0 ] ; then # no more packages left @@ -485,6 +508,18 @@ fi %preun qrexec %systemd_preun qubes-qrexec-agent.service +%postun thunar +if [ "$1" = 0 ]; then + if [ -f /etc/xdg/Thunar/uca.xml ] ; then + mv /etc/xdg/Thunar/uca.xml{,.uninstall} + mv /etc/xdg/Thunar/uca.xml{.bak,} + fi + if [ -f /home/user/.config/Thunar/uca.xml ] ; then + mv /home/user/.config/Thunar/uca.xml{,.uninstall} + mv /home/user/.config/Thunar/uca.xml{.bak,} + fi +fi + %postun if [ $1 -eq 0 ] ; then /usr/bin/glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || : @@ -675,6 +710,11 @@ rm -f %{name}-%{version} /usr/share/nautilus-python/extensions/qvm_move_nautilus.py* /usr/share/nautilus-python/extensions/qvm_dvm_nautilus.py* +%files thunar +/usr/lib/qubes/qvm-actions.sh +/usr/lib/qubes/uca_qubes.xml +/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/thunar.xml + %files dom0-updates %dir %attr(0775,user,user) /var/lib/qubes/dom0-updates /usr/lib/qubes/qubes-download-dom0-updates.sh