/// <summary> /// Validates that the backup file specified in the <see cref="IBackupFile.FilePath"/> property of the <paramref name="backupFile"/> /// parameter is valid and populates the remaining properties with information about the file. /// </summary> /// <param name="backupFile">An instance of <see cref="IBackupFile"/> that with only the <see cref="IBackupFile.FilePath"/> /// property assigned. The remaining properties should be uninitialized since they will be assigned in this method.</param> /// <remarks>Note that this function attempts to extract the number of records from each table in the backup file. Any exceptions /// that occur during this process are caught and trigger the <see cref="IBackupFile.IsValid" /> property to be set to false. If the extraction is /// successful, then the file is assumed to be valid and the <see cref="IBackupFile.IsValid" /> property is set to <c>true</c>.</remarks> internal static void ValidateBackupFile(ref IBackupFile backupFile) { try { using (DataSet ds = GenerateDataSet(backupFile.FilePath)) { string[] tableNames = new string[] { "aspnet_Applications", "aspnet_Profile", "aspnet_Roles", "aspnet_Membership", "aspnet_Users", "aspnet_UsersInRoles", "gs_Gallery", "gs_Album", "gs_MediaObject", "gs_MediaObjectMetadata", "gs_Role_Album", "gs_Role", "gs_AppError", "gs_AppSetting", "gs_GalleryControlSetting", "gs_GallerySetting", "gs_BrowserTemplate", "gs_MimeType", "gs_MimeTypeGallery", "gs_UserGalleryProfile" }; foreach (string tableName in tableNames) { DataTable table = ds.Tables[tableName]; backupFile.DataTableRecordCount.Add(tableName, table.Rows.Count); } backupFile.SchemaVersion = GetDataSchemaVersionString(); if (backupFile.SchemaVersion == GalleryDataSchemaVersionEnumHelper.ConvertGalleryDataSchemaVersionToString(GalleryDataSchemaVersion.V2_6_0)) { backupFile.IsValid = true; } } } catch { backupFile.IsValid = false; } }
/// <summary> /// Generate an encrypted version key based on the current version and the specified <paramref name="licenseLevel" />. /// This code can be used to generate AppSetting.VersionKey values. /// </summary> /// <param name="licenseLevel">The license level.</param> /// <returns>System.String.</returns> public static string GenerateEncryptedVersionKey(LicenseLevel licenseLevel) { var version = GalleryDataSchemaVersionEnumHelper.ConvertGalleryDataSchemaVersionToString(HelperFunctions.GetGalleryServerVersion()); var key = new Entity.VersionKey() { ProductId = licenseLevel, Version = version }; var keyJson = JsonConvert.SerializeObject(key); return(Utils.Encrypt(keyJson, GlobalConstants.ENCRYPTION_KEY)); }
/// <summary> /// Gets the data schema version of the database. May return null. Examples: "2.3.3421", "2.4.1" /// </summary> /// <returns>Returns an instance of <see cref="GalleryDataSchemaVersion"/> containing the database version.</returns> public static GalleryDataSchemaVersion GetDataSchemaVersion(DataSet ds) { var asTableNames = new[] { "AppSetting", "gs_AppSetting" }; const string filter = "SettingName = 'DataSchemaVersion'"; foreach (var asTableName in asTableNames) { if (!ds.Tables.Contains(asTableName)) { continue; } var dr = ds.Tables[asTableName].Select(filter).FirstOrDefault(); if (dr == null) { throw new Exception(String.Format("The table {0} does not contain a row where {1}.", asTableName, filter)); } return(GalleryDataSchemaVersionEnumHelper.ConvertGalleryDataSchemaVersionToEnum(dr["SettingValue"].ToString())); } throw new Exception(String.Format("The backup file does not contain one of the following required tables: {0} or {1}.", asTableNames[0], asTableNames[1])); }
/// <summary> /// Returns the current data schema version as defined in the AppSetting table. /// </summary> /// <returns>An instance of <see cref="GalleryDataSchemaVersion" /> indicating the current data schema version /// as defined in the AppSetting table.</returns> private static GalleryDataSchemaVersion GetCurrentSchema(GalleryDb ctx) { return(GalleryDataSchemaVersionEnumHelper.ConvertGalleryDataSchemaVersionToEnum(ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion").SettingValue)); }
/// <summary> /// Validate the version key and assign the <see cref="LicenseType" /> property based on the value from the version key. /// If no version key is found or contains invalid data, <see cref="KeyInvalidReason" /> is updated with the error message. /// </summary> /// <returns><c>true</c> if the current app is running the version found in the version key, <c>false</c> otherwise.</returns> /// <remarks></remarks> private bool ValidateVersionKey() { // Check AppSetting.VersionKey or version_key.txt. Verify version matches DLL version. var versionKeyStr = RetrieveVersionKeyFromTextFile(); if (string.IsNullOrWhiteSpace(versionKeyStr)) { versionKeyStr = AppSetting.Instance.VersionKey; if (string.IsNullOrWhiteSpace(versionKeyStr)) { KeyInvalidReason = "Missing version_key.txt file. Download this file from your <a href='https://galleryserverpro.com/my-account/'>subscription downloads</a> and copy it to the App_Data directory. "; IsValid = false; LicenseType = LicenseLevel.NotSet; return(false); } } else { // We found version_key.txt. Update our AppSetting and then delete the file. lock (_sharedLock) { AppSetting.Instance.VersionKey = versionKeyStr; AppSetting.Instance.Save(); } try { File.Delete(VersionKeyFilePath); } catch (Exception ex) { ex.Data.Add("Info", $"Could not delete the file {VersionKeyFilePath}. Delete it manually."); EventController.RecordError(ex, AppSetting.Instance, null, Factory.LoadGallerySettings()); } } string versionKeyJson; try { versionKeyJson = Utils.Decrypt(versionKeyStr, GlobalConstants.ENCRYPTION_KEY); } catch (Exception ex) { ex.Data.Add("EncryptedVersionKey", versionKeyStr); EventController.RecordError(ex, AppSetting.Instance, null, Factory.LoadGallerySettings()); IsValid = false; KeyInvalidReason = "An error occurred while trying to decrypt the version key. The event log contains additional details."; return(false); } VersionKey versionKey; try { versionKey = JsonConvert.DeserializeObject <VersionKey>(versionKeyJson); } catch (Exception ex) { ex.Data.Add("EncryptedVersionKey", versionKeyStr); ex.Data.Add("DecryptedVersionKey", versionKeyJson); EventController.RecordError(ex, AppSetting.Instance, null, Factory.LoadGallerySettings()); IsValid = false; KeyInvalidReason = "An error occurred while trying to convert the decrypted version key to an instance of VersionKey. The event log contains additional details."; return(false); } var appVersion = GalleryDataSchemaVersionEnumHelper.ConvertGalleryDataSchemaVersionToString(HelperFunctions.GetGalleryServerVersion()); if (versionKey.Version == appVersion) { Version = versionKey.Version; LicenseType = versionKey.ProductId; return(true); } // I don't think we'll typically get here because EF Migrations should clear out the VersionKey, but better safe than sorry. KeyInvalidReason = $"You are running version {appVersion} but your license is associated with {versionKey.Version}. Download an updated version_key.txt from your <a href='https://galleryserverpro.com/my-account/'>subscriptions</a> page, copy it to the App_Data directory, and recycle the application pool."; return(false); }
/// <summary> /// Gets the version of the objects in the database as reported by the database. If the version cannot be parsed into one of the /// <see cref="GalleryDataSchemaVersion" /> values, then GalleryDataSchemaVersion.Unknown is returned. /// </summary> /// <returns>Returns an instance of <see cref="GalleryDataSchemaVersion" /> representing the version of the objects in the database.</returns> internal static GalleryDataSchemaVersion GetDataSchemaVersion() { return(GalleryDataSchemaVersionEnumHelper.ConvertGalleryDataSchemaVersionToEnum(GetDataSchemaVersionString())); }
private void ExtractVersion() { _eventData.Add(new KeyValuePair <string, string>("Version", GalleryDataSchemaVersionEnumHelper.ConvertGalleryDataSchemaVersionToString(Data.GalleryDb.DataSchemaVersion))); }
private void ConfigureBackupFileInfo(IBackupFile backupFile) { if (backupFile == null) { lblRestoreFilename.Text = Resources.GalleryServerPro.Admin_Backup_Restore_File_Not_Uploaded_Msg; lblRestoreFilename.CssClass = "gsp_msgwarning"; lblNumApps.Text = String.Empty; lblNumProfiles.Text = String.Empty; lblNumRoles.Text = String.Empty; lblNumMembers.Text = String.Empty; lblNumUsers.Text = String.Empty; lblNumUsersInRoles.Text = String.Empty; lblNumGalleries.Text = String.Empty; lblNumAlbums.Text = String.Empty; lblNumMediaObjects.Text = String.Empty; lblNumMetadata.Text = String.Empty; lblNumTag.Text = String.Empty; lblNumMetadataTag.Text = String.Empty; lblNumRoleAlbums.Text = String.Empty; lblNumAppSettings.Text = String.Empty; lblNumGalleryControlSettings.Text = String.Empty; lblNumGallerySettings.Text = String.Empty; lblNumBrowserTemplates.Text = String.Empty; lblNumMimeTypes.Text = String.Empty; lblNumMimeTypeGalleries.Text = String.Empty; lblNumGalleryRoles.Text = String.Empty; lblNumUiTemplates.Text = String.Empty; lblNumUiTemplateAlbums.Text = String.Empty; lblNumUserGalleryProfiles.Text = String.Empty; btnRestore.Enabled = false; imgValidationResult.Visible = false; lblValidationResult.Text = String.Empty; lblValidationResult.CssClass = String.Empty; lbRemoveRestoreFile.Visible = false; return; } lblRestoreFilename.Text = Path.GetFileName(backupFile.FilePath); var tableNames = backupFile.MembershipTables.Concat(backupFile.GalleryTableNames); var dataRecords = backupFile.DataTableRecordCount; foreach (var tableName in tableNames) { switch (tableName) { case "Applications": lblNumApps.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); chkImportMembership.Checked = (dataRecords.ContainsKey(tableName) && backupFile.DataTableRecordCount[tableName] > 0); break; case "Profiles": lblNumProfiles.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "Roles": lblNumRoles.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "Memberships": lblNumMembers.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "Users": lblNumUsers.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "UsersInRoles": lblNumUsersInRoles.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "Gallery": lblNumGalleries.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); chkImportGalleryData.Checked = (dataRecords.ContainsKey(tableName) && backupFile.DataTableRecordCount[tableName] > 0); break; case "Album": lblNumAlbums.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "MediaObject": lblNumMediaObjects.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "Metadata": lblNumMetadata.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "Tag": //** lblNumTag.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "MetadataTag": //** lblNumMetadataTag.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "RoleAlbum": lblNumRoleAlbums.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "Role": lblNumGalleryRoles.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "AppSetting": lblNumAppSettings.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "GalleryControlSetting": lblNumGalleryControlSettings.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "GallerySetting": lblNumGallerySettings.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "MediaTemplate": lblNumBrowserTemplates.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "MimeType": lblNumMimeTypes.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "MimeTypeGallery": lblNumMimeTypeGalleries.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "UiTemplate": lblNumUiTemplates.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "UiTemplateAlbum": lblNumUiTemplateAlbums.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; case "UserGalleryProfile": lblNumUserGalleryProfiles.Text = (dataRecords.ContainsKey(tableName) ? backupFile.DataTableRecordCount[tableName].ToString(CultureInfo.CurrentCulture) : String.Empty); break; } } if (backupFile.IsValid) { btnRestore.Enabled = true; imgValidationResult.ImageUrl = Utils.GetSkinnedUrl("/images/arrow-right-open-s.png"); imgValidationResult.Visible = true; lblValidationResult.Text = Resources.GalleryServerPro.Admin_Backup_Restore_File_Valid_Msg; lblValidationResult.CssClass = "gsp_msgsuccess"; lblRestoreFilename.CssClass = "gsp_msgattention"; lbRemoveRestoreFile.Visible = true; lblSchemaVersion.Text = GalleryDataSchemaVersionEnumHelper.ConvertGalleryDataSchemaVersionToString(backupFile.SchemaVersion); ViewState["FilePath"] = backupFile.FilePath; } else { btnRestore.Enabled = false; imgValidationResult.ImageUrl = Utils.GetSkinnedUrl("/images/warning-s.png"); imgValidationResult.Visible = true; lblValidationResult.Text = Resources.GalleryServerPro.Admin_Backup_Restore_File_Not_Valid_Msg; lblValidationResult.CssClass = "gsp_msgfailure"; lblRestoreFilename.CssClass = "gsp_msgattention"; lbRemoveRestoreFile.Visible = false; lblSchemaVersion.Text = GalleryDataSchemaVersionEnumHelper.ConvertGalleryDataSchemaVersionToString(backupFile.SchemaVersion); } }