aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2020-02-09 23:04:27 +0100
committerAlex Auvolat <alex@adnab.me>2020-02-09 23:04:27 +0100
commitfa96e61d75127d087b776c69df4dadd90197e4e3 (patch)
treebffa0b851431bcd31e88b4dfe5c83933408be386
parente51bff05d225ce68143b0aefa282116fe5eb587f (diff)
downloadguichet-fa96e61d75127d087b776c69df4dadd90197e4e3.tar.gz
guichet-fa96e61d75127d087b776c69df4dadd90197e4e3.zip
Add form to create objects
-rw-r--r--admin.go81
-rw-r--r--main.go1
-rw-r--r--templates/admin_create.html43
-rw-r--r--templates/admin_ldap.html8
4 files changed, 133 insertions, 0 deletions
diff --git a/admin.go b/admin.go
index def23d6..63a1194 100644
--- a/admin.go
+++ b/admin.go
@@ -1,6 +1,7 @@
package main
import (
+ "regexp"
"strings"
"fmt"
"html/template"
@@ -453,3 +454,83 @@ func handleAdminLDAP(w http.ResponseWriter, r *http.Request) {
Success: dSuccess,
})
}
+
+type CreateData struct {
+ SuperDN string
+
+ IdType string
+ IdValue string
+ DisplayName string
+ StructuralObjectClass string
+ ObjectClass string
+
+ Error string
+}
+
+func handleAdminCreate(w http.ResponseWriter, r *http.Request) {
+ templateAdminCreate := template.Must(template.ParseFiles("templates/layout.html", "templates/admin_create.html"))
+
+ login := checkAdminLogin(w, r)
+ if login == nil {
+ return
+ }
+
+ template := mux.Vars(r)["template"]
+ super_dn := mux.Vars(r)["super_dn"]
+
+ data := &CreateData{
+ SuperDN: super_dn,
+ }
+ if template == "user" {
+ data.IdType = config.UserNameAttr
+ data.StructuralObjectClass = "inetOrgPerson"
+ data.ObjectClass = "inetOrgPerson\norganizationalPerson\nperson\ntop"
+ } else if template == "group" {
+ data.IdType = config.UserNameAttr
+ data.StructuralObjectClass = "groupOfNames"
+ data.ObjectClass = "groupOfNames\ntop"
+ }
+
+ if r.Method == "POST" {
+ r.ParseForm()
+ data.IdType = strings.Join(r.Form["idtype"], "")
+ data.IdValue = strings.Join(r.Form["idvalue"], "")
+ data.DisplayName = strings.Join(r.Form["displayname"], "")
+ data.StructuralObjectClass = strings.Join(r.Form["soc"], "")
+ data.ObjectClass = strings.Join(r.Form["oc"], "")
+
+ object_class := []string{}
+ for _, oc := range strings.Split(data.ObjectClass, "\n") {
+ x := strings.TrimSpace(oc)
+ if x != "" {
+ object_class = append(object_class, x)
+ }
+ }
+
+ if len(object_class) == 0 {
+ data.Error = "No object class specified"
+ } else if match, err := regexp.MatchString("^[a-z]+$", data.IdType); err != nil || !match {
+ data.Error = "Invalid identifier type"
+ } else if len(data.IdValue) == 0 {
+ data.Error = "No identifier specified"
+ } else if match, err := regexp.MatchString("^[\\d\\w_-]+$", data.IdValue); err != nil || !match {
+ data.Error = "Invalid identifier"
+ } else {
+ dn := data.IdType + "=" + data.IdValue + "," + super_dn
+ req := ldap.NewAddRequest(dn, nil)
+ req.Attribute("objectClass", object_class)
+ req.Attribute("structuralObjectClass",
+ []string{data.StructuralObjectClass})
+ req.Attribute("displayname", []string{data.DisplayName})
+ err := login.conn.Add(req)
+ if err != nil {
+ data.Error = err.Error()
+ } else {
+ http.Redirect(w, r, "/admin/ldap/" + dn, http.StatusFound)
+ }
+
+ }
+ }
+
+ templateAdminCreate.Execute(w, data)
+}
diff --git a/main.go b/main.go
index a0d5b07..a35ce8b 100644
--- a/main.go
+++ b/main.go
@@ -115,6 +115,7 @@ func main() {
r.HandleFunc("/admin/users", handleAdminUsers)
r.HandleFunc("/admin/groups", handleAdminGroups)
r.HandleFunc("/admin/ldap/{dn}", handleAdminLDAP)
+ r.HandleFunc("/admin/create/{template}/{super_dn}", handleAdminCreate)
staticfiles := http.FileServer(http.Dir("static"))
r.Handle("/static/{file:.*}", http.StripPrefix("/static/", staticfiles))
diff --git a/templates/admin_create.html b/templates/admin_create.html
new file mode 100644
index 0000000..94dee5b
--- /dev/null
+++ b/templates/admin_create.html
@@ -0,0 +1,43 @@
+{{define "title"}}Nouvel objet |{{end}}
+
+{{define "body"}}
+<div class="d-flex">
+ <h4>Créer un objet</h4>
+ <a class="ml-auto btn btn-info" href="/">Retour</a>
+</div>
+
+{{if .Error}}
+ <div class="alert alert-danger mt-4">Impossible de créer l'objet.
+ <div style="font-size: 0.8em">{{ .Error }}</div>
+ </div>
+{{end}}
+
+<form method="POST" class="mt-4">
+ <div class="form-group">
+ <label>Parent:</label>
+ <input type="text" disabled="true" class="form-control" value="{{ .SuperDN }}" />
+ </div>
+ <div class="form-group">
+ <label for="idvalue">Identifiant:</label>
+ <input type="text" id="idvalue" name="idvalue" class="form-control" value="{{ .IdValue }}" />
+ </div>
+ <div class="form-group">
+ <label for="idtype">Type d'identifiant:</label>
+ <input type="text" id="idtype" name="idtype" class="form-control" value="{{ .IdType }}" />
+ </div>
+ <div class="form-group">
+ <label for="displayname">Nom:</label>
+ <input type="text" id="displayname" name="displayname" class="form-control" value="{{ .DisplayName }}" />
+ </div>
+ <div class="form-group">
+ <label for="soc">StructuralObjectClass:</label>
+ <input type="text" id="soc" name="soc" class="form-control" value="{{ .StructuralObjectClass }}" />
+ </div>
+ <div class="form-group">
+ <label for="oc">ObjectClass:</label>
+ <textarea rows="5" id="oc" name="oc" class="form-control">{{ .ObjectClass }}</textarea>
+ </div>
+ <button type="submit" class="btn btn-primary">Créer l'objet</button>
+</form>
+
+{{end}}
diff --git a/templates/admin_ldap.html b/templates/admin_ldap.html
index fa4b934..53570fe 100644
--- a/templates/admin_ldap.html
+++ b/templates/admin_ldap.html
@@ -21,6 +21,14 @@
</nav>
</div>
+<div class="mt-4">
+ <div class="d-flex">
+ <a class="ml-auto btn btn-sm btn-success" href="/admin/create/user/{{.DN}}">+utilisateur</a>
+ <a class="ml-4 btn btn-sm btn-success" href="/admin/create/group/{{.DN}}">+groupe</a>
+ <a class="ml-4 btn btn-sm btn-success" href="/admin/create/generic/{{.DN}}">+objet</a>
+ </div>
+</div>
+
<table class="table mt-4">
<tbody>
{{range .Children}}