diff --git a/interfaces/builtin/polkit.go b/interfaces/builtin/polkit.go index 70a3ae48911..14f8ce50414 100644 --- a/interfaces/builtin/polkit.go +++ b/interfaces/builtin/polkit.go @@ -148,12 +148,24 @@ func (iface *polkitInterface) BeforePreparePlug(plug *snap.PlugInfo) error { return err } +// hasPolkitDaemonExecutable checks known paths on core for the presence of +// the polkit daemon executable. This function can be shortened but keep it like +// this for readability. +func hasPolkitDaemonExecutable() bool { + // On core22(+core-desktop?) polkitd is at /usr/libexec/polkitd + if osutil.IsExecutable("/usr/libexec/polkitd") { + return true + } + // On core24 polkitd is at /usr/lib/polkit-1/polkitd + return osutil.IsExecutable("/usr/lib/polkit-1/polkitd") +} + func init() { registerIface(&polkitInterface{ commonInterface{ name: "polkit", summary: polkitSummary, - implicitOnCore: osutil.IsExecutable("/usr/libexec/polkitd"), + implicitOnCore: hasPolkitDaemonExecutable(), implicitOnClassic: true, baseDeclarationPlugs: polkitBaseDeclarationPlugs, baseDeclarationSlots: polkitBaseDeclarationSlots, diff --git a/interfaces/builtin/polkit_test.go b/interfaces/builtin/polkit_test.go index 4a29e020c1d..7028ee4b2f0 100644 --- a/interfaces/builtin/polkit_test.go +++ b/interfaces/builtin/polkit_test.go @@ -273,7 +273,7 @@ apps: func (s *polkitInterfaceSuite) TestStaticInfo(c *C) { si := interfaces.StaticInfoOf(s.iface) - c.Check(si.ImplicitOnCore, Equals, osutil.IsExecutable("/usr/libexec/polkitd")) + c.Check(si.ImplicitOnCore, Equals, osutil.IsExecutable("/usr/libexec/polkitd") || osutil.IsExecutable("/usr/lib/polkit-1/polkitd")) c.Check(si.ImplicitOnClassic, Equals, true) c.Check(si.Summary, Equals, "allows access to polkitd to check authorisation") c.Check(si.BaseDeclarationPlugs, testutil.Contains, "polkit")