module Fedora.Krb (
  krbTicket,
  maybeFasIdFromKrb,
  fasIdFromKrb
  )
where

import Control.Monad
import qualified Data.List as L
import Data.Maybe
import SimpleCmd

krbTicket :: IO ()
krbTicket :: IO ()
krbTicket = do
  entry <- IO [String]
klistEntryFedora
  if null entry
    then error' "No krb5 ticket found for FEDORAPROJECT.ORG"
    else
    when (last entry == "(Expired)") $ do
    putStrLn $ unwords entry
    fkinit $ extractFasId entry
    putStrLn ""
  where
    fkinit :: Maybe String -> IO ()
fkinit Maybe String
muser = do
      let opts :: [String]
opts = [String] -> (String -> [String]) -> Maybe String -> [String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\String
user -> [String
"-u", String
user]) Maybe String
muser
      -- FIXME test for fkinit
      ok <- String -> [String] -> IO Bool
cmdBool String
"fkinit" [String]
opts
      unless ok $ fkinit muser

extractFasId :: [String] -> Maybe String
extractFasId :: [String] -> Maybe String
extractFasId =
  (String -> String) -> Maybe String -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> String -> String
removeSuffix String
"@FEDORAPROJECT.ORG") (Maybe String -> Maybe String)
-> ([String] -> Maybe String) -> [String] -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> Maybe String
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
L.find (String
"@FEDORAPROJECT.ORG" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`L.isSuffixOf`)

maybeFasIdFromKrb :: IO (Maybe String)
maybeFasIdFromKrb :: IO (Maybe String)
maybeFasIdFromKrb = [String] -> Maybe String
extractFasId ([String] -> Maybe String) -> IO [String] -> IO (Maybe String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [String]
klistEntryFedora

fasIdFromKrb :: IO String
fasIdFromKrb :: IO String
fasIdFromKrb = do
  mfasid <- IO (Maybe String)
maybeFasIdFromKrb
  case mfasid of
    Maybe String
Nothing -> String -> IO String
forall a. String -> a
error' String
"Could not determine FAS id from klist"
    Just String
fasid -> String -> IO String
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return String
fasid

-- gets first FEDORAPROJECT.ORG entry
klistEntryFedora :: IO [String]
klistEntryFedora :: IO [String]
klistEntryFedora = do
  -- FIXME test for klist
  mres <- String -> [String] -> IO (Maybe String)
cmdMaybe String
"klist" [String
"-l"]
  return $
    maybe []
    (words . fromMaybe "" . L.find ("@FEDORAPROJECT.ORG" `L.isInfixOf`) . lines)
    mres