Beispiel #1
0
        public int StoreMessage(SelfDestructingMessage selfDestructingMessage, string passphrase, string attachmentName = null,
                                byte[] attachmentData = null)
        {
            if (selfDestructingMessage == null)
            {
                throw new ArgumentOutOfRangeException("selfDestructingMessage required");
            }

            selfDestructingMessage.Message = GzipCompression.Compress(selfDestructingMessage.Message);


            var crypto = new SymmetricCryptoProvider();

            selfDestructingMessage.Message = crypto.EncryptWithKey(selfDestructingMessage.Message, passphrase);

            var db = new CryptAByteContext();
            SelfDestructingMessageAttachment attachment = null;

            // save attachment, if it exists
            if (attachmentData != null && attachmentData.Length > 0)
            {
                MemoryStream streamOfOriginalFile = new MemoryStream(1024);

                using (ZipFile zip = new ZipFile())
                {
                    zip.AddEntry(attachmentName, attachmentData);
                    // zip.AddEntry(self, fileData);
                    zip.Save(streamOfOriginalFile);
                }

                byte[] zippedFile   = RequestRepository.ReadFully(streamOfOriginalFile);
                string fileAsString = Convert.ToBase64String(zippedFile);

                attachment = new SelfDestructingMessageAttachment {
                    Attachment = fileAsString
                };

                attachment.Attachment = crypto.EncryptWithKey(fileAsString, passphrase);
                attachment.SentDate   = DateTime.Now;

                //db.SelfDestructingMessageAttachments.Add(attachment);
            }

            db.SelfDestructingMessages.Add(selfDestructingMessage);
            db.SaveChanges();

            if (attachment != null)
            {
                attachment.MessageId = selfDestructingMessage.MessageId;
                db.SelfDestructingMessageAttachments.Add(attachment);

                db.ChangeTracker.DetectChanges();
                db.SaveChanges();
            }

            return(selfDestructingMessage.MessageId);
        }
Beispiel #2
0
        public ActionResult GetAttachment(string fileId)
        {
            var key = HomeController.FilePasswords.FirstOrDefault(p => p.Key == fileId && p.Value.Expires > DateTime.Now).Value;

            if (key == null)
            {
                Response.StatusCode = 500;
                return(Content("Temporary password has expired.  Close this popup and re-enter your password."));
            }

            try
            {
                SelfDestructingMessageAttachment attachment = selfDestructingMessageRepository.GetAttachment(key.MessageId, key.Passphrase);

                if (attachment == null)
                {
                    Response.StatusCode = 500;
                    return(Content("File not found. It may have been already downloaded"));
                }

                //string decryptedString = new SymmetricCryptoProvider().DecryptWithKey(attachment.Attachment, key.Passphrase);
                byte[] decryptedArray = Convert.FromBase64String(attachment.Attachment);

                var zipStream        = new MemoryStream(decryptedArray);
                var outputFileStream = new MemoryStream();

                using (ZipFile zip = ZipFile.Read(zipStream))
                {
                    zip.First().Extract(outputFileStream);
                    Response.AppendHeader("Content-Disposition", "attachment; filename=" + zip.First().FileName);
                }

                Response.ContentType = "application/octet-stream";
                outputFileStream.Seek(0, SeekOrigin.Begin);
                return(new FileStreamResult(outputFileStream, "application/zip"));
            }
            catch (ArgumentNullException ex)
            {
                Response.StatusCode = 500;
                return(Content("File does not exist.  Was it already downloaded?"));
            }
        }