mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2025-12-28 16:48:30 -05:00
55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package ldapserver
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
|
|
ber "github.com/go-asn1-ber/asn1-ber"
|
|
"github.com/go-ldap/ldap/v3"
|
|
)
|
|
|
|
func HandleDeleteRequest(req *ber.Packet, boundDN string, server *Server, conn net.Conn) error {
|
|
if boundDN == "" {
|
|
return ldap.NewError(ldap.LDAPResultInsufficientAccessRights, errors.New("anonymous Write denied"))
|
|
}
|
|
delReq, err := parseDeleteRequest(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fnNames := []string{}
|
|
for k := range server.DeleteFns {
|
|
fnNames = append(fnNames, k)
|
|
}
|
|
fn := routeFunc(delReq.DN, fnNames)
|
|
var del Deleter
|
|
if del = server.DeleteFns[fn]; del == nil {
|
|
if fn == "" {
|
|
err = fmt.Errorf("no suitable handler found for dn: '%s'", delReq.DN)
|
|
} else {
|
|
err = fmt.Errorf("handler '%s' does not support add", fn)
|
|
}
|
|
return ldap.NewError(ldap.LDAPResultUnwillingToPerform, err)
|
|
}
|
|
code, err := del.Delete(boundDN, delReq, conn)
|
|
return ldap.NewError(uint16(code), err)
|
|
}
|
|
|
|
func parseDeleteRequest(req *ber.Packet) (*ldap.DelRequest, error) {
|
|
delReq := ldap.DelRequest{}
|
|
// LDAP Delete requests contain just the DN (no Sequence, or set)
|
|
// i.e. they have no childre
|
|
if len(req.Children) != 0 {
|
|
return nil, ldap.NewError(ldap.LDAPResultProtocolError, errors.New("invalid delete request"))
|
|
}
|
|
dn := req.Data.String()
|
|
|
|
_, err := ldap.ParseDN(dn)
|
|
if err != nil {
|
|
return nil, ldap.NewError(ldap.LDAPResultProtocolError, err)
|
|
}
|
|
delReq.DN = dn
|
|
|
|
return &delReq, nil
|
|
}
|