diff --git a/stratosphere/ams_mitm/source/amsmitm_fs_utils.cpp b/stratosphere/ams_mitm/source/amsmitm_fs_utils.cpp index e232ecf5a..72e00bf79 100644 --- a/stratosphere/ams_mitm/source/amsmitm_fs_utils.cpp +++ b/stratosphere/ams_mitm/source/amsmitm_fs_utils.cpp @@ -196,7 +196,7 @@ namespace ams::mitm::fs { /* Check for romfs folder with content. */ FsDir romfs_dir; - if (R_FAILED(OpenAtmosphereSdRomfsDirectory(std::addressof(romfs_dir), program_id, "", OpenDirectoryMode_All))) { + if (R_FAILED(OpenAtmosphereSdRomfsDirectory(std::addressof(romfs_dir), program_id, "", fs::OpenDirectoryMode_All))) { return false; } ON_SCOPE_EXIT { fsDirClose(std::addressof(romfs_dir)); }; diff --git a/stratosphere/ams_mitm/source/amsmitm_fs_utils.hpp b/stratosphere/ams_mitm/source/amsmitm_fs_utils.hpp index 94a72c6bc..2e22dd901 100644 --- a/stratosphere/ams_mitm/source/amsmitm_fs_utils.hpp +++ b/stratosphere/ams_mitm/source/amsmitm_fs_utils.hpp @@ -52,4 +52,7 @@ namespace ams::mitm::fs { Result SaveAtmosphereSdFile(FsFile *out, ncm::ProgramId program_id, const char *path, void *data, size_t size); Result CreateAndOpenAtmosphereSdFile(FsFile *out, ncm::ProgramId program_id, const char *path, size_t size); + /* NOTE: Implemented in fs.mitm logic. */ + bool HasSdManualHtmlContent(ncm::ProgramId program_id); + } diff --git a/stratosphere/ams_mitm/source/fs_mitm/fs_mitm_service.cpp b/stratosphere/ams_mitm/source/fs_mitm/fs_mitm_service.cpp index 116675295..12074c135 100644 --- a/stratosphere/ams_mitm/source/fs_mitm/fs_mitm_service.cpp +++ b/stratosphere/ams_mitm/source/fs_mitm/fs_mitm_service.cpp @@ -96,11 +96,7 @@ namespace ams::mitm::fs { Result OpenProgramSpecificWebContentFileSystem(sf::Out> &out, ncm::ProgramId program_id, FsFileSystemType filesystem_type, Service *fwd, const fssrv::sf::Path *path, bool with_id) { /* Directory must exist. */ - { - FsDir d; - R_UNLESS(R_SUCCEEDED(mitm::fs::OpenAtmosphereSdDirectory(std::addressof(d), program_id, ProgramWebContentDir, fs::OpenDirectoryMode_Directory)), sm::mitm::ResultShouldForwardToSession()); - fsDirClose(std::addressof(d)); - } + R_UNLESS(HasSdManualHtmlContent(program_id), sm::mitm::ResultShouldForwardToSession()); /* Open the SD card using fs.mitm's session. */ FsFileSystem sd_fs; @@ -162,6 +158,17 @@ namespace ams::mitm::fs { } + bool HasSdManualHtmlContent(ncm::ProgramId program_id) { + /* Directory must exist. */ + FsDir d; + if (R_SUCCEEDED(OpenAtmosphereSdDirectory(std::addressof(d), program_id, ProgramWebContentDir, fs::OpenDirectoryMode_Directory))) { + ::fsDirClose(std::addressof(d)); + return true; + } else { + return false; + } + } + Result FsMitmService::OpenFileSystemWithPatch(sf::Out> out, ncm::ProgramId program_id, u32 _filesystem_type) { R_RETURN(OpenWebContentFileSystem(out, m_client_info.program_id, program_id, static_cast(_filesystem_type), m_forward_service.get(), nullptr, false, m_client_info.override_status.IsProgramSpecific())); } diff --git a/stratosphere/ams_mitm/source/ns_mitm/ns_am_mitm_service.cpp b/stratosphere/ams_mitm/source/ns_mitm/ns_am_mitm_service.cpp index 5afb42243..11f89bafe 100644 --- a/stratosphere/ams_mitm/source/ns_mitm/ns_am_mitm_service.cpp +++ b/stratosphere/ams_mitm/source/ns_mitm/ns_am_mitm_service.cpp @@ -14,6 +14,7 @@ * along with this program. If not, see . */ #include +#include "../amsmitm_fs_utils.hpp" #include "ns_am_mitm_service.hpp" #include "ns_shim.h" @@ -24,10 +25,9 @@ namespace ams::mitm::ns { } Result NsAmMitmService::ResolveApplicationContentPath(ncm::ProgramId application_id, u8 content_type) { - /* Always succeed for web applets asking about HBL. */ - /* This enables hbl html. */ - bool is_hbl; - if (R_SUCCEEDED(pm::info::IsHblProgramId(&is_hbl, application_id)) && is_hbl) { + /* Always succeed for web applets asking about HBL to enable hbl_html, and applications with manual_html to allow custom manual data. */ + bool is_hbl = false; + if ((R_SUCCEEDED(pm::info::IsHblProgramId(std::addressof(is_hbl), application_id)) && is_hbl) || (static_cast(content_type) == ncm::ContentType::HtmlDocument && mitm::fs::HasSdManualHtmlContent(application_id))) { nsamResolveApplicationContentPathFwd(m_forward_service.get(), static_cast(application_id), static_cast(content_type)); R_SUCCEED(); } diff --git a/stratosphere/ams_mitm/source/ns_mitm/ns_web_mitm_service.cpp b/stratosphere/ams_mitm/source/ns_mitm/ns_web_mitm_service.cpp index 1372bf593..44d913d20 100644 --- a/stratosphere/ams_mitm/source/ns_mitm/ns_web_mitm_service.cpp +++ b/stratosphere/ams_mitm/source/ns_mitm/ns_web_mitm_service.cpp @@ -14,6 +14,7 @@ * along with this program. If not, see . */ #include +#include "../amsmitm_fs_utils.hpp" #include "ns_web_mitm_service.hpp" namespace ams::mitm::ns { @@ -23,10 +24,9 @@ namespace ams::mitm::ns { } Result NsDocumentService::ResolveApplicationContentPath(ncm::ProgramId application_id, u8 content_type) { - /* Always succeed for web applets asking about HBL. */ - /* This enables hbl html. */ - bool is_hbl; - if (R_SUCCEEDED(pm::info::IsHblProgramId(std::addressof(is_hbl), application_id)) && is_hbl) { + /* Always succeed for web applets asking about HBL to enable hbl_html, and applications with manual_html to allow custom manual data. */ + bool is_hbl = false; + if ((R_SUCCEEDED(pm::info::IsHblProgramId(std::addressof(is_hbl), application_id)) && is_hbl) || (static_cast(content_type) == ncm::ContentType::HtmlDocument && mitm::fs::HasSdManualHtmlContent(application_id))) { nswebResolveApplicationContentPath(m_srv.get(), static_cast(application_id), static_cast(content_type)); R_SUCCEED(); }