aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS_TheReturn/KernelWatchdog.cs
blob: 0608c466bd1e2095360b7b1df3e93dcade6cfd2f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using static ShiftOS.Objects.ShiftFS.Utils;

namespace ShiftOS.Engine
{
    public static class KernelWatchdog
    {
        //store logs into a file
        public static void Log(string e, string desc)
        {
            string line = $"[{DateTime.Now}] <{e}> {desc}";
            if (FileExists("0:/system/data/kernel.log"))
            {
                string contents = ReadAllText("0:/system/data/kernel.log");
                contents += Environment.NewLine + line;
                WriteAllText("0:/system/data/kernel.log", contents);
            }
            else
            {
                WriteAllText("0:/system/data/kernel.log", line);
            }
        }

        private static bool _mudConnected = true;

        public static bool InKernelMode { get; private set; }
        public static bool MudConnected
        {
            get
            {
                return _mudConnected;
            }
            set
            {
                if(value == false) // hey game if you want to disconnect from mud do this:
                {
                    foreach(var win in AppearanceManager.OpenForms)
                    {
                        foreach(var attr in win.ParentWindow.GetType().GetCustomAttributes(true))
                        {
                            // prevents disconnect from mud if an application that needs a connection is open
                            if(attr is MultiplayerOnlyAttribute)
                            {
                                ConsoleEx.Bold = true;
                                ConsoleEx.Underline = false;
                                ConsoleEx.Italic = true;
                                ConsoleEx.ForegroundColor = ConsoleColor.Red;
                                Console.Write("Error:");
                                ConsoleEx.Bold = false;
                                ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
                                Console.WriteLine("Cannot disconnect from multi-user domain because an app that depends on it is open.");
                                TerminalBackend.PrintPrompt();
                                return;
                            }
                        }
                    }
                }

                _mudConnected = value; // connects or disconnects from mud
                Desktop.PopulateAppLauncher();
            }
        }

        public static bool IsSafe(TerminalBackend.TerminalCommand cmd)
        {
            if (!cmd.RequiresElevation)
                return true;
            else
            {
                if (SaveSystem.CurrentUser.Permissions == Objects.UserPermissions.Root)
                    return true;
                else
                    return false;
            }
        }


        static string regularUsername = ""; //put regular username in here later


        public static void EnterKernelMode()
        {
            regularUsername = SaveSystem.CurrentUser.Username; // k for now put user's username in here for the time being
            SaveSystem.CurrentUser = SaveSystem.Users.FirstOrDefault(x => x.Username == "root"); // now their username is root

        }

        public static void LeaveKernelMode()
        {
            var user = SaveSystem.Users.FirstOrDefault(x => x.Username == regularUsername); //finds username
            if (user == null) 
                throw new Exception("User not in root mode."); // fuck this means the user isnt root quick throw error
            SaveSystem.CurrentUser = user;
        }

        //determines if you can disconnect from mud if there are no applications that currently need to
        internal static bool CanRunOffline(Type method)
        {
            if (MudConnected)
                return true;

            foreach (var attr in method.GetCustomAttributes(false))
            {
                if (attr is MultiplayerOnlyAttribute)
                    return false;
            }
            return true;
        }
        
        //same as above but this time for methods
        internal static bool CanRunOffline(MethodInfo method)
        {
            if (MudConnected)
                return true;

            foreach(var attr in method.GetCustomAttributes(false))
            {
                if (attr is MultiplayerOnlyAttribute)
                    return false;
            }
            return true;
        }
    }
}