tinydns now actually appears to answer a test question correctly!
This commit is contained in:
2
Makefile
2
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
|
||||
|
||||
|
||||
2
ldap.h
2
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;
|
||||
};
|
||||
|
||||
15
ldap_match.c
15
ldap_match.c
@@ -5,21 +5,6 @@
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* 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->l<l1) l1=s->l;
|
||||
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) {
|
||||
|
||||
17
matchstring.c
Normal file
17
matchstring.c
Normal file
@@ -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->l<l1) l1=s->l;
|
||||
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]);
|
||||
}
|
||||
|
||||
78
tinyldap.c
78
tinyldap.c
@@ -1,4 +1,5 @@
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#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 (; i<r->n; ++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 (i<r->n) {
|
||||
*a=malloc(sizeof(struct AttributeDescriptionList));
|
||||
if (!*a) goto nomem;
|
||||
(*a)->a.s=val;
|
||||
(*a)->a.l=strlen(val);
|
||||
(*a)->next=0;
|
||||
for (;i<r->n; ++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");
|
||||
|
||||
Reference in New Issue
Block a user