@@ -67,7 +67,7 @@ import qualified Control.Exception as E
67
67
import System.FilePath
68
68
import Network.Gitit.State
69
69
import Text.XHtml hiding ( (</>) , dir , method , password , rev )
70
- import qualified Text.XHtml as X ( method )
70
+ import qualified Text.XHtml as X ( method , password )
71
71
import Data.List (intercalate , intersperse , delete , nub , sortBy , find , isPrefixOf , inits , sort , (\\) )
72
72
import Data.List.Split (wordsBy )
73
73
import Data.Maybe (fromMaybe , mapMaybe , isJust , catMaybes )
@@ -501,6 +501,7 @@ editPage' params = do
501
501
fs <- getFileStore
502
502
page <- getPage
503
503
cfg <- getConfig
504
+ mbUser <- getLoggedInUser
504
505
let getRevisionAndText = E. catch
505
506
(do c <- liftIO $ retrieve fs (pathForPage page $ defaultExtension cfg) rev
506
507
-- even if pRevision is set, we return revId of latest
@@ -529,12 +530,19 @@ editPage' params = do
529
530
then [strAttr " readonly" " yes" ,
530
531
strAttr " style" " color: gray" ]
531
532
else []
533
+ let accessQ = case mbUser of
534
+ Just _ -> noHtml
535
+ Nothing -> case accessQuestion cfg of
536
+ Nothing -> noHtml
537
+ Just (prompt, _) -> label ! [thefor " accessCode" ] << prompt +++ br +++
538
+ X. password " accessCode" +++ br
532
539
base' <- getWikiBase
533
540
let editForm = gui (base' ++ urlForPage page) ! [identifier " editform" ] <<
534
541
[ sha1Box
535
542
, textarea ! (readonly ++ [cols " 80" , name " editedText" ,
536
543
identifier " editedText" ]) << raw
537
544
, br
545
+ , accessQ
538
546
, label ! [thefor " logMsg" ] << " Description of changes:"
539
547
, br
540
548
, textfield " logMsg" ! (readonly ++ [value (logMsg `orIfNull` defaultSummary cfg) ])
@@ -630,39 +638,47 @@ updatePage = withData $ \(params :: Params) -> do
630
638
Just b -> applyPreCommitPlugins b
631
639
let logMsg = pLogMsg params `orIfNull` defaultSummary cfg
632
640
let oldSHA1 = pSHA1 params
641
+ let accessCode = pAccessCode params
642
+ let isValidAccessCode = case mbUser of
643
+ Just _ -> True
644
+ Nothing -> case accessQuestion cfg of
645
+ Nothing -> True
646
+ Just (_, answers) -> accessCode `elem` answers
633
647
fs <- getFileStore
634
648
base' <- getWikiBase
635
649
if null . filter (not . isSpace) $ logMsg
636
650
then withMessages [" Description cannot be empty." ] editPage
637
- else do
638
- when (length editedText > fromIntegral (maxPageSize cfg)) $
639
- error " Page exceeds maximum size."
640
- -- check SHA1 in case page has been modified, merge
641
- modifyRes <- if null oldSHA1
642
- then liftIO $ create fs (pathForPage page $ defaultExtension cfg)
643
- (Author user email) logMsg editedText >>
644
- return (Right () )
645
- else do
646
- expireCachedFile (pathForPage page $ defaultExtension cfg) `mplus` return ()
647
- liftIO $ E. catch (modify fs (pathForPage page $ defaultExtension cfg)
648
- oldSHA1 (Author user email) logMsg
649
- editedText)
650
- (\ e -> if e == Unchanged
651
- then return (Right () )
652
- else E. throwIO e)
653
- case modifyRes of
654
- Right () -> seeOther (base' ++ urlForPage page) $ toResponse $ p << " Page updated"
655
- Left (MergeInfo mergedWithRev conflicts mergedText) -> do
656
- let mergeMsg = " The page has been edited since you checked it out. " ++
657
- " Changes from revision " ++ revId mergedWithRev ++
658
- " have been merged into your edits below. " ++
659
- if conflicts
660
- then " Please resolve conflicts and Save."
661
- else " Please review and Save."
662
- editPage' $
663
- params{ pEditedText = Just mergedText,
664
- pSHA1 = revId mergedWithRev,
665
- pMessages = [mergeMsg] }
651
+ else if not isValidAccessCode
652
+ then withMessages [" Access code is invalid." ] editPage
653
+ else do
654
+ when (length editedText > fromIntegral (maxPageSize cfg)) $
655
+ error " Page exceeds maximum size."
656
+ -- check SHA1 in case page has been modified, merge
657
+ modifyRes <- if null oldSHA1
658
+ then liftIO $ create fs (pathForPage page $ defaultExtension cfg)
659
+ (Author user email) logMsg editedText >>
660
+ return (Right () )
661
+ else do
662
+ expireCachedFile (pathForPage page $ defaultExtension cfg) `mplus` return ()
663
+ liftIO $ E. catch (modify fs (pathForPage page $ defaultExtension cfg)
664
+ oldSHA1 (Author user email) logMsg
665
+ editedText)
666
+ (\ e -> if e == Unchanged
667
+ then return (Right () )
668
+ else E. throwIO e)
669
+ case modifyRes of
670
+ Right () -> seeOther (base' ++ urlForPage page) $ toResponse $ p << " Page updated"
671
+ Left (MergeInfo mergedWithRev conflicts mergedText) -> do
672
+ let mergeMsg = " The page has been edited since you checked it out. " ++
673
+ " Changes from revision " ++ revId mergedWithRev ++
674
+ " have been merged into your edits below. " ++
675
+ if conflicts
676
+ then " Please resolve conflicts and Save."
677
+ else " Please review and Save."
678
+ editPage' $
679
+ params{ pEditedText = Just mergedText,
680
+ pSHA1 = revId mergedWithRev,
681
+ pMessages = [mergeMsg] }
666
682
667
683
indexPage :: Handler
668
684
indexPage = do
0 commit comments