Add password endpoint
This commit is contained in:
parent
e37ac34629
commit
664190cdae
3 changed files with 84 additions and 0 deletions
|
@ -2,5 +2,6 @@
|
|||
|
||||
{["static", '*'], 'elmdap-static', []}.
|
||||
{["users", uid], 'elmdap-user', []}.
|
||||
{["users", uid, "password"], 'elmdap-password', []}.
|
||||
{["users"], 'elmdap-users', []}.
|
||||
{["groups"], 'elmdap-groups', []}.
|
||||
|
|
|
@ -9,6 +9,9 @@
|
|||
((`#(eldap_entry ,_ ,attributes))
|
||||
attributes))
|
||||
|
||||
(defun attribute (entry name)
|
||||
(proplists:get_value name (attributes entry)))
|
||||
|
||||
(defun to_json (entry)
|
||||
`#(struct [#(dn ,(dn entry))
|
||||
#(attributes
|
||||
|
|
80
src/elmdap-password.lfe
Normal file
80
src/elmdap-password.lfe
Normal file
|
@ -0,0 +1,80 @@
|
|||
(defmodule elmdap-password
|
||||
(export (init 1)
|
||||
(service_available 2)
|
||||
(is_authorized 2)
|
||||
(resource_exists 2)
|
||||
(allowed_methods 2)
|
||||
(content_types_provided 2)
|
||||
(to_json 2)
|
||||
(process_post 2)))
|
||||
|
||||
(include-lib "webmachine/include/webmachine.hrl")
|
||||
(include-lib "calrissian/include/monads.lfe")
|
||||
|
||||
(defrecord state
|
||||
connection
|
||||
entry)
|
||||
|
||||
(defun init (args)
|
||||
`#(ok ,(make-state)))
|
||||
|
||||
(defun service_available (req-data state)
|
||||
(case (elmdap:open)
|
||||
((tuple 'ok connection)
|
||||
`#(true ,req-data ,(set-state state connection connection)))
|
||||
(_
|
||||
`#(false ,req-data ,state))))
|
||||
|
||||
(defun is_authorized (req-data state)
|
||||
(elmdap:is_authorized (state-connection state)
|
||||
req-data state))
|
||||
|
||||
(defun resource_exists (req-data state)
|
||||
(let ((`[#(uid ,uid)] (wrq:path_info req-data)))
|
||||
(case (get-entry (state-connection state) uid)
|
||||
(`#(ok ,entry)
|
||||
(if (!= 'undefined (elmdap-entry:attribute entry "userPassword"))
|
||||
`#(true ,req-data ,(set-state state entry entry))
|
||||
`#(false ,req-data ,state)))
|
||||
(_ `#(false ,req-data ,state)))))
|
||||
|
||||
(defun allowed_methods (req-data state)
|
||||
`#([GET HEAD POST] ,req-data ,state))
|
||||
|
||||
(defun content_types_provided (req-data state)
|
||||
`#([#("application/json" to_json)] ,req-data ,state))
|
||||
|
||||
(defun to_json (req-data state)
|
||||
(tuple (mochijson:encode
|
||||
(password (state-entry state)))
|
||||
req-data
|
||||
state))
|
||||
|
||||
(defun process_post (req-data state)
|
||||
(let* ((newpassword (mochijson:decode (wrq:req_body req-data)))
|
||||
(dn (elmdap-entry:dn (state-entry state)))
|
||||
(result (eldap:modify_password
|
||||
(state-connection state)
|
||||
dn
|
||||
newpassword)))
|
||||
(error_logger:info_report `#(newpass ,dn ,result))
|
||||
(case result
|
||||
('ok `#(true ,req-data ,state))
|
||||
(_ `#(false ,req-data ,state)))))
|
||||
|
||||
(defun get-entry (connection uid)
|
||||
(let* ((base "ou=people,dc=coredial,dc=com")
|
||||
(filter (eldap:equalityMatch "uid" uid))
|
||||
(`#(ok #(eldap_search_result ,results ,_))
|
||||
(eldap:search connection
|
||||
`[#(base ,base)
|
||||
#(filter ,filter)
|
||||
#(attributes ["userPassword"])]))
|
||||
((cons entry _) results))
|
||||
(case results
|
||||
(`[,entry] `#(ok ,entry))
|
||||
(_ #(error not_found)))))
|
||||
|
||||
(defun password (entry)
|
||||
(let (((cons password _) (elmdap-entry:attribute entry "userPassword")))
|
||||
password))
|
Loading…
Reference in a new issue