95 lines
3.2 KiB
C#
95 lines
3.2 KiB
C#
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Net.Mime;
|
|
using System.Security.Claims;
|
|
using Microsoft.AspNet.Http;
|
|
using Yavsc.ApiControllers;
|
|
using Yavsc.Models;
|
|
using Yavsc.Models.FileSystem;
|
|
using Yavsc.ViewModels.UserFiles;
|
|
|
|
namespace Yavsc.Helpers
|
|
{
|
|
public static class FileSystemHelpers
|
|
{
|
|
|
|
public static UserDirectoryInfo GetUserFiles(this ClaimsPrincipal user, string subdir)
|
|
{
|
|
|
|
UserDirectoryInfo di = new UserDirectoryInfo(user.Identity.Name, subdir);
|
|
|
|
return di;
|
|
}
|
|
static char[] ValidChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_~.".ToCharArray();
|
|
|
|
public static bool IsValidDirectoryName(this string name)
|
|
{
|
|
return !name.Any(c => !ValidChars.Contains(c));
|
|
}
|
|
public static bool IsValidPath(this string path)
|
|
{
|
|
if (path == null) return true;
|
|
foreach (var name in path.Split(Path.DirectorySeparatorChar))
|
|
{
|
|
if (name != null)
|
|
if (!IsValidDirectoryName(name)
|
|
|| name.Equals(".."))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
public static string InitPostToFileSystem(
|
|
this ClaimsPrincipal user,
|
|
string subpath)
|
|
{
|
|
var root = Path.Combine(Startup.UserFilesDirName, user.Identity.Name);
|
|
// TOSO secure this path
|
|
// if (subdir!=null) root = Path.Combine(root, subdir);
|
|
var diRoot = new DirectoryInfo(root);
|
|
if (!diRoot.Exists) diRoot.Create();
|
|
if (subpath != null)
|
|
if (subpath.IsValidPath())
|
|
{
|
|
root = Path.Combine(root, subpath);
|
|
diRoot = new DirectoryInfo(root);
|
|
if (!diRoot.Exists) diRoot.Create();
|
|
}
|
|
|
|
return root;
|
|
}
|
|
|
|
public static FileRecievedInfo ReceiveUserFile(this ApplicationUser user, string root, long quota, ref long usage, IFormFile f)
|
|
{
|
|
var item = new FileRecievedInfo();
|
|
// form-data; name="file"; filename="capt0008.jpg"
|
|
ContentDisposition contentDisposition = new ContentDisposition(f.ContentDisposition);
|
|
item.FileName = contentDisposition.FileName;
|
|
var fi = new FileInfo(Path.Combine(root, item.FileName));
|
|
if (fi.Exists) item.Overriden = true;
|
|
using (var dest = fi.OpenWrite())
|
|
{
|
|
using (var org = f.OpenReadStream())
|
|
{
|
|
byte[] buffer = new byte[1024];
|
|
long len = org.Length;
|
|
user.DiskUsage += len;
|
|
if (len > (quota - usage)) throw new FSQuotaException();
|
|
|
|
while (len > 0)
|
|
{
|
|
int blen = len > 1024 ? 1024 : (int)len;
|
|
org.Read(buffer, 0, blen);
|
|
dest.Write(buffer, 0, blen);
|
|
len -= blen;
|
|
}
|
|
dest.Close();
|
|
org.Close();
|
|
}
|
|
}
|
|
return item;
|
|
}
|
|
}
|
|
|
|
}
|