예제 #1
0
        public void CopyFolder(IMailFolder folder, Folder sqlEntity, bool update, string password)
        {
            try
            {
                folder.Open(FolderAccess.ReadOnly);
            }
            catch (Exception)
            {
                return;
            }

            Random           rng   = AzusaContext.GetInstance().RandomNumberGenerator;
            IList <UniqueId> uuids = folder.Search(FolderService.GetSearchQuery(sqlEntity));

            foreach (UniqueId uuid in uuids)
            {
                if (MessageService.TestForMessage((int)uuid.Id))
                {
                    continue;
                }

                var message = folder.GetMessage(uuid);

                byte[] saltBuffer = new byte[16];
                rng.NextBytes(saltBuffer);
                Array.Copy(azusaString, 0, saltBuffer, 0, azusaString.Length);
                int iterations = rng.Next(1000, short.MaxValue);
                Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(password, saltBuffer, iterations);
                Aes aes = Aes.Create();
                aes.Key = deriveBytes.GetBytes(32);
                aes.IV  = deriveBytes.GetBytes(16);
                MemoryStream ms           = new MemoryStream();
                CryptoStream cryptoStream = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write);
                message.WriteTo(cryptoStream);
                cryptoStream.Flush();

                Mail child = new Mail();
                child.Uid          = (int)uuid.Id;
                child.MessageUtime = message.Date.DateTime.ToUnixTime();
                child.Folder       = sqlEntity.id;
                child.From         = message.From[0].ToString();
                if (message.To.Count > 0)
                {
                    child.To = message.To[0].ToString();
                }
                else
                {
                    child.To = null;
                }
                child.Subject    = message.Subject;
                child.Salt       = saltBuffer;
                child.Iterations = (short)iterations;
                child.Data       = new byte[ms.Position];
                Array.Copy(ms.GetBuffer(), 0, child.Data, 0, ms.Position);

                MessageService.StoreMessage(child);
            }

            folder.Close(false);
        }