1 /*
2  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 /*
7  * The contents of this file are subject to the Netscape Public
8  * License Version 1.1 (the "License"); you may not use this file
9  * except in compliance with the License. You may obtain a copy of
10  * the License at http://www.mozilla.org/NPL/
11  *
12  * Software distributed under the License is distributed on an "AS
13  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14  * implied. See the License for the specific language governing
15  * rights and limitations under the License.
16  *
17  * The Original Code is Mozilla Communicator client code, released
18  * March 31, 1998.
19  *
20  * The Initial Developer of the Original Code is Netscape
21  * Communications Corporation. Portions created by Netscape are
22  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
23  * Rights Reserved.
24  *
25  * Contributor(s):
26  */
27 
28 /* ldapdelete.c - simple program to delete an entry using LDAP */
29 
30 #include "ldaptool.h"
31 #ifdef SOLARIS_LDAP_CMD
32 #include <locale.h>
33 #endif	/* SOLARIS_LDAP_CMD */
34 
35 static int	contoper;
36 
37 #ifdef later
38 static int	delbypasscmd, yestodelete;
39 #endif
40 
41 #ifndef SOLARIS_LDAP_CMD
42 #define gettext(s) s
43 #endif
44 
45 
46 static LDAP	*ld;
47 
48 LDAPMessage *result, *e;
49 char *my_filter = "(objectclass=*)";
50 
51 static int dodelete( LDAP *ld, char *dn, LDAPControl **serverctrls );
52 static void options_callback( int option, char *optarg );
53 
54 static void
usage(void)55 usage( void )
56 {
57     fprintf( stderr, gettext("usage: %s [options] [dn...]\n"), ldaptool_progname );
58     fprintf( stderr, gettext("options:\n") );
59     ldaptool_common_usage( 0 );
60     fprintf( stderr, gettext("    -a\t\tBy-pass confirmation question when deleting a branch\n") );
61     fprintf( stderr, gettext( "    -c\t\tcontinuous mode (do not stop on errors)\n") );
62     fprintf( stderr, gettext( "    -f file\tread DNs to delete from file (default: standard input)\n") );
63     exit( LDAP_PARAM_ERROR );
64 }
65 
66 
67 int
main(int argc,char ** argv)68 main( int argc, char **argv )
69 {
70     char	buf[ 4096 ];
71     int		rc, deref, optind;
72     LDAPControl	*ldctrl;
73 
74 #ifdef notdef
75 #ifdef HPUX11
76 #ifndef __LP64__
77 	_main( argc, argv);
78 #endif /* __LP64_ */
79 #endif /* HPUX11 */
80 #endif
81 
82 #ifdef SOLARIS_LDAP_CMD
83     char *locale = setlocale(LC_ALL, "");
84     textdomain(TEXT_DOMAIN);
85 #endif	/* SOLARIS_LDAP_CMD */
86     contoper = 0;
87 
88 #ifdef later
89     delbypasscmd = 0;
90 #endif
91 
92     optind = ldaptool_process_args( argc, argv, "c", 0, options_callback );
93 
94     if ( optind == -1 ) {
95 	usage();
96     }
97 
98     if ( ldaptool_fp == NULL && optind >= argc ) {
99 	ldaptool_fp = stdin;
100     }
101 
102     ld = ldaptool_ldap_init( 0 );
103 
104     deref = LDAP_DEREF_NEVER;	/* prudent, but probably unnecessary */
105     ldap_set_option( ld, LDAP_OPT_DEREF, &deref );
106 
107     ldaptool_bind( ld );
108 
109     if (( ldctrl = ldaptool_create_manage_dsait_control()) != NULL ) {
110 	ldaptool_add_control_to_array( ldctrl, ldaptool_request_ctrls);
111     }
112 
113     if ((ldctrl = ldaptool_create_proxyauth_control(ld)) !=NULL) {
114 	ldaptool_add_control_to_array( ldctrl, ldaptool_request_ctrls);
115     }
116 
117     if ( ldaptool_fp == NULL ) {
118 	for ( ; optind < argc; ++optind ) {
119             char *conv;
120 
121             conv = ldaptool_local2UTF8( argv[ optind ] );
122 	    rc = dodelete( ld, conv, ldaptool_request_ctrls );
123             if( conv != NULL ) {
124                 free( conv );
125             }
126 	}
127     } else {
128 	rc = 0;
129 	while ((rc == 0 || contoper) &&
130 		fgets(buf, sizeof(buf), ldaptool_fp) != NULL) {
131 	    buf[ strlen( buf ) - 1 ] = '\0';	/* remove trailing newline */
132 	    if ( *buf != '\0' ) {
133 	          rc = dodelete( ld, buf, ldaptool_request_ctrls );
134 	    }
135 	}
136     }
137 
138     ldaptool_reset_control_array( ldaptool_request_ctrls );
139     ldaptool_cleanup( ld );
140 
141     /* check for and report output error */
142     fflush( stdout );
143     rc = ldaptool_check_ferror( stdout, rc,
144 		gettext("output error (output might be incomplete)") );
145     return( rc );
146 }
147 
148 static void
options_callback(int option,char * optarg)149 options_callback( int option, char *optarg )
150 {
151     switch( option ) {
152     case 'c':	/* continuous operation mode */
153 	++contoper;
154 	break;
155     default:
156 	usage();
157     }
158 }
159 
160 static int
dodelete(LDAP * ld,char * dn,LDAPControl ** serverctrls)161 dodelete( LDAP *ld, char *dn, LDAPControl **serverctrls )
162 {
163     int         rc;
164 
165     if ( ldaptool_verbose ) {
166         printf( gettext("%sdeleting entry %s\n"), ldaptool_not ? "!" : "", dn );
167     }
168     if ( ldaptool_not ) {
169         rc = LDAP_SUCCESS;
170     } else if (( rc = ldaptool_delete_ext_s( ld, dn, serverctrls, NULL,
171             "ldap_delete" )) == LDAP_SUCCESS && ldaptool_verbose ) {
172         printf( gettext("entry removed\n") );
173     }
174 
175     return( rc );
176 }
177 
178 #ifdef later
179 
180 /* This code broke iDS.....it will have to be revisited */
181 static int
dodelete(LDAP * ld,char * dn,LDAPControl ** serverctrls)182 dodelete( LDAP *ld, char *dn, LDAPControl **serverctrls )
183 {
184     int rc;
185     Head HeadNode;
186     Element *datalist;
187     char ch;
188 
189     if ( ldaptool_verbose ) {
190         printf( gettext("%sdeleting entry %s\n"), ldaptool_not ? "!" : "", dn );
191     }
192     if ( ldaptool_not ) {
193         rc = LDAP_SUCCESS;
194     }
195     else { /* else 1 */
196        L_Init(&HeadNode);
197 
198        if ( (rc = ldap_search_s( ld, dn, LDAP_SCOPE_SUBTREE, my_filter, NULL, 0, &result )) != LDAP_SUCCESS ) {
199           ldaptool_print_lderror( ld, "ldap_search", LDAPTOOL_CHECK4SSL_IF_APPROP );
200        }
201        else { /* else 2 */
202           for ( e = ldap_first_entry( ld, result ); e != NULL; e = ldap_next_entry( ld, e ) ) {
203              if ( ( dn = ldap_get_dn( ld, e ) ) != NULL ) {
204                 datalist = (Element *)malloc(sizeof(Element));
205                 datalist->data = dn;
206 	        L_Insert(datalist, &HeadNode);
207              }
208           }
209           if ( ((Head *)&HeadNode)->count > 1 ) {
210              yestodelete = 0;
211              if ( delbypasscmd == 0 ) {
212                 printf( gettext("Are you sure you want to delete the entire branch rooted at %s? [no]\n"), (char *)((Element *)(((Head *)&HeadNode)->first))->data);
213                 ch = getchar();
214                 if ( (ch == 'Y') || (ch == 'y')) {
215                    yestodelete = 1;
216                 }
217              } else {
218                   yestodelete = 1;
219              }
220           } else {
221 	       yestodelete = 1;
222           }
223           if ( yestodelete == 1 ) {
224              for ( datalist = ((Head *)&HeadNode)->last; datalist; datalist = datalist->left ) {
225                 if (datalist)  {
226                    if ((rc = ldaptool_delete_ext_s( ld, (char *)datalist->data, serverctrls, NULL, "ldap_delete" )) == LDAP_SUCCESS && ldaptool_verbose ) {
227                       printf( gettext("%s entry removed\n"), (char *)datalist->data );
228                    }
229                    L_Remove(datalist, (Head *)&HeadNode);
230                    ldap_memfree(datalist->data);
231                    free ( datalist );
232                 }
233              }
234            } /* end if (yestodelete) */
235       } /* else 2 */
236     } /* else 1 */
237     return (rc);
238 } /* function end bracket */
239 #endif
240