mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-11-22 20:06:40 +00:00
ams_mitm: implement hbl_html redirection
This commit is contained in:
parent
66372e2b2e
commit
4f29eedfe9
9 changed files with 48 additions and 13 deletions
|
@ -26,6 +26,8 @@ namespace ams::mitm::fs {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
constexpr const char AtmosphereHblWebContentDir[] = "/atmosphere/hbl_html/";
|
||||||
|
|
||||||
os::Mutex g_storage_cache_lock;
|
os::Mutex g_storage_cache_lock;
|
||||||
std::unordered_map<u64, std::weak_ptr<IStorageInterface>> g_storage_cache;
|
std::unordered_map<u64, std::weak_ptr<IStorageInterface>> g_storage_cache;
|
||||||
|
|
||||||
|
@ -61,6 +63,39 @@ namespace ams::mitm::fs {
|
||||||
return (tmp != 0);
|
return (tmp != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result OpenHblWebContentFileSystem(sf::Out<std::shared_ptr<IFileSystemInterface>> &out, ncm::ProgramId client_program_id, ncm::ProgramId program_id, FsFileSystemType filesystem_type) {
|
||||||
|
/* Verify eligibility. */
|
||||||
|
bool is_hbl;
|
||||||
|
R_UNLESS(ncm::IsWebAppletProgramId(client_program_id), sm::mitm::ResultShouldForwardToSession());
|
||||||
|
R_UNLESS(filesystem_type == FsFileSystemType_ContentManual, sm::mitm::ResultShouldForwardToSession());
|
||||||
|
R_UNLESS(R_SUCCEEDED(pm::info::IsHblProgramId(&is_hbl, program_id)), sm::mitm::ResultShouldForwardToSession());
|
||||||
|
R_UNLESS(is_hbl, sm::mitm::ResultShouldForwardToSession());
|
||||||
|
|
||||||
|
/* Hbl html directory must exist. */
|
||||||
|
{
|
||||||
|
FsDir d;
|
||||||
|
R_UNLESS(R_SUCCEEDED(mitm::fs::OpenSdDirectory(&d, AtmosphereHblWebContentDir, fs::OpenDirectoryMode_Directory)), sm::mitm::ResultShouldForwardToSession());
|
||||||
|
fsDirClose(&d);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open the SD card using fs.mitm's session. */
|
||||||
|
FsFileSystem sd_fs;
|
||||||
|
R_TRY(fsOpenSdCardFileSystem(&sd_fs));
|
||||||
|
const sf::cmif::DomainObjectId target_object_id{serviceGetObjectId(&sd_fs.s)};
|
||||||
|
std::unique_ptr<fs::fsa::IFileSystem> sd_ifs = std::make_unique<fs::RemoteFileSystem>(sd_fs);
|
||||||
|
|
||||||
|
out.SetValue(std::make_shared<IFileSystemInterface>(std::make_shared<fssystem::SubDirectoryFileSystem>(std::move(sd_ifs), AtmosphereHblWebContentDir), false), target_object_id);
|
||||||
|
return ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FsMitmService::OpenFileSystemWithPatch(sf::Out<std::shared_ptr<IFileSystemInterface>> out, ncm::ProgramId program_id, u32 _filesystem_type) {
|
||||||
|
return OpenHblWebContentFileSystem(out, this->client_info.program_id, program_id, static_cast<FsFileSystemType>(_filesystem_type));
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FsMitmService::OpenFileSystemWithId(sf::Out<std::shared_ptr<IFileSystemInterface>> out, const fssrv::sf::Path &path, ncm::ProgramId program_id, u32 _filesystem_type) {
|
||||||
|
return OpenHblWebContentFileSystem(out, this->client_info.program_id, program_id, static_cast<FsFileSystemType>(_filesystem_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result FsMitmService::OpenSdCardFileSystem(sf::Out<std::shared_ptr<IFileSystemInterface>> out) {
|
Result FsMitmService::OpenSdCardFileSystem(sf::Out<std::shared_ptr<IFileSystemInterface>> out) {
|
||||||
|
|
|
@ -60,8 +60,8 @@ namespace ams::mitm::fs {
|
||||||
SF_MITM_SERVICE_OBJECT_CTOR(FsMitmService) { /* ... */ }
|
SF_MITM_SERVICE_OBJECT_CTOR(FsMitmService) { /* ... */ }
|
||||||
protected:
|
protected:
|
||||||
/* Overridden commands. */
|
/* Overridden commands. */
|
||||||
/* Result OpenFileSystemWithPatch(Out<std::shared_ptr<IFileSystemInterface>> out, u64 program_id, u32 filesystem_type); */
|
Result OpenFileSystemWithPatch(sf::Out<std::shared_ptr<IFileSystemInterface>> out, ncm::ProgramId program_id, u32 _filesystem_type);
|
||||||
/* Result OpenFileSystemWithId(Out<std::shared_ptr<IFileSystemInterface>> out, InPointer<char> path, u64 program_id, u32 filesystem_type); */
|
Result OpenFileSystemWithId(sf::Out<std::shared_ptr<IFileSystemInterface>> out, const fssrv::sf::Path &path, ncm::ProgramId program_id, u32 _filesystem_type);
|
||||||
Result OpenSdCardFileSystem(sf::Out<std::shared_ptr<IFileSystemInterface>> out);
|
Result OpenSdCardFileSystem(sf::Out<std::shared_ptr<IFileSystemInterface>> out);
|
||||||
Result OpenSaveDataFileSystem(sf::Out<std::shared_ptr<IFileSystemInterface>> out, u8 space_id, const FsSaveDataAttribute &attribute);
|
Result OpenSaveDataFileSystem(sf::Out<std::shared_ptr<IFileSystemInterface>> out, u8 space_id, const FsSaveDataAttribute &attribute);
|
||||||
Result OpenBisStorage(sf::Out<std::shared_ptr<IStorageInterface>> out, u32 bis_partition_id);
|
Result OpenBisStorage(sf::Out<std::shared_ptr<IStorageInterface>> out, u32 bis_partition_id);
|
||||||
|
@ -69,8 +69,8 @@ namespace ams::mitm::fs {
|
||||||
Result OpenDataStorageByDataId(sf::Out<std::shared_ptr<IStorageInterface>> out, ncm::ProgramId /* TODO: ncm::DataId */ data_id, u8 storage_id);
|
Result OpenDataStorageByDataId(sf::Out<std::shared_ptr<IStorageInterface>> out, ncm::ProgramId /* TODO: ncm::DataId */ data_id, u8 storage_id);
|
||||||
public:
|
public:
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
DEFINE_SERVICE_DISPATCH_TABLE {
|
||||||
/* MAKE_SERVICE_COMMAND_META(OpenFileSystemWithPatch, hos::Version_200), */
|
MAKE_SERVICE_COMMAND_META(OpenFileSystemWithPatch, hos::Version_200),
|
||||||
/* MAKE_SERVICE_COMMAND_META(OpenFileSystemWithId, hos::Version_200), */
|
MAKE_SERVICE_COMMAND_META(OpenFileSystemWithId, hos::Version_200),
|
||||||
MAKE_SERVICE_COMMAND_META(OpenSdCardFileSystem),
|
MAKE_SERVICE_COMMAND_META(OpenSdCardFileSystem),
|
||||||
MAKE_SERVICE_COMMAND_META(OpenSaveDataFileSystem),
|
MAKE_SERVICE_COMMAND_META(OpenSaveDataFileSystem),
|
||||||
MAKE_SERVICE_COMMAND_META(OpenBisStorage),
|
MAKE_SERVICE_COMMAND_META(OpenBisStorage),
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace ams::fssystem {
|
||||||
size_t after_dir_len;
|
size_t after_dir_len;
|
||||||
public:
|
public:
|
||||||
DirectoryRedirectionFileSystem(std::shared_ptr<fs::fsa::IFileSystem> fs, const char *before, const char *after, bool unc = false);
|
DirectoryRedirectionFileSystem(std::shared_ptr<fs::fsa::IFileSystem> fs, const char *before, const char *after, bool unc = false);
|
||||||
DirectoryRedirectionFileSystem(std::unique_ptr<fs::fsa::IFileSystem> &&fs, const char *before, const char *after, bool unc = false);
|
DirectoryRedirectionFileSystem(std::unique_ptr<fs::fsa::IFileSystem> fs, const char *before, const char *after, bool unc = false);
|
||||||
|
|
||||||
virtual ~DirectoryRedirectionFileSystem();
|
virtual ~DirectoryRedirectionFileSystem();
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -28,7 +28,7 @@ namespace ams::fssystem {
|
||||||
size_t base_path_len;
|
size_t base_path_len;
|
||||||
public:
|
public:
|
||||||
SubDirectoryFileSystem(std::shared_ptr<fs::fsa::IFileSystem> fs, const char *bp, bool unc = false);
|
SubDirectoryFileSystem(std::shared_ptr<fs::fsa::IFileSystem> fs, const char *bp, bool unc = false);
|
||||||
SubDirectoryFileSystem(std::unique_ptr<fs::fsa::IFileSystem> &&fs, const char *bp, bool unc = false);
|
SubDirectoryFileSystem(std::unique_ptr<fs::fsa::IFileSystem> fs, const char *bp, bool unc = false);
|
||||||
|
|
||||||
virtual ~SubDirectoryFileSystem();
|
virtual ~SubDirectoryFileSystem();
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace ams::fssystem::impl {
|
||||||
/* ... */
|
/* ... */
|
||||||
}
|
}
|
||||||
|
|
||||||
IPathResolutionFileSystem(std::unique_ptr<fs::fsa::IFileSystem> &&fs, bool unc = false) : unique_fs(std::move(fs)), unc_preserved(unc), base_fs(unique_fs.get()) {
|
IPathResolutionFileSystem(std::unique_ptr<fs::fsa::IFileSystem> fs, bool unc = false) : unique_fs(std::move(fs)), unc_preserved(unc), base_fs(unique_fs.get()) {
|
||||||
/* ... */
|
/* ... */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,8 @@ namespace ams::fssystem {
|
||||||
R_ASSERT(this->Initialize(before, after));
|
R_ASSERT(this->Initialize(before, after));
|
||||||
}
|
}
|
||||||
|
|
||||||
DirectoryRedirectionFileSystem::DirectoryRedirectionFileSystem(std::unique_ptr<fs::fsa::IFileSystem> &&fs, const char *before, const char *after, bool unc)
|
DirectoryRedirectionFileSystem::DirectoryRedirectionFileSystem(std::unique_ptr<fs::fsa::IFileSystem> fs, const char *before, const char *after, bool unc)
|
||||||
: PathResolutionFileSystem(std::forward<std::unique_ptr<fs::fsa::IFileSystem>>(fs), unc)
|
: PathResolutionFileSystem(std::move(fs), unc)
|
||||||
{
|
{
|
||||||
this->before_dir = nullptr;
|
this->before_dir = nullptr;
|
||||||
this->after_dir = nullptr;
|
this->after_dir = nullptr;
|
||||||
|
|
|
@ -80,7 +80,7 @@ namespace ams::fssystem {
|
||||||
}
|
}
|
||||||
|
|
||||||
DirectorySaveDataFileSystem::DirectorySaveDataFileSystem(std::unique_ptr<fs::fsa::IFileSystem> fs)
|
DirectorySaveDataFileSystem::DirectorySaveDataFileSystem(std::unique_ptr<fs::fsa::IFileSystem> fs)
|
||||||
: PathResolutionFileSystem(std::forward<std::unique_ptr<fs::fsa::IFileSystem>>(fs)), open_writable_files(0)
|
: PathResolutionFileSystem(std::move(fs)), open_writable_files(0)
|
||||||
{
|
{
|
||||||
/* ... */
|
/* ... */
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,8 @@ namespace ams::fssystem {
|
||||||
R_ASSERT(this->Initialize(bp));
|
R_ASSERT(this->Initialize(bp));
|
||||||
}
|
}
|
||||||
|
|
||||||
SubDirectoryFileSystem::SubDirectoryFileSystem(std::unique_ptr<fs::fsa::IFileSystem> &&fs, const char *bp, bool unc)
|
SubDirectoryFileSystem::SubDirectoryFileSystem(std::unique_ptr<fs::fsa::IFileSystem> fs, const char *bp, bool unc)
|
||||||
: PathResolutionFileSystem(std::forward<std::unique_ptr<fs::fsa::IFileSystem>>(fs), unc)
|
: PathResolutionFileSystem(std::move(fs), unc)
|
||||||
{
|
{
|
||||||
this->base_path = nullptr;
|
this->base_path = nullptr;
|
||||||
R_ASSERT(this->Initialize(bp));
|
R_ASSERT(this->Initialize(bp));
|
||||||
|
|
|
@ -34,7 +34,7 @@ Result pminfoAtmosphereGetProcessInfo(NcmProgramLocation *loc_out, CfgOverrideSt
|
||||||
CfgOverrideStatus status;
|
CfgOverrideStatus status;
|
||||||
} out;
|
} out;
|
||||||
|
|
||||||
Result rc = serviceDispatchInOut(pmdmntGetServiceSession(), 65002, pid, out);
|
Result rc = serviceDispatchInOut(pminfoGetServiceSession(), 65002, pid, out);
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) {
|
if (R_SUCCEEDED(rc)) {
|
||||||
if (loc_out) *loc_out = out.loc;
|
if (loc_out) *loc_out = out.loc;
|
||||||
|
|
Loading…
Reference in a new issue