public string SharePackage(string sender, string[] recipients, string packageCode, string[] tokens, string subject, string message) { Console.WriteLine("Sharing package from " + sender + " for package " + packageCode + " containing " + tokens.Length + " files"); log.InfoFormat("Sharing package from \"{0}\"", sender); Package package = new Package() { Code = packageCode, SenderMail = sender, Message = subject + "\n" + message, Status = (char)PackageStatus.Open, Scanned = false, ExpiresAt = DateTime.UtcNow.AddDays(14), CreatedAt = DateTime.UtcNow }; using (DataClassesDataContext db = new DataClassesDataContext()) { foreach (string fileHash in tokens) { File f = new File() { CreatedAt = DateTime.UtcNow, FileHash = fileHash, FileSize = 0/*Storage.GetFileSize(package.Code, fileHash)*/, Package = package, }; db.Files.InsertOnSubmit(f); } db.SubmitChanges(); } string response = TransmitSettings.Instance.Setting.OutlookInjectedHtml ?? "Download: [TransmitUrl]/receive.aspx?h=[Package.Code]"; response = response.Replace("[Package.Code]", packageCode); response = response.Replace("[TransmitUrl]", TransmitSettings.Instance.Setting.ExternalUrl); return response; }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_LoadComplete(object sender, EventArgs e) { using (DataClassesDataContext db = new DataClassesDataContext()) { var packages = (from p in db.Packages where p.Status == (char)PackageStatus.Open orderby p.CreatedAt descending select p).Take(100); LvPackages.DataSource = packages; LvPackages.DataBind(); } }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_LoadComplete(object sender, EventArgs e) { using (DataClassesDataContext db = new DataClassesDataContext()) { // get all expired packages after page has loaded and // "cleanup" method has been invoked var latestLogs = from p in db.Logs orderby p.CreatedAt descending select p; DlLatestLogs.DataSource = latestLogs; DlLatestLogs.DataBind(); } }
public static Package FindByCode(string code) { Package package; using (DataClassesDataContext db = new DataClassesDataContext()) { package = db.Packages.SingleOrDefault(p => p.Code == code); if (package == null) { return null; } package.Files.Load(); package.Transfers.Load(); } return package; }
/// <summary> /// Requests a file from one or more (internal- or external) users. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void BtnRequest_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(Request["Recipients[]"])) { ValidationError.Display(_("No recipients specified")); } if (!Page.IsValid) { ValidationSummary.HeaderText = _("Please correct the following:"); //(this.Master as SiteMasterPage).Flash("You did not provide a file to share"); return; } string[] recipients = Request["Recipients[]"].ToLower().Split(','); log.DebugFormat("User {0} is dispatching request emails to {1} recipients", this.CurrentUser, recipients.Length); foreach (string recipientEmail in recipients) { // try to lookup user in AD based on recipient mail AuthenticatedUser recipientUser = Locator.FindByMail(recipientEmail); Invitation invitation = new Invitation { SenderMail = this.CurrentUser.Mail, SenderDisplayName = this.CurrentUser.DisplayName, RecipientMail = recipientEmail, RecipientDisplayName = (recipientUser != null) ? recipientUser.DisplayName : recipientEmail, Message = TbxMessage.Text, Code = Guid.NewGuid().ToString("N"), CreatedAt = DateTime.UtcNow }; using (DataClassesDataContext db = new DataClassesDataContext()) { db.Invitations.InsertOnSubmit(invitation); db.SubmitChanges(); } Dictionary<string, string> tokens = new Dictionary<string, string>(); tokens.Add("CompanyName", TransmitSettings.Instance.Setting.CompanyName); tokens.Add("Sender.Mail", this.CurrentUser.Mail); tokens.Add("Sender.DisplayName", this.CurrentUser.DisplayName); tokens.Add("Recipient.Mail", invitation.RecipientMail); tokens.Add("Recipient.DisplayName", invitation.RecipientDisplayName); tokens.Add("Mail.Message", invitation.Message); tokens.Add("Mail.InvitationCode", invitation.Code); tokens.Add("Url.Location", string.Format("{0}/upload.aspx?h={1}", UserHelper.GetSiteUrl(recipientUser), invitation.Code)); MailHelper.Send(TransmitSettings.Instance.Setting.RequestMailSubject, TransmitSettings.Instance.Setting.RequestMailBodyPlain, TransmitSettings.Instance.Setting.RequestMailBodyHtml, tokens); } this.Response.Redirect("~/request.success.aspx", true); }
public void ProcessRequest(HttpContext context) { try { //log.DebugFormat("Start processing request from {0} with a content-length of {1}", HttpContext.Current.Request.UserHostAddress, context.Request.Headers["Content-Length"]); JumploaderWrapper.FileSystemFileSaver save = new JumploaderWrapper.FileSystemFileSaver(context, Commanigy.Transmit.Data.TransmitSettings.Instance.Setting.StorageLocation); JumploaderWrapper.MultUploadHandler handle = new JumploaderWrapper.MultUploadHandler(save); handle.FileSaved += new JumploaderWrapper.MFileEventHandler(delegate(object sender, JumploaderWrapper.FileSavedEventArgs args) { log.DebugFormat("Client {0} successfully stored \"{3}\" ({1}kB) for token \"{2}\"", HttpContext.Current.Request.UserHostAddress, Math.Ceiling(int.Parse(context.Request.Headers["Content-Length"]) / 1024f), context.Request["token"], args.FileName); using (DataClassesDataContext db = new DataClassesDataContext()) { Package package = db.Packages.SingleOrDefault(p => p.Code == context.Request["token"]); if (package == null) { // create package if it doesn't already exists package = new Package() { Code = context.Request["token"], SenderMail = "Unspecified", Status = (char)PackageStatus.Open, Scanned = false, ExpiresAt = DateTime.Now.AddDays(14), CreatedAt = DateTime.UtcNow }; } Commanigy.Transmit.Data.File file = package.Files.Where(f => f.FileHash == args.FileName).FirstOrDefault(); if (file == null) { db.Files.InsertOnSubmit(new Commanigy.Transmit.Data.File() { CreatedAt = DateTime.UtcNow, FileHash = args.FileName, FileSize = int.Parse(context.Request.Headers["Content-Length"]), Package = package }); } else { file.FileSize += int.Parse(context.Request.Headers["Content-Length"]); } db.SubmitChanges(); } }); handle.ProcessRequest(context); } catch (Exception x) { log.Error("Failed to store received file", x); throw x; } }
public void Clean() { using (DataClassesDataContext db = new DataClassesDataContext()) { // get all old packages var oldPackages = from p in db.Packages where p.CreatedAt < DateTime.UtcNow.AddDays(-14) select p; // delete all obsoleted packages oldPackages.ToList().ForEach(delegate(Package p) { if (Storage.DeletePath(p.Code)) { db.Packages.DeleteOnSubmit(p); } }); db.SubmitChanges(); } }
/// <summary> /// Download entire package to client computer /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void BtnDownload_Click(object sender, EventArgs e) { AuthenticatedUser senderUser = Locator.FindByMail(package.SenderMail); log.DebugFormat("User {0} downloaded package {1}", this.CurrentUser, package.Code); using (DataClassesDataContext db = new DataClassesDataContext()) { Package updatingPackage = db.Packages.SingleOrDefault(p => p.Code == package.Code); foreach (var f in updatingPackage.Files) { f.DownloadCount += 1; } db.SubmitChanges(); } string archiveFileName; if (package.Files.Count == 1 && package.Files[0].FileHash.ToLower().EndsWith(".zip")) { archiveFileName = package.Files[0].FileHash; } else { archiveFileName = string.Format("files-from-{0}.zip", (senderUser != null) ? senderUser.DisplayName : package.SenderMail).Replace(" ", ""); } // strip invalid characters from filename string invalidCharacters = Regex.Escape(new string(Path.GetInvalidPathChars()) + new string(Path.GetInvalidFileNameChars())); archiveFileName = Regex.Replace(archiveFileName, "[" + invalidCharacters + "]", ""); Response.ContentType = "application/x-zip-compressed"; Response.AppendHeader("Content-Disposition", string.Format("attachment; filename={0}", archiveFileName)); string filename = Storage.GetFullDirectoryPath(package.Code) + ".zip"; // check if we already have a .zip archive if (System.IO.File.Exists(filename)) { //Response.WriteFile(Storage.GetFullDirectoryPath(package.Code) + ".zip"); WriteFileToOutputStream(filename); } else { FastZip fz = new FastZip(); fz.CreateZip(Response.OutputStream, Storage.GetFullDirectoryPath(package.Code), true, "", ""); } Response.End(); }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { this.Title = (this.ProfileUser != null) ? this.ProfileUser.DisplayName : string.Empty; if (!Page.IsPostBack) { if (this.ProfileUser == null) { throw new HttpException(404, "Profile not found"); } if (this.ProfileUser == this.CurrentUser) { using (DataClassesDataContext db = new DataClassesDataContext()) { var shared = (from transfer in db.Transfers where transfer.Package.SenderMail == this.CurrentUser.Mail orderby transfer.CreatedAt descending select transfer).Take(10); DlSharedByUser.DataSource = shared; DlSharedByUser.DataBind(); var received = (from transfer in db.Transfers where transfer.RecipientMail == this.CurrentUser.Mail orderby transfer.CreatedAt descending select transfer).Take(10); //var requestedFromUser = from i in db.Invitations // where i.RecipientMail == this.CurrentUser.Mail // orderby i.CreatedAt descending // select i; DlRequestedFiles.DataSource = received; DlRequestedFiles.DataBind(); var invited = (from invitation in db.Invitations where invitation.SenderMail == this.CurrentUser.Mail orderby invitation.CreatedAt descending select invitation).Take(10); DlInvitedUsers.DataSource = invited; DlInvitedUsers.DataBind(); } } } }
protected void BtnCleanup_Click(object sender, EventArgs e) { int cleanedPackages = 0; using (DataClassesDataContext db = new DataClassesDataContext()) { // get all expired packages var expiredPackages = ExpiredPackages(db); log.DebugFormat("Cleaning out {0} packages which are too old", expiredPackages.Count()); // delete packages from file size and from database expiredPackages.ToList().ForEach(delegate(Package p) { if (Storage.DeletePath(p.Code)) { cleanedPackages++; p.Status = (char)PackageStatus.Expired; //db.Packages.DeleteOnSubmit(p); } }); db.SubmitChanges(); } (this.Master as SiteMasterPage).Flash(string.Format("Cleaned up {0} packages", cleanedPackages)); }
protected void BtnShare_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(Request["Files[]"])) { ValidationError.Display(_("No files uploaded")); } if (!Page.IsValid) { (this.Master as SiteMasterPage).Flash(_("You did not provide files to share")); return; } string[] fileHashes = Request["Files[]"].Split(','); using (DataClassesDataContext db = new DataClassesDataContext()) { Package p = db.Packages.SingleOrDefault(pkg => pkg.Code == HfToken.Value); if (p == null) { // FIXME: this "if" section should be removed once Flash code has been updated to files immediately as well p = new Package() { Code = HfToken.Value, SenderMail = this.Invitation.RecipientMail, Message = TbxMessage.Text, Status = (char)PackageStatus.Open, Scanned = false, ExpiresAt = DateTime.Now.AddDays(14), CreatedAt = DateTime.UtcNow }; foreach (string fileHash in fileHashes) { Commanigy.Transmit.Data.File f = new Commanigy.Transmit.Data.File() { CreatedAt = DateTime.UtcNow, FileHash = fileHash, FileSize = Storage.GetFileSize(p.Code, fileHash), Package = p, }; db.Files.InsertOnSubmit(f); } } else { p.SenderMail = this.Invitation.RecipientMail; p.Message = TbxMessage.Text; } db.SubmitChanges(); } // get fresh copy of package Package package = Package.FindByCode(HfToken.Value); log.Debug("Packing files into ZIP archive for faster (initial) downloads by clients"); new Thread(new ParameterizedThreadStart(delegate(object data) { Package uploadedPackage = data as Package; Storage.Pack(uploadedPackage.Code); })).Start(package); // generate unique token allowing recipient (requester) to download file string uniqueHash = package.Code; // look up user requesting files (this should always resolve to a user) unless that // user has been disabled before file has been uploaded AuthenticatedUser recipientUser = Locator.FindByMail(this.Invitation.SenderMail); Dictionary<string, string> tokens = new Dictionary<string, string>(); tokens.Add("CompanyName", TransmitSettings.Instance.Setting.CompanyName); tokens.Add("Sender.Mail", this.Invitation.RecipientMail); tokens.Add("Sender.DisplayName", this.Invitation.RecipientDisplayName); tokens.Add("Recipient.Mail", this.Invitation.SenderMail); tokens.Add("Recipient.DisplayName", (recipientUser != null) ? recipientUser.DisplayName : this.Invitation.SenderDisplayName); tokens.Add("Mail.Message", TbxMessage.Text ?? string.Empty); tokens.Add("Package.Code", package.Code); tokens.Add("Package.Files", PackageHelper.FilesToMailHtml(package.Files.ToList())); tokens.Add("File.Location", string.Format("{0}/receive.aspx?h={1}", UserHelper.GetSiteUrl(recipientUser), uniqueHash)); MailHelper.Send(TransmitSettings.Instance.Setting.UploadMailSubject, TransmitSettings.Instance.Setting.UploadMailBodyPlain, TransmitSettings.Instance.Setting.UploadMailBodyHtml, tokens); this.Response.Redirect("~/upload.success.aspx", true); }
public void Reload() { using (DataClassesDataContext db = new DataClassesDataContext()) { setting = db.Settings.First(); } }
private Invitation LoadInvitation(string invitationCode) { using (DataClassesDataContext db = new DataClassesDataContext()) { return db.Invitations.SingleOrDefault(invitation => invitation.Code == invitationCode); } }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void BtnShare_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(Request["Recipients[]"])) { ValidationError.Display(_("No recipients specified")); } if (string.IsNullOrEmpty(Request["Files[]"])) { ValidationError.Display(_("No files uploaded")); } if (!Page.IsValid) { ValidationSummary.HeaderText = _("Please correct the following:"); return; } using (DataClassesDataContext db = new DataClassesDataContext()) { Package p = db.Packages.SingleOrDefault(pkg => pkg.Code == HfToken.Value); if (p == null) { // FIXME: this "if" section should be removed once Flash code has been updated to files immediately as well p = new Package() { Code = HfToken.Value, SenderMail = this.CurrentUser.Mail, Message = TbxMessage.Text, Status = (char)PackageStatus.Open, Scanned = false, ExpiresAt = DateTime.Now.AddDays(14), CreatedAt = DateTime.UtcNow }; string[] fileHashes = Request["Files[]"].Split(','); foreach (string fileHash in fileHashes) { db.Files.InsertOnSubmit(new File() { CreatedAt = DateTime.UtcNow, FileHash = fileHash, FileSize = Storage.GetFileSize(p.Code, fileHash), Package = p, }); } } else { p.SenderMail = this.CurrentUser.Mail; p.Message = TbxMessage.Text; } db.SubmitChanges(); } // get fresh copy of package Package package = Package.FindByCode(HfToken.Value); string[] recipients = Request["Recipients[]"].Split(','); log.DebugFormat("Packing files into ZIP archive {0} for faster (initial) downloads by clients", package.Code); new Thread(new ParameterizedThreadStart(delegate(object data) { Package uploadedPackage = data as Package; Storage.Pack(uploadedPackage.Code); ScanPackage(uploadedPackage); NotifyRecipients(uploadedPackage, recipients); })).Start(package); log.DebugFormat("User {0} completed sharing", this.CurrentUser); this.Response.Redirect("~/share.success.aspx", true); }
private void ScanPackage(Package package) { using (DataClassesDataContext db = new DataClassesDataContext()) { package.Scanned = PackageHelper.Scan(package); db.SubmitChanges(); } }
/// <summary> /// Notify all recipients about new, shared downloadable package. /// </summary> /// <param name="package">Recently uploaded package</param> /// <param name="recipients">An array of recipient emails</param> private void NotifyRecipients(Package package, string[] recipients) { log.DebugFormat("User {0} is dispatching share emails to {1} recipients", this.CurrentUser, recipients.Length); using (DataClassesDataContext db = new DataClassesDataContext()) { foreach (string recipientEmail in recipients) { NotifyRecipient(package, this.CurrentUser.Mail, this.CurrentUser.DisplayName, recipientEmail, TbxMessage.Text); Transfer t = new Transfer() { CreatedAt = DateTime.UtcNow, PackageID = package.ID, RecipientMail = recipientEmail }; db.Transfers.InsertOnSubmit(t); } db.SubmitChanges(); } }
private IQueryable<Package> ExpiredPackages(DataClassesDataContext db) { return from p in db.Packages where p.ExpiresAt < DateTime.UtcNow && p.Status == (char)PackageStatus.Open select p; }
public static string t(string v, params object[] a) { string key = Thread.CurrentThread.CurrentCulture.ToString() + " " + HashString(v); Dictionary<string, string> messages = HttpContext.Current.Cache["Transmit.Messages"] as Dictionary<string, string>; if (messages == null) { log.InfoFormat("Reading localized messages"); messages = new Dictionary<string, string>(); using (DataClassesDataContext db = new DataClassesDataContext()) { var localizedMessages = from msg in db.Messages select msg; foreach (var m in localizedMessages) { messages.Add(string.Format("{0} {1}", m.Culture, m.LookupKey), m.LocalizedMessage); } } HttpContext.Current.Cache.Add("Transmit.Messages", messages, null, Cache.NoAbsoluteExpiration, new TimeSpan(4, 0, 0), CacheItemPriority.Default, null); } if (messages.ContainsKey(key)) { return string.Format(messages[key], a); } log.DebugFormat("No localization for {0} => {1}", key, v); StoreLocalizedMessage(key, v); return string.Format(v, a); //string filename = "c:\\temp\\localization.resources"; //string key = v.ToLower().Replace(" ", "_").Replace("\"", "_").Replace(".", "_"); //if (!new FileInfo(filename).Exists) { // ResourceWriter writer = new ResourceWriter(filename); // writer.AddResource(key, v); // writer.Generate(); // writer.Close(); // log.Debug("Writing new resource file"); //} //log.Debug("looking at key: " + key); //ResourceSet rs = new ResourceSet(filename); //object o = rs.GetObject(key); //log.Debug("got object = " + o); //string x = rs.GetString(key); //log.Debug("got string = " + o); //if (x != null) { // v = x; //} ////Console.WriteLine(Rs.GetDefaultReader().ToString()); //rs.Close(); //try { // //string b = HttpContext.GetLocalResourceObject(HttpContext.Current.Request.Path, "test") as string; // //if (b != null) { // // v = "OK! " + b; // //} //} //catch (InvalidOperationException) { //} // return string.Format(v, a); }
private static void StoreLocalizedMessage(string key, string v) { string[] keyHash = key.Split(' '); using (DataClassesDataContext db = new DataClassesDataContext()) { Message m = db.Messages.FirstOrDefault(a => a.LookupKey == keyHash[1] && a.Culture == keyHash[0]); if (m == null) { m = new Message { Culture = keyHash[0], LookupKey = keyHash[1], LookupMessage = v, LocalizedMessage = v, // default to standard lookup message CreatedAt = DateTime.UtcNow }; db.Messages.InsertOnSubmit(m); db.SubmitChanges(); } } }
private string[] GetAvailableDirectories(DataClassesDataContext db) { var openPackages = OpenPackageCodes(db); string[] availableDirectories = Storage.GetDirectories(); return Array.FindAll(availableDirectories, delegate(string v) { return !openPackages.Contains(v); }); }
private IQueryable<string> OpenPackageCodes(DataClassesDataContext db) { return from p in db.Packages where p.ExpiresAt >= DateTime.UtcNow && p.Status == (char)PackageStatus.Open select p.Code; }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_LoadComplete(object sender, EventArgs e) { using (DataClassesDataContext db = new DataClassesDataContext()) { // get all expired packages after page has loaded and // "cleanup" method has been invoked var expiredPackages = ExpiredPackages(db); DlExpiredPackages.DataSource = expiredPackages; DlExpiredPackages.DataBind(); DlAvailableDirectories.DataSource = GetAvailableDirectories(db); DlAvailableDirectories.DataBind(); } }
protected void BtnDeleteUnattachedPackages_Click(object sender, EventArgs e) { using (DataClassesDataContext db = new DataClassesDataContext()) { Storage.PurgeDirectories(GetAvailableDirectories(db)); } }