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" );
}
|