/// -----------------------------------------------------------------------------
 /// <summary>
 /// The RollbackFile method rolls back the install of a single file.
 /// </summary>
 /// <remarks>For new installs this removes the added file.  For upgrades it restores the
 /// backup file created during install</remarks>
 /// <param name="insFile">The InstallFile to commit</param>
 /// -----------------------------------------------------------------------------
 protected override void RollbackFile(InstallFile insFile)
 {
     using (var unzip = new ZipInputStream(new FileStream(insFile.InstallerInfo.TempInstallFolder + insFile.FullName, FileMode.Open)))
     {
         ZipEntry entry = unzip.GetNextEntry();
         while (entry != null)
         {
             entry.CheckZipEntry();
             if (!entry.IsDirectory)
             {
                 //Check for Backups
                 if (File.Exists(insFile.BackupPath + entry.Name))
                 {
                     //Restore File
                     Util.RestoreFile(new InstallFile(unzip, entry, Package.InstallerInfo), PhysicalBasePath, Log);
                 }
                 else
                 {
                     //Delete File
                     Util.DeleteFile(entry.Name, PhysicalBasePath, Log);
                 }
             }
             entry = unzip.GetNextEntry();
         }
     }
 }
Ejemplo n.º 2
0
        public static void ParsePackage(string file, string installPath, Dictionary <string, PackageInfo> packages, List <string> invalidPackages)
        {
            var unzip          = new ZipInputStream(new FileStream(file, FileMode.Open, FileAccess.Read));
            var manifestReader = new StreamReader(unzip);

            try
            {
                ZipEntry entry = unzip.GetNextEntry();
                while (entry != null)
                {
                    entry.CheckZipEntry();
                    if (!entry.IsDirectory)
                    {
                        var    fileName  = entry.Name;
                        string extension = Path.GetExtension(fileName);
                        if (extension != null && (extension.Equals(".dnn", StringComparison.InvariantCultureIgnoreCase) || extension.Equals(".dnn5", StringComparison.InvariantCultureIgnoreCase)))
                        {
                            //Manifest
                            var manifest = manifestReader.ReadToEnd();

                            var package = new PackageInfo {
                                Manifest = manifest
                            };
                            if (!string.IsNullOrEmpty(manifest))
                            {
                                var            doc         = new XPathDocument(new StringReader(manifest));
                                XPathNavigator rootNav     = doc.CreateNavigator().SelectSingleNode("dotnetnuke");
                                string         packageType = String.Empty;
                                if (rootNav.Name == "dotnetnuke")
                                {
                                    packageType = XmlUtils.GetAttributeValue(rootNav, "type");
                                }
                                else if (rootNav.Name.Equals("languagepack", StringComparison.InvariantCultureIgnoreCase))
                                {
                                    packageType = "LanguagePack";
                                }

                                XPathNavigator nav = null;
                                switch (packageType.ToLowerInvariant())
                                {
                                case "package":
                                    nav = rootNav.SelectSingleNode("packages/package");
                                    break;

                                case "module":
                                case "languagepack":
                                case "skinobject":
                                    nav = Installer.ConvertLegacyNavigator(rootNav, new InstallerInfo()).SelectSingleNode("packages/package");
                                    break;
                                }

                                if (nav != null)
                                {
                                    package.Name            = XmlUtils.GetAttributeValue(nav, "name");
                                    package.PackageType     = XmlUtils.GetAttributeValue(nav, "type");
                                    package.IsSystemPackage = XmlUtils.GetAttributeValueAsBoolean(nav, "isSystem", false);
                                    package.Version         = new Version(XmlUtils.GetAttributeValue(nav, "version"));
                                    package.FriendlyName    = XmlUtils.GetNodeValue(nav, "friendlyName");
                                    if (String.IsNullOrEmpty(package.FriendlyName))
                                    {
                                        package.FriendlyName = package.Name;
                                    }
                                    package.Description = XmlUtils.GetNodeValue(nav, "description");
                                    package.FileName    = file.Replace(installPath + "\\", "");

                                    XPathNavigator foldernameNav;
                                    switch (package.PackageType)
                                    {
                                    case "Module":
                                        //In Dynamics moduels, a component:type=File can have a basePath pointing to the App_Conde folder. This is not a correct FolderName
                                        //To ensure that FolderName is DesktopModules...
                                        var folderNameValue = GetSpecificFolderName(nav, "components/component/files|components/component/resourceFiles", "basePath", "DesktopModules");
                                        if (!String.IsNullOrEmpty(folderNameValue))
                                        {
                                            package.FolderName = folderNameValue.Replace('\\', '/');
                                        }
                                        break;

                                    case "Auth_System":
                                        foldernameNav = nav.SelectSingleNode("components/component/files");
                                        if (foldernameNav != null)
                                        {
                                            package.FolderName = Util.ReadElement(foldernameNav, "basePath").Replace('\\', '/');
                                        }
                                        break;

                                    case "Container":
                                        foldernameNav = nav.SelectSingleNode("components/component/containerFiles");
                                        if (foldernameNav != null)
                                        {
                                            package.FolderName = Globals.glbContainersPath + Util.ReadElement(foldernameNav, "containerName").Replace('\\', '/');
                                        }
                                        break;

                                    case "Skin":
                                        foldernameNav = nav.SelectSingleNode("components/component/skinFiles");
                                        if (foldernameNav != null)
                                        {
                                            package.FolderName = Globals.glbSkinsPath + Util.ReadElement(foldernameNav, "skinName").Replace('\\', '/');
                                        }
                                        break;

                                    default:
                                        break;
                                    }

                                    XPathNavigator iconFileNav = nav.SelectSingleNode("iconFile");
                                    if (package.FolderName != string.Empty && iconFileNav != null)
                                    {
                                        if ((iconFileNav.Value != string.Empty) && (package.PackageType.Equals("Module", StringComparison.OrdinalIgnoreCase) || package.PackageType.Equals("Auth_System", StringComparison.OrdinalIgnoreCase) || package.PackageType.Equals("Container", StringComparison.OrdinalIgnoreCase) || package.PackageType.Equals("Skin", StringComparison.OrdinalIgnoreCase)))
                                        {
                                            if (iconFileNav.Value.StartsWith("~/"))
                                            {
                                                package.IconFile = iconFileNav.Value;
                                            }
                                            else if (iconFileNav.Value.StartsWith("DesktopModules", StringComparison.InvariantCultureIgnoreCase))
                                            {
                                                package.IconFile = string.Format("~/{0}", iconFileNav.Value);
                                            }
                                            else
                                            {
                                                package.IconFile = (String.IsNullOrEmpty(package.FolderName) ? "" : package.FolderName + "/") + iconFileNav.Value;
                                                package.IconFile = (!package.IconFile.StartsWith("~/")) ? "~/" + package.IconFile : package.IconFile;
                                            }
                                        }
                                    }

                                    //Parse the Dependencies
                                    foreach (XPathNavigator dependencyNav in nav.CreateNavigator().Select("dependencies/dependency"))
                                    {
                                        var dependency       = DependencyFactory.GetDependency(dependencyNav);
                                        var packageDependecy = dependency as IManagedPackageDependency;

                                        if (packageDependecy != null)
                                        {
                                            package.Dependencies.Add(packageDependecy.PackageDependency);
                                        }
                                    }

                                    packages.Add(file, package);
                                }
                            }

                            break;
                        }
                    }
                    entry = unzip.GetNextEntry();
                }
            }
            catch (Exception)
            {
                invalidPackages.Add(file);
            }
            finally
            {
                manifestReader.Dispose();
                unzip.Close();
                unzip.Dispose();
            }
        }
        /// -----------------------------------------------------------------------------
        /// <summary>
        ///   The InstallFile method installs a single assembly.
        /// </summary>
        /// <param name = "insFile">The InstallFile to install</param>
        protected override bool InstallFile(InstallFile insFile)
        {
            bool retValue = true;

            try
            {
                Log.AddInfo(Util.FILES_Expanding);
                //Create the folder for destination
                _Manifest = insFile.Name + ".manifest";
                if (!Directory.Exists(PhysicalBasePath))
                {
                    Directory.CreateDirectory(PhysicalBasePath);
                }
                using (var unzip = new ZipInputStream(new FileStream(insFile.TempFileName, FileMode.Open)))
                    using (var manifestStream = new FileStream(Path.Combine(PhysicalBasePath, Manifest), FileMode.Create, FileAccess.Write))
                    {
                        var settings = new XmlWriterSettings();
                        settings.ConformanceLevel   = ConformanceLevel.Fragment;
                        settings.OmitXmlDeclaration = true;
                        settings.Indent             = true;

                        using (var writer = XmlWriter.Create(manifestStream, settings))
                        {
                            //Start the new Root Element
                            writer.WriteStartElement("dotnetnuke");
                            writer.WriteAttributeString("type", "ResourceFile");
                            writer.WriteAttributeString("version", "5.0");

                            //Start files Element
                            writer.WriteStartElement("files");

                            ZipEntry entry = unzip.GetNextEntry();
                            while (entry != null)
                            {
                                entry.CheckZipEntry();
                                if (!entry.IsDirectory)
                                {
                                    string fileName = Path.GetFileName(entry.Name);

                                    //Start file Element
                                    writer.WriteStartElement("file");

                                    //Write path
                                    writer.WriteElementString("path",
                                                              entry.Name.Substring(0, entry.Name.IndexOf(fileName)));

                                    //Write name
                                    writer.WriteElementString("name", fileName);

                                    var physicalPath = Path.Combine(PhysicalBasePath, entry.Name);
                                    if (File.Exists(physicalPath))
                                    {
                                        Util.BackupFile(new InstallFile(entry.Name, Package.InstallerInfo),
                                                        PhysicalBasePath,
                                                        Log);
                                    }

                                    Util.WriteStream(unzip, physicalPath);

                                    //Close files Element
                                    writer.WriteEndElement();

                                    Log.AddInfo(string.Format(Util.FILE_Created, entry.Name));
                                }

                                entry = unzip.GetNextEntry();
                            }

                            //Close files Element
                            writer.WriteEndElement();

                            Log.AddInfo(Util.FILES_CreatedResources);
                        }
                    }
            }
            catch (Exception exc)
            {
                Logger.Error(exc);

                retValue = false;
            }
            return(retValue);
        }
