Fix file permisions. Detect if restore tokens are not supported (version <= 1). Always log and continue if it is not possible to use a restore token rather than exit the program or log using fmt.

This commit is contained in:
godalming 2025-03-16 17:48:29 +00:00
parent 05259f6db5
commit ea6be7f7ed

View file

@ -25,6 +25,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/godbus/dbus/v5" "github.com/godbus/dbus/v5"
"log"
"os" "os"
"path/filepath" "path/filepath"
) )
@ -55,25 +56,6 @@ func init() {
} }
func InitPortalController(saveRestoreToken bool) (Controller, error) { func InitPortalController(saveRestoreToken bool) (Controller, error) {
cacheDirectory, err := os.UserCacheDir()
var restoreTokenFilePath string
var restoreToken string
if err != nil {
err = errors.Join(errors.New("Cannot get user cache directory, therefore cannot get restore token file path in order to read or save the restore token. "), err)
if saveRestoreToken == true {
return nil, err
} else {
fmt.Println(err.Error())
}
} else {
restoreTokenFilePath = filepath.Join(cacheDirectory, "remote_touchpad_portals_restore_token")
restoreTokenBytes, err := os.ReadFile(restoreTokenFilePath)
if err != nil {
fmt.Printf("Failed to read restore token file: %s\n", err)
} else {
restoreToken = string(restoreTokenBytes)
}
}
bus, err := dbus.SessionBusPrivate() bus, err := dbus.SessionBusPrivate()
if err != nil { if err != nil {
return nil, &UnsupportedPlatformError{err} return nil, &UnsupportedPlatformError{err}
@ -94,6 +76,30 @@ func InitPortalController(saveRestoreToken bool) (Controller, error) {
} }
remoteDesktop := bus.Object("org.freedesktop.portal.Desktop", remoteDesktop := bus.Object("org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop") "/org/freedesktop/portal/desktop")
version, err := remoteDesktop.GetProperty(
"org.freedesktop.portal.RemoteDesktop.version")
if err != nil {
return nil, &UnsupportedPlatformError{err}
}
supportsRestoreTokens := version.Value().(uint32) >= 2
var restoreTokenFilePath string
var restoreToken string
if supportsRestoreTokens {
cacheDirectory, err := os.UserCacheDir()
if err != nil {
log.Printf("Cannot get user cache directory: %s. Therefore cannot get restore token file path in order to read or save the restore token.\n", err)
} else {
restoreTokenFilePath = filepath.Join(cacheDirectory, "remote_touchpad_portals_restore_token")
restoreTokenBytes, err := os.ReadFile(restoreTokenFilePath)
if err != nil {
log.Printf("Failed to read restore token file: %s\n", err)
} else {
restoreToken = string(restoreTokenBytes)
}
}
} else {
log.Println("Portals implementation does not support restore tokens")
}
availableDeviceTypesV, err := remoteDesktop.GetProperty( availableDeviceTypesV, err := remoteDesktop.GetProperty(
"org.freedesktop.portal.RemoteDesktop.AvailableDeviceTypes") "org.freedesktop.portal.RemoteDesktop.AvailableDeviceTypes")
if err != nil { if err != nil {
@ -141,12 +147,14 @@ func InitPortalController(saveRestoreToken bool) (Controller, error) {
sessionHandle := dbus.ObjectPath(sessionHandleS) sessionHandle := dbus.ObjectPath(sessionHandleS)
inVardict = make(map[string]dbus.Variant) inVardict = make(map[string]dbus.Variant)
inVardict["types"] = dbus.MakeVariant(deviceKeyboard | devicePointer) inVardict["types"] = dbus.MakeVariant(deviceKeyboard | devicePointer)
if supportsRestoreTokens {
if restoreToken != "" { if restoreToken != "" {
inVardict["restore_token"] = dbus.MakeVariant(restoreToken) inVardict["restore_token"] = dbus.MakeVariant(restoreToken)
} }
if saveRestoreToken { if saveRestoreToken {
inVardict["persist_mode"] = dbus.MakeVariant(untilRevoked) inVardict["persist_mode"] = dbus.MakeVariant(untilRevoked)
} }
}
result, outVardict, err = getResponse(bus, remoteDesktop, result, outVardict, err = getResponse(bus, remoteDesktop,
"org.freedesktop.portal.RemoteDesktop.SelectDevices", 0, sessionHandle, inVardict) "org.freedesktop.portal.RemoteDesktop.SelectDevices", 0, sessionHandle, inVardict)
if err != nil { if err != nil {
@ -165,14 +173,14 @@ func InitPortalController(saveRestoreToken bool) (Controller, error) {
if result != 0 { if result != 0 {
return nil, errors.New("keyboard or pointer access denied") return nil, errors.New("keyboard or pointer access denied")
} }
if saveRestoreToken { if supportsRestoreTokens && saveRestoreToken {
restoreToken, ok := outVardict["restore_token"].Value().(string) restoreToken, ok := outVardict["restore_token"].Value().(string)
if !ok { if !ok {
return nil, errors.New("Failed to get new restore token") log.Println("Failed to get new restore token")
} else { } else if restoreTokenFilePath != "" {
err := os.WriteFile(restoreTokenFilePath, []byte(restoreToken), 0644) err := os.WriteFile(restoreTokenFilePath, []byte(restoreToken), 0600)
if err != nil { if err != nil {
return nil, errors.Join(errors.New("Failed to write restore token: "), err) log.Printf("Failed to write restore token: %s", err)
} }
} }
} }