Beispiel #1
0
        public string GetHeader()
        {
            BasicSettings basicSettings = Engine.Settings.Basic;

            Models.MailSettings mailSettings = Engine.Settings.Mail;

            if (!Title.IsSet())
            {
                Title = basicSettings.FullTitle;
            }

            if (!Logo.IsSet())
            {
                if (mailSettings.Logo.IsSet())
                {
                    Logo = mailSettings.Logo;
                }
                else
                if (basicSettings.Logo.IsSet())
                {
                    Logo = basicSettings.Logo;
                }
            }

            if (Logo.IsSet())
            {
                return
                    (@$ "<tr>
                    <td style='background-color:{TextAreaColour};padding:{MailPadding};text-align:{LogoAlign}'>
Beispiel #2
0
        public async virtual Task Seed()
        {
            try
            {
                Option option = await Options.FirstOrDefaultAsync();
            }
            catch (SqlException ex)
            {
                if (ex.Message.Contains("Login failed for user") || ex.Message.Contains("permission was denied"))
                {
                    throw new StartupException("There was a problem connecting to the database.", ex, StartupError.DatabaseConnectionFailed);
                }
                else if (ex.Message.Contains("Invalid object name"))
                {
                    throw new StartupException("There are migrations missing.", ex, StartupError.MigrationMissing);
                }
            }

            try
            {
                string ownerEmail = Engine.SiteOwnerEmail;
                if (!Users.Any(u => u.UserName == ownerEmail))
                {
                    ApplicationUser userToInsert = new ApplicationUser
                    {
                        CompanyName       = "",
                        CreatedOn         = DateTime.UtcNow,
                        FirstName         = "Website",
                        LastName          = "Administrator",
                        EmailConfirmed    = true,
                        Anonymous         = false,
                        PhoneNumber       = "",
                        JobTitle          = "Website Administrator",
                        LastLogOn         = DateTime.UtcNow,
                        LastLoginIP       = "127.0.0.1",
                        LastLoginLocation = "UK",
                        Email             = ownerEmail,
                        UserName          = ownerEmail,
                        Active            = true
                    };
                    var            keygen   = new KeyGenerator();
                    var            password = keygen.Generate(16);
                    IdentityResult ir       = await Engine.AccountManager.CreateAsync(userToInsert, password);

                    var tempPasswordFile = Engine.Services.Resolve <IWebHostEnvironment>().ContentRootPath + "/temp.txt";
                    if (File.Exists(tempPasswordFile))
                    {
                        File.Delete(tempPasswordFile);
                    }
                    using (StreamWriter file = new(tempPasswordFile))
                    {
                        await file.WriteLineAsync(password);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new StartupException("An error occurred while loading or creating the admin user.", ex, StartupError.AdminUserSetupError);
            }

            ApplicationUser siteAdmin = await Engine.AccountManager.GetUserByEmailAsync(Engine.SiteOwnerEmail);

            try
            {
                var roleManager = Engine.Services.Resolve <RoleManager <ApplicationRole> >();
                var userManager = Engine.Services.Resolve <UserManager <ApplicationUser> >();
                if (Engine.AccountManager.SupportsRoles())
                {
                    // Check all required roles exist locally
                    foreach (string role in Models.Roles.All)
                    {
                        if (!await roleManager.RoleExistsAsync(role))
                        {
                            await Engine.AccountManager.CreateRoleAsync(role);
                        }
                        else
                        {
                            // If it does exist locally, ensure it has a remote id linked to it.
                            var localRole = await roleManager.FindByNameAsync(role);

                            if (!localRole.RemoteId.IsSet())
                            {
                                await Engine.AccountManager.CreateRoleAsync(role);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new StartupException("An error occurred syncing local roles with Auth0.", ex, StartupError.Auth0Issue);
            }

            if (!Options.Any(o => o.Id == "Hood.Settings.SiteOwner"))
            {
                Options.Add(new Option
                {
                    Id    = "Hood.Settings.SiteOwner",
                    Value = siteAdmin.Id
                });
            }

            if (!MediaDirectories.Any(o => o.Slug == MediaManager.SiteDirectorySlug && o.Type == DirectoryType.System))
            {
                MediaDirectories.Add(new MediaDirectory {
                    DisplayName = "Default", Slug = MediaManager.SiteDirectorySlug, OwnerId = siteAdmin.Id, Type = DirectoryType.System
                });
            }

            if (!MediaDirectories.Any(o => o.Slug == MediaManager.UserDirectorySlug && o.Type == DirectoryType.System))
            {
                MediaDirectories.Add(new MediaDirectory {
                    DisplayName = "User Media", Slug = MediaManager.UserDirectorySlug, OwnerId = siteAdmin.Id, Type = DirectoryType.System
                });
            }

            if (!MediaDirectories.Any(o => o.Slug == MediaManager.ContentDirectorySlug && o.Type == DirectoryType.System))
            {
                MediaDirectories.Add(new MediaDirectory {
                    DisplayName = "Content", Slug = MediaManager.ContentDirectorySlug, OwnerId = siteAdmin.Id, Type = DirectoryType.System
                });
            }

            if (!MediaDirectories.Any(o => o.Slug == MediaManager.PropertyDirectorySlug && o.Type == DirectoryType.System))
            {
                MediaDirectories.Add(new MediaDirectory {
                    DisplayName = "Property", Slug = MediaManager.PropertyDirectorySlug, OwnerId = siteAdmin.Id, Type = DirectoryType.System
                });
            }

            if (!Options.Any(o => o.Id == "Hood.Settings.Theme"))
            {
                Options.Add(new Option {
                    Id = "Hood.Settings.Theme", Value = JsonConvert.SerializeObject("default")
                });
            }

            if (!Options.Any(o => o.Id == typeof(AccountSettings).ToString()))
            {
                // No new settings exist, attempt to copy from deprecated settings, or set new.
                if (Options.Any(o => o.Id == "Hood.Settings.Account"))
                {
                    Option          option  = Options.Find("Hood.Settings.Account");
                    AccountSettings setting = JsonConvert.DeserializeObject <AccountSettings>(option.Value);
                    Options.Add(new Option {
                        Id = typeof(AccountSettings).ToString(), Value = JsonConvert.SerializeObject(setting)
                    });
                }
                else
                {
                    Options.Add(new Option {
                        Id = typeof(AccountSettings).ToString(), Value = JsonConvert.SerializeObject(new AccountSettings())
                    });
                }
            }

            if (!Options.Any(o => o.Id == typeof(BasicSettings).ToString()))
            {
                // No new settings exist, attempt to copy from deprecated settings, or set new.
                if (Options.Any(o => o.Id == "Hood.Settings.Basic"))
                {
                    Option        option  = Options.Find("Hood.Settings.Basic");
                    BasicSettings setting = JsonConvert.DeserializeObject <BasicSettings>(option.Value);
                    Options.Add(new Option {
                        Id = typeof(BasicSettings).ToString(), Value = JsonConvert.SerializeObject(setting)
                    });
                }
                else
                {
                    Options.Add(new Option {
                        Id = typeof(BasicSettings).ToString(), Value = JsonConvert.SerializeObject(new BasicSettings())
                    });
                }
            }

            if (!Options.Any(o => o.Id == typeof(ContactSettings).ToString()))
            {
                // No new settings exist, attempt to copy from deprecated settings, or set new.
                if (Options.Any(o => o.Id == "Hood.Settings.Contact"))
                {
                    Option          option  = Options.Find("Hood.Settings.Contact");
                    ContactSettings setting = JsonConvert.DeserializeObject <ContactSettings>(option.Value);
                    Options.Add(new Option {
                        Id = typeof(ContactSettings).ToString(), Value = JsonConvert.SerializeObject(setting)
                    });
                }
                else
                {
                    Options.Add(new Option {
                        Id = typeof(ContactSettings).ToString(), Value = JsonConvert.SerializeObject(new ContactSettings())
                    });
                }
            }

            if (!Options.Any(o => o.Id == typeof(ContentSettings).ToString()))
            {
                // No new settings exist, attempt to copy from deprecated settings, or set new.
                if (Options.Any(o => o.Id == "Hood.Settings.Content"))
                {
                    Option          option  = Options.Find("Hood.Settings.Content");
                    ContentSettings setting = JsonConvert.DeserializeObject <ContentSettings>(option.Value);
                    Options.Add(new Option {
                        Id = typeof(ContentSettings).ToString(), Value = JsonConvert.SerializeObject(setting)
                    });
                }
                else
                {
                    Options.Add(new Option {
                        Id = typeof(ContentSettings).ToString(), Value = JsonConvert.SerializeObject(new ContentSettings())
                    });
                }
            }

            if (!Options.Any(o => o.Id == typeof(IntegrationSettings).ToString()))
            {
                // No new settings exist, attempt to copy from deprecated settings, or set new.
                if (Options.Any(o => o.Id == "Hood.Settings.Integrations"))
                {
                    Option option = Options.Find("Hood.Settings.Integrations");
                    IntegrationSettings setting = JsonConvert.DeserializeObject <IntegrationSettings>(option.Value);
                    Options.Add(new Option {
                        Id = typeof(IntegrationSettings).ToString(), Value = JsonConvert.SerializeObject(setting)
                    });
                }
                else
                {
                    Options.Add(new Option {
                        Id = typeof(IntegrationSettings).ToString(), Value = JsonConvert.SerializeObject(new IntegrationSettings())
                    });
                }
            }

            if (!Options.Any(o => o.Id == typeof(MailSettings).ToString()))
            {
                // No new settings exist, attempt to copy from deprecated settings, or set new.
                if (Options.Any(o => o.Id == "Hood.Settings.Mail"))
                {
                    Option       option  = Options.Find("Hood.Settings.Mail");
                    MailSettings setting = JsonConvert.DeserializeObject <MailSettings>(option.Value);
                    Options.Add(new Option {
                        Id = typeof(MailSettings).ToString(), Value = JsonConvert.SerializeObject(setting)
                    });
                }
                else
                {
                    Options.Add(new Option {
                        Id = typeof(MailSettings).ToString(), Value = JsonConvert.SerializeObject(new MailSettings())
                    });
                }
            }

            if (!Options.Any(o => o.Id == typeof(MediaSettings).ToString()))
            {
                // No new settings exist, attempt to copy from deprecated settings, or set new.
                if (Options.Any(o => o.Id == "Hood.Settings.Media"))
                {
                    Option        option  = Options.Find("Hood.Settings.Media");
                    MediaSettings setting = JsonConvert.DeserializeObject <MediaSettings>(option.Value);
                    Options.Add(new Option {
                        Id = typeof(MediaSettings).ToString(), Value = JsonConvert.SerializeObject(setting)
                    });
                }
                else
                {
                    Options.Add(new Option {
                        Id = typeof(MediaSettings).ToString(), Value = JsonConvert.SerializeObject(new MediaSettings())
                    });
                }
            }

            if (!Options.Any(o => o.Id == typeof(PropertySettings).ToString()))
            {
                // No new settings exist, attempt to copy from deprecated settings, or set new.
                if (Options.Any(o => o.Id == "Hood.Settings.Property"))
                {
                    Option           option  = Options.Find("Hood.Settings.Property");
                    PropertySettings setting = JsonConvert.DeserializeObject <PropertySettings>(option.Value);
                    Options.Add(new Option {
                        Id = typeof(PropertySettings).ToString(), Value = JsonConvert.SerializeObject(setting)
                    });
                }
                else
                {
                    Options.Add(new Option {
                        Id = typeof(PropertySettings).ToString(), Value = JsonConvert.SerializeObject(new PropertySettings())
                    });
                }
            }

            if (!Options.Any(o => o.Id == typeof(SeoSettings).ToString()))
            {
                // No new settings exist, attempt to copy from deprecated settings, or set new.
                if (Options.Any(o => o.Id == "Hood.Settings.Seo"))
                {
                    Option      option  = Options.Find("Hood.Settings.Seo");
                    SeoSettings setting = JsonConvert.DeserializeObject <SeoSettings>(option.Value);
                    Options.Add(new Option {
                        Id = typeof(SeoSettings).ToString(), Value = JsonConvert.SerializeObject(setting)
                    });
                }
                else
                {
                    Options.Add(new Option {
                        Id = typeof(SeoSettings).ToString(), Value = JsonConvert.SerializeObject(new SeoSettings())
                    });
                }
            }


            if (Media.Any(o => o.DirectoryId == null))
            {
                // Save any existing seeding, in case directories needed creating.
                await SaveChangesAsync();

                // Translate any un directoried images.
                MediaDirectory defaultDir  = MediaDirectories.AsNoTracking().SingleOrDefault(o => o.Slug == MediaManager.SiteDirectorySlug && o.Type == DirectoryType.System);
                MediaDirectory contentDir  = MediaDirectories.AsNoTracking().SingleOrDefault(o => o.Slug == MediaManager.ContentDirectorySlug && o.Type == DirectoryType.System);
                MediaDirectory propertyDir = MediaDirectories.AsNoTracking().SingleOrDefault(o => o.Slug == MediaManager.PropertyDirectorySlug && o.Type == DirectoryType.System);
                Media.Where(o => o.FileType == "directory/dir").ToList().ForEach(a => Entry(a).State = EntityState.Deleted);
                try
                {
                    if (Media.Any(o => o.DirectoryId == null))
                    {
                        SaveChanges();

                        string       commandText  = "UPDATE HoodMedia SET DirectoryId = @DirectoryId WHERE DirectoryId IS NULL AND Directory = 'Property'";
                        SqlParameter sqlParameter = new SqlParameter("@DirectoryId", propertyDir.Id);
                        int          affectedRows = Database.ExecuteSqlRaw(commandText, sqlParameter);

                        Option option          = Options.Find(typeof(ContentSettings).ToString());
                        var    contentSettings = JsonConvert.DeserializeObject <ContentSettings>(option.Value);
                        foreach (var type in contentSettings.Types)
                        {
                            commandText  = "UPDATE HoodMedia SET DirectoryId = @DirectoryId WHERE DirectoryId IS NULL AND Directory = '@Directory'";
                            sqlParameter = new SqlParameter("@DirectoryId", contentDir.Id);
                            SqlParameter sqlParameterType = new SqlParameter("@Directory", type.TypeName);
                            affectedRows = Database.ExecuteSqlRaw(commandText, sqlParameter, sqlParameterType);
                        }

                        commandText  = "UPDATE HoodMedia SET DirectoryId = @DirectoryId WHERE DirectoryId IS NULL";
                        sqlParameter = new SqlParameter("@DirectoryId", defaultDir.Id);
                        affectedRows = Database.ExecuteSqlRaw(commandText, sqlParameter);
                    }
                }
                catch (SqlException ex)
                {
                    throw new StartupException("Error updating the media entries.", ex, StartupError.DatabaseMediaError);
                }
                catch (DbUpdateException ex)
                {
                    if (ex.InnerException != null && ex.InnerException.Message.Contains("Timeout"))
                    {
                        throw new StartupException("Error updating the media entries.", ex, StartupError.DatabaseMediaError);
                    }
                }
            }

            if (!Options.Any(o => o.Id == "Hood.Api.SystemPrivateKey"))
            {
                string guid = Guid.NewGuid().ToString();
                string key  = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(guid));
                Options.Add(new Option {
                    Id = "Hood.Api.SystemPrivateKey", Value = JsonConvert.SerializeObject(key)
                });
            }

            // Mark the database with the current version of Hood.
            if (!Options.Any(o => o.Id == "Hood.Version"))
            {
                Options.Add(new Option {
                    Id = "Hood.Version", Value = Engine.Version
                });
            }
            else
            {
                Option option = Options.SingleOrDefault(o => o.Id == "Hood.Version");
                option.Value = Engine.Version;
            }

            await SaveChangesAsync();
        }