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