Ejemplo n.º 4
0
        private void ReadZipStream(Stream inputStream, bool isEmbeddedZip)
        {
            this.Log.StartJob(Util.FILES_Reading);
            if (inputStream.CanSeek)
            {
                inputStream.Seek(0, SeekOrigin.Begin);
            }

            var      unzip = new ZipInputStream(inputStream);
            ZipEntry entry = unzip.GetNextEntry();

            while (entry != null)
            {
                entry.CheckZipEntry();
                if (!entry.IsDirectory)
                {
                    // Add file to list
                    var file = new InstallFile(unzip, entry, this);
                    if (file.Type == InstallFileType.Resources && (file.Name.Equals("containers.zip", StringComparison.InvariantCultureIgnoreCase) || file.Name.Equals("skins.zip", StringComparison.InvariantCultureIgnoreCase)))
                    {
                        // Temporarily save the TempInstallFolder
                        string tmpInstallFolder = this.TempInstallFolder;

                        // Create Zip Stream from File
                        using (var zipStream = new FileStream(file.TempFileName, FileMode.Open, FileAccess.Read))
                        {
                            // Set TempInstallFolder
                            this.TempInstallFolder = Path.Combine(this.TempInstallFolder, Path.GetFileNameWithoutExtension(file.Name));

                            // Extract files from zip
                            this.ReadZipStream(zipStream, true);
                        }

                        // Restore TempInstallFolder
                        this.TempInstallFolder = tmpInstallFolder;

                        // Delete zip file
                        var zipFile = new FileInfo(file.TempFileName);
                        zipFile.Delete();
                    }
                    else
                    {
                        this.Files[file.FullName.ToLowerInvariant()] = file;
                        if (file.Type == InstallFileType.Manifest && !isEmbeddedZip)
                        {
                            if (this.ManifestFile == null)
                            {
                                this.ManifestFile = file;
                            }
                            else
                            {
                                if (file.Extension == "dnn7" && (this.ManifestFile.Extension == "dnn" || this.ManifestFile.Extension == "dnn5" || this.ManifestFile.Extension == "dnn6"))
                                {
                                    this.ManifestFile = file;
                                }
                                else if (file.Extension == "dnn6" && (this.ManifestFile.Extension == "dnn" || this.ManifestFile.Extension == "dnn5"))
                                {
                                    this.ManifestFile = file;
                                }
                                else if (file.Extension == "dnn5" && this.ManifestFile.Extension == "dnn")
                                {
                                    this.ManifestFile = file;
                                }
                                else if (file.Extension == this.ManifestFile.Extension)
                                {
                                    this.Log.AddFailure(Util.EXCEPTION_MultipleDnn + this.ManifestFile.Name + " and " + file.Name);
                                }
                            }
                        }
                    }

                    this.Log.AddInfo(string.Format(Util.FILE_ReadSuccess, file.FullName));
                }

                entry = unzip.GetNextEntry();
            }

            if (this.ManifestFile == null)
            {
                this.Log.AddFailure(Util.EXCEPTION_MissingDnn);
            }

            if (this.Log.Valid)
            {
                this.Log.EndJob(Util.FILES_ReadingEnd);
            }
            else
            {
                this.Log.AddFailure(new Exception(Util.EXCEPTION_FileLoad));
                this.Log.EndJob(Util.FILES_ReadingEnd);
            }

            // Close the Zip Input Stream as we have finished with it
            inputStream.Close();
        }