using System; using System.Collections; using System.Data; using System.Security.Principal; using CMS.CMSHelper; using CMS.CMSImportExport; using CMS.EventLog; using CMS.GlobalHelper; using CMS.IO; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.UIControls; public partial class CMSModules_ImportExport_SiteManager_ExportObject : CMSModalPage { #region "Variables" protected string codeName = null; protected string exportObjectDisplayName = null; protected string targetFolder = null; protected string targetUrl = null; protected bool allowDependent = false; protected bool siteObject = false; protected int objectId = 0; protected string objectType = string.Empty; protected GeneralizedInfo infoObj = null; protected GeneralizedInfo exportObj = null; protected bool backup = false; #endregion #region "Public properties" /// /// Export process GUID. /// public Guid ProcessGUID { get { if (ViewState["ProcessGUID"] == null) { ViewState["ProcessGUID"] = Guid.NewGuid(); } return ValidationHelper.GetGuid(ViewState["ProcessGUID"], Guid.Empty); } } /// /// Persistent settings key. /// public string PersistentSettingsKey { get { return "ExportObject_" + ProcessGUID + "_Settings"; } } /// /// Export settings stored in viewstate. /// public SiteExportSettings ExportSettings { get { SiteExportSettings settings = (SiteExportSettings)PersistentStorageHelper.GetValue(PersistentSettingsKey); if (settings == null) { throw new Exception("[ExportObject.ExportSettings]: Export settings has been lost."); } return settings; } set { PersistentStorageHelper.SetValue(PersistentSettingsKey, value); } } #endregion protected override void OnPreInit(EventArgs e) { base.OnPreInit(e); if (!DebugHelper.DebugImportExport) { DisableDebugging(); } } protected void Page_Load(object sender, EventArgs e) { backup = QueryHelper.GetBoolean("backup", false); // Check permissions if (backup) { if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.globalpermissions", "BackupObjects", CMSContext.CurrentSiteName)) { RedirectToCMSDeskAccessDenied("cms.globalpermissions", "BackupObjects"); } } else if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.globalpermissions", "ExportObjects", CMSContext.CurrentSiteName)) { RedirectToCMSDeskAccessDenied("cms.globalpermissions", "ExportObjects"); } // Register script for pendingCallbacks repair ScriptHelper.FixPendingCallbacks(Page); // Async control events binding ucAsyncControl.OnFinished += ucAsyncControl_OnFinished; ucAsyncControl.OnError += ucAsyncControl_OnError; if (!IsCallback) { try { // Delete temporary files ExportProvider.DeleteTemporaryFiles(); } catch (Exception ex) { DisplayError(ex); } if (backup) { SetTitle("CMSModules/CMS_ImportExport/backupobject.png", GetString("BackupObject.Title"), null, null); } else { SetTitle("CMSModules/CMS_ImportExport/exportobject.png", GetString("ExportObject.Title"), null, null); } // Display BETA warning lblBeta.Visible = CMSContext.IsBetaVersion(); lblBeta.Text = string.Format(GetString("export.BETAwarning"), CMSContext.GetFriendlySystemVersion(false)); // Get data from parameters objectId = ValidationHelper.GetInteger(Request.QueryString["objectId"], 0); objectType = ValidationHelper.GetString(Request.QueryString["objectType"], ""); // Get the object infoObj = CMSObjectHelper.GetReadOnlyObject(objectType); if (infoObj == null) { plcExportDetails.Visible = false; lblIntro.Text = GetString("ExportObject.ObjectTypeNotFound"); lblIntro.CssClass = "ErrorLabel"; return; } // Get exported object exportObj = infoObj.GetObject(objectId); if (exportObj == null) { plcExportDetails.Visible = false; lblIntro.Text = GetString("ExportObject.ObjectNotFound"); lblIntro.CssClass = "ErrorLabel"; btnOk.Visible = false; return; } // Check permissions var info = (BaseInfo) exportObj; if (!CurrentUser.IsGlobalAdministrator) { try { if (info.Generalized.ObjectSiteID > 0) { CurrentUser.IsAuthorizedPerObject(PermissionsEnum.Read, info, SiteInfoProvider.GetSiteName(info.Generalized.ObjectSiteID), true); } else if ((info.TypeInfo.SiteBindingObject != null) && (info.AssignedSites[CurrentSiteName] == null)) { // Do not allow to clone objects with site binding which are not assigned to current site RedirectToCMSDeskAccessDenied(info.TypeInfo.ModuleName, PermissionsEnum.Read.ToString()); } else { CurrentUser.IsAuthorizedPerObject(PermissionsEnum.Read, info, CurrentSiteName, true); } } catch (PermissionCheckException ex) { RedirectToCMSDeskAccessDenied(ex.ModuleName, ex.PermissionFailed); } } // Store display name exportObjectDisplayName = HTMLHelper.HTMLEncode(exportObj.ObjectDisplayName); if (backup) { lblIntro.Text = string.Format(GetString("BackupObject.Intro"), ResHelper.LocalizeString(exportObjectDisplayName)); } else { lblIntro.Text = string.Format(GetString("ExportObject.Intro"), ResHelper.LocalizeString(exportObjectDisplayName)); } btnOk.Click += btnOk_Click; if (!RequestHelper.IsPostBack()) { lblIntro.Visible = true; lblFileName.Visible = true; txtFileName.Text = GetExportFileName(exportObj, backup); if (backup) { btnOk.Text = GetString("General.backup"); } else { btnOk.Text = GetString("General.export"); } btnCancel.Text = GetString("General.Close"); } string path = null; if (backup) { path = ImportExportHelper.GetObjectBackupFolder(exportObj); targetFolder = Server.MapPath(path); targetUrl = ResolveUrl(path) + "/" + txtFileName.Text; } else { targetFolder = ImportExportHelper.GetSiteUtilsFolder() + "Export"; path = ImportExportHelper.GetSiteUtilsFolderRelativePath(); if (path != null) { string externalUrl = null ; string fullPath = path + "Export/" + txtFileName.Text; // Handle external storage URL if (StorageHelper.IsExternalStorage(fullPath)) { externalUrl = File.GetFileUrl(fullPath, CMSContext.CurrentSiteName); } // Ensure default target URL if not set if (string.IsNullOrEmpty(externalUrl)) { targetUrl = ResolveUrl(path) + "Export/" + txtFileName.Text; } else { targetUrl = externalUrl; } } else { targetUrl = null; } } } } private void DisplayError(Exception ex) { pnlProgress.Visible = false; btnOk.Enabled = false; pnlDetails.Visible = false; pnlContent.Visible = true; string displayName = null; if (exportObj != null) { displayName = exportObj.ObjectDisplayName; } lblResult.Text = string.Format(GetString("ExportObject.Error"), ResHelper.LocalizeString(HTMLHelper.HTMLEncode(displayName)), ex.Message); lblResult.ToolTip = EventLogProvider.GetExceptionLogMessage(ex); lblResult.CssClass = "ErrorLabel"; EventLogProvider ev = new EventLogProvider(); ev.LogEvent("Export", "ExportObject", ex); } private void btnOk_Click(object sender, EventArgs e) { // Init the Mimetype helper (required for the export) MimeTypeHelper.LoadMimeTypes(); // Prepare the settings ExportSettings = new SiteExportSettings(CMSContext.CurrentUser); ExportSettings.WebsitePath = Server.MapPath("~/"); ExportSettings.TargetPath = targetFolder; // Initialize ImportExportHelper.InitSingleObjectExportSettings(ExportSettings, exportObj); string result = ImportExportHelper.ValidateExportFileName(ExportSettings, txtFileName.Text); // Filename is valid if (!string.IsNullOrEmpty(result)) { lblError.Text = result; } else { txtFileName.Text = txtFileName.Text.Trim(); // Add extension if (Path.GetExtension(txtFileName.Text).ToLowerCSafe() != ".zip") { txtFileName.Text = txtFileName.Text.TrimEnd('.') + ".zip"; } // Set the filename lblProgress.Text = string.Format(GetString("ExportObject.ExportProgress"), ResHelper.LocalizeString(exportObjectDisplayName)); ExportSettings.TargetFileName = txtFileName.Text; pnlContent.Visible = false; pnlDetails.Visible = false; btnOk.Enabled = false; pnlProgress.Visible = true; try { // Export the data ltlScript.Text = ScriptHelper.GetScript("StartTimer();"); ucAsyncControl.RunAsync(ExportSingleObject, WindowsIdentity.GetCurrent()); } catch (Exception ex) { DisplayError(ex); } } } // Export object private void ExportSingleObject(object parameter) { // Export object ExportProvider.ExportObjectsData(ExportSettings); } private void ucAsyncControl_OnError(object sender, EventArgs e) { ltlScript.Text += ScriptHelper.GetScript("StopTimer();"); Exception ex = ((CMSAdminControls_AsyncControl)sender).Worker.LastException; DisplayError(ex); } private void ucAsyncControl_OnFinished(object sender, EventArgs e) { ltlScript.Text += ScriptHelper.GetScript("StopTimer();"); pnlProgress.Visible = false; btnOk.Visible = false; pnlContent.Visible = true; lblResult.CssClass = "ContentLabel"; string path = targetUrl; // Display full path if ((path == null) || StorageHelper.IsExternalStorage(targetFolder)) { path = DirectoryHelper.CombinePath(targetFolder, txtFileName.Text); } if (!backup) { lblResult.Text = string.Format(GetString("ExportObject.lblResult"), ResHelper.LocalizeString(exportObjectDisplayName), path); if (targetUrl != null) { lnkDownload.NavigateUrl = targetUrl; lnkDownload.Text = GetString("ExportObject.Download"); lnkDownload.Visible = true; } } else { lblResult.Text = string.Format(GetString("ExportObject.BackupFinished"), ResHelper.LocalizeString(exportObjectDisplayName), path); } } protected override void OnPreRender(EventArgs e) { lblResult.Visible = (lblResult.Text != ""); base.OnPreRender(e); } /// /// Ensure user friendly file name /// /// Object to be exported /// Indicates if export is treated as backup private string GetExportFileName(GeneralizedInfo infoObj, bool backup) { string fileName = null; // Get file name accrding to accesible object properties if (infoObj.TypeInfo.CodeNameColumn != TypeInfo.COLUMN_NAME_UNKNOWN) { fileName = infoObj.ObjectCodeName; } else if (infoObj.TypeInfo.DisplayNameColumn != TypeInfo.COLUMN_NAME_UNKNOWN) { fileName = ValidationHelper.GetCodeName(infoObj.ObjectDisplayName); } else { fileName = ValidationHelper.GetCodeName(infoObj.ObjectGUID.ToString()); } fileName = fileName.Replace(".", "_") + "_" + DateTime.Now.ToString("yyyyMMdd") + "_" + DateTime.Now.ToString("HHmm") + ".zip"; fileName = ValidationHelper.GetSafeFileName(fileName); // Backup use short file name, in other cases use long file name with object type if (!backup) { string objectType = infoObj.TypeInfo.Inherited ? infoObj.TypeInfo.OriginalObjectType : infoObj.ObjectType; fileName = objectType.Replace(".", "_") + "_" + fileName; } return fileName; } }