summaryrefslogtreecommitdiffstats
path: root/server/providers/ldap/ldap_auth.c
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2009-06-24 16:40:56 -0400
committerSimo Sorce <ssorce@redhat.com>2009-07-03 11:07:36 -0400
commit94ec51d8b53f636d41a879ed1d0d39127168cb21 (patch)
treee6984ad304bf81781de2b118dac189db4bb0a582 /server/providers/ldap/ldap_auth.c
parent6aca93fb4d5d39a100b900a8c297d08629407960 (diff)
downloadsssd-94ec51d8b53f636d41a879ed1d0d39127168cb21.tar.gz
sssd-94ec51d8b53f636d41a879ed1d0d39127168cb21.tar.xz
sssd-94ec51d8b53f636d41a879ed1d0d39127168cb21.zip
Rework transaction code to use tevent_req
This is part of a set of patches to rewrite sysdb to a hopefully better API, that will also let use use tevent_req async style calls to manipulate our cache.
Diffstat (limited to 'server/providers/ldap/ldap_auth.c')
-rw-r--r--server/providers/ldap/ldap_auth.c86
1 files changed, 65 insertions, 21 deletions
diff --git a/server/providers/ldap/ldap_auth.c b/server/providers/ldap/ldap_auth.c
index 89e301aae..5d1a81f08 100644
--- a/server/providers/ldap/ldap_auth.c
+++ b/server/providers/ldap/ldap_auth.c
@@ -656,6 +656,7 @@ done:
}
struct sdap_pw_cache {
+ struct tevent_context *ev;
struct sysdb_handle *handle;
struct sdap_req *lr;
};
@@ -665,30 +666,72 @@ static void sdap_reply(struct be_req *req, int ret, char *errstr)
req->fn(req, ret, errstr);
}
-static void sdap_cache_pw_callback(void *pvt, int error,
- struct ldb_result *ignore)
+
+static void sdap_cache_pw_done(struct tevent_req *req)
{
- struct sdap_pw_cache *data = talloc_get_type(pvt, struct sdap_pw_cache);
- if (error != EOK) {
+ struct sdap_pw_cache *data = tevent_req_callback_data(req,
+ struct sdap_pw_cache);
+ int ret;
+
+ ret = sysdb_transaction_commit_recv(req);
+ if (ret) {
DEBUG(2, ("Failed to cache password (%d)[%s]!?\n",
- error, strerror(error)));
+ ret, strerror(ret)));
+ }
+
+ /* password caching failures are not fatal errors */
+ sdap_reply(data->lr->req, data->lr->pd->pam_status, NULL);
+}
+
+static void sdap_cache_pw_callback(struct tevent_req *subreq)
+{
+ struct sdap_pw_cache *data = tevent_req_callback_data(subreq,
+ struct sdap_pw_cache);
+ struct tevent_req *req;
+ int ret;
+
+ ret = sysdb_set_cached_password_recv(subreq);
+ talloc_zfree(subreq);
+ if (ret != EOK) {
+ goto fail;
+ }
+
+ req = sysdb_transaction_commit_send(data, data->ev, data->handle);
+ if (!req) {
+ ret = ENOMEM;
+ goto fail;
}
+ tevent_req_set_callback(req, sdap_cache_pw_done, data);
+
+ return;
+
+fail:
+ DEBUG(2, ("Failed to cache password (%d)[%s]!?\n", ret, strerror(ret)));
- sysdb_transaction_done(data->handle, error);
+ /* free transaction */
+ talloc_zfree(data->handle);
/* password caching failures are not fatal errors */
sdap_reply(data->lr->req, data->lr->pd->pam_status, NULL);
}
-static void sdap_cache_pw_op(struct sysdb_handle *handle, void *pvt)
+static void sdap_cache_pw_op(struct tevent_req *req)
{
- struct sdap_pw_cache *data = talloc_get_type(pvt, struct sdap_pw_cache);
+ struct sdap_pw_cache *data = tevent_req_callback_data(req,
+ struct sdap_pw_cache);
+ struct tevent_req *subreq;
struct pam_data *pd;
const char *username;
char *password;
int ret;
- data->handle = handle;
+ ret = sysdb_transaction_recv(req, data, &data->handle);
+ if (ret) {
+ DEBUG(1, ("Failed to start transaction (%d)[%s]!?\n",
+ ret, strerror(ret)));
+ sdap_reply(data->lr->req, data->lr->pd->pam_status, NULL);
+ return;
+ }
pd = data->lr->pd;
username = pd->user;
@@ -715,21 +758,20 @@ static void sdap_cache_pw_op(struct sysdb_handle *handle, void *pvt)
return;
}
- ret = sysdb_set_cached_password(handle,
- data->lr->req->be_ctx->domain,
- username,
- password,
- sdap_cache_pw_callback, data);
- if (ret != EOK) {
+ subreq = sysdb_set_cached_password_send(data, data->ev, data->handle,
+ data->lr->req->be_ctx->domain,
+ username, password);
+ if (!subreq) {
/* password caching failures are not fatal errors */
sdap_reply(data->lr->req, data->lr->pd->pam_status, NULL);
}
+ tevent_req_set_callback(subreq, sdap_cache_pw_callback, data);
}
static void sdap_cache_password(struct sdap_req *lr)
{
struct sdap_pw_cache *data;
- int ret;
+ struct tevent_req *req;
data = talloc_zero(lr, struct sdap_pw_cache);
if (!data) {
@@ -739,16 +781,18 @@ static void sdap_cache_password(struct sdap_req *lr)
return;
}
data->lr = lr;
+ data->ev = lr->req->be_ctx->ev;
- ret = sysdb_transaction(data, lr->req->be_ctx->sysdb,
- sdap_cache_pw_op, data);
-
- if (ret != EOK) {
+ req = sysdb_transaction_send(data, data->ev,
+ lr->req->be_ctx->sysdb);
+ if (!req) {
DEBUG(1, ("Failed to start transaction (%d)[%s]!?\n",
- ret, strerror(ret)));
+ ENOMEM, strerror(ENOMEM)));
/* password caching failures are not fatal errors */
sdap_reply(data->lr->req, lr->pd->pam_status, NULL);
}
+
+ tevent_req_set_callback(req, sdap_cache_pw_op, data);
}
static void sdap_shutdown(struct be_req *req)