LDAP

This section is empty…

Exploring

ldapsearch from package openldap and customised builds of Curl are both convenient command-line LDAP clients

Renderer error!java.lang.AssertionError: Assert failed: Not an org-node! (element/org-element? p1__7209#) at net.deertopia.doerg.render$fn__7210$fn__7211.invoke (render.clj:22) clojure.lang.MultiFn.invoke (MultiFn.java:229) net.deertopia.doerg.render$org_element_recursive$fn__7244.invoke (render.clj:55) com.rpl.specter.impl$terminal_STAR_.invokeStatic (impl.cljc:430) com.rpl.specter.impl$terminal_STAR_.invoke (impl.cljc:428) com.rpl.specter.impl$compiled_transform_STAR_$fn__4945.invoke (impl.cljc:438) com.rpl.specter.impl$reify__4882.transform_STAR_ (impl.cljc:184) com.rpl.specter.navs$if_transform.invokeStatic (navs.cljc:431) com.rpl.specter.navs$if_transform.invoke (navs.cljc:430) com.rpl.specter$fn__6691$fn$reify__6693.transform_STAR_ (specter.cljc:1404) com.rpl.specter.impl$combine_two_navs$reify__4884$fn__4890.invoke (impl.cljc:195) com.rpl.specter.impl$reify__4882.transform_STAR_ (impl.cljc:184) com.rpl.specter.navs$if_transform.invokeStatic (navs.cljc:431) com.rpl.specter.navs$if_transform.invoke (navs.cljc:430) com.rpl.specter$fn__6691$fn$reify__6693.transform_STAR_ (specter.cljc:1404) com.rpl.specter.impl$cell_nav$reify__5161.transform_STAR_ (impl.cljc:539) com.rpl.specter.impl$combine_two_navs$reify__4884$fn__4890.invoke (impl.cljc:195) com.rpl.specter$reify__6179$next_fn__6182.invoke (specter.cljc:717) clojure.core$map$fn__5950$fn__5951.invoke (core.clj:2759) clojure.lang.TransformerIterator.step (TransformerIterator.java:79) clojure.lang.TransformerIterator.hasNext (TransformerIterator.java:97) clojure.lang.RT$4.invoke (RT.java:542) clojure.lang.LazySeq.force (LazySeq.java:50) clojure.lang.LazySeq.realize (LazySeq.java:89) clojure.lang.LazySeq.seq (LazySeq.java:106) clojure.lang.RT.seq (RT.java:555) clojure.core$seq__5486.invokeStatic (core.clj:139) clojure.core$dorun.invokeStatic (core.clj:3141) clojure.core$doall.invokeStatic (core.clj:3156) clojure.core$doall.invoke (core.clj:3156) com.rpl.specter.navs$all_transform_list.invokeStatic (navs.cljc:62) com.rpl.specter.navs$all_transform_list.invoke (navs.cljc:61) com.rpl.specter.navs$fn__5608.invokeStatic (navs.cljc:183) com.rpl.specter.navs/fn (navs.cljc:71) com.rpl.specter.navs$fn__5583$G__5578__5590.invoke (navs.cljc:40) com.rpl.specter$reify__6179.transform_STAR_ (specter.cljc:725) com.rpl.specter.impl$combine_two_navs$reify__4884$fn__4890.invoke (impl.cljc:195) com.rpl.specter.navs$do_keypath_transform.invokeStatic (navs.cljc:690) com.rpl.specter.navs$do_keypath_transform.invoke (navs.cljc:689) com.rpl.specter.navs$fn$reify__5954.transform_STAR_ (navs.cljc:705) com.rpl.specter.impl$combine_two_navs$reify__4884.transform_STAR_ (impl.cljc:193) com.rpl.specter.impl$combine_two_navs$reify__4884.transform_STAR_ (impl.cljc:193) com.rpl.specter$fn__6718$fn$reify__6720.transform_STAR_ (specter.cljc:1465) com.rpl.specter.navs$if_transform.invokeStatic (navs.cljc:431) com.rpl.specter.navs$if_transform.invoke (navs.cljc:430) com.rpl.specter$fn__6691$fn$reify__6693.transform_STAR_ (specter.cljc:1404) com.rpl.specter.impl$cell_nav$reify__5161.transform_STAR_ (impl.cljc:539) com.rpl.specter.impl$combine_two_navs$reify__4884$fn__4890.invoke (impl.cljc:195) com.rpl.specter$reify__6179$next_fn__6182.invoke (specter.cljc:717) clojure.core$map$fn__5950$fn__5951.invoke (core.clj:2759) clojure.lang.PersistentVector.reduce (PersistentVector.java:418) clojure.core$transduce.invokeStatic (core.clj:7025) clojure.core$into.invokeStatic (core.clj:7042) clojure.core$into.invoke (core.clj:7029) com.rpl.specter.navs$fn__5625.invokeStatic (navs.cljc:94) com.rpl.specter.navs/fn (navs.cljc:71) com.rpl.specter.navs$fn__5583$G__5578__5590.invoke (navs.cljc:40) com.rpl.specter$reify__6179.transform_STAR_ (specter.cljc:725) com.rpl.specter.impl$combine_two_navs$reify__4884$fn__4890.invoke (impl.cljc:195) com.rpl.specter.navs$do_keypath_transform.invokeStatic (navs.cljc:690) com.rpl.specter.navs$do_keypath_transform.invoke (navs.cljc:689) com.rpl.specter.navs$fn$reify__5954.transform_STAR_ (navs.cljc:705) com.rpl.specter.impl$combine_two_navs$reify__4884.transform_STAR_ (impl.cljc:193) com.rpl.specter.impl$combine_two_navs$reify__4884.transform_STAR_ (impl.cljc:193) com.rpl.specter$fn__6718$fn$reify__6720.transform_STAR_ (specter.cljc:1465) com.rpl.specter.navs$if_transform.invokeStatic (navs.cljc:431) com.rpl.specter.navs$if_transform.invoke (navs.cljc:430) com.rpl.specter$fn__6691$fn$reify__6693.transform_STAR_ (specter.cljc:1404) com.rpl.specter.impl$cell_nav$reify__5161.transform_STAR_ (impl.cljc:539) com.rpl.specter.impl$combine_two_navs$reify__4884$fn__4890.invoke (impl.cljc:195) com.rpl.specter$reify__6179$next_fn__6182.invoke (specter.cljc:717) clojure.core$map$fn__5950$fn__5951.invoke (core.clj:2759) clojure.lang.PersistentVector.reduce (PersistentVector.java:418) clojure.core$transduce.invokeStatic (core.clj:7025) clojure.core$into.invokeStatic (core.clj:7042) clojure.core$into.invoke (core.clj:7029) com.rpl.specter.navs$fn__5625.invokeStatic (navs.cljc:94) com.rpl.specter.navs/fn (navs.cljc:71) com.rpl.specter.navs$fn__5583$G__5578__5590.invoke (navs.cljc:40) com.rpl.specter$reify__6179.transform_STAR_ (specter.cljc:725) com.rpl.specter.impl$combine_two_navs$reify__4884$fn__4890.invoke (impl.cljc:195) com.rpl.specter.navs$do_keypath_transform.invokeStatic (navs.cljc:690) com.rpl.specter.navs$do_keypath_transform.invoke (navs.cljc:689) com.rpl.specter.navs$fn$reify__5954.transform_STAR_ (navs.cljc:705) com.rpl.specter.impl$combine_two_navs$reify__4884.transform_STAR_ (impl.cljc:193) com.rpl.specter.impl$combine_two_navs$reify__4884.transform_STAR_ (impl.cljc:193) com.rpl.specter$fn__6718$fn$reify__6720.transform_STAR_ (specter.cljc:1465) com.rpl.specter.navs$if_transform.invokeStatic (navs.cljc:431) com.rpl.specter.navs$if_transform.invoke (navs.cljc:430) com.rpl.specter$fn__6691$fn$reify__6693.transform_STAR_ (specter.cljc:1404) com.rpl.specter.impl$cell_nav$reify__5161.transform_STAR_ (impl.cljc:539) com.rpl.specter.impl$combine_two_navs$reify__4884.transform_STAR_ (impl.cljc:193) com.rpl.specter.impl$compiled_transform_STAR_.invokeStatic (impl.cljc:436) com.rpl.specter.impl$compiled_transform_STAR_.invoke (impl.cljc:435) net.deertopia.doerg.render$org_element_recursive.invokeStatic (render.clj:52) net.deertopia.doerg.render$org_element_recursive.invoke (render.clj:48) net.deertopia.doerg.render$org_document.invokeStatic (render.clj:69) net.deertopia.doerg.render$org_document.doInvoke (render.clj:64) clojure.lang.RestFn.invoke (RestFn.java:426) net.deertopia.doerg.render$to_html$fn__7261.invoke (render.clj:90) net.deertopia.doerg.render$to_html.invokeStatic (render.clj:90) net.deertopia.doerg.render$to_html.doInvoke (render.clj:86) clojure.lang.RestFn.invoke (RestFn.java:562) net.deertopia.doerg.server$node_by_slug$fn__17488.invoke (server.clj:112) net.deertopia.doerg.cached_file$cached_file.invokeStatic (cached_file.clj:21) net.deertopia.doerg.cached_file$cached_file.doInvoke (cached_file.clj:16) clojure.lang.RestFn.invoke (RestFn.java:515) net.deertopia.doerg.server$node_by_slug.invokeStatic (server.clj:109) net.deertopia.doerg.server$node_by_slug.invoke (server.clj:105) clojure.lang.Var.invoke (Var.java:386) reitit.ring.middleware.exception$wrap$fn__15192$fn__15193.invoke (exception.clj:52) reitit.ring$ring_handler$fn__15148.invoke (ring.cljc:389) clojure.lang.AFn.applyToHelper (AFn.java:154) clojure.lang.AFn.applyTo (AFn.java:144) clojure.lang.AFunction$1.doInvoke (AFunction.java:33) clojure.lang.RestFn.applyTo (RestFn.java:140) clojure.lang.Var.applyTo (Var.java:707) clojure.core$apply.invokeStatic (core.clj:667) clojure.core$with_bindings_STAR_.invokeStatic (core.clj:1990) clojure.core$with_bindings_STAR_.doInvoke (core.clj:1990) clojure.lang.RestFn.applyTo (RestFn.java:145) clojure.core$apply.invokeStatic (core.clj:671) clojure.core$bound_fn_STAR_$fn__5837.doInvoke (core.clj:2020) clojure.lang.RestFn.invoke (RestFn.java:411) org.httpkit.server$wrap_ring_websocket$ring_handler_STAR___11977.invoke (server.clj:437) org.httpkit.server.HttpHandler.runSync (RingHandler.java:144) org.httpkit.server.HttpHandler.run (RingHandler.java:138) java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572) java.util.concurrent.FutureTask.run (FutureTask.java:317) java.lang.VirtualThread.run (VirtualThread.java:329)
.

ldap-haskell

Here's a snippet using ldap-haskell to lookup all UIDs in the Deertopia LDAP directory:

  module Main where
  import LDAP

  baseDN = "ou=people,dc=identify,dc=deertopia,dc=net"

  main = do
    h <- ldapInitialize "ldap://127.0.0.1:3890"
    putStrLn "connected (i think)"
    ldapSimpleBind h ("uid=jellyfin," <> baseDN) "i-am-jellyfin"
    putStrLn "did bind"
    r <- ldapSearch h
      (Just baseDN)
      LdapScopeSubtree
      Nothing
      (LDAPAttrList ["uid"])
      False
    print r

RDNs (relative distinguished names)

In LDAP, a DN (distinguished name) is comprised of several RDNs (relative distinguished names). A DN uniquely identifies entries in the directory tree. A typical LDAP DN might look like:

uid=jsmith,ou=Engineering,dc=example,dc=com

This structure helps organize and locate specific entries within the LDAP directory hierarchy.

These are all parts of the X.500 Directory Specification, which defines nodes in a LDAP directory.

uid (user ID)

  • A unique identifier for user accounts in LDAP directories.

  • Typically represents the username or login name of a user.

  • Example: uid=jsmith .

ou (organizational unit)

  • Represents a subdivision or department within an organization.

  • Used to create logical groupings of related objects.

  • Can be nested to create hierarchical structures.

  • Example: ou=Engineering,ou=Departments .

dc (domain component)

  • Represents parts of a domain name in reverse order.

  • Used to specify the DNS domain structure.

  • Multiple dc attributes form the complete domain path.

  • Example: For example.com, it would be: dc=example,dc=com .

cn (common name)

References

StackOverflow — How to query LDAP group membership with CURLul
  • LDAP.com — LDAP DNs and RDNs

  • LDAP Injection Prevention Cheat Sheet

  • DN Escape Values