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
35static int	contoper;
36
37#ifdef later
38static int	delbypasscmd, yestodelete;
39#endif
40
41#ifndef SOLARIS_LDAP_CMD
42#define gettext(s) s
43#endif
44
45
46static LDAP	*ld;
47
48LDAPMessage *result, *e;
49char *my_filter = "(objectclass=*)";
50
51static int dodelete( LDAP *ld, char *dn, LDAPControl **serverctrls );
52static void options_callback( int option, char *optarg );
53
54static void
55usage( 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
67int
68main( 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
148static void
149options_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
160static int
161dodelete( 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 */
181static int
182dodelete( 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