diff --git a/Makefile b/Makefile index 8355757..26b563b 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ scan_ldapstring.o scan_ldapsearchfilter.o scan_ldapsearchrequest.o \ 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 +fmt_ldapsearchfilter.o fmt_ldapsearchrequest.o matchstring.o ldif.a: ldif_parse.o ldap_match.o strduptab.o strstorage.o diff --git a/ldap.h b/ldap.h index f894bc6..be6e4e2 100644 --- a/ldap.h +++ b/ldap.h @@ -6,6 +6,8 @@ struct string { const char* s; }; +int matchstring(struct string* s,const char* c); + struct AttributeValueAssertion { struct string desc, value; }; diff --git a/ldap_match.c b/ldap_match.c index fdc1ece..760a489 100644 --- a/ldap_match.c +++ b/ldap_match.c @@ -5,21 +5,6 @@ #include #include -/* behave like strcmp */ -static int matchstring(struct string* s,const char* c) { - int l,l1,i; - if (!c) return -1; - l1=l=strlen(c); - if (s->ll; - i=byte_diff(s->s,l1,c); - if (i) return i; - /* one is a prefix of the other */ - if (l==s->l) return 0; - if (c[l1]) /* is c the longer string? */ - return c[l1]; - return -(int)(s->s[l1]); -} - /* look up value of an attribute for an LDIF record. * Return NULL if not found */ static const char* findattr(struct ldaprec* f,struct string* name) { diff --git a/matchstring.c b/matchstring.c new file mode 100644 index 0000000..b4fdf3e --- /dev/null +++ b/matchstring.c @@ -0,0 +1,17 @@ +#include "ldif.h" + +/* behave like strcmp */ +int matchstring(struct string* s,const char* c) { + int l,l1,i; + if (!c) return -1; + l1=l=strlen(c); + if (s->ll; + i=byte_diff(s->s,l1,c); + if (i) return i; + /* one is a prefix of the other */ + if (l==s->l) return 0; + if (c[l1]) /* is c the longer string? */ + return c[l1]; + return -(int)(s->s[l1]); +} + diff --git a/tinyldap.c b/tinyldap.c index 4ccaf66..c5e10cd 100644 --- a/tinyldap.c +++ b/tinyldap.c @@ -1,4 +1,5 @@ #include +#include #include "byte.h" #include "buffer.h" #include "ldap.h" @@ -55,12 +56,83 @@ int main() { break; case SearchRequest: { - struct SearchRequest br; + struct SearchRequest sr; int tmp; - if ((tmp=scan_ldapsearchrequest(buf+res,buf+res+len,&br))) { + if ((tmp=scan_ldapsearchrequest(buf+res,buf+res+len,&sr))) { struct ldaprec* r=first; while (r) { - if (ldap_match(r,&br)) { + if (ldap_match(r,&sr)) { + struct SearchResultEntry sre; + struct PartialAttributeList** pal=&sre.attributes; + sre.objectName.s=r->dn; sre.objectName.l=strlen(r->dn); + sre.attributes=0; + /* now go through list of requested attributes */ + { + struct AttributeDescriptionList* adl=sr.attributes; + while (adl) { + const char* val=0; + int i=0; + buffer_puts(buffer_2,"looking for attribute \""); + buffer_put(buffer_2,adl->a.s,adl->a.l); + buffer_putsflush(buffer_2,"\"\n"); + if (!matchstring(&adl->a,"dn")) val=r->dn; else + if (!matchstring(&adl->a,"cn")) val=r->cn; else + if (!matchstring(&adl->a,"mail")) val=r->mail; else + if (!matchstring(&adl->a,"sn")) val=r->sn; else + for (; in; ++i) { + buffer_puts(buffer_2,"comparing with \""); + buffer_puts(buffer_2,r->a[i].name); + buffer_putsflush(buffer_2,"\"\n"); + if (!matchstring(&adl->a,r->a[i].name)) + val=r->a[i].value; + } + if (val) { + *pal=malloc(sizeof(struct PartialAttributeList)); + if (!*pal) { +nomem: + buffer_putsflush(buffer_2,"out of virtual memory!\n"); + exit(1); + } + (*pal)->type=adl->a; + { + struct AttributeDescriptionList** a=&(*pal)->values; + while (in) { + *a=malloc(sizeof(struct AttributeDescriptionList)); + if (!*a) goto nomem; + (*a)->a.s=val; + (*a)->a.l=strlen(val); + (*a)->next=0; + for (;in; ++i) + if (!matchstring(&adl->a,r->a[i].name)) { + val=r->a[i].value; + break; + } + } + } + (*pal)->next=0; + pal=&(*pal)->next; + } + adl=adl->next; + } + } + { + long l=fmt_ldapsearchresultentry(0,&sre); + char *buf=alloca(l+300); /* you never know ;) */ + long tmp; + buffer_puts(buffer_2,"sre len "); + buffer_putulong(buffer_2,l); + buffer_putsflush(buffer_2,".\n"); + tmp=fmt_ldapmessage(buf,++messageid,SearchResultEntry,l); + fmt_ldapsearchresultentry(buf+tmp,&sre); + write(1,buf,l+tmp); + } + { + char buf[1000]; + long l=fmt_ldapsearchresultdone(buf+100,0,"","",""); + int hlen=fmt_ldapmessage(0,++messageid,SearchResultDone,l); + fmt_ldapmessage(buf+100-hlen,messageid,SearchResultDone,l); + write(1,buf+100-hlen,l+hlen); + } buffer_puts(buffer_2,"found: "); buffer_puts(buffer_2,r->dn); buffer_putsflush(buffer_2,"\n");