/* * Defines and inits a var with session scope */ int rewrite_session_var_set_f( struct rewrite_info *info, const void *cookie, const char *name, const char *value, int flags ) { struct rewrite_session *session; struct rewrite_var *var; assert( info != NULL ); assert( cookie != NULL ); assert( name != NULL ); assert( value != NULL ); session = rewrite_session_find( info, cookie ); if ( session == NULL ) { session = rewrite_session_init( info, cookie ); if ( session == NULL ) { return REWRITE_ERR; } #ifdef USE_REWRITE_LDAP_PVT_THREADS ldap_pvt_thread_mutex_lock( &session->ls_mutex ); #endif /* USE_REWRITE_LDAP_PVT_THREADS */ } #ifdef USE_REWRITE_LDAP_PVT_THREADS ldap_pvt_thread_rdwr_wlock( &session->ls_vars_mutex ); #endif /* USE_REWRITE_LDAP_PVT_THREADS */ var = rewrite_var_find( session->ls_vars, name ); if ( var != NULL ) { assert( var->lv_value.bv_val != NULL ); (void)rewrite_var_replace( var, value, flags ); } else { var = rewrite_var_insert_f( &session->ls_vars, name, value, flags ); if ( var == NULL ) { #ifdef USE_REWRITE_LDAP_PVT_THREADS ldap_pvt_thread_rdwr_wunlock( &session->ls_vars_mutex ); #endif /* USE_REWRITE_LDAP_PVT_THREADS */ rewrite_session_return( info, session ); return REWRITE_ERR; } } #ifdef USE_REWRITE_LDAP_PVT_THREADS ldap_pvt_thread_rdwr_wunlock( &session->ls_vars_mutex ); #endif /* USE_REWRITE_LDAP_PVT_THREADS */ rewrite_session_return( info, session ); return REWRITE_SUCCESS; }
/* * init_one_conn * * Initializes one connection */ static int init_one_conn( Connection *conn, Operation *op, struct metatarget *lt, struct metasingleconn *lsc ) { int err, vers; /* * Already init'ed */ if ( lsc->ld != NULL ) { return LDAP_SUCCESS; } /* * Attempts to initialize the connection to the target ds */ err = ldap_initialize( &lsc->ld, lt->uri ); if ( err != LDAP_SUCCESS ) { return ldap_back_map_result( err ); } /* * Set LDAP version. This will always succeed: If the client * bound with a particular version, then so can we. */ vers = conn->c_protocol; ldap_set_option( lsc->ld, LDAP_OPT_PROTOCOL_VERSION, &vers ); /* * Sets a cookie for the rewrite session */ ( void )rewrite_session_init( lt->rwinfo, conn ); /* * If the connection dn is not null, an attempt to rewrite it is made */ if ( conn->c_dn.bv_len != 0 ) { /* * Rewrite the bind dn if needed */ lsc->bound_dn.bv_val = NULL; switch ( rewrite_session( lt->rwinfo, "bindDn", conn->c_dn.bv_val, conn, &lsc->bound_dn.bv_val ) ) { case REWRITE_REGEXEC_OK: if ( lsc->bound_dn.bv_val == NULL ) { ber_dupbv( &lsc->bound_dn, &conn->c_dn ); } #ifdef NEW_LOGGING LDAP_LOG( BACK_META, DETAIL1, "[rw] bindDn: \"%s\" -> \"%s\"\n", conn->c_dn.bv_val, lsc->bound_dn.bv_val, 0 ); #else /* !NEW_LOGGING */ Debug( LDAP_DEBUG_ARGS, "rw> bindDn: \"%s\" -> \"%s\"\n", conn->c_dn.bv_val, lsc->bound_dn.bv_val, 0 ); #endif /* !NEW_LOGGING */ break; case REWRITE_REGEXEC_UNWILLING: send_ldap_result( conn, op, LDAP_UNWILLING_TO_PERFORM, NULL, "Operation not allowed", NULL, NULL ); return LDAP_UNWILLING_TO_PERFORM; case REWRITE_REGEXEC_ERR: send_ldap_result( conn, op, LDAP_OTHER, NULL, "Rewrite error", NULL, NULL ); return LDAP_OTHER; } assert( lsc->bound_dn.bv_val ); } else { ber_str2bv( "", 0, 1, &lsc->bound_dn ); } lsc->bound = META_UNBOUND; /* * The candidate is activated */ lsc->candidate = META_CANDIDATE; return LDAP_SUCCESS; }
static void apply( FILE *fin, const char *rewriteContext, const char *arg ) { struct rewrite_info *info; char *string, *sep, *result = NULL; int rc; void *cookie = &info; info = rewrite_info_init( REWRITE_MODE_ERR ); if ( rewrite_read( fin, info ) != 0 ) { exit( EXIT_FAILURE ); } rewrite_param_set( info, "prog", "rewrite" ); rewrite_session_init( info, cookie ); string = (char *)arg; for ( sep = strchr( rewriteContext, ',' ); rewriteContext != NULL; rewriteContext = sep, sep ? sep = strchr( rewriteContext, ',' ) : NULL ) { char *errmsg = ""; if ( sep != NULL ) { sep[ 0 ] = '\0'; sep++; } /* rc = rewrite( info, rewriteContext, string, &result ); */ rc = rewrite_session( info, rewriteContext, string, cookie, &result ); switch ( rc ) { case REWRITE_REGEXEC_OK: errmsg = "ok"; break; case REWRITE_REGEXEC_ERR: errmsg = "error"; break; case REWRITE_REGEXEC_STOP: errmsg = "stop"; break; case REWRITE_REGEXEC_UNWILLING: errmsg = "unwilling to perform"; break; default: if (rc >= REWRITE_REGEXEC_USER) { errmsg = "user-defined"; } else { errmsg = "unknown"; } break; } fprintf( stdout, "%s -> %s [%d:%s]\n", string, ( result ? result : "(null)" ), rc, errmsg ); if ( result == NULL ) { break; } if ( string != arg && string != result ) { free( string ); } string = result; } if ( result && result != arg ) { free( result ); } rewrite_session_delete( info, cookie ); rewrite_info_delete( &info ); }