packages feed

gitit 0.13.0.0 → 0.14.0.0

raw patch · 13 files changed

+139/−59 lines, 13 filesdep +temporarydep ~aesondep ~basedep ~filestorePVP ok

version bump matches the API change (PVP)

Dependencies added: temporary

Dependency ranges changed: aeson, base, filestore, happstack-server, hoauth2, pandoc, pandoc-types, skylighting

API changes (from Hackage documentation)

- Network.Gitit.Types: instance Happstack.Server.Internal.Types.FromReqURI [GHC.Base.String]
- Network.Gitit.Types: type SessionKey = Integer
+ Network.Gitit.Interface: [disableRegistration] :: Config -> Bool
+ Network.Gitit.Types: SessionKey :: Integer -> SessionKey
+ Network.Gitit.Types: [disableRegistration] :: Config -> Bool
+ Network.Gitit.Types: instance GHC.Classes.Eq Network.Gitit.Types.SessionKey
+ Network.Gitit.Types: instance GHC.Classes.Ord Network.Gitit.Types.SessionKey
+ Network.Gitit.Types: instance GHC.Read.Read Network.Gitit.Types.SessionKey
+ Network.Gitit.Types: instance GHC.Show.Show Network.Gitit.Types.SessionKey
+ Network.Gitit.Types: instance Happstack.Server.Internal.Types.FromReqURI Network.Gitit.Types.SessionKey
+ Network.Gitit.Types: newtype SessionKey
- Network.Gitit.Authentication: formAuthHandlers :: [Handler]
+ Network.Gitit.Authentication: formAuthHandlers :: Bool -> [Handler]
- Network.Gitit.Compat.Except: runExcept :: () => Except e a -> Either e a
+ Network.Gitit.Compat.Except: runExcept :: Except e a -> Either e a
- Network.Gitit.Compat.Except: runExceptT :: () => ExceptT e m a -> m (Either e a)
+ Network.Gitit.Compat.Except: runExceptT :: ExceptT e m a -> m (Either e a)
- Network.Gitit.Interface: Config :: FilePath -> FileStoreType -> PageType -> String -> MathMethod -> Bool -> Bool -> (Handler -> Handler) -> AuthenticationLevel -> Handler -> FilePath -> Int -> FilePath -> FilePath -> Priority -> FilePath -> [String] -> Bool -> Integer -> Integer -> String -> Int -> Bool -> String -> [String] -> [String] -> String -> String -> Maybe (String, [String]) -> Bool -> String -> String -> String -> String -> Bool -> Bool -> FilePath -> Map String String -> String -> String -> Text -> Bool -> String -> Bool -> String -> Integer -> Integer -> Bool -> Maybe FilePath -> Bool -> Int -> GithubConfig -> Config
+ Network.Gitit.Interface: Config :: FilePath -> FileStoreType -> PageType -> String -> MathMethod -> Bool -> Bool -> (Handler -> Handler) -> AuthenticationLevel -> Handler -> FilePath -> Int -> FilePath -> FilePath -> Priority -> FilePath -> [String] -> Bool -> Integer -> Integer -> String -> Int -> Bool -> String -> [String] -> [String] -> String -> String -> Maybe (String, [String]) -> Bool -> Bool -> String -> String -> String -> String -> Bool -> Bool -> FilePath -> Map String String -> String -> String -> Text -> Bool -> String -> Bool -> String -> Integer -> Integer -> Bool -> Maybe FilePath -> Bool -> Int -> GithubConfig -> Config
- Network.Gitit.Types: Config :: FilePath -> FileStoreType -> PageType -> String -> MathMethod -> Bool -> Bool -> (Handler -> Handler) -> AuthenticationLevel -> Handler -> FilePath -> Int -> FilePath -> FilePath -> Priority -> FilePath -> [String] -> Bool -> Integer -> Integer -> String -> Int -> Bool -> String -> [String] -> [String] -> String -> String -> Maybe (String, [String]) -> Bool -> String -> String -> String -> String -> Bool -> Bool -> FilePath -> Map String String -> String -> String -> Text -> Bool -> String -> Bool -> String -> Integer -> Integer -> Bool -> Maybe FilePath -> Bool -> Int -> GithubConfig -> Config
+ Network.Gitit.Types: Config :: FilePath -> FileStoreType -> PageType -> String -> MathMethod -> Bool -> Bool -> (Handler -> Handler) -> AuthenticationLevel -> Handler -> FilePath -> Int -> FilePath -> FilePath -> Priority -> FilePath -> [String] -> Bool -> Integer -> Integer -> String -> Int -> Bool -> String -> [String] -> [String] -> String -> String -> Maybe (String, [String]) -> Bool -> Bool -> String -> String -> String -> String -> Bool -> Bool -> FilePath -> Map String String -> String -> String -> Text -> Bool -> String -> Bool -> String -> Integer -> Integer -> Bool -> Maybe FilePath -> Bool -> Int -> GithubConfig -> Config

