better filter handling
This commit is contained in:
@@ -28,7 +28,7 @@ int fmt_ldapsubstring(char* dest,struct Substring* s) {
|
||||
}
|
||||
|
||||
int fmt_ldapsearchfilter(char* dest,struct Filter* f) {
|
||||
long sum,tmp;
|
||||
long sum,tmp,tmp2=0;
|
||||
switch (f->type) {
|
||||
case AND: case OR: case NOT:
|
||||
sum=fmt_ldapsearchfilter(dest,f->x); break;
|
||||
@@ -57,5 +57,6 @@ int fmt_ldapsearchfilter(char* dest,struct Filter* f) {
|
||||
if (dest) byte_copyr(dest+tmp+1,sum,dest);
|
||||
fmt_asn1tag(dest,PRIVATE,CONSTRUCTED,f->type);
|
||||
fmt_asn1length(dest+1,sum);
|
||||
return sum+tmp+1;
|
||||
if (f->next) tmp2=fmt_ldapsearchfilter(dest+sum+tmp+1,f->next);
|
||||
return sum+tmp+tmp2+1;
|
||||
}
|
||||
|
||||
1
ldap.h
1
ldap.h
@@ -115,6 +115,7 @@ 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 scan_ldapsearchfilterstring(const char* src,struct Filter** f);
|
||||
|
||||
int fmt_ldapstring(char* dest,struct string* s);
|
||||
int fmt_ldapmessage(char* dest,long messageid,long op,long len);
|
||||
|
||||
18
ldapclient.c
18
ldapclient.c
@@ -43,7 +43,7 @@ int main(int argc,char* argv[]) {
|
||||
|
||||
if (argc<5) {
|
||||
usage:
|
||||
buffer_putsflush(buffer_2,"usage: ldapclient ip baseObject foo=bar baz [buzz...]\n");
|
||||
buffer_putsflush(buffer_2,"usage: ldapclient ip baseObject filter foo [bar...]\n");
|
||||
return 0;
|
||||
}
|
||||
sock=socket_tcp4();
|
||||
@@ -56,18 +56,16 @@ usage:
|
||||
}
|
||||
}
|
||||
if (ldapbind(sock)) {
|
||||
struct Filter f;
|
||||
struct Filter *f;
|
||||
struct AttributeDescriptionList adl;
|
||||
struct AttributeDescriptionList *next;
|
||||
struct SearchRequest sr;
|
||||
int i;
|
||||
f.x=f.next=0;
|
||||
f.type=EQUAL;
|
||||
f.ava.desc.s=argv[3]; f.ava.desc.l=str_chr(argv[3],'=');
|
||||
if (argv[3][f.ava.desc.l] != '=') goto usage;
|
||||
f.ava.value.s=argv[3]+f.ava.desc.l+1; f.ava.value.l=strlen(f.ava.value.s);
|
||||
if (f.ava.value.l==1 && f.ava.value.s[0]=='*') f.type=PRESENT;
|
||||
f.a=0;
|
||||
if (!scan_ldapsearchfilterstring(argv[3],&f)) {
|
||||
buffer_putsflush(buffer_2,"could not parse filter!\n");
|
||||
close(sock);
|
||||
return 1;
|
||||
}
|
||||
i=4; /* This should be the first index to an attribute argument in argv[] */
|
||||
adl.a.s=argv[i];
|
||||
adl.a.l=strlen(argv[i]);
|
||||
@@ -90,7 +88,7 @@ usage:
|
||||
sr.baseObject.s=argv[2]; sr.baseObject.l=strlen(sr.baseObject.s);
|
||||
sr.scope=wholeSubtree; sr.derefAliases=neverDerefAliases;
|
||||
sr.sizeLimit=sr.timeLimit=sr.typesOnly=0;
|
||||
sr.filter=&f;
|
||||
sr.filter=f;
|
||||
sr.attributes=&adl;
|
||||
len=fmt_ldapsearchrequest(buf+100,&sr);
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user