コード例 #1
0
ファイル: OpUser.cs プロジェクト: nandub/DeOps
        void ProcessSplash(PacketStream stream)
        {
            G2Header root = null;

            if (stream.ReadPacket(ref root))
            {
                if (root.Name == IdentityPacket.Splash)
                {
                    LargeDataPacket start = LargeDataPacket.Decode(root);
                    if (start.Size > 0)
                    {
                        byte[] data = LargeDataPacket.Read(start, stream, IdentityPacket.Splash);
                        OpSplash = (Bitmap)Bitmap.FromStream(new MemoryStream(data));
                    }
                }
            }
        }
コード例 #2
0
ファイル: OpUser.cs プロジェクト: nandub/DeOps
        public void Save()
        {
            if (Core != null && Core.InvokeRequired)
            {
                Debug.Assert(false);
                Core.RunInCoreAsync(() => Save());
                return;
            }

            string backupPath = ProfilePath.Replace(".dop", ".bak");

            if (!File.Exists(backupPath) && File.Exists(ProfilePath))
            {
                File.Copy(ProfilePath, backupPath, true);
            }

            RijndaelManaged Password = new RijndaelManaged();

            Password.Key = PasswordKey;

            try
            {
                // Attach to crypto stream and write file
                string tempPath = TempPath + Path.DirectorySeparatorChar + "firstsave";
                if (Core != null)
                {
                    tempPath = Core.GetTempPath();
                }

                using (FileStream file = new FileStream(tempPath, FileMode.Create))
                {
                    // write encrypted part of file
                    Password.GenerateIV();
                    file.Write(Password.IV, 0, Password.IV.Length);
                    file.Write(PasswordSalt, 0, PasswordSalt.Length);

                    using (CryptoStream crypto = new CryptoStream(file, Password.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        PacketStream stream = new PacketStream(crypto, Protocol, FileAccess.Write);

                        stream.WritePacket(Settings);

                        if (Core != null)
                        {
                            if (Core.Context.Lookup != null)
                            {
                                Core.Context.Lookup.Network.Cache.SaveIPs(stream);
                                Core.Context.Lookup.Network.Cache.SaveWeb(stream);
                            }

                            Core.Network.Cache.SaveIPs(stream);
                            Core.Network.Cache.SaveWeb(stream);

                            Core.SaveKeyIndex(stream);
                        }

                        if (OpIcon != null)
                        {
                            stream.WritePacket(new IconPacket(IdentityPacket.Icon, OpIcon));
                        }
                    }
                }

                // write unencrypted splash
                using (FileStream file = new FileStream(tempPath, FileMode.Open))
                {
                    file.Seek(0, SeekOrigin.End);

                    long startpos = file.Position;

                    PacketStream stream = new PacketStream(file, Protocol, FileAccess.Write);

                    // get right splash image (only used for startup logo, main setting is in link file)
                    if (OpSplash != null)
                    {
                        MemoryStream mem = new MemoryStream();
                        OpSplash.Save(mem, ImageFormat.Jpeg);
                        LargeDataPacket.Write(stream, IdentityPacket.Splash, mem.ToArray());
                    }
                    else
                    {
                        LargeDataPacket.Write(stream, IdentityPacket.Splash, null);
                    }

                    file.WriteByte(0); // end packet stream

                    byte[] last = BitConverter.GetBytes(startpos);
                    file.Write(last, 0, last.Length);
                }


                File.Copy(tempPath, ProfilePath, true);
                File.Delete(tempPath);
            }

            catch (Exception ex)
            {
                if (Core != null)
                {
                    Core.ConsoleLog("Exception Identity::Save() " + ex.Message);
                }
                else
                {
                    Core.UserMessage("Profile Save Error:\n" + ex.Message + "\nBackup Restored");
                }

                // restore backup
                if (File.Exists(backupPath))
                {
                    File.Copy(backupPath, ProfilePath, true);
                }
            }

            File.Delete(backupPath);
        }