On Tue, Feb 23, 2016 at 01:24:30PM +0100, Pavel Březina wrote:
> https://fedorahosted.org/sssd/ticket/2934

> From 94ae3c5231dc7f1cd9f9d172d13a11a8afcacd16 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
> Date: Tue, 23 Feb 2016 11:02:42 +0100
> Subject: [PATCH] remove user certificate if not found on the server
> 
> If the user is not found by cert lookup when the user is already
> cached, two things may happen:
> 1) cert was removed from the user object
> 2) user was removed
> 
> Instead of issuing another cert lookup we will just remove cert
> attribute from the cache not touching the expiration timestamp so
> the user may be updated later when needed.
> 
> Resolves:
> https://fedorahosted.org/sssd/ticket/2934
> ---
>  src/db/sysdb.h               |  3 ++-
>  src/db/sysdb_ops.c           | 47 
> ++++++++++++++++++++++++++++++++++++++++++++
>  src/providers/ldap/ldap_id.c | 10 ++++++++++
>  3 files changed, 59 insertions(+), 1 deletion(-)
> 
> diff --git a/src/db/sysdb.h b/src/db/sysdb.h
> index 
> 2e797fd7fa39163c2ab6a10e51228e0f1af3f9e3..d074d4d661554a798151caee831cc672a927712f
>  100644
> --- a/src/db/sysdb.h
> +++ b/src/db/sysdb.h
> @@ -1154,7 +1154,8 @@ errno_t sysdb_search_user_by_cert(TALLOC_CTX *mem_ctx,
>                                    const char *cert,
>                                    struct ldb_result **res);
>  
> -
> +errno_t sysdb_remove_cert(struct sss_domain_info *domain,
> +                          const char *cert);
>  
>  /* === Functions related to GPOs === */
>  
> diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
> index 
> ab0d59ca6db620dfbf7e74a93745df242b6fc3a3..aa688f42f9a6f7f0f86e1171df0a5f0346a59ea5
>  100644
> --- a/src/db/sysdb_ops.c
> +++ b/src/db/sysdb_ops.c
> @@ -3764,6 +3764,53 @@ errno_t sysdb_search_user_by_cert(TALLOC_CTX *mem_ctx,
>      return sysdb_search_object_by_cert(mem_ctx, domain, cert, user_attrs, 
> res);
>  }
>  
> +static errno_t sysdb_remove_user_cert(struct sss_domain_info *domain,
> +                                      const char *name)
> +{
> +    struct ldb_message_element el = { 0, SYSDB_USER_CERT, 0, NULL };
> +    struct sysdb_attrs attrs = { 1, &el };
> +
> +    DEBUG(SSSDBG_TRACE_FUNC, "Removing certificate from user %s@%s",
> +          name, domain->name);
> +
> +    return sysdb_set_user_attr(domain, name, &attrs, SYSDB_MOD_DEL);

I would recommend to use sysdb_set_entry_attr() because you already have
the dn as res->msgs[0]->dn in sysdb_remove_cert. With this I think you
can move everything into sysdb_remove_cert() as well without making to
more complex or longer.

bye,
Sumit


> +}
> +
> +errno_t sysdb_remove_cert(struct sss_domain_info *domain,
> +                          const char *cert)
> +{
> +    struct ldb_result *res = NULL;
> +    const char *name;
> +    errno_t ret;
> +
> +    ret = sysdb_search_user_by_cert(NULL, domain, cert, &res);
> +    if (ret == ENOENT || res == NULL || res->count == 0) {
> +        ret = EOK;
> +        goto done;
> +    } else if (ret != EOK) {
> +        DEBUG(SSSDBG_MINOR_FAILURE, "Unable to lookup user by cert "
> +              "[%d]: %s\n", ret, sss_strerror(ret));
> +        goto done;
> +    } else if (res->count > 1) {
> +        DEBUG(SSSDBG_MINOR_FAILURE, "More then one result found!");
> +        ret = ERR_INTERNAL;
> +        goto done;
> +    }
> +
> +    name = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_NAME, NULL);
> +    if (name == NULL) {
> +        DEBUG(SSSDBG_CRIT_FAILURE, "User without name!\n");
> +        ret = ERR_INTERNAL;
> +        goto done;
> +    }
> +
> +    ret = sysdb_remove_user_cert(domain, name);
> +
> +done:
> +    talloc_free(res);
> +    return ret;
> +}
> +
>  errno_t sysdb_get_sids_of_members(TALLOC_CTX *mem_ctx,
>                                    struct sss_domain_info *dom,
>                                    const char *group_name,
> diff --git a/src/providers/ldap/ldap_id.c b/src/providers/ldap/ldap_id.c
> index 
> b7cef4e13d70f738428cdbf70b661de92a87b4a5..8923e7e0c3fdae4614d6bfef2665de7854b62e8e
>  100644
> --- a/src/providers/ldap/ldap_id.c
> +++ b/src/providers/ldap/ldap_id.c
> @@ -529,6 +529,16 @@ static void users_get_done(struct tevent_req *subreq)
>               */
>              break;
>  
> +        case BE_FILTER_CERT:
> +            ret = sysdb_remove_cert(state->domain, state->name);
> +            if (ret != EOK) {
> +                DEBUG(SSSDBG_CRIT_FAILURE, "Unable to remove user 
> certificate"
> +                      "[%d]: %s\n", ret, sss_strerror(ret));
> +                tevent_req_error(req, ret);
> +                return;
> +            }
> +            break;
> +
>          default:
>              tevent_req_error(req, EINVAL);
>              return;
> -- 
> 2.1.0
> 

> _______________________________________________
> sssd-devel mailing list
> sssd-devel@lists.fedorahosted.org
> https://lists.fedorahosted.org/admin/lists/sssd-devel@lists.fedorahosted.org
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/admin/lists/sssd-devel@lists.fedorahosted.org

Reply via email to