From 4632b9b5f4e17e801523b86848b75bc32ea8d7e2 Mon Sep 17 00:00:00 2001 From: Bruce Leidl Date: Sun, 22 Sep 2019 00:51:24 -0400 Subject: [PATCH] XWayland works now --- ph-init/src/error.rs | 2 ++ ph-init/src/init.rs | 56 +++++++++++++++++++++++++++++++++++++++++++- ph-init/src/sys.rs | 15 +++++++++--- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/ph-init/src/error.rs b/ph-init/src/error.rs index a07c8ca..8340459 100644 --- a/ph-init/src/error.rs +++ b/ph-init/src/error.rs @@ -30,6 +30,7 @@ pub enum Error { LaunchFailed(String, io::Error), RebootFailed(io::Error), OpenLogFailed(io::Error), + XAuthFail(io::Error), } impl fmt::Display for Error { @@ -65,6 +66,7 @@ impl fmt::Display for Error { LaunchFailed(exec, err) => write!(f, "unable to execute {}: {}", exec, err), RebootFailed(err) => write!(f, "could not reboot system: {}", err), OpenLogFailed(err) => write!(f, "failed to open log file: {}", err), + XAuthFail(err) => write!(f, "error creating .Xauthority file: {}", err), } } } diff --git a/ph-init/src/init.rs b/ph-init/src/init.rs index e306046..9a8f843 100644 --- a/ph-init/src/init.rs +++ b/ph-init/src/init.rs @@ -1,11 +1,12 @@ use crate::{Error, Result, Logger, LogLevel}; use crate::cmdline::CmdLine; -use crate::sys::{sethostname, setsid, set_controlling_tty, mount_devtmpfs, mount_tmpfs, mkdir, umount, mount_sysfs, mount_procfs, mount_devpts, chown, chmod, create_directories, mount_overlay, move_mount, pivot_root, mount_9p, mount, waitpid, reboot, getpid, mount_tmpdir, mount_cgroup, mkdir_mode}; +use crate::sys::{sethostname, setsid, set_controlling_tty, mount_devtmpfs, mount_tmpfs, mkdir, umount, mount_sysfs, mount_procfs, mount_devpts, chown, chmod, create_directories, mount_overlay, move_mount, pivot_root, mount_9p, mount, waitpid, reboot, getpid, mount_tmpdir, mount_cgroup, mkdir_mode, umask, _chown}; use std::path::Path; use std::{fs, process, io, env}; use crate::service::{Service, ServiceLaunch}; use std::collections::BTreeMap; +use std::io::Read; pub struct InitServer { hostname: String, @@ -38,6 +39,7 @@ impl InitServer { fn initialize(&self) -> Result<()> { self.set_loglevel(); + umask(0); sethostname(&self.hostname)?; setsid()?; set_controlling_tty(0, true)?; @@ -161,6 +163,12 @@ impl InitServer { let dbus = ServiceLaunch::new("dbus-daemon", "/usr/bin/dbus-daemon") .base_environment() .uidgid(1000,1000) + .env("HOME", "/home/user") + .env("NO_AT_BRIDGE", "1") + .env("QT_ACCESSIBILITY", "1") + .env("SHELL", "/bin/bash") + .env("USER", "user") + .env("WAYLAND_DISPLAY", "wayland-0") .arg("--session") .arg("--nosyslog") .arg("--address=unix:path=/run/user/1000/bus") @@ -179,6 +187,51 @@ impl InitServer { self.services.insert(sommelier.pid(), sommelier); + Self::write_xauth().map_err(Error::XAuthFail)?; + + let sommelierx = ServiceLaunch::new("sommelier-x", "/opt/ph/usr/bin/sommelier") + .base_environment() + .uidgid(1000,1000) + .arg("-X") + .arg("--x-display=0") + .arg("--no-exit-with-child") + .arg("--x-auth=/home/user/.Xauthority") + .arg("/bin/true") + .pipe_output() + .launch()?; + + + self.services.insert(sommelierx.pid(), sommelierx); + + Ok(()) + } + + fn write_xauth() -> io::Result<()> { + let xauth_path = "/home/user/.Xauthority"; + + let mut randbuf = [0; 16]; + let mut file = fs::File::open("/dev/urandom")?; + file.read_exact(&mut randbuf)?; + + let mut v: Vec = Vec::new(); + + // ??? + v.extend_from_slice(&[0x01, 0x00]); + // "airwolf".len() + v.extend_from_slice(&[0x00, 0x07]); + v.extend_from_slice(b"airwolf"); + // "0".len() (DISPLAY=:0) + v.extend_from_slice(&[0x00, 0x01]); + v.extend_from_slice(b"0"); + // "MIT-MAGIC-COOKIE-a".len() + v.extend_from_slice(&[0x00, 0x12]); + v.extend_from_slice(b"MIT-MAGIC-COOKIE-1"); + // randbuf.len() + v.extend_from_slice(&[0x00, 0x10]); + v.extend_from_slice(&randbuf); + + fs::write("/home/user/.Xauthority", v)?; + _chown(xauth_path, 1000, 1000)?; Ok(()) } @@ -189,6 +242,7 @@ impl InitServer { let shell = ServiceLaunch::new_shell(root, home, realm) .launch_with_preexec(move || { +// set_controlling_tty(0, true)?; env::set_current_dir(home)?; println!("{}", splash); Ok(()) diff --git a/ph-init/src/sys.rs b/ph-init/src/sys.rs index 33ce50d..7a5cfde 100644 --- a/ph-init/src/sys.rs +++ b/ph-init/src/sys.rs @@ -15,7 +15,7 @@ pub fn mount_tmpfs(target: &str) -> Result<()> { pub fn mount_tmpdir(target: &str) -> Result<()> { mount("tmpfs", target, "tmpfs", - libc::MS_NOSUID|libc::MS_NODEV, + libc::MS_NOSUID|libc::MS_NODEV|libc::MS_NOEXEC, Some("mode=1777")) .map_err(|e| Error::MountTmpFS(target.to_string(), e)) } @@ -88,6 +88,12 @@ pub fn create_directories>(directories: &[P]) -> Result<()> { Ok(()) } +pub fn umask(mode: u32) { + unsafe { + libc::umask(mode); + } +} + pub fn mkdir>(path: P) -> Result<()> { mkdir_mode(path, 0o755) } @@ -217,11 +223,14 @@ pub fn chmod(path: &str, mode: u32) -> Result<()> { } pub fn chown(path: &str, uid: u32, gid: u32) -> Result<()> { + _chown(path, uid, gid).map_err(Error::ChmodFailed) +} + +pub fn _chown(path: &str, uid: u32, gid: u32) -> io::Result<()> { let path = cstr(path); unsafe { if libc::chown(path.as_ptr(), uid, gid) == -1 { - let last = io::Error::last_os_error(); - return Err(Error::ChmodFailed(last)); + return Err(io::Error::last_os_error()); } } Ok(())