]> git.sur5r.net Git - openldap/commitdiff
Support for obsolete proxy authorization control
authorHoward Chu <hyc@openldap.org>
Thu, 30 Mar 2006 08:22:39 +0000 (08:22 +0000)
committerHoward Chu <hyc@openldap.org>
Thu, 30 Mar 2006 08:22:39 +0000 (08:22 +0000)
contrib/slapd-modules/proxyOld/Makefile [new file with mode: 0644]
contrib/slapd-modules/proxyOld/README [new file with mode: 0644]
contrib/slapd-modules/proxyOld/proxyOld.c [new file with mode: 0644]

diff --git a/contrib/slapd-modules/proxyOld/Makefile b/contrib/slapd-modules/proxyOld/Makefile
new file mode 100644 (file)
index 0000000..d58c8f1
--- /dev/null
@@ -0,0 +1,41 @@
+# $OpenLDAP$
+# Copyright 2005 Howard Chu, Symas Corp. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted only as authorized by the OpenLDAP
+# Public License.
+#
+# A copy of this license is available in the file LICENSE in the
+# top-level directory of the distribution or, alternatively, at
+# <http://www.OpenLDAP.org/license.html>.
+#
+LIBTOOL=../../../libtool
+ROOT=../../../../..
+rundir=$(LIB)
+instdir=$(LIB)/openldap
+CFLAGS=-g -O2
+CC=$(C_CC)
+INSTALL=../../../build/shtool install -c
+LTVER=1:0:0
+
+INCS=-I../../../include -I../../../servers/slapd -I ../../../../../opt/symas/include
+
+LIBS=../../../libraries/libldap_r/libldap_r.la ../../../libraries/liblber/liblber.la
+
+all:   proxyOld.la
+
+proxyOld.lo:   proxyOld.c
+       $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) $(DEFS) $(INCS) -c $?
+
+proxyOld.la:   proxyOld.lo
+       $(LIBTOOL) --mode=link $(CC) $(OPT) $(LDFLAGS) -version-info $(LTVER) \
+       -rpath $(rundir) -module -o $@ $? $(LIBS) $(LIBEXTRAS)
+
+install:
+       -mkdir $(DESTDIR)$(instdir)
+       $(LIBTOOL) --mode=install $(INSTALL) -m 644 proxyOld.la $(DESTDIR)$(instdir)
+
+clean:
+       rm -rf *.o *.lo *.la .libs .libt
+
+veryclean: clean
diff --git a/contrib/slapd-modules/proxyOld/README b/contrib/slapd-modules/proxyOld/README
new file mode 100644 (file)
index 0000000..35797b2
--- /dev/null
@@ -0,0 +1,26 @@
+Copyright 2005 Howard Chu, Symas Corp. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted only as authorized by the OpenLDAP
+Public License.
+
+A copy of this license is available in the file LICENSE in the
+top-level directory of the distribution or, alternatively, at
+<http://www.OpenLDAP.org/license.html>.
+
+This directory contains a slapd module proxyOld that provides support
+for the obsolete draft-weltman-ldapb3-proxy-05 revision of the LDAP
+Proxy Authorization control. It is merely intended to provide compatibility
+in environments where other servers only recognize this old control.
+New installations should not use this code.
+
+To use the module, add:
+
+       moduleload <path to>proxyOld.so
+       ...
+
+to your slapd configuration file. Since this is an obsolete feature,
+the control is registered with the SLAP_CTRL_HIDE flag so that it will
+not be advertised in the rootDSE's supportedControls attribute.
+
+This code only works as a dynamically loaded module.
diff --git a/contrib/slapd-modules/proxyOld/proxyOld.c b/contrib/slapd-modules/proxyOld/proxyOld.c
new file mode 100644 (file)
index 0000000..4286bb2
--- /dev/null
@@ -0,0 +1,126 @@
+/* proxyOld.c - module for supporting obsolete (rev 05) proxyAuthz control */
+/* $OpenLDAP$ */
+/*
+ * Copyright 2005 by Howard Chu, Symas Corp.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+
+#include <portable.h>
+
+#include <slap.h>
+
+#include <lber.h>
+/*
+#include <lber_pvt.h>
+#include <lutil.h>
+*/
+
+/* This code is based on draft-weltman-ldapv3-proxy-05. There are a lot
+ * of holes in that draft, it doesn't specify that the control is legal
+ * for Add operations, and it makes no mention of Extended operations.
+ * It also doesn't specify whether an empty LDAPDN is allowed in the
+ * control value.
+ *
+ * For usability purposes, we're copying the op / exop behavior from the
+ * newer -12 draft.
+ */
+#define LDAP_CONTROL_PROXY_AUTHZ05     "2.16.840.1.113730.3.4.12"
+
+static char *proxyOld_extops[] = {
+       LDAP_EXOP_MODIFY_PASSWD,
+       LDAP_EXOP_X_WHO_AM_I,
+       NULL
+};
+
+static int
+proxyOld_parse(
+       Operation *op,
+       SlapReply *rs,
+       LDAPControl *ctrl )
+{
+       int rc;
+       BerElement      *ber;
+       ber_tag_t       tag;
+       struct berval dn = BER_BVNULL;
+       struct berval authzDN = BER_BVNULL;
+
+
+       /* We hijack the flag for the new control. Clearly only one or the
+        * other can be used at any given time.
+        */
+       if ( op->o_proxy_authz != SLAP_CONTROL_NONE ) {
+               rs->sr_text = "proxy authorization control specified multiple times";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       op->o_proxy_authz = ctrl->ldctl_iscritical
+               ? SLAP_CONTROL_CRITICAL
+               : SLAP_CONTROL_NONCRITICAL;
+
+       /* Parse the control value
+        *  proxyAuthzControlValue ::= SEQUENCE {
+        *              proxyDN LDAPDN
+        *      }
+        */
+       ber = ber_init( &ctrl->ldctl_value );
+       if ( ber == NULL ) {
+               rs->sr_text = "ber_init failed";
+               return LDAP_OTHER;
+       }
+
+       tag = ber_scanf( ber, "{m}", &dn );
+
+       if ( tag == LBER_ERROR ) {
+               rs->sr_text = "proxyOld control could not be decoded";
+               rc = LDAP_OTHER;
+               goto done;
+       }
+       if ( BER_BVISEMPTY( &dn )) {
+               Debug( LDAP_DEBUG_TRACE,
+                       "proxyOld_parse: conn=%lu anonymous\n",
+                               op->o_connid, 0, 0 );
+               authzDN.bv_val = ch_strdup("");
+       } else {
+               Debug( LDAP_DEBUG_ARGS,
+                       "proxyOld_parse: conn %lu ctrl DN=\"%s\"\n",
+                               op->o_connid, dn.bv_val, 0 );
+               rc = dnNormalize( 0, NULL, NULL, &dn, &authzDN, op->o_tmpmemctx );
+               if ( rc != LDAP_SUCCESS ) {
+                       goto done;
+               }
+               rc = slap_sasl_authorized( op, &op->o_ndn, &authzDN );
+               if ( rc ) {
+                       op->o_tmpfree( authzDN.bv_val, op->o_tmpmemctx );
+                       rs->sr_text = "not authorized to assume identity";
+                       /* new spec uses LDAP_PROXY_AUTHZ_FAILURE */
+                       rc = LDAP_INSUFFICIENT_ACCESS;
+                       goto done;
+               }
+       }
+       free( op->o_ndn.bv_val );
+       free( op->o_dn.bv_val );
+       op->o_ndn = authzDN;
+       ber_dupbv( &op->o_dn, &authzDN );
+
+       Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu PROXYOLD dn=\"%s\"\n",
+               op->o_connid, op->o_opid,
+               authzDN.bv_len ? authzDN.bv_val : "anonymous", 0, 0 );
+       rc = LDAP_SUCCESS;
+done:
+       ber_free( ber, 1 );
+       return rc;
+}
+
+int init_module(int argc, char *argv[]) {
+       return register_supported_control( LDAP_CONTROL_PROXY_AUTHZ05,
+               SLAP_CTRL_GLOBAL|SLAP_CTRL_HIDE|SLAP_CTRL_ACCESS, proxyOld_extops,
+               proxyOld_parse, NULL );
+}