packages feed

iptadmin-1.3.4: src/IptAdmin/EditChainPage.hs

module IptAdmin.EditChainPage where

import Control.Monad.Error
import Happstack.Server.SimpleHTTP
import IptAdmin.EditChainForm.Parse
import IptAdmin.EditChainForm.Render
import IptAdmin.Render
import IptAdmin.System
import IptAdmin.Types
import IptAdmin.Utils
import Iptables
import Text.Blaze.Renderer.Pretty (renderHtml)
import Text.ParserCombinators.Parsec.Prim hiding (State (..))

pageHandlers :: IptAdmin Response
pageHandlers = msum [ methodSP GET pageHandlerGet
                    , methodSP POST pageHandlerPost
                    ]

pageHandlerGet :: IptAdmin Response
pageHandlerGet = do
    tableName <- getInputNonEmptyString "table"
    chainName <- getInputNonEmptyString "chain"

    table <- getTable tableName

    let chainMay = getChainByName chainName table
    case chainMay of
        Nothing -> throwError $ "Invalid chain name: " ++ chainName
        Just _ -> return $ buildResponse $ renderHtml $ do
            editChainForm (tableName, chainName) chainName Nothing

pageHandlerPost :: IptAdmin Response
pageHandlerPost = do
    tableName <- getInputNonEmptyString "table"
    chainName <- getInputNonEmptyString "chain"

    newChainName <- getInputString "newChainName"

    let newChainNameE = parse parseChainName "chain name" newChainName
    case newChainNameE of
        Left e -> return $ buildResponse $ renderHtml $ do
            editChainForm (tableName, chainName) newChainName $ Just $ "Parameter error: " ++ show e
        Right newChainName' ->
            if chainName == newChainName'
                then return $ buildResponse $ renderHtml $ do
                    editChainForm (tableName, chainName) newChainName' $ Just "The name was not changed"
                else do
                    table <- getTable tableName
                    let checkChainMay = getChainByName newChainName' table
                    case checkChainMay of
                        Just _ -> return $ buildResponse $ renderHtml $ do
                            editChainForm (tableName, chainName) newChainName' $
                                Just "A chain with the same name already exists"
                        Nothing -> do
                            submit <- getInputString "submit"
                            case submit of
                                "Check" -> return $ buildResponse $ renderHtml $ do
                                    editChainForm (tableName, chainName) newChainName' $ Just "The name is valid"
                                "Submit" -> do
                                    tryChange $ renameChain tableName chainName newChainName'
                                    -- redir $ "/show?table=" ++ tableName ++ bookmarkForJump newChainName' Nothing
                                    return $ buildResponse $ "ok:" ++ newChainName'
                                a -> throwError $ "Invalid value for 'submit' parameter: " ++ a