summaryrefslogtreecommitdiffstats
path: root/ldap/clients/dsgw/auth.c
diff options
context:
space:
mode:
authorcvsadm <cvsadm>2005-01-21 00:44:34 +0000
committercvsadm <cvsadm>2005-01-21 00:44:34 +0000
commitb2093e3016027d6b5cf06b3f91f30769bfc099e2 (patch)
treecf58939393a9032182c4fbc4441164a9456e82f8 /ldap/clients/dsgw/auth.c
downloadds-b2093e3016027d6b5cf06b3f91f30769bfc099e2.tar.gz
ds-b2093e3016027d6b5cf06b3f91f30769bfc099e2.tar.xz
ds-b2093e3016027d6b5cf06b3f91f30769bfc099e2.zip
Moving NSCP Directory Server from DirectoryBranch to TRUNK, initial drop. (foxworth)ldapserver7x
Diffstat (limited to 'ldap/clients/dsgw/auth.c')
-rw-r--r--ldap/clients/dsgw/auth.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/ldap/clients/dsgw/auth.c b/ldap/clients/dsgw/auth.c
new file mode 100644
index 00000000..88b2ba82
--- /dev/null
+++ b/ldap/clients/dsgw/auth.c
@@ -0,0 +1,120 @@
+/**
+ * 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.
+ */
+/*
+ * auth.c -- CGI authentication form generator -- HTTP gateway
+ *
+ * Copyright (c) 1996 Netscape Communications Corp.
+ * All rights reserved.
+ */
+
+#include "dsgw.h"
+#include "dbtdsgw.h"
+
+static void post_request();
+static void get_request(char *binddn);
+
+int main(
+ int argc,
+ char **argv
+#ifdef DSGW_DEBUG
+ ,char *env[]
+#endif
+) {
+ int reqmethod;
+ char *binddn = NULL;
+ char *qs = NULL;
+
+ 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 context.*/
+ if ( !strncasecmp( p, "context=", 8 )) {
+ context = dsgw_ch_strdup( p + 8 );
+ dsgw_form_unescape( context );
+ continue;
+ }
+
+ /*Get the dn*/
+ if ( !strncasecmp( p, "dn=", 3 )) {
+ binddn = dsgw_ch_strdup( p + 3 );
+ dsgw_form_unescape( binddn );
+ continue;
+ }
+ }
+ free( qs ); qs = NULL;
+ }
+
+ reqmethod = dsgw_init( argc, argv, DSGW_METHOD_POST | DSGW_METHOD_GET );
+
+#ifdef DSGW_DEBUG
+ dsgw_logstringarray( "env", env );
+#endif
+
+ if ( reqmethod == DSGW_METHOD_POST ) {
+ post_request();
+ } else {
+ get_request(binddn);
+ }
+
+ exit( 0 );
+}
+
+static void
+get_request(char *binddn)
+{
+ dsgw_send_header();
+
+ if ( binddn != NULL ) {
+ if ( !strcmp( binddn, MGRDNSTR )) {
+ if ( gc->gc_rootdn == NULL ) {
+ dsgw_error( DSGW_ERR_NO_MGRDN,
+ XP_GetClientStr (DBT_noDirMgrIsDefined_),
+ DSGW_ERROPT_EXIT, 0, NULL );
+ }
+ binddn = dsgw_ch_strdup( gc->gc_rootdn );
+ } else if ( *binddn == '\0' ) {
+ binddn = NULL;
+ } else {
+ binddn = dsgw_ch_strdup( binddn );
+ dsgw_form_unescape( binddn );
+ }
+ }
+ dsgw_emit_auth_form( binddn );
+ if ( binddn != NULL ) {
+ free( binddn );
+ }
+}
+
+
+
+static void
+post_request()
+{
+ char *binddn = NULL;
+ char *dorootbind = NULL;
+
+ dsgw_send_header();
+ /*
+ * If the "authasrootdn" CGI variable is present and has the value
+ * "true" then the user clicked on the "authenticate as directory
+ * manager" button. In that case, try to bind as the root dn given
+ * in the dsgw config file.
+ */
+ dorootbind = dsgw_get_cgi_var( "authasrootdn", DSGW_CGIVAR_OPTIONAL );
+ if ( dorootbind != NULL && !strcasecmp( dorootbind, "true" )) {
+ binddn = dsgw_ch_strdup( gc->gc_rootdn );
+ } else {
+ binddn = dsgw_get_escaped_cgi_var( "escapedbinddn", "binddn",
+ DSGW_CGIVAR_OPTIONAL );
+ }
+
+ dsgw_emit_auth_form( binddn );
+}