// What this machine offers to other machines on the network. // // Every row states what is true right now, including "the software for this is // not installed" -- which is the honest answer for file sharing here, and is // what the panel this replaces hides behind a switch that silently does // nothing. // // Turning remote login on changes the whole system and prompts. Remote desktop // is a user service and does not. import Quickshell import QtQuick import qs.config import qs.services SettingsPage { id: root objectName: "sharing" title: "Sharing" lede: "What this machine offers to other machines on the network." Component.onCompleted: Sharing.refresh() TextRow { visible: Sharing.lastError !== "" label: "Sharing needs attention" detail: Sharing.lastError value: "" divider: false } SettingsCard { title: "This machine" subtitle: "The name other machines see." TextFieldRow { label: "Network name" detail: "Used for ssh and for anything else that finds this machine by name" text: Sharing.hostname placeholder: "desktop" enabled: !Sharing.busy divider: false onAccepted: value => Sharing.setHostname(value) } } SettingsCard { title: "Remote login" subtitle: "Sign in to a terminal on this machine over SSH." SwitchRow { label: "Allow remote login" detail: Sharing.remoteLogin?.installed === true ? (Sharing.remoteLoginOn ? "Running, and starts automatically at boot" : "Not running") : "OpenSSH server is not installed" checked: Sharing.remoteLoginOn enabled: !Sharing.busy && Sharing.remoteLogin?.installed === true onToggled: value => Sharing.setRemoteLogin(value) } TextRow { visible: Sharing.remoteLoginOn label: "Connect with" detail: "From another machine on your network" value: "ssh " + Sharing.networkName } TextRow { visible: Sharing.remoteLoginOn label: "Port" detail: "Where the SSH server is listening" value: String(Sharing.remoteLogin?.port ?? "22") } // Reported from the configuration rather than assumed. Saying "keys // only" on a machine that actually accepts passwords would be a // security claim this page cannot back up. TextRow { visible: Sharing.remoteLoginOn label: "Password sign-in" detail: Sharing.passwordLoginSummary() value: "" divider: false } } SettingsCard { title: "Remote desktop" subtitle: "See and control this desktop from another machine." SwitchRow { label: "Allow remote desktop" detail: Sharing.remoteDesktop?.available === true ? (Sharing.remoteDesktopOn ? "Running for your session" : (Sharing.remoteDesktop?.hasCredentials === true ? "Not running" : "Set a username and password before turning this on")) : "Remote desktop support is not installed" checked: Sharing.remoteDesktopOn enabled: !Sharing.busy && Sharing.remoteDesktop?.available === true && Sharing.remoteDesktop?.hasCredentials === true onToggled: value => Sharing.setRemoteDesktop(value) } TextFieldRow { visible: Sharing.remoteDesktop?.available === true label: "Port" detail: "The RDP port other machines connect to" text: String(Sharing.remoteDesktop?.port ?? "") placeholder: "3389" enabled: !Sharing.busy onAccepted: value => Sharing.setRdpPort(value) } SwitchRow { visible: Sharing.remoteDesktop?.available === true label: "View only" detail: "Let someone watch this desktop without controlling the pointer or keyboard" checked: Sharing.remoteDesktop?.viewOnly === true enabled: !Sharing.busy onToggled: value => Sharing.setRdpViewOnly(value) } // The password is typed into gnome-remote-desktop's own tool in a // terminal, never into this page. grdctl prompts for it on a terminal // and crashes without one, and passing it as an argument would publish // it through /proc to every process on this machine. ActionRow { visible: Sharing.remoteDesktop?.available === true label: "Credentials" detail: Sharing.remoteDesktop?.hasCredentials === true ? "Stored in the login keyring · setting new ones opens a terminal to type into" : "None stored yet · remote desktop cannot be turned on without them" action: "Set…" enabled: !Sharing.busy onTriggered: Sharing.setRdpCredentials(Quickshell.env("USER") || "") } ActionRow { visible: Sharing.remoteDesktop?.available === true && Sharing.remoteDesktop?.hasCredentials === true label: "Forget the stored credentials" detail: "Remote desktop cannot be turned on again until new ones are set" action: "Clear" enabled: !Sharing.busy divider: false onTriggered: Sharing.clearRdpCredentials() } } SettingsCard { title: "File and media sharing" subtitle: "Sharing folders and media needs software this machine does not necessarily have." TextRow { label: "Share folders on the network" detail: Sharing.fileSharing?.installed === true ? "Samba is installed" : "Needs Samba, which is not installed. Settings does not install software." value: Sharing.fileSharing?.installed === true ? "Available" : "Not installed" } TextRow { label: "Share music and video to devices" detail: Sharing.mediaSharing?.installed === true ? "Rygel is installed" : "Needs Rygel, which is not installed." value: Sharing.mediaSharing?.installed === true ? "Available" : "Not installed" divider: false } } }