1 #include <unistd.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include "byte.h"
6 #include "buffer.h"
7 #include "ldap.h"
8 #include "socket.h"
9 #include "ip4.h"
10 #include "str.h"
11 #include "textcode.h"
12 
13 #include <fcntl.h>
14 #include <sys/socket.h>
15 
16 #define BUFSIZE 8192
17 
18 static unsigned long messageid=1;
19 
ldapbind(int sock)20 static int ldapbind(int sock) {
21   char outbuf[1024];
22   int s=100;
23   size_t len=fmt_ldapbindrequest(outbuf+s,3,"","");
24   size_t hlen=fmt_ldapmessage(0,messageid,BindRequest,len);
25   size_t res,Len;
26   unsigned long op,result;
27   struct string matcheddn,errormessage,referral;
28   fmt_ldapmessage(outbuf+s-hlen,messageid,BindRequest,len);
29   if ((size_t)write(sock,outbuf+s-hlen,len+hlen)!=len+hlen) return 0;;
30   len=read(sock,outbuf,1024);
31   res=scan_ldapmessage(outbuf,outbuf+len,&messageid,&op,&Len);
32   if (!res) return 0;
33   if (op!=BindResponse) return 0;
34   res=scan_ldapbindresponse(outbuf+res,outbuf+res+Len,&result,&matcheddn,&errormessage,&referral);
35   if (!res) return 0;
36   if (result) return 0;
37   return 1;
38 }
39 
main(int argc,char * argv[])40 int main(int argc,char* argv[]) {
41   int sock;
42   char buf[BUFSIZE];
43   int len=0;
44   char* me;
45   if ((me=strrchr(argv[0],'/')))
46     ++me;
47   else
48     me=argv[0];
49 
50   if (argc<2) {
51 usage:
52     buffer_putsflush(buffer_2,"usage: ldapdelete ip dn\n");
53     return 0;
54   }
55 
56   sock=socket_tcp4b();
57   {
58     char ip[4];
59     if (argv[1][scan_ip4(argv[1],ip)]) goto usage;
60     if (socket_connect4(sock,ip,389)) {
61       buffer_putsflush(buffer_2,"could not connect to ldap server!\n");
62       return 1;
63     }
64   }
65   if (ldapbind(sock)) {
66     struct string s;
67 
68     s.l=strlen(argv[2]);
69     s.s=argv[2];
70 
71     len=fmt_ldapdeleterequest(buf+100,&s);
72     {
73       int tmp=fmt_ldapmessage(0,++messageid,DelRequest,len);
74       fmt_ldapmessage(buf+100-tmp,messageid,DelRequest,len);
75       write(sock,buf+100-tmp,len+tmp);
76     }
77     shutdown(sock,SHUT_WR);
78     {
79       char buf[32*1024];	/* arbitrary limit, bad! */
80       int len=0,tmp,tmp2;
81       char* max;
82 
83       unsigned long mid,op;
84       size_t slen;
85       int cur=0;
86 
87       tmp=read(sock,buf+len,sizeof(buf)-len);
88 
89       if (tmp<=0) {
90 	buffer_putsflush(buffer_2,"read error.\n");
91 	return 2;
92       }
93       len+=tmp;
94       if ((tmp2=scan_ldapmessage(buf+cur,buf+len,&mid,&op,&slen))) {
95 	max=buf+cur+slen+tmp2;
96 	if (op==DelResponse) {
97 	  unsigned long result;
98 	  struct string matcheddn, errormessage, referral;
99 	  if (scan_ldapresult(buf+cur+tmp2,max,&result,&matcheddn,&errormessage,&referral)>0) {
100 	    if (result==success) {
101 	      buffer_putsflush(buffer_2,"ok\n");
102 	    } else {
103 	      buffer_puts(buffer_2,"fail, code ");
104 	      buffer_putulong(buffer_2,result);
105 	      if (errormessage.l) {
106 		buffer_puts(buffer_2,", error message \"");
107 		buffer_put(buffer_2,errormessage.s,errormessage.l);
108 		buffer_puts(buffer_2,"\n");
109 	      }
110 	      buffer_putsflush(buffer_2,".\n");
111 	    }
112 	  } else
113 	    buffer_putsflush(buffer_2,"failed to parse result message.\n");
114 	} else
115 	  buffer_putsflush(buffer_2,"unexpected response.\n");
116       } else
117 	buffer_putsflush(buffer_2,"failed to parse ldap message.\n");
118     }
119   } else {
120     buffer_putsflush(buffer_2,"ldapbind failed\n");
121     return 2;
122   }
123   close(sock);
124 
125   return 0;
126 }
127