📄 config.c
字号:
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 + -