public HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {
            if (!HandleRequestWithThisController(request))
            {
                return(PreviousSelector.SelectController(request));
            }

            var routeData          = request.GetRouteData();
            var controllerTypeName = routeData.Values["controller"] + "Controller";

            // Handle the app-api queries
            try
            {
                var appFolder = routeData.Values["apppath"]?.ToString();

                if (appFolder == null)
                {
                    var sexy = Helpers.GetSxcOfApiRequest(request);
                    appFolder = sexy.App.Folder;
                }

                var portalSettings = PortalSettings.Current;
                var controllerPath = Path.Combine(AppHelpers.AppBasePath(portalSettings), appFolder,
                                                  "api/" + controllerTypeName + ".cs");

                if (File.Exists(HostingEnvironment.MapPath(controllerPath)))
                {
                    var assembly = BuildManager.GetCompiledAssembly(controllerPath);
                    var type     = assembly.GetType(controllerTypeName);
                    return(new HttpControllerDescriptor(_config, controllerTypeName, type));
                }
            }
            catch (Exception e)
            {
                var exception = new Exception("Error while selecting / compiling a controller for the request. Pls check the event-log and the code. See the inner exception for more details.", e);
                DotNetNuke.Services.Exceptions.Exceptions.LogException(exception);
                throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.InternalServerError, exception.Message, e));
            }

            throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.NotFound, "Controller " + controllerTypeName + " not found in app."));
        }
        public HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {
            var routeData = request.GetRouteData();
            var module    = request.FindModuleInfo();

            // Handle the app-api queries
            if (routeData.Route.RouteTemplate.Contains("DesktopModules/2sxc/API/app-api/") && module.DesktopModule.ModuleName == "2sxc-app")
            {
                var controllerTypeName = routeData.Values["controller"] + "Controller";

                try
                {
                    var portalSettings = PortalSettings.Current;
                    var sexy           = Helpers.GetSxcOfApiRequest(request);// request.GetSxcOfModuleContext();

                    // previously we assumed that there is a sub-folder with a future-app-id, but 2015-05-15 decided it's probably not worth trying, because each request currently needs tokens anyhow
                    // if ((string) routeData.Values["appFolder"] != "auto-detect-app" && (string) routeData.Values["appFolder"] != sexy.App.Folder)
                    //    throw new HttpException("AppFolder was not correct - was " + routeData.Values["appFolder"] + " but should be " + sexy.App.Folder);

                    var controllerPath = Path.Combine(AppHelpers.AppBasePath(portalSettings), sexy.App.Folder,
                                                      "Api/" + controllerTypeName + ".cs");

                    if (File.Exists(HostingEnvironment.MapPath(controllerPath)))
                    {
                        var assembly = BuildManager.GetCompiledAssembly(controllerPath);
                        var type     = assembly.GetType(controllerTypeName);
                        return(new HttpControllerDescriptor(_config, controllerTypeName, type));
                    }
                }
                catch (Exception e)
                {
                    var exception = new Exception("Error while selecting / compiling a controller for the request. See the inner exception for more details.", e);
                    DotNetNuke.Services.Exceptions.Exceptions.LogException(exception);
                }

                throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.NotFound, "Controller " + controllerTypeName + " not found in app."));
            }
            return(PreviousSelector.SelectController(request));
        }
