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)); }
/// <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)); }