示例#1
0
        /// <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));
 }
示例#5
0
        /// <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);
        }
示例#6
0
 /// <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()));
 }
示例#7
0
 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);
            }
        }