/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: Resources.cpp Date: 2021-6-16 Author: Reece ***/ #include #include "FS.hpp" #include "Resources.hpp" #if defined(AURORA_PLATFORM_LINUX) #include #include #include #elif defined(AURORA_PLATFORM_WIN32) #include #endif namespace Aurora::IO::FS { static AuString gHomeDirectory; static AuString gApplicationData; AUKN_SYM bool GetSystemDomain(AuString &path) { path = gApplicationData; return true; } AUKN_SYM bool GetProfileDomain(AuString &path) { path = gHomeDirectory; return true; } AUKN_SYM bool GetSystemResourcePath(const AuString &fileName, AuString &path) { path.clear(); if (fileName.find("..") != AuString::npos) { LogWarn("Exploit Attempt? System resource path may not contain relative directory move operations: {}", fileName); return false; } { AuString tempPath; if (Process::GetWorkingDirectory(tempPath)) { tempPath += "/" + fileName; if (FileExists(tempPath)) { path = tempPath; return true; } } } { AuString tempPath; if (Process::GetProcPath(tempPath)) { tempPath += "/" + fileName; if (FileExists(tempPath)) { path = tempPath; return true; } } } { auto systemPath = gHomeDirectory + fileName; if (FileExists(systemPath)) { path = systemPath; return true; } } { auto systemPath = gApplicationData + fileName; if (FileExists(systemPath)) { path = systemPath; return true; } } return false; } #if defined(AURORA_PLATFORM_WIN32) static AuString GetSpecialDir(REFKNOWNFOLDERID rfid) { PWSTR directory; if (SHGetKnownFolderPath(rfid, KF_FLAG_DEFAULT, NULL, &directory) != S_OK) { SysPanic("Couldn't get known special directory path of [MS:{}-{}-{}-{}{}{}{}{}{}{}{}] with a NULL access token", rfid.Data1, rfid.Data2, rfid.Data3, rfid.Data4[0], rfid.Data4[1], rfid.Data4[2], rfid.Data4[3], rfid.Data4[4], rfid.Data4[5], rfid.Data4[6], rfid.Data4[7]); } return Locale::ConvertFromWChar(directory); } static void SetNamespaceDirectories() { gHomeDirectory = GetSpecialDir(FOLDERID_RoamingAppData); gApplicationData = GetSpecialDir(FOLDERID_ProgramData); } #elif defined(AURORA_PLATFORM_LINUX) static void SetNamespaceDirectories() { const char *homedir; homedir = getenv("HOME"); if (!homedir) { homedir = getpwuid(getuid())->pw_dir; } gHomeDirectory = homedir; gApplicationData = gHomeDirectory; } #else static void SetNamespaceDirectories() { gHomeDirectory = "."; gApplicationData = "."; } #endif static void ChangeDir() { gApplicationData += "/Aurora/System"; gHomeDirectory += "/Aurora/Profile"; NormalizePath(gApplicationData); NormalizePath(gHomeDirectory); gApplicationData += kPathSplitter; gHomeDirectory += kPathSplitter; } void InitResources() { SetNamespaceDirectories(); ChangeDir(); } }