Skip to content

Commit aa06f57

Browse files
committed
Allow GUIVM clients to know if GUIVM has session
Or if GUID of the client can be found on the server. This script will be replicated to qubes-core-agent-linux. For: QubesOS/qubes-notification-proxy#13 For: QubesOS/qubes-gui-agent-linux#251 For: QubesOS/qubes-core-admin#757 For: QubesOS/qubes-issues#1512 For: QubesOS/qubes-issues#9940 Fixes: QubesOS/qubes-issues#10443
1 parent 4c2c78d commit aa06f57

8 files changed

Lines changed: 100 additions & 45 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ install-base: all-base
3636
install -d $(DESTDIR)/etc/qubes-rpc -m 755
3737
ln -sf /var/run/qubes/policy-agent.sock $(DESTDIR)/etc/qubes-rpc/policy.Ask
3838
ln -sf /var/run/qubes/policy-agent.sock $(DESTDIR)/etc/qubes-rpc/policy.Notify
39+
install -t $(DESTDIR)/etc/qubes-rpc -m 755 qubes-rpc-base/*
3940
install -d $(DESTDIR)/etc/xdg/autostart -m 755
4041
install -m 644 policy-agent-extra/qrexec-policy-agent.desktop \
4142
$(DESTDIR)/etc/xdg/autostart/qrexec-policy-agent.desktop

archlinux/PKGBUILD.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ makedepends=(
2626
qubes-libvchan
2727
)
2828
provides=('qubes-vm-qrexec')
29+
conflicts=('qubes-vm-core<4.3.37')
30+
depends=('qubes-vm-core>=4.3.38')
2931
install=archlinux/PKGBUILD.install
3032
_pkgnvr="${pkgname}-${pkgver}-${pkgrel}"
3133
source=("${_pkgnvr}.tar.gz")
@@ -57,4 +59,3 @@ package() {
5759
}
5860

5961
# vim:set ts=2 sw=2 et:
60-

debian/control

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,12 @@ Depends:
2323
python3-qrexec,
2424
${shlibs:Depends},
2525
${misc:Depends}
26-
Replaces: qubes-core-agent-qrexec (<< 4.1.0-1)
26+
qubes-core-agent (>= 4.3.38)
27+
Replaces:
28+
qubes-core-agent-qrexec (<< 4.1.0-1),
29+
qubes-core-agent (<< 4.3.38)
2730
Breaks:
31+
qubes-core-agent (<< 4.3.38),
2832
qubes-core-agent-qrexec (<< 4.1.0-1),
2933
qubes-gui-agent (<< 4.1.6-1),
3034
qubes-gpg-split (<< 2.0.45-1),

debian/qubes-core-qrexec.install

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ etc/pam.d/qrexec
22
etc/qubes/rpc-config/README
33
etc/qubes-rpc/policy.Ask
44
etc/qubes-rpc/policy.Notify
5+
etc/qubes-rpc/qubes.WaitForSession
56
etc/xdg/autostart/qrexec-policy-agent.desktop
67
lib/systemd/system/qubes-qrexec-agent.service
78
usr/bin/qrexec-client-vm
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#!/bin/sh
2+
#
3+
# If no argument is provided, wait for the session to start.
4+
# If QREXEC_SERVICE_ARGUMENT=guid, wait for QREXEC_REMOTE_DOMAIN's GUID.
5+
6+
set -eu
7+
8+
# Waits for qubes-guid to become available for a given domain.
9+
wait_client_guid(){
10+
qube="${1-}"
11+
if test -z "$qube"; then
12+
echo "QREXEC_REMOTE_DOMAIN variable needs to be set" >&2
13+
exit 1
14+
fi
15+
16+
prefix="/var/run/qubes"
17+
if test "$in_dom0" = "true"; then
18+
qrexec_name_sock="$prefix/qrexec.$qube"
19+
if ! test -L "$qrexec_name_sock"; then
20+
echo "$0: $qrexec_name_sock not found, domain might be dead" >&2
21+
exit 1
22+
fi
23+
qrexec_id_sock="$(readlink -e "$qrexec_name_sock")"
24+
if test -z "$qrexec_id_sock"; then
25+
echo "$0: readlink failed for $qrexec_name_sock" >&2
26+
exit 1
27+
fi
28+
xid="${qrexec_id_sock##*/qrexec.}"
29+
guid_running="${qrexec_id_sock%/*}/guid-running.$xid"
30+
else
31+
xid="$(qvm-prefs -- "$qube" xid)"
32+
guid_running="$(readlink -e "$prefix/guid-running.$xid")"
33+
fi
34+
35+
while true; do
36+
if test -f "$guid_running"; then
37+
break
38+
fi
39+
40+
if test "$in_dom0" = "true" && ! test -e "$qrexec_id_sock"; then
41+
echo "$0: $qrexec_id_sock not found, domain might be dead" >&2
42+
exit 1
43+
fi
44+
45+
sleep 0.5
46+
done
47+
exit 0
48+
}
49+
50+
# Wait for our session to complete.
51+
wait_self_session(){
52+
if ! test "$in_dom0" = "true" &&
53+
test "$(qubesdb-read --default=True /qubes-gui-enabled)" = "True"
54+
then
55+
user="$(qubesdb-read /default-user || echo 'user')"
56+
while ! test -e "/var/run/qubes/qrexec-server.$user.sock"; do
57+
sleep 0.1
58+
done
59+
fi
60+
61+
true "${XDG_RUNTIME_DIR:="/run/user/$(id -u)"}"
62+
true "${DBUS_SESSION_BUS_ADDRESS:="unix:path=${XDG_RUNTIME_DIR}/bus"}"
63+
export DBUS_SESSION_BUS_ADDRESS
64+
systemctl --user --wait --quiet is-system-running
65+
exit 0
66+
}
67+
68+
main(){
69+
arg="${QREXEC_SERVICE_ARGUMENT-}"
70+
client="${QREXEC_REMOTE_DOMAIN-}"
71+
in_dom0=""
72+
if command -v qrexec-client >/dev/null; then
73+
in_dom0="true"
74+
fi
75+
case "${arg}" in
76+
guid)
77+
wait_client_guid "$client"
78+
;;
79+
"")
80+
wait_self_session
81+
;;
82+
*)
83+
echo "Invalid argument, only allowed value is 'guid'" >&2
84+
esac
85+
}
86+
87+
main

