Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
454 changes: 454 additions & 0 deletions locale-helper/allow_caller.go

Large diffs are not rendered by default.

651 changes: 651 additions & 0 deletions locale-helper/allow_caller_test.go

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions locale-helper/exported_methods_auto.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 37 additions & 6 deletions locale-helper/ifc.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package main

import (
"errors"
"fmt"

"github.com/godbus/dbus/v5"
Expand All @@ -25,9 +26,12 @@ var errAuthFailed = fmt.Errorf("authentication failed")
func (h *Helper) SetLocale(sender dbus.Sender, locale string) *dbus.Error {
h.service.DelayAutoQuit()

ok, err := h.checkAuth(sender)
logger.Debug("---Auth ret:", ok, err)
if !ok || err != nil {
authorized, err := h.authorizeOrPolkit(sender)
if err != nil {
logger.Warning("SetLocale access denied:", err)
return dbusutil.ToError(err)
}
if !authorized {
return dbusutil.ToError(errAuthFailed)
}

Expand All @@ -54,9 +58,12 @@ func (h *Helper) emitRealSuccess() {
}

func (h *Helper) generateLocale(sender dbus.Sender, locale string) error {
ok, err := h.checkAuth(sender)
logger.Debug("---Auth ret:", ok, err)
if !ok || err != nil {
authorized, err := h.authorizeOrPolkit(sender)
if err != nil {
logger.Warning("GenerateLocale access denied:", err)
return err
}
if !authorized {
return errAuthFailed
}

Expand Down Expand Up @@ -86,6 +93,15 @@ func (h *Helper) generateLocale(sender dbus.Sender, locale string) error {
return nil
}

func (h *Helper) SetAllowCaller(sender dbus.Sender, uniqueName string) *dbus.Error {
h.service.DelayAutoQuit()
err := h.allowCallers.addCaller(sender, uniqueName)
if err != nil {
logger.Warningf("SetAllowCaller rejected sender %s for target %s: %v", sender, uniqueName, err)
}
return dbusutil.ToError(err)
}

func (h *Helper) GenerateLocale(sender dbus.Sender, locale string) *dbus.Error {
h.service.DelayAutoQuit()

Expand Down Expand Up @@ -128,6 +144,21 @@ func enableLocaleInFile(locale, file string) error {
return nil
}

// authorizeOrPolkit checks the allow-caller registry first. If the registry is
// not enabled (the service was not launched through deepin-security-loader),
// fall back to the Polkit authorization dialog.
func (h *Helper) authorizeOrPolkit(sender dbus.Sender) (bool, error) {
err := h.allowCallers.authorize(sender)
if err == nil {
return true, nil
}
if errors.Is(err, errAllowCallerNotEnabled) {
// Not launched via deepin-security-loader: fall back to Polkit.
return h.checkAuth(sender)
}
return false, err
}

func (h *Helper) checkAuth(sender dbus.Sender) (bool, error) {
systemBus := h.service.Conn()
authority := polkit.NewAuthority(systemBus)
Expand Down
18 changes: 13 additions & 5 deletions locale-helper/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ const (
)

type Helper struct {
service *dbusutil.Service
mu sync.Mutex
running bool
service *dbusutil.Service
allowCallers *allowCallerRegistry
mu sync.Mutex
running bool

//nolint
signals *struct {
Expand Down Expand Up @@ -62,9 +63,16 @@ func main() {
logger.Fatalf("name %q already has the owner", dbusServiceName)
}

allowCallers, err := newAllowCallerRegistry(service)
if err != nil {
logger.Fatal("failed to initialize allow-caller registry:", err)
}
defer allowCallers.close()

var h = &Helper{
running: false,
service: service,
running: false,
service: service,
allowCallers: allowCallers,
}
err = service.Export(dbusPath, h)
if err != nil {
Expand Down
15 changes: 14 additions & 1 deletion misc/conf/org.deepin.dde.LocaleHelper1.conf
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,15 @@
<!-- Only root can own the service -->
<policy user="root">
<allow own="org.deepin.dde.LocaleHelper1"/>
<allow send_destination="org.deepin.dde.LocaleHelper1"
send_interface="org.deepin.dde.LocaleHelper1"
send_member="SetAllowCaller"/>
</policy>

<policy group="deepin-daemon">
<allow send_destination="org.deepin.dde.LocaleHelper1"
send_interface="org.deepin.dde.LocaleHelper1"
send_member="SetAllowCaller"/>
</policy>

<!-- Allow anyone to invoke methods on the interfaces -->
Expand All @@ -20,6 +29,10 @@
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.deepin.dde.LocaleHelper1"
send_interface="org.freedesktop.DBus.Introspectable"/>

<deny send_destination="org.deepin.dde.LocaleHelper1"
send_interface="org.deepin.dde.LocaleHelper1"
send_member="SetAllowCaller"/>
</policy>

</busconfig>
</busconfig>
2 changes: 1 addition & 1 deletion misc/polkit-action/org.deepin.dde.locale-helper.policy.in
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>yes</allow_active>
<allow_active>auth_admin_keep</allow_active>
</defaults>
</action>
</policyconfig>
5 changes: 5 additions & 0 deletions misc/systemd/system/deepin-locale-helper.service
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ Type=dbus
BusName=org.deepin.dde.LocaleHelper1
ExecStart=/usr/lib/deepin-api/locale-helper

RuntimeDirectory=dde-api
RuntimeDirectoryMode=0700
RuntimeDirectoryPreserve=yes

ReadWritePaths=/run/dde-api
ReadWritePaths=/etc/default/locale
ReadWritePaths=/etc/locale.gen

Expand Down
Loading