81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"html/template"
|
|
"net/http"
|
|
"fmt"
|
|
"sort"
|
|
|
|
"github.com/go-ldap/ldap/v3"
|
|
)
|
|
|
|
func checkAdminLogin(w http.ResponseWriter, r *http.Request) *LoginStatus {
|
|
login := checkLogin(w, r)
|
|
if login == nil {
|
|
return nil
|
|
}
|
|
|
|
can_admin := false
|
|
for _, group := range login.UserEntry.GetAttributeValues("memberof") {
|
|
if config.GroupCanAdmin != "" && group == config.GroupCanAdmin {
|
|
can_admin = true
|
|
}
|
|
}
|
|
|
|
if !can_admin {
|
|
http.Redirect(w, r, "/", http.StatusFound)
|
|
return nil
|
|
}
|
|
|
|
return login
|
|
}
|
|
|
|
type AdminUsersTplData struct {
|
|
Login *LoginStatus
|
|
UserNameAttr string
|
|
Users []*ldap.Entry
|
|
}
|
|
|
|
func handleAdminUsers(w http.ResponseWriter, r *http.Request) {
|
|
templateAdminUsers := template.Must(template.ParseFiles("templates/layout.html", "templates/admin_users.html"))
|
|
|
|
login := checkLogin(w, r)
|
|
if login == nil {
|
|
return
|
|
}
|
|
|
|
searchRequest := ldap.NewSearchRequest(
|
|
config.UserBaseDN,
|
|
ldap.ScopeSingleLevel, ldap.NeverDerefAliases, 0, 0, false,
|
|
fmt.Sprintf("(&(objectClass=organizationalPerson))"),
|
|
[]string{config.UserNameAttr, "dn", "displayname", "givenname", "sn", "mail"},
|
|
nil)
|
|
|
|
sr, err := login.conn.Search(searchRequest)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
data := &AdminUsersTplData{
|
|
Login: login,
|
|
UserNameAttr: config.UserNameAttr,
|
|
Users: sr.Entries,
|
|
}
|
|
sort.Sort(data)
|
|
|
|
templateAdminUsers.Execute(w, data)
|
|
}
|
|
|
|
func (d *AdminUsersTplData) Len() int {
|
|
return len(d.Users)
|
|
}
|
|
|
|
func (d *AdminUsersTplData) Swap(i, j int) {
|
|
d.Users[i], d.Users[j] = d.Users[j], d.Users[i]
|
|
}
|
|
|
|
func (d *AdminUsersTplData) Less(i, j int) bool {
|
|
return d.Users[i].GetAttributeValue(config.UserNameAttr) <
|
|
d.Users[j].GetAttributeValue(config.UserNameAttr)
|
|
}
|