Skip to content

Commit 7afeb8a

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 4377f0d commit 7afeb8a

9 files changed

Lines changed: 97 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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ makedepends=(
2626
qubes-libvchan
2727
)
2828
provides=('qubes-vm-qrexec')
29+
conflicts=('qubes-vm-core<4.3.38')
2930
install=archlinux/PKGBUILD.install
3031
_pkgnvr="${pkgname}-${pkgver}-${pkgrel}"
3132
source=("${_pkgnvr}.tar.gz")
@@ -57,4 +58,3 @@ package() {
5758
}
5859

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

debian/control

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@ Depends:
2323
python3-qrexec,
2424
${shlibs:Depends},
2525
${misc:Depends}
26-
Replaces: qubes-core-agent-qrexec (<< 4.1.0-1)
26+
Replaces:
27+
qubes-core-agent-qrexec (<< 4.1.0-1),
28+
qubes-core-agent (<< 4.3.38)
2729
Breaks:
30+
qubes-core-agent (<< 4.3.38),
2831
qubes-core-agent-qrexec (<< 4.1.0-1),
2932
qubes-gui-agent (<< 4.1.6-1),
3033
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ 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
@@ -145,6 +146,7 @@ rm -f %{name}-%{version}
145146
%dir %{_sysconfdir}/qubes-rpc
146147
%{_sysconfdir}/qubes-rpc/policy.Ask
147148
%{_sysconfdir}/qubes-rpc/policy.Notify
149+
%{_sysconfdir}/qubes-rpc/qubes.WaitForSession
148150

149151
%{_sysconfdir}/xdg/autostart/qrexec-policy-agent.desktop
150152

version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4.3.11
1+
4.3.12

0 commit comments

Comments
 (0)