summaryrefslogtreecommitdiffstats
path: root/ldap/clients/dsgw/lang.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldap/clients/dsgw/lang.c')
-rw-r--r--ldap/clients/dsgw/lang.c246
1 files changed, 246 insertions, 0 deletions
diff --git a/ldap/clients/dsgw/lang.c b/ldap/clients/dsgw/lang.c
new file mode 100644
index 00000000..3771ead5
--- /dev/null
+++ b/ldap/clients/dsgw/lang.c
@@ -0,0 +1,246 @@
+/**
+ * PROPRIETARY/CONFIDENTIAL. Use of this product is subject to
+ * license terms. Copyright © 2001 Sun Microsystems, Inc.
+ * Some preexisting portions Copyright © 2001 Netscape Communications Corp.
+ * All rights reserved.
+ */
+/*
+ * Convert a document from ../html, or redirect the server to it.
+ */
+
+#include "dsgw.h"
+#include "dbtdsgw.h"
+
+#ifdef XP_WIN
+#define PATH_SLASH "\\"
+#else
+#define PATH_SLASH "/"
+#endif
+
+static int
+doc_is_UTF_8 (const char* docname)
+{
+ static const char* suffixes [] = {".html", ".htm", NULL};
+ const size_t doclen = strlen (docname);
+ const char** suf = suffixes;
+ for (suf = suffixes; *suf; ++suf) {
+ const size_t suflen = strlen (*suf);
+ if (doclen >= suflen && !strcasecmp (*suf, docname + doclen - suflen)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static const char*
+skip_prefix (const char* prefix, const char* s)
+{
+ const size_t prelen = strlen (prefix);
+ if (!strncmp (prefix, s, prelen)) return s + prelen;
+ return s;
+}
+
+static int
+doc_convert( FILE** fpp, char* stop_at_directive, int erropts )
+{
+ char **argv, line[ BIG_LINE ];
+ int argc;
+
+ while ( dsgw_next_html_line( *fpp, line )) {
+ if ( dsgw_parse_line( line, &argc, &argv, 0, dsgw_simple_cond_is_true,
+ NULL )) {
+ if ( stop_at_directive != NULL &&
+ dsgw_directive_is( line, stop_at_directive )) {
+ return( 0 );
+
+ } else if ( dsgw_directive_is( line, DRCT_HEAD )) {
+ dsgw_head_begin();
+ dsgw_emits ("\n");
+
+ } else if ( dsgw_directive_is( line, DRCT_DS_POSTEDVALUE )) {
+ dsgw_emit_cgi_var (argc, argv);
+
+ } else if ( dsgw_directive_is( line, DRCT_DS_CLOSEBUTTON )) {
+ dsgw_emit_button (argc, argv, "onClick=\"top.close()\"");
+
+ } else if ( dsgw_directive_is( line, "DS_CONFIRM_SCRIPT" )) {
+ {
+ auto char* yes = dsgw_get_cgi_var ("YES", DSGW_CGIVAR_OPTIONAL);
+ auto char* no = dsgw_get_cgi_var ("NO", DSGW_CGIVAR_OPTIONAL);
+ dsgw_emitf ("<SCRIPT LANGUAGE=JavaScript><!--\n"
+ "function OK() {\n");
+ if (yes) dsgw_emitf (" %s\n", yes);
+ dsgw_emits (" top.close();\n"
+ "}\n"
+ "\n"
+ "function Cancel() {\n");
+ if (no) dsgw_emitf (" %s\n", no);
+ dsgw_emits (" top.close();\n"
+ "}\n"
+ "// -->\n"
+ "</SCRIPT>\n");
+ }
+
+ } else if ( dsgw_directive_is( line, "DS_CONFIRM_BUTTON_OK" )) {
+ dsgw_emitf ("<INPUT TYPE=BUTTON VALUE=\"%s\" onClick=\"parent.OK()\">\n",
+ XP_GetClientStr(DBT_ok_2));
+
+ } else if ( dsgw_directive_is( line, "DS_CONFIRM_BUTTON_CANCEL" )) {
+ dsgw_emitf ("<INPUT TYPE=BUTTON VALUE=\"%s\" onClick=\"parent.Cancel()\">\n",
+ XP_GetClientStr(DBT_cancel_2));
+
+ } else {
+ dsgw_emits (line);
+ }
+ }
+ }
+ fclose( *fpp );
+ *fpp = NULL;
+ return( 0 );
+}
+
+int
+main( int argc, char *argv[]
+#ifdef DSGW_DEBUG
+ , char *env[]
+#endif
+ )
+{
+ /*static char* docdir = ".." PATH_SLASH "html" PATH_SLASH;*/
+ static char* docdir = NULL;
+ static char* helpdir = NULL;
+ char* docname = NULL;
+ char* tfname;
+ int result = 0;
+ char *qs = NULL;
+ int manual_file = 0; /* Flag: is the file a documentation file? */
+
+ /* Parse out the file=blah.html */
+ if (( qs = getenv( "QUERY_STRING" )) != NULL && *qs != '\0' ) {
+ /* parse the query string: */
+ auto char *p, *iter = NULL;
+ qs = dsgw_ch_strdup( qs );
+
+ for ( p = ldap_utf8strtok_r( qs, "&", &iter ); p != NULL;
+ p = ldap_utf8strtok_r( NULL, "&", &iter )) {
+
+ /*
+ * Get the conf file name. It'll be translated
+ * into /dsgw/context/CONTEXT.conf if
+ * CONTEXT is all alphanumeric (no slahes,
+ * or dots). CONTEXT is passed into the cgi.
+ * if context=CONTEXT is not there, or PATH_INFO
+ * was used, then use dsgw.conf
+ */
+ if ( !strncasecmp( p, "context=", 8 )) {
+ context = dsgw_ch_strdup( p + 8 );
+ dsgw_form_unescape( context );
+ continue;
+ }
+
+
+ /*Get the filename and check it for naughtiness -RJP*/
+ if ( !strncasecmp( p, "file=", 5 )) {
+
+ /*If there is no file specified, go with index.html*/
+ if (strlen(p) == 5) {
+ docname = dsgw_ch_strdup("index.html");
+ } else {
+ docname = dsgw_ch_strdup( p + 5 );
+ dsgw_form_unescape( docname );
+ }
+
+
+ /*If we're handling a help page, forgo the filename check*/
+ if ( strlen( docname ) > DSGW_MANUALSHORTCUT_LEN &&
+ strncmp( docname, DSGW_MANUALSHORTCUT,
+ DSGW_MANUALSHORTCUT_LEN ) == 0 ) {
+ manual_file = 1;
+ }
+
+ /*
+ * Make sure the person isn't trying to get
+ * some file not in the gateway.
+ */
+ if (manual_file == 0 && !dsgw_valid_docname(docname)) {
+ dsgw_error( DSGW_ERR_BADFILEPATH, docname,
+ DSGW_ERROPT_EXIT, 0, NULL );
+ }
+ continue;
+ }
+
+
+ }
+
+ free( qs ); qs = NULL;
+ }
+
+ (void)dsgw_init( argc, argv, DSGW_METHOD_GET | DSGW_METHOD_POST );
+ docdir = dsgw_get_docdir();
+
+ /*If there is no docname, default to index.html*/
+ if (docname == NULL) {
+ docname = dsgw_ch_strdup("index.html");
+ }
+
+ if (!strcmp (docname, "/")) {
+ printf( "Location: %s?context=%s\n\n",
+ dsgw_getvp( DSGW_CGINUM_SEARCH ), context );
+ return( result );
+ } else {
+ char* p;
+ if (*docname == '/') ++docname;
+ docname = dsgw_ch_strdup( docname );
+ if (( p = strrchr( docname, '&' )) != NULL ) {
+ *p++ = '\0';
+ if ( strncasecmp( p, "info=", 5 ) == 0 ) {
+ dsgw_last_op_info = dsgw_ch_strdup( p + 5 );
+ dsgw_form_unescape( dsgw_last_op_info );
+ }
+ }
+ }
+
+ if (manual_file) {
+ helpdir = dsgw_file2path ( DSGW_MANROOT, "slapd/gw/manual/" );
+ tfname = (char *)dsgw_ch_malloc( strlen( helpdir ) +
+ strlen( docname + DSGW_MANUALSHORTCUT_LEN ) +
+ 1 );
+ sprintf( tfname, "%s%s",
+ helpdir, docname + DSGW_MANUALSHORTCUT_LEN);
+ free( helpdir );
+
+ } else {
+ tfname = dsgw_file2path (docdir, docname);
+ }
+
+ if ( ! doc_is_UTF_8 (tfname)) { /* Redirect the Web server: */
+ printf ("Location: %s%s%s\n\n",
+ getenv("SERVER_URL"), gc->gc_gwnametrans, skip_prefix (docdir, tfname));
+ /* It's tempting to also redirect if is_UTF_8(gc->gc_charset).
+ But it would be wrong: the Web server would transmit an
+ HTTP Content-type with no charset parameter. The header
+ must include ";charset=UTF-8". So we transmit it:
+ */
+ } else { /* Transmit the document: */
+ const int erropts = DSGW_ERROPT_EXIT;
+ auto FILE* docfile;
+
+ dsgw_send_header();
+#ifdef DSGW_DEBUG
+ dsgw_logstringarray( "env", env );
+#endif
+ if ((docfile = fopen(tfname, "r")) == NULL) {
+ dsgw_error( DSGW_ERR_OPENHTMLFILE, tfname, erropts, 0, NULL );
+ return( -1 );
+ }
+ result = doc_convert( &docfile, NULL, erropts );
+ }
+/*
+ * XXXmcs: the following free() causes a crash on NT... so don't do it!
+ */
+#if 0
+ free( tfname );
+#endif
+
+ return result;
+}