diff -Nru snapd-2.31.1+17.10/cmd/Makefile.am snapd-2.31.2+17.10/cmd/Makefile.am --- snapd-2.31.1+17.10/cmd/Makefile.am 2018-01-31 08:47:06.000000000 +0000 +++ snapd-2.31.2+17.10/cmd/Makefile.am 2018-03-09 10:11:31.000000000 +0000 @@ -15,7 +15,7 @@ CHECK_CFLAGS += -Werror endif -subdirs = snap-confine snap-discard-ns system-shutdown libsnap-confine-private +subdirs = snap-confine snap-discard-ns system-shutdown libsnap-confine-private snapd-generator # Run check-syntax when checking # TODO: conver those to autotools-style tests later @@ -443,3 +443,12 @@ system_shutdown_unit_tests_CFLAGS = $(GLIB_CFLAGS) system_shutdown_unit_tests_LDADD += $(GLIB_LIBS) endif + +## +## snapd-generator +## + +libexec_PROGRAMS += snapd-generator/snapd-generator + +snapd_generator_snapd_generator_SOURCES = snapd-generator/main.c +snapd_generator_snapd_generator_LDADD = libsnap-confine-private.a diff -Nru snapd-2.31.1+17.10/cmd/snap-confine/spread-tests/regression/lp-1599608/task.yaml snapd-2.31.2+17.10/cmd/snap-confine/spread-tests/regression/lp-1599608/task.yaml --- snapd-2.31.1+17.10/cmd/snap-confine/spread-tests/regression/lp-1599608/task.yaml 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/cmd/snap-confine/spread-tests/regression/lp-1599608/task.yaml 2018-03-09 10:11:31.000000000 +0000 @@ -17,7 +17,7 @@ cd / echo "Install hello-world" snap install hello-world - systemctl stop snapd.refresh.timer snapd.service snapd.socket + systemctl stop snapd.service snapd.socket # all of this ls madness can go away when we have remote environment # variables echo "Unmount original core snap" @@ -31,7 +31,7 @@ if [ ! -e $(ls -1 /var/lib/snapd/snaps/ubuntu-core_*.snap | tail -1) ]; then exit 1; fi echo "Mount modified core snap" mount $(ls -1 /var/lib/snapd/snaps/ubuntu-core_*.snap | tail -1) $(ls -1d /snap/ubuntu-core/* | grep -v current | tail -1) - systemctl start snapd.refresh.timer snapd.service snapd.socket + systemctl start snapd.service snapd.socket execute: | exit 0 cd / @@ -51,7 +51,7 @@ exit 0 echo "Remove hello-world" snap remove hello-world - systemctl stop snapd.refresh.timer snapd.service snapd.socket + systemctl stop snapd.service snapd.socket echo "Unmount the modified core snap" # all of this ls madness can go away when we have remote environment # variables @@ -66,4 +66,4 @@ udevadm settle udevadm trigger udevadm settle - systemctl start snapd.refresh.timer snapd.service snapd.socket + systemctl start snapd.service snapd.socket diff -Nru snapd-2.31.1+17.10/cmd/snapctl/main.go snapd-2.31.2+17.10/cmd/snapctl/main.go --- snapd-2.31.1+17.10/cmd/snapctl/main.go 2017-12-01 15:51:55.000000000 +0000 +++ snapd-2.31.2+17.10/cmd/snapctl/main.go 2018-03-08 12:45:30.000000000 +0000 @@ -25,6 +25,7 @@ "github.com/snapcore/snapd/client" "github.com/snapcore/snapd/dirs" + "github.com/snapcore/snapd/xdgopenproxy" ) var clientConfig = client.Config{ @@ -46,6 +47,13 @@ os.Exit(1) } } + if len(os.Args) == 3 && os.Args[1] == "user-open" { + if err := xdgopenproxy.Run(os.Args[2]); err != nil { + fmt.Fprintf(os.Stderr, "user-open error: %v\n", err) + os.Exit(1) + } + os.Exit(0) + } // no internal command, route via snapd stdout, stderr, err := run() Binary files /tmp/tmp91FF4s/aFTR6688gN/snapd-2.31.1+17.10/cmd/snapd/snapd and /tmp/tmp91FF4s/RbjkpfsFkw/snapd-2.31.2+17.10/cmd/snapd/snapd differ diff -Nru snapd-2.31.1+17.10/cmd/snapd-generator/main.c snapd-2.31.2+17.10/cmd/snapd-generator/main.c --- snapd-2.31.1+17.10/cmd/snapd-generator/main.c 1970-01-01 00:00:00.000000000 +0000 +++ snapd-2.31.2+17.10/cmd/snapd-generator/main.c 2018-03-09 10:07:07.000000000 +0000 @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2018 Canonical Ltd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * 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 . + * + */ + +#include +#include +#include + +#include "config.h" + +#include "../libsnap-confine-private/cleanup-funcs.h" +#include "../libsnap-confine-private/mountinfo.h" +#include "../libsnap-confine-private/string-utils.h" + +static struct sc_mountinfo_entry *find_root_mountinfo(struct sc_mountinfo + *mounts) +{ + struct sc_mountinfo_entry *cur, *root = NULL; + for (cur = sc_first_mountinfo_entry(mounts); cur != NULL; + cur = sc_next_mountinfo_entry(cur)) { + // Look for the mount info entry for the root file-system. + if (sc_streq("/", cur->mount_dir)) { + root = cur; + } + } + return root; +} + +int main(int argc, char **argv) +{ + if (argc != 4) { + printf("usage: snapd-workaround-generator " + "normal-dir early-dir late-dir\n"); + return 1; + } + const char *normal_dir = argv[1]; + // For reference, but we don't use those variables here. + // const char *early_dir = argv[2]; + // const char *late_dir = argv[3]; + + // Load /proc/self/mountinfo so that we can inspect the root filesystem. + struct sc_mountinfo *mounts SC_CLEANUP(sc_cleanup_mountinfo) = NULL; + mounts = sc_parse_mountinfo(NULL); + if (!mounts) { + fprintf(stderr, "cannot open or parse /proc/self/mountinfo\n"); + return 1; + } + + struct sc_mountinfo_entry *root = find_root_mountinfo(mounts); + if (!root) { + fprintf(stderr, + "cannot find mountinfo entry of the root filesystem\n"); + return 1; + } + // Check if the root file-system is mounted with shared option. + if (strstr(root->optional_fields, "shared:") != NULL) { + // The workaround is not needed, everything is good as-is. + return 0; + } + // Construct the file name for a new systemd mount unit. + char fname[PATH_MAX + 1] = { 0 }; + sc_must_snprintf(fname, sizeof fname, + "%s/" SNAP_MOUNT_DIR ".mount", normal_dir); + + // Open the mount unit and write the contents. + FILE *f SC_CLEANUP(sc_cleanup_file) = NULL; + f = fopen(fname, "wt"); + if (!f) { + fprintf(stderr, "cannot open %s: %m\n", fname); + return 1; + } + fprintf(f, + "# Ensure that snap mount directory is mounted \"shared\" " + "so snaps can be refreshed correctly (LP: #1668759).\n"); + fprintf(f, "[Unit]\n"); + fprintf(f, + "Description=Ensure that the snap directory " + "shares mount events.\n"); + fprintf(f, "[Mount]\n"); + fprintf(f, "What=" SNAP_MOUNT_DIR "\n"); + fprintf(f, "Where=" SNAP_MOUNT_DIR "\n"); + fprintf(f, "Type=none\n"); + fprintf(f, "Options=bind,shared\n"); + fprintf(f, "[Install]\n"); + fprintf(f, "WantedBy=local-fs.target\n"); + return 0; +} diff -Nru snapd-2.31.1+17.10/data/systemd/Makefile snapd-2.31.2+17.10/data/systemd/Makefile --- snapd-2.31.1+17.10/data/systemd/Makefile 2018-01-31 08:47:06.000000000 +0000 +++ snapd-2.31.2+17.10/data/systemd/Makefile 2018-03-09 10:07:07.000000000 +0000 @@ -22,19 +22,11 @@ SYSTEMD_UNITS_GENERATED := $(wildcard *.in) SYSTEMD_UNITS = $(SYSTEMD_UNITS_GENERATED:.in=) $(wildcard *.timer) $(wildcard *.socket) -# The special mount unit for "/snap" must be named after the path and the path -# is a variable. Compute it in make for simplicity. This is equivalent to -# calling systemd-escape --path $(SNAP_MOUNT_DIR) -snap_mount_unit=$(subst /,-,$(patsubst %/,%,$(patsubst /%,%,$(SNAP_MOUNT_DIR)))).mount - -# Yes, we want the extra unit too, thank you -SYSTEMD_UNITS += $(snap_mount_unit) - .PHONY: all all: $(SYSTEMD_UNITS) .PHONY: install -install: $(filter-out snap.mount,$(SYSTEMD_UNITS)) $(snap_mount_unit) +install: $(SYSTEMD_UNITS) # NOTE: old (e.g. 14.04) GNU coreutils doesn't -D with -t install -d -m 0755 $(DESTDIR)/$(SYSTEMDSYSTEMUNITDIR) install -m 0644 -t $(DESTDIR)/$(SYSTEMDSYSTEMUNITDIR) $^ @@ -43,7 +35,7 @@ .PHONY: clean clean: - rm -f $(SYSTEMD_UNITS_GENERATED:.in=) $(snap_mount_unit) + rm -f $(SYSTEMD_UNITS_GENERATED:.in=) %: %.in cat $< | \ @@ -52,10 +44,3 @@ sed s:@bindir@:$(BINDIR):g | \ sed s:@SNAP_MOUNT_DIR@:$(SNAP_MOUNT_DIR):g | \ cat > $@ - -# If SNAP_MOUNT_DIR uses non-default location then rename snap.mount -# so that the directory name is encoded in the file name. -ifneq ($(snap_mount_unit),snap.mount) -$(snap_mount_unit): snap.mount - cp $< $@ -endif diff -Nru snapd-2.31.1+17.10/data/systemd/snapd.refresh.service.in snapd-2.31.2+17.10/data/systemd/snapd.refresh.service.in --- snapd-2.31.1+17.10/data/systemd/snapd.refresh.service.in 2017-12-01 15:51:55.000000000 +0000 +++ snapd-2.31.2+17.10/data/systemd/snapd.refresh.service.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -[Unit] -Description=Automatically refresh installed snaps -After=network-online.target snapd.socket -Requires=snapd.socket -ConditionPathExistsGlob=@SNAP_MOUNT_DIR@/*/current -Documentation=man:snap(1) - -[Service] -Type=oneshot -ExecStart=/bin/sh -c 'if ! @bindir@/snap refresh --time|grep "schedule:.*managed"; then @bindir@/snap refresh; fi' -Environment=SNAP_REFRESH_FROM_EMERGENCY_TIMER=1 diff -Nru snapd-2.31.1+17.10/data/systemd/snapd.refresh.timer snapd-2.31.2+17.10/data/systemd/snapd.refresh.timer --- snapd-2.31.1+17.10/data/systemd/snapd.refresh.timer 2017-08-08 06:31:43.000000000 +0000 +++ snapd-2.31.2+17.10/data/systemd/snapd.refresh.timer 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -[Unit] -Description=Timer to automatically refresh installed snaps - -[Timer] -# do a weekly refresh using the time to ensure that we can still -# fix any potential errors in the internal timer handling -OnCalendar=weekly -RandomizedDelaySec=6h -AccuracySec=10min -Persistent=true -OnStartupSec=15m - -[Install] -WantedBy=timers.target diff -Nru snapd-2.31.1+17.10/data/systemd/snap.mount.in snapd-2.31.2+17.10/data/systemd/snap.mount.in --- snapd-2.31.1+17.10/data/systemd/snap.mount.in 2018-01-31 08:47:06.000000000 +0000 +++ snapd-2.31.2+17.10/data/systemd/snap.mount.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -# Ensure $(SNAP_MOUNT_DIR) is mounted "shared" so lxd works correctly (LP: #1668759). -[Unit] -Description=Ensure that the snap directory shares mount events. -ConditionVirtualization=container - -[Mount] -What=@SNAP_MOUNT_DIR@ -Where=@SNAP_MOUNT_DIR@ -Type=none -Options=bind,shared - -[Install] -WantedBy=local-fs.target diff -Nru snapd-2.31.1+17.10/debian/changelog snapd-2.31.2+17.10/debian/changelog --- snapd-2.31.1+17.10/debian/changelog 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/debian/changelog 2018-03-09 10:11:31.000000000 +0000 @@ -1,4 +1,25 @@ -snapd (2.31.1+17.10) artful; urgency=medium +snapd (2.31.2+17.10) artful; urgency=medium + + * New upstream release, LP: #1745217 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x + + -- Michael Vogt Fri, 09 Mar 2018 11:11:31 +0100 + +snapd (2.31.1) xenial; urgency=medium * New upstream release, LP: #1745217 - tests: multiple autopkgtest related fixes for 18.04 diff -Nru snapd-2.31.1+17.10/debian/snapd.install snapd-2.31.2+17.10/debian/snapd.install --- snapd-2.31.1+17.10/debian/snapd.install 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/debian/snapd.install 2018-03-09 10:11:31.000000000 +0000 @@ -6,6 +6,7 @@ usr/bin/snap-update-ns /usr/lib/snapd/ usr/bin/snapd /usr/lib/snapd/ usr/bin/snap-seccomp /usr/lib/snapd/ +usr/lib/snapd/snapd-generator /lib/systemd/system-generators/ # bash completion data/completion/snap /usr/share/bash-completion/completions diff -Nru snapd-2.31.1+17.10/interfaces/builtin/desktop.go snapd-2.31.2+17.10/interfaces/builtin/desktop.go --- snapd-2.31.1+17.10/interfaces/builtin/desktop.go 2018-01-31 08:47:17.000000000 +0000 +++ snapd-2.31.2+17.10/interfaces/builtin/desktop.go 2018-03-09 10:11:31.000000000 +0000 @@ -139,7 +139,7 @@ bus=session path=/io/snapcraft/Launcher interface=io.snapcraft.Launcher - member=OpenURL + member={OpenURL,OpenFile} peer=(label=unconfined), # Allow checking status, activating and locking the screensaver diff -Nru snapd-2.31.1+17.10/interfaces/builtin/modem_manager.go snapd-2.31.2+17.10/interfaces/builtin/modem_manager.go --- snapd-2.31.1+17.10/interfaces/builtin/modem_manager.go 2018-01-31 08:47:06.000000000 +0000 +++ snapd-2.31.2+17.10/interfaces/builtin/modem_manager.go 2018-03-05 13:06:18.000000000 +0000 @@ -117,6 +117,20 @@ path=/org/freedesktop/ModemManager1{,/**} interface=org.freedesktop.DBus.* peer=(label=unconfined), + +# Allow accessing logind services to properly shutdown devices on suspend +dbus (receive) + bus=system + path=/org/freedesktop/login1 + interface=org.freedesktop.login1.Manager + member={PrepareForSleep,SessionNew,SessionRemoved} + peer=(label=unconfined), +dbus (send) + bus=system + path=/org/freedesktop/login1 + interface=org.freedesktop.login1.Manager + member=Inhibit + peer=(label=unconfined), ` const modemManagerConnectedSlotAppArmor = ` diff -Nru snapd-2.31.1+17.10/interfaces/builtin/network_status.go snapd-2.31.2+17.10/interfaces/builtin/network_status.go --- snapd-2.31.1+17.10/interfaces/builtin/network_status.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/interfaces/builtin/network_status.go 2018-03-05 13:06:18.000000000 +0000 @@ -81,7 +81,7 @@ # Allow all access to NetworkingStatus service dbus (send) bus=system - interface=com.ubuntu.connectivity1.NetworkingStatus{,/**} + interface=com.ubuntu.connectivity1.NetworkingStatus{,*} path=/com/ubuntu/connectivity1/NetworkingStatus peer=(label=###SLOT_SECURITY_TAGS###), diff -Nru snapd-2.31.1+17.10/interfaces/builtin/network_status_test.go snapd-2.31.2+17.10/interfaces/builtin/network_status_test.go --- snapd-2.31.1+17.10/interfaces/builtin/network_status_test.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/interfaces/builtin/network_status_test.go 2018-03-05 13:06:18.000000000 +0000 @@ -76,7 +76,7 @@ c.Assert(spec.AddConnectedPlug(s.iface, s.plug, s.slot), IsNil) c.Assert(spec.SecurityTags(), DeepEquals, []string{"snap.consumer.app"}) c.Assert(spec.SnippetForTag("snap.consumer.app"), testutil.Contains, `peer=(label="snap.provider.app"`) - c.Assert(spec.SnippetForTag("snap.consumer.app"), testutil.Contains, "interface=com.ubuntu.connectivity1.NetworkingStatus{,/**}") + c.Assert(spec.SnippetForTag("snap.consumer.app"), testutil.Contains, "interface=com.ubuntu.connectivity1.NetworkingStatus{,*}") } func (s *NetworkStatusSuite) TestAppArmorConnectedSlot(c *C) { diff -Nru snapd-2.31.1+17.10/interfaces/builtin/screen_inhibit_control.go snapd-2.31.2+17.10/interfaces/builtin/screen_inhibit_control.go --- snapd-2.31.1+17.10/interfaces/builtin/screen_inhibit_control.go 2018-01-31 08:46:54.000000000 +0000 +++ snapd-2.31.2+17.10/interfaces/builtin/screen_inhibit_control.go 2018-03-05 13:06:18.000000000 +0000 @@ -67,7 +67,7 @@ # API rule dbus (send) bus=session - path=/{,org/freedesktop/,org.gnome/}ScreenSaver + path=/{,org/freedesktop/,org/gnome/}ScreenSaver interface=org.freedesktop.ScreenSaver member={Inhibit,UnInhibit,SimulateUserActivity} peer=(label=unconfined), diff -Nru snapd-2.31.1+17.10/interfaces/builtin/unity7.go snapd-2.31.2+17.10/interfaces/builtin/unity7.go --- snapd-2.31.1+17.10/interfaces/builtin/unity7.go 2018-02-02 16:53:04.000000000 +0000 +++ snapd-2.31.2+17.10/interfaces/builtin/unity7.go 2018-03-05 13:06:21.000000000 +0000 @@ -112,7 +112,7 @@ bus=session path=/io/snapcraft/Launcher interface=io.snapcraft.Launcher - member=OpenURL + member={OpenURL,OpenFile} peer=(label=unconfined), # Allow use of snapd's internal 'xdg-settings' diff -Nru snapd-2.31.1+17.10/osutil/sys/syscall.go snapd-2.31.2+17.10/osutil/sys/syscall.go --- snapd-2.31.1+17.10/osutil/sys/syscall.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/osutil/sys/syscall.go 2018-03-05 13:06:21.000000000 +0000 @@ -95,3 +95,15 @@ } return errno } + +// As of Go 1.9, the O_PATH constant does not seem to be declared +// uniformly over all archtiectures. +const O_PATH = 0x200000 + +func FcntlGetFl(fd int) (int, error) { + flags, _, errno := syscall.Syscall(syscall.SYS_FCNTL, uintptr(fd), uintptr(syscall.F_GETFL), 0) + if errno != 0 { + return 0, errno + } + return int(flags), nil +} diff -Nru snapd-2.31.1+17.10/overlord/configstate/configcore/services.go snapd-2.31.2+17.10/overlord/configstate/configcore/services.go --- snapd-2.31.1+17.10/overlord/configstate/configcore/services.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/overlord/configstate/configcore/services.go 2018-03-05 13:06:18.000000000 +0000 @@ -35,9 +35,8 @@ // swtichDisableService switches a service in/out of disabled state // where "true" means disabled and "false" means enabled. -func switchDisableService(service, value string) error { +func switchDisableService(serviceName, value string) error { sysd := systemd.New(dirs.GlobalRootDir, &sysdLogger{}) - serviceName := fmt.Sprintf("%s.service", service) switch value { case "true": @@ -62,16 +61,18 @@ } // services that can be disabled -var services = []string{"ssh", "rsyslog"} - func handleServiceDisableConfiguration(tr Conf) error { + var services = []struct{ configName, systemdName string }{ + {"ssh", "sshd.service"}, + {"rsyslog", "rsyslog.service"}, + } for _, service := range services { - output, err := coreCfg(tr, fmt.Sprintf("service.%s.disable", service)) + output, err := coreCfg(tr, fmt.Sprintf("service.%s.disable", service.configName)) if err != nil { return err } if output != "" { - if err := switchDisableService(service, output); err != nil { + if err := switchDisableService(service.systemdName, output); err != nil { return err } } diff -Nru snapd-2.31.1+17.10/overlord/configstate/configcore/services_test.go snapd-2.31.2+17.10/overlord/configstate/configcore/services_test.go --- snapd-2.31.1+17.10/overlord/configstate/configcore/services_test.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/overlord/configstate/configcore/services_test.go 2018-03-09 10:11:31.000000000 +0000 @@ -54,28 +54,28 @@ } func (s *servicesSuite) TestConfigureServiceInvalidValue(c *C) { - err := configcore.SwitchDisableService("ssh", "xxx") + err := configcore.SwitchDisableService("ssh.service", "xxx") c.Check(err, ErrorMatches, `option "ssh.service" has invalid value "xxx"`) } func (s *servicesSuite) TestConfigureServiceNotDisabled(c *C) { - err := configcore.SwitchDisableService("ssh", "false") + err := configcore.SwitchDisableService("sshd.service", "false") c.Assert(err, IsNil) c.Check(s.systemctlArgs, DeepEquals, [][]string{ - {"--root", dirs.GlobalRootDir, "unmask", "ssh.service"}, - {"--root", dirs.GlobalRootDir, "enable", "ssh.service"}, - {"start", "ssh.service"}, + {"--root", dirs.GlobalRootDir, "unmask", "sshd.service"}, + {"--root", dirs.GlobalRootDir, "enable", "sshd.service"}, + {"start", "sshd.service"}, }) } func (s *servicesSuite) TestConfigureServiceDisabled(c *C) { - err := configcore.SwitchDisableService("ssh", "true") + err := configcore.SwitchDisableService("sshd.service", "true") c.Assert(err, IsNil) c.Check(s.systemctlArgs, DeepEquals, [][]string{ - {"--root", dirs.GlobalRootDir, "disable", "ssh.service"}, - {"--root", dirs.GlobalRootDir, "mask", "ssh.service"}, - {"stop", "ssh.service"}, - {"show", "--property=ActiveState", "ssh.service"}, + {"--root", dirs.GlobalRootDir, "disable", "sshd.service"}, + {"--root", dirs.GlobalRootDir, "mask", "sshd.service"}, + {"stop", "sshd.service"}, + {"show", "--property=ActiveState", "sshd.service"}, }) } @@ -83,16 +83,22 @@ restore := release.MockOnClassic(false) defer restore() - for _, srvName := range []string{"ssh", "rsyslog"} { + for _, service := range []struct { + cfgName string + systemdName string + }{ + {"ssh", "sshd.service"}, + {"rsyslog", "rsyslog.service"}, + } { s.systemctlArgs = nil err := configcore.Run(&mockConf{ conf: map[string]interface{}{ - fmt.Sprintf("service.%s.disable", srvName): true, + fmt.Sprintf("service.%s.disable", service.cfgName): true, }, }) c.Assert(err, IsNil) - srv := fmt.Sprintf("%s.service", srvName) + srv := service.systemdName c.Check(s.systemctlArgs, DeepEquals, [][]string{ {"--root", dirs.GlobalRootDir, "disable", srv}, {"--root", dirs.GlobalRootDir, "mask", srv}, @@ -106,16 +112,22 @@ restore := release.MockOnClassic(false) defer restore() - for _, srvName := range []string{"ssh", "rsyslog"} { + for _, service := range []struct { + cfgName string + systemdName string + }{ + {"ssh", "sshd.service"}, + {"rsyslog", "rsyslog.service"}, + } { s.systemctlArgs = nil err := configcore.Run(&mockConf{ conf: map[string]interface{}{ - fmt.Sprintf("service.%s.disable", srvName): false, + fmt.Sprintf("service.%s.disable", service.cfgName): false, }, }) c.Assert(err, IsNil) - srv := fmt.Sprintf("%s.service", srvName) + srv := service.systemdName c.Check(s.systemctlArgs, DeepEquals, [][]string{ {"--root", dirs.GlobalRootDir, "unmask", srv}, {"--root", dirs.GlobalRootDir, "enable", srv}, diff -Nru snapd-2.31.1+17.10/packaging/arch/PKGBUILD snapd-2.31.2+17.10/packaging/arch/PKGBUILD --- snapd-2.31.1+17.10/packaging/arch/PKGBUILD 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/arch/PKGBUILD 2018-03-09 10:11:31.000000000 +0000 @@ -5,7 +5,7 @@ pkgbase=snapd pkgname=snapd-git -pkgver=2.31.1 +pkgver=2.31.2 pkgrel=1 arch=('i686' 'x86_64') url="https://github.com/snapcore/snapd" diff -Nru snapd-2.31.1+17.10/packaging/arch/snapd.install snapd-2.31.2+17.10/packaging/arch/snapd.install --- snapd-2.31.1+17.10/packaging/arch/snapd.install 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/arch/snapd.install 2018-03-09 10:11:31.000000000 +0000 @@ -4,7 +4,7 @@ echo 'To use snapd start/enable the snapd.socket' echo echo 'If you want your apps to be automatically updated' - echo 'from the store start/enable the snapd.refresh.timer' + echo 'from the store start/enable the snapd.service' echo echo 'NOTE: Desktop entries show up after logging in again' echo ' or rebooting after snapd installation' @@ -15,9 +15,7 @@ _systemctl_do_for_all() { /usr/bin/systemctl "$@" \ snapd.service \ - snapd.socket \ - snapd.refresh.timer \ - snapd.refresh.service > /dev/null 2>&1 + snapd.socket > /dev/null 2>&1 } _stop_services() { @@ -46,9 +44,6 @@ if /usr/bin/systemctl -q is-enabled snapd.socket > /dev/null 2>&1; then /usr/bin/systemctl start snapd.socket > /dev/null 2>&1 || : fi - if systemctl -q is-enabled snapd.refresh.timer > /dev/null 2>&1; then - systemctl start snapd.refresh.timer > /dev/null 2>&1 || : - fi } # vim:set ts=2 sw=2 et: diff -Nru snapd-2.31.1+17.10/packaging/fedora/snapd.spec snapd-2.31.2+17.10/packaging/fedora/snapd.spec --- snapd-2.31.1+17.10/packaging/fedora/snapd.spec 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/fedora/snapd.spec 2018-03-09 10:11:31.000000000 +0000 @@ -50,7 +50,7 @@ %global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo} %global import_path %{provider_prefix} -%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service snapd.refresh.timer snapd.refresh.service +%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service # Until we have a way to add more extldflags to gobuild macro... %if 0%{?fedora} >= 26 @@ -70,7 +70,7 @@ %endif Name: snapd -Version: 2.31.1 +Version: 2.31.2 Release: 0%{?dist} Summary: A transactional software package manager Group: System Environment/Base @@ -601,9 +601,6 @@ %{_unitdir}/snapd.socket %{_unitdir}/snapd.service %{_unitdir}/snapd.autoimport.service -%{_unitdir}/snapd.refresh.service -%{_unitdir}/snapd.refresh.timer -%{_unitdir}/var-lib-snapd-snap.mount %{_datadir}/dbus-1/services/io.snapcraft.Launcher.service %{_datadir}/polkit-1/actions/io.snapcraft.snapd.policy %config(noreplace) %{_sysconfdir}/sysconfig/snapd @@ -641,6 +638,7 @@ %{_libexecdir}/snapd/snap-seccomp %{_libexecdir}/snapd/snap-update-ns %{_libexecdir}/snapd/system-shutdown +%{_libexecdir}/snapd/snapd-generator %{_mandir}/man1/snap-confine.1* %{_mandir}/man5/snap-discard-ns.5* %{_prefix}/lib/udev/snappy-app-dev @@ -676,9 +674,6 @@ if systemctl -q is-enabled snapd.socket > /dev/null 2>&1 ; then systemctl start snapd.socket > /dev/null 2>&1 || : fi - if systemctl -q is-enabled snapd.refresh.timer > /dev/null 2>&1 ; then - systemctl start snapd.refresh.timer > /dev/null 2>&1 || : - fi fi %preun @@ -711,6 +706,23 @@ %changelog +* Fri Mar 09 2018 Michael Vogt +- New upstream release 2.31.2 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x * Tue Feb 20 2018 Michael Vogt - New upstream release 2.31.1 - tests: multiple autopkgtest related fixes for 18.04 diff -Nru snapd-2.31.1+17.10/packaging/fedora-25/snapd.spec snapd-2.31.2+17.10/packaging/fedora-25/snapd.spec --- snapd-2.31.1+17.10/packaging/fedora-25/snapd.spec 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/fedora-25/snapd.spec 2018-03-09 10:11:31.000000000 +0000 @@ -50,7 +50,7 @@ %global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo} %global import_path %{provider_prefix} -%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service snapd.refresh.timer snapd.refresh.service +%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service # Until we have a way to add more extldflags to gobuild macro... %if 0%{?fedora} >= 26 @@ -70,7 +70,7 @@ %endif Name: snapd -Version: 2.31.1 +Version: 2.31.2 Release: 0%{?dist} Summary: A transactional software package manager Group: System Environment/Base @@ -601,9 +601,6 @@ %{_unitdir}/snapd.socket %{_unitdir}/snapd.service %{_unitdir}/snapd.autoimport.service -%{_unitdir}/snapd.refresh.service -%{_unitdir}/snapd.refresh.timer -%{_unitdir}/var-lib-snapd-snap.mount %{_datadir}/dbus-1/services/io.snapcraft.Launcher.service %{_datadir}/polkit-1/actions/io.snapcraft.snapd.policy %config(noreplace) %{_sysconfdir}/sysconfig/snapd @@ -641,6 +638,7 @@ %{_libexecdir}/snapd/snap-seccomp %{_libexecdir}/snapd/snap-update-ns %{_libexecdir}/snapd/system-shutdown +%{_libexecdir}/snapd/snapd-generator %{_mandir}/man1/snap-confine.1* %{_mandir}/man5/snap-discard-ns.5* %{_prefix}/lib/udev/snappy-app-dev @@ -676,9 +674,6 @@ if systemctl -q is-enabled snapd.socket > /dev/null 2>&1 ; then systemctl start snapd.socket > /dev/null 2>&1 || : fi - if systemctl -q is-enabled snapd.refresh.timer > /dev/null 2>&1 ; then - systemctl start snapd.refresh.timer > /dev/null 2>&1 || : - fi fi %preun @@ -711,6 +706,23 @@ %changelog +* Fri Mar 09 2018 Michael Vogt +- New upstream release 2.31.2 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x * Tue Feb 20 2018 Michael Vogt - New upstream release 2.31.1 - tests: multiple autopkgtest related fixes for 18.04 diff -Nru snapd-2.31.1+17.10/packaging/fedora-26/snapd.spec snapd-2.31.2+17.10/packaging/fedora-26/snapd.spec --- snapd-2.31.1+17.10/packaging/fedora-26/snapd.spec 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/fedora-26/snapd.spec 2018-03-09 10:11:31.000000000 +0000 @@ -50,7 +50,7 @@ %global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo} %global import_path %{provider_prefix} -%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service snapd.refresh.timer snapd.refresh.service +%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service # Until we have a way to add more extldflags to gobuild macro... %if 0%{?fedora} >= 26 @@ -70,7 +70,7 @@ %endif Name: snapd -Version: 2.31.1 +Version: 2.31.2 Release: 0%{?dist} Summary: A transactional software package manager Group: System Environment/Base @@ -601,9 +601,6 @@ %{_unitdir}/snapd.socket %{_unitdir}/snapd.service %{_unitdir}/snapd.autoimport.service -%{_unitdir}/snapd.refresh.service -%{_unitdir}/snapd.refresh.timer -%{_unitdir}/var-lib-snapd-snap.mount %{_datadir}/dbus-1/services/io.snapcraft.Launcher.service %{_datadir}/polkit-1/actions/io.snapcraft.snapd.policy %config(noreplace) %{_sysconfdir}/sysconfig/snapd @@ -641,6 +638,7 @@ %{_libexecdir}/snapd/snap-seccomp %{_libexecdir}/snapd/snap-update-ns %{_libexecdir}/snapd/system-shutdown +%{_libexecdir}/snapd/snapd-generator %{_mandir}/man1/snap-confine.1* %{_mandir}/man5/snap-discard-ns.5* %{_prefix}/lib/udev/snappy-app-dev @@ -676,9 +674,6 @@ if systemctl -q is-enabled snapd.socket > /dev/null 2>&1 ; then systemctl start snapd.socket > /dev/null 2>&1 || : fi - if systemctl -q is-enabled snapd.refresh.timer > /dev/null 2>&1 ; then - systemctl start snapd.refresh.timer > /dev/null 2>&1 || : - fi fi %preun @@ -711,6 +706,23 @@ %changelog +* Fri Mar 09 2018 Michael Vogt +- New upstream release 2.31.2 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x * Tue Feb 20 2018 Michael Vogt - New upstream release 2.31.1 - tests: multiple autopkgtest related fixes for 18.04 diff -Nru snapd-2.31.1+17.10/packaging/fedora-27/snapd.spec snapd-2.31.2+17.10/packaging/fedora-27/snapd.spec --- snapd-2.31.1+17.10/packaging/fedora-27/snapd.spec 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/fedora-27/snapd.spec 2018-03-09 10:11:31.000000000 +0000 @@ -50,7 +50,7 @@ %global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo} %global import_path %{provider_prefix} -%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service snapd.refresh.timer snapd.refresh.service +%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service # Until we have a way to add more extldflags to gobuild macro... %if 0%{?fedora} >= 26 @@ -70,7 +70,7 @@ %endif Name: snapd -Version: 2.31.1 +Version: 2.31.2 Release: 0%{?dist} Summary: A transactional software package manager Group: System Environment/Base @@ -601,9 +601,6 @@ %{_unitdir}/snapd.socket %{_unitdir}/snapd.service %{_unitdir}/snapd.autoimport.service -%{_unitdir}/snapd.refresh.service -%{_unitdir}/snapd.refresh.timer -%{_unitdir}/var-lib-snapd-snap.mount %{_datadir}/dbus-1/services/io.snapcraft.Launcher.service %{_datadir}/polkit-1/actions/io.snapcraft.snapd.policy %config(noreplace) %{_sysconfdir}/sysconfig/snapd @@ -641,6 +638,7 @@ %{_libexecdir}/snapd/snap-seccomp %{_libexecdir}/snapd/snap-update-ns %{_libexecdir}/snapd/system-shutdown +%{_libexecdir}/snapd/snapd-generator %{_mandir}/man1/snap-confine.1* %{_mandir}/man5/snap-discard-ns.5* %{_prefix}/lib/udev/snappy-app-dev @@ -676,9 +674,6 @@ if systemctl -q is-enabled snapd.socket > /dev/null 2>&1 ; then systemctl start snapd.socket > /dev/null 2>&1 || : fi - if systemctl -q is-enabled snapd.refresh.timer > /dev/null 2>&1 ; then - systemctl start snapd.refresh.timer > /dev/null 2>&1 || : - fi fi %preun @@ -711,6 +706,23 @@ %changelog +* Fri Mar 09 2018 Michael Vogt +- New upstream release 2.31.2 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x * Tue Feb 20 2018 Michael Vogt - New upstream release 2.31.1 - tests: multiple autopkgtest related fixes for 18.04 diff -Nru snapd-2.31.1+17.10/packaging/fedora-rawhide/snapd.spec snapd-2.31.2+17.10/packaging/fedora-rawhide/snapd.spec --- snapd-2.31.1+17.10/packaging/fedora-rawhide/snapd.spec 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/fedora-rawhide/snapd.spec 2018-03-09 10:11:31.000000000 +0000 @@ -50,7 +50,7 @@ %global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo} %global import_path %{provider_prefix} -%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service snapd.refresh.timer snapd.refresh.service +%global snappy_svcs snapd.service snapd.socket snapd.autoimport.service # Until we have a way to add more extldflags to gobuild macro... %if 0%{?fedora} >= 26 @@ -70,7 +70,7 @@ %endif Name: snapd -Version: 2.31.1 +Version: 2.31.2 Release: 0%{?dist} Summary: A transactional software package manager Group: System Environment/Base @@ -601,9 +601,6 @@ %{_unitdir}/snapd.socket %{_unitdir}/snapd.service %{_unitdir}/snapd.autoimport.service -%{_unitdir}/snapd.refresh.service -%{_unitdir}/snapd.refresh.timer -%{_unitdir}/var-lib-snapd-snap.mount %{_datadir}/dbus-1/services/io.snapcraft.Launcher.service %{_datadir}/polkit-1/actions/io.snapcraft.snapd.policy %config(noreplace) %{_sysconfdir}/sysconfig/snapd @@ -641,6 +638,7 @@ %{_libexecdir}/snapd/snap-seccomp %{_libexecdir}/snapd/snap-update-ns %{_libexecdir}/snapd/system-shutdown +%{_libexecdir}/snapd/snapd-generator %{_mandir}/man1/snap-confine.1* %{_mandir}/man5/snap-discard-ns.5* %{_prefix}/lib/udev/snappy-app-dev @@ -676,9 +674,6 @@ if systemctl -q is-enabled snapd.socket > /dev/null 2>&1 ; then systemctl start snapd.socket > /dev/null 2>&1 || : fi - if systemctl -q is-enabled snapd.refresh.timer > /dev/null 2>&1 ; then - systemctl start snapd.refresh.timer > /dev/null 2>&1 || : - fi fi %preun @@ -711,6 +706,23 @@ %changelog +* Fri Mar 09 2018 Michael Vogt +- New upstream release 2.31.2 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x * Tue Feb 20 2018 Michael Vogt - New upstream release 2.31.1 - tests: multiple autopkgtest related fixes for 18.04 diff -Nru snapd-2.31.1+17.10/packaging/opensuse-42.1/snapd.spec snapd-2.31.2+17.10/packaging/opensuse-42.1/snapd.spec --- snapd-2.31.1+17.10/packaging/opensuse-42.1/snapd.spec 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/opensuse-42.1/snapd.spec 2018-03-09 10:11:31.000000000 +0000 @@ -30,9 +30,9 @@ %global with_test_keys 0 %endif -%define systemd_services_list snapd.refresh.timer snapd.refresh.service snapd.socket snapd.service +%define systemd_services_list snapd.socket snapd.service Name: snapd -Version: 2.31.1 +Version: 2.31.2 Release: 0 Summary: Tools enabling systems to work with .snap files License: GPL-3.0 @@ -231,6 +231,9 @@ install -m 644 -D data/completion/snap %{buildroot}/usr/share/bash-completion/completions/snap install -m 644 -D data/completion/complete.sh %{buildroot}%{_libexecdir}/snapd install -m 644 -D data/completion/etelpmoc.sh %{buildroot}%{_libexecdir}/snapd +# move snapd-generator +install -m 755 -d %{buildroot}/lib/systemd/system-generators/ +mv %{buildroot}%{_libexecdir}/snapd/snapd-generator %{buildroot}/lib/systemd/system-generators/ %verifyscript %verify_permissions -e %{_libexecdir}/snapd/snap-confine @@ -288,11 +291,8 @@ %verify(not user group mode) %attr(06755,root,root) %{_libexecdir}/snapd/snap-confine %{_mandir}/man1/snap-confine.1.gz %{_mandir}/man5/snap-discard-ns.5.gz -%{_unitdir}/snapd.refresh.service -%{_unitdir}/snapd.refresh.timer %{_unitdir}/snapd.service %{_unitdir}/snapd.socket -%{_unitdir}/snap.mount /usr/bin/snap /usr/bin/snapctl /usr/sbin/rcsnapd @@ -308,6 +308,7 @@ /usr/share/bash-completion/completions/snap %{_libexecdir}/snapd/complete.sh %{_libexecdir}/snapd/etelpmoc.sh +/lib/systemd/system-generators/snapd-generator %{_mandir}/man1/snap.1.gz /usr/share/dbus-1/services/io.snapcraft.Launcher.service /usr/share/dbus-1/services/io.snapcraft.Settings.service diff -Nru snapd-2.31.1+17.10/packaging/opensuse-42.2/snapd.spec snapd-2.31.2+17.10/packaging/opensuse-42.2/snapd.spec --- snapd-2.31.1+17.10/packaging/opensuse-42.2/snapd.spec 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/opensuse-42.2/snapd.spec 2018-03-09 10:11:31.000000000 +0000 @@ -30,9 +30,9 @@ %global with_test_keys 0 %endif -%define systemd_services_list snapd.refresh.timer snapd.refresh.service snapd.socket snapd.service +%define systemd_services_list snapd.socket snapd.service Name: snapd -Version: 2.31.1 +Version: 2.31.2 Release: 0 Summary: Tools enabling systems to work with .snap files License: GPL-3.0 @@ -231,6 +231,9 @@ install -m 644 -D data/completion/snap %{buildroot}/usr/share/bash-completion/completions/snap install -m 644 -D data/completion/complete.sh %{buildroot}%{_libexecdir}/snapd install -m 644 -D data/completion/etelpmoc.sh %{buildroot}%{_libexecdir}/snapd +# move snapd-generator +install -m 755 -d %{buildroot}/lib/systemd/system-generators/ +mv %{buildroot}%{_libexecdir}/snapd/snapd-generator %{buildroot}/lib/systemd/system-generators/ %verifyscript %verify_permissions -e %{_libexecdir}/snapd/snap-confine @@ -288,11 +291,8 @@ %verify(not user group mode) %attr(06755,root,root) %{_libexecdir}/snapd/snap-confine %{_mandir}/man1/snap-confine.1.gz %{_mandir}/man5/snap-discard-ns.5.gz -%{_unitdir}/snapd.refresh.service -%{_unitdir}/snapd.refresh.timer %{_unitdir}/snapd.service %{_unitdir}/snapd.socket -%{_unitdir}/snap.mount /usr/bin/snap /usr/bin/snapctl /usr/sbin/rcsnapd @@ -308,6 +308,7 @@ /usr/share/bash-completion/completions/snap %{_libexecdir}/snapd/complete.sh %{_libexecdir}/snapd/etelpmoc.sh +/lib/systemd/system-generators/snapd-generator %{_mandir}/man1/snap.1.gz /usr/share/dbus-1/services/io.snapcraft.Launcher.service /usr/share/dbus-1/services/io.snapcraft.Settings.service diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-14.04/changelog snapd-2.31.2+17.10/packaging/ubuntu-14.04/changelog --- snapd-2.31.1+17.10/packaging/ubuntu-14.04/changelog 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-14.04/changelog 2018-03-09 10:11:31.000000000 +0000 @@ -1,3 +1,24 @@ +snapd (2.31.2~14.04) trusty; urgency=medium + + * New upstream release, LP: #1745217 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x + + -- Michael Vogt Fri, 09 Mar 2018 11:11:31 +0100 + snapd (2.31.1~14.04) trusty; urgency=medium * New upstream release, LP: #1745217 diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-14.04/files snapd-2.31.2+17.10/packaging/ubuntu-14.04/files --- snapd-2.31.1+17.10/packaging/ubuntu-14.04/files 2018-02-06 09:02:11.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-14.04/files 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -snapd_2.31~14.04_source.buildinfo devel optional diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-14.04/snapd.install snapd-2.31.2+17.10/packaging/ubuntu-14.04/snapd.install --- snapd-2.31.1+17.10/packaging/ubuntu-14.04/snapd.install 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-14.04/snapd.install 2018-03-09 10:11:31.000000000 +0000 @@ -6,6 +6,7 @@ usr/bin/snap-update-ns /usr/lib/snapd/ usr/bin/snapd /usr/lib/snapd/ usr/bin/snap-seccomp /usr/lib/snapd/ +usr/lib/snapd/snapd-generator /lib/systemd/system-generators/ # bash completion data/completion/snap /usr/share/bash-completion/completions diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-14.04/snapd.postinst snapd-2.31.2+17.10/packaging/ubuntu-14.04/snapd.postinst --- snapd-2.31.1+17.10/packaging/ubuntu-14.04/snapd.postinst 2017-08-08 06:31:43.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-14.04/snapd.postinst 2018-03-09 10:11:31.000000000 +0000 @@ -17,8 +17,8 @@ # snapd.system-shutdown.service is not strictly needed on 14.04. Its functionality # is limited to core devices, we still include it here for the sake of comppleteness # in comparison to 16.04 setups. - systemctl -f enable snapd.refresh.timer snapd.refresh.service snapd.autoimport.service snapd.socket snapd.service snap.mount.service snapd.system-shutdown.service - systemctl start snapd.refresh.timer snapd.autoimport.service snapd.socket snapd.service snap.mount.service + systemctl -f enable snapd.autoimport.service snapd.socket snapd.service snap.mount.service snapd.system-shutdown.service + systemctl start snapd.autoimport.service snapd.socket snapd.service snap.mount.service fi case ":$PATH:" in diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-16.04/changelog snapd-2.31.2+17.10/packaging/ubuntu-16.04/changelog --- snapd-2.31.1+17.10/packaging/ubuntu-16.04/changelog 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-16.04/changelog 2018-03-09 10:11:31.000000000 +0000 @@ -1,4 +1,25 @@ -snapd (2.31.1+17.10) artful; urgency=medium +snapd (2.31.2+17.10) artful; urgency=medium + + * New upstream release, LP: #1745217 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x + + -- Michael Vogt Fri, 09 Mar 2018 11:11:31 +0100 + +snapd (2.31.1) xenial; urgency=medium * New upstream release, LP: #1745217 - tests: multiple autopkgtest related fixes for 18.04 diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-16.04/snapd.install snapd-2.31.2+17.10/packaging/ubuntu-16.04/snapd.install --- snapd-2.31.1+17.10/packaging/ubuntu-16.04/snapd.install 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-16.04/snapd.install 2018-03-09 10:11:31.000000000 +0000 @@ -6,6 +6,7 @@ usr/bin/snap-update-ns /usr/lib/snapd/ usr/bin/snapd /usr/lib/snapd/ usr/bin/snap-seccomp /usr/lib/snapd/ +usr/lib/snapd/snapd-generator /lib/systemd/system-generators/ # bash completion data/completion/snap /usr/share/bash-completion/completions diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-16.10/changelog snapd-2.31.2+17.10/packaging/ubuntu-16.10/changelog --- snapd-2.31.1+17.10/packaging/ubuntu-16.10/changelog 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-16.10/changelog 2018-03-09 10:11:31.000000000 +0000 @@ -1,4 +1,25 @@ -snapd (2.31.1+17.10) artful; urgency=medium +snapd (2.31.2+17.10) artful; urgency=medium + + * New upstream release, LP: #1745217 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x + + -- Michael Vogt Fri, 09 Mar 2018 11:11:31 +0100 + +snapd (2.31.1) xenial; urgency=medium * New upstream release, LP: #1745217 - tests: multiple autopkgtest related fixes for 18.04 diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-16.10/snapd.install snapd-2.31.2+17.10/packaging/ubuntu-16.10/snapd.install --- snapd-2.31.1+17.10/packaging/ubuntu-16.10/snapd.install 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-16.10/snapd.install 2018-03-09 10:11:31.000000000 +0000 @@ -6,6 +6,7 @@ usr/bin/snap-update-ns /usr/lib/snapd/ usr/bin/snapd /usr/lib/snapd/ usr/bin/snap-seccomp /usr/lib/snapd/ +usr/lib/snapd/snapd-generator /lib/systemd/system-generators/ # bash completion data/completion/snap /usr/share/bash-completion/completions diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-17.04/changelog snapd-2.31.2+17.10/packaging/ubuntu-17.04/changelog --- snapd-2.31.1+17.10/packaging/ubuntu-17.04/changelog 2018-02-20 16:27:42.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-17.04/changelog 2018-03-09 10:11:31.000000000 +0000 @@ -1,4 +1,25 @@ -snapd (2.31.1+17.10) artful; urgency=medium +snapd (2.31.2+17.10) artful; urgency=medium + + * New upstream release, LP: #1745217 + - many: add the snapd-generator + - polkit: ensure error is properly set if dialog is dismissed + - xdgopenproxy: integrate xdg-open implementation into snapctl + - userd: add an OpenFile method for launching local files with xdg- + open + - configstate: when disable "ssh" we must disable the "sshd" + service + - many: remove snapd.refresh.{timer,service} + - interfaces/builtin: allow MM to access login1 + - timeutil: account for 24h wrap when flattening clock spans + - interfaces/screen-inhibit-control,network-status: fix dbus path + and interface typos + - systemd, wrappers: start all snap services in one systemctl + call + - tests: disable interfaces-location-control on s390x + + -- Michael Vogt Fri, 09 Mar 2018 11:11:31 +0100 + +snapd (2.31.1) xenial; urgency=medium * New upstream release, LP: #1745217 - tests: multiple autopkgtest related fixes for 18.04 diff -Nru snapd-2.31.1+17.10/packaging/ubuntu-17.04/snapd.install snapd-2.31.2+17.10/packaging/ubuntu-17.04/snapd.install --- snapd-2.31.1+17.10/packaging/ubuntu-17.04/snapd.install 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/packaging/ubuntu-17.04/snapd.install 2018-03-09 10:11:31.000000000 +0000 @@ -6,6 +6,7 @@ usr/bin/snap-update-ns /usr/lib/snapd/ usr/bin/snapd /usr/lib/snapd/ usr/bin/snap-seccomp /usr/lib/snapd/ +usr/lib/snapd/snapd-generator /lib/systemd/system-generators/ # bash completion data/completion/snap /usr/share/bash-completion/completions diff -Nru snapd-2.31.1+17.10/polkit/authority.go snapd-2.31.2+17.10/polkit/authority.go --- snapd-2.31.1+17.10/polkit/authority.go 2017-10-23 06:17:24.000000000 +0000 +++ snapd-2.31.2+17.10/polkit/authority.go 2018-03-09 09:35:23.000000000 +0000 @@ -49,7 +49,10 @@ err = authority.Call( "org.freedesktop.PolicyKit1.Authority.CheckAuthorization", 0, subject, actionId, details, flags, "").Store(&result) - if err != nil && !result.IsAuthorized { + if err != nil { + return false, err + } + if !result.IsAuthorized { if result.IsChallenge { err = ErrInteraction } else if result.Details["polkit.dismissed"] != "" { diff -Nru snapd-2.31.1+17.10/systemd/systemd.go snapd-2.31.2+17.10/systemd/systemd.go --- snapd-2.31.1+17.10/systemd/systemd.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/systemd/systemd.go 2018-03-09 10:11:31.000000000 +0000 @@ -103,7 +103,7 @@ DaemonReload() error Enable(service string) error Disable(service string) error - Start(service string) error + Start(service ...string) error Stop(service string, timeout time.Duration) error Kill(service, signal string) error Restart(service string, timeout time.Duration) error @@ -172,9 +172,9 @@ return err } -// Start the given service -func (*systemd) Start(serviceName string) error { - _, err := systemctlCmd("start", serviceName) +// Start the given service or services +func (*systemd) Start(serviceNames ...string) error { + _, err := systemctlCmd(append([]string{"start"}, serviceNames...)...) return err } diff -Nru snapd-2.31.1+17.10/systemd/systemd_test.go snapd-2.31.2+17.10/systemd/systemd_test.go --- snapd-2.31.1+17.10/systemd/systemd_test.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/systemd/systemd_test.go 2018-03-09 10:11:31.000000000 +0000 @@ -148,6 +148,12 @@ c.Check(s.argses, DeepEquals, [][]string{{"start", "foo"}}) } +func (s *SystemdTestSuite) TestStartMany(c *C) { + err := New("", s.rep).Start("foo", "bar", "baz") + c.Assert(err, IsNil) + c.Check(s.argses, DeepEquals, [][]string{{"start", "foo", "bar", "baz"}}) +} + func (s *SystemdTestSuite) TestStop(c *C) { restore := MockStopDelays(time.Millisecond, 25*time.Second) defer restore() diff -Nru snapd-2.31.1+17.10/tests/main/interfaces-location-control/task.yaml snapd-2.31.2+17.10/tests/main/interfaces-location-control/task.yaml --- snapd-2.31.1+17.10/tests/main/interfaces-location-control/task.yaml 2018-01-31 08:47:06.000000000 +0000 +++ snapd-2.31.2+17.10/tests/main/interfaces-location-control/task.yaml 2018-03-05 13:06:18.000000000 +0000 @@ -9,7 +9,8 @@ The snap is also declaring a plug on this interface must be able to ask for its properties. # dbus-launch not supported in ubuntu-core -systems: [-ubuntu-core-16-*] +# s390x does not support locationd +systems: [-ubuntu-core-16-*, -ubuntu-*-s390x] prepare: | . "$TESTSLIB/dbus.sh" diff -Nru snapd-2.31.1+17.10/tests/main/interfaces-snapd-control-with-manage/task.yaml snapd-2.31.2+17.10/tests/main/interfaces-snapd-control-with-manage/task.yaml --- snapd-2.31.1+17.10/tests/main/interfaces-snapd-control-with-manage/task.yaml 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/tests/main/interfaces-snapd-control-with-manage/task.yaml 2018-03-09 10:11:31.000000000 +0000 @@ -73,13 +73,6 @@ fi snap refresh --time | MATCH 'schedule: managed' - echo "Check that the snapd.refresh.service is disabled as well" - systemctl start snapd.refresh.service - if snap changes | MATCH "Refresh all snaps"; then - echo "snapd.refresh.service did refresh, this should not happen" - exit 1 - fi - # make sure we trigger a refresh for hints at least once systemctl stop snapd.socket snapd.service jq ".data[\"last-refresh\"] = \"2007-08-22T09:30:44.449455783+01:00\"" /var/lib/snapd/state.json > /var/lib/snapd/state.json.new diff -Nru snapd-2.31.1+17.10/tests/main/snap-on-non-shared-root/task.yaml snapd-2.31.2+17.10/tests/main/snap-on-non-shared-root/task.yaml --- snapd-2.31.1+17.10/tests/main/snap-on-non-shared-root/task.yaml 2018-01-31 08:47:06.000000000 +0000 +++ snapd-2.31.2+17.10/tests/main/snap-on-non-shared-root/task.yaml 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -# NOTE: This test should be altered or removed once snap-confine -# no longer tries to alter sharing of /snap (it's broken anyway). -summary: Ensure that snapd works on systems with a non rshared root -# no need to run on ubuntu-core-16, we always have / shared here -systems: [-ubuntu-core-*] -prepare: | - . $TESTSLIB/dirs.sh - # simulate a system with a non-shared / - mount --make-private / - mount --make-private $(readlink -f $SNAP_MOUNT_DIR/core/current) -restore: | - . $TESTSLIB/dirs.sh - mount --make-rshared / - mount --make-rshared $(readlink -f $SNAP_MOUNT_DIR/core/current) -execute: | - . $TESTSLIB/dirs.sh - - echo "Install fresh test-snapd-tools" - snap install test-snapd-tools - test-snapd-tools.echo hello - - echo "Refresh, subsequent runs after refresh will fail if / is not rshared" - snap refresh --edge test-snapd-tools - test-snapd-tools.echo hello - - echo "Ensure we have a shared mount of $SNAP_MOUNT_DIR" - cat /proc/self/mountinfo |MATCH "$SNAP_MOUNT_DIR $SNAP_MOUNT_DIR.*shared:[0-9]" - - echo "Run it again for good measure" - test-snapd-tools.echo hello - echo "... and ensure we do not mount $SNAP_MOUNT_DIR again" - n=$(cat /proc/self/mountinfo |grep "$SNAP_MOUNT_DIR $SNAP_MOUNT_DIR.*shared:[0-9]"|wc -l) - if [ "$n" -ne 1 ]; then - echo "Incorrect extra $SNAP_MOUNT_DIR bind mounts created" - exit 1 - fi diff -Nru snapd-2.31.1+17.10/tests/main/ubuntu-core-services/task.yaml snapd-2.31.2+17.10/tests/main/ubuntu-core-services/task.yaml --- snapd-2.31.1+17.10/tests/main/ubuntu-core-services/task.yaml 2017-10-23 06:17:27.000000000 +0000 +++ snapd-2.31.2+17.10/tests/main/ubuntu-core-services/task.yaml 2018-03-09 10:11:31.000000000 +0000 @@ -12,6 +12,6 @@ systemctl status snapd.service |MATCH active echo "Ensure timers are working" - for timer in snapd.refresh.timer snapd.snap-repair.timer; do + for timer in snapd.snap-repair.timer; do systemctl is-active $timer done diff -Nru snapd-2.31.1+17.10/timeutil/export_test.go snapd-2.31.2+17.10/timeutil/export_test.go --- snapd-2.31.1+17.10/timeutil/export_test.go 2017-08-08 06:31:43.000000000 +0000 +++ snapd-2.31.2+17.10/timeutil/export_test.go 2018-03-05 14:22:58.000000000 +0000 @@ -21,6 +21,10 @@ import "time" +var ( + ParseClockSpan = parseClockSpan +) + func MockTimeNow(f func() time.Time) (restorer func()) { origTimeNow := timeNow timeNow = f diff -Nru snapd-2.31.1+17.10/timeutil/schedule.go snapd-2.31.2+17.10/timeutil/schedule.go --- snapd-2.31.1+17.10/timeutil/schedule.go 2018-02-16 20:27:57.000000000 +0000 +++ snapd-2.31.2+17.10/timeutil/schedule.go 2018-03-09 10:11:31.000000000 +0000 @@ -46,7 +46,11 @@ func (t Clock) Sub(other Clock) time.Duration { t1 := time.Duration(t.Hour)*time.Hour + time.Duration(t.Minute)*time.Minute t2 := time.Duration(other.Hour)*time.Hour + time.Duration(other.Minute)*time.Minute - return t1 - t2 + dur := t1 - t2 + if dur < 0 { + dur = -(dur + 24*time.Hour) + } + return dur } // Add adds given duration to t and returns a new Clock @@ -225,6 +229,9 @@ } span := ts.End.Sub(ts.Start) + if span < 0 { + span = -span + } step := span / time.Duration(ts.Split) spans := make([]ClockSpan, ts.Split) diff -Nru snapd-2.31.1+17.10/timeutil/schedule_test.go snapd-2.31.2+17.10/timeutil/schedule_test.go --- snapd-2.31.1+17.10/timeutil/schedule_test.go 2018-02-16 20:27:57.000000000 +0000 +++ snapd-2.31.2+17.10/timeutil/schedule_test.go 2018-03-09 10:11:31.000000000 +0000 @@ -44,6 +44,20 @@ td = timeutil.Clock{Hour: 10, Minute: 1} c.Check(td.Sub(timeutil.Clock{Hour: 10, Minute: 0}), Equals, time.Minute) + + td = timeutil.Clock{Hour: 23, Minute: 0} + c.Check(td.Add(time.Hour), Equals, timeutil.Clock{Hour: 0, Minute: 0}) + c.Check(td.Add(2*time.Hour), Equals, timeutil.Clock{Hour: 1, Minute: 0}) + c.Check(td.Sub(timeutil.Clock{Hour: 1, Minute: 0}), Equals, 22*time.Hour) + c.Check(td.Sub(timeutil.Clock{Hour: 0, Minute: 0}), Equals, 23*time.Hour) + + td = timeutil.Clock{Hour: 1, Minute: 0} + c.Check(td.Sub(timeutil.Clock{Hour: 23, Minute: 0}), Equals, -2*time.Hour) + c.Check(td.Sub(timeutil.Clock{Hour: 1, Minute: 0}), Equals, time.Duration(0)) + + td = timeutil.Clock{Hour: 0, Minute: 0} + c.Check(td.Sub(timeutil.Clock{Hour: 23, Minute: 0}), Equals, -1*time.Hour) + c.Check(td.Sub(timeutil.Clock{Hour: 1, Minute: 0}), Equals, -23*time.Hour) } func (ts *timeutilSuite) TestParseClock(c *C) { @@ -762,3 +776,33 @@ } } } + +func (ts *timeutilSuite) TestClockSpans(c *C) { + const shortForm = "2006-01-02 15:04:05" + + for _, t := range []struct { + clockspan string + flattenend []string + }{ + { + clockspan: "23:00-01:00/2", + flattenend: []string{"23:00-00:00", "00:00-01:00"}, + }, { + clockspan: "23:00-01:00/4", + flattenend: []string{"23:00-23:30", "23:30-00:00", "00:00-00:30", "00:30-01:00"}, + }, + } { + c.Logf("trying %+v", t) + spans, err := timeutil.ParseClockSpan(t.clockspan) + c.Assert(err, IsNil) + + spanStrings := make([]string, len(t.flattenend)) + flattened := spans.ClockSpans() + c.Assert(flattened, HasLen, len(t.flattenend)) + for i := range flattened { + spanStrings[i] = flattened[i].String() + } + + c.Assert(spanStrings, DeepEquals, t.flattenend) + } +} diff -Nru snapd-2.31.1+17.10/userd/helpers.go snapd-2.31.2+17.10/userd/helpers.go --- snapd-2.31.1+17.10/userd/helpers.go 2018-01-31 08:47:06.000000000 +0000 +++ snapd-2.31.2+17.10/userd/helpers.go 2018-03-05 13:06:21.000000000 +0000 @@ -42,6 +42,13 @@ if err != nil { return "", fmt.Errorf("cannot find snap for connection: %v", err) } + // Check that the sender is still connected to the bus: if it + // has disconnected between the GetConnectionUnixProcessID + // call and when we poked around in /proc, then it is possible + // that the process ID was reused. + if !nameHasOwner(conn, sender) { + return "", fmt.Errorf("sender is no longer connected to the bus") + } return snap, nil } @@ -54,6 +61,16 @@ return pid, nil } +func nameHasOwner(conn *dbus.Conn, sender dbus.Sender) bool { + call := conn.BusObject().Call("org.freedesktop.DBus.NameHasOwner", 0, sender) + if call.Err != nil { + return false + } + var hasOwner bool + call.Store(&hasOwner) + return hasOwner +} + // FIXME: move to osutil? func snapFromPid(pid int) (string, error) { f, err := os.Open(fmt.Sprintf("%s/proc/%d/cgroup", dirs.GlobalRootDir, pid)) diff -Nru snapd-2.31.1+17.10/userd/launcher.go snapd-2.31.2+17.10/userd/launcher.go --- snapd-2.31.1+17.10/userd/launcher.go 2018-01-31 08:47:06.000000000 +0000 +++ snapd-2.31.2+17.10/userd/launcher.go 2018-03-05 13:06:21.000000000 +0000 @@ -22,10 +22,16 @@ import ( "fmt" "net/url" + "os" "os/exec" + "syscall" + "time" "github.com/godbus/dbus" + "github.com/snapcore/snapd/i18n" + "github.com/snapcore/snapd/osutil/sys" "github.com/snapcore/snapd/strutil" + "github.com/snapcore/snapd/userd/ui" ) const launcherIntrospectionXML = ` @@ -40,6 +46,10 @@ + + + + ` var ( @@ -91,5 +101,87 @@ return dbus.MakeFailedError(fmt.Errorf("cannot open supplied URL")) } + return nil +} + +// fdToFilename determines the path associated with an open file descriptor. +// +// The file descriptor cannot be opened using O_PATH and must refer to +// a regular file or to a directory. The symlink at /proc/self/fd/ +// is read to determine the filename. The descriptor is also fstat'ed +// and the resulting device number and inode number are compared to +// stat on the path determined earlier. The numbers must match. +func fdToFilename(fd int) (string, error) { + flags, err := sys.FcntlGetFl(fd) + if err != nil { + return "", err + } + // File descriptors opened with O_PATH do not imply access to + // the file in question. + if flags&sys.O_PATH != 0 { + return "", fmt.Errorf("cannot use file descriptors opened using O_PATH") + } + + // Determine the file name associated with the passed file descriptor. + filename, err := os.Readlink(fmt.Sprintf("/proc/self/fd/%d", fd)) + if err != nil { + return "", err + } + + var fileStat, fdStat syscall.Stat_t + if err := syscall.Stat(filename, &fileStat); err != nil { + return "", err + } + if err := syscall.Fstat(fd, &fdStat); err != nil { + return "", err + } + + // Sanity check to ensure we've got the right file + if fdStat.Dev != fileStat.Dev || fdStat.Ino != fileStat.Ino { + return "", fmt.Errorf("cannot determine file name") + } + + fileType := fileStat.Mode & syscall.S_IFMT + if fileType != syscall.S_IFREG && fileType != syscall.S_IFDIR { + return "", fmt.Errorf("cannot open anything other than regular files or directories") + } + + return filename, nil +} + +func (s *Launcher) OpenFile(parentWindow string, clientFd dbus.UnixFD, sender dbus.Sender) *dbus.Error { + // godbus transfers ownership of this file descriptor to us + fd := int(clientFd) + defer syscall.Close(fd) + + filename, err := fdToFilename(fd) + if err != nil { + return dbus.MakeFailedError(err) + } + + snap, err := snapFromSender(s.conn, sender) + if err != nil { + return dbus.MakeFailedError(err) + } + dialog, err := ui.New() + if err != nil { + return dbus.MakeFailedError(err) + } + answeredYes := dialog.YesNo( + i18n.G("Allow opening file?"), + fmt.Sprintf(i18n.G("Allow snap %q to open file %q?"), snap, filename), + &ui.DialogOptions{ + Timeout: 5 * 60 * time.Second, + Footer: i18n.G("This dialog will close automatically after 5 minutes of inactivity."), + }, + ) + if !answeredYes { + return dbus.MakeFailedError(fmt.Errorf("permission denied")) + } + + if err = exec.Command("xdg-open", filename).Run(); err != nil { + return dbus.MakeFailedError(fmt.Errorf("cannot open supplied URL")) + } + return nil } diff -Nru snapd-2.31.1+17.10/userd/launcher_test.go snapd-2.31.2+17.10/userd/launcher_test.go --- snapd-2.31.1+17.10/userd/launcher_test.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/userd/launcher_test.go 2018-03-05 13:06:21.000000000 +0000 @@ -20,12 +20,17 @@ package userd_test import ( + "io/ioutil" + "os" + "path/filepath" + "syscall" "testing" "github.com/godbus/dbus" . "gopkg.in/check.v1" + "github.com/snapcore/snapd/osutil/sys" "github.com/snapcore/snapd/testutil" "github.com/snapcore/snapd/userd" ) @@ -35,7 +40,8 @@ type launcherSuite struct { launcher *userd.Launcher - mockXdgOpen *testutil.MockCmd + mockXdgOpen *testutil.MockCmd + restoreSnapFromSender func() } var _ = Suite(&launcherSuite{}) @@ -43,10 +49,14 @@ func (s *launcherSuite) SetUpTest(c *C) { s.launcher = &userd.Launcher{} s.mockXdgOpen = testutil.MockCommand(c, "xdg-open", "") + s.restoreSnapFromSender = userd.MockSnapFromSender(func(*dbus.Conn, dbus.Sender) (string, error) { + return "some-snap", nil + }) } func (s *launcherSuite) TearDownTest(c *C) { s.mockXdgOpen.Restore() + s.restoreSnapFromSender() } func (s *launcherSuite) TestOpenURLWithNotAllowedScheme(c *C) { @@ -83,3 +93,98 @@ c.Assert(err, NotNil) c.Assert(err, ErrorMatches, "cannot open supplied URL") } + +func (s *launcherSuite) TestOpenFileUserAccepts(c *C) { + mockZenity := testutil.MockCommand(c, "zenity", "true") + defer mockZenity.Restore() + + path := filepath.Join(c.MkDir(), "test.txt") + c.Assert(ioutil.WriteFile(path, []byte("Hello world"), 0644), IsNil) + + file, err := os.Open(path) + c.Assert(err, IsNil) + defer file.Close() + + dupFd, err := syscall.Dup(int(file.Fd())) + c.Assert(err, IsNil) + + err = s.launcher.OpenFile("", dbus.UnixFD(dupFd), ":some-dbus-sender") + c.Assert(err, IsNil) + c.Assert(s.mockXdgOpen.Calls(), DeepEquals, [][]string{ + {"xdg-open", path}, + }) +} + +func (s *launcherSuite) TestOpenFileUserDeclines(c *C) { + mockZenity := testutil.MockCommand(c, "zenity", "false") + defer mockZenity.Restore() + + path := filepath.Join(c.MkDir(), "test.txt") + c.Assert(ioutil.WriteFile(path, []byte("Hello world"), 0644), IsNil) + + file, err := os.Open(path) + c.Assert(err, IsNil) + defer file.Close() + + dupFd, err := syscall.Dup(int(file.Fd())) + c.Assert(err, IsNil) + + err = s.launcher.OpenFile("", dbus.UnixFD(dupFd), ":some-dbus-sender") + c.Assert(err, NotNil) + c.Assert(err, ErrorMatches, "permission denied") + c.Assert(s.mockXdgOpen.Calls(), IsNil) +} + +func (s *launcherSuite) TestOpenFileSucceedsWithDirectory(c *C) { + mockZenity := testutil.MockCommand(c, "zenity", "true") + defer mockZenity.Restore() + + dir := c.MkDir() + fd, err := syscall.Open(dir, syscall.O_RDONLY|syscall.O_DIRECTORY, 0755) + c.Assert(err, IsNil) + defer syscall.Close(fd) + + dupFd, err := syscall.Dup(fd) + c.Assert(err, IsNil) + + err = s.launcher.OpenFile("", dbus.UnixFD(dupFd), ":some-dbus-sender") + c.Assert(err, IsNil) + c.Assert(s.mockXdgOpen.Calls(), DeepEquals, [][]string{ + {"xdg-open", dir}, + }) +} + +func (s *launcherSuite) TestOpenFileFailsWithDeviceFile(c *C) { + mockZenity := testutil.MockCommand(c, "zenity", "true") + defer mockZenity.Restore() + + file, err := os.Open("/dev/null") + c.Assert(err, IsNil) + defer file.Close() + + dupFd, err := syscall.Dup(int(file.Fd())) + c.Assert(err, IsNil) + + err = s.launcher.OpenFile("", dbus.UnixFD(dupFd), ":some-dbus-sender") + c.Assert(err, NotNil) + c.Assert(err, ErrorMatches, "cannot open anything other than regular files or directories") + c.Assert(s.mockXdgOpen.Calls(), IsNil) +} + +func (s *launcherSuite) TestOpenFileFailsWithPathDescriptor(c *C) { + mockZenity := testutil.MockCommand(c, "zenity", "true") + defer mockZenity.Restore() + + dir := c.MkDir() + fd, err := syscall.Open(dir, sys.O_PATH, 0755) + c.Assert(err, IsNil) + defer syscall.Close(fd) + + dupFd, err := syscall.Dup(fd) + c.Assert(err, IsNil) + + err = s.launcher.OpenFile("", dbus.UnixFD(dupFd), ":some-dbus-sender") + c.Assert(err, NotNil) + c.Assert(err, ErrorMatches, "cannot use file descriptors opened using O_PATH") + c.Assert(s.mockXdgOpen.Calls(), IsNil) +} diff -Nru snapd-2.31.1+17.10/wrappers/services.go snapd-2.31.2+17.10/wrappers/services.go --- snapd-2.31.1+17.10/wrappers/services.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/wrappers/services.go 2018-03-09 10:11:31.000000000 +0000 @@ -93,6 +93,7 @@ func StartServices(apps []*snap.AppInfo, inter interacter) (err error) { sysd := systemd.New(dirs.GlobalRootDir, inter) + services := make([]string, 0, len(apps)) for _, app := range apps { // they're *supposed* to be all services, but checking doesn't hurt if !app.IsService() { @@ -100,9 +101,7 @@ } if len(app.Sockets) == 0 { - if err := sysd.Start(app.ServiceName()); err != nil { - return err - } + services = append(services, app.ServiceName()) } for _, socket := range app.Sockets { @@ -127,6 +126,13 @@ }(app) } + if len(services) > 0 { + if err := sysd.Start(services...); err != nil { + // cleanup was set up by iterating over apps + return err + } + } + return nil } diff -Nru snapd-2.31.1+17.10/wrappers/services_test.go snapd-2.31.2+17.10/wrappers/services_test.go --- snapd-2.31.1+17.10/wrappers/services_test.go 2018-01-24 20:02:44.000000000 +0000 +++ snapd-2.31.2+17.10/wrappers/services_test.go 2018-03-09 10:11:31.000000000 +0000 @@ -434,20 +434,16 @@ var sysdLog [][]string svc1Name := "snap.hello-snap.svc1.service" svc2Name := "snap.hello-snap.svc2.service" - numStarts := 0 r := systemd.MockSystemctl(func(cmd ...string) ([]byte, error) { sysdLog = append(sysdLog, cmd) - if len(cmd) >= 2 && cmd[len(cmd)-2] == "start" { - numStarts++ - if numStarts == 2 { - name := cmd[len(cmd)-1] - if name == svc1Name { - // the services are being iterated in the "wrong" order - svc1Name, svc2Name = svc2Name, svc1Name - } - return nil, fmt.Errorf("failed") + if len(cmd) >= 2 && cmd[0] == "start" { + name := cmd[len(cmd)-1] + if name == svc1Name { + // the services are being iterated in the "wrong" order + svc1Name, svc2Name = svc2Name, svc1Name } + return nil, fmt.Errorf("failed") } return []byte("ActiveState=inactive\n"), nil }) @@ -462,10 +458,11 @@ err := wrappers.StartServices(info.Services(), nil) c.Assert(err, ErrorMatches, "failed") - c.Assert(sysdLog, HasLen, 4) + c.Assert(sysdLog, HasLen, 5) c.Check(sysdLog, DeepEquals, [][]string{ - {"start", svc1Name}, - {"start", svc2Name}, // this one fails + {"start", svc1Name, svc2Name}, // one of the services fails + {"stop", svc2Name}, + {"show", "--property=ActiveState", svc2Name}, {"stop", svc1Name}, {"show", "--property=ActiveState", svc1Name}, }) diff -Nru snapd-2.31.1+17.10/xdgopenproxy/export_test.go snapd-2.31.2+17.10/xdgopenproxy/export_test.go --- snapd-2.31.1+17.10/xdgopenproxy/export_test.go 1970-01-01 00:00:00.000000000 +0000 +++ snapd-2.31.2+17.10/xdgopenproxy/export_test.go 2018-03-08 12:45:30.000000000 +0000 @@ -0,0 +1,22 @@ +// -*- Mode: Go; indent-tabs-mode: t -*- + +/* + * Copyright (C) 2018 Canonical Ltd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * 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 . + * + */ + +package xdgopenproxy + +var Launch = launch diff -Nru snapd-2.31.1+17.10/xdgopenproxy/xdgopenproxy.go snapd-2.31.2+17.10/xdgopenproxy/xdgopenproxy.go --- snapd-2.31.1+17.10/xdgopenproxy/xdgopenproxy.go 1970-01-01 00:00:00.000000000 +0000 +++ snapd-2.31.2+17.10/xdgopenproxy/xdgopenproxy.go 2018-03-08 12:45:30.000000000 +0000 @@ -0,0 +1,63 @@ +// -*- Mode: Go; indent-tabs-mode: t -*- + +/* + * Copyright (C) 2018 Canonical Ltd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * 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 . + * + */ + +// Package xdgopenproxy provides a client for snap userd's xdg-open D-Bus proxy +package xdgopenproxy + +import ( + "net/url" + "syscall" + + "github.com/godbus/dbus" +) + +func Run(urlOrFile string) error { + bus, err := dbus.SessionBus() + if err != nil { + return err + } + defer bus.Close() + launcher := bus.Object("io.snapcraft.Launcher", "/io/snapcraft/Launcher") + return launch(launcher, urlOrFile) +} + +func launch(launcher dbus.BusObject, urlOrFile string) error { + if u, err := url.Parse(urlOrFile); err == nil { + if u.Scheme == "file" { + return openFile(launcher, u.Path) + } else if u.Scheme != "" { + return openUrl(launcher, urlOrFile) + } + } + return openFile(launcher, urlOrFile) +} + +func openUrl(launcher dbus.BusObject, url string) error { + return launcher.Call("io.snapcraft.Launcher.OpenURL", 0, url).Err +} + +func openFile(launcher dbus.BusObject, filename string) error { + fd, err := syscall.Open(filename, syscall.O_RDONLY, 0) + if err != nil { + return err + } + defer syscall.Close(fd) + + return launcher.Call("io.snapcraft.Launcher.OpenFile", 0, "", dbus.UnixFD(fd)).Err +} diff -Nru snapd-2.31.1+17.10/xdgopenproxy/xdgopenproxy_test.go snapd-2.31.2+17.10/xdgopenproxy/xdgopenproxy_test.go --- snapd-2.31.1+17.10/xdgopenproxy/xdgopenproxy_test.go 1970-01-01 00:00:00.000000000 +0000 +++ snapd-2.31.2+17.10/xdgopenproxy/xdgopenproxy_test.go 2018-03-08 12:45:30.000000000 +0000 @@ -0,0 +1,155 @@ +// -*- Mode: Go; indent-tabs-mode: t -*- + +/* + * Copyright (C) 2018 Canonical Ltd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * 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 . + * + */ + +package xdgopenproxy_test + +import ( + "fmt" + "io/ioutil" + "net/url" + "os" + "path/filepath" + "syscall" + "testing" + + "github.com/godbus/dbus" + + . "gopkg.in/check.v1" + + "github.com/snapcore/snapd/xdgopenproxy" +) + +func Test(t *testing.T) { TestingT(t) } + +type xdgOpenSuite struct{} + +var _ = Suite(&xdgOpenSuite{}) + +func (s *xdgOpenSuite) TestOpenURL(c *C) { + launcher := fakeBusObject(func(method string, args ...interface{}) error { + c.Check(method, Equals, "io.snapcraft.Launcher.OpenURL") + c.Check(args, DeepEquals, []interface{}{"http://example.org"}) + return nil + }) + c.Check(xdgopenproxy.Launch(launcher, "http://example.org"), IsNil) +} + +func (s *xdgOpenSuite) TestOpenFile(c *C) { + path := filepath.Join(c.MkDir(), "test.txt") + c.Assert(ioutil.WriteFile(path, []byte("Hello world"), 0644), IsNil) + + launcher := fakeBusObject(func(method string, args ...interface{}) error { + c.Check(method, Equals, "io.snapcraft.Launcher.OpenFile") + c.Assert(args, HasLen, 2) + c.Check(args[0], Equals, "") + c.Check(fdMatchesFile(int(args[1].(dbus.UnixFD)), path), IsNil) + return nil + }) + c.Check(xdgopenproxy.Launch(launcher, path), IsNil) +} + +func (s *xdgOpenSuite) TestOpenFileURL(c *C) { + path := filepath.Join(c.MkDir(), "test.txt") + c.Assert(ioutil.WriteFile(path, []byte("Hello world"), 0644), IsNil) + + launcher := fakeBusObject(func(method string, args ...interface{}) error { + c.Check(method, Equals, "io.snapcraft.Launcher.OpenFile") + c.Assert(args, HasLen, 2) + c.Check(args[0], Equals, "") + c.Check(fdMatchesFile(int(args[1].(dbus.UnixFD)), path), IsNil) + return nil + }) + + u := url.URL{Scheme: "file", Path: path} + c.Check(xdgopenproxy.Launch(launcher, u.String()), IsNil) +} + +func (s *xdgOpenSuite) TestOpenDir(c *C) { + dir := c.MkDir() + + launcher := fakeBusObject(func(method string, args ...interface{}) error { + c.Check(method, Equals, "io.snapcraft.Launcher.OpenFile") + c.Assert(args, HasLen, 2) + c.Check(args[0], Equals, "") + c.Check(fdMatchesFile(int(args[1].(dbus.UnixFD)), dir), IsNil) + return nil + }) + c.Check(xdgopenproxy.Launch(launcher, dir), IsNil) +} + +func (s *xdgOpenSuite) TestOpenMissingFile(c *C) { + path := filepath.Join(c.MkDir(), "no-such-file.txt") + + launcher := fakeBusObject(func(method string, args ...interface{}) error { + c.Error("unexpected D-Bus call") + return nil + }) + c.Check(xdgopenproxy.Launch(launcher, path), ErrorMatches, "no such file or directory") +} + +func (s *xdgOpenSuite) TestOpenUnreadableFile(c *C) { + path := filepath.Join(c.MkDir(), "test.txt") + c.Assert(ioutil.WriteFile(path, []byte("Hello world"), 0644), IsNil) + c.Assert(os.Chmod(path, 0), IsNil) + + launcher := fakeBusObject(func(method string, args ...interface{}) error { + c.Error("unexpected D-Bus call") + return nil + }) + c.Check(xdgopenproxy.Launch(launcher, path), ErrorMatches, "permission denied") +} + +func fdMatchesFile(fd int, filename string) error { + var fdStat, fileStat syscall.Stat_t + if err := syscall.Fstat(fd, &fdStat); err != nil { + return err + } + if err := syscall.Stat(filename, &fileStat); err != nil { + return err + } + if fdStat.Dev != fileStat.Dev || fdStat.Ino != fileStat.Ino { + return fmt.Errorf("File descriptor and fd do not match") + } + return nil +} + +// fakeBusObject is a dbus.BusObject implementation that forwards +// Call invocations +type fakeBusObject func(method string, args ...interface{}) error + +func (f fakeBusObject) Call(method string, flags dbus.Flags, args ...interface{}) *dbus.Call { + err := f(method, args...) + return &dbus.Call{Err: err} +} + +func (f fakeBusObject) Go(method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{}) *dbus.Call { + return nil +} + +func (f fakeBusObject) GetProperty(prop string) (dbus.Variant, error) { + return dbus.Variant{}, nil +} + +func (f fakeBusObject) Destination() string { + return "" +} + +func (f fakeBusObject) Path() dbus.ObjectPath { + return "" +}