qubes-rpc-dom0/qubes.WaitForSession

Lines changed: 0 additions & 41 deletions
This file was deleted.

rpm_spec/qubes-qrexec-dom0.spec.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ rm -f %{name}-%{version}
111111
%dir %{_sysconfdir}/qubes-rpc/policy/include
112112

113113
%{_sysconfdir}/qubes-rpc/policy.RegisterArgument
114-
%{_sysconfdir}/qubes-rpc/qubes.WaitForSession
115114
%{_sysconfdir}/qubes-rpc/policy.List
116115
%{_sysconfdir}/qubes-rpc/policy.Get
117116
%{_sysconfdir}/qubes-rpc/policy.GetFiles

rpm_spec/qubes-qrexec.spec.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,14 @@ Requires: python%{python3_pkgversion}-pyinotify
5858
Requires: python%{python3_pkgversion}-inotify
5959
%endif
6060
Conflicts: qubes-utils-libs < 4.1.0
61+
Conflicts: qubes-core-agent < 4.3.38
6162
Conflicts: qubes-core-agent-qrexec < 4.1.0
6263
# UUID in SystemInfo response from qubesd
6364
Conflicts: qubes-core-dom0 < 4.3.9
6465
Conflicts: qubes-core-dom0-linux < 4.1.5
65-
Conflicts: qubes-gui-agent < 4.1.6
66+
Conflicts: qubes-core-qrexec-dom0 < 4.3.12
6667
Conflicts: qubes-gpg-split < 2.0.45
68+
Conflicts: qubes-gui-agent < 4.1.6
6769
Conflicts: qubes-gui-daemon < 4.1.4
6870
Conflicts: qubes-input-proxy < 1.0.17
6971
Conflicts: qubes-pdf-converter < 2.1.7
@@ -145,6 +147,7 @@ rm -f %{name}-%{version}
145147
%dir %{_sysconfdir}/qubes-rpc
146148
%{_sysconfdir}/qubes-rpc/policy.Ask
147149
%{_sysconfdir}/qubes-rpc/policy.Notify
150+
%{_sysconfdir}/qubes-rpc/qubes.WaitForSession
148151

149152
%{_sysconfdir}/xdg/autostart/qrexec-policy-agent.desktop
150153

0 commit comments

Comments
 (0)