Greetings.
TeleGuard desktop app is based on flutter and open-source packages from https://pub.dev/
For our snap (official page if need is https://teleguard.com/
) I’d like to request alias teleguard-desktop
and auto-connection for interfaces described below.
snapcraft.yaml
name: teleguard-desktop
version: 3.0.5
summary: TeleGuard
description: TeleGuard instant messenger
icon: snap/gui/teleguard-desktop.png
confinement: strict
compression: lzo
base: core20
grade: devel
slots:
dbus-teleguard-desktop:
interface: dbus
bus: session
name: ch.swisscows.messenger.teleguardapp.desktop
apps:
teleguard-desktop:
command: bin/teleguard_desktop
extensions: [gnome-3-38]
plugs:
- audio-playback
- audio-record
- camera
- desktop
- desktop-legacy
- gsettings
- home
- network
- network-manager # inet observer required
- network-status
- opengl
- removable-media
- x11
slots:
- dbus-teleguard-desktop
environment: &_environment
LD_LIBRARY_PATH: $LD_LIBRARY_PATH:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pulseaudio:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/blas:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/lapack:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/blas:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/samba
GTK_PATH: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/gtk-3.0
parts:
flutter-git:
source: https://github.com/flutter/flutter.git
source-tag: 3.10.6
plugin: nil
override-build: |
set -eux
mkdir -p $SNAPCRAFT_PART_INSTALL/usr/bin
mkdir -p $SNAPCRAFT_PART_INSTALL/usr/libexec
cp -r $SNAPCRAFT_PART_SRC $SNAPCRAFT_PART_INSTALL/usr/libexec/flutter
ln -sf $SNAPCRAFT_PART_INSTALL/usr/libexec/flutter/bin/flutter $SNAPCRAFT_PART_INSTALL/usr/bin/flutter
export PATH="$SNAPCRAFT_PART_INSTALL/usr/bin:$PATH"
flutter doctor
build-packages:
- clang
- cmake
- curl
- ninja-build
- unzip
- pkg-config
- libgtk-3-dev
- liblzma-dev
override-prime: ''
teleguard-desktop:
after: [ flutter-git ]
source: .
override-pull: |
set -eux
rm -rf $SNAPCRAFT_PROJECT_DIR/build
snapcraftctl pull
plugin: nil
build-packages:
- libgstreamer1.0-dev
- libgstreamer-plugins-base1.0-dev
- libnotify-dev
- libmpv-dev
- libappindicator3-dev
- gir1.2-keybinder-3.0
- libkeybinder-3.0-0
- libkeybinder-3.0-dev
- libpulse-dev
- jq
stage-packages:
- libkeybinder-3.0-0
- libappindicator3-1
- libsqlite3-dev
- libmpv1
- mpv
- gstreamer1.0-plugins-good
- gstreamer1.0-plugins-bad
- libnotify4
- zenity
override-build: |
set -eux
# add dart binary to path /root/parts/flutter-git/install/usr/libexec/flutter/bin
flutter doctor
flutter pub get || true
flutter build linux --release -v -t lib/main.dart
snapcraftctl set-version "$(jq -r '.version' build/flutter_assets/version.json)"
mkdir -p $SNAPCRAFT_PART_INSTALL/bin
cp -r build/linux/*/release/bundle/* $SNAPCRAFT_PART_INSTALL/bin/
layout:
/etc/openal/alsoft.conf:
bind-file: $SNAP_DATA/etc/openal/alsoft.conf
/usr/share/zenity:
bind: $SNAP/usr/share/zenity
/usr/share/X11:
bind: $SNAP/usr/share/X11
I’ve upload a snap (see dashboard) and received
human review required due to 'deny-connection' constraint (interface attributes) declaration-snap-v2_slots_connection (dbus-teleguard-desktop, dbus)
So… Allow our app to use dbus please
Additionally TeleGuard needs next interfaces connection:
-
network-manager
to monitor connection status. Messenger need to know when connection lost and restored to reconnect with server. We’re using packageconnectivity_plus
(from pub.dev) for this task and it requiresnetwork-manager
. Otherwise package throws next exception
org.freedesktop.DBus.Error.AccessDenied to interface="org.freedesktop.DBus.ObjectManager"
Unhandled Exception: org.freedesktop.DBus.Error.AccessDenied: An AppArmor policy prevents this sender from sending this message to this recipient; type="method_call", sender=":1.173" (uid=1000 pid=36281 comm="/snap/teleguard-desktop/x1/bin/teleguard_desktop " label="snap.teleguard-desktop.teleguard-desktop (enforce)") interface="org.freedesktop.DBus.ObjectManager" member="GetManagedObjects" error name="(unset)" requested_reply="0" destination="org.freedesktop.NetworkManager" (uid=0 pid=1162 comm="/usr/sbin/NetworkManager --no-daemon " label="unconfined")
#0 DBusClient._callMethod (package:dbus/src/dbus_client.dart:1124)
<asynchronous suspension>
#1 DBusClient.callMethod (package:dbus/src/dbus_client.dart:608)
<asynchronous suspension>
#2 DBusRemoteObjectManager.getManagedObjects (package:dbus/src/dbus_remote_object_manager.dart:80)
<asynchronous suspension>
#3 NetworkManagerClient.connect (package:nm/src/network_manager_client.dart:2351)
<asynchronous suspension>
#4 ConnectivityPlusLinuxPlugin._startListenConnectivity (package:connectivity_plus/src/connectivity_plus_linux.dart:64)
<asynchronous suspension>
Unhandled Exception: org.freedesktop.DBus.Error.AccessDenied: An AppArmor policy prevents this sender from sending this message to this recipient; type="method_call", sender=":1.173" (uid=1000 pid=36281 comm="/snap/teleguard-desktop/x1/bin/teleguard_desktop " label="snap.teleguard-desktop.teleguard-desktop (enforce)") interface="org.freedesktop.DBus.ObjectManager" member="GetManagedObjects" error name="(unset)" requested_reply="0" destination="org.freedesktop.NetworkManager" (uid=0 pid=1162 comm="/usr/sbin/NetworkManager --no-daemon " label="unconfined")
#0 DBusClient._callMethod (package:dbus/src/dbus_client.dart:1124)
<asynchronous suspension>
#1 DBusClient.callMethod (package:dbus/src/dbus_client.dart:608)
<asynchronous suspension>
#2 DBusRemoteObjectManager.getManagedObjects (package:dbus/src/dbus_remote_object_manager.dart:80)
<asynchronous suspension>
#3 NetworkManagerClient.connect (package:nm/src/network_manager_client.dart:2351)
<asynchronous suspension>
#4 ConnectivityPlusLinuxPlugin._startListenConnectivity (package:connectivity_plus/src/connectivity_plus_linux.dart:64)
<asynchronous suspension>
-
audio-record
for voice calls and (perspectively) sending voice messages. TeleGuard are using libwebrtc through flutter_webrtc (from pub-dev) plugin. If we have noaudio-record
connected, any microphone manipulation deadly freezes whole app with no exception thrown. -
Optional:
camera
for video calls. Unlike the previous requirement does not break app if absent. Just casts black screen. Therefore request forcamera
is optional.