packages feed

strongswan-sql-1.0.1.0: app/CLI/Commands/Identity.hs

{-# LANGUAGE FlexibleContexts #-}

module CLI.Commands.Identity where

import Control.Lens                        ((.=), use)
import Control.Monad                       (void)
import Control.Monad.Trans.Maybe           (MaybeT(..), runMaybeT)
import CLI.Commands.Common
import CLI.Types
import Data.Default                        (def)
import Data.Maybe                          (fromMaybe)
import Control.Monad.State.Strict          (StateT, lift)
import StrongSwan.SQL
import System.Console.StructuredCLI hiding (Commands)

secretType' :: (Monad m) => Validator m SharedSecretType
secretType' = return . fromName

cfgIdentity :: Commands ()
cfgIdentity =
  command "identity" "Identity configuration" newLevel >+ do
    command "any" "Matches any ID" (setIdentity $ AnyID Nothing) >+ do
      identityCmds
    param "ipv4" "<IPv4 address>" ipV4Address (setIdentity . IPv4AddrID Nothing) >+ do
      identityCmds
    param "ipv4" "<IPv6 address>" ipV6Address (setIdentity . IPv6AddrID Nothing) >+ do
      identityCmds

cfgSecret :: Commands ()
cfgSecret =
  param "shared-secret" "<shared secret>" bytes setSecret >+ do
    param "type" "<psk|eap|rsa|pin>" secretType' $ \sType -> do
      db    <- use dbContext
      ident <- use identity
      str   <- use secretStr
      let secret = def { _ssData = str, _ssType = sType }
      ident' <- lift $ addSecret ident secret db
      identity .= ident'
      return NoAction
        where setSecret str = do
                secretStr .= str
                return NewLevel

setIdentity :: Identity -> StateT AppState IO Action
setIdentity ident = do
  db <- use dbContext
  result <- runMaybeT $ findIdentityBySelf ident db
  identity .= fromMaybe ident result
  return NewLevel

removeIdent :: Commands ()
removeIdent =
  command "remove" "delete identity from DB and all associated secrets, etc" $ do
    db <- use dbContext
    ident <- use identity
    void . runMaybeT $ removeIdentity ident db
    return NoAction

identityCmds :: Commands ()
identityCmds = do
  removeIdent
  cfgSecret
  exitCmd