// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using System.Security.Principal; using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; using osu.Game.Overlays; using osu.Game.Overlays.Notifications; namespace osu.Desktop.Security { /// /// Checks if the game is running with elevated privileges (as admin in Windows, root in Unix) and displays a warning notification if so. /// public class ElevatedPrivilegesChecker : Component { [Resolved] protected NotificationOverlay Notifications { get; private set; } private bool elevated; [BackgroundDependencyLoader] private void load() { elevated = isElevated(); } protected override void LoadComplete() { base.LoadComplete(); if (!elevated) return; Notifications.Post(new ElevatedPrivilegesNotification()); } private bool isElevated() { switch (RuntimeInfo.OS) { case RuntimeInfo.Platform.Windows: { if (!OperatingSystem.IsWindows()) return false; var windowsIdentity = WindowsIdentity.GetCurrent(); var windowsPrincipal = new WindowsPrincipal(windowsIdentity); return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); } case RuntimeInfo.Platform.macOS: case RuntimeInfo.Platform.Linux: return Mono.Unix.Native.Syscall.geteuid() == 0; default: return false; } } private class ElevatedPrivilegesNotification : SimpleNotification { public override bool IsImportant => true; public ElevatedPrivilegesNotification() { Text = $"Running osu! as {(RuntimeInfo.IsUnix ? "root" : "administrator")} does not improve performance and poses a security risk. Please run the game as a normal user."; } [BackgroundDependencyLoader] private void load(OsuColour colours, NotificationOverlay notificationOverlay) { Icon = FontAwesome.Solid.ShieldAlt; IconBackgound.Colour = colours.YellowDark; Activated = delegate { notificationOverlay.Hide(); return true; }; } } } }