summaryrefslogtreecommitdiff
path: root/lisp/entity/ldap-user.lisp
blob: 282592b566993d949cf1968b9e09e710c93d8250 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
(declaim (optimize (speed 0) (safety 3) (debug 3)))

(in-package :ldapadmin)

(defclass ldap-user (entity)
  ((givenname :initarg :givenname
              :initform nil
              :accessor givenname)
   (sn :initarg :sn
       :initform nil
       :accessor sn)
   (mail :initarg :mail
         :initform nil
         :accessor mail)
   (postaladdress :initarg :postaladdress
                  :initform nil
                  :accessor postaladdress)
   (postalcode :initarg :postalcode
               :initform nil
               :accessor postalcode)
   (st :initarg :st
       :initform nil
       :accessor st)
   (l :initarg :l
      :initform nil
      :accessor l)
   (telephonenumber :initarg :telephonenumber
                    :initform nil
                    :accessor telephonenumber)
   (mobile :initarg :mobile
           :initform nil
           :accessor mobile)
   (businesscategory :initarg :businesscategory
                     :initform nil
                     :accessor businesscategory))
  (:documentation "A single inetOrgPerson entry from LDAP."))

(defmethod get-cn ((ldap-user ldap-user))
  (format nil "~a ~a" (givenname ldap-user) (sn ldap-user)))

(defmethod get-user-dn ((ldap-user ldap-user) (ldap ldap))
  (format nil "cn=~a ~a,ou=people,~a" (givenname ldap-user) (sn ldap-user) (base-dn ldap)))

(defmethod modify-ldap-user ((ldap-user ldap-user) (ldap ldap))
  (let* ((existing-user (get-ldap-user ldap (get-cn ldap-user)))
         (existing-attrs (attribute-value-list existing-user t))
         (new-attrs (attribute-value-list ldap-user))
         (ldap-entry (ldap:new-entry (get-user-dn ldap-user ldap) :attrs existing-attrs))
         (change-attrs (remove-if #'null
                                  (mapcar (lambda (attr)
                                            (let ((new-attr (assoc (car attr) new-attrs)))
                                              (cond ((and (org-ckons-core::null-or-empty-p (cdr attr))
                                                          (not (org-ckons-core::null-or-empty-p (cdr new-attr))))
                                                     `(ldap:add ,(car attr) ,(cdr new-attr)))
                                                    ((and (not (org-ckons-core::null-or-empty-p (cdr attr)))
                                                          (org-ckons-core::null-or-empty-p (cdr new-attr)))
                                                     `(ldap:delete ,(car attr) ,(cdr attr)))
                                                    ((and (not (org-ckons-core::null-or-empty-p (cdr attr)))
                                                          (not (org-ckons-core::null-or-empty-p (cdr new-attr)))
                                                          (not (string= (cdr attr) (cdr new-attr))))
                                                     `(ldap:replace ,(car attr) ,(cdr new-attr))))))
                                          existing-attrs))))
    (ldap:modify (connection ldap) (get-user-dn ldap-user ldap) change-attrs)))

(defmethod delete-ldap-user ((ldap-user ldap-user) (ldap ldap))
  (let* ((existing-user (get-ldap-user ldap (get-cn ldap-user)))
         (existing-attrs (attribute-value-list existing-user))
         (ldap-entry (ldap:new-entry (get-user-dn ldap-user ldap) :attrs existing-attrs)))
    (ldap:delete ldap-entry (connection ldap))))

(defmethod add-ldap-user ((ldap-user ldap-user) (ldap ldap))
  (let* ((new-attrs (attribute-value-list ldap-user))
         (new-entry (ldap:new-entry (get-user-dn ldap-user ldap) :attrs (org-ckons-core::add-to-list new-attrs '((objectclass . (inetorgperson)))))))
    (ldap:add new-entry (connection ldap))))