100 lines
3.4 KiB
Haskell
100 lines
3.4 KiB
Haskell
{-# LANGUAGE OverloadedLists #-}
|
||
{-# LANGUAGE OverloadedStrings #-}
|
||
module Ldap.ClientSpec (spec) where
|
||
|
||
import Data.Monoid ((<>))
|
||
import Test.Hspec
|
||
|
||
import Ldap.Client (Dn(..), Password(..), Filter(..), Scope(..), Attr(..))
|
||
import qualified Ldap.Client as Ldap
|
||
|
||
import SpecHelper (port)
|
||
|
||
|
||
spec :: Spec
|
||
spec = do
|
||
let locally = Ldap.with localhost port
|
||
search l f = Ldap.search l (Dn "o=localhost") (Ldap.scope WholeSubtree <> Ldap.typesOnly True) f []
|
||
|
||
context "bind" $ do
|
||
it "can bind" $ do
|
||
res <- locally $ \l -> do
|
||
Ldap.bind l (Dn "cn=admin") (Password "secret")
|
||
res `shouldBe` Right ()
|
||
|
||
it "can try to bind with a wrong password" $ do
|
||
res <- locally $ \l -> do
|
||
Ldap.bind l (Dn "cn=admin") (Password "public")
|
||
res `shouldBe` Left (Ldap.BindError (Ldap.BindErrorCode Ldap.InvalidCredentials))
|
||
|
||
it "can login as another user" $ do
|
||
res <- locally $ \l -> do
|
||
Ldap.bind l (Dn "cn=admin") (Password "secret")
|
||
Ldap.SearchEntry udn _ : []
|
||
<- search l (Attr "cn" := "pikachu")
|
||
Ldap.bind l udn (Password "i-choose-you")
|
||
res `shouldBe` Right ()
|
||
|
||
context "search" $ do
|
||
it "cannot search as ‘pikachu’" $ do
|
||
res <- locally $ \l -> do
|
||
Ldap.bind l (Dn "cn=pikachu,o=localhost") (Password "i-choose-you")
|
||
search l (Present (Attr "password"))
|
||
res `shouldBe` Left (Ldap.SearchError (Ldap.SearchErrorCode Ldap.InsufficientAccessRights))
|
||
|
||
it "can use ‘present’ filter" $ do
|
||
res <- locally $ \l -> do
|
||
res <- search l (Present (Attr "password"))
|
||
dns res `shouldBe` [Dn "cn=pikachu,o=localhost"]
|
||
res `shouldBe` Right ()
|
||
|
||
it "can use ‘equality match’ filter" $ do
|
||
res <- locally $ \l -> do
|
||
res <- search l (Attr "type" := "flying")
|
||
dns res `shouldMatchList` [Dn "cn=butterfree,o=localhost", Dn "cn=charizard,o=localhost"]
|
||
res `shouldBe` Right ()
|
||
|
||
it "can use ‘and’ filter" $ do
|
||
res <- locally $ \l -> do
|
||
res <- search l (And [ Attr "type" := "fire"
|
||
, Attr "evolution" := "1"
|
||
])
|
||
dns res `shouldBe` [Dn "cn=charmeleon,o=localhost"]
|
||
res `shouldBe` Right ()
|
||
|
||
it "can use ‘or’ filter" $ do
|
||
res <- locally $ \l -> do
|
||
res <- search l (Or [ Attr "type" := "fire"
|
||
, Attr "evolution" := "1"
|
||
])
|
||
dns res `shouldMatchList`
|
||
[ Dn "cn=charizard,o=localhost"
|
||
, Dn "cn=charmeleon,o=localhost"
|
||
, Dn "cn=charmander,o=localhost"
|
||
, Dn "cn=metapod,o=localhost"
|
||
, Dn "cn=wartortle,o=localhost"
|
||
, Dn "cn=ivysaur,o=localhost"
|
||
]
|
||
res `shouldBe` Right ()
|
||
|
||
it "can use ‘or’ filter" $ do
|
||
res <- locally $ \l -> do
|
||
res <- search l (Not (Or [ Attr "type" := "fire"
|
||
, Attr "evolution" :>= "1"
|
||
]))
|
||
dns res `shouldMatchList`
|
||
[ Dn "cn=bulbasaur,o=localhost"
|
||
, Dn "cn=squirtle,o=localhost"
|
||
, Dn "cn=caterpie,o=localhost"
|
||
, Dn "cn=pikachu,o=localhost"
|
||
]
|
||
res `shouldBe` Right ()
|
||
|
||
localhost :: Ldap.Host
|
||
localhost = Ldap.Plain "localhost"
|
||
|
||
dns :: [Ldap.SearchEntry] -> [Dn]
|
||
dns (Ldap.SearchEntry dn _ : es) = dn : dns es
|
||
dns [] = []
|
||
dns _ = error "?"
|