begin work on modifyrequest parser
This commit is contained in:
4
Makefile
4
Makefile
@@ -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
4
TODO
Normal 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
14
ldap.h
@@ -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
68
scan_ldapmodifyrequest.c
Normal 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;
|
||||
}
|
||||
30
tinyldap.c
30
tinyldap.c
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user