begin work on modifyrequest parser

This commit is contained in:
leitner
2002-04-03 13:44:15 +00:00
parent af04089fb8
commit 0b2a282ec0
5 changed files with 118 additions and 2 deletions

View File

@@ -16,7 +16,7 @@ freefilter.o freeava.o scan_ldapava.o fmt_ldapsearchresultentry.o \
fmt_ldapstring.o freepal.o scan_ldapsearchresultentry.o \
fmt_ldapresult.o fmt_ldappal.o fmt_ldapadl.o fmt_ldapava.o \
fmt_ldapsearchfilter.o fmt_ldapsearchrequest.o matchstring.o \
matchprefix.o
matchprefix.o scan_ldapmodifyrequest.o
ldif.a: ldif_parse.o ldap_match.o ldap_match_mapped.o
@@ -59,7 +59,7 @@ parse tinyldap_standalone tinyldap_debug ldapclient_str addindex \
dumpidx *.da *.bbg *.bb *.gcov gmon.out
tar: clean
cd ..; tar cvvf ldap.tar.bz2 ldap --use=bzip2 --exclude CVS --exclude exp.ldif --exclude polyp* --exclude rfc*
cd ..; tar cvvf tinyldap.tar.bz2 tinyldap --use=bzip2 --exclude capture --exclude CVS --exclude exp.ldif --exclude polyp* --exclude rfc*
fmt_asn1int.o: fmt_asn1int.c
fmt_asn1intpayload.o: fmt_asn1intpayload.c

4
TODO Normal file
View File

@@ -0,0 +1,4 @@
- add support for case insensitive matching
- add real dn parsing
- add write support with an external journal

14
ldap.h
View File

@@ -59,6 +59,18 @@ struct SearchResultEntry {
struct PartialAttributeList* attributes;
};
struct Modification {
enum { Add=0, Delete=1, Replace=2 } operation;
struct string AttributeDescription; /* ? */
struct AttributeDescriptionList vals;
struct Modification* next;
};
struct ModifyRequest {
struct string object;
struct Modification m;
};
enum ldapops {
BindRequest=0, BindResponse=1,
UnbindRequest=2,
@@ -92,6 +104,7 @@ int scan_ldapsearchresultentry(const char* src,const char* max,struct SearchResu
int scan_ldapresult(const char* src,const char* max,long* result,
struct string* matcheddn,struct string* errormessage,
struct string* referral);
int scan_ldapmodifyrequest(const char* src,const char* max,struct ModifyRequest* m);
int fmt_ldapstring(char* dest,struct string* s);
int fmt_ldapmessage(char* dest,long messageid,long op,long len);
@@ -104,6 +117,7 @@ int fmt_ldappal(char* dest,struct PartialAttributeList* pal);
int fmt_ldapava(char* dest,struct AttributeValueAssertion* a);
int fmt_ldapadl(char* dest,struct AttributeDescriptionList* adl);
int fmt_ldapavl(char* dest,struct AttributeDescriptionList* adl);
int fmt_ldapmodifyrequest(char* dest,struct ModifyRequest* m);
#define fmt_ldapbindresponse(a,b,c,d,e) fmt_ldapresult(a,b,c,d,e)
#define fmt_ldapsearchresultdone(a,b,c,d,e) fmt_ldapresult(a,b,c,d,e)

68
scan_ldapmodifyrequest.c Normal file
View File

@@ -0,0 +1,68 @@
#include <stdlib.h>
#include "asn1.h"
#include "ldap.h"
#if 0
ModifyRequest ::= [APPLICATION 6] SEQUENCE {
object LDAPDN,
modification SEQUENCE OF SEQUENCE {
operation ENUMERATED {
add (0),
delete (1),
replace (2) },
modification AttributeTypeAndValues } }
AttributeTypeAndValues ::= SEQUENCE {
type AttributeDescription,
vals SET OF AttributeValue }
#endif
int scan_ldapmodifyrequest(const char* src,const char* max,struct ModifyRequest* m) {
int res,tmp;
long oslen; /* outer sequence length */
struct Modification* last=0;
if (!(res=scan_ldapstring(src,max,&m->object))) goto error;
if (!(tmp=scan_asn1SEQUENCE(src+res,max,&oslen))) goto error;
res+=tmp;
if (src+res+oslen>max) goto error;
max=src+res+oslen;
if (src+res>=max) goto error; /* need at least one record */
do {
long islen, etmp;
if (last) {
struct Modification* cur;
if (!(cur=malloc(sizeof(struct Modification)))) goto error;
last->next=cur; last=cur;
} else
last=&m->m;
last->next=0;
if (!(tmp=scan_asn1SEQUENCE(src+res,max,&islen))) goto error;
res+=tmp;
if (!(tmp=scan_asn1ENUMERATED(src+res,max,&etmp))) goto error;
if (etmp>2) goto error; last->operation=etmp; res+=tmp;
{
long iislen; /* urgh, _three_ levels of indirection */
const char* imax;
if (!(tmp=scan_asn1SEQUENCE(src+res,max,&iislen))) goto error;
imax=src+res+iislen;
if (imax>max) goto error;
res+=tmp;
if (!(tmp=scan_ldapstring(src+res,imax,&last->AttributeDescription))) goto error;
res+=tmp;
{
long iiislen; /* urgh, _four_ levels of indirection */
const char* iimax;
if (!(tmp=scan_asn1SET(src+res,max,&iiislen))) goto error;
iimax=src+res+iiislen;
if (src+res+iiislen!=imax) goto error; res+=tmp;
while (src+res<iimax) {
/* TODO */
}
}
}
break;
} while (src+res<max);
return res;
error:
return 0;
}

View File

@@ -494,6 +494,36 @@ int handle(int in,int out) {
case UnbindRequest:
close(out); if (in!=out) close(in);
return 0;
case ModifyRequest:
{
struct ModifyRequest mr;
int tmp;
buffer_putsflush(buffer_2,"modifyrequest!\n");
if ((tmp=scan_ldapmodifyrequest(buf+res,buf+res+len,&mr))) {
buffer_puts(buffer_1,"modify request: dn \"");
buffer_put(buffer_1,mr.object.s,mr.object.l);
buffer_putsflush(buffer_1,"\"\n");
switch (mr.m.operation) {
case 0: buffer_puts(buffer_1,"Add\n"); break;
case 1: buffer_puts(buffer_1,"Delete\n"); break;
case 2: buffer_puts(buffer_1,"Replace\n"); break;
}
buffer_put(buffer_1,mr.m.AttributeDescription.s,mr.m.AttributeDescription.l);
buffer_puts(buffer_1,"\n");
{
struct AttributeDescriptionList* x=&mr.m.vals;
do {
buffer_puts(buffer_1," -> \"");
buffer_put(buffer_1,x->a.s,x->a.l);
buffer_putsflush(buffer_1,"\"\n");
x=x->next;
} while (x);
}
} else {
buffer_putsflush(buffer_2,"couldn't parse modify request!\n");
exit(1);
}
}
default:
buffer_puts(buffer_2,"unknown request type ");
buffer_putulong(buffer_2,op);