]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/bind.c
Add a safety check to bvcasechr
[openldap] / servers / slapd / back-sql / bind.c
index b383d5f1b8e7bdbdd668f28a0908751a6ad077a4..9105444dd57ff2c2e00499aa25473ebdcd8d71f1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *      Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
+ *      Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
  *
  *      Redistribution and use in source and binary forms are permitted only
  *      as authorized by the OpenLDAP Public License.  A copy of this
 #include "slap.h"
 #include "back-sql.h"
 #include "sql-wrap.h"
+#include "util.h"
+#include "entry-id.h"
 
-int backsql_bind(Backend *be,Connection *conn,Operation *op,
-       char *dn,char *ndn,int method,struct berval *cred,char** edn)
+int backsql_bind(BackendDB *be,Connection *conn,Operation *op,
+       struct berval *dn,struct berval *ndn,int method,struct berval *cred,struct berval *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 ) )
+    {
+     ber_dupbv(edn, be_root_dn(be));
+     Debug(LDAP_DEBUG_TRACE,"<==backsql_bind() root bind\n",0,0,0);
+     return LDAP_SUCCESS;
+    }
+ ber_dupbv(edn, 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->bv_val);
+   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->bv_val,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;
 }
  
-int backsql_unbind(Backend *be,Connection *conn,Operation *op)
+int backsql_unbind(BackendDB *be,Connection *conn,Operation *op)
 {
  Debug(LDAP_DEBUG_TRACE,"==>backsql_unbind()\n",0,0,0);
- backsql_free_db_conn(be,conn);
  send_ldap_result(conn,op,LDAP_SUCCESS,NULL,NULL,NULL,0);
  Debug(LDAP_DEBUG_TRACE,"<==backsql_unbind()\n",0,0,0);
  return 0;