From d557521a5cafb3f1c84ca200b9d03a3b70163ede Mon Sep 17 00:00:00 2001 From: yo Date: Sun, 13 Nov 2022 15:17:30 +0100 Subject: [PATCH] Add /add and /delete endpoints, with dn in json body --- main.go | 75 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 12 deletions(-) diff --git a/main.go b/main.go index 0349866..3c4fa17 100644 --- a/main.go +++ b/main.go @@ -18,10 +18,11 @@ import ( "github.com/gin-gonic/gin" "github.com/go-ldap/ldap/v3" log "github.com/sirupsen/logrus" + //"github.com/gin-gonic/gin/render" ) var ( - gVersion = "0.5.3" + gVersion = "0.5.4" gRoLdap *MyLdap ) @@ -344,14 +345,18 @@ func initRouter(r *gin.Engine) { return }) - /* - * curl -u "admin:admin" --header "Content-Type: application/json" -X POST + /* 2 call methods : Either DN in url, or DN in body using /add : + * * curl -u "admin:admin" -H "Content-Type: application/json" -X POST * --data '{"objectClass":["person","top"],"cn":"newuser","sn":"New"}' \ * https://localhost:8443/cn=newuser,ou=users,dc=example,dc=org + * + * curl -u "admin:admin" -H "Content-Type: application/json" -X POST + * --data '{"dn":"cn=newuser,ou=users,dc=example,dc=org","objectClass":["person","top"],"cn":"newuser","sn":"New"}' \ + * https://localhost:8443/add */ r.POST("/:dn", ldapBasicAuth, func(c *gin.Context) { dn := c.Param("dn") - + // Get user authenticated LDAP connection from context ldapCon, err := getLdapConFromContext(c) if err != nil { @@ -369,11 +374,30 @@ func initRouter(r *gin.Engine) { return } + // Get dn in body if called with "http://1.2.3.4/add" + if strings.EqualFold(dn, "add") { + dn = attributes["dn"].(string) + } + if len(dn) == 0 { + c.AbortWithError(http.StatusBadRequest, err) + return + } + err = createEntry(ldapCon, dn, attributes) if err != nil { if strings.Contains(err.Error(), "LDAP Result Code 50") { c.AbortWithStatus(http.StatusUnauthorized) return + // "Entry Already Exists" + } else if strings.Contains(err.Error(), "LDAP Result Code 68") { + c.JSON(http.StatusCreated, gin.H{"message": "Entry already exists"}) + /* This returns 201/Created with Location header, although 303/SeeOther is specified + * c.Render(http.StatusSeeOther, render.Redirect{ + Code: 303, + Location: fmt.Sprintf("http://1.2.3.4/%s", dn), + Request: c.Request, + })*/ + return } else { c.AbortWithError(http.StatusBadRequest, err) return @@ -426,8 +450,10 @@ func initRouter(r *gin.Engine) { } }) - /* + /* 2 call methods : Either DN in url, or DN in body using /delete : * curl -i -u "admin:admin" -X DELETE https://localhost:8443/cn=newuser,ou=users,dc=example,dc=org + * or + * curl -i -u "admin:admin" -X DELETE -H "Content-Type: application/json" -d '{"dn":"cn=newuser,ou=users,dc=example,dc=org"}' https://localhost:8443/delete * * Each leaf have to be deleted (cannot delete if subordinates) */ @@ -441,14 +467,39 @@ func initRouter(r *gin.Engine) { return } - err = deleteEntry(ldapCon, dn) - if err != nil { - //log.Errorf("Error creating %s: %v", dn, err) - c.AbortWithError(http.StatusBadRequest, err) - return - } + // Unmarshall json body to a map + if c.Request.Header.Get("Content-Type") == "application/json" { + var attributes map[string]interface{} + err := c.ShouldBindJSON(&attributes) + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + + // Get dn in body if called with "http://1.2.3.4/delete" + if strings.EqualFold(dn, "delete") { + dn = attributes["dn"].(string) + } + if len(dn) == 0 { + c.AbortWithError(http.StatusBadRequest, err) + return + } - c.JSON(http.StatusCreated, gin.H{"message": "Successfully deleted"}) + err = deleteEntry(ldapCon, dn) + if err != nil { + //log.Errorf("Error creating %s: %v", dn, err) + c.AbortWithError(http.StatusBadRequest, err) + return + } + + c.JSON(http.StatusOK, gin.H{"message": "Successfully deleted"}) + } else { + err = deleteEntry(ldapCon, dn) + if err != nil { + c.AbortWithError(http.StatusBadRequest, err) + return + } + } }) }