Beispiel #3
0
        /// <summary>
        /// Imports a ZIP file (from stream)
        /// </summary>
        /// <param name="zipStream"></param>
        /// <param name="server"></param>
        /// <param name="portalSettings"></param>
        /// <param name="messages"></param>
        /// <returns></returns>
        public bool ImportZip(Stream zipStream, HttpServerUtility server, PortalSettings portalSettings, List <ExportImportMessage> messages)
        {
            if (messages == null)
            {
                messages = new List <ExportImportMessage>();
            }

            var temporaryDirectory = server.MapPath(Path.Combine(Settings.TemporaryDirectory, Guid.NewGuid().ToString()));
            var success            = true;

            try
            {
                if (!Directory.Exists(temporaryDirectory))
                {
                    Directory.CreateDirectory(temporaryDirectory);
                }

                // Extract ZIP archive to the temporary folder
                ExtractZipFile(zipStream, temporaryDirectory);

                var currentWorkingDir = temporaryDirectory;
                var baseDirectories   = Directory.GetDirectories(currentWorkingDir);

                // Loop through each root-folder. For now only contains the "Apps" folder.
                foreach (var directoryPath in baseDirectories)
                {
                    switch (Path.GetFileName(directoryPath))
                    {
                    // Handle the App folder
                    case "Apps":
                        currentWorkingDir = Path.Combine(currentWorkingDir, "Apps");

                        // Loop through each app directory
                        foreach (var appDirectory in Directory.GetDirectories(currentWorkingDir))
                        {
                            var appId = new int?();

                            // Stores the number of the current xml file to process
                            var xmlIndex = 0;

                            // Import XML file(s)
                            foreach (var xmlFileName in Directory.GetFiles(appDirectory, "*.xml"))
                            {
                                var fileContents = File.ReadAllText(Path.Combine(appDirectory, xmlFileName));
                                var doc          = XDocument.Parse(fileContents);
                                var import       = new XmlImport(PortalSettings.Current.DefaultLanguage, Environment.Dnn7.UserIdentity.CurrentUserIdentityToken /*PortalSettings.Current.UserInfo.Username*/);

                                if (!import.IsCompatible(doc))
                                {
                                    throw new Exception("The app / package is not compatible with this version of 2sxc.");
                                }

                                var isAppImport = doc.Element("SexyContent").Element("Header").Elements("App").Any() && doc.Element("SexyContent").Element("Header").Element("App").Attribute("Guid").Value != "Default";

                                if (!isAppImport && !_appId.HasValue)
                                {
                                    _appId = ((BaseCache)DataSource.GetCache(_zoneId)).ZoneApps[_zoneId].DefaultAppId;
                                }

                                if (isAppImport)
                                {
                                    var appConfig = XDocument.Parse(fileContents).Element("SexyContent")
                                                    .Element("Entities")
                                                    .Elements("Entity")
                                                    .Single(e => e.Attribute("AttributeSetStaticName").Value == "2SexyContent-App");

                                    #region Version Checks (new in 08.03.03)
                                    var reqVersionNode    = appConfig.Elements("Value")?.FirstOrDefault(v => v.Attribute("Key").Value == "RequiredVersion")?.Attribute("Value")?.Value;
                                    var reqVersionNodeDnn = appConfig.Elements("Value")?.FirstOrDefault(v => v.Attribute("Key").Value == "RequiredDnnVersion")?.Attribute("Value")?.Value;

                                    CheckRequiredEnvironmentVersions(reqVersionNode, reqVersionNodeDnn);

                                    #endregion
                                    var folder = appConfig.Elements("Value").First(v => v.Attribute("Key").Value == "Folder").Attribute("Value").Value;

                                    var appPath = Path.Combine(AppHelpers.AppBasePath(PortalSettings.Current), folder);

                                    // Do not import (throw error) if the app directory already exists
                                    if (Directory.Exists(HttpContext.Current.Server.MapPath(appPath)))
                                    {
                                        throw new Exception("The app could not be installed because the app-folder '" + appPath + "' already exists. Please remove or rename the folder and install the app again.");
                                    }

                                    if (xmlIndex == 0)
                                    {
                                        // Handle PortalFiles folder
                                        var portalTempRoot = Path.Combine(appDirectory, "PortalFiles");
                                        if (Directory.Exists(portalTempRoot))
                                        {
                                            CopyAllFilesDnnPortal(portalTempRoot, "", false, messages);
                                        }
                                    }

                                    import.ImportApp(_zoneId, doc, out appId);
                                }
                                else
                                {
                                    appId = _appId.Value;
                                    if (xmlIndex == 0 && import.IsCompatible(doc))
                                    {
                                        // Handle PortalFiles folder
                                        var portalTempRoot = Path.Combine(appDirectory, "PortalFiles");
                                        if (Directory.Exists(portalTempRoot))
                                        {
                                            CopyAllFilesDnnPortal(portalTempRoot, "", false, messages);
                                        }
                                    }

                                    import.ImportXml(_zoneId, appId.Value, doc);
                                }


                                messages.AddRange(import.ImportLog);

                                xmlIndex++;
                            }

                            //var sexy = new SxcInstance(_zoneId, appId.Value);
                            var app = new App(_zoneId, appId.Value, PortalSettings.Current, false);

                            // Copy all files in 2sexy folder to (portal file system) 2sexy folder
                            var templateRoot    = server.MapPath(Internal.TemplateManager.GetTemplatePathRoot(Settings.TemplateLocations.PortalFileSystem, app));
                            var appTemplateRoot = Path.Combine(appDirectory, "2sexy");
                            if (Directory.Exists(appTemplateRoot))
                            {
                                (new FileManager(appTemplateRoot)).CopyAllFiles(templateRoot, false, messages);
                            }
                        }

                        // Reset CurrentWorkingDir
                        currentWorkingDir = temporaryDirectory;
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                // Add error message and return false
                messages.Add(new ExportImportMessage("Could not import the app / package: " + e.Message, ExportImportMessage.MessageTypes.Error));
                Exceptions.LogException(e);
                success = false;
            }
            finally
            {
                try
                {
                    // Finally delete the temporary directory
                    Directory.Delete(temporaryDirectory, true);
                }
                catch (Exception ex) when(ex is FormatException || ex is OverflowException)
                {
                    // The folder itself or files inside may be used by other processes.
                    // Deleting the folder recursively will fail in such cases
                    // If deleting is not possible, just leave the temporary folder as it is
                }
            }

            return(success);
        }
        public string TargetPath(string folder)
        {
            var appPath = Path.Combine(AppHelpers.AppBasePath(null), folder);

            return(HttpContext.Current.Server.MapPath(appPath));
        }