Files

CHANGES view
@@ -1,3 +1,47 @@+Version 0.14.0.0 released 12 Aug 2021++  * PDF export: fix vulnerability.  Augustin Laville pointed+    out that it is possible to leak content from files on the+    file system in PDF export.  This can be done by simply including++        \include{/path/to/file}++    in the markdown; the raw tex is passed through to the+    LaTeX intermediary when producing a PDF.  In many cases+    this will lead to a LaTeX syntax error, but there are ways of+    injecting TeX includes into a verbatim environment.+    The solution is to cause latex to use a local texmf.cnf+    file when exporting PDF. The texmf.cnf file can specify+    openout_any = p and openin_any = p, which prevents access+    to hidden files and files outside the current tree.++  * Made SessionKey a newtype (API change).  This avoids orphan+    instance warnings.  Removed unused orphan `instance FromReqURI [String]`.++  * Remove deprecated `defaultCleanupHandler`.++  * Handle Underline element in converting inlines to strings.++  * Allow compilation with pandoc 2.12 and 2.13 (#670, sterni).+    pandoc 2.13 introduced the following breakages for gitit.++  * Allow building with pandoc-2.14 (#673, Jens Petersen).++  * Disable registration bug fixes (#669, zaxtax).+    Display correct html, fix precedence bug.++  * Add documentation and comment on disabling registration to+    default config (Rob Zinkov).++  * Add option for disabling registration (Rob Zinkov).++  * Depend on filestore >= 0.6.5 (with embedded data).++  * Relax version bounds in gitit.cabal to fix build from hackage+    (#665, sternenseemann).++  * Allow building with hoauth-1.14 (Jens Petersen).+ Version 0.13.0.0 released 03 June 2020    * Allow building with GHC 8.8
data/default.conf view
@@ -191,6 +191,9 @@ # specifies the public and private keys for the reCAPTCHA service. # To get these, you need to create an account at http://recaptcha.net. +disable-registration: no+# if "yes", disables registering new users on the wiki+ access-question: access-question-answers: # specifies a question that users must answer when they attempt to create
gitit.cabal view
@@ -1,6 +1,6 @@ cabal-version:       2.0 name:                gitit-version:             0.13.0.0+version:             0.14.0.0 build-type:          Simple synopsis:            Wiki using happstack, git or darcs, and pandoc. description:         Gitit is a wiki backed by a git, darcs, or mercurial@@ -122,7 +122,7 @@                      Network.Gitit.Compat.Except,                      Paths_gitit   autogen-modules:   Paths_gitit-  build-depends:     base >= 4.9 && < 5,+  build-depends:     base >= 4.9 && < 4.15,                      syb,                      filepath,                      safe,@@ -135,9 +135,10 @@                      directory,                      mtl,                      old-time,-                     pandoc >= 2.9 && < 2.10,-                     pandoc-types >= 1.20 && < 1.21,-                     skylighting >= 0.8.2.3 && < 0.9,+                     temporary,+                     pandoc >= 2.9 && < 2.15,+                     pandoc-types >= 1.20 && < 1.23,+                     skylighting >= 0.8.2.3 && < 0.12,                      bytestring,                      text,                      random,@@ -148,10 +149,10 @@                      old-locale,                      time,                      recaptcha >= 0.1,-                     filestore >= 0.6.4 && < 0.7,+                     filestore >= 0.6.5 && < 0.7,                      zlib >= 0.5 && < 0.7,                      url >= 2.1,-                     happstack-server >= 7.5 && < 7.7,+                     happstack-server >= 7.5 && < 7.8,                      base64-bytestring >= 0.1,                      xml >= 1.3.5,                      hslogger >= 1,@@ -164,11 +165,11 @@                      json >= 0.4 && < 0.11,                      uri-bytestring >= 0.2.3.3,                      split,-                     hoauth2 >= 1.3.0 && < 1.12,+                     hoauth2 >= 1.3.0 && < 1.17,                      xml-conduit >= 1.5 && < 1.10,                      http-conduit >= 2.1.6 && < 2.4,                      http-client-tls >= 0.2.2 && < 0.4,-                     aeson >= 0.7 && < 1.5,+                     aeson >= 0.7 && < 1.6,                      uuid >= 1.3 && < 1.4,                      network-uri >= 2.6,                      network >= 2.6 && < 3.2,@@ -186,7 +187,7 @@ Executable           gitit   hs-source-dirs:    .   main-is:           gitit.hs-  build-depends:     base >=3 && < 5,+  build-depends:     base >= 4.9 && < 5,                      gitit,                      mtl,                      hslogger,
src/Network/Gitit/Authentication.hs view
@@ -44,7 +44,7 @@ import System.Log.Logger (logM, Priority(..)) import Data.Char (isAlphaNum, isAlpha) import qualified Data.Map as M-import Text.Pandoc.Shared (substitute)+import Data.List (stripPrefix) import Data.Maybe (isJust, fromJust, isNothing, fromMaybe) import Network.URL (exportURL, add_param, importURL) import Network.BSD (getHostName)@@ -54,6 +54,16 @@ import Data.ByteString.UTF8 (toString) import Network.Gitit.Rpxnow as R +-- | Replace each occurrence of one sublist in a list with another.+--   Vendored in from pandoc 2.11.4 as 2.12 removed this function.+substitute :: (Eq a) => [a] -> [a] -> [a] -> [a]+substitute _ _ [] = []+substitute [] _ xs = xs+substitute target' replacement lst@(x:xs) =+    case stripPrefix target' lst of+      Just lst' -> replacement ++ substitute target' replacement lst'+      Nothing   -> x : substitute target' replacement xs+ data ValidationType = Register                     | ResetPassword                     deriving (Show,Read)@@ -350,16 +360,18 @@       , textfield "destination" ! [thestyle "display: none;", value dest]       , submit "login" "Login" ! [intAttr "tabindex" 3]       ] +++-    p << [ stringToHtml "If you do not have an account, "-         , anchor ! [href $ base' ++ "/_register?" ++-           urlEncodeVars [("destination", encodeString dest)]] << "click here to get one."-         ] +++-    if null (mailCommand cfg)+    (if disableRegistration cfg        then noHtml+       else p << [ stringToHtml "If you do not have an account, "+                 , anchor ! [href $ base' ++ "/_register?" +++                     urlEncodeVars [("destination", encodeString dest)]] << "click here to get one."+                 ]) ++++    (if null (mailCommand cfg)+       then noHtml        else p << [ stringToHtml "If you forgot your password, "                  , anchor ! [href $ base' ++ "/_resetPassword"] <<                      "click here to get a new one."-                 ]+                 ])  loginUserForm :: Handler loginUserForm = withData $ \params -> do@@ -410,11 +422,18 @@                     pgTitle = "Register for an account"                     } -formAuthHandlers :: [Handler]-formAuthHandlers =+regAuthHandlers :: [Handler]+regAuthHandlers =   [ dir "_register"  $ method GET >> registerUserForm   , dir "_register"  $ method POST >> withData registerUser-  , dir "_login"     $ method GET  >> loginUserForm+  ]++formAuthHandlers :: Bool -> [Handler]+formAuthHandlers disableReg =+  (if disableReg+    then []+    else regAuthHandlers) +++  [ dir "_login"     $ method GET  >> loginUserForm   , dir "_login"     $ method POST >> withData loginUser   , dir "_logout"    $ method GET  >> withData logoutUser   , dir "_resetPassword"   $ method GET  >> withData resetPasswordRequestForm
src/Network/Gitit/Authentication/Github.hs view
@@ -17,7 +17,6 @@ import qualified URI.ByteString as URI import Network.HTTP.Conduit import Network.OAuth.OAuth2-import Network.OAuth.OAuth2.TokenRequest as OA import Control.Monad (liftM, mplus, mzero) import Data.Maybe import Data.Aeson
src/Network/Gitit/Config.hs view
@@ -110,6 +110,7 @@       cfNoDelete <- get cp "DEFAULT" "no-delete"       cfDefaultSummary <- get cp "DEFAULT" "default-summary"       cfDeleteSummary <- get cp "DEFAULT" "delete-summary"+      cfDisableRegistration <- get cp "DEFAULT" "disable-registration"       cfAccessQuestion <- get cp "DEFAULT" "access-question"       cfAccessQuestionAnswers <- get cp "DEFAULT" "access-question-answers"       cfUseRecaptcha <- get cp "DEFAULT" "use-recaptcha"@@ -181,7 +182,7 @@                                        _         -> ForModify          , authHandler          = case authMethod of-                                      "form"     -> msum formAuthHandlers+                                      "form"     -> msum $ formAuthHandlers cfDisableRegistration                                       "github"   -> msum $ githubAuthHandlers ghConfig                                       "http"     -> msum httpAuthHandlers                                       "rpx"      -> msum rpxAuthHandlers@@ -209,6 +210,7 @@         , noDelete             = splitCommaList cfNoDelete         , defaultSummary       = cfDefaultSummary         , deleteSummary        = cfDeleteSummary+        , disableRegistration  = cfDisableRegistration         , accessQuestion       = if null cfAccessQuestion                                     then Nothing                                     else Just (cfAccessQuestion, splitCommaList cfAccessQuestionAnswers)
src/Network/Gitit/ContentTransformer.hs view
@@ -744,6 +744,9 @@                Superscript xs          -> mconcat $ map go xs                Subscript xs            -> mconcat $ map go xs                SmallCaps xs            -> mconcat $ map go xs+#if MIN_VERSION_pandoc(2,10,0)+               Underline xs            -> mconcat $ map go xs+#endif                Quoted DoubleQuote xs   -> "\"" <> mconcat (map go xs) <> "\""                Quoted SingleQuote xs   -> "'" <> mconcat (map go xs) <> "'"                Cite _ xs               -> mconcat $ map go xs
src/Network/Gitit/Export.hs view
@@ -41,6 +41,7 @@ import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L import System.FilePath ((</>), takeDirectory)+import System.Environment (setEnv) import System.Directory (doesFileExist) import Text.HTML.SanitizeXSS import Data.ByteString.Lazy (fromStrict)@@ -49,6 +50,7 @@ import Data.Text.Encoding (encodeUtf8) import Data.List (isPrefixOf) import Skylighting (styleToCss, pygments)+import System.IO.Temp (withSystemTempDirectory) import Paths_gitit (getDataFileName)  defaultRespOptions :: WriterOptions@@ -213,9 +215,15 @@                else return Nothing   pdf' <- case cached of             Just (_modtime, bs) -> return $ Right $ L.fromChunks [bs]-            Nothing -> do+            Nothing -> liftIO $+                withSystemTempDirectory "gitit" $ \tmpdir -> do               let toc = tableOfContents cfg-              res <- liftIO $ runIO $ do+              -- ensure that LaTeX \include commands can't include+              -- files outside the working directory, e.g. /etc/passwd:+              writeFile (tmpdir </> "texmf.cnf")+                "openout_any = p\nopenin_any = p\n"+              setEnv "TEXMFCNF" (tmpdir ++ ":")+              res <- runIO $ do                 setUserDataDir $ pandocUserData cfg                 setInputFiles [baseUrl cfg]                 let templ = if useBeamer then "beamer" else "latex"
src/Network/Gitit/Feed.hs view
@@ -46,7 +46,6 @@ import Text.XML.Light as XML (showContent, Content(..), Element(..), blank_element, QName(..), blank_name, CData(..), blank_cdata) import Text.XML as Text.XML (renderText, Document(..), Element(..),                              Prologue(..), def, fromXMLElement)-import qualified Data.XML.Types as XMLTypes import Data.Version (showVersion) import Paths_gitit (version) 
src/Network/Gitit/Plugins.hs view
@@ -38,28 +38,27 @@   runGhc (Just libdir) $ do     dflags <- getSessionDynFlags     setSessionDynFlags dflags-    defaultCleanupHandler dflags $ do-      -- initDynFlags-      unless ("Network.Gitit.Plugin." `isPrefixOf` pluginName)-        $ do-            addTarget =<< guessTarget pluginName Nothing-            r <- load LoadAllTargets-            case r of-              Failed -> error $ "Error loading plugin: " ++ pluginName-              Succeeded -> return ()-      let modName =-            if "Network.Gitit.Plugin" `isPrefixOf` pluginName-               then pluginName-               else if "Network/Gitit/Plugin/" `isInfixOf` pluginName-                       then "Network.Gitit.Plugin." ++ takeBaseName pluginName-                       else takeBaseName pluginName-      pr <- parseImportDecl "import Prelude"-      i <- parseImportDecl "import Network.Gitit.Interface"-      m <- parseImportDecl ("import " ++ modName)-      setContext [IIDecl m, IIDecl  i, IIDecl pr]-      value <- compileExpr (modName ++ ".plugin :: Plugin")-      let value' = (unsafeCoerce value) :: Plugin-      return value'+    -- initDynFlags+    unless ("Network.Gitit.Plugin." `isPrefixOf` pluginName)+      $ do+          addTarget =<< guessTarget pluginName Nothing+          r <- load LoadAllTargets+          case r of+            Failed -> error $ "Error loading plugin: " ++ pluginName+            Succeeded -> return ()+    let modName =+          if "Network.Gitit.Plugin" `isPrefixOf` pluginName+             then pluginName+             else if "Network/Gitit/Plugin/" `isInfixOf` pluginName+                     then "Network.Gitit.Plugin." ++ takeBaseName pluginName+                     else takeBaseName pluginName+    pr <- parseImportDecl "import Prelude"+    i <- parseImportDecl "import Network.Gitit.Interface"+    m <- parseImportDecl ("import " ++ modName)+    setContext [IIDecl m, IIDecl  i, IIDecl pr]+    value <- compileExpr (modName ++ ".plugin :: Plugin")+    let value' = (unsafeCoerce value) :: Plugin+    return value'  #else 
src/Network/Gitit/State.hs view
@@ -120,7 +120,7 @@  newSession :: MonadIO m => SessionData -> m SessionKey newSession u = do-  key <- liftIO $ randomRIO (0, 1000000000)+  key <- liftIO $ SessionKey <$> randomRIO (0, 1000000000)   setSession key u   return key 
src/Network/Gitit/Types.hs view
@@ -28,7 +28,7 @@                            , AuthenticationLevel(..)                            , Config(..)                            , Page(..)-                           , SessionKey+                           , SessionKey(..)                            -- we do not export SessionData constructors, in case we need to extend  SessionData with other data in the future                            , SessionData                            , SessionGithubData@@ -169,6 +169,8 @@   -- be given the prompt and must give   -- one of the answers to register.   accessQuestion       :: Maybe (String, [String]),+  -- | Disable Registration?+  disableRegistration  :: Bool,   -- | Use ReCAPTCHA for user registration.   useRecaptcha         :: Bool,   recaptchaPublicKey   :: String,@@ -227,7 +229,8 @@   , pageMeta        :: [(String, String)] } deriving (Read, Show) -type SessionKey = Integer+newtype SessionKey = SessionKey Integer+  deriving (Read, Show, Eq, Ord)  data SessionData = SessionData {   sessionUser :: Maybe String,@@ -245,7 +248,7 @@ sessionDataGithubStateUrl :: String -> String -> SessionData sessionDataGithubStateUrl githubState destination = SessionData Nothing (Just $ SessionGithubData githubState destination) -data Sessions a = Sessions {unsession::M.Map SessionKey a}+data Sessions a = Sessions {unsession :: M.Map SessionKey a}   deriving (Read,Show,Eq)  -- Password salt hashedPassword@@ -370,13 +373,10 @@                      , pRedirect     :: Maybe Bool                      }  deriving Show -instance FromReqURI [String] where-  fromReqURI s = case fromReqURI s of-                      Just (s' :: String) ->-                                   case reads s' of-                                        ((xs,""):_) -> xs-                                        _           -> Nothing-                      Nothing             -> Nothing+instance FromReqURI SessionKey where+ fromReqURI s = case fromReqURI s of+                       Just i -> Just $ SessionKey i+                       Nothing -> Nothing  instance FromData Params where      fromData = do
src/Network/Gitit/Util.hs view
@@ -36,7 +36,6 @@ import Control.Monad.Trans (liftIO) import Data.Char (toLower, isAscii) import Data.Text (Text)-import qualified Data.Text as T import Network.Gitit.Types import qualified Control.Exception as E import qualified Text.Pandoc.UTF8 as UTF8@@ -45,7 +44,11 @@  -- | Read file as UTF-8 string.  Encode filename as UTF-8. readFileUTF8 :: FilePath -> IO Text+#if MIN_VERSION_pandoc(2,12,0)+readFileUTF8 = UTF8.readFile+#else readFileUTF8 = fmap T.pack . UTF8.readFile+#endif  -- | Perform a function a directory and return to working directory. inDir :: FilePath -> IO a -> IO a