#include "slap.h"
#include "back-sql.h"
#include "sql-wrap.h"
+#include "util.h"
+#include "entry-id.h"
+
+void backsql_init_search(backsql_srch_info *bsi,backsql_info *bi,char *nbase,int scope,
+ int slimit,int tlimit,time_t stoptime,Filter *filter,
+ SQLHDBC dbh,BackendDB *be,Connection *conn,Operation *op,char **attrs);
int backsql_bind(BackendDB *be,Connection *conn,Operation *op,
const char *dn,const char *ndn,int method,struct berval *cred,char** edn)
{
+ backsql_info *bi=(backsql_info*)be->be_private;
+ backsql_entryID user_id,*res;
+ SQLHDBC dbh;
+ AttributeDescription *password = slap_schema.si_ad_userPassword;
+ Entry *e,user_entry;
+ Attribute *a;
+ backsql_srch_info bsi;
+
Debug(LDAP_DEBUG_TRACE,"==>backsql_bind()\n",0,0,0);
- //for now, just return OK, allowing to test modify operations
- send_ldap_result(conn,op,LDAP_SUCCESS,NULL,NULL,NULL,0);
+
+ if ( be_isroot_pw( be, conn, ndn, cred ) )
+ {
+ *edn=ch_strdup(be_root_dn(be));
+ Debug(LDAP_DEBUG_TRACE,"<==backsql_bind() root bind\n",0,0,0);
+ return LDAP_SUCCESS;
+ }
+
+ *edn=ch_strdup(ndn);
+
+ if (method == LDAP_AUTH_SIMPLE)
+ {
+ dbh=backsql_get_db_conn(be,conn);
+
+ if (!dbh)
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_bind(): could not get connection handle - exiting\n",0,0,0);
+ send_ldap_result(conn,op,LDAP_OTHER,"","SQL-backend error",NULL,NULL);
+ return 1;
+ }
+
+ res=backsql_dn2id(bi,&user_id,dbh,ndn);
+ if (res==NULL)
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_bind(): could not retrieve bind dn id - no such entry\n",0,0,0);
+ send_ldap_result( conn, op, LDAP_INVALID_CREDENTIALS,NULL, NULL, NULL, NULL );
+ return 1;
+ }
+
+ backsql_init_search(&bsi,bi,(char*)ndn,LDAP_SCOPE_BASE,-1,-1,-1,NULL,dbh,
+ be,conn,op,NULL);
+ e=backsql_id2entry(&bsi,&user_entry,&user_id);
+ if (e==NULL)
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_bind(): error in backsql_id2entry() - auth failed\n",0,0,0);
+ send_ldap_result( conn, op, LDAP_OTHER,NULL, NULL, NULL, NULL );
+ return 1;
+ }
+
+ if ( ! access_allowed( be, conn, op, e,password, NULL, ACL_AUTH ) )
+ {
+ send_ldap_result( conn, op, LDAP_INSUFFICIENT_ACCESS, NULL, NULL, NULL, NULL );
+ return 1;
+ }
+
+ if ( (a = attr_find( e->e_attrs, password )) == NULL )
+ {
+ send_ldap_result( conn, op, LDAP_INAPPROPRIATE_AUTH, NULL, NULL, NULL, NULL );
+ return 1;
+ }
+
+ if ( slap_passwd_check( conn, a, cred ) != 0 )
+ {
+ send_ldap_result( conn, op, LDAP_INVALID_CREDENTIALS,NULL, NULL, NULL, NULL );
+ return 1;
+ }
+ }
+ else /*method != SIMPLE */
+ {
+ send_ldap_result( conn, op, LDAP_STRONG_AUTH_NOT_SUPPORTED,
+ NULL, "authentication method not supported", NULL, NULL );
+ return 1;
+ }
Debug(LDAP_DEBUG_TRACE,"<==backsql_bind()\n",0,0,0);
return 0;
}