diff --git a/Application.hs b/Application.hs index 15018c5..43c2343 100644 --- a/Application.hs +++ b/Application.hs @@ -29,6 +29,9 @@ import Network.Wai.Middleware.RequestLogger (Destination (Logger), import System.Log.FastLogger (defaultBufSize, newStdoutLoggerSet, toLogStr) +import Crypto.PasswordStore +import Yesod.Auth.HashDB (defaultStrength) + import qualified Data.IntMap as IntMap -- Import all relevant handler modules here. @@ -92,11 +95,33 @@ makeFoundation appSettings = do (pgPoolSize $ appDatabaseConf appSettings) -- Perform database migration using our application's logging settings. - runLoggingT (runSqlPool (runMigration migrateAll) pool) logFunc + runLoggingT (runSqlPool ((runMigration migrateAll) >> (initAdmin (appAdminUser appSettings) (appAdminPassword appSettings))) pool) logFunc -- Return the foundation return $ mkFoundation pool +initAdmin Nothing Nothing = return () +initAdmin (Just "") _ = return () +initAdmin (Just adminUser) (Just adminPass) = do + mUserEnt <- getBy $ UniqueUser adminUser + case mUserEnt of + Just _ -> return () + Nothing -> do + passwordEncoded <- liftIO $ makePassword (encodeUtf8 adminPass) defaultStrength + _ <- insert User + { userIdent = adminUser + , userPassword = Just $ decodeUtf8 passwordEncoded + , userName = Nothing + , userIsAdmin = True + , userLocalId = Nothing + , userIsAnonymous = False + , userAvatar = Nothing + , userVerificationKey = Nothing + , userKeyExpirationDate = Nothing + , userTriggerToken = Nothing + } + return () + -- | Convert our foundation to a WAI Application by calling @toWaiAppPlain@ and -- applying some additional middlewares. makeApplication :: App -> IO Application diff --git a/Settings.hs b/Settings.hs index a1de958..49b3a36 100644 --- a/Settings.hs +++ b/Settings.hs @@ -55,6 +55,12 @@ data AppSettings = AppSettings , appVarDir :: String -- ^ Contact (admin) e-mail , appContactEmail :: Maybe Text + -- ^ Ident of an admin to be created when starting + , appAdminUser :: Maybe Text + -- ^ Password for an admin to be created when starting + , appAdminPassword :: Maybe Text + -- ^ Additional info for the instance + , appLocation :: Maybe Text } instance FromJSON AppSettings where @@ -83,6 +89,10 @@ instance FromJSON AppSettings where appVarDir <- o .: "var-dir" appContactEmail <- o .:? "contact-email" + appAdminUser <- o .:? "admin-user" + appAdminPassword <- o .:? "admin-password" + appLocation <- o .:? "location" + return AppSettings {..} -- | Settings for 'widgetFile', such as which template languages to support and diff --git a/config/settings.yml b/config/settings.yml index 7d9f217..4f89602 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -28,4 +28,9 @@ database: poolsize: "_env:PGPOOLSIZE:10" copyright: © Filip Graliński + +admin-user: "_env:ADMINUSER:" +admin-password: "_env:ADMINPASS:" +location: "_env:LOCATION:" + #analytics: UA-YOURCODE diff --git a/templates/default-layout.hamlet b/templates/default-layout.hamlet index 4be2b1f..0acbd17 100644 --- a/templates/default-layout.hamlet +++ b/templates/default-layout.hamlet @@ -2,6 +2,9 @@