From 43f8f408371f60d83b5a679be934aec905c9c717 Mon Sep 17 00:00:00 2001 From: leitner Date: Sun, 14 Jul 2002 23:34:12 +0000 Subject: [PATCH] add md5password (convert argv to md5 password string with base64 for ldif) fix ldapclient to use all the arguments and cope with fused packets (one read() returning the search result entry and the end marker). Make ldif_parse() use strallocs (remove 8k limit on payloads) --- Makefile | 4 ++- ldapclient.c | 15 ++++++++++- ldif_parse.c | 72 ++++++++++++++++++++++++++++++--------------------- md5password.c | 23 ++++++++++++++++ parse.c | 1 + tinyldap.c | 6 ++++- 6 files changed, 88 insertions(+), 33 deletions(-) create mode 100644 md5password.c diff --git a/Makefile b/Makefile index 332bb7f..8b38e1a 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ DEBUG=1 -all: t1 t2 parse dumpidx idx2ldif addindex bindrequest tinyldap tinyldap_standalone tinyldap_debug ldapclient ldapclient_str # t +all: t1 t2 parse dumpidx idx2ldif addindex bindrequest tinyldap \ +tinyldap_standalone tinyldap_debug ldapclient ldapclient_str \ +md5password # t asn1.a: fmt_asn1intpayload.o fmt_asn1length.o fmt_asn1tag.o \ fmt_asn1int.o fmt_asn1string.o fmt_asn1transparent.o scan_asn1tag.o \ diff --git a/ldapclient.c b/ldapclient.c index 7977449..dd9d991 100644 --- a/ldapclient.c +++ b/ldapclient.c @@ -76,8 +76,14 @@ usage: struct AttributeDescriptionList *n; n=malloc(sizeof(struct AttributeDescriptionList)); n->a.s=argv[i]; n->a.l=strlen(argv[i]); - n->next=next; + n->next=0; + next->next=n; next=n; + + buffer_puts(buffer_2,"requesting "); + buffer_puts(buffer_2,argv[i]); + buffer_putnlflush(buffer_2); + i++; } sr.baseObject.s=argv[2]; sr.baseObject.l=strlen(sr.baseObject.s); @@ -106,6 +112,7 @@ usage: return 0; } len+=tmp; +nextmessage: if ((tmp2=scan_ldapmessage(buf,buf+len,&mid,&op,&slen))) { max=buf+slen+tmp2; if (op==SearchResultEntry) { @@ -138,6 +145,12 @@ usage: buffer_putsflush(buffer_2,"unexpected response.\n"); return 0; } + if (maxdn=-1; (*l)->next=0; (*l)->n=0; @@ -75,12 +78,7 @@ static int parserec(buffer* b, struct ldaprec** l) { long tmp, val; base64=0; n=ofs+buffer_get_token(b,buf+ofs,8192-ofs,":",1); - buffer_feed(b); - if (*buffer_peek(b)==':') { - char dummy; - base64=1; - buffer_getc(b,&dummy); - } + if (n==0) break; i=scan_whitenskip(buf,n); buf[n]=0; if ((tmp=mduptab_adds(&attributes,buf+i))<0) { @@ -88,10 +86,20 @@ nomem: buffer_putsflush(buffer_2,"out of memory!\n"); return 1; } - n=buffer_get_token(b,buf,8192,"\n",1); - if (n==0) break; - i=scan_whitenskip(buf,n); - buf[n]=0; + if (!stralloc_copys(&payload,"")) return 2; + { + char dummy; + int res; + /* read line, skipping initial whitespace */ + for (n=0; (res=buffer_getc(b,&dummy))==1; ) { + if (dummy=='\n') break; + if (!n && dummy==':' && base64==0) { base64=1; continue; } + if (!n && (dummy==' ' || dummy=='\t')) continue; + if (!stralloc_append(&payload,&dummy)) return 2; + ++n; + } + if (res==-1) return 1; + } lookagain: { @@ -102,34 +110,36 @@ lookagain: } if (c==' ') { /* continuation */ // puts("continuation!"); - n+=buffer_get_token(b,buf+n,8192-n,"\n",1); - buf[n]=0; + n=buffer_get_token(b,buf,8192,"\n",1); + if (n==-1) return 1; + stralloc_catb(&payload,buf,n); goto lookagain; } else if (c=='\n') { struct ldaprec* m=malloc(sizeof(struct ldaprec)); if (!m) return 2; + stralloc_0(&payload); if (base64) { - len=unbase64(buf+i); - buf[i+len]=0; ++len; + len=unbase64(payload.s); + payload.s[len]=0; ++len; } else - len=n-i+1; + len=n+1; #if 0 buffer_puts(buffer_2,"feld \""); buffer_puts(buffer_2,attributes.strings.root+tmp); buffer_puts(buffer_2,"\", wert \""); - buffer_put(buffer_2,buf+i,len); + buffer_put(buffer_2,payload.s,len); buffer_putsflush(buffer_2,"\".\n"); #endif if (tmp==objectClass) { - if ((val=mduptab_add(&classes,buf+i,len-1))<0) goto nomem; + if ((val=mduptab_add(&classes,payload.s,len-1))<0) goto nomem; } else if (tmp==dn) { char* newdn=alloca(len); - if ((val=mstorage_add(&stringtable,newdn,normalize_dn(newdn,buf+i,len)))<0) goto nomem; + if ((val=mstorage_add(&stringtable,newdn,normalize_dn(newdn,payload.s,len)))<0) goto nomem; } else - if ((val=mstorage_add(&stringtable,buf+i,len))<0) goto nomem; + if ((val=mstorage_add(&stringtable,payload.s,len))<0) goto nomem; addattribute(l,tmp,val); (*l)->next=m; @@ -147,26 +157,28 @@ lookagain: // buf[n]=0; #if 1 + stralloc_0(&payload); if (base64) { - len=unbase64(buf+i); - buf[len+i]=0; ++len; + len=unbase64(payload.s); + payload.s[len]=0; ++len; } else - len=n-i+1; + len=n+1; + #if 0 - buffer_puts(buffer_2,"feld \""); - buffer_puts(buffer_2,attributes.strings.root+tmp); - buffer_puts(buffer_2,"\", wert \""); - buffer_put(buffer_2,buf+i,len); - buffer_putsflush(buffer_2,"\".\n"); + buffer_puts(buffer_2,"feld \""); + buffer_puts(buffer_2,attributes.strings.root+tmp); + buffer_puts(buffer_2,"\", wert \""); + buffer_put(buffer_2,payload.s,len); + buffer_putsflush(buffer_2,"\".\n"); #endif if (tmp==objectClass) { - if ((val=mduptab_add(&classes,buf+i,len-1))<0) goto nomem; + if ((val=mduptab_add(&classes,payload.s,len-1))<0) goto nomem; } else if (tmp==dn) { char* newdn=alloca(n-i+1); - if ((val=mstorage_add(&stringtable,newdn,normalize_dn(newdn,buf+i,len)))<0) goto nomem; + if ((val=mstorage_add(&stringtable,newdn,normalize_dn(newdn,payload.s,len)))<0) goto nomem; } else - if ((val=mstorage_add(&stringtable,buf+i,len))<0) goto nomem; + if ((val=mstorage_add(&stringtable,payload.s,len))<0) goto nomem; addattribute(l,tmp,val); #endif } while (!eof); diff --git a/md5password.c b/md5password.c new file mode 100644 index 0000000..bbbda2f --- /dev/null +++ b/md5password.c @@ -0,0 +1,23 @@ +#include +#include "buffer.h" +#include "str.h" +#include "textcode.h" + +int main(int argc,char* argv[]) { + char digest[17]; + char md5[40]; + int i; + for (i=1; i {MD5}"); + buffer_puts(buffer_1,md5); + buffer_putnlflush(buffer_1); + } + return 0; +} diff --git a/parse.c b/parse.c index 8d16d19..a5e5dde 100644 --- a/parse.c +++ b/parse.c @@ -71,6 +71,7 @@ int main() { /* we add 8 for the pair and we substract 8 * for the two saved pointers ("dn" and "objectClass") */ if (x->dn>=0) len+=8; else { + if (x->n==0 && x->next==0) break; buffer_putsflush(buffer_2,"record without dn?!\n"); dumprec(x); return 1; diff --git a/tinyldap.c b/tinyldap.c index cdfaef9..11622ec 100644 --- a/tinyldap.c +++ b/tinyldap.c @@ -605,12 +605,15 @@ authfailure: buffer_put(buffer_2,f.ava.value.s,f.ava.value.l); buffer_putsflush(buffer_2,".\n"); #endif - if (check_password(c,&password)) + if (check_password(c,&password)) { done=1; + goto found; + } } } } if (!done) goto authfailure; +found: } } { @@ -742,6 +745,7 @@ authfailure: } } case AbandonRequest: + buffer_putsflush(buffer_2,"AbandonRequest!\n"); /* do nothing */ break; default: