module LDAP.Modify (
LDAPModOp(..), LDAPMod(..),
ldapAdd, ldapModify, ldapDelete,
list2ldm, pairs2ldm
)
where
import LDAP.Utils
import LDAP.Types
import LDAP.TypesLL
import LDAP.Data
import Foreign
import Foreign.C.String
import Foreign.C.Types(CInt(..))
import LDAP.Result
import Control.Exception(finally)
import Data.Bits
data LDAPMod = LDAPMod {modOp :: LDAPModOp
,modType :: String
,modVals :: [String]
}
deriving (Eq, Show)
ldapModify :: LDAP
-> String
-> [LDAPMod]
-> IO ()
ldapModify = genericChange "ldapModify" ldap_modify_s
ldapAdd :: LDAP
-> String
-> [LDAPMod]
-> IO ()
ldapAdd = genericChange "ldapAdd" ldap_add_s
genericChange name func ld dn changelist =
withLDAPPtr ld (\cld ->
withCString dn (\cdn ->
withCLDAPModArr0 changelist (\cmods ->
do checkLE name ld $ func cld cdn cmods
return ()
)))
ldapDelete :: LDAP -> String -> IO ()
ldapDelete ld dn =
withLDAPPtr ld (\cld ->
withCString dn (\cdn ->
do checkLE "ldapDelete" ld $ ldap_delete_s cld cdn
return ()
))
list2ldm :: LDAPModOp -> [(String, [String])] -> [LDAPMod]
list2ldm mo = map (\(key, vals) -> LDAPMod {modOp = mo, modType = key,
modVals = vals}
)
pairs2ldm :: LDAPModOp -> [(String, String)] -> [LDAPMod]
pairs2ldm mo = list2ldm mo . map (\(x, y) -> (x, [y]))
data CLDAPMod
newCLDAPMod :: LDAPMod -> IO (Ptr CLDAPMod)
newCLDAPMod lm =
do (ptr::(Ptr CLDAPMod)) <- mallocBytes (12)
cmodtype <- newCString (modType lm)
let (cmodop::LDAPInt) =
(fromIntegral . fromEnum . modOp $ lm) .|.
128
bervals <- mapM newBerval (modVals lm)
(arrptr::Ptr (Ptr Berval)) <- newArray0 nullPtr bervals
( (\hsc_ptr -> pokeByteOff hsc_ptr 0) ) ptr cmodop
( (\hsc_ptr -> pokeByteOff hsc_ptr 4) ) ptr cmodtype
( (\hsc_ptr -> pokeByteOff hsc_ptr 8) ) ptr arrptr
return ptr
freeCLDAPMod :: Ptr CLDAPMod -> IO ()
freeCLDAPMod ptr =
do
(arrptr::Ptr (Ptr Berval)) <- ( (\hsc_ptr -> peekByteOff hsc_ptr 8) ) ptr
(arr::[Ptr Berval]) <- peekArray0 nullPtr arrptr
mapM_ freeHSBerval arr
free arrptr
(cmodtype::CString) <- ( (\hsc_ptr -> peekByteOff hsc_ptr 4) ) ptr
free cmodtype
free ptr
withCLDAPModArr0 :: [LDAPMod] -> (Ptr (Ptr CLDAPMod) -> IO a) -> IO a
withCLDAPModArr0 = withAnyArr0 newCLDAPMod freeCLDAPMod
foreign import ccall unsafe "ldap.h ldap_modify_s"
ldap_modify_s :: LDAPPtr -> CString -> Ptr (Ptr CLDAPMod) -> IO LDAPInt
foreign import ccall unsafe "ldap.h ldap_delete_s"
ldap_delete_s :: LDAPPtr -> CString -> IO LDAPInt
foreign import ccall unsafe "ldap.h ldap_add_s"
ldap_add_s :: LDAPPtr -> CString -> Ptr (Ptr CLDAPMod) -> IO LDAPInt