⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 4 页
字号:
		if ( WHATSLEFT <= 1 ) {			return 1;		}		*ptr++ = ',';		if ( ri->ri_num[i] == SLAP_RETRYNUM_FOREVER ) {			if ( WHATSLEFT <= 1 ) {				return 1;			}			*ptr++ = '+';		} else {			ptr += snprintf( ptr, WHATSLEFT, "%d", ri->ri_num[i] );			if ( WHATSLEFT <= 0 ) {				return 1;			}		}	}	bv.bv_val = buf;	bv.bv_len = ptr - buf;	ber_dupbv( bvout, &bv );	return 0;}voidslap_retry_info_destroy(	slap_retry_info_t	*ri ){	assert( ri != NULL );	assert( ri->ri_interval != NULL );	ch_free( ri->ri_interval );	ri->ri_interval = NULL;	assert( ri->ri_num != NULL );	ch_free( ri->ri_num );	ri->ri_num = NULL;}static intslap_idassert_authzfrom_parse( ConfigArgs *c, slap_idassert_t *si ){	struct berval	bv; 	if ( strcmp( c->argv[ 1 ], "*" ) == 0 		|| strcmp( c->argv[ 1 ], "dn:*" ) == 0 		|| strcasecmp( c->argv[ 1 ], "dn.regex:.*" ) == 0 ) 	{ 		if ( si->si_authz != NULL ) { 			snprintf( c->msg, sizeof( c->msg ), 				"\"idassert-authzFrom <authz>\": " 				"\"%s\" conflicts with existing authz rules", 				c->argv[ 1 ] ); 			Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); 			return 1; 		}  		si->si_flags |= LDAP_BACK_AUTH_AUTHZ_ALL;  		return 0;  	} else if ( ( si->si_flags & LDAP_BACK_AUTH_AUTHZ_ALL ) ) {  		snprintf( c->msg, sizeof( c->msg ),  			"\"idassert-authzFrom <authz>\": " 			"\"<authz>\" conflicts with \"*\"" );  		Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );  		return 1;  	}#ifdef SLAP_AUTHZ_SYNTAX	{		struct berval	in;		int		rc;		ber_str2bv( c->argv[ 1 ], 0, 0, &in );		rc = authzNormalize( 0, NULL, NULL, &in, &bv, NULL );		if ( rc != LDAP_SUCCESS ) {			snprintf( c->msg, sizeof( c->msg ),				"\"idassert-authzFrom <authz>\": "				"invalid syntax" );			Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );			return 1;		}	}#else /* !SLAP_AUTHZ_SYNTAX */	ber_str2bv( c->argv[ 1 ], 0, 1, &bv );#endif /* !SLAP_AUTHZ_SYNTAX */	ber_bvarray_add( &si->si_authz, &bv );	return 0;}static intslap_idassert_parse( ConfigArgs *c, slap_idassert_t *si ){	int		i;	for ( i = 1; i < c->argc; i++ ) {		if ( strncasecmp( c->argv[ i ], "mode=", STRLENOF( "mode=" ) ) == 0 ) {			char	*argvi = c->argv[ i ] + STRLENOF( "mode=" );			int	j;			j = verb_to_mask( argvi, idassert_mode );			if ( BER_BVISNULL( &idassert_mode[ j ].word ) ) {				snprintf( c->msg, sizeof( c->msg ),					"\"idassert-bind <args>\": "					"unknown mode \"%s\"",					argvi );				Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );				return 1;			}			si->si_mode = idassert_mode[ j ].mask;		} else if ( strncasecmp( c->argv[ i ], "authz=", STRLENOF( "authz=" ) ) == 0 ) {			char	*argvi = c->argv[ i ] + STRLENOF( "authz=" );			if ( strcasecmp( argvi, "native" ) == 0 ) {				if ( si->si_bc.sb_method != LDAP_AUTH_SASL ) {					snprintf( c->msg, sizeof( c->msg ),						"\"idassert-bind <args>\": "						"authz=\"native\" incompatible "						"with auth method" );					Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );					return 1;				}				si->si_flags |= LDAP_BACK_AUTH_NATIVE_AUTHZ;			} else if ( strcasecmp( argvi, "proxyAuthz" ) == 0 ) {				si->si_flags &= ~LDAP_BACK_AUTH_NATIVE_AUTHZ;			} else {				snprintf( c->msg, sizeof( c->msg ),					"\"idassert-bind <args>\": "					"unknown authz \"%s\"",					argvi );				Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );				return 1;			}		} else if ( strncasecmp( c->argv[ i ], "flags=", STRLENOF( "flags=" ) ) == 0 ) {			char	*argvi = c->argv[ i ] + STRLENOF( "flags=" );			char	**flags = ldap_str2charray( argvi, "," );			int	j, err = 0;			if ( flags == NULL ) {				snprintf( c->msg, sizeof( c->msg ),					"\"idassert-bind <args>\": "					"unable to parse flags \"%s\"",					argvi );				Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );				return 1;			}			for ( j = 0; flags[ j ] != NULL; j++ ) {				if ( strcasecmp( flags[ j ], "override" ) == 0 ) {					si->si_flags |= LDAP_BACK_AUTH_OVERRIDE;				} else if ( strcasecmp( flags[ j ], "prescriptive" ) == 0 ) {					si->si_flags |= LDAP_BACK_AUTH_PRESCRIPTIVE;				} else if ( strcasecmp( flags[ j ], "non-prescriptive" ) == 0 ) {					si->si_flags &= ( ~LDAP_BACK_AUTH_PRESCRIPTIVE );				} else if ( strcasecmp( flags[ j ], "obsolete-proxy-authz" ) == 0 ) {					if ( si->si_flags & LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND ) {						Debug( LDAP_DEBUG_ANY,                                      		 		"%s: \"obsolete-proxy-authz\" flag "                                      		 		"in \"idassert-mode <args>\" "                                      		 		"incompatible with previously issued \"obsolete-encoding-workaround\" flag.\n",                                      	 			c->log, 0, 0 );						err = 1;						break;					} else {						si->si_flags |= LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ;					}				} else if ( strcasecmp( flags[ j ], "obsolete-encoding-workaround" ) == 0 ) {					if ( si->si_flags & LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ ) {						Debug( LDAP_DEBUG_ANY,                                      	 			"%s: \"obsolete-encoding-workaround\" flag "                                       			"in \"idassert-mode <args>\" "                                       			"incompatible with previously issued \"obsolete-proxy-authz\" flag.\n",                                       			c->log, 0, 0 );						err = 1;						break;					} else {						si->si_flags |= LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND;					}				} else {					snprintf( c->msg, sizeof( c->msg ),						"\"idassert-bind <args>\": "						"unknown flag \"%s\"",						flags[ j ] );					Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );					err = 1;					break;				}			}			ldap_charray_free( flags );			if ( err ) {				return 1;			}		} else if ( bindconf_parse( c->argv[ i ], &si->si_bc ) ) {			return 1;		}	}	return 0;}/* NOTE: temporary, until back-meta is ported to back-config */intslap_idassert_authzfrom_parse_cf( const char *fname, int lineno, const char *arg, slap_idassert_t *si ){	ConfigArgs	c = { 0 };	char		*argv[ 3 ];	snprintf( c.log, sizeof( c.log ), "%s: line %d", fname, lineno );	c.argc = 2;	c.argv = argv;	argv[ 0 ] = "idassert-authzFrom";	argv[ 1 ] = (char *)arg;	argv[ 2 ] = NULL;	return slap_idassert_authzfrom_parse( &c, si );}intslap_idassert_parse_cf( const char *fname, int lineno, int argc, char *argv[], slap_idassert_t *si ){	ConfigArgs	c = { 0 };	snprintf( c.log, sizeof( c.log ), "%s: line %d", fname, lineno );	c.argc = argc;	c.argv = argv;	return slap_idassert_parse( &c, si );}static intldap_back_cf_gen( ConfigArgs *c ){	ldapinfo_t	*li = ( ldapinfo_t * )c->be->be_private;	int		rc = 0;	int		i;	if ( c->op == SLAP_CONFIG_EMIT ) {		struct berval	bv = BER_BVNULL;		if ( li == NULL ) {			return 1;		}		switch( c->type ) {		case LDAP_BACK_CFG_URI:			if ( li->li_uri != NULL ) {				struct berval	bv, bv2;				ber_str2bv( li->li_uri, 0, 0, &bv );				bv2.bv_len = bv.bv_len + STRLENOF( "\"\"" );				bv2.bv_val = ch_malloc( bv2.bv_len + 1 );				snprintf( bv2.bv_val, bv2.bv_len + 1,					"\"%s\"", bv.bv_val );				ber_bvarray_add( &c->rvalue_vals, &bv2 );			} else {				rc = 1;			}			break;		case LDAP_BACK_CFG_TLS:			enum_to_verb( tls_mode, ( li->li_flags & LDAP_BACK_F_TLS_MASK ), &bv );			assert( !BER_BVISNULL( &bv ) );			value_add_one( &c->rvalue_vals, &bv );			break;		case LDAP_BACK_CFG_ACL_AUTHCDN:		case LDAP_BACK_CFG_ACL_PASSWD:		case LDAP_BACK_CFG_ACL_METHOD:			/* handled by LDAP_BACK_CFG_ACL_BIND */			rc = 1;			break;		case LDAP_BACK_CFG_ACL_BIND: {			int	i;			if ( li->li_acl_authmethod == LDAP_AUTH_NONE ) {				return 1;			}			bindconf_unparse( &li->li_acl, &bv );			for ( i = 0; isspace( (unsigned char) bv.bv_val[ i ] ); i++ )				/* count spaces */ ;			if ( i ) {				bv.bv_len -= i;				AC_MEMCPY( bv.bv_val, &bv.bv_val[ i ],					bv.bv_len + 1 );			}			ber_bvarray_add( &c->rvalue_vals, &bv );			break;		}		case LDAP_BACK_CFG_IDASSERT_MODE:		case LDAP_BACK_CFG_IDASSERT_AUTHCDN:		case LDAP_BACK_CFG_IDASSERT_PASSWD:		case LDAP_BACK_CFG_IDASSERT_METHOD:			/* handled by LDAP_BACK_CFG_IDASSERT_BIND */			rc = 1;			break;		case LDAP_BACK_CFG_IDASSERT_AUTHZFROM: {			int		i;			if ( li->li_idassert_authz == NULL ) {				if ( ( li->li_idassert_flags & LDAP_BACK_AUTH_AUTHZ_ALL ) ) {					BER_BVSTR( &bv, "*" );					value_add_one( &c->rvalue_vals, &bv );				} else {					rc = 1;				}				break;			}			for ( i = 0; !BER_BVISNULL( &li->li_idassert_authz[ i ] ); i++ )			{				value_add_one( &c->rvalue_vals, &li->li_idassert_authz[ i ] );			}			break;		}		case LDAP_BACK_CFG_IDASSERT_BIND: {			int		i;			struct berval	bc = BER_BVNULL;			char		*ptr;			if ( li->li_idassert_authmethod == LDAP_AUTH_NONE ) {				return 1;			}			if ( li->li_idassert_authmethod != LDAP_AUTH_NONE ) {				ber_len_t	len;				switch ( li->li_idassert_mode ) {				case LDAP_BACK_IDASSERT_OTHERID:				case LDAP_BACK_IDASSERT_OTHERDN:					break;				default: {					struct berval	mode = BER_BVNULL;					enum_to_verb( idassert_mode, li->li_idassert_mode, &mode );					if ( BER_BVISNULL( &mode ) ) {						/* there's something wrong... */						assert( 0 );						rc = 1;						} else {						bv.bv_len = STRLENOF( "mode=" ) + mode.bv_len;						bv.bv_val = ch_malloc( bv.bv_len + 1 );						ptr = lutil_strcopy( bv.bv_val, "mode=" );						ptr = lutil_strcopy( ptr, mode.bv_val );					}					break;				}				}				if ( li->li_idassert_flags & LDAP_BACK_AUTH_NATIVE_AUTHZ ) {					len = bv.bv_len + STRLENOF( "authz=native" );					if ( !BER_BVISEMPTY( &bv ) ) {						len += STRLENOF( " " );					}					bv.bv_val = ch_realloc( bv.bv_val, len + 1 );					ptr = &bv.bv_val[ bv.bv_len ];					if ( !BER_BVISEMPTY( &bv ) ) {						ptr = lutil_strcopy( ptr, " " );					}					(void)lutil_strcopy( ptr, "authz=native" );				}				len = bv.bv_len + STRLENOF( "flags=non-prescriptive,override,obsolete-encoding-workaround" );				/* flags */				if ( !BER_BVISEMPTY( &bv ) ) {					len += STRLENOF( " " );				}				bv.bv_val = ch_realloc( bv.bv_val, len + 1 );				ptr = &bv.bv_val[ bv.bv_len ];				if ( !BER_BVISEMPTY( &bv ) ) {					ptr = lutil_strcopy( ptr, " " );				}				ptr = lutil_strcopy( ptr, "flags=" );				if ( li->li_idassert_flags & LDAP_BACK_AUTH_PRESCRIPTIVE ) {					ptr = lutil_strcopy( ptr, "prescriptive" );				} else {					ptr = lutil_strcopy( ptr, "non-prescriptive" );				}				if ( li->li_idassert_flags & LDAP_BACK_AUTH_OVERRIDE ) {					ptr = lutil_strcopy( ptr, ",override" );				}				if ( li->li_idassert_flags & LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ ) {					ptr = lutil_strcopy( ptr, ",obsolete-proxy-authz" );				} else if ( li->li_idassert_flags & LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND ) {					ptr = lutil_strcopy( ptr, ",obsolete-encoding-workaround" );				}				bv.bv_len = ( ptr - bv.bv_val );				/* end-of-flags */			}			bindconf_unparse( &li->li_idassert.si_bc, &bc );			if ( !BER_BVISNULL( &bv ) ) {				ber_len_t	len = bv.bv_len + bc.bv_len;				bv.bv_val = ch_realloc( bv.bv_val, len + 1 );				assert( bc.bv_val[ 0 ] == ' ' );				ptr = lutil_strcopy( &bv.bv_val[ bv.bv_len ], bc.bv_val );				free( bc.bv_val );				bv.bv_len = ptr - bv.bv_val;			} else {				for ( i = 0; isspace( (unsigned char) bc.bv_val[ i ] ); i++ )					/* count spaces */ ;				if ( i ) {					bc.bv_len -= i;					AC_MEMCPY( bc.bv_val, &bc.bv_val[ i ], bc.bv_len + 1 );				}				bv = bc;			}						ber_bvarray_add( &c->rvalue_vals, &bv );			break;		}		case LDAP_BACK_CFG_REBIND:			c->value_int = LDAP_BACK_SAVECRED( li );			break;		case LDAP_BACK_CFG_CHASE:			c->value_int = LDAP_BACK_CHASE_REFERRALS( li );			break;		case LDAP_BACK_CFG_T_F:			enum_to_verb( t_f_mode, (li->li_flags & LDAP_BACK_F_T_F_MASK2), &bv );			if ( BER_BVISNULL( &bv ) ) {				/* there's something wrong... */				assert( 0 );				rc = 1;			} else {				value_add_one( &c->rvalue_vals, &bv );			}			break;		case LDAP_BACK_CFG_WHOAMI:			c->value_int = LDAP_BACK_PROXY_WHOAMI( li );			break;		case LDAP_BACK_CFG_TIMEOUT:			BER_BVZERO( &bv );			for ( i = 0; i < SLAP_OP_LAST; i++ ) {				if ( li->li_timeout[ i ] != 0 ) {					break;				}			}			if ( i == SLAP_OP_LAST ) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -