pkNX/pkNX.Containers/FileMitm.cs
Kurt 0936c08eb1 LZA 1.0.2
Cumulative changes from the team.

Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com>
Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com>
Co-Authored-By: Lusamine <30205550+Lusamine@users.noreply.github.com>
2025-11-16 15:56:12 -06:00

64 lines
1.8 KiB
C#

using System;
using System.IO;
namespace pkNX.Containers;
/// <summary>
/// Man in the middle redirection of file r/w requests
/// </summary>
public static class FileMitm
{
public static bool Enabled { get; private set; }
public static void EnableIfSetup() => Enabled = PathOriginal != null;
public static void Disable() => Enabled = false;
private static string? PathOriginal;
private static string? PathRedirect;
public static byte[] ReadAllBytes(string path)
{
path = GetRedirectedReadPath(path);
return File.ReadAllBytes(path);
}
public static void WriteAllBytes(string path, ReadOnlySpan<byte> data)
{
if (string.IsNullOrWhiteSpace(path))
throw new FileNotFoundException("Invalid filename.");
path = GetRedirectedWritePath(path);
File.WriteAllBytes(path, data);
}
public static string GetRedirectedReadPath(string path)
{
if (!Enabled)
return path;
if (PathOriginal is null)
throw new ArgumentException("No original path specified.");
var newDest = path.Replace(PathOriginal, PathRedirect);
if (!File.Exists(newDest))
return path;
return newDest;
}
public static string GetRedirectedWritePath(string path)
{
if (!Enabled)
return path;
if (PathOriginal is null)
throw new ArgumentException("No original path specified.");
var newDest = path.Replace(PathOriginal, PathRedirect);
var parent = Path.GetDirectoryName(newDest) ?? throw new ArgumentException("Invalid path specified.");
Directory.CreateDirectory(parent);
return newDest;
}
public static void SetRedirect(string original, string dest)
{
PathOriginal = original;
PathRedirect = dest;
Enabled = true;
}
}