summaryrefslogtreecommitdiffstats
path: root/ldap/clients/dsgw/dsexpldif.c
blob: 8ba95159c589e45ecf7983325236354fe6e48475 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/** --- BEGIN COPYRIGHT BLOCK ---
 * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
 * Copyright (C) 2005 Red Hat, Inc.
 * All rights reserved.
  --- END COPYRIGHT BLOCK ---  */
/*
 * dsexpldif.c -- CGI configuration update handler -- directory gateway
 */

#include "dsgw.h"
#include "libadmin/libadmin.h"
static void handle_request( int reqmethod );
static void handle_post();

static char *ldiffile, *suffix;

main( argc, argv, env )
    int		argc;
    char	*argv[];
#ifdef DSGW_DEBUG
    char	*env[];
#endif
{
    int		reqmethod;

    reqmethod = dsgw_init( argc, argv,  DSGW_METHOD_POST | DSGW_METHOD_GET );
    dsgw_send_header();

#ifdef DSGW_DEBUG
   dsgw_logstringarray( "env", env ); 
#endif

    handle_request( reqmethod );

    exit( 0 );
}


#define DSGWCONFIG_EMPTY_IF_NULL( s )	( (s) == NULL ? "" : (s) )


static void
handle_request( int reqmethod )
{
    FILE	*fp;
    char	**argv, *buf, line[ BIG_LINE ];
    char	*str_valuefmt = " VALUE=\"%s\" ";
    int		did_post, argc;

    buf = dsgw_ch_malloc( strlen( progname ) + 6 );	/* room for ".html\0" */
    sprintf( buf, "%s.html", progname );
    fp = dsgw_open_html_file( buf, DSGW_ERROPT_EXIT );
    free( buf );
    did_post = 0;

    while ( dsgw_next_html_line( fp, line ))  {
	if ( dsgw_parse_line( line, &argc, &argv, 0, dsgw_simple_cond_is_true,
		NULL )) {
	    if ( dsgw_directive_is( line, DRCT_DS_INLINE_POST_RESULTS )) {
		if ( !did_post && reqmethod == DSGW_METHOD_POST ) {
		    handle_post();
		    did_post = 1;
		}
	    } else if ( dsgw_directive_is( line, DS_LDIF_FILE )) {
		dsgw_emitf( str_valuefmt,
			    DSGWCONFIG_EMPTY_IF_NULL( ldiffile ));
	    } else if ( dsgw_directive_is( line, DS_SUFFIX )) {
		dsgw_emitf( str_valuefmt,
			    DSGWCONFIG_EMPTY_IF_NULL( suffix ));
	    }
	}
    }

    fclose( fp );
}


static void
handle_post()
{
    char cmd[BIG_LINE], path[BIG_LINE];
    char    *userdb_path;

    ldiffile = dsgw_get_cgi_var( "ldif", DSGW_CGIVAR_REQUIRED );
    suffix = dsgw_get_cgi_var( "suffix", DSGW_CGIVAR_OPTIONAL );

    /* if the schema checking is off, put out a warning message */ 

    if (( userdb_path = get_userdb_dir()) == NULL ) {
  	dsgw_error( DSGW_ERR_USERDB_PATH, NULL, DSGW_ERROPT_EXIT, 0, NULL ); 
    }

    if (gc->gc_localdbconf == NULL) {
        /* remote */
        PR_snprintf (cmd, BIG_LINE, 
	    "./%s -b \"%s\" -h %s -p %d \"objectclass=*\" > %s 2> %s", 
	    DSGW_LDAPSEARCH, gc->gc_ldapsearchbase, gc->gc_ldapserver, 
	    gc->gc_ldapport, ldiffile, DSGW_NULL_DEVICE);
    }
    else {
        /* local database */
        PR_snprintf (cmd, BIG_LINE, 
	    "./%s -b \"\" -C %s \"objectclass=*\" > %s 2> %s",
            DSGW_LDAPSEARCH, gc->gc_localdbconf, ldiffile, DSGW_NULL_DEVICE);
    }
    PR_snprintf (path, BIG_LINE, "%s%s", userdb_path, DSGW_TOOLSDIR);
    chdir (path);

    fflush (stdout);
    if (system (cmd) == 0){

	/* if local database and suffix is not null, append suffix to 
	   appropriate attributes. */   

	if (( gc->gc_localdbconf != NULL) && (suffix != NULL )) {
	   app_suffix (ldiffile, suffix);
	}
	/*
	 * success: display status message 
	 */
	dsgw_emits( "<FONT SIZE=\"+1\">\n<P>The ldif file has been created.\n</FONT>\n" );
    }
    else {
	dsgw_emits( "<FONT SIZE=\"+1\">\n<P>The ldif file could not be created.\n</FONT>\n" );
    }

    dsgw_emits( "<HR>\n" );
}