Backport patches from upstream 1.12.5 prerelease - contains many fixes
This commit is contained in:
		
							parent
							
								
									6cfd9704c1
								
							
						
					
					
						commit
						40a97f0f88
					
				
							
								
								
									
										222
									
								
								0001-PAM-do-not-reject-abruptly.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								0001-PAM-do-not-reject-abruptly.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,222 @@ | ||||
| From 325a3a1015a8ce239efa07b2371f2f8db8bf395e Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Wed, 11 Feb 2015 19:38:16 -0500 | ||||
| Subject: [PATCH 01/99] PAM: do not reject abruptly | ||||
| 
 | ||||
| If account has expired then pass message. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2050 | ||||
| 
 | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit a61d6d01a4e89ec14175af135e84f1cac55af748) | ||||
| ---
 | ||||
|  src/responder/pam/pamsrv_cmd.c | 53 ++++++++++++++++++++++++++++++++++ | ||||
|  src/sss_client/pam_sss.c       | 64 +++++++++++++++++++++++++++++++++++++++++- | ||||
|  src/sss_client/sss_cli.h       | 18 +++++++++--- | ||||
|  3 files changed, 130 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c
 | ||||
| index 90cdbec519587a0d5dd680bfe3a991d896d6c008..c874cae61960ffa17dbe8aab7b96b792d65ac618 100644
 | ||||
| --- a/src/responder/pam/pamsrv_cmd.c
 | ||||
| +++ b/src/responder/pam/pamsrv_cmd.c
 | ||||
| @@ -44,6 +44,54 @@ enum pam_verbosity {
 | ||||
|   | ||||
|  static void pam_reply(struct pam_auth_req *preq); | ||||
|   | ||||
| +static errno_t pack_user_info_account_expired(TALLOC_CTX *mem_ctx,
 | ||||
| +                                              const char *user_error_message,
 | ||||
| +                                              size_t *resp_len,
 | ||||
| +                                              uint8_t **_resp)
 | ||||
| +{
 | ||||
| +    uint32_t resp_type = SSS_PAM_USER_INFO_ACCOUNT_EXPIRED;
 | ||||
| +    size_t err_len;
 | ||||
| +    uint8_t *resp;
 | ||||
| +    size_t p;
 | ||||
| +
 | ||||
| +    err_len = strlen(user_error_message);
 | ||||
| +    *resp_len = 2 * sizeof(uint32_t) + err_len;
 | ||||
| +    resp = talloc_size(mem_ctx, *resp_len);
 | ||||
| +    if (resp == NULL) {
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "talloc_size failed.\n");
 | ||||
| +        return ENOMEM;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    p = 0;
 | ||||
| +    SAFEALIGN_SET_UINT32(&resp[p], resp_type, &p);
 | ||||
| +    SAFEALIGN_SET_UINT32(&resp[p], err_len, &p);
 | ||||
| +    safealign_memcpy(&resp[p], user_error_message, err_len, &p);
 | ||||
| +    if (p != *resp_len) {
 | ||||
| +        DEBUG(SSSDBG_FATAL_FAILURE, "Size mismatch\n");
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    *_resp = resp;
 | ||||
| +    return EOK;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void inform_account_expired(struct pam_data* pd)
 | ||||
| +{
 | ||||
| +    size_t msg_len;
 | ||||
| +    uint8_t *msg;
 | ||||
| +    errno_t ret;
 | ||||
| +
 | ||||
| +    ret = pack_user_info_account_expired(pd, "", &msg_len, &msg);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE,
 | ||||
| +              "pack_user_info_account_expired failed.\n");
 | ||||
| +    } else {
 | ||||
| +        ret = pam_add_response(pd, SSS_PAM_USER_INFO, msg_len, msg);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_CRIT_FAILURE, "pam_add_response failed.\n");
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
|  static bool is_domain_requested(struct pam_data *pd, const char *domain_name) | ||||
|  { | ||||
|      int i; | ||||
| @@ -609,6 +657,11 @@ static void pam_reply(struct pam_auth_req *preq)
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| +    if (pd->pam_status == PAM_ACCT_EXPIRED && pd->service != NULL &&
 | ||||
| +        strcasecmp(pd->service, "sshd") == 0) {
 | ||||
| +        inform_account_expired(pd);
 | ||||
| +    }
 | ||||
| +
 | ||||
|      ret = filter_responses(pctx->rctx->cdb, pd->resp_list); | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_CRIT_FAILURE, "filter_responses failed, not fatal.\n"); | ||||
| diff --git a/src/sss_client/pam_sss.c b/src/sss_client/pam_sss.c
 | ||||
| index fdf6c9e6da75c9f7eaa7c00d9a5792fbdd97eabc..59529796c682416d49c7f92f5feea3b0ace8d2d4 100644
 | ||||
| --- a/src/sss_client/pam_sss.c
 | ||||
| +++ b/src/sss_client/pam_sss.c
 | ||||
| @@ -60,6 +60,9 @@
 | ||||
|  #define OPT_RETRY_KEY "retry=" | ||||
|  #define OPT_DOMAINS_KEY "domains=" | ||||
|   | ||||
| +#define EXP_ACC_MSG _("Your account has expired. ")
 | ||||
| +#define SRV_MSG     _("Server message: ")
 | ||||
| +
 | ||||
|  struct pam_items { | ||||
|      const char* pam_service; | ||||
|      const char* pam_user; | ||||
| @@ -797,6 +800,63 @@ static int user_info_otp_chpass(pam_handle_t *pamh)
 | ||||
|      return PAM_SUCCESS; | ||||
|  } | ||||
|   | ||||
| +static int user_info_account_expired(pam_handle_t *pamh, size_t buflen,
 | ||||
| +                                     uint8_t *buf)
 | ||||
| +{
 | ||||
| +    int ret;
 | ||||
| +    uint32_t msg_len;
 | ||||
| +    char *user_msg;
 | ||||
| +    size_t bufsize = 0;
 | ||||
| +
 | ||||
| +    /* resp_type and length of message are expected to be in buf */
 | ||||
| +    if (buflen < 2* sizeof(uint32_t)) {
 | ||||
| +        D(("User info response data is too short"));
 | ||||
| +        return PAM_BUF_ERR;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    /* msg_len = legth of message */
 | ||||
| +    memcpy(&msg_len, buf + sizeof(uint32_t), sizeof(uint32_t));
 | ||||
| +
 | ||||
| +    if (buflen != 2* sizeof(uint32_t) + msg_len) {
 | ||||
| +        D(("User info response data has the wrong size"));
 | ||||
| +        return PAM_BUF_ERR;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    bufsize = strlen(EXP_ACC_MSG) + 1;
 | ||||
| +
 | ||||
| +    if (msg_len > 0) {
 | ||||
| +        bufsize += strlen(SRV_MSG) + msg_len;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    user_msg = (char *)malloc(sizeof(char) * bufsize);
 | ||||
| +    if (!user_msg) {
 | ||||
| +       D(("Out of memory."));
 | ||||
| +       return PAM_SYSTEM_ERR;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = snprintf(user_msg, bufsize, "%s%s%.*s",
 | ||||
| +                   EXP_ACC_MSG,
 | ||||
| +                   msg_len > 0 ? SRV_MSG : "",
 | ||||
| +                   msg_len,
 | ||||
| +                   msg_len > 0 ? (char *)(buf + 2 * sizeof(uint32_t)) : "" );
 | ||||
| +    if (ret < 0 || ret > bufsize) {
 | ||||
| +        D(("snprintf failed."));
 | ||||
| +
 | ||||
| +        free(user_msg);
 | ||||
| +        return PAM_SYSTEM_ERR;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = do_pam_conversation(pamh, PAM_TEXT_INFO, user_msg, NULL, NULL);
 | ||||
| +    free(user_msg);
 | ||||
| +    if (ret != PAM_SUCCESS) {
 | ||||
| +        D(("do_pam_conversation failed."));
 | ||||
| +
 | ||||
| +        return PAM_SYSTEM_ERR;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return PAM_SUCCESS;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static int user_info_chpass_error(pam_handle_t *pamh, size_t buflen, | ||||
|                                    uint8_t *buf) | ||||
|  { | ||||
| @@ -852,7 +912,6 @@ static int user_info_chpass_error(pam_handle_t *pamh, size_t buflen,
 | ||||
|      return PAM_SUCCESS; | ||||
|  } | ||||
|   | ||||
| -
 | ||||
|  static int eval_user_info_response(pam_handle_t *pamh, size_t buflen, | ||||
|                                     uint8_t *buf) | ||||
|  { | ||||
| @@ -888,6 +947,9 @@ static int eval_user_info_response(pam_handle_t *pamh, size_t buflen,
 | ||||
|          case SSS_PAM_USER_INFO_CHPASS_ERROR: | ||||
|              ret = user_info_chpass_error(pamh, buflen, buf); | ||||
|              break; | ||||
| +        case SSS_PAM_USER_INFO_ACCOUNT_EXPIRED:
 | ||||
| +            ret = user_info_account_expired(pamh, buflen, buf);
 | ||||
| +            break;
 | ||||
|          default: | ||||
|              D(("Unknown user info type [%d]", type)); | ||||
|              ret = PAM_SYSTEM_ERR; | ||||
| diff --git a/src/sss_client/sss_cli.h b/src/sss_client/sss_cli.h
 | ||||
| index 6286077fcf25aead1dfcba5c6483e4ff8ae63b9f..d508a0671cd1b3ee087e0967f7015628ceabe20f 100644
 | ||||
| --- a/src/sss_client/sss_cli.h
 | ||||
| +++ b/src/sss_client/sss_cli.h
 | ||||
| @@ -461,15 +461,25 @@ enum user_info_type {
 | ||||
|                                       * indicates that no message is following. | ||||
|                                       * @param String with the specified | ||||
|                                       * length. */ | ||||
| +
 | ||||
|      SSS_PAM_USER_INFO_GRACE_LOGIN, /**< Warn the user that the password is | ||||
|                                      * expired and inform about the remaining | ||||
|                                      * number of grace logins. | ||||
|                                      * @param The number of remaining grace | ||||
|                                      * logins as uint32_t */ | ||||
| -    SSS_PAM_USER_INFO_EXPIRE_WARN /**< Warn the user that the password will
 | ||||
| -                                   * expire soon.
 | ||||
| -                                   * @param Number of seconds before the user's
 | ||||
| -                                   * password will expire. */
 | ||||
| +    SSS_PAM_USER_INFO_EXPIRE_WARN, /**< Warn the user that the password will
 | ||||
| +                                    * expire soon.
 | ||||
| +                                    * @param Number of seconds before the
 | ||||
| +                                    * user's password will expire. */
 | ||||
| +
 | ||||
| +    SSS_PAM_USER_INFO_ACCOUNT_EXPIRED, /**< Tell the user that the account
 | ||||
| +                                        * has expired and optionally give
 | ||||
| +                                        * a reason.
 | ||||
| +                                        * @param Size of the message as
 | ||||
| +                                        * unsigned 32-bit integer value. A
 | ||||
| +                                        * value of 0 indicates that no message
 | ||||
| +                                        * is following. @param String with the
 | ||||
| +                                        * specified length. */
 | ||||
|  }; | ||||
|  /** | ||||
|   * @} | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										157
									
								
								0002-PAM-new-option-pam_account_expired_message.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								0002-PAM-new-option-pam_account_expired_message.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,157 @@ | ||||
| From a81b2ae67c7b011c74c0d37df5bdaef2ef2bbb4a Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Thu, 19 Feb 2015 11:17:36 -0500 | ||||
| Subject: [PATCH 02/99] PAM: new option pam_account_expired_message | ||||
| 
 | ||||
| This option sets string to be printed when authenticating using SSH | ||||
| keys and account is expired. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2050 | ||||
| 
 | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit e039f1aefecc65a7b3c2d4a13a612bff1dd367c8) | ||||
| ---
 | ||||
|  src/confdb/confdb.h                  |  1 + | ||||
|  src/config/SSSDConfig/__init__.py.in |  1 + | ||||
|  src/config/etc/sssd.api.conf         |  1 + | ||||
|  src/man/sssd.conf.5.xml              | 21 +++++++++++++++++++++ | ||||
|  src/responder/pam/pamsrv_cmd.c       | 14 ++++++++++---- | ||||
|  src/sss_client/pam_sss.c             |  2 +- | ||||
|  6 files changed, 35 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/confdb/confdb.h b/src/confdb/confdb.h
 | ||||
| index b5c4999a3179a6f1303d31f24f2ca5680cf69ac6..19c56402069f9a7001188e91f77db8ad8525d690 100644
 | ||||
| --- a/src/confdb/confdb.h
 | ||||
| +++ b/src/confdb/confdb.h
 | ||||
| @@ -114,6 +114,7 @@
 | ||||
|  #define CONFDB_PAM_PWD_EXPIRATION_WARNING "pam_pwd_expiration_warning" | ||||
|  #define CONFDB_PAM_TRUSTED_USERS "pam_trusted_users" | ||||
|  #define CONFDB_PAM_PUBLIC_DOMAINS "pam_public_domains" | ||||
| +#define CONFDB_PAM_ACCOUNT_EXPIRED_MESSAGE "pam_account_expired_message"
 | ||||
|   | ||||
|  /* SUDO */ | ||||
|  #define CONFDB_SUDO_CONF_ENTRY "config/sudo" | ||||
| diff --git a/src/config/SSSDConfig/__init__.py.in b/src/config/SSSDConfig/__init__.py.in
 | ||||
| index aad0b2ce422b009f1bc95f3377bad34af4495776..dbbffebf38977e526cf2944510a2f60da7edf33a 100644
 | ||||
| --- a/src/config/SSSDConfig/__init__.py.in
 | ||||
| +++ b/src/config/SSSDConfig/__init__.py.in
 | ||||
| @@ -88,6 +88,7 @@ option_strings = {
 | ||||
|      'pam_pwd_expiration_warning' : _('How many days before password expiration a warning should be displayed'), | ||||
|      'pam_trusted_users' : _('List of trusted uids or user\'s name'), | ||||
|      'pam_public_domains' : _('List of domains accessible even for untrusted users.'), | ||||
| +    'pam_account_expired_message' : _('Message printed when user account is expired.'),
 | ||||
|   | ||||
|      # [sudo] | ||||
|      'sudo_timed' : _('Whether to evaluate the time-based attributes in sudo rules'), | ||||
| diff --git a/src/config/etc/sssd.api.conf b/src/config/etc/sssd.api.conf
 | ||||
| index 3503635e07bbd0511349a9b5b9d05c30c6825bf3..4fa542704fbd3af065843e777b84b6305ec3e78b 100644
 | ||||
| --- a/src/config/etc/sssd.api.conf
 | ||||
| +++ b/src/config/etc/sssd.api.conf
 | ||||
| @@ -58,6 +58,7 @@ pam_pwd_expiration_warning = int, None, false
 | ||||
|  get_domains_timeout = int, None, false | ||||
|  pam_trusted_users = str, None, false | ||||
|  pam_public_domains = str, None, false | ||||
| +pam_account_expired_message = str, None, false
 | ||||
|   | ||||
|  [sudo] | ||||
|  # sudo service | ||||
| diff --git a/src/man/sssd.conf.5.xml b/src/man/sssd.conf.5.xml
 | ||||
| index 90545245eb68e4b45b4b49b5935e47867bffb794..bb4c1d3c65818d8d949482569868e14cf60c5db5 100644
 | ||||
| --- a/src/man/sssd.conf.5.xml
 | ||||
| +++ b/src/man/sssd.conf.5.xml
 | ||||
| @@ -933,6 +933,27 @@ fallback_homedir = /home/%u
 | ||||
|                          </para> | ||||
|                      </listitem> | ||||
|                  </varlistentry> | ||||
| +                <varlistentry>
 | ||||
| +                    <term>pam_account_expired_message (string)</term>
 | ||||
| +                    <listitem>
 | ||||
| +                        <para>
 | ||||
| +                           If user is authenticating using SSH keys and
 | ||||
| +                           account is expired then by default
 | ||||
| +                           'Permission denied' is output. This output will
 | ||||
| +                           be changed to content of this variable if it is
 | ||||
| +                           set.
 | ||||
| +                        </para>
 | ||||
| +                        <para>
 | ||||
| +                            example:
 | ||||
| +                            <programlisting>
 | ||||
| +pam_account_expired_message = Account expired, please call help desk.
 | ||||
| +                            </programlisting>
 | ||||
| +                        </para>
 | ||||
| +                        <para>
 | ||||
| +                            Default: none
 | ||||
| +                        </para>
 | ||||
| +                    </listitem>
 | ||||
| +                </varlistentry>
 | ||||
|   | ||||
|              </variablelist> | ||||
|          </refsect2> | ||||
| diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c
 | ||||
| index c874cae61960ffa17dbe8aab7b96b792d65ac618..a9c1b49d7ccf361404b02fb4c4a8ae260f9498cc 100644
 | ||||
| --- a/src/responder/pam/pamsrv_cmd.c
 | ||||
| +++ b/src/responder/pam/pamsrv_cmd.c
 | ||||
| @@ -74,13 +74,14 @@ static errno_t pack_user_info_account_expired(TALLOC_CTX *mem_ctx,
 | ||||
|      return EOK; | ||||
|  } | ||||
|   | ||||
| -static void inform_account_expired(struct pam_data* pd)
 | ||||
| +static void inform_account_expired(struct pam_data* pd,
 | ||||
| +                                   const char *pam_message)
 | ||||
|  { | ||||
|      size_t msg_len; | ||||
|      uint8_t *msg; | ||||
|      errno_t ret; | ||||
|   | ||||
| -    ret = pack_user_info_account_expired(pd, "", &msg_len, &msg);
 | ||||
| +    ret = pack_user_info_account_expired(pd, pam_message, &msg_len, &msg);
 | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_CRIT_FAILURE, | ||||
|                "pack_user_info_account_expired failed.\n"); | ||||
| @@ -544,6 +545,7 @@ static void pam_reply(struct pam_auth_req *preq)
 | ||||
|      uint32_t user_info_type; | ||||
|      time_t exp_date = -1; | ||||
|      time_t delay_until = -1; | ||||
| +    char* pam_account_expired_message;
 | ||||
|   | ||||
|      pd = preq->pd; | ||||
|      cctx = preq->cctx; | ||||
| @@ -620,7 +622,7 @@ static void pam_reply(struct pam_auth_req *preq)
 | ||||
|          ret = gettimeofday(&tv, NULL); | ||||
|          if (ret != EOK) { | ||||
|              DEBUG(SSSDBG_CRIT_FAILURE, "gettimeofday failed [%d][%s].\n", | ||||
| -                      errno, strerror(errno));
 | ||||
| +                  errno, strerror(errno));
 | ||||
|              goto done; | ||||
|          } | ||||
|          tv.tv_sec += pd->response_delay; | ||||
| @@ -659,7 +661,11 @@ static void pam_reply(struct pam_auth_req *preq)
 | ||||
|   | ||||
|      if (pd->pam_status == PAM_ACCT_EXPIRED && pd->service != NULL && | ||||
|          strcasecmp(pd->service, "sshd") == 0) { | ||||
| -        inform_account_expired(pd);
 | ||||
| +        ret = confdb_get_string(pctx->rctx->cdb, pd, CONFDB_PAM_CONF_ENTRY,
 | ||||
| +                                CONFDB_PAM_ACCOUNT_EXPIRED_MESSAGE, "",
 | ||||
| +                                &pam_account_expired_message);
 | ||||
| +
 | ||||
| +        inform_account_expired(pd, pam_account_expired_message);
 | ||||
|      } | ||||
|   | ||||
|      ret = filter_responses(pctx->rctx->cdb, pd->resp_list); | ||||
| diff --git a/src/sss_client/pam_sss.c b/src/sss_client/pam_sss.c
 | ||||
| index 59529796c682416d49c7f92f5feea3b0ace8d2d4..28a36d5af95297b394a74f39d6614f48831bb901 100644
 | ||||
| --- a/src/sss_client/pam_sss.c
 | ||||
| +++ b/src/sss_client/pam_sss.c
 | ||||
| @@ -60,7 +60,7 @@
 | ||||
|  #define OPT_RETRY_KEY "retry=" | ||||
|  #define OPT_DOMAINS_KEY "domains=" | ||||
|   | ||||
| -#define EXP_ACC_MSG _("Your account has expired. ")
 | ||||
| +#define EXP_ACC_MSG _("Permission denied. ")
 | ||||
|  #define SRV_MSG     _("Server message: ") | ||||
|   | ||||
|  struct pam_items { | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										62
									
								
								0003-PAM-warn-all-services-about-account-expiration.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								0003-PAM-warn-all-services-about-account-expiration.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | ||||
| From 09c9dfa2c3f183dfd2704e4dfd488521b793ae3a Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Thu, 19 Feb 2015 11:50:54 -0500 | ||||
| Subject: [PATCH 03/99] PAM: warn all services about account expiration | ||||
| 
 | ||||
| if pam_verbose is above one then output warning about account | ||||
| expiration for all services. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2050 | ||||
| 
 | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit f3c2dc1f9ccdf456fd78ed96197b9bf404cc29fc) | ||||
| ---
 | ||||
|  src/responder/pam/pamsrv_cmd.c | 19 +++++++++++++++++-- | ||||
|  1 file changed, 17 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c
 | ||||
| index a9c1b49d7ccf361404b02fb4c4a8ae260f9498cc..ab8369b0f9b1f3ed9256fc16396f095818d36bbf 100644
 | ||||
| --- a/src/responder/pam/pamsrv_cmd.c
 | ||||
| +++ b/src/responder/pam/pamsrv_cmd.c
 | ||||
| @@ -546,11 +546,20 @@ static void pam_reply(struct pam_auth_req *preq)
 | ||||
|      time_t exp_date = -1; | ||||
|      time_t delay_until = -1; | ||||
|      char* pam_account_expired_message; | ||||
| +    int pam_verbosity;
 | ||||
|   | ||||
|      pd = preq->pd; | ||||
|      cctx = preq->cctx; | ||||
|      pctx = talloc_get_type(preq->cctx->rctx->pvt_ctx, struct pam_ctx); | ||||
|   | ||||
| +    ret = confdb_get_int(pctx->rctx->cdb, CONFDB_PAM_CONF_ENTRY,
 | ||||
| +                         CONFDB_PAM_VERBOSITY, DEFAULT_PAM_VERBOSITY,
 | ||||
| +                         &pam_verbosity);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE,
 | ||||
| +              "Failed to read PAM verbosity, not fatal.\n");
 | ||||
| +        pam_verbosity = DEFAULT_PAM_VERBOSITY;
 | ||||
| +    }
 | ||||
|   | ||||
|      DEBUG(SSSDBG_FUNC_DATA, | ||||
|            "pam_reply called with result [%d].\n", pd->pam_status); | ||||
| @@ -659,8 +668,14 @@ static void pam_reply(struct pam_auth_req *preq)
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    if (pd->pam_status == PAM_ACCT_EXPIRED && pd->service != NULL &&
 | ||||
| -        strcasecmp(pd->service, "sshd") == 0) {
 | ||||
| +    /* Account expiration warning is printed for sshd. If pam_verbosity
 | ||||
| +     * is equal or above PAM_VERBOSITY_INFO then all services are informed
 | ||||
| +     * about account expiration.
 | ||||
| +     */
 | ||||
| +    if (pd->pam_status == PAM_ACCT_EXPIRED &&
 | ||||
| +        ((pd->service != NULL && strcasecmp(pd->service, "sshd") == 0) ||
 | ||||
| +         pam_verbosity >= PAM_VERBOSITY_INFO)) {
 | ||||
| +
 | ||||
|          ret = confdb_get_string(pctx->rctx->cdb, pd, CONFDB_PAM_CONF_ENTRY, | ||||
|                                  CONFDB_PAM_ACCOUNT_EXPIRED_MESSAGE, "", | ||||
|                                  &pam_account_expired_message); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										33
									
								
								0004-PAM-check-return-value-of-confdb_get_string.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								0004-PAM-check-return-value-of-confdb_get_string.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| From 45b7cadbbd81df4a6aba39de97eb1522774bcc60 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Wed, 25 Feb 2015 05:38:38 -0500 | ||||
| Subject: [PATCH 04/99] PAM: check return value of confdb_get_string | ||||
| 
 | ||||
| Coverity found this neglect. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit c5290f2175845f2c5e3f35ce279b6f52b1d51275) | ||||
| ---
 | ||||
|  src/responder/pam/pamsrv_cmd.c | 6 ++++++ | ||||
|  1 file changed, 6 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c
 | ||||
| index ab8369b0f9b1f3ed9256fc16396f095818d36bbf..86e763f825096edc0c07adbe2e02820e5f2bdac9 100644
 | ||||
| --- a/src/responder/pam/pamsrv_cmd.c
 | ||||
| +++ b/src/responder/pam/pamsrv_cmd.c
 | ||||
| @@ -679,6 +679,12 @@ static void pam_reply(struct pam_auth_req *preq)
 | ||||
|          ret = confdb_get_string(pctx->rctx->cdb, pd, CONFDB_PAM_CONF_ENTRY, | ||||
|                                  CONFDB_PAM_ACCOUNT_EXPIRED_MESSAGE, "", | ||||
|                                  &pam_account_expired_message); | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +                  "Failed to get expiration message: %d:[%s].\n",
 | ||||
| +                  ret, sss_strerror(ret));
 | ||||
| +            goto done;
 | ||||
| +        }
 | ||||
|   | ||||
|          inform_account_expired(pd, pam_account_expired_message); | ||||
|      } | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,57 @@ | ||||
| From 9d68909e27641410dced44865aff0a11f77597ef Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Tue, 3 Mar 2015 11:39:39 +0100 | ||||
| Subject: [PATCH 05/99] resolv: Use the same default timeout for SRV queries as | ||||
|  previously | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| When we changed the resolver code to use the TTL values from the DNS | ||||
| queries instead of harcoded ones, we changed the default value by | ||||
| accident. | ||||
| 
 | ||||
| Add a separate SRV TTL that is backwards-compatible with the old | ||||
| harcoded value. | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit eafbc66c2ff6365478e62a8df3fd005bf80e5c7b) | ||||
| ---
 | ||||
|  src/resolv/async_resolv.c | 4 +++- | ||||
|  src/resolv/async_resolv.h | 4 ++++ | ||||
|  2 files changed, 7 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/resolv/async_resolv.c b/src/resolv/async_resolv.c
 | ||||
| index 85c4d99a4ef3c5071353f176c78caba115286fe4..80e4922c576ce52ab895d62c822706e9e46024a0 100644
 | ||||
| --- a/src/resolv/async_resolv.c
 | ||||
| +++ b/src/resolv/async_resolv.c
 | ||||
| @@ -1776,8 +1776,10 @@ resolv_getsrv_done(void *arg, int status, int timeouts, unsigned char *abuf, int
 | ||||
|      state->reply_list = reply_list; | ||||
|      ok = resolv_get_ttl(abuf, alen, &state->ttl); | ||||
|      if (ok == false) { | ||||
| -        state->ttl = RESOLV_DEFAULT_TTL;
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE, "Could not read TTL, using the default..\n");
 | ||||
| +        state->ttl = RESOLV_DEFAULT_SRV_TTL;
 | ||||
|      } | ||||
| +    DEBUG(SSSDBG_TRACE_LIBS, "Using TTL [%"PRIu32"]\n", state->ttl);
 | ||||
|   | ||||
|      tevent_req_done(req); | ||||
|      return; | ||||
| diff --git a/src/resolv/async_resolv.h b/src/resolv/async_resolv.h
 | ||||
| index 9b08f12ae159d377b50b9ddfe9f71397a461635d..14cbdc5023705b164ccb775991b7790accc1f2cc 100644
 | ||||
| --- a/src/resolv/async_resolv.h
 | ||||
| +++ b/src/resolv/async_resolv.h
 | ||||
| @@ -42,6 +42,10 @@
 | ||||
|  #define RESOLV_DEFAULT_TTL 7200 | ||||
|  #endif  /* RESOLV_DEFAULT_TTL */ | ||||
|   | ||||
| +#ifndef RESOLV_DEFAULT_SRV_TTL
 | ||||
| +#define RESOLV_DEFAULT_SRV_TTL 14400
 | ||||
| +#endif  /* RESOLV_DEFAULT_SRV_TTL */
 | ||||
| +
 | ||||
|  #include "util/util.h" | ||||
|   | ||||
|  /* | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										1020
									
								
								0006-FO-Use-SRV-TTL-in-fail-over-code.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1020
									
								
								0006-FO-Use-SRV-TTL-in-fail-over-code.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										204
									
								
								0007-SDAP-refactor-pwexpire-policy.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								0007-SDAP-refactor-pwexpire-policy.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,204 @@ | ||||
| From 8b353dd2b90b7ab222acdea726ab7e8681752237 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Mon, 16 Feb 2015 18:56:25 -0500 | ||||
| Subject: [PATCH 07/99] SDAP: refactor pwexpire policy | ||||
| 
 | ||||
| Move part of pwexpire policy code to a separate function. | ||||
| 
 | ||||
| Relates to: | ||||
| https://fedorahosted.org/sssd/ticket/2167 | ||||
| 
 | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit cdaa29d2c5724a4c72bfa0f42284ccfac3d5a464) | ||||
| ---
 | ||||
|  Makefile.am                    |  1 + | ||||
|  src/providers/ldap/ldap_auth.c | 76 ++++++++++++++++++++++++------------------ | ||||
|  src/providers/ldap/ldap_auth.h | 46 +++++++++++++++++++++++++ | ||||
|  3 files changed, 91 insertions(+), 32 deletions(-) | ||||
|  create mode 100644 src/providers/ldap/ldap_auth.h | ||||
| 
 | ||||
| diff --git a/Makefile.am b/Makefile.am
 | ||||
| index 254930387aa9dda981c1539616e2912447c2b1d6..9fe60d656403e09595ced5f623f381afbd3b2a43 100644
 | ||||
| --- a/Makefile.am
 | ||||
| +++ b/Makefile.am
 | ||||
| @@ -563,6 +563,7 @@ dist_noinst_HEADERS = \
 | ||||
|      src/providers/ldap/sdap_autofs.h \ | ||||
|      src/providers/ldap/sdap_id_op.h \ | ||||
|      src/providers/ldap/ldap_opts.h \ | ||||
| +    src/providers/ldap/ldap_auth.h \
 | ||||
|      src/providers/ldap/sdap_range.h \ | ||||
|      src/providers/ldap/sdap_users.h \ | ||||
|      src/providers/ldap/sdap_dyndns.h \ | ||||
| diff --git a/src/providers/ldap/ldap_auth.c b/src/providers/ldap/ldap_auth.c
 | ||||
| index 5a40c1359f138c42eb915e873fe21a50ab038e81..4035aaf58c23291eb8115ef320758ba7666ed4e2 100644
 | ||||
| --- a/src/providers/ldap/ldap_auth.c
 | ||||
| +++ b/src/providers/ldap/ldap_auth.c
 | ||||
| @@ -46,16 +46,10 @@
 | ||||
|  #include "providers/ldap/ldap_common.h" | ||||
|  #include "providers/ldap/sdap_async.h" | ||||
|  #include "providers/ldap/sdap_async_private.h" | ||||
| +#include "providers/ldap/ldap_auth.h"
 | ||||
|   | ||||
|  #define LDAP_PWEXPIRE_WARNING_TIME 0 | ||||
|   | ||||
| -enum pwexpire {
 | ||||
| -    PWEXPIRE_NONE = 0,
 | ||||
| -    PWEXPIRE_LDAP_PASSWORD_POLICY,
 | ||||
| -    PWEXPIRE_KERBEROS,
 | ||||
| -    PWEXPIRE_SHADOW
 | ||||
| -};
 | ||||
| -
 | ||||
|  static errno_t add_expired_warning(struct pam_data *pd, long exp_time) | ||||
|  { | ||||
|      int ret; | ||||
| @@ -248,10 +242,41 @@ done:
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| -static errno_t find_password_expiration_attributes(TALLOC_CTX *mem_ctx,
 | ||||
| -                                               const struct ldb_message *msg,
 | ||||
| -                                               struct dp_option *opts,
 | ||||
| -                                               enum pwexpire *type, void **data)
 | ||||
| +errno_t check_pwexpire_policy(enum pwexpire pw_expire_type,
 | ||||
| +                              void *pw_expire_data,
 | ||||
| +                              struct pam_data *pd,
 | ||||
| +                              int pwd_expiration_warning)
 | ||||
| +{
 | ||||
| +    errno_t ret;
 | ||||
| +
 | ||||
| +    switch (pw_expire_type) {
 | ||||
| +    case PWEXPIRE_SHADOW:
 | ||||
| +        ret = check_pwexpire_shadow(pw_expire_data, time(NULL), pd);
 | ||||
| +        break;
 | ||||
| +    case PWEXPIRE_KERBEROS:
 | ||||
| +        ret = check_pwexpire_kerberos(pw_expire_data, time(NULL), pd,
 | ||||
| +                                      pwd_expiration_warning);
 | ||||
| +        break;
 | ||||
| +    case PWEXPIRE_LDAP_PASSWORD_POLICY:
 | ||||
| +        ret = check_pwexpire_ldap(pd, pw_expire_data,
 | ||||
| +                                  pwd_expiration_warning);
 | ||||
| +        break;
 | ||||
| +    case PWEXPIRE_NONE:
 | ||||
| +        ret = EOK;
 | ||||
| +        break;
 | ||||
| +    default:
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "Unknown password expiration type.\n");
 | ||||
| +        ret = EINVAL;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static errno_t
 | ||||
| +find_password_expiration_attributes(TALLOC_CTX *mem_ctx,
 | ||||
| +                                    const struct ldb_message *msg,
 | ||||
| +                                    struct dp_option *opts,
 | ||||
| +                                    enum pwexpire *type, void **data)
 | ||||
|  { | ||||
|      const char *mark; | ||||
|      const char *val; | ||||
| @@ -492,7 +517,7 @@ static int get_user_dn_recv(TALLOC_CTX *mem_ctx, struct tevent_req *req,
 | ||||
|      return EOK; | ||||
|  } | ||||
|   | ||||
| -static int get_user_dn(TALLOC_CTX *memctx,
 | ||||
| +int get_user_dn(TALLOC_CTX *memctx,
 | ||||
|                         struct sss_domain_info *domain, | ||||
|                         struct sdap_options *opts, | ||||
|                         const char *username, | ||||
| @@ -998,7 +1023,7 @@ static void sdap_auth4chpass_done(struct tevent_req *req)
 | ||||
|          case PWEXPIRE_NONE: | ||||
|              break; | ||||
|          default: | ||||
| -            DEBUG(SSSDBG_CRIT_FAILURE, "Unknow pasword expiration type.\n");
 | ||||
| +            DEBUG(SSSDBG_CRIT_FAILURE, "Unknown password expiration type.\n");
 | ||||
|                  state->pd->pam_status = PAM_SYSTEM_ERR; | ||||
|                  goto done; | ||||
|          } | ||||
| @@ -1247,25 +1272,12 @@ static void sdap_pam_auth_done(struct tevent_req *req)
 | ||||
|      talloc_zfree(req); | ||||
|   | ||||
|      if (ret == EOK) { | ||||
| -        switch (pw_expire_type) {
 | ||||
| -        case PWEXPIRE_SHADOW:
 | ||||
| -            ret = check_pwexpire_shadow(pw_expire_data, time(NULL), state->pd);
 | ||||
| -            break;
 | ||||
| -        case PWEXPIRE_KERBEROS:
 | ||||
| -            ret = check_pwexpire_kerberos(pw_expire_data, time(NULL),
 | ||||
| -                                          state->pd,
 | ||||
| -                                          be_ctx->domain->pwd_expiration_warning);
 | ||||
| -            break;
 | ||||
| -        case PWEXPIRE_LDAP_PASSWORD_POLICY:
 | ||||
| -            ret = check_pwexpire_ldap(state->pd, pw_expire_data,
 | ||||
| -                                      be_ctx->domain->pwd_expiration_warning);
 | ||||
| -            break;
 | ||||
| -        case PWEXPIRE_NONE:
 | ||||
| -            break;
 | ||||
| -        default:
 | ||||
| -            DEBUG(SSSDBG_CRIT_FAILURE, "Unknow pasword expiration type.\n");
 | ||||
| -                state->pd->pam_status = PAM_SYSTEM_ERR;
 | ||||
| -                goto done;
 | ||||
| +        ret = check_pwexpire_policy(pw_expire_type, pw_expire_data, state->pd,
 | ||||
| +                                    be_ctx->domain->pwd_expiration_warning);
 | ||||
| +        if (ret == EINVAL) {
 | ||||
| +            /* Unknown password expiration type. */
 | ||||
| +            state->pd->pam_status = PAM_SYSTEM_ERR;
 | ||||
| +            goto done;
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| diff --git a/src/providers/ldap/ldap_auth.h b/src/providers/ldap/ldap_auth.h
 | ||||
| new file mode 100644 | ||||
| index 0000000000000000000000000000000000000000..5fbddd7087dc65ab8bd1df5fb57492d2fc26d0bb
 | ||||
| --- /dev/null
 | ||||
| +++ b/src/providers/ldap/ldap_auth.h
 | ||||
| @@ -0,0 +1,46 @@
 | ||||
| +/*
 | ||||
| +    SSSD
 | ||||
| +
 | ||||
| +    Copyright (C) Pavel Reichl <preichl@redhat.com> 2015
 | ||||
| +
 | ||||
| +    This program is free software; you can redistribute it and/or modify
 | ||||
| +    it under the terms of the GNU General Public License as published by
 | ||||
| +    the Free Software Foundation; either version 3 of the License, or
 | ||||
| +    (at your option) any later version.
 | ||||
| +
 | ||||
| +    This program is distributed in the hope that it will be useful,
 | ||||
| +    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| +    GNU General Public License for more details.
 | ||||
| +
 | ||||
| +    You should have received a copy of the GNU General Public License
 | ||||
| +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| +*/
 | ||||
| +
 | ||||
| +#ifndef _LDAP_AUTH_H_
 | ||||
| +#define _LDAP_AUTH_H_
 | ||||
| +
 | ||||
| +#include "config.h"
 | ||||
| +
 | ||||
| +enum pwexpire {
 | ||||
| +    PWEXPIRE_NONE = 0,
 | ||||
| +    PWEXPIRE_LDAP_PASSWORD_POLICY,
 | ||||
| +    PWEXPIRE_KERBEROS,
 | ||||
| +    PWEXPIRE_SHADOW
 | ||||
| +};
 | ||||
| +
 | ||||
| +int get_user_dn(TALLOC_CTX *memctx,
 | ||||
| +                struct sss_domain_info *domain,
 | ||||
| +                struct sdap_options *opts,
 | ||||
| +                const char *username,
 | ||||
| +                char **user_dn,
 | ||||
| +                enum pwexpire *user_pw_expire_type,
 | ||||
| +                void **user_pw_expire_data);
 | ||||
| +
 | ||||
| +errno_t check_pwexpire_policy(enum pwexpire pw_expire_type,
 | ||||
| +                              void *pw_expire_data,
 | ||||
| +                              struct pam_data *pd,
 | ||||
| +                              errno_t checkb);
 | ||||
| +
 | ||||
| +
 | ||||
| +#endif /* _LDAP_AUTH_H_ */
 | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										258
									
								
								0008-SDAP-enable-change-phase-of-pw-expire-policy-check.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										258
									
								
								0008-SDAP-enable-change-phase-of-pw-expire-policy-check.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,258 @@ | ||||
| From d3f82e944dc5dab3812700a245deec4aa3245b21 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Wed, 18 Feb 2015 01:03:40 -0500 | ||||
| Subject: [PATCH 08/99] SDAP: enable change phase of pw expire policy check | ||||
| 
 | ||||
| Implement new option which does checking password expiration policy | ||||
| in accounting phase. | ||||
| 
 | ||||
| This allows SSSD to issue shadow expiration warning even if alternate | ||||
| authentication method is used. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2167 | ||||
| 
 | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit c9b0071bfcb8eb8c71e40248de46d23aceecc0f3) | ||||
| ---
 | ||||
|  src/man/sssd-ldap.5.xml          | 27 +++++++++++++++++ | ||||
|  src/providers/ldap/ldap_access.c | 12 ++++++++ | ||||
|  src/providers/ldap/ldap_auth.c   |  1 + | ||||
|  src/providers/ldap/ldap_init.c   |  9 ++++++ | ||||
|  src/providers/ldap/sdap_access.c | 62 +++++++++++++++++++++++++++++++++++++++- | ||||
|  src/providers/ldap/sdap_access.h |  6 ++++ | ||||
|  src/util/util_errors.h           |  3 ++ | ||||
|  7 files changed, 119 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/man/sssd-ldap.5.xml b/src/man/sssd-ldap.5.xml
 | ||||
| index 5b36f69a679a1362290d8fea1f4c8fc29cc548d8..9fbc47487f3513a84e14b70ad85e32d08d1b9c6f 100644
 | ||||
| --- a/src/man/sssd-ldap.5.xml
 | ||||
| +++ b/src/man/sssd-ldap.5.xml
 | ||||
| @@ -1959,6 +1959,33 @@ ldap_access_filter = (employeeType=admin)
 | ||||
|                              ldap_account_expire_policy | ||||
|                          </para> | ||||
|                          <para> | ||||
| +                            <emphasis>pwd_expire_policy_reject,
 | ||||
| +                                      pwd_expire_policy_warn,
 | ||||
| +                                      pwd_expire_policy_renew:
 | ||||
| +                            </emphasis>
 | ||||
| +                            These options are useful if users are interested
 | ||||
| +                            in being warned that password is about to expire
 | ||||
| +                            and authentication is based on using a different
 | ||||
| +                            method than passwords - for example SSH keys.
 | ||||
| +                       </para>
 | ||||
| +                       <para>
 | ||||
| +                            The difference between these options is the action
 | ||||
| +                            taken if user password is expired:
 | ||||
| +                            pwd_expire_policy_reject - user is denied to log in,
 | ||||
| +                            pwd_expire_policy_warn - user is still able to log in,
 | ||||
| +                            pwd_expire_policy_renew - user is prompted to change
 | ||||
| +                            his password immediately.
 | ||||
| +                        </para>
 | ||||
| +                        <para>
 | ||||
| +                            Note If user password is expired no explicit message
 | ||||
| +                            is prompted by SSSD.
 | ||||
| +                        </para>
 | ||||
| +                        <para>
 | ||||
| +                            Please note that 'access_provider = ldap' must
 | ||||
| +                            be set for this feature to work. Also 'ldap_pwd_policy'
 | ||||
| +                            must be set to an appropriate password policy.
 | ||||
| +                        </para>
 | ||||
| +                        <para>
 | ||||
|                              <emphasis>authorized_service</emphasis>: use | ||||
|                              the authorizedService attribute to determine | ||||
|                              access | ||||
| diff --git a/src/providers/ldap/ldap_access.c b/src/providers/ldap/ldap_access.c
 | ||||
| index 1913cd9a92342cc985d5c098f224c4fe8c58d465..7ebdb20c06c5bb5f588071761c201ad566944d7e 100644
 | ||||
| --- a/src/providers/ldap/ldap_access.c
 | ||||
| +++ b/src/providers/ldap/ldap_access.c
 | ||||
| @@ -96,6 +96,18 @@ static void sdap_access_done(struct tevent_req *req)
 | ||||
|      case ERR_ACCOUNT_EXPIRED: | ||||
|          pam_status = PAM_ACCT_EXPIRED; | ||||
|          break; | ||||
| +    case ERR_PASSWORD_EXPIRED:
 | ||||
| +        pam_status = PAM_PERM_DENIED;
 | ||||
| +        break;
 | ||||
| +    case ERR_PASSWORD_EXPIRED_REJECT:
 | ||||
| +        pam_status = PAM_PERM_DENIED;
 | ||||
| +        break;
 | ||||
| +    case ERR_PASSWORD_EXPIRED_WARN:
 | ||||
| +        pam_status = PAM_SUCCESS;
 | ||||
| +        break;
 | ||||
| +    case ERR_PASSWORD_EXPIRED_RENEW:
 | ||||
| +        pam_status = PAM_NEW_AUTHTOK_REQD;
 | ||||
| +        break;
 | ||||
|      default: | ||||
|          DEBUG(SSSDBG_CRIT_FAILURE, "Error retrieving access check result.\n"); | ||||
|          pam_status = PAM_SYSTEM_ERR; | ||||
| diff --git a/src/providers/ldap/ldap_auth.c b/src/providers/ldap/ldap_auth.c
 | ||||
| index 4035aaf58c23291eb8115ef320758ba7666ed4e2..bdcc4505dc82cf3ca4bec9ce71ec6a9c28dd54e8 100644
 | ||||
| --- a/src/providers/ldap/ldap_auth.c
 | ||||
| +++ b/src/providers/ldap/ldap_auth.c
 | ||||
| @@ -47,6 +47,7 @@
 | ||||
|  #include "providers/ldap/sdap_async.h" | ||||
|  #include "providers/ldap/sdap_async_private.h" | ||||
|  #include "providers/ldap/ldap_auth.h" | ||||
| +#include "providers/ldap/sdap_access.h"
 | ||||
|   | ||||
|  #define LDAP_PWEXPIRE_WARNING_TIME 0 | ||||
|   | ||||
| diff --git a/src/providers/ldap/ldap_init.c b/src/providers/ldap/ldap_init.c
 | ||||
| index 44333a9a3a45de16aaaf83fecaea4817cebc90d4..8d5619779d38c0df5ec4761b4409c71e8976686c 100644
 | ||||
| --- a/src/providers/ldap/ldap_init.c
 | ||||
| +++ b/src/providers/ldap/ldap_init.c
 | ||||
| @@ -423,6 +423,15 @@ int sssm_ldap_access_init(struct be_ctx *bectx,
 | ||||
|              access_ctx->access_rule[c] = LDAP_ACCESS_HOST; | ||||
|          } else if (strcasecmp(order_list[c], LDAP_ACCESS_LOCK_NAME) == 0) { | ||||
|              access_ctx->access_rule[c] = LDAP_ACCESS_LOCKOUT; | ||||
| +        } else if (strcasecmp(order_list[c],
 | ||||
| +                              LDAP_ACCESS_EXPIRE_POLICY_REJECT_NAME) == 0) {
 | ||||
| +            access_ctx->access_rule[c] = LDAP_ACCESS_EXPIRE_POLICY_REJECT;
 | ||||
| +        } else if (strcasecmp(order_list[c],
 | ||||
| +                              LDAP_ACCESS_EXPIRE_POLICY_WARN_NAME) == 0) {
 | ||||
| +            access_ctx->access_rule[c] = LDAP_ACCESS_EXPIRE_POLICY_WARN;
 | ||||
| +        } else if (strcasecmp(order_list[c],
 | ||||
| +                              LDAP_ACCESS_EXPIRE_POLICY_RENEW_NAME) == 0) {
 | ||||
| +            access_ctx->access_rule[c] = LDAP_ACCESS_EXPIRE_POLICY_RENEW;
 | ||||
|          } else { | ||||
|              DEBUG(SSSDBG_CRIT_FAILURE, | ||||
|                    "Unexpected access rule name [%s].\n", order_list[c]); | ||||
| diff --git a/src/providers/ldap/sdap_access.c b/src/providers/ldap/sdap_access.c
 | ||||
| index a6c882cae634f080b200fe75f51867e39192bcd9..dd2fb6b92bc83ee36fc396d26e3d0d7e78021d71 100644
 | ||||
| --- a/src/providers/ldap/sdap_access.c
 | ||||
| +++ b/src/providers/ldap/sdap_access.c
 | ||||
| @@ -39,10 +39,16 @@
 | ||||
|  #include "providers/ldap/sdap_async.h" | ||||
|  #include "providers/data_provider.h" | ||||
|  #include "providers/dp_backend.h" | ||||
| +#include "providers/ldap/ldap_auth.h"
 | ||||
|   | ||||
|  #define PERMANENTLY_LOCKED_ACCOUNT "000001010000Z" | ||||
|  #define MALFORMED_FILTER "Malformed access control filter [%s]\n" | ||||
|   | ||||
| +static errno_t perform_pwexpire_policy(TALLOC_CTX *mem_ctx,
 | ||||
| +                                       struct sss_domain_info *domain,
 | ||||
| +                                       struct pam_data *pd,
 | ||||
| +                                       struct sdap_options *opts);
 | ||||
| +
 | ||||
|  static errno_t sdap_save_user_cache_bool(struct sss_domain_info *domain, | ||||
|                                           const char *username, | ||||
|                                           const char *attr_name, | ||||
| @@ -237,6 +243,30 @@ static errno_t sdap_access_check_next_rule(struct sdap_access_req_ctx *state,
 | ||||
|                                         state->pd, state->user_entry); | ||||
|              break; | ||||
|   | ||||
| +        case LDAP_ACCESS_EXPIRE_POLICY_REJECT:
 | ||||
| +            ret = perform_pwexpire_policy(state, state->domain, state->pd,
 | ||||
| +                                          state->access_ctx->id_ctx->opts);
 | ||||
| +            if (ret == ERR_PASSWORD_EXPIRED) {
 | ||||
| +                ret = ERR_PASSWORD_EXPIRED_REJECT;
 | ||||
| +            }
 | ||||
| +            break;
 | ||||
| +
 | ||||
| +        case LDAP_ACCESS_EXPIRE_POLICY_WARN:
 | ||||
| +            ret = perform_pwexpire_policy(state, state->domain, state->pd,
 | ||||
| +                                          state->access_ctx->id_ctx->opts);
 | ||||
| +            if (ret == ERR_PASSWORD_EXPIRED) {
 | ||||
| +                ret = ERR_PASSWORD_EXPIRED_WARN;
 | ||||
| +            }
 | ||||
| +            break;
 | ||||
| +
 | ||||
| +        case LDAP_ACCESS_EXPIRE_POLICY_RENEW:
 | ||||
| +            ret = perform_pwexpire_policy(state, state->domain, state->pd,
 | ||||
| +                                          state->access_ctx->id_ctx->opts);
 | ||||
| +            if (ret == ERR_PASSWORD_EXPIRED) {
 | ||||
| +                ret = ERR_PASSWORD_EXPIRED_RENEW;
 | ||||
| +            }
 | ||||
| +            break;
 | ||||
| +
 | ||||
|          case LDAP_ACCESS_SERVICE: | ||||
|              ret = sdap_access_service( state->pd, state->user_entry); | ||||
|              break; | ||||
| @@ -651,7 +681,6 @@ static errno_t sdap_account_expired_nds(struct pam_data *pd,
 | ||||
|      return EOK; | ||||
|  } | ||||
|   | ||||
| -
 | ||||
|  static errno_t sdap_account_expired(struct sdap_access_ctx *access_ctx, | ||||
|                                      struct pam_data *pd, | ||||
|                                      struct ldb_message *user_entry) | ||||
| @@ -702,6 +731,37 @@ static errno_t sdap_account_expired(struct sdap_access_ctx *access_ctx,
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| +static errno_t perform_pwexpire_policy(TALLOC_CTX *mem_ctx,
 | ||||
| +                                       struct sss_domain_info *domain,
 | ||||
| +                                       struct pam_data *pd,
 | ||||
| +                                       struct sdap_options *opts)
 | ||||
| +{
 | ||||
| +    enum pwexpire pw_expire_type;
 | ||||
| +    void *pw_expire_data;
 | ||||
| +    errno_t ret;
 | ||||
| +    char *dn;
 | ||||
| +
 | ||||
| +    ret = get_user_dn(mem_ctx, domain, opts, pd->user, &dn, &pw_expire_type,
 | ||||
| +                      &pw_expire_data);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE, "get_user_dn returned %d:[%s].\n",
 | ||||
| +              ret, sss_strerror(ret));
 | ||||
| +        goto done;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = check_pwexpire_policy(pw_expire_type, pw_expire_data, pd,
 | ||||
| +                                domain->pwd_expiration_warning);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +              "check_pwexpire_policy returned %d:[%s].\n",
 | ||||
| +              ret, sss_strerror(ret));
 | ||||
| +        goto done;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +done:
 | ||||
| +    return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
|  struct sdap_access_filter_req_ctx { | ||||
|      const char *username; | ||||
|      const char *filter; | ||||
| diff --git a/src/providers/ldap/sdap_access.h b/src/providers/ldap/sdap_access.h
 | ||||
| index f085e619961198b887d65ed5ee0bc5cdd90d1b20..a8c6639109bd7e6dcb325a5e8d080f743ec56d97 100644
 | ||||
| --- a/src/providers/ldap/sdap_access.h
 | ||||
| +++ b/src/providers/ldap/sdap_access.h
 | ||||
| @@ -39,6 +39,9 @@
 | ||||
|   | ||||
|  #define LDAP_ACCESS_FILTER_NAME "filter" | ||||
|  #define LDAP_ACCESS_EXPIRE_NAME "expire" | ||||
| +#define LDAP_ACCESS_EXPIRE_POLICY_REJECT_NAME "pwd_expire_policy_reject"
 | ||||
| +#define LDAP_ACCESS_EXPIRE_POLICY_WARN_NAME "pwd_expire_policy_warn"
 | ||||
| +#define LDAP_ACCESS_EXPIRE_POLICY_RENEW_NAME "pwd_expire_policy_renew"
 | ||||
|  #define LDAP_ACCESS_SERVICE_NAME "authorized_service" | ||||
|  #define LDAP_ACCESS_HOST_NAME "host" | ||||
|  #define LDAP_ACCESS_LOCK_NAME "lockout" | ||||
| @@ -57,6 +60,9 @@ enum ldap_access_rule {
 | ||||
|      LDAP_ACCESS_SERVICE, | ||||
|      LDAP_ACCESS_HOST, | ||||
|      LDAP_ACCESS_LOCKOUT, | ||||
| +    LDAP_ACCESS_EXPIRE_POLICY_REJECT,
 | ||||
| +    LDAP_ACCESS_EXPIRE_POLICY_WARN,
 | ||||
| +    LDAP_ACCESS_EXPIRE_POLICY_RENEW,
 | ||||
|      LDAP_ACCESS_LAST | ||||
|  }; | ||||
|   | ||||
| diff --git a/src/util/util_errors.h b/src/util/util_errors.h
 | ||||
| index 39455dc8adfe8784bd3f06382d701b7f9e97f004..97e210e31dc6501860d1490966369a0d3ebe2cc2 100644
 | ||||
| --- a/src/util/util_errors.h
 | ||||
| +++ b/src/util/util_errors.h
 | ||||
| @@ -64,6 +64,9 @@ enum sssd_errors {
 | ||||
|      ERR_NETWORK_IO, | ||||
|      ERR_ACCOUNT_EXPIRED, | ||||
|      ERR_PASSWORD_EXPIRED, | ||||
| +    ERR_PASSWORD_EXPIRED_REJECT,
 | ||||
| +    ERR_PASSWORD_EXPIRED_WARN,
 | ||||
| +    ERR_PASSWORD_EXPIRED_RENEW,
 | ||||
|      ERR_ACCESS_DENIED, | ||||
|      ERR_SRV_NOT_FOUND, | ||||
|      ERR_SRV_LOOKUP_ERROR, | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,53 @@ | ||||
| From 0b5036e4c652e6983a3352c045c8701d6573587b Mon Sep 17 00:00:00 2001 | ||||
| From: Daniel Hjorth <dh@dhjorth.com> | ||||
| Date: Wed, 25 Feb 2015 13:07:35 -0700 | ||||
| Subject: [PATCH 09/99] LDAP: unlink ccname_file_dummy if there is an error | ||||
| 
 | ||||
| https://fedorahosted.org/sssd/ticket/2592 | ||||
| 
 | ||||
| If there is an error after ccname_file_dummy is created but before it is | ||||
| renamed then the file isn't removed.  This can cause a lot of files to be | ||||
| created and take up inodes in a filesystem. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit 2b20ff2e33ad3993a9cad910c4b4b828513613df) | ||||
| ---
 | ||||
|  src/providers/ldap/ldap_child.c | 12 +++++++++++- | ||||
|  1 file changed, 11 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/ldap_child.c b/src/providers/ldap/ldap_child.c
 | ||||
| index e9aebf5a6319b5d848aadfb27061099fc153a7f6..774cff9c2d942b589e69933d3f201f6245fa904d 100644
 | ||||
| --- a/src/providers/ldap/ldap_child.c
 | ||||
| +++ b/src/providers/ldap/ldap_child.c
 | ||||
| @@ -489,16 +489,26 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx,
 | ||||
|                "rename failed [%d][%s].\n", ret, strerror(ret)); | ||||
|          goto done; | ||||
|      } | ||||
| +    ccname_file_dummy = NULL;
 | ||||
|   | ||||
|      krberr = 0; | ||||
|      *ccname_out = talloc_steal(memctx, ccname); | ||||
|      *expire_time_out = my_creds.times.endtime - kdc_time_offset; | ||||
|   | ||||
|  done: | ||||
| -    talloc_free(tmp_ctx);
 | ||||
|      if (krberr != 0) KRB5_SYSLOG(krberr); | ||||
|      if (keytab) krb5_kt_close(context, keytab); | ||||
|      if (context) krb5_free_context(context); | ||||
| +    if (ccname_file_dummy) {
 | ||||
| +        DEBUG(SSSDBG_TRACE_INTERNAL, "Unlinking [%s]\n", ccname_file_dummy);
 | ||||
| +        ret = unlink(ccname_file_dummy);
 | ||||
| +        if (ret == -1) {
 | ||||
| +            ret = errno;
 | ||||
| +            DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +                  "Unlink failed [%d][%s].\n", ret, strerror(ret));
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +    talloc_free(tmp_ctx);
 | ||||
|      return krberr; | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From e991859590d4b598193f192674fca0ded1914bae Mon Sep 17 00:00:00 2001 | ||||
| From 90efb3c2a48146d7b6cc81fe8422e9024144402a Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Fri, 13 Feb 2015 17:57:35 +0100 | ||||
| Subject: [PATCH 16/17] selinux: Delete existing user mapping on empty default | ||||
| Subject: [PATCH 10/99] selinux: Delete existing user mapping on empty default | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| @ -77,5 +77,5 @@ index 63d4b929786d4b8cc0d40f0c65009673c7309094..3756557a5e28624e6437e805ca8a387d | ||||
|      return ret; | ||||
|  } | ||||
| -- 
 | ||||
| 2.3.3 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										33
									
								
								0011-ldap_child-initialized-ccname_file_dummy.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								0011-ldap_child-initialized-ccname_file_dummy.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| From 21c627fbbbb64ec23460758b382ffc863c14e61f Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Fri, 6 Mar 2015 11:27:36 +0100 | ||||
| Subject: [PATCH 11/99] ldap_child: initialized ccname_file_dummy | ||||
| 
 | ||||
| ccname_file_dummy is used in the done-block which is called before | ||||
| ccname_file_dummy is set to a value. This patch initializes | ||||
| ccname_file_dummy to NULL. | ||||
| 
 | ||||
| Related to https://fedorahosted.org/sssd/ticket/2592 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit cc0f9a541c5ecdad750a86b2de9baa1f07403e9e) | ||||
| ---
 | ||||
|  src/providers/ldap/ldap_child.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/ldap_child.c b/src/providers/ldap/ldap_child.c
 | ||||
| index 774cff9c2d942b589e69933d3f201f6245fa904d..8f034affa48095b6e512c866f8a3c33465e5c595 100644
 | ||||
| --- a/src/providers/ldap/ldap_child.c
 | ||||
| +++ b/src/providers/ldap/ldap_child.c
 | ||||
| @@ -272,7 +272,7 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx,
 | ||||
|      int kdc_time_offset_usec; | ||||
|      int ret; | ||||
|      TALLOC_CTX *tmp_ctx; | ||||
| -    char *ccname_file_dummy;
 | ||||
| +    char *ccname_file_dummy = NULL;
 | ||||
|      char *ccname_file; | ||||
|      mode_t old_umask; | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										244
									
								
								0012-UTIL-convert-GeneralizedTime-to-unix-time.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								0012-UTIL-convert-GeneralizedTime-to-unix-time.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,244 @@ | ||||
| From 3cace03ac7a2c4ff6d3469a3d3128c79a1882e43 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Tue, 20 Jan 2015 16:27:41 -0500 | ||||
| Subject: [PATCH 12/99] UTIL: convert GeneralizedTime to unix time | ||||
| 
 | ||||
| New utility function *sss_utc_to_time_t* to convert GeneralizedTime to | ||||
| unix time. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| ---
 | ||||
|  Makefile.am            |  9 +++++--- | ||||
|  src/tests/util-tests.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||
|  src/util/util.c        | 53 ++++++++++++++++++++++++++++++++++++++++++++++ | ||||
|  src/util/util.h        |  3 +++ | ||||
|  src/util/util_errors.c |  1 + | ||||
|  src/util/util_errors.h |  1 + | ||||
|  6 files changed, 121 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/Makefile.am b/Makefile.am
 | ||||
| index 9fe60d656403e09595ced5f623f381afbd3b2a43..210ef6ffe6ebc4772fc80bed25f2a31208c020f3 100644
 | ||||
| --- a/Makefile.am
 | ||||
| +++ b/Makefile.am
 | ||||
| @@ -1540,15 +1540,18 @@ simple_access_tests_LDADD = \
 | ||||
|      libsss_test_common.la | ||||
|   | ||||
|  util_tests_SOURCES = \ | ||||
| -    src/tests/util-tests.c
 | ||||
| +    src/tests/util-tests.c \
 | ||||
| +    $(NULL)
 | ||||
|  util_tests_CFLAGS = \ | ||||
|      $(AM_CFLAGS) \ | ||||
| -    $(CHECK_CFLAGS)
 | ||||
| +    $(CHECK_CFLAGS) \
 | ||||
| +    $(NULL)
 | ||||
|  util_tests_LDADD = \ | ||||
|      $(SSSD_LIBS) \ | ||||
|      $(CHECK_LIBS) \ | ||||
|      $(SSSD_INTERNAL_LTLIBS) \ | ||||
| -    libsss_test_common.la
 | ||||
| +    libsss_test_common.la \
 | ||||
| +    $(NULL)
 | ||||
|   | ||||
|  safe_format_tests_SOURCES = \ | ||||
|      src/tests/safe-format-tests.c | ||||
| diff --git a/src/tests/util-tests.c b/src/tests/util-tests.c
 | ||||
| index 08e8b8d263c46618a0cdfb2203684305fa6dddc6..21eb02f14a7225ae9b9de4aa7f958b73f84a066d 100644
 | ||||
| --- a/src/tests/util-tests.c
 | ||||
| +++ b/src/tests/util-tests.c
 | ||||
| @@ -28,6 +28,8 @@
 | ||||
|  #include <sys/types.h> | ||||
|  #include <sys/stat.h> | ||||
|  #include <fcntl.h> | ||||
| +#include <stdlib.h>
 | ||||
| +
 | ||||
|  #include "util/util.h" | ||||
|  #include "util/sss_utf8.h" | ||||
|  #include "util/murmurhash3.h" | ||||
| @@ -1000,6 +1002,54 @@ START_TEST(test_known_service)
 | ||||
|  } | ||||
|  END_TEST | ||||
|   | ||||
| +static void convert_time_tz(const char* tz)
 | ||||
| +{
 | ||||
| +    errno_t ret, ret2;
 | ||||
| +    time_t unix_time;
 | ||||
| +    const char *orig_tz = NULL;
 | ||||
| +
 | ||||
| +    orig_tz = getenv("TZ");
 | ||||
| +    if (orig_tz == NULL) {
 | ||||
| +        orig_tz = "";
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (tz) {
 | ||||
| +        ret = setenv("TZ", tz, 1);
 | ||||
| +        fail_if(ret == -1);
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = sss_utc_to_time_t("20140801115742Z", "%Y%m%d%H%M%SZ", &unix_time);
 | ||||
| +
 | ||||
| +    /* restore */
 | ||||
| +    if (orig_tz != NULL) {
 | ||||
| +        ret2 = setenv("TZ", orig_tz, 1);
 | ||||
| +        fail_if(ret2 == -1);
 | ||||
| +    }
 | ||||
| +    fail_unless(ret == EOK && difftime(1406894262, unix_time) == 0);
 | ||||
| +}
 | ||||
| +
 | ||||
| +START_TEST(test_convert_time)
 | ||||
| +{
 | ||||
| +    const char *format = "%Y%m%d%H%M%SZ";
 | ||||
| +    time_t unix_time;
 | ||||
| +    errno_t ret;
 | ||||
| +
 | ||||
| +    ret = sss_utc_to_time_t("20150127133540P", format, &unix_time);
 | ||||
| +    fail_unless(ret == ERR_TIMESPEC_NOT_SUPPORTED);
 | ||||
| +    ret = sss_utc_to_time_t("0Z", format, &unix_time);
 | ||||
| +    fail_unless(ret == EINVAL);
 | ||||
| +    ret = sss_utc_to_time_t("000001010000Z", format, &unix_time);
 | ||||
| +    fail_unless(ret == EINVAL);
 | ||||
| +
 | ||||
| +    /* test that results are still same no matter what timezone is set */
 | ||||
| +    convert_time_tz(NULL);
 | ||||
| +
 | ||||
| +    convert_time_tz("GST-1");
 | ||||
| +
 | ||||
| +    convert_time_tz("GST-2");
 | ||||
| +}
 | ||||
| +END_TEST
 | ||||
| +
 | ||||
|  Suite *util_suite(void) | ||||
|  { | ||||
|      Suite *s = suite_create("util"); | ||||
| @@ -1046,10 +1096,17 @@ Suite *util_suite(void)
 | ||||
|      tcase_add_test(tc_atomicio, test_atomicio_read_exact_sized_file); | ||||
|      tcase_add_test(tc_atomicio, test_atomicio_read_from_empty_file); | ||||
|   | ||||
| +    TCase *tc_convert_time = tcase_create("convert_time");
 | ||||
| +    tcase_add_checked_fixture(tc_convert_time,
 | ||||
| +                              ck_leak_check_setup,
 | ||||
| +                              ck_leak_check_teardown);
 | ||||
| +    tcase_add_test(tc_convert_time, test_convert_time);
 | ||||
| +
 | ||||
|      suite_add_tcase (s, tc_util); | ||||
|      suite_add_tcase (s, tc_utf8); | ||||
|      suite_add_tcase (s, tc_mh3); | ||||
|      suite_add_tcase (s, tc_atomicio); | ||||
| +    suite_add_tcase (s, tc_convert_time);
 | ||||
|   | ||||
|      return s; | ||||
|  } | ||||
| diff --git a/src/util/util.c b/src/util/util.c
 | ||||
| index 2acb8604ac0c2bc7b83ee578c7bbead9a7fd44b3..c4d8bf91f89c34b21f272a9f722eabf551aba9be 100644
 | ||||
| --- a/src/util/util.c
 | ||||
| +++ b/src/util/util.c
 | ||||
| @@ -18,6 +18,7 @@
 | ||||
|      along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|   | ||||
| +#include "config.h"
 | ||||
|  #include <ctype.h> | ||||
|  #include <netdb.h> | ||||
|  #include <poll.h> | ||||
| @@ -26,6 +27,7 @@
 | ||||
|  #include <arpa/inet.h> | ||||
|  #include <talloc.h> | ||||
|  #include <dhash.h> | ||||
| +#include <time.h>
 | ||||
|   | ||||
|  #include "util/util.h" | ||||
|  #include "util/sss_utf8.h" | ||||
| @@ -880,3 +882,54 @@ done:
 | ||||
|   | ||||
|      return ret; | ||||
|  } | ||||
| +
 | ||||
| +/* Convert GeneralizedTime (http://en.wikipedia.org/wiki/GeneralizedTime)
 | ||||
| + * to unix time (seconds since epoch). Use UTC time zone.
 | ||||
| + */
 | ||||
| +errno_t sss_utc_to_time_t(const char *str, const char *format, time_t *_unix_time)
 | ||||
| +{
 | ||||
| +    char *end;
 | ||||
| +    struct tm tm;
 | ||||
| +    size_t len;
 | ||||
| +    time_t ut;
 | ||||
| +
 | ||||
| +    if (str == NULL) {
 | ||||
| +        return EINVAL;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    len = strlen(str);
 | ||||
| +    if (str[len-1] != 'Z') {
 | ||||
| +        DEBUG(SSSDBG_TRACE_INTERNAL,
 | ||||
| +              "%s does not seem to be in UTZ time zone.\n", str);
 | ||||
| +        return ERR_TIMESPEC_NOT_SUPPORTED;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    memset(&tm, 0, sizeof(tm));
 | ||||
| +
 | ||||
| +    end = strptime(str, format, &tm);
 | ||||
| +    /* not all characters from format were matched */
 | ||||
| +    if (end == NULL) {
 | ||||
| +        DEBUG(SSSDBG_TRACE_INTERNAL,
 | ||||
| +              "String [%s] failed to match format [%s].\n", str, format);
 | ||||
| +        return EINVAL;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    /* str is 'longer' than format */
 | ||||
| +    if (*end != '\0') {
 | ||||
| +        DEBUG(SSSDBG_TRACE_INTERNAL,
 | ||||
| +              "String [%s] is longer than format [%s].\n", str, format);
 | ||||
| +        return EINVAL;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ut = mktime(&tm);
 | ||||
| +    if (ut == -1) {
 | ||||
| +        DEBUG(SSSDBG_TRACE_INTERNAL,
 | ||||
| +              "mktime failed to convert [%s].\n", str);
 | ||||
| +        return EINVAL;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    tzset();
 | ||||
| +    ut -= timezone;
 | ||||
| +    *_unix_time = ut;
 | ||||
| +    return EOK;
 | ||||
| +}
 | ||||
| diff --git a/src/util/util.h b/src/util/util.h
 | ||||
| index bf3a9a057aed77e93949370f8651af2631d91432..22a67a55855282441379477236a323362c8bdb4d 100644
 | ||||
| --- a/src/util/util.h
 | ||||
| +++ b/src/util/util.h
 | ||||
| @@ -636,4 +636,7 @@ int set_seuser(const char *login_name, const char *seuser_name,
 | ||||
|                 const char *mlsrange); | ||||
|  int del_seuser(const char *login_name); | ||||
|   | ||||
| +/* convert time from generalized form to unix time */
 | ||||
| +errno_t sss_utc_to_time_t(const char *str, const char *format, time_t *unix_time);
 | ||||
| +
 | ||||
|  #endif /* __SSSD_UTIL_H__ */ | ||||
| diff --git a/src/util/util_errors.c b/src/util/util_errors.c
 | ||||
| index 16d16fc777fc3344db8a3bdfeb3633bd5db48530..bfae5cd189902ed82ba8b7db29e85a309e4bd19c 100644
 | ||||
| --- a/src/util/util_errors.c
 | ||||
| +++ b/src/util/util_errors.c
 | ||||
| @@ -65,6 +65,7 @@ struct err_string error_to_str[] = {
 | ||||
|      { "LDAP search returned a referral" }, /* ERR_REFERRAL */ | ||||
|      { "Error setting SELinux user context" }, /* ERR_SELINUX_CONTEXT */ | ||||
|      { "Username format not allowed by re_expression" }, /* ERR_REGEX_NOMATCH */ | ||||
| +    { "Time specification not supported" }, /* ERR_TIMESPEC_NOT_SUPPORTED */
 | ||||
|  }; | ||||
|   | ||||
|   | ||||
| diff --git a/src/util/util_errors.h b/src/util/util_errors.h
 | ||||
| index 97e210e31dc6501860d1490966369a0d3ebe2cc2..069d4b78aa5ed6c756affdacab99c7141b7849e4 100644
 | ||||
| --- a/src/util/util_errors.h
 | ||||
| +++ b/src/util/util_errors.h
 | ||||
| @@ -90,6 +90,7 @@ enum sssd_errors {
 | ||||
|      ERR_REFERRAL, | ||||
|      ERR_SELINUX_CONTEXT, | ||||
|      ERR_REGEX_NOMATCH, | ||||
| +    ERR_TIMESPEC_NOT_SUPPORTED,
 | ||||
|      ERR_LAST            /* ALWAYS LAST */ | ||||
|  }; | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										725
									
								
								0013-SDAP-Lock-out-ssh-keys-when-account-naturally-expire.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										725
									
								
								0013-SDAP-Lock-out-ssh-keys-when-account-naturally-expire.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,725 @@ | ||||
| From 8ebc05498460ce28eff012649c892b248c53632f Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Tue, 20 Jan 2015 18:34:44 -0500 | ||||
| Subject: [PATCH 13/99] SDAP: Lock out ssh keys when account naturally expires | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2534 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| ---
 | ||||
|  Makefile.am                      |  13 +- | ||||
|  src/man/sssd-ldap.5.xml          |  14 ++ | ||||
|  src/providers/ldap/ldap_init.c   |   2 + | ||||
|  src/providers/ldap/sdap_access.c | 316 ++++++++++++++++++++++++++++----------- | ||||
|  src/providers/ldap/sdap_access.h |   3 + | ||||
|  5 files changed, 254 insertions(+), 94 deletions(-) | ||||
| 
 | ||||
| diff --git a/Makefile.am b/Makefile.am
 | ||||
| index 210ef6ffe6ebc4772fc80bed25f2a31208c020f3..5099043549a46c15a9d7f6a581c864cbbe3137b5 100644
 | ||||
| --- a/Makefile.am
 | ||||
| +++ b/Makefile.am
 | ||||
| @@ -2409,16 +2409,21 @@ libsss_ldap_common_la_SOURCES = \
 | ||||
|      src/providers/ldap/sdap_domain.c \ | ||||
|      src/providers/ldap/sdap.c \ | ||||
|      src/util/user_info_msg.c \ | ||||
| -    src/util/sss_ldap.c
 | ||||
| +    src/util/sss_ldap.c \
 | ||||
| +    $(NULL)
 | ||||
|  libsss_ldap_common_la_CFLAGS = \ | ||||
| -    $(KRB5_CFLAGS)
 | ||||
| +    $(KRB5_CFLAGS) \
 | ||||
| +    $(NULL)
 | ||||
|  libsss_ldap_common_la_LIBADD = \ | ||||
|      $(OPENLDAP_LIBS) \ | ||||
|      $(KRB5_LIBS) \ | ||||
|      libsss_krb5_common.la \ | ||||
| -    libsss_idmap.la
 | ||||
| +    libsss_idmap.la \
 | ||||
| +    libsss_util.la \
 | ||||
| +    $(NULL)
 | ||||
|  libsss_ldap_common_la_LDFLAGS = \ | ||||
| -    -avoid-version
 | ||||
| +    -avoid-version \
 | ||||
| +    $(NULL)
 | ||||
|   | ||||
|  if BUILD_SUDO | ||||
|  libsss_ldap_common_la_SOURCES += \ | ||||
| diff --git a/src/man/sssd-ldap.5.xml b/src/man/sssd-ldap.5.xml
 | ||||
| index 9fbc47487f3513a84e14b70ad85e32d08d1b9c6f..00da3964af7619f19525e76c4f1292586dd60f54 100644
 | ||||
| --- a/src/man/sssd-ldap.5.xml
 | ||||
| +++ b/src/man/sssd-ldap.5.xml
 | ||||
| @@ -1955,6 +1955,20 @@ ldap_access_filter = (employeeType=admin)
 | ||||
|                              be set for this feature to work. | ||||
|                          </para> | ||||
|                          <para> | ||||
| +                            <emphasis>ppolicy</emphasis>: use account locking.
 | ||||
| +                            If set, this option denies access in case that ldap
 | ||||
| +                            attribute 'pwdAccountLockedTime' is present and has
 | ||||
| +                            value of '000001010000Z' or represents any time in the past.
 | ||||
| +                            The value of 'pwdAccountLockedTime' attribute
 | ||||
| +                            must end with 'Z' as only UTC time zone is
 | ||||
| +                            currently suported. Please see the option
 | ||||
| +                            ldap_pwdlockout_dn.
 | ||||
| +
 | ||||
| +                            Please note that 'access_provider = ldap' must
 | ||||
| +                            be set for this feature to work.
 | ||||
| +                        </para>
 | ||||
| +
 | ||||
| +                        <para>
 | ||||
|                              <emphasis>expire</emphasis>: use | ||||
|                              ldap_account_expire_policy | ||||
|                          </para> | ||||
| diff --git a/src/providers/ldap/ldap_init.c b/src/providers/ldap/ldap_init.c
 | ||||
| index 8d5619779d38c0df5ec4761b4409c71e8976686c..cebd548a4f787c2ddda56a1c5e74a60fa78d83ec 100644
 | ||||
| --- a/src/providers/ldap/ldap_init.c
 | ||||
| +++ b/src/providers/ldap/ldap_init.c
 | ||||
| @@ -432,6 +432,8 @@ int sssm_ldap_access_init(struct be_ctx *bectx,
 | ||||
|          } else if (strcasecmp(order_list[c], | ||||
|                                LDAP_ACCESS_EXPIRE_POLICY_RENEW_NAME) == 0) { | ||||
|              access_ctx->access_rule[c] = LDAP_ACCESS_EXPIRE_POLICY_RENEW; | ||||
| +        } else if (strcasecmp(order_list[c], LDAP_ACCESS_PPOLICY_NAME) == 0) {
 | ||||
| +            access_ctx->access_rule[c] = LDAP_ACCESS_PPOLICY;
 | ||||
|          } else { | ||||
|              DEBUG(SSSDBG_CRIT_FAILURE, | ||||
|                    "Unexpected access rule name [%s].\n", order_list[c]); | ||||
| diff --git a/src/providers/ldap/sdap_access.c b/src/providers/ldap/sdap_access.c
 | ||||
| index dd2fb6b92bc83ee36fc396d26e3d0d7e78021d71..4a45ff419be9a31224e00cf0fb4ea021953bbbc3 100644
 | ||||
| --- a/src/providers/ldap/sdap_access.c
 | ||||
| +++ b/src/providers/ldap/sdap_access.c
 | ||||
| @@ -32,6 +32,7 @@
 | ||||
|  #include <errno.h> | ||||
|   | ||||
|  #include "util/util.h" | ||||
| +#include "util/strtonum.h"
 | ||||
|  #include "db/sysdb.h" | ||||
|  #include "providers/ldap/ldap_common.h" | ||||
|  #include "providers/ldap/sdap.h" | ||||
| @@ -44,6 +45,12 @@
 | ||||
|  #define PERMANENTLY_LOCKED_ACCOUNT "000001010000Z" | ||||
|  #define MALFORMED_FILTER "Malformed access control filter [%s]\n" | ||||
|   | ||||
| +enum sdap_pwpolicy_mode {
 | ||||
| +    PWP_LOCKOUT_ONLY,
 | ||||
| +    PWP_LOCKOUT_EXPIRE,
 | ||||
| +    PWP_SENTINEL,
 | ||||
| +};
 | ||||
| +
 | ||||
|  static errno_t perform_pwexpire_policy(TALLOC_CTX *mem_ctx, | ||||
|                                         struct sss_domain_info *domain, | ||||
|                                         struct pam_data *pd, | ||||
| @@ -59,14 +66,15 @@ static errno_t sdap_get_basedn_user_entry(struct ldb_message *user_entry,
 | ||||
|                                            const char **_basedn); | ||||
|   | ||||
|  static struct tevent_req * | ||||
| -sdap_access_lock_send(TALLOC_CTX *mem_ctx,
 | ||||
| -                      struct tevent_context *ev,
 | ||||
| -                      struct be_ctx *be_ctx,
 | ||||
| -                      struct sss_domain_info *domain,
 | ||||
| -                      struct sdap_access_ctx *access_ctx,
 | ||||
| -                      struct sdap_id_conn_ctx *conn,
 | ||||
| -                      const char *username,
 | ||||
| -                      struct ldb_message *user_entry);
 | ||||
| +sdap_access_ppolicy_send(TALLOC_CTX *mem_ctx,
 | ||||
| +                         struct tevent_context *ev,
 | ||||
| +                         struct be_ctx *be_ctx,
 | ||||
| +                         struct sss_domain_info *domain,
 | ||||
| +                         struct sdap_access_ctx *access_ctx,
 | ||||
| +                         struct sdap_id_conn_ctx *conn,
 | ||||
| +                         const char *username,
 | ||||
| +                         struct ldb_message *user_entry,
 | ||||
| +                         enum sdap_pwpolicy_mode pwpol_mod);
 | ||||
|   | ||||
|  static struct tevent_req *sdap_access_filter_send(TALLOC_CTX *mem_ctx, | ||||
|                                               struct tevent_context *ev, | ||||
| @@ -79,7 +87,7 @@ static struct tevent_req *sdap_access_filter_send(TALLOC_CTX *mem_ctx,
 | ||||
|   | ||||
|  static errno_t sdap_access_filter_recv(struct tevent_req *req); | ||||
|   | ||||
| -static errno_t sdap_access_lock_recv(struct tevent_req *req);
 | ||||
| +static errno_t sdap_access_ppolicy_recv(struct tevent_req *req);
 | ||||
|   | ||||
|  static errno_t sdap_account_expired(struct sdap_access_ctx *access_ctx, | ||||
|                                      struct pam_data *pd, | ||||
| @@ -205,14 +213,34 @@ static errno_t sdap_access_check_next_rule(struct sdap_access_req_ctx *state,
 | ||||
|              return EOK; | ||||
|   | ||||
|          case LDAP_ACCESS_LOCKOUT: | ||||
| -            subreq = sdap_access_lock_send(state, state->ev, state->be_ctx,
 | ||||
| -                                           state->domain,
 | ||||
| -                                           state->access_ctx,
 | ||||
| -                                           state->conn,
 | ||||
| -                                           state->pd->user,
 | ||||
| -                                           state->user_entry);
 | ||||
| +            subreq = sdap_access_ppolicy_send(state, state->ev, state->be_ctx,
 | ||||
| +                                              state->domain,
 | ||||
| +                                              state->access_ctx,
 | ||||
| +                                              state->conn,
 | ||||
| +                                              state->pd->user,
 | ||||
| +                                              state->user_entry,
 | ||||
| +                                              PWP_LOCKOUT_ONLY);
 | ||||
|              if (subreq == NULL) { | ||||
| -                DEBUG(SSSDBG_CRIT_FAILURE, "sdap_access_lock_send failed.\n");
 | ||||
| +                DEBUG(SSSDBG_CRIT_FAILURE, "sdap_access_ppolicy_send failed.\n");
 | ||||
| +                return ENOMEM;
 | ||||
| +            }
 | ||||
| +
 | ||||
| +            state->ac_type = SDAP_ACCESS_CONTROL_PPOLICY_LOCK;
 | ||||
| +
 | ||||
| +            tevent_req_set_callback(subreq, sdap_access_done, req);
 | ||||
| +            return EAGAIN;
 | ||||
| +
 | ||||
| +        case LDAP_ACCESS_PPOLICY:
 | ||||
| +            subreq = sdap_access_ppolicy_send(state, state->ev, state->be_ctx,
 | ||||
| +                                              state->domain,
 | ||||
| +                                              state->access_ctx,
 | ||||
| +                                              state->conn,
 | ||||
| +                                              state->pd->user,
 | ||||
| +                                              state->user_entry,
 | ||||
| +                                              PWP_LOCKOUT_EXPIRE);
 | ||||
| +            if (subreq == NULL) {
 | ||||
| +                DEBUG(SSSDBG_CRIT_FAILURE,
 | ||||
| +                      "sdap_access_ppolicy_send failed.\n");
 | ||||
|                  return ENOMEM; | ||||
|              } | ||||
|   | ||||
| @@ -302,7 +330,7 @@ static void sdap_access_done(struct tevent_req *subreq)
 | ||||
|          ret = sdap_access_filter_recv(subreq); | ||||
|          break; | ||||
|      case SDAP_ACCESS_CONTROL_PPOLICY_LOCK: | ||||
| -        ret = sdap_access_lock_recv(subreq);
 | ||||
| +        ret = sdap_access_ppolicy_recv(subreq);
 | ||||
|          break; | ||||
|      default: | ||||
|          ret = EINVAL; | ||||
| @@ -779,8 +807,8 @@ struct sdap_access_filter_req_ctx {
 | ||||
|   | ||||
|  static errno_t sdap_access_decide_offline(bool cached_ac); | ||||
|  static int sdap_access_filter_retry(struct tevent_req *req); | ||||
| -static void sdap_access_lock_connect_done(struct tevent_req *subreq);
 | ||||
| -static errno_t sdap_access_lock_get_lockout_step(struct tevent_req *req);
 | ||||
| +static void sdap_access_ppolicy_connect_done(struct tevent_req *subreq);
 | ||||
| +static errno_t sdap_access_ppolicy_get_lockout_step(struct tevent_req *req);
 | ||||
|  static void sdap_access_filter_connect_done(struct tevent_req *subreq); | ||||
|  static void sdap_access_filter_done(struct tevent_req *req); | ||||
|  static struct tevent_req *sdap_access_filter_send(TALLOC_CTX *mem_ctx, | ||||
| @@ -1255,12 +1283,12 @@ static errno_t sdap_access_host(struct ldb_message *user_entry)
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| -static void sdap_access_lock_get_lockout_done(struct tevent_req *subreq);
 | ||||
| -static int sdap_access_lock_retry(struct tevent_req *req);
 | ||||
| -static errno_t sdap_access_lock_step(struct tevent_req *req);
 | ||||
| -static void sdap_access_lock_step_done(struct tevent_req *subreq);
 | ||||
| +static void sdap_access_ppolicy_get_lockout_done(struct tevent_req *subreq);
 | ||||
| +static int sdap_access_ppolicy_retry(struct tevent_req *req);
 | ||||
| +static errno_t sdap_access_ppolicy_step(struct tevent_req *req);
 | ||||
| +static void sdap_access_ppolicy_step_done(struct tevent_req *subreq);
 | ||||
|   | ||||
| -struct sdap_access_lock_req_ctx {
 | ||||
| +struct sdap_access_ppolicy_req_ctx {
 | ||||
|      const char *username; | ||||
|      const char *filter; | ||||
|      struct tevent_context *ev; | ||||
| @@ -1276,24 +1304,26 @@ struct sdap_access_lock_req_ctx {
 | ||||
|      /* default DNs to ppolicy */ | ||||
|      const char **ppolicy_dns; | ||||
|      unsigned int ppolicy_dns_index; | ||||
| +    enum sdap_pwpolicy_mode pwpol_mode;
 | ||||
|  }; | ||||
|   | ||||
|  static struct tevent_req * | ||||
| -sdap_access_lock_send(TALLOC_CTX *mem_ctx,
 | ||||
| -                      struct tevent_context *ev,
 | ||||
| -                      struct be_ctx *be_ctx,
 | ||||
| -                      struct sss_domain_info *domain,
 | ||||
| -                      struct sdap_access_ctx *access_ctx,
 | ||||
| -                      struct sdap_id_conn_ctx *conn,
 | ||||
| -                      const char *username,
 | ||||
| -                      struct ldb_message *user_entry)
 | ||||
| +sdap_access_ppolicy_send(TALLOC_CTX *mem_ctx,
 | ||||
| +                         struct tevent_context *ev,
 | ||||
| +                         struct be_ctx *be_ctx,
 | ||||
| +                         struct sss_domain_info *domain,
 | ||||
| +                         struct sdap_access_ctx *access_ctx,
 | ||||
| +                         struct sdap_id_conn_ctx *conn,
 | ||||
| +                         const char *username,
 | ||||
| +                         struct ldb_message *user_entry,
 | ||||
| +                         enum sdap_pwpolicy_mode pwpol_mode)
 | ||||
|  { | ||||
| -    struct sdap_access_lock_req_ctx *state;
 | ||||
| +    struct sdap_access_ppolicy_req_ctx *state;
 | ||||
|      struct tevent_req *req; | ||||
|      errno_t ret; | ||||
|   | ||||
|      req = tevent_req_create(mem_ctx, | ||||
| -                            &state, struct sdap_access_lock_req_ctx);
 | ||||
| +                            &state, struct sdap_access_ppolicy_req_ctx);
 | ||||
|      if (req == NULL) { | ||||
|          return NULL; | ||||
|      } | ||||
| @@ -1306,9 +1336,10 @@ sdap_access_lock_send(TALLOC_CTX *mem_ctx,
 | ||||
|      state->access_ctx = access_ctx; | ||||
|      state->domain = domain; | ||||
|      state->ppolicy_dns_index = 0; | ||||
| +    state->pwpol_mode = pwpol_mode;
 | ||||
|   | ||||
|      DEBUG(SSSDBG_TRACE_FUNC, | ||||
| -          "Performing access lock check for user [%s]\n", username);
 | ||||
| +          "Performing access ppolicy check for user [%s]\n", username);
 | ||||
|   | ||||
|      state->cached_access = ldb_msg_find_attr_as_bool( | ||||
|          user_entry, SYSDB_LDAP_ACCESS_CACHED_LOCKOUT, false); | ||||
| @@ -1326,7 +1357,7 @@ sdap_access_lock_send(TALLOC_CTX *mem_ctx,
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    DEBUG(SSSDBG_TRACE_FUNC, "Checking lock against LDAP\n");
 | ||||
| +    DEBUG(SSSDBG_TRACE_FUNC, "Checking ppolicy against LDAP\n");
 | ||||
|   | ||||
|      state->sdap_op = sdap_id_op_create(state, | ||||
|                                         state->conn->conn_cache); | ||||
| @@ -1336,7 +1367,7 @@ sdap_access_lock_send(TALLOC_CTX *mem_ctx,
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    ret = sdap_access_lock_retry(req);
 | ||||
| +    ret = sdap_access_ppolicy_retry(req);
 | ||||
|      if (ret != EOK) { | ||||
|          goto done; | ||||
|      } | ||||
| @@ -1353,21 +1384,22 @@ done:
 | ||||
|      return req; | ||||
|  } | ||||
|   | ||||
| -static int sdap_access_lock_retry(struct tevent_req *req)
 | ||||
| +static int sdap_access_ppolicy_retry(struct tevent_req *req)
 | ||||
|  { | ||||
| -    struct sdap_access_lock_req_ctx *state;
 | ||||
| +    struct sdap_access_ppolicy_req_ctx *state;
 | ||||
|      struct tevent_req *subreq; | ||||
|      int ret; | ||||
|   | ||||
| -    state = tevent_req_data(req, struct sdap_access_lock_req_ctx);
 | ||||
| +    state = tevent_req_data(req, struct sdap_access_ppolicy_req_ctx);
 | ||||
|      subreq = sdap_id_op_connect_send(state->sdap_op, state, &ret); | ||||
|      if (!subreq) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, | ||||
| -              "sdap_id_op_connect_send failed: %d (%s)\n", ret, strerror(ret));
 | ||||
| +              "sdap_id_op_connect_send failed: %d (%s)\n",
 | ||||
| +              ret, sss_strerror(ret));
 | ||||
|          return ret; | ||||
|      } | ||||
|   | ||||
| -    tevent_req_set_callback(subreq, sdap_access_lock_connect_done, req);
 | ||||
| +    tevent_req_set_callback(subreq, sdap_access_ppolicy_connect_done, req);
 | ||||
|      return EOK; | ||||
|  } | ||||
|   | ||||
| @@ -1394,15 +1426,15 @@ get_default_ppolicy_dns(TALLOC_CTX *mem_ctx, struct sdap_domain *sdom)
 | ||||
|      return ppolicy_dns; | ||||
|  } | ||||
|   | ||||
| -static void sdap_access_lock_connect_done(struct tevent_req *subreq)
 | ||||
| +static void sdap_access_ppolicy_connect_done(struct tevent_req *subreq)
 | ||||
|  { | ||||
|      struct tevent_req *req; | ||||
| -    struct sdap_access_lock_req_ctx *state;
 | ||||
| +    struct sdap_access_ppolicy_req_ctx *state;
 | ||||
|      int ret, dp_error; | ||||
|      const char *ppolicy_dn; | ||||
|   | ||||
|      req = tevent_req_callback_data(subreq, struct tevent_req); | ||||
| -    state = tevent_req_data(req, struct sdap_access_lock_req_ctx);
 | ||||
| +    state = tevent_req_data(req, struct sdap_access_ppolicy_req_ctx);
 | ||||
|   | ||||
|      ret = sdap_id_op_connect_recv(subreq, &dp_error); | ||||
|      talloc_zfree(subreq); | ||||
| @@ -1428,7 +1460,7 @@ static void sdap_access_lock_connect_done(struct tevent_req *subreq)
 | ||||
|          state->ppolicy_dns = talloc_array(state, const char*, 2); | ||||
|          if (state->ppolicy_dns == NULL) { | ||||
|              DEBUG(SSSDBG_CRIT_FAILURE, "Could not allocate ppolicy_dns.\n"); | ||||
| -            tevent_req_error(req, ERR_ACCESS_DENIED);
 | ||||
| +            tevent_req_error(req, ERR_INTERNAL);
 | ||||
|              return; | ||||
|          } | ||||
|   | ||||
| @@ -1442,7 +1474,7 @@ static void sdap_access_lock_connect_done(struct tevent_req *subreq)
 | ||||
|   | ||||
|          state->ppolicy_dns = get_default_ppolicy_dns(state, state->opts->sdom); | ||||
|          if (state->ppolicy_dns == NULL) { | ||||
| -            tevent_req_error(req, ERR_ACCESS_DENIED);
 | ||||
| +            tevent_req_error(req, ERR_INTERNAL);
 | ||||
|              return; | ||||
|          } | ||||
|      } | ||||
| @@ -1450,28 +1482,33 @@ static void sdap_access_lock_connect_done(struct tevent_req *subreq)
 | ||||
|      /* Connection to LDAP succeeded | ||||
|       * Send 'pwdLockout' request | ||||
|       */ | ||||
| -    ret = sdap_access_lock_get_lockout_step(req);
 | ||||
| +    ret = sdap_access_ppolicy_get_lockout_step(req);
 | ||||
|      if (ret != EOK && ret != EAGAIN) { | ||||
|          DEBUG(SSSDBG_CRIT_FAILURE, | ||||
| -              "sdap_access_lock_get_lockout_step failed: [%d][%s]\n",
 | ||||
| -              ret, strerror(ret));
 | ||||
| -        tevent_req_error(req, ERR_ACCESS_DENIED);
 | ||||
| +              "sdap_access_ppolicy_get_lockout_step failed: [%d][%s]\n",
 | ||||
| +              ret, sss_strerror(ret));
 | ||||
| +        tevent_req_error(req, ERR_INTERNAL);
 | ||||
|          return; | ||||
|      } | ||||
| +
 | ||||
| +    if (ret == EOK) {
 | ||||
| +        tevent_req_done(req);
 | ||||
| +    }
 | ||||
|  } | ||||
|   | ||||
|  static errno_t | ||||
| -sdap_access_lock_get_lockout_step(struct tevent_req *req)
 | ||||
| +sdap_access_ppolicy_get_lockout_step(struct tevent_req *req)
 | ||||
|  { | ||||
|      const char *attrs[] = { SYSDB_LDAP_ACCESS_LOCKOUT, NULL }; | ||||
| -    struct sdap_access_lock_req_ctx *state;
 | ||||
| +    struct sdap_access_ppolicy_req_ctx *state;
 | ||||
|      struct tevent_req *subreq; | ||||
|      errno_t ret; | ||||
|   | ||||
| -    state = tevent_req_data(req, struct sdap_access_lock_req_ctx);
 | ||||
| +    state = tevent_req_data(req, struct sdap_access_ppolicy_req_ctx);
 | ||||
|   | ||||
|      /* no more DNs to try */ | ||||
|      if (state->ppolicy_dns[state->ppolicy_dns_index] == NULL) { | ||||
| +        DEBUG(SSSDBG_TRACE_FUNC, "No more DNs to try.\n");
 | ||||
|          ret = EOK; | ||||
|          goto done; | ||||
|      } | ||||
| @@ -1493,14 +1530,13 @@ sdap_access_lock_get_lockout_step(struct tevent_req *req)
 | ||||
|                                     false); | ||||
|      if (subreq == NULL) { | ||||
|          DEBUG(SSSDBG_CRIT_FAILURE, "Could not start LDAP communication\n"); | ||||
| -        tevent_req_error(req, EIO);
 | ||||
|          ret = EIO; | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
|      /* try next basedn */ | ||||
|      state->ppolicy_dns_index++; | ||||
| -    tevent_req_set_callback(subreq, sdap_access_lock_get_lockout_done, req);
 | ||||
| +    tevent_req_set_callback(subreq, sdap_access_ppolicy_get_lockout_done, req);
 | ||||
|   | ||||
|      ret = EAGAIN; | ||||
|   | ||||
| @@ -1508,17 +1544,17 @@ done:
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| -static void sdap_access_lock_get_lockout_done(struct tevent_req *subreq)
 | ||||
| +static void sdap_access_ppolicy_get_lockout_done(struct tevent_req *subreq)
 | ||||
|  { | ||||
|      int ret, tret, dp_error; | ||||
|      size_t num_results; | ||||
|      bool pwdLockout = false; | ||||
|      struct sysdb_attrs **results; | ||||
|      struct tevent_req *req; | ||||
| -    struct sdap_access_lock_req_ctx *state;
 | ||||
| +    struct sdap_access_ppolicy_req_ctx *state;
 | ||||
|   | ||||
|      req = tevent_req_callback_data(subreq, struct tevent_req); | ||||
| -    state = tevent_req_data(req, struct sdap_access_lock_req_ctx);
 | ||||
| +    state = tevent_req_data(req, struct sdap_access_ppolicy_req_ctx);
 | ||||
|   | ||||
|      ret = sdap_get_generic_recv(subreq, state, &num_results, &results); | ||||
|      talloc_zfree(subreq); | ||||
| @@ -1536,7 +1572,7 @@ static void sdap_access_lock_get_lockout_done(struct tevent_req *subreq)
 | ||||
|      /* Didn't find ppolicy attribute */ | ||||
|      if (num_results < 1) { | ||||
|          /* Try using next $search_base */ | ||||
| -        ret = sdap_access_lock_get_lockout_step(req);
 | ||||
| +        ret = sdap_access_ppolicy_get_lockout_step(req);
 | ||||
|          if (ret == EOK) { | ||||
|              /* No more search bases to try */ | ||||
|              DEBUG(SSSDBG_CONF_SETTINGS, | ||||
| @@ -1545,8 +1581,9 @@ static void sdap_access_lock_get_lockout_done(struct tevent_req *subreq)
 | ||||
|          } else { | ||||
|              if (ret != EAGAIN) { | ||||
|                  DEBUG(SSSDBG_CRIT_FAILURE, | ||||
| -                      "sdap_access_lock_get_lockout_step failed: [%d][%s]\n",
 | ||||
| -                      ret, strerror(ret));
 | ||||
| +                      "sdap_access_ppolicy_get_lockout_step failed: "
 | ||||
| +                      "[%d][%s]\n",
 | ||||
| +                      ret, sss_strerror(ret));
 | ||||
|              } | ||||
|              goto done; | ||||
|          } | ||||
| @@ -1567,7 +1604,7 @@ static void sdap_access_lock_get_lockout_done(struct tevent_req *subreq)
 | ||||
|          if (ret != EOK) { | ||||
|              DEBUG(SSSDBG_MINOR_FAILURE, | ||||
|                    "Error reading %s: [%s]\n", SYSDB_LDAP_ACCESS_LOCKOUT, | ||||
| -                  strerror(ret));
 | ||||
| +                  sss_strerror(ret));
 | ||||
|              ret = ERR_INTERNAL; | ||||
|              goto done; | ||||
|          } | ||||
| @@ -1578,11 +1615,11 @@ static void sdap_access_lock_get_lockout_done(struct tevent_req *subreq)
 | ||||
|                "Password policy is enabled on LDAP server.\n"); | ||||
|   | ||||
|          /* ppolicy is enabled => find out if account is locked */ | ||||
| -        ret = sdap_access_lock_step(req);
 | ||||
| +        ret = sdap_access_ppolicy_step(req);
 | ||||
|          if (ret != EOK && ret != EAGAIN) { | ||||
|              DEBUG(SSSDBG_CRIT_FAILURE, | ||||
| -                  "sdap_access_lock_step failed: [%d][%s].\n",
 | ||||
| -                  ret, strerror(ret));
 | ||||
| +                  "sdap_access_ppolicy_step failed: [%d][%s].\n",
 | ||||
| +                  ret, sss_strerror(ret));
 | ||||
|          } | ||||
|          goto done; | ||||
|      } else { | ||||
| @@ -1623,14 +1660,16 @@ done:
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
| -errno_t sdap_access_lock_step(struct tevent_req *req)
 | ||||
| +errno_t sdap_access_ppolicy_step(struct tevent_req *req)
 | ||||
|  { | ||||
|      errno_t ret; | ||||
|      struct tevent_req *subreq; | ||||
| -    struct sdap_access_lock_req_ctx *state;
 | ||||
| -    const char *attrs[] = { SYSDB_LDAP_ACCESS_LOCKED_TIME, NULL };
 | ||||
| +    struct sdap_access_ppolicy_req_ctx *state;
 | ||||
| +    const char *attrs[] = { SYSDB_LDAP_ACCESS_LOCKED_TIME,
 | ||||
| +                            SYSDB_LDAP_ACESS_LOCKOUT_DURATION,
 | ||||
| +                            NULL };
 | ||||
|   | ||||
| -    state = tevent_req_data(req, struct sdap_access_lock_req_ctx);
 | ||||
| +    state = tevent_req_data(req, struct sdap_access_ppolicy_req_ctx);
 | ||||
|   | ||||
|      subreq = sdap_get_generic_send(state, | ||||
|                                     state->ev, | ||||
| @@ -1645,30 +1684,114 @@ errno_t sdap_access_lock_step(struct tevent_req *req)
 | ||||
|                                     false); | ||||
|   | ||||
|      if (subreq == NULL) { | ||||
| -        DEBUG(SSSDBG_CRIT_FAILURE, "sdap_access_lock_send failed.\n");
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "sdap_access_ppolicy_send failed.\n");
 | ||||
|          ret = ENOMEM; | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    tevent_req_set_callback(subreq, sdap_access_lock_step_done, req);
 | ||||
| +    tevent_req_set_callback(subreq, sdap_access_ppolicy_step_done, req);
 | ||||
|      ret = EAGAIN; | ||||
|   | ||||
|  done: | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| -static void sdap_access_lock_step_done(struct tevent_req *subreq)
 | ||||
| +static errno_t
 | ||||
| +is_account_locked(const char *pwdAccountLockedTime,
 | ||||
| +                  const char *pwdAccountLockedDurationTime,
 | ||||
| +                  enum sdap_pwpolicy_mode pwpol_mode,
 | ||||
| +                  const char *username,
 | ||||
| +                  bool *_locked)
 | ||||
| +{
 | ||||
| +    errno_t ret;
 | ||||
| +    time_t lock_time;
 | ||||
| +    time_t duration;
 | ||||
| +    time_t now;
 | ||||
| +    bool locked;
 | ||||
| +
 | ||||
| +    /* Default action is to consider account to be locked. */
 | ||||
| +    locked = true;
 | ||||
| +
 | ||||
| +    /* account is permanently locked */
 | ||||
| +    if (strcasecmp(pwdAccountLockedTime,
 | ||||
| +                   PERMANENTLY_LOCKED_ACCOUNT) == 0) {
 | ||||
| +        ret = EOK;
 | ||||
| +        goto done;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    switch(pwpol_mode) {
 | ||||
| +    case PWP_LOCKOUT_ONLY:
 | ||||
| +        /* We do *not* care about exact value of account locked time, we
 | ||||
| +         * only *do* care if the value is equal to
 | ||||
| +         * PERMANENTLY_LOCKED_ACCOUNT, which means that account is locked
 | ||||
| +         * permanently.
 | ||||
| +         */
 | ||||
| +        DEBUG(SSSDBG_TRACE_FUNC,
 | ||||
| +              "Account of: %s is beeing blocked by password policy, "
 | ||||
| +              "but value: [%s] value is ignored by SSSD.\n",
 | ||||
| +              username, pwdAccountLockedTime);
 | ||||
| +        locked = false;
 | ||||
| +        break;
 | ||||
| +    case PWP_LOCKOUT_EXPIRE:
 | ||||
| +        /* Account may be locked out from natural reasons (too many attempts,
 | ||||
| +         * expired password). In this case, pwdAccountLockedTime is also set,
 | ||||
| +         * to the time of lock out.
 | ||||
| +         */
 | ||||
| +        ret = sss_utc_to_time_t(pwdAccountLockedTime, "%Y%m%d%H%M%SZ",
 | ||||
| +                                &lock_time);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_TRACE_FUNC, "sss_utc_to_time_t failed with %d:%s.\n",
 | ||||
| +                  ret, sss_strerror(ret));
 | ||||
| +            goto done;
 | ||||
| +        }
 | ||||
| +
 | ||||
| +        now = time(NULL);
 | ||||
| +
 | ||||
| +        /* Account was NOT locked in past. */
 | ||||
| +        if (difftime(lock_time, now) > 0.0) {
 | ||||
| +            locked = false;
 | ||||
| +        } else if (pwdAccountLockedDurationTime != NULL) {
 | ||||
| +            errno = 0;
 | ||||
| +            duration = strtouint32(pwdAccountLockedDurationTime, NULL, 0);
 | ||||
| +            if (errno) {
 | ||||
| +                ret = errno;
 | ||||
| +                goto done;
 | ||||
| +            }
 | ||||
| +            /* Lockout has expired */
 | ||||
| +            if (duration != 0 && difftime(now, lock_time) > duration) {
 | ||||
| +                locked = false;
 | ||||
| +            }
 | ||||
| +        }
 | ||||
| +        break;
 | ||||
| +    case PWP_SENTINEL:
 | ||||
| +    default:
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +              "Unexpected value of password policy mode: %d.\n", pwpol_mode);
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = EOK;
 | ||||
| +
 | ||||
| +done:
 | ||||
| +    if (ret == EOK) {
 | ||||
| +        *_locked = locked;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void sdap_access_ppolicy_step_done(struct tevent_req *subreq)
 | ||||
|  { | ||||
|      int ret, tret, dp_error; | ||||
|      size_t num_results; | ||||
|      bool locked = false; | ||||
|      const char *pwdAccountLockedTime; | ||||
| +    const char *pwdAccountLockedDurationTime;
 | ||||
|      struct sysdb_attrs **results; | ||||
|      struct tevent_req *req; | ||||
| -    struct sdap_access_lock_req_ctx *state;
 | ||||
| +    struct sdap_access_ppolicy_req_ctx *state;
 | ||||
|   | ||||
|      req = tevent_req_callback_data(subreq, struct tevent_req); | ||||
| -    state = tevent_req_data(req, struct sdap_access_lock_req_ctx);
 | ||||
| +    state = tevent_req_data(req, struct sdap_access_ppolicy_req_ctx);
 | ||||
|   | ||||
|      ret = sdap_get_generic_recv(subreq, state, &num_results, &results); | ||||
|      talloc_zfree(subreq); | ||||
| @@ -1677,7 +1800,7 @@ static void sdap_access_lock_step_done(struct tevent_req *subreq)
 | ||||
|      if (ret != EOK) { | ||||
|          if (dp_error == DP_ERR_OK) { | ||||
|              /* retry */ | ||||
| -            tret = sdap_access_lock_retry(req);
 | ||||
| +            tret = sdap_access_ppolicy_retry(req);
 | ||||
|              if (tret == EOK) { | ||||
|                  return; | ||||
|              } | ||||
| @@ -1700,7 +1823,7 @@ static void sdap_access_lock_step_done(struct tevent_req *subreq)
 | ||||
|      if (num_results < 1) { | ||||
|          DEBUG(SSSDBG_CONF_SETTINGS, | ||||
|                "User [%s] was not found with the specified filter. " | ||||
| -                  "Denying access.\n", state->username);
 | ||||
| +              "Denying access.\n", state->username);
 | ||||
|      } else if (results == NULL) { | ||||
|          DEBUG(SSSDBG_CRIT_FAILURE, "num_results > 0, but results is NULL\n"); | ||||
|          ret = ERR_INTERNAL; | ||||
| @@ -1713,22 +1836,35 @@ static void sdap_access_lock_step_done(struct tevent_req *subreq)
 | ||||
|          ret = ERR_INTERNAL; | ||||
|          goto done; | ||||
|      } else { /* Ok, we got a single reply */ | ||||
| +        ret = sysdb_attrs_get_string(results[0], SYSDB_LDAP_ACESS_LOCKOUT_DURATION,
 | ||||
| +                                     &pwdAccountLockedDurationTime);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            /* This attribute might not be set even if account is locked */
 | ||||
| +            pwdAccountLockedDurationTime = NULL;
 | ||||
| +        }
 | ||||
| +
 | ||||
|          ret = sysdb_attrs_get_string(results[0], SYSDB_LDAP_ACCESS_LOCKED_TIME, | ||||
|                                       &pwdAccountLockedTime); | ||||
|          if (ret == EOK) { | ||||
| -            /* We do *not* care about exact value of account locked time, we
 | ||||
| -             * only *do* care if the value is equal to
 | ||||
| -             * PERMANENTLY_LOCKED_ACCOUNT, which means that account is locked
 | ||||
| -             * permanently.
 | ||||
| -             */
 | ||||
| -            if (strcasecmp(pwdAccountLockedTime,
 | ||||
| -                           PERMANENTLY_LOCKED_ACCOUNT) == 0) {
 | ||||
| +
 | ||||
| +            ret = is_account_locked(pwdAccountLockedTime,
 | ||||
| +                                    pwdAccountLockedDurationTime,
 | ||||
| +                                    state->pwpol_mode,
 | ||||
| +                                    state->username,
 | ||||
| +                                    &locked);
 | ||||
| +            if (ret != EOK) {
 | ||||
| +                if (ret == ERR_TIMESPEC_NOT_SUPPORTED) {
 | ||||
| +                    DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +                          "timezone specifier in ppolicy is not supported\n");
 | ||||
| +                } else {
 | ||||
| +                    DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +                          "is_account_locked failed: %d:[%s].\n",
 | ||||
| +                          ret, sss_strerror(ret));
 | ||||
| +                }
 | ||||
| +
 | ||||
| +                DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +                      "Account will be considered to be locked.\n");
 | ||||
|                  locked = true; | ||||
| -            } else {
 | ||||
| -                DEBUG(SSSDBG_TRACE_FUNC,
 | ||||
| -                      "Account of: %s is beeing blocked by password policy, "
 | ||||
| -                      "but value: [%s] value is ignored by SSSD.\n",
 | ||||
| -                      state->username, pwdAccountLockedTime);
 | ||||
|              } | ||||
|          } else { | ||||
|              /* Attribute SYSDB_LDAP_ACCESS_LOCKED_TIME in not be present unless | ||||
| @@ -1774,7 +1910,7 @@ done:
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
| -static errno_t sdap_access_lock_recv(struct tevent_req *req)
 | ||||
| +static errno_t sdap_access_ppolicy_recv(struct tevent_req *req)
 | ||||
|  { | ||||
|      TEVENT_REQ_RETURN_ON_ERROR(req); | ||||
|   | ||||
| diff --git a/src/providers/ldap/sdap_access.h b/src/providers/ldap/sdap_access.h
 | ||||
| index a8c6639109bd7e6dcb325a5e8d080f743ec56d97..6e637be5653a71415b917d115a61eaa0b6ccea9a 100644
 | ||||
| --- a/src/providers/ldap/sdap_access.h
 | ||||
| +++ b/src/providers/ldap/sdap_access.h
 | ||||
| @@ -35,6 +35,7 @@
 | ||||
|  #define SYSDB_LDAP_ACCESS_CACHED_LOCKOUT "ldap_access_lockout_allow" | ||||
|  /* names of ppolicy attributes */ | ||||
|  #define SYSDB_LDAP_ACCESS_LOCKED_TIME "pwdAccountLockedTime" | ||||
| +#define SYSDB_LDAP_ACESS_LOCKOUT_DURATION "pwdLockoutDuration"
 | ||||
|  #define SYSDB_LDAP_ACCESS_LOCKOUT "pwdLockout" | ||||
|   | ||||
|  #define LDAP_ACCESS_FILTER_NAME "filter" | ||||
| @@ -45,6 +46,7 @@
 | ||||
|  #define LDAP_ACCESS_SERVICE_NAME "authorized_service" | ||||
|  #define LDAP_ACCESS_HOST_NAME "host" | ||||
|  #define LDAP_ACCESS_LOCK_NAME "lockout" | ||||
| +#define LDAP_ACCESS_PPOLICY_NAME "ppolicy"
 | ||||
|   | ||||
|  #define LDAP_ACCOUNT_EXPIRE_SHADOW "shadow" | ||||
|  #define LDAP_ACCOUNT_EXPIRE_AD "ad" | ||||
| @@ -63,6 +65,7 @@ enum ldap_access_rule {
 | ||||
|      LDAP_ACCESS_EXPIRE_POLICY_REJECT, | ||||
|      LDAP_ACCESS_EXPIRE_POLICY_WARN, | ||||
|      LDAP_ACCESS_EXPIRE_POLICY_RENEW, | ||||
| +    LDAP_ACCESS_PPOLICY,
 | ||||
|      LDAP_ACCESS_LAST | ||||
|  }; | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										32
									
								
								0014-SDAP-fix-minor-neglect-in-is_account_locked.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								0014-SDAP-fix-minor-neglect-in-is_account_locked.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| From 371c5f40199b6389bd3cbfd05654b2213caecfc1 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Fri, 6 Mar 2015 04:38:05 -0500 | ||||
| Subject: [PATCH 14/99] SDAP: fix minor neglect in is_account_locked() | ||||
| 
 | ||||
| It would be better to return explicit error code, although access is | ||||
| still denied and error message printed. | ||||
| 
 | ||||
| Relates: | ||||
| https://fedorahosted.org/sssd/ticket/2534 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| ---
 | ||||
|  src/providers/ldap/sdap_access.c | 2 ++ | ||||
|  1 file changed, 2 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/sdap_access.c b/src/providers/ldap/sdap_access.c
 | ||||
| index 4a45ff419be9a31224e00cf0fb4ea021953bbbc3..0b251121335841b357e55deac608f50e24311285 100644
 | ||||
| --- a/src/providers/ldap/sdap_access.c
 | ||||
| +++ b/src/providers/ldap/sdap_access.c
 | ||||
| @@ -1767,6 +1767,8 @@ is_account_locked(const char *pwdAccountLockedTime,
 | ||||
|      default: | ||||
|          DEBUG(SSSDBG_MINOR_FAILURE, | ||||
|                "Unexpected value of password policy mode: %d.\n", pwpol_mode); | ||||
| +        ret = EINVAL;
 | ||||
| +        goto done;
 | ||||
|      } | ||||
|   | ||||
|      ret = EOK; | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										224
									
								
								0015-be_refresh-refresh-all-domains-in-backend.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								0015-be_refresh-refresh-all-domains-in-backend.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,224 @@ | ||||
| From 20b08bcfd6740316f528ca84d3a69be9a6535945 Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com> | ||||
| Date: Fri, 13 Feb 2015 13:16:04 +0100 | ||||
| Subject: [PATCH 15/99] be_refresh: refresh all domains in backend | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit b0d3164ca2bd842e176268c26935c5ce54f7f76e) | ||||
| ---
 | ||||
|  src/providers/dp_refresh.c        | 82 ++++++++++++++++++++++++--------------- | ||||
|  src/providers/dp_refresh.h        |  1 + | ||||
|  src/providers/ldap/ldap_common.h  |  1 + | ||||
|  src/providers/ldap/sdap_refresh.c | 15 +++++-- | ||||
|  4 files changed, 64 insertions(+), 35 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/dp_refresh.c b/src/providers/dp_refresh.c
 | ||||
| index 817b6213ca47bba3fa34ce28fdcd1621d349b651..bd02d0cd99f9a061109f0c17797c6e018d602dc5 100644
 | ||||
| --- a/src/providers/dp_refresh.c
 | ||||
| +++ b/src/providers/dp_refresh.c
 | ||||
| @@ -117,6 +117,7 @@ typedef errno_t
 | ||||
|   | ||||
|   | ||||
|  struct be_refresh_cb { | ||||
| +    const char *name;
 | ||||
|      bool enabled; | ||||
|      be_refresh_get_values_t get_values; | ||||
|      be_refresh_send_t send_fn; | ||||
| @@ -137,6 +138,7 @@ struct be_refresh_ctx *be_refresh_ctx_init(TALLOC_CTX *mem_ctx)
 | ||||
|          return NULL; | ||||
|      } | ||||
|   | ||||
| +    ctx->callbacks[BE_REFRESH_TYPE_NETGROUPS].name = "netgroups";
 | ||||
|      ctx->callbacks[BE_REFRESH_TYPE_NETGROUPS].get_values \ | ||||
|          = be_refresh_get_netgroups; | ||||
|   | ||||
| @@ -171,6 +173,8 @@ struct be_refresh_state {
 | ||||
|      struct be_ctx *be_ctx; | ||||
|      struct be_refresh_ctx *ctx; | ||||
|      struct be_refresh_cb *cb; | ||||
| +
 | ||||
| +    struct sss_domain_info *domain;
 | ||||
|      enum be_refresh_type index; | ||||
|      time_t period; | ||||
|  }; | ||||
| @@ -197,6 +201,7 @@ struct tevent_req *be_refresh_send(TALLOC_CTX *mem_ctx,
 | ||||
|   | ||||
|      state->ev = ev; | ||||
|      state->be_ctx = be_ctx; | ||||
| +    state->domain = be_ctx->domain;
 | ||||
|      state->period = be_ptask_get_period(be_ptask); | ||||
|      state->ctx = talloc_get_type(pvt, struct be_refresh_ctx); | ||||
|      if (state->ctx == NULL) { | ||||
| @@ -235,47 +240,62 @@ static errno_t be_refresh_step(struct tevent_req *req)
 | ||||
|   | ||||
|      state = tevent_req_data(req, struct be_refresh_state); | ||||
|   | ||||
| -    state->cb = &state->ctx->callbacks[state->index];
 | ||||
| -    while (state->index != BE_REFRESH_TYPE_SENTINEL && !state->cb->enabled) {
 | ||||
| -        state->index++;
 | ||||
| +    while (state->domain != NULL) {
 | ||||
| +        /* find first enabled callback */
 | ||||
|          state->cb = &state->ctx->callbacks[state->index]; | ||||
| -    }
 | ||||
| +        while (state->index != BE_REFRESH_TYPE_SENTINEL && !state->cb->enabled) {
 | ||||
| +            state->index++;
 | ||||
| +            state->cb = &state->ctx->callbacks[state->index];
 | ||||
| +        }
 | ||||
|   | ||||
| -    if (state->index == BE_REFRESH_TYPE_SENTINEL) {
 | ||||
| -        ret = EOK;
 | ||||
| -        goto done;
 | ||||
| -    }
 | ||||
| +        /* if not found than continue with next domain */
 | ||||
| +        if (state->index == BE_REFRESH_TYPE_SENTINEL) {
 | ||||
| +            state->domain = get_next_domain(state->domain, false);
 | ||||
| +            continue;
 | ||||
| +        }
 | ||||
|   | ||||
| -    if (state->cb->get_values == NULL || state->cb->send_fn == NULL
 | ||||
| -        || state->cb->recv_fn == NULL) {
 | ||||
| -        ret = EINVAL;
 | ||||
| -        goto done;
 | ||||
| -    }
 | ||||
| +        if (state->cb->get_values == NULL || state->cb->send_fn == NULL
 | ||||
| +            || state->cb->recv_fn == NULL) {
 | ||||
| +            DEBUG(SSSDBG_CRIT_FAILURE, "Invalid parameters!\n");
 | ||||
| +            ret = ERR_INTERNAL;
 | ||||
| +            goto done;
 | ||||
| +        }
 | ||||
|   | ||||
| -    ret = state->cb->get_values(state, state->be_ctx->domain, state->period,
 | ||||
| -                                &values);
 | ||||
| -    if (ret != EOK) {
 | ||||
| -        DEBUG(SSSDBG_CRIT_FAILURE, "Unable to obtain DN list [%d]: %s\n",
 | ||||
| -                                    ret, sss_strerror(ret));
 | ||||
| -        goto done;
 | ||||
| -    }
 | ||||
| +        ret = state->cb->get_values(state, state->domain, state->period,
 | ||||
| +                                    &values);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_CRIT_FAILURE, "Unable to obtain DN list [%d]: %s\n",
 | ||||
| +                                        ret, sss_strerror(ret));
 | ||||
| +            goto done;
 | ||||
| +        }
 | ||||
|   | ||||
| -    subreq = state->cb->send_fn(state, state->ev, state->be_ctx,
 | ||||
| -                             values, state->cb->pvt);
 | ||||
| -    if (subreq == NULL) {
 | ||||
| -        ret = ENOMEM;
 | ||||
| -        goto done;
 | ||||
| -    }
 | ||||
| +        DEBUG(SSSDBG_TRACE_FUNC, "Refreshing %s in domain %s\n",
 | ||||
| +              state->cb->name, state->domain->name);
 | ||||
| +
 | ||||
| +        subreq = state->cb->send_fn(state, state->ev, state->be_ctx,
 | ||||
| +                                    state->domain, values, state->cb->pvt);
 | ||||
| +        if (subreq == NULL) {
 | ||||
| +            ret = ENOMEM;
 | ||||
| +            goto done;
 | ||||
| +        }
 | ||||
|   | ||||
| -    /* make the list disappear with subreq */
 | ||||
| -    talloc_steal(subreq, values);
 | ||||
| +        /* make the list disappear with subreq */
 | ||||
| +        talloc_steal(subreq, values);
 | ||||
|   | ||||
| -    tevent_req_set_callback(subreq, be_refresh_done, req);
 | ||||
| +        tevent_req_set_callback(subreq, be_refresh_done, req);
 | ||||
| +
 | ||||
| +        state->index++;
 | ||||
| +        ret = EAGAIN;
 | ||||
| +        goto done;
 | ||||
| +    }
 | ||||
|   | ||||
| -    state->index++;
 | ||||
| -    ret = EAGAIN;
 | ||||
| +    ret = EOK;
 | ||||
|   | ||||
|  done: | ||||
| +    if (ret != EOK && ret != EAGAIN) {
 | ||||
| +        talloc_free(values);
 | ||||
| +    }
 | ||||
| +
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| diff --git a/src/providers/dp_refresh.h b/src/providers/dp_refresh.h
 | ||||
| index 0c4d4a08e935b269f53867b0fe9946eabe521a4f..d7c775fff78455cc016a0419ee4b9b00ba8ec3f7 100644
 | ||||
| --- a/src/providers/dp_refresh.h
 | ||||
| +++ b/src/providers/dp_refresh.h
 | ||||
| @@ -36,6 +36,7 @@ typedef struct tevent_req *
 | ||||
|  (*be_refresh_send_t)(TALLOC_CTX *mem_ctx, | ||||
|                       struct tevent_context *ev, | ||||
|                       struct be_ctx *be_ctx, | ||||
| +                     struct sss_domain_info *domain,
 | ||||
|                       char **values, | ||||
|                       void *pvt); | ||||
|   | ||||
| diff --git a/src/providers/ldap/ldap_common.h b/src/providers/ldap/ldap_common.h
 | ||||
| index 889d5b118861e4ea3f51ab8a8ea5c5947e2560b9..c377b7c2a5303c5b1cd53778b17b249b7dd38080 100644
 | ||||
| --- a/src/providers/ldap/ldap_common.h
 | ||||
| +++ b/src/providers/ldap/ldap_common.h
 | ||||
| @@ -327,6 +327,7 @@ sdap_id_ctx_new(TALLOC_CTX *mem_ctx, struct be_ctx *bectx,
 | ||||
|  struct tevent_req *sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx, | ||||
|                                                 struct tevent_context *ev, | ||||
|                                                 struct be_ctx *be_ctx, | ||||
| +                                               struct sss_domain_info *domain,
 | ||||
|                                                 char **names, | ||||
|                                                 void *pvt); | ||||
|   | ||||
| diff --git a/src/providers/ldap/sdap_refresh.c b/src/providers/ldap/sdap_refresh.c
 | ||||
| index fb2dbc781d9faa7e218339aa3ef0424e9bd59d7d..0b9753ee5b5de45c09eec7025f2f70c51d72ecde 100644
 | ||||
| --- a/src/providers/ldap/sdap_refresh.c
 | ||||
| +++ b/src/providers/ldap/sdap_refresh.c
 | ||||
| @@ -27,6 +27,7 @@
 | ||||
|  struct sdap_refresh_netgroups_state { | ||||
|      struct tevent_context *ev; | ||||
|      struct sdap_id_ctx *id_ctx; | ||||
| +    struct sdap_domain *sdom;
 | ||||
|      char **names; | ||||
|      size_t index; | ||||
|  }; | ||||
| @@ -37,6 +38,7 @@ static void sdap_refresh_netgroups_done(struct tevent_req *subreq);
 | ||||
|  struct tevent_req *sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx, | ||||
|                                                 struct tevent_context *ev, | ||||
|                                                 struct be_ctx *be_ctx, | ||||
| +                                               struct sss_domain_info *domain,
 | ||||
|                                                 char **names, | ||||
|                                                 void *pvt) | ||||
|  { | ||||
| @@ -51,13 +53,19 @@ struct tevent_req *sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx,
 | ||||
|          return NULL; | ||||
|      } | ||||
|   | ||||
| +    if (names == NULL) {
 | ||||
| +        ret = EOK;
 | ||||
| +        goto immediately;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      state->ev = ev; | ||||
|      state->id_ctx = talloc_get_type(pvt, struct sdap_id_ctx); | ||||
|      state->names = names; | ||||
|      state->index = 0; | ||||
|   | ||||
| -    if (names == NULL) {
 | ||||
| -        ret = EOK;
 | ||||
| +    state->sdom = sdap_domain_get(state->id_ctx->opts, domain);
 | ||||
| +    if (state->sdom == NULL) {
 | ||||
| +        ret = ERR_DOMAIN_NOT_FOUND;
 | ||||
|          goto immediately; | ||||
|      } | ||||
|   | ||||
| @@ -107,8 +115,7 @@ static errno_t sdap_refresh_netgroups_step(struct tevent_req *req)
 | ||||
|      DEBUG(SSSDBG_TRACE_FUNC, "Issuing refresh of netgroup %s\n", name); | ||||
|   | ||||
|      subreq = ldap_netgroup_get_send(state, state->ev, state->id_ctx, | ||||
| -                                    state->id_ctx->opts->sdom,
 | ||||
| -                                    state->id_ctx->conn,
 | ||||
| +                                    state->sdom, state->id_ctx->conn,
 | ||||
|                                      name, true); | ||||
|      if (subreq == NULL) { | ||||
|          ret = ENOMEM; | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										185
									
								
								0016-sdap_handle_acct_req_send-remove-be_req.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								0016-sdap_handle_acct_req_send-remove-be_req.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,185 @@ | ||||
| From 4d0286e4f7701974f8f7c3ead76a2ab5a93f6ffe Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com> | ||||
| Date: Fri, 13 Feb 2015 13:49:17 +0100 | ||||
| Subject: [PATCH 16/99] sdap_handle_acct_req_send: remove be_req | ||||
| 
 | ||||
| be_req was used only as a talloc context for subreq. This memory context | ||||
| was replace by state of the parent request which is more suitable for | ||||
| tevent coding style. | ||||
| 
 | ||||
| This change will allow us to use this function in be_refresh where | ||||
| none be_req is available. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit a849d848d53f305a90613a74c1767a42b250deda) | ||||
| ---
 | ||||
|  src/providers/ad/ad_id.c         |  2 +- | ||||
|  src/providers/ipa/ipa_id.c       |  2 +- | ||||
|  src/providers/ldap/ldap_common.h |  2 +- | ||||
|  src/providers/ldap/ldap_id.c     | 24 ++++++++++-------------- | ||||
|  4 files changed, 13 insertions(+), 17 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ad/ad_id.c b/src/providers/ad/ad_id.c
 | ||||
| index 995a7127795b8fe0839b05d3dcbe56cca531598a..ab3934727085fa94ee5bb09ffe0c62546650c42b 100644
 | ||||
| --- a/src/providers/ad/ad_id.c
 | ||||
| +++ b/src/providers/ad/ad_id.c
 | ||||
| @@ -120,7 +120,7 @@ ad_handle_acct_info_step(struct tevent_req *req)
 | ||||
|          noexist_delete = true; | ||||
|      } | ||||
|   | ||||
| -    subreq = sdap_handle_acct_req_send(state, state->breq,
 | ||||
| +    subreq = sdap_handle_acct_req_send(state, state->ctx->be,
 | ||||
|                                         state->ar, state->ctx, | ||||
|                                         state->sdom, | ||||
|                                         state->conn[state->cindex], | ||||
| diff --git a/src/providers/ipa/ipa_id.c b/src/providers/ipa/ipa_id.c
 | ||||
| index cc6abcf8721e3f05526bf62063f0cbdc7c1c257b..384e39a31022b1ec47c3d1abf19e8630762a5da6 100644
 | ||||
| --- a/src/providers/ipa/ipa_id.c
 | ||||
| +++ b/src/providers/ipa/ipa_id.c
 | ||||
| @@ -744,7 +744,7 @@ static errno_t ipa_id_get_account_info_get_original_step(struct tevent_req *req,
 | ||||
|                                            struct ipa_id_get_account_info_state); | ||||
|      struct tevent_req *subreq; | ||||
|   | ||||
| -    subreq = sdap_handle_acct_req_send(state, state->be_req, ar,
 | ||||
| +    subreq = sdap_handle_acct_req_send(state, state->ctx->be, ar,
 | ||||
|                                         state->ipa_ctx->sdap_id_ctx, | ||||
|                                         state->ipa_ctx->sdap_id_ctx->opts->sdom, | ||||
|                                         state->ipa_ctx->sdap_id_ctx->conn, true); | ||||
| diff --git a/src/providers/ldap/ldap_common.h b/src/providers/ldap/ldap_common.h
 | ||||
| index c377b7c2a5303c5b1cd53778b17b249b7dd38080..f8b4e014223b33da84f436a2be853139059f40e7 100644
 | ||||
| --- a/src/providers/ldap/ldap_common.h
 | ||||
| +++ b/src/providers/ldap/ldap_common.h
 | ||||
| @@ -104,7 +104,7 @@ int sdap_id_setup_tasks(struct be_ctx *be_ctx,
 | ||||
|   | ||||
|  struct tevent_req * | ||||
|  sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx, | ||||
| -                          struct be_req *breq,
 | ||||
| +                          struct be_ctx *be_ctx,
 | ||||
|                            struct be_acct_req *ar, | ||||
|                            struct sdap_id_ctx *id_ctx, | ||||
|                            struct sdap_domain *sdom, | ||||
| diff --git a/src/providers/ldap/ldap_id.c b/src/providers/ldap/ldap_id.c
 | ||||
| index af90fd06154fedd655de525d040ec24dd6ede3cc..6de5b72a8b66cd95b16d25a2c37dc21a57695de3 100644
 | ||||
| --- a/src/providers/ldap/ldap_id.c
 | ||||
| +++ b/src/providers/ldap/ldap_id.c
 | ||||
| @@ -1310,7 +1310,6 @@ void sdap_account_info_handler(struct be_req *breq)
 | ||||
|   | ||||
|  /* A generic LDAP account info handler */ | ||||
|  struct sdap_handle_acct_req_state { | ||||
| -    struct be_req *breq;
 | ||||
|      struct be_acct_req *ar; | ||||
|      const char *err; | ||||
|      int dp_error; | ||||
| @@ -1321,7 +1320,7 @@ static void sdap_handle_acct_req_done(struct tevent_req *subreq);
 | ||||
|   | ||||
|  struct tevent_req * | ||||
|  sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx, | ||||
| -                          struct be_req *breq,
 | ||||
| +                          struct be_ctx *be_ctx,
 | ||||
|                            struct be_acct_req *ar, | ||||
|                            struct sdap_id_ctx *id_ctx, | ||||
|                            struct sdap_domain *sdom, | ||||
| @@ -1330,11 +1329,9 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|  { | ||||
|      struct tevent_req *req; | ||||
|      struct tevent_req *subreq; | ||||
| -    struct be_ctx *be_ctx;
 | ||||
|      struct sdap_handle_acct_req_state *state; | ||||
|      errno_t ret; | ||||
|   | ||||
| -    be_ctx = be_req_get_be_ctx(breq);
 | ||||
|   | ||||
|      req = tevent_req_create(mem_ctx, &state, | ||||
|                              struct sdap_handle_acct_req_state); | ||||
| @@ -1342,7 +1339,6 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|          ret = ENOMEM; | ||||
|          goto done; | ||||
|      } | ||||
| -    state->breq = breq;
 | ||||
|      state->ar = ar; | ||||
|   | ||||
|      if (ar == NULL) { | ||||
| @@ -1362,7 +1358,7 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              goto done; | ||||
|          } | ||||
|   | ||||
| -        subreq = users_get_send(breq, be_ctx->ev, id_ctx,
 | ||||
| +        subreq = users_get_send(state, be_ctx->ev, id_ctx,
 | ||||
|                                  sdom, conn, | ||||
|                                  ar->filter_value, | ||||
|                                  ar->filter_type, | ||||
| @@ -1382,7 +1378,7 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              goto done; | ||||
|          } | ||||
|   | ||||
| -        subreq = groups_get_send(breq, be_ctx->ev, id_ctx,
 | ||||
| +        subreq = groups_get_send(state, be_ctx->ev, id_ctx,
 | ||||
|                                   sdom, conn, | ||||
|                                   ar->filter_value, | ||||
|                                   ar->filter_type, | ||||
| @@ -1402,7 +1398,7 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              goto done; | ||||
|          } | ||||
|   | ||||
| -        subreq = groups_by_user_send(breq, be_ctx->ev, id_ctx,
 | ||||
| +        subreq = groups_by_user_send(state, be_ctx->ev, id_ctx,
 | ||||
|                                       sdom, conn, | ||||
|                                       ar->filter_value, | ||||
|                                       ar->extra_value, | ||||
| @@ -1416,7 +1412,7 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              goto done; | ||||
|          } | ||||
|   | ||||
| -        subreq = ldap_netgroup_get_send(breq, be_ctx->ev, id_ctx,
 | ||||
| +        subreq = ldap_netgroup_get_send(state, be_ctx->ev, id_ctx,
 | ||||
|                                          sdom, conn, | ||||
|                                          ar->filter_value, | ||||
|                                          noexist_delete); | ||||
| @@ -1439,7 +1435,7 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              goto done; | ||||
|          } | ||||
|   | ||||
| -        subreq = services_get_send(breq, be_ctx->ev, id_ctx,
 | ||||
| +        subreq = services_get_send(state, be_ctx->ev, id_ctx,
 | ||||
|                                     sdom, conn, | ||||
|                                     ar->filter_value, | ||||
|                                     ar->extra_value, | ||||
| @@ -1454,7 +1450,7 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              goto done; | ||||
|          } | ||||
|   | ||||
| -        subreq = get_user_and_group_send(breq, be_ctx->ev, id_ctx,
 | ||||
| +        subreq = get_user_and_group_send(state, be_ctx->ev, id_ctx,
 | ||||
|                                           sdom, conn, | ||||
|                                           ar->filter_value, | ||||
|                                           ar->filter_type, | ||||
| @@ -1469,7 +1465,7 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              goto done; | ||||
|          } | ||||
|   | ||||
| -        subreq = get_user_and_group_send(breq, be_ctx->ev, id_ctx,
 | ||||
| +        subreq = get_user_and_group_send(state, be_ctx->ev, id_ctx,
 | ||||
|                                           sdom, conn, | ||||
|                                           ar->filter_value, | ||||
|                                           ar->filter_type, | ||||
| @@ -1485,7 +1481,7 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              goto done; | ||||
|          } | ||||
|   | ||||
| -        subreq = get_user_and_group_send(breq, be_ctx->ev, id_ctx,
 | ||||
| +        subreq = get_user_and_group_send(state, be_ctx->ev, id_ctx,
 | ||||
|                                           sdom, conn, | ||||
|                                           ar->filter_value, | ||||
|                                           ar->filter_type, | ||||
| @@ -1617,7 +1613,7 @@ void sdap_handle_account_info(struct be_req *breq, struct sdap_id_ctx *ctx,
 | ||||
|                                   EINVAL, "Invalid private data"); | ||||
|      } | ||||
|   | ||||
| -    req = sdap_handle_acct_req_send(breq, breq, ar, ctx,
 | ||||
| +    req = sdap_handle_acct_req_send(breq, ctx->be, ar, ctx,
 | ||||
|                                      ctx->opts->sdom, conn, true); | ||||
|      if (req == NULL) { | ||||
|          return sdap_handler_done(breq, DP_ERR_FATAL, ENOMEM, "Out of memory"); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										224
									
								
								0017-be_refresh-refactor-netgroups-refresh.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								0017-be_refresh-refactor-netgroups-refresh.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,224 @@ | ||||
| From dd9dfa7ddc257b09a73252fffe7cb4d002f5990a Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com> | ||||
| Date: Mon, 16 Feb 2015 13:42:02 +0100 | ||||
| Subject: [PATCH 17/99] be_refresh: refactor netgroups refresh | ||||
| 
 | ||||
| This is a preparation to support other object types without | ||||
| introducing duplicated code. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit ab0eda3622b828df2bfb7850c96d1395f614eb13) | ||||
| ---
 | ||||
|  src/providers/ldap/sdap_refresh.c | 109 +++++++++++++++++++++++++++----------- | ||||
|  1 file changed, 77 insertions(+), 32 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/sdap_refresh.c b/src/providers/ldap/sdap_refresh.c
 | ||||
| index 0b9753ee5b5de45c09eec7025f2f70c51d72ecde..29055359fc7855f6ad84bf55ea334d0932c0a8d1 100644
 | ||||
| --- a/src/providers/ldap/sdap_refresh.c
 | ||||
| +++ b/src/providers/ldap/sdap_refresh.c
 | ||||
| @@ -24,30 +24,34 @@
 | ||||
|  #include "providers/ldap/sdap.h" | ||||
|  #include "providers/ldap/ldap_common.h" | ||||
|   | ||||
| -struct sdap_refresh_netgroups_state {
 | ||||
| +struct sdap_refresh_state {
 | ||||
|      struct tevent_context *ev; | ||||
| +    struct be_ctx *be_ctx;
 | ||||
| +    struct be_acct_req *account_req;
 | ||||
|      struct sdap_id_ctx *id_ctx; | ||||
|      struct sdap_domain *sdom; | ||||
| +    const char *type;
 | ||||
|      char **names; | ||||
|      size_t index; | ||||
|  }; | ||||
|   | ||||
| -static errno_t sdap_refresh_netgroups_step(struct tevent_req *req);
 | ||||
| -static void sdap_refresh_netgroups_done(struct tevent_req *subreq);
 | ||||
| +static errno_t sdap_refresh_step(struct tevent_req *req);
 | ||||
| +static void sdap_refresh_done(struct tevent_req *subreq);
 | ||||
|   | ||||
| -struct tevent_req *sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx,
 | ||||
| -                                               struct tevent_context *ev,
 | ||||
| -                                               struct be_ctx *be_ctx,
 | ||||
| -                                               struct sss_domain_info *domain,
 | ||||
| -                                               char **names,
 | ||||
| -                                               void *pvt)
 | ||||
| +static struct tevent_req *sdap_refresh_send(TALLOC_CTX *mem_ctx,
 | ||||
| +                                            struct tevent_context *ev,
 | ||||
| +                                            struct be_ctx *be_ctx,
 | ||||
| +                                            struct sss_domain_info *domain,
 | ||||
| +                                            int entry_type,
 | ||||
| +                                            char **names,
 | ||||
| +                                            void *pvt)
 | ||||
|  { | ||||
| -    struct sdap_refresh_netgroups_state *state = NULL;
 | ||||
| +    struct sdap_refresh_state *state = NULL;
 | ||||
|      struct tevent_req *req = NULL; | ||||
|      errno_t ret; | ||||
|   | ||||
|      req = tevent_req_create(mem_ctx, &state, | ||||
| -                            struct sdap_refresh_netgroups_state);
 | ||||
| +                            struct sdap_refresh_state);
 | ||||
|      if (req == NULL) { | ||||
|          DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n"); | ||||
|          return NULL; | ||||
| @@ -59,6 +63,7 @@ struct tevent_req *sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      state->ev = ev; | ||||
| +    state->be_ctx = be_ctx;
 | ||||
|      state->id_ctx = talloc_get_type(pvt, struct sdap_id_ctx); | ||||
|      state->names = names; | ||||
|      state->index = 0; | ||||
| @@ -69,13 +74,34 @@ struct tevent_req *sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx,
 | ||||
|          goto immediately; | ||||
|      } | ||||
|   | ||||
| -    ret = sdap_refresh_netgroups_step(req);
 | ||||
| +    switch (entry_type) {
 | ||||
| +    case BE_REQ_NETGROUP:
 | ||||
| +        state->type = "netgroup";
 | ||||
| +        break;
 | ||||
| +    default:
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "Invalid entry type [%d]!\n", entry_type);
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    state->account_req = talloc_zero(state, struct be_acct_req);
 | ||||
| +    if (state->account_req == NULL) {
 | ||||
| +        ret = ENOMEM;
 | ||||
| +        goto immediately;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    state->account_req->entry_type = entry_type;
 | ||||
| +    state->account_req->attr_type = BE_ATTR_CORE;
 | ||||
| +    state->account_req->filter_type = BE_FILTER_NAME;
 | ||||
| +    state->account_req->extra_value = NULL;
 | ||||
| +    state->account_req->domain = domain->name;
 | ||||
| +    /* filter will be filled later */
 | ||||
| +
 | ||||
| +    ret = sdap_refresh_step(req);
 | ||||
|      if (ret == EOK) { | ||||
|          DEBUG(SSSDBG_TRACE_FUNC, "Nothing to refresh\n"); | ||||
|          goto immediately; | ||||
|      } else if (ret != EAGAIN) { | ||||
| -        DEBUG(SSSDBG_CRIT_FAILURE, "sdap_refresh_netgroups_step() failed "
 | ||||
| -                                    "[%d]: %s\n", ret, sss_strerror(ret));
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "sdap_refresh_step() failed "
 | ||||
| +                                   "[%d]: %s\n", ret, sss_strerror(ret));
 | ||||
|          goto immediately; | ||||
|      } | ||||
|   | ||||
| @@ -92,37 +118,37 @@ immediately:
 | ||||
|      return req; | ||||
|  } | ||||
|   | ||||
| -static errno_t sdap_refresh_netgroups_step(struct tevent_req *req)
 | ||||
| +static errno_t sdap_refresh_step(struct tevent_req *req)
 | ||||
|  { | ||||
| -    struct sdap_refresh_netgroups_state *state = NULL;
 | ||||
| +    struct sdap_refresh_state *state = NULL;
 | ||||
|      struct tevent_req *subreq = NULL; | ||||
| -    const char *name = NULL;
 | ||||
|      errno_t ret; | ||||
|   | ||||
| -    state = tevent_req_data(req, struct sdap_refresh_netgroups_state);
 | ||||
| +    state = tevent_req_data(req, struct sdap_refresh_state);
 | ||||
|   | ||||
|      if (state->names == NULL) { | ||||
|          ret = EOK; | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    name = state->names[state->index];
 | ||||
| -    if (name == NULL) {
 | ||||
| +    state->account_req->filter_value = state->names[state->index];
 | ||||
| +    if (state->account_req->filter_value == NULL) {
 | ||||
|          ret = EOK; | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    DEBUG(SSSDBG_TRACE_FUNC, "Issuing refresh of netgroup %s\n", name);
 | ||||
| +    DEBUG(SSSDBG_TRACE_FUNC, "Issuing refresh of %s %s\n",
 | ||||
| +          state->type, state->account_req->filter_value);
 | ||||
|   | ||||
| -    subreq = ldap_netgroup_get_send(state, state->ev, state->id_ctx,
 | ||||
| -                                    state->sdom, state->id_ctx->conn,
 | ||||
| -                                    name, true);
 | ||||
| +    subreq = sdap_handle_acct_req_send(state, state->be_ctx,
 | ||||
| +                                       state->account_req, state->id_ctx,
 | ||||
| +                                       state->sdom, state->id_ctx->conn, true);
 | ||||
|      if (subreq == NULL) { | ||||
|          ret = ENOMEM; | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    tevent_req_set_callback(subreq, sdap_refresh_netgroups_done, req);
 | ||||
| +    tevent_req_set_callback(subreq, sdap_refresh_done, req);
 | ||||
|   | ||||
|      state->index++; | ||||
|      ret = EAGAIN; | ||||
| @@ -131,25 +157,28 @@ done:
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| -static void sdap_refresh_netgroups_done(struct tevent_req *subreq)
 | ||||
| +static void sdap_refresh_done(struct tevent_req *subreq)
 | ||||
|  { | ||||
| +    struct sdap_refresh_state *state = NULL;
 | ||||
|      struct tevent_req *req = NULL; | ||||
| +    const char *err_msg = NULL;
 | ||||
|      errno_t dp_error; | ||||
|      int sdap_ret; | ||||
|      errno_t ret; | ||||
|   | ||||
|      req = tevent_req_callback_data(subreq, struct tevent_req); | ||||
| +    state = tevent_req_data(req, struct sdap_refresh_state);
 | ||||
|   | ||||
| -    ret = ldap_netgroup_get_recv(subreq, &dp_error, &sdap_ret);
 | ||||
| +    ret = sdap_handle_acct_req_recv(subreq, &dp_error, &err_msg, &sdap_ret);
 | ||||
|      talloc_zfree(subreq); | ||||
|      if (ret != EOK) { | ||||
| -        DEBUG(SSSDBG_CRIT_FAILURE, "Unable to refresh netgroup [dp_error: %d, "
 | ||||
| -              "sdap_ret: %d, errno: %d]: %s\n",
 | ||||
| -              dp_error, sdap_ret, ret, sss_strerror(ret));
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "Unable to refresh %s [dp_error: %d, "
 | ||||
| +              "sdap_ret: %d, errno: %d]: %s\n", state->type,
 | ||||
| +              dp_error, sdap_ret, ret, err_msg);
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    ret = sdap_refresh_netgroups_step(req);
 | ||||
| +    ret = sdap_refresh_step(req);
 | ||||
|      if (ret == EAGAIN) { | ||||
|          return; | ||||
|      } | ||||
| @@ -163,9 +192,25 @@ done:
 | ||||
|      tevent_req_done(req); | ||||
|  } | ||||
|   | ||||
| -errno_t sdap_refresh_netgroups_recv(struct tevent_req *req)
 | ||||
| +static errno_t sdap_refresh_recv(struct tevent_req *req)
 | ||||
|  { | ||||
|      TEVENT_REQ_RETURN_ON_ERROR(req); | ||||
|   | ||||
|      return EOK; | ||||
|  } | ||||
| +
 | ||||
| +struct tevent_req *sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx,
 | ||||
| +                                               struct tevent_context *ev,
 | ||||
| +                                               struct be_ctx *be_ctx,
 | ||||
| +                                               struct sss_domain_info *domain,
 | ||||
| +                                               char **names,
 | ||||
| +                                               void *pvt)
 | ||||
| +{
 | ||||
| +    return sdap_refresh_send(mem_ctx, ev, be_ctx, domain,
 | ||||
| +                             BE_REQ_NETGROUP, names, pvt);
 | ||||
| +}
 | ||||
| +
 | ||||
| +errno_t sdap_refresh_netgroups_recv(struct tevent_req *req)
 | ||||
| +{
 | ||||
| +    return sdap_refresh_recv(req);
 | ||||
| +}
 | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										143
									
								
								0018-be_refresh-add-sdap_refresh_init.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								0018-be_refresh-add-sdap_refresh_init.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,143 @@ | ||||
| From 4c714a37865979f03c56d82d5984558a63c392da Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com> | ||||
| Date: Thu, 19 Feb 2015 12:04:09 +0100 | ||||
| Subject: [PATCH 18/99] be_refresh: add sdap_refresh_init | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 17531a398cc9084036cb08d69fe876a8f12707bb) | ||||
| ---
 | ||||
|  src/providers/ad/ad_init.c        |  7 ++----- | ||||
|  src/providers/ipa/ipa_init.c      |  7 ++----- | ||||
|  src/providers/ldap/ldap_common.h  | 10 ++-------- | ||||
|  src/providers/ldap/ldap_init.c    |  7 ++----- | ||||
|  src/providers/ldap/sdap_refresh.c | 32 +++++++++++++++++++++++++------- | ||||
|  5 files changed, 33 insertions(+), 30 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ad/ad_init.c b/src/providers/ad/ad_init.c
 | ||||
| index 2636b1aba6f005325416e2500b0fd9fb24081260..3d12f382c613883a8f88442c7b1602470deb105d 100644
 | ||||
| --- a/src/providers/ad/ad_init.c
 | ||||
| +++ b/src/providers/ad/ad_init.c
 | ||||
| @@ -260,12 +260,9 @@ sssm_ad_id_init(struct be_ctx *bectx,
 | ||||
|      } | ||||
|   | ||||
|      /* setup periodical refresh of expired records */ | ||||
| -    ret = be_refresh_add_cb(bectx->refresh_ctx, BE_REFRESH_TYPE_NETGROUPS,
 | ||||
| -                            sdap_refresh_netgroups_send,
 | ||||
| -                            sdap_refresh_netgroups_recv,
 | ||||
| -                            ad_ctx->sdap_id_ctx);
 | ||||
| +    ret = sdap_refresh_init(bectx->refresh_ctx, ad_ctx->sdap_id_ctx);
 | ||||
|      if (ret != EOK && ret != EEXIST) { | ||||
| -        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of netgroups "
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh "
 | ||||
|                "will not work [%d]: %s\n", ret, strerror(ret)); | ||||
|      } | ||||
|   | ||||
| diff --git a/src/providers/ipa/ipa_init.c b/src/providers/ipa/ipa_init.c
 | ||||
| index 160d15cac42a1c1083722d656d369442e6ee4dd8..4b26e8baad4d0592729aec9a0b188ae89973fa98 100644
 | ||||
| --- a/src/providers/ipa/ipa_init.c
 | ||||
| +++ b/src/providers/ipa/ipa_init.c
 | ||||
| @@ -354,12 +354,9 @@ int sssm_ipa_id_init(struct be_ctx *bectx,
 | ||||
|      } | ||||
|   | ||||
|      /* setup periodical refresh of expired records */ | ||||
| -    ret = be_refresh_add_cb(bectx->refresh_ctx, BE_REFRESH_TYPE_NETGROUPS,
 | ||||
| -                            sdap_refresh_netgroups_send,
 | ||||
| -                            sdap_refresh_netgroups_recv,
 | ||||
| -                            sdap_ctx);
 | ||||
| +    ret = sdap_refresh_init(bectx->refresh_ctx, sdap_ctx);
 | ||||
|      if (ret != EOK && ret != EEXIST) { | ||||
| -        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of netgroups "
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh "
 | ||||
|                "will not work [%d]: %s\n", ret, strerror(ret)); | ||||
|      } | ||||
|   | ||||
| diff --git a/src/providers/ldap/ldap_common.h b/src/providers/ldap/ldap_common.h
 | ||||
| index f8b4e014223b33da84f436a2be853139059f40e7..bf69489a79e903a98878edb53d372d2242df2b0f 100644
 | ||||
| --- a/src/providers/ldap/ldap_common.h
 | ||||
| +++ b/src/providers/ldap/ldap_common.h
 | ||||
| @@ -324,13 +324,7 @@ struct sdap_id_ctx *
 | ||||
|  sdap_id_ctx_new(TALLOC_CTX *mem_ctx, struct be_ctx *bectx, | ||||
|                  struct sdap_service *sdap_service); | ||||
|   | ||||
| -struct tevent_req *sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx,
 | ||||
| -                                               struct tevent_context *ev,
 | ||||
| -                                               struct be_ctx *be_ctx,
 | ||||
| -                                               struct sss_domain_info *domain,
 | ||||
| -                                               char **names,
 | ||||
| -                                               void *pvt);
 | ||||
| -
 | ||||
| -errno_t sdap_refresh_netgroups_recv(struct tevent_req *req);
 | ||||
| +errno_t sdap_refresh_init(struct be_refresh_ctx *refresh_ctx,
 | ||||
| +                          struct sdap_id_ctx *id_ctx);
 | ||||
|   | ||||
|  #endif /* _LDAP_COMMON_H_ */ | ||||
| diff --git a/src/providers/ldap/ldap_init.c b/src/providers/ldap/ldap_init.c
 | ||||
| index cebd548a4f787c2ddda56a1c5e74a60fa78d83ec..247e20ef766ae595d5c63d3a765a8a7c1912f8d9 100644
 | ||||
| --- a/src/providers/ldap/ldap_init.c
 | ||||
| +++ b/src/providers/ldap/ldap_init.c
 | ||||
| @@ -179,12 +179,9 @@ static int ldap_id_init_internal(struct be_ctx *bectx,
 | ||||
|      } | ||||
|   | ||||
|      /* setup periodical refresh of expired records */ | ||||
| -    ret = be_refresh_add_cb(bectx->refresh_ctx, BE_REFRESH_TYPE_NETGROUPS,
 | ||||
| -                            sdap_refresh_netgroups_send,
 | ||||
| -                            sdap_refresh_netgroups_recv,
 | ||||
| -                            ctx);
 | ||||
| +    ret = sdap_refresh_init(bectx->refresh_ctx, ctx);
 | ||||
|      if (ret != EOK && ret != EEXIST) { | ||||
| -        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of netgroups "
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh "
 | ||||
|                "will not work [%d]: %s\n", ret, strerror(ret)); | ||||
|      } | ||||
|   | ||||
| diff --git a/src/providers/ldap/sdap_refresh.c b/src/providers/ldap/sdap_refresh.c
 | ||||
| index 29055359fc7855f6ad84bf55ea334d0932c0a8d1..e300e28b68aa87957a607259b6439ceca0796e7e 100644
 | ||||
| --- a/src/providers/ldap/sdap_refresh.c
 | ||||
| +++ b/src/providers/ldap/sdap_refresh.c
 | ||||
| @@ -199,18 +199,36 @@ static errno_t sdap_refresh_recv(struct tevent_req *req)
 | ||||
|      return EOK; | ||||
|  } | ||||
|   | ||||
| -struct tevent_req *sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx,
 | ||||
| -                                               struct tevent_context *ev,
 | ||||
| -                                               struct be_ctx *be_ctx,
 | ||||
| -                                               struct sss_domain_info *domain,
 | ||||
| -                                               char **names,
 | ||||
| -                                               void *pvt)
 | ||||
| +static struct tevent_req *
 | ||||
| +sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx,
 | ||||
| +                            struct tevent_context *ev,
 | ||||
| +                            struct be_ctx *be_ctx,
 | ||||
| +                            struct sss_domain_info *domain,
 | ||||
| +                            char **names,
 | ||||
| +                            void *pvt)
 | ||||
|  { | ||||
|      return sdap_refresh_send(mem_ctx, ev, be_ctx, domain, | ||||
|                               BE_REQ_NETGROUP, names, pvt); | ||||
|  } | ||||
|   | ||||
| -errno_t sdap_refresh_netgroups_recv(struct tevent_req *req)
 | ||||
| +static errno_t sdap_refresh_netgroups_recv(struct tevent_req *req)
 | ||||
|  { | ||||
|      return sdap_refresh_recv(req); | ||||
|  } | ||||
| +
 | ||||
| +errno_t sdap_refresh_init(struct be_refresh_ctx *refresh_ctx,
 | ||||
| +                          struct sdap_id_ctx *id_ctx)
 | ||||
| +{
 | ||||
| +    errno_t ret;
 | ||||
| +
 | ||||
| +    ret = be_refresh_add_cb(refresh_ctx, BE_REFRESH_TYPE_NETGROUPS,
 | ||||
| +                            sdap_refresh_netgroups_send,
 | ||||
| +                            sdap_refresh_netgroups_recv,
 | ||||
| +                            id_ctx);
 | ||||
| +    if (ret != EOK && ret != EEXIST) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of netgroups "
 | ||||
| +              "will not work [%d]: %s\n", ret, strerror(ret));
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return ret;
 | ||||
| +}
 | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										159
									
								
								0019-be_refresh-support-users.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								0019-be_refresh-support-users.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,159 @@ | ||||
| From 40f5e40aa0bb9aa6b80b547e9643bebf53f7620a Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com> | ||||
| Date: Thu, 19 Feb 2015 12:00:52 +0100 | ||||
| Subject: [PATCH 19/99] be_refresh: support users | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2346 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit e77d6366ff9e49dbbb607f1709f1ae4190b99489) | ||||
| ---
 | ||||
|  src/db/sysdb.c                    |  7 +++++++ | ||||
|  src/db/sysdb.h                    |  2 ++ | ||||
|  src/providers/dp_refresh.c        | 23 +++++++++++++++++++++++ | ||||
|  src/providers/dp_refresh.h        |  1 + | ||||
|  src/providers/ldap/sdap_refresh.c | 29 +++++++++++++++++++++++++++++ | ||||
|  5 files changed, 62 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/db/sysdb.c b/src/db/sysdb.c
 | ||||
| index 61a2240016b5cb77e6fbbc3286fd1a194c5a0b48..2bb4a41aa4a9e6201ac27ac8d9a1803c1fb5c43e 100644
 | ||||
| --- a/src/db/sysdb.c
 | ||||
| +++ b/src/db/sysdb.c
 | ||||
| @@ -172,6 +172,13 @@ struct ldb_dn *sysdb_user_dn(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom,
 | ||||
|      return dn; | ||||
|  } | ||||
|   | ||||
| +struct ldb_dn *sysdb_user_base_dn(TALLOC_CTX *mem_ctx,
 | ||||
| +                                  struct sss_domain_info *dom)
 | ||||
| +{
 | ||||
| +    return ldb_dn_new_fmt(mem_ctx, dom->sysdb->ldb,
 | ||||
| +                          SYSDB_TMPL_USER_BASE, dom->name);
 | ||||
| +}
 | ||||
| +
 | ||||
|  struct ldb_dn *sysdb_group_dn(TALLOC_CTX *mem_ctx, | ||||
|                                struct sss_domain_info *dom, const char *name) | ||||
|  { | ||||
| diff --git a/src/db/sysdb.h b/src/db/sysdb.h
 | ||||
| index cf6028acb806d5d4eedf4cf0680cf4ac9fd6368d..ce1b45be984b65c61d8c09dee2bdf7f2e461494e 100644
 | ||||
| --- a/src/db/sysdb.h
 | ||||
| +++ b/src/db/sysdb.h
 | ||||
| @@ -383,6 +383,8 @@ errno_t sysdb_get_rdn(struct sysdb_ctx *sysdb, TALLOC_CTX *mem_ctx,
 | ||||
|                        const char *dn, char **_name, char **_val); | ||||
|  struct ldb_dn *sysdb_user_dn(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom, | ||||
|                               const char *name); | ||||
| +struct ldb_dn *sysdb_user_base_dn(TALLOC_CTX *mem_ctx,
 | ||||
| +                                  struct sss_domain_info *dom);
 | ||||
|  struct ldb_dn *sysdb_group_dn(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom, | ||||
|                                const char *name); | ||||
|  struct ldb_dn *sysdb_netgroup_dn(TALLOC_CTX *mem_ctx, | ||||
| diff --git a/src/providers/dp_refresh.c b/src/providers/dp_refresh.c
 | ||||
| index bd02d0cd99f9a061109f0c17797c6e018d602dc5..f599618e074e6c0ef29363f014ec0ec422de3a55 100644
 | ||||
| --- a/src/providers/dp_refresh.c
 | ||||
| +++ b/src/providers/dp_refresh.c
 | ||||
| @@ -89,6 +89,26 @@ done:
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| +static errno_t be_refresh_get_users(TALLOC_CTX *mem_ctx,
 | ||||
| +                                    struct sss_domain_info *domain,
 | ||||
| +                                    time_t period,
 | ||||
| +                                    char ***_values)
 | ||||
| +{
 | ||||
| +    struct ldb_dn *base_dn = NULL;
 | ||||
| +    errno_t ret;
 | ||||
| +
 | ||||
| +    base_dn = sysdb_user_base_dn(mem_ctx, domain);
 | ||||
| +    if (base_dn == NULL) {
 | ||||
| +        return ENOMEM;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = be_refresh_get_values(mem_ctx, domain, period, SYSDB_USER_CLASS,
 | ||||
| +                                base_dn, SYSDB_NAME, _values);
 | ||||
| +
 | ||||
| +    talloc_free(base_dn);
 | ||||
| +    return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static errno_t be_refresh_get_netgroups(TALLOC_CTX *mem_ctx, | ||||
|                                          struct sss_domain_info *domain, | ||||
|                                          time_t period, | ||||
| @@ -138,6 +158,9 @@ struct be_refresh_ctx *be_refresh_ctx_init(TALLOC_CTX *mem_ctx)
 | ||||
|          return NULL; | ||||
|      } | ||||
|   | ||||
| +    ctx->callbacks[BE_REFRESH_TYPE_USERS].name = "users";
 | ||||
| +    ctx->callbacks[BE_REFRESH_TYPE_USERS].get_values = be_refresh_get_users;
 | ||||
| +
 | ||||
|      ctx->callbacks[BE_REFRESH_TYPE_NETGROUPS].name = "netgroups"; | ||||
|      ctx->callbacks[BE_REFRESH_TYPE_NETGROUPS].get_values \ | ||||
|          = be_refresh_get_netgroups; | ||||
| diff --git a/src/providers/dp_refresh.h b/src/providers/dp_refresh.h
 | ||||
| index d7c775fff78455cc016a0419ee4b9b00ba8ec3f7..a0d42734b64e16184a3a2cdfe45057003ddec6cc 100644
 | ||||
| --- a/src/providers/dp_refresh.h
 | ||||
| +++ b/src/providers/dp_refresh.h
 | ||||
| @@ -44,6 +44,7 @@ typedef errno_t
 | ||||
|  (*be_refresh_recv_t)(struct tevent_req *req); | ||||
|   | ||||
|  enum be_refresh_type { | ||||
| +    BE_REFRESH_TYPE_USERS,
 | ||||
|      BE_REFRESH_TYPE_NETGROUPS, | ||||
|      BE_REFRESH_TYPE_SENTINEL | ||||
|  }; | ||||
| diff --git a/src/providers/ldap/sdap_refresh.c b/src/providers/ldap/sdap_refresh.c
 | ||||
| index e300e28b68aa87957a607259b6439ceca0796e7e..8fff9d49297b4efe3f4673003859242dd9192070 100644
 | ||||
| --- a/src/providers/ldap/sdap_refresh.c
 | ||||
| +++ b/src/providers/ldap/sdap_refresh.c
 | ||||
| @@ -75,6 +75,9 @@ static struct tevent_req *sdap_refresh_send(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      switch (entry_type) { | ||||
| +    case BE_REQ_USER:
 | ||||
| +        state->type = "user";
 | ||||
| +        break;
 | ||||
|      case BE_REQ_NETGROUP: | ||||
|          state->type = "netgroup"; | ||||
|          break; | ||||
| @@ -200,6 +203,23 @@ static errno_t sdap_refresh_recv(struct tevent_req *req)
 | ||||
|  } | ||||
|   | ||||
|  static struct tevent_req * | ||||
| +sdap_refresh_users_send(TALLOC_CTX *mem_ctx,
 | ||||
| +                        struct tevent_context *ev,
 | ||||
| +                        struct be_ctx *be_ctx,
 | ||||
| +                        struct sss_domain_info *domain,
 | ||||
| +                        char **names,
 | ||||
| +                        void *pvt)
 | ||||
| +{
 | ||||
| +    return sdap_refresh_send(mem_ctx, ev, be_ctx, domain,
 | ||||
| +                             BE_REQ_USER, names, pvt);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static errno_t sdap_refresh_users_recv(struct tevent_req *req)
 | ||||
| +{
 | ||||
| +    return sdap_refresh_recv(req);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static struct tevent_req *
 | ||||
|  sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx, | ||||
|                              struct tevent_context *ev, | ||||
|                              struct be_ctx *be_ctx, | ||||
| @@ -221,6 +241,15 @@ errno_t sdap_refresh_init(struct be_refresh_ctx *refresh_ctx,
 | ||||
|  { | ||||
|      errno_t ret; | ||||
|   | ||||
| +    ret = be_refresh_add_cb(refresh_ctx, BE_REFRESH_TYPE_USERS,
 | ||||
| +                            sdap_refresh_users_send,
 | ||||
| +                            sdap_refresh_users_recv,
 | ||||
| +                            id_ctx);
 | ||||
| +    if (ret != EOK && ret != EEXIST) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of users "
 | ||||
| +              "will not work [%d]: %s\n", ret, strerror(ret));
 | ||||
| +    }
 | ||||
| +
 | ||||
|      ret = be_refresh_add_cb(refresh_ctx, BE_REFRESH_TYPE_NETGROUPS, | ||||
|                              sdap_refresh_netgroups_send, | ||||
|                              sdap_refresh_netgroups_recv, | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										160
									
								
								0020-be_refresh-support-groups.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								0020-be_refresh-support-groups.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,160 @@ | ||||
| From 0a26dd82639cd3fc80433d19f4bb7363db7975e2 Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com> | ||||
| Date: Thu, 19 Feb 2015 12:10:23 +0100 | ||||
| Subject: [PATCH 20/99] be_refresh: support groups | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2346 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 61c8d13e55ebafc28da1b0b5ad9ae578d687e288) | ||||
| ---
 | ||||
|  src/db/sysdb.c                    |  8 ++++++++ | ||||
|  src/db/sysdb.h                    |  2 ++ | ||||
|  src/providers/dp_refresh.c        | 23 +++++++++++++++++++++++ | ||||
|  src/providers/dp_refresh.h        |  1 + | ||||
|  src/providers/ldap/sdap_refresh.c | 29 +++++++++++++++++++++++++++++ | ||||
|  5 files changed, 63 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/db/sysdb.c b/src/db/sysdb.c
 | ||||
| index 2bb4a41aa4a9e6201ac27ac8d9a1803c1fb5c43e..6be5e8026c6d24c03f133242a62acec759a24780 100644
 | ||||
| --- a/src/db/sysdb.c
 | ||||
| +++ b/src/db/sysdb.c
 | ||||
| @@ -198,6 +198,14 @@ struct ldb_dn *sysdb_group_dn(TALLOC_CTX *mem_ctx,
 | ||||
|      return dn; | ||||
|  } | ||||
|   | ||||
| +struct ldb_dn *sysdb_group_base_dn(TALLOC_CTX *mem_ctx,
 | ||||
| +                                   struct sss_domain_info *dom)
 | ||||
| +{
 | ||||
| +    return ldb_dn_new_fmt(mem_ctx, dom->sysdb->ldb,
 | ||||
| +                          SYSDB_TMPL_GROUP_BASE, dom->name);
 | ||||
| +}
 | ||||
| +
 | ||||
| +
 | ||||
|  struct ldb_dn *sysdb_netgroup_dn(TALLOC_CTX *mem_ctx, | ||||
|                                   struct sss_domain_info *dom, const char *name) | ||||
|  { | ||||
| diff --git a/src/db/sysdb.h b/src/db/sysdb.h
 | ||||
| index ce1b45be984b65c61d8c09dee2bdf7f2e461494e..1362f377837d25815b04b4929a2895ee3a6485a9 100644
 | ||||
| --- a/src/db/sysdb.h
 | ||||
| +++ b/src/db/sysdb.h
 | ||||
| @@ -387,6 +387,8 @@ struct ldb_dn *sysdb_user_base_dn(TALLOC_CTX *mem_ctx,
 | ||||
|                                    struct sss_domain_info *dom); | ||||
|  struct ldb_dn *sysdb_group_dn(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom, | ||||
|                                const char *name); | ||||
| +struct ldb_dn *sysdb_group_base_dn(TALLOC_CTX *mem_ctx,
 | ||||
| +                                   struct sss_domain_info *dom);
 | ||||
|  struct ldb_dn *sysdb_netgroup_dn(TALLOC_CTX *mem_ctx, | ||||
|                                   struct sss_domain_info *dom, const char *name); | ||||
|  struct ldb_dn *sysdb_netgroup_base_dn(TALLOC_CTX *mem_ctx, | ||||
| diff --git a/src/providers/dp_refresh.c b/src/providers/dp_refresh.c
 | ||||
| index f599618e074e6c0ef29363f014ec0ec422de3a55..169ef71edfa4aaf59a199bd1f005f62323e58b87 100644
 | ||||
| --- a/src/providers/dp_refresh.c
 | ||||
| +++ b/src/providers/dp_refresh.c
 | ||||
| @@ -109,6 +109,26 @@ static errno_t be_refresh_get_users(TALLOC_CTX *mem_ctx,
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| +static errno_t be_refresh_get_groups(TALLOC_CTX *mem_ctx,
 | ||||
| +                                     struct sss_domain_info *domain,
 | ||||
| +                                     time_t period,
 | ||||
| +                                     char ***_values)
 | ||||
| +{
 | ||||
| +    struct ldb_dn *base_dn = NULL;
 | ||||
| +    errno_t ret;
 | ||||
| +
 | ||||
| +    base_dn = sysdb_group_base_dn(mem_ctx, domain);
 | ||||
| +    if (base_dn == NULL) {
 | ||||
| +        return ENOMEM;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = be_refresh_get_values(mem_ctx, domain, period, SYSDB_GROUP_CLASS,
 | ||||
| +                                base_dn, SYSDB_NAME, _values);
 | ||||
| +
 | ||||
| +    talloc_free(base_dn);
 | ||||
| +    return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static errno_t be_refresh_get_netgroups(TALLOC_CTX *mem_ctx, | ||||
|                                          struct sss_domain_info *domain, | ||||
|                                          time_t period, | ||||
| @@ -161,6 +181,9 @@ struct be_refresh_ctx *be_refresh_ctx_init(TALLOC_CTX *mem_ctx)
 | ||||
|      ctx->callbacks[BE_REFRESH_TYPE_USERS].name = "users"; | ||||
|      ctx->callbacks[BE_REFRESH_TYPE_USERS].get_values = be_refresh_get_users; | ||||
|   | ||||
| +    ctx->callbacks[BE_REFRESH_TYPE_GROUPS].name = "groups";
 | ||||
| +    ctx->callbacks[BE_REFRESH_TYPE_GROUPS].get_values = be_refresh_get_groups;
 | ||||
| +
 | ||||
|      ctx->callbacks[BE_REFRESH_TYPE_NETGROUPS].name = "netgroups"; | ||||
|      ctx->callbacks[BE_REFRESH_TYPE_NETGROUPS].get_values \ | ||||
|          = be_refresh_get_netgroups; | ||||
| diff --git a/src/providers/dp_refresh.h b/src/providers/dp_refresh.h
 | ||||
| index a0d42734b64e16184a3a2cdfe45057003ddec6cc..89ccfcfb49c4cee18d3fa0f83ce6314a49ee1302 100644
 | ||||
| --- a/src/providers/dp_refresh.h
 | ||||
| +++ b/src/providers/dp_refresh.h
 | ||||
| @@ -45,6 +45,7 @@ typedef errno_t
 | ||||
|   | ||||
|  enum be_refresh_type { | ||||
|      BE_REFRESH_TYPE_USERS, | ||||
| +    BE_REFRESH_TYPE_GROUPS,
 | ||||
|      BE_REFRESH_TYPE_NETGROUPS, | ||||
|      BE_REFRESH_TYPE_SENTINEL | ||||
|  }; | ||||
| diff --git a/src/providers/ldap/sdap_refresh.c b/src/providers/ldap/sdap_refresh.c
 | ||||
| index 8fff9d49297b4efe3f4673003859242dd9192070..bda50aeb3e44510f3afc1a10cb09336a6eec26ec 100644
 | ||||
| --- a/src/providers/ldap/sdap_refresh.c
 | ||||
| +++ b/src/providers/ldap/sdap_refresh.c
 | ||||
| @@ -78,6 +78,9 @@ static struct tevent_req *sdap_refresh_send(TALLOC_CTX *mem_ctx,
 | ||||
|      case BE_REQ_USER: | ||||
|          state->type = "user"; | ||||
|          break; | ||||
| +    case BE_REQ_GROUP:
 | ||||
| +        state->type = "group";
 | ||||
| +        break;
 | ||||
|      case BE_REQ_NETGROUP: | ||||
|          state->type = "netgroup"; | ||||
|          break; | ||||
| @@ -220,6 +223,23 @@ static errno_t sdap_refresh_users_recv(struct tevent_req *req)
 | ||||
|  } | ||||
|   | ||||
|  static struct tevent_req * | ||||
| +sdap_refresh_groups_send(TALLOC_CTX *mem_ctx,
 | ||||
| +                         struct tevent_context *ev,
 | ||||
| +                         struct be_ctx *be_ctx,
 | ||||
| +                         struct sss_domain_info *domain,
 | ||||
| +                         char **names,
 | ||||
| +                         void *pvt)
 | ||||
| +{
 | ||||
| +    return sdap_refresh_send(mem_ctx, ev, be_ctx, domain,
 | ||||
| +                             BE_REQ_GROUP, names, pvt);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static errno_t sdap_refresh_groups_recv(struct tevent_req *req)
 | ||||
| +{
 | ||||
| +    return sdap_refresh_recv(req);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static struct tevent_req *
 | ||||
|  sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx, | ||||
|                              struct tevent_context *ev, | ||||
|                              struct be_ctx *be_ctx, | ||||
| @@ -250,6 +270,15 @@ errno_t sdap_refresh_init(struct be_refresh_ctx *refresh_ctx,
 | ||||
|                "will not work [%d]: %s\n", ret, strerror(ret)); | ||||
|      } | ||||
|   | ||||
| +    ret = be_refresh_add_cb(refresh_ctx, BE_REFRESH_TYPE_GROUPS,
 | ||||
| +                            sdap_refresh_groups_send,
 | ||||
| +                            sdap_refresh_groups_recv,
 | ||||
| +                            id_ctx);
 | ||||
| +    if (ret != EOK && ret != EEXIST) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of groups "
 | ||||
| +              "will not work [%d]: %s\n", ret, strerror(ret));
 | ||||
| +    }
 | ||||
| +
 | ||||
|      ret = be_refresh_add_cb(refresh_ctx, BE_REFRESH_TYPE_NETGROUPS, | ||||
|                              sdap_refresh_netgroups_send, | ||||
|                              sdap_refresh_netgroups_recv, | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										257
									
								
								0021-Log-reason-in-debug-message-why-ldb_modify-failed.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										257
									
								
								0021-Log-reason-in-debug-message-why-ldb_modify-failed.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,257 @@ | ||||
| From 182675e355aa1013f847d47d21a251250962e61f Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Tue, 10 Mar 2015 16:35:03 +0100 | ||||
| Subject: [PATCH 21/99] Log reason in debug message why ldb_modify failed | ||||
| 
 | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit 04d138472cc086fb7961f0d378852b09961b1a33) | ||||
| ---
 | ||||
|  src/confdb/confdb.c     |  6 +++++- | ||||
|  src/db/sysdb.c          |  5 +++++ | ||||
|  src/db/sysdb_gpo.c      |  6 ++++-- | ||||
|  src/db/sysdb_idmap.c    |  4 ++-- | ||||
|  src/db/sysdb_ops.c      | 28 +++++++++++++++++++++++++++- | ||||
|  src/db/sysdb_services.c | 10 ++++++++++ | ||||
|  src/db/sysdb_sudo.c     |  5 +++++ | ||||
|  src/db/sysdb_views.c    | 14 ++++++++++---- | ||||
|  8 files changed, 68 insertions(+), 10 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/confdb/confdb.c b/src/confdb/confdb.c
 | ||||
| index f94de308ec8245b33b4a69af16dd99d17db8db9a..dd93410cfcac3040d5a72329929f99f43fc592f1 100644
 | ||||
| --- a/src/confdb/confdb.c
 | ||||
| +++ b/src/confdb/confdb.c
 | ||||
| @@ -200,6 +200,9 @@ int confdb_add_param(struct confdb_ctx *cdb,
 | ||||
|   | ||||
|          ret = ldb_modify(cdb->ldb, msg); | ||||
|          if (ret != LDB_SUCCESS) { | ||||
| +            DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +                  "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +                  ldb_strerror(ret), ret, ldb_errstring(cdb->ldb));
 | ||||
|              ret = EIO; | ||||
|              goto done; | ||||
|          } | ||||
| @@ -348,7 +351,8 @@ int confdb_set_string(struct confdb_ctx *cdb,
 | ||||
|      lret = ldb_modify(cdb->ldb, msg); | ||||
|      if (lret != LDB_SUCCESS) { | ||||
|          DEBUG(SSSDBG_MINOR_FAILURE, | ||||
| -              "ldb_modify failed: [%s]\n", ldb_strerror(lret));
 | ||||
| +              "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +              ldb_strerror(lret), lret, ldb_errstring(cdb->ldb));
 | ||||
|          ret = EIO; | ||||
|          goto done; | ||||
|      } | ||||
| diff --git a/src/db/sysdb.c b/src/db/sysdb.c
 | ||||
| index 6be5e8026c6d24c03f133242a62acec759a24780..9da655759c0c35d52854b668693195b3360c5f8b 100644
 | ||||
| --- a/src/db/sysdb.c
 | ||||
| +++ b/src/db/sysdb.c
 | ||||
| @@ -1636,6 +1636,11 @@ errno_t sysdb_set_bool(struct sysdb_ctx *sysdb,
 | ||||
|          lret = ldb_add(sysdb->ldb, msg); | ||||
|      } | ||||
|   | ||||
| +    if (lret != LDB_SUCCESS) {
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +              "ldb operation failed: [%s](%d)[%s]\n",
 | ||||
| +              ldb_strerror(lret), lret, ldb_errstring(sysdb->ldb));
 | ||||
| +    }
 | ||||
|      ret = sysdb_error_to_errno(lret); | ||||
|   | ||||
|  done: | ||||
| diff --git a/src/db/sysdb_gpo.c b/src/db/sysdb_gpo.c
 | ||||
| index 2fb9b748d750b92dc990b8175869262b666306db..595051bae44c110210c76de2b583319ac42864a2 100644
 | ||||
| --- a/src/db/sysdb_gpo.c
 | ||||
| +++ b/src/db/sysdb_gpo.c
 | ||||
| @@ -208,7 +208,8 @@ sysdb_gpo_store_gpo(struct sss_domain_info *domain,
 | ||||
|          lret = ldb_modify(domain->sysdb->ldb, update_msg); | ||||
|          if (lret != LDB_SUCCESS) { | ||||
|              DEBUG(SSSDBG_MINOR_FAILURE, | ||||
| -                  "Failed to modify GPO: [%s]\n", ldb_strerror(lret));
 | ||||
| +                  "Failed to modify GPO: [%s](%d)[%s]\n",
 | ||||
| +                  ldb_strerror(lret), lret, ldb_errstring(domain->sysdb->ldb));
 | ||||
|              ret = sysdb_error_to_errno(lret); | ||||
|              goto done; | ||||
|          } | ||||
| @@ -500,7 +501,8 @@ sysdb_gpo_store_gpo_result_setting(struct sss_domain_info *domain,
 | ||||
|          lret = ldb_modify(domain->sysdb->ldb, update_msg); | ||||
|          if (lret != LDB_SUCCESS) { | ||||
|              DEBUG(SSSDBG_MINOR_FAILURE, | ||||
| -                  "Failed to modify GPO Result: [%s]\n", ldb_strerror(lret));
 | ||||
| +                  "Failed to modify GPO Result: [%s](%d)[%s]\n",
 | ||||
| +                  ldb_strerror(lret), lret, ldb_errstring(domain->sysdb->ldb));
 | ||||
|              ret = sysdb_error_to_errno(lret); | ||||
|              goto done; | ||||
|          } | ||||
| diff --git a/src/db/sysdb_idmap.c b/src/db/sysdb_idmap.c
 | ||||
| index 2c3634d1cc86818007700a43dc6b919c9bf7030e..2aa00ef83f182a77b0e9b94ba8a80ef71af6518c 100644
 | ||||
| --- a/src/db/sysdb_idmap.c
 | ||||
| +++ b/src/db/sysdb_idmap.c
 | ||||
| @@ -247,8 +247,8 @@ sysdb_idmap_store_mapping(struct sss_domain_info *domain,
 | ||||
|          lret = ldb_modify(domain->sysdb->ldb, update_msg); | ||||
|          if (lret != LDB_SUCCESS) { | ||||
|              DEBUG(SSSDBG_MINOR_FAILURE, | ||||
| -                  "Failed to update mapping: [%s]\n",
 | ||||
| -                   ldb_strerror(lret));
 | ||||
| +                  "Failed to update mapping: [%s](%d)[%s]\n",
 | ||||
| +                  ldb_strerror(lret), lret, ldb_errstring(domain->sysdb->ldb));
 | ||||
|              ret = sysdb_error_to_errno(lret); | ||||
|              goto done; | ||||
|          } | ||||
| diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
 | ||||
| index 6085762dcc5585114dd3049dd3a365856cb6b190..06d24f220afc28b39f3856f3f0170818e11d9cf9 100644
 | ||||
| --- a/src/db/sysdb_ops.c
 | ||||
| +++ b/src/db/sysdb_ops.c
 | ||||
| @@ -707,7 +707,8 @@ int sysdb_set_entry_attr(struct sysdb_ctx *sysdb,
 | ||||
|      lret = ldb_modify(sysdb->ldb, msg); | ||||
|      if (lret != LDB_SUCCESS) { | ||||
|          DEBUG(SSSDBG_MINOR_FAILURE, | ||||
| -              "ldb_modify failed: [%s]\n", ldb_strerror(lret));
 | ||||
| +              "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +              ldb_strerror(lret), lret, ldb_errstring(sysdb->ldb));
 | ||||
|      } | ||||
|   | ||||
|      ret = sysdb_error_to_errno(lret); | ||||
| @@ -969,6 +970,11 @@ int sysdb_get_new_id(struct sss_domain_info *domain,
 | ||||
|      } | ||||
|   | ||||
|      ret = ldb_modify(domain->sysdb->ldb, msg); | ||||
| +    if (ret != LDB_SUCCESS) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +              "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +              ldb_strerror(ret), ret, ldb_errstring(domain->sysdb->ldb));
 | ||||
| +    }
 | ||||
|      ret = sysdb_error_to_errno(ret); | ||||
|   | ||||
|      *_id = new_id; | ||||
| @@ -1139,6 +1145,12 @@ sysdb_remove_ghost_from_group(struct sss_domain_info *dom,
 | ||||
|   | ||||
|   | ||||
|      ret = sss_ldb_modify_permissive(dom->sysdb->ldb, msg); | ||||
| +    if (ret != LDB_SUCCESS) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +              "sss_ldb_modify_permissive failed: [%s](%d)[%s]\n",
 | ||||
| +              ldb_strerror(ret), ret, ldb_errstring(dom->sysdb->ldb));
 | ||||
| +    }
 | ||||
| +
 | ||||
|      ret = sysdb_error_to_errno(ret); | ||||
|      if (ret != EOK) { | ||||
|          goto done; | ||||
| @@ -1706,6 +1718,11 @@ int sysdb_mod_group_member(struct sss_domain_info *domain,
 | ||||
|      } | ||||
|   | ||||
|      ret = ldb_modify(domain->sysdb->ldb, msg); | ||||
| +    if (ret != LDB_SUCCESS) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +              "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +              ldb_strerror(ret), ret, ldb_errstring(domain->sysdb->ldb));
 | ||||
| +    }
 | ||||
|      ret = sysdb_error_to_errno(ret); | ||||
|   | ||||
|  fail: | ||||
| @@ -2750,6 +2767,12 @@ int sysdb_delete_user(struct sss_domain_info *domain,
 | ||||
|              if (ret) goto fail; | ||||
|   | ||||
|              ret = ldb_modify(domain->sysdb->ldb, msg); | ||||
| +            if (ret != LDB_SUCCESS) {
 | ||||
| +                DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +                      "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +                      ldb_strerror(ret), ret,
 | ||||
| +                      ldb_errstring(domain->sysdb->ldb));
 | ||||
| +            }
 | ||||
|              ret = sysdb_error_to_errno(ret); | ||||
|              if (ret != EOK) { | ||||
|                  goto fail; | ||||
| @@ -3479,6 +3502,9 @@ errno_t sysdb_remove_attrs(struct sss_domain_info *domain,
 | ||||
|           */ | ||||
|          lret = ldb_modify(domain->sysdb->ldb, msg); | ||||
|          if (lret != LDB_SUCCESS && lret != LDB_ERR_NO_SUCH_ATTRIBUTE) { | ||||
| +            DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +                  "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +                  ldb_strerror(lret), lret, ldb_errstring(domain->sysdb->ldb));
 | ||||
|              ret = sysdb_error_to_errno(lret); | ||||
|              goto done; | ||||
|          } | ||||
| diff --git a/src/db/sysdb_services.c b/src/db/sysdb_services.c
 | ||||
| index 5f2315e72735dd4ccc1ecf7962d9cd54b38e4279..37f7ec5ff7e36605acd3b259c1622f1b1086a388 100644
 | ||||
| --- a/src/db/sysdb_services.c
 | ||||
| +++ b/src/db/sysdb_services.c
 | ||||
| @@ -590,6 +590,11 @@ sysdb_svc_update(struct sysdb_ctx *sysdb,
 | ||||
|      } | ||||
|   | ||||
|      lret = ldb_modify(sysdb->ldb, msg); | ||||
| +    if (lret != LDB_SUCCESS) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +              "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +              ldb_strerror(lret), lret, ldb_errstring(sysdb->ldb));
 | ||||
| +    }
 | ||||
|      ret = sysdb_error_to_errno(lret); | ||||
|   | ||||
|  done: | ||||
| @@ -623,6 +628,11 @@ sysdb_svc_remove_alias(struct sysdb_ctx *sysdb,
 | ||||
|      if (ret != EOK) goto done; | ||||
|   | ||||
|      lret = ldb_modify(sysdb->ldb, msg); | ||||
| +    if (lret != LDB_SUCCESS) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +              "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +              ldb_strerror(lret), lret, ldb_errstring(sysdb->ldb));
 | ||||
| +    }
 | ||||
|      ret = sysdb_error_to_errno(lret); | ||||
|   | ||||
|  done: | ||||
| diff --git a/src/db/sysdb_sudo.c b/src/db/sysdb_sudo.c
 | ||||
| index d62234f9b18cff44e935bfef6dda612a98f09e5a..4c50d32c779732a5fb78f23f4344ba4ba0825e84 100644
 | ||||
| --- a/src/db/sysdb_sudo.c
 | ||||
| +++ b/src/db/sysdb_sudo.c
 | ||||
| @@ -521,6 +521,11 @@ static errno_t sysdb_sudo_set_refresh_time(struct sss_domain_info *domain,
 | ||||
|          lret = ldb_add(domain->sysdb->ldb, msg); | ||||
|      } | ||||
|   | ||||
| +    if (lret != LDB_SUCCESS) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +              "ldb operation failed: [%s](%d)[%s]\n",
 | ||||
| +              ldb_strerror(lret), lret, ldb_errstring(domain->sysdb->ldb));
 | ||||
| +    }
 | ||||
|      ret = sysdb_error_to_errno(lret); | ||||
|   | ||||
|  done: | ||||
| diff --git a/src/db/sysdb_views.c b/src/db/sysdb_views.c
 | ||||
| index 21c64c4818d0946785921edbe7c4047d09b0f2a2..945f16ac1753e3b4dfa0c799b00ad177b24d438c 100644
 | ||||
| --- a/src/db/sysdb_views.c
 | ||||
| +++ b/src/db/sysdb_views.c
 | ||||
| @@ -165,8 +165,10 @@ errno_t sysdb_update_view_name(struct sysdb_ctx *sysdb,
 | ||||
|          ret = ldb_add(sysdb->ldb, msg); | ||||
|      } | ||||
|      if (ret != LDB_SUCCESS) { | ||||
| -        DEBUG(SSSDBG_FATAL_FAILURE, "Failed to %s view container\n",
 | ||||
| -                                    view_container_exists ? "modify" : "add");
 | ||||
| +        DEBUG(SSSDBG_FATAL_FAILURE,
 | ||||
| +              "Failed to %s view container [%s](%d)[%s]\n",
 | ||||
| +              view_container_exists ? "modify" : "add",
 | ||||
| +              ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb));
 | ||||
|          ret = sysdb_error_to_errno(ret); | ||||
|          goto done; | ||||
|      } | ||||
| @@ -282,7 +284,9 @@ errno_t sysdb_invalidate_overrides(struct sysdb_ctx *sysdb)
 | ||||
|   | ||||
|          ret = ldb_modify(sysdb->ldb, msg); | ||||
|          if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_ATTRIBUTE) { | ||||
| -            DEBUG(SSSDBG_OP_FAILURE, "ldb_modify failed.\n");
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +                  "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +                  ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb));
 | ||||
|              ret = sysdb_error_to_errno(ret); | ||||
|              goto done; | ||||
|          } | ||||
| @@ -303,7 +307,9 @@ errno_t sysdb_invalidate_overrides(struct sysdb_ctx *sysdb)
 | ||||
|   | ||||
|          ret = ldb_modify(sysdb->ldb, msg); | ||||
|          if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_ATTRIBUTE) { | ||||
| -            DEBUG(SSSDBG_OP_FAILURE, "ldb_modify failed.\n");
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +                  "ldb_modify failed: [%s](%d)[%s]\n",
 | ||||
| +                  ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb));
 | ||||
|              ret = sysdb_error_to_errno(ret); | ||||
|              goto done; | ||||
|          } | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										58
									
								
								0022-ldap_child-fix-coverity-warning.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								0022-ldap_child-fix-coverity-warning.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | ||||
| From 7e6f4793f18a2d549b1d1a8c7b6217468b293bc6 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Mon, 9 Mar 2015 05:45:20 -0400 | ||||
| Subject: [PATCH 22/99] ldap_child: fix coverity warning | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| In ldap_child_get_tgt_sync() variable 'ret' got overriden in done | ||||
| section without ever before being read. | ||||
| 
 | ||||
| Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com> | ||||
| (cherry picked from commit 6ccda8691123bb27f5f2a88a0c80174af3e0fd0a) | ||||
| ---
 | ||||
|  src/providers/ldap/ldap_child.c | 14 ++++++++++++-- | ||||
|  1 file changed, 12 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/ldap_child.c b/src/providers/ldap/ldap_child.c
 | ||||
| index 8f034affa48095b6e512c866f8a3c33465e5c595..82481d6e75c86f7be49625a669691b235589d9a7 100644
 | ||||
| --- a/src/providers/ldap/ldap_child.c
 | ||||
| +++ b/src/providers/ldap/ldap_child.c
 | ||||
| @@ -391,14 +391,20 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx,
 | ||||
|      ccname_file = talloc_asprintf(tmp_ctx, "%s/ccache_%s", | ||||
|                                    DB_PATH, realm_name); | ||||
|      if (ccname_file == NULL) { | ||||
| -        ret = ENOMEM;
 | ||||
| +        krberr = ENOMEM;
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE,
 | ||||
| +              "talloc_asprintf failed: %s:[%d].\n",
 | ||||
| +              strerror(krberr), krberr);
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
|      ccname_file_dummy = talloc_asprintf(tmp_ctx, "%s/ccache_%s_XXXXXX", | ||||
|                                          DB_PATH, realm_name); | ||||
|      if (ccname_file_dummy == NULL) { | ||||
| -        ret = ENOMEM;
 | ||||
| +        krberr = ENOMEM;
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE,
 | ||||
| +              "talloc_asprintf failed: %s:[%d].\n",
 | ||||
| +              strerror(krberr), krberr);
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -407,6 +413,10 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx,
 | ||||
|      umask(old_umask); | ||||
|      if (fd == -1) { | ||||
|          ret = errno; | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE,
 | ||||
| +              "mkstemp failed: %s:[%d].\n",
 | ||||
| +              strerror(ret), ret);
 | ||||
| +        krberr = KRB5KRB_ERR_GENERIC;
 | ||||
|          goto done; | ||||
|      } | ||||
|      /* We only care about creating a unique file name here, we don't | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										79
									
								
								0023-NSS-Handle-ENOENT-when-doing-initgroups-by-UPN.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								0023-NSS-Handle-ENOENT-when-doing-initgroups-by-UPN.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,79 @@ | ||||
| From d8006abd55f2ce0698e09213b8374e9071e70016 Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Mon, 9 Mar 2015 17:25:48 +0100 | ||||
| Subject: [PATCH 23/99] NSS: Handle ENOENT when doing initgroups by UPN | ||||
| 
 | ||||
| https://fedorahosted.org/sssd/ticket/2598 | ||||
| 
 | ||||
| We need to return an empty result in cases an initgroups lookup by UPN | ||||
| doesn't return anything. Please note testing with "id user" is not | ||||
| sufficient as id calls a getpwnam first. | ||||
| 
 | ||||
| Reviewed-by: Pavel Reichl <preichl@redhat.com> | ||||
| ---
 | ||||
|  src/responder/nss/nsssrv_cmd.c | 46 +++++++++++++++++++++++++----------------- | ||||
|  1 file changed, 28 insertions(+), 18 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
 | ||||
| index 19a6121d8cf0ccc1d6f9af797b2ac58a36df9e36..4c0e9414d2cdebe61fd91de06f4900f00904ef22 100644
 | ||||
| --- a/src/responder/nss/nsssrv_cmd.c
 | ||||
| +++ b/src/responder/nss/nsssrv_cmd.c
 | ||||
| @@ -4062,27 +4062,37 @@ static int nss_cmd_initgroups_search(struct nss_dom_ctx *dctx)
 | ||||
|   | ||||
|          if (cmdctx->name_is_upn) { | ||||
|              ret = sysdb_search_user_by_upn(cmdctx, dom, name, user_attrs, &msg); | ||||
| -            if (ret != EOK && ret != ENOENT) {
 | ||||
| +            if (ret == ENOENT) {
 | ||||
| +                dctx->res = talloc_zero(cmdctx, struct ldb_result);
 | ||||
| +                if (dctx->res == NULL) {
 | ||||
| +                    DEBUG(SSSDBG_OP_FAILURE, "talloc_zero failed.\n");
 | ||||
| +                    return ENOMEM;
 | ||||
| +                }
 | ||||
| +
 | ||||
| +                dctx->res->count = 0;
 | ||||
| +                dctx->res->msgs = NULL;
 | ||||
| +                ret = EOK;
 | ||||
| +            } else if (ret != EOK) {
 | ||||
|                  DEBUG(SSSDBG_OP_FAILURE, "sysdb_search_user_by_upn failed.\n"); | ||||
|                  return ret; | ||||
| -            }
 | ||||
| +            } else {
 | ||||
| +                sysdb_name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
 | ||||
| +                if (sysdb_name == NULL) {
 | ||||
| +                    DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +                        "Sysdb entry does not have a name.\n");
 | ||||
| +                    return EINVAL;
 | ||||
| +                }
 | ||||
|   | ||||
| -            sysdb_name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
 | ||||
| -            if (sysdb_name == NULL) {
 | ||||
| -                DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| -                      "Sysdb entry does not have a name.\n");
 | ||||
| -                return EINVAL;
 | ||||
| -            }
 | ||||
| -
 | ||||
| -            ret = sysdb_initgroups(cmdctx, dom, sysdb_name, &dctx->res);
 | ||||
| -            if (ret == EOK && DOM_HAS_VIEWS(dom)) {
 | ||||
| -                for (c = 0; c < dctx->res->count; c++) {
 | ||||
| -                    ret = sysdb_add_overrides_to_object(dom, dctx->res->msgs[c],
 | ||||
| -                                                        NULL, NULL);
 | ||||
| -                    if (ret != EOK) {
 | ||||
| -                        DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| -                              "sysdb_add_overrides_to_object failed.\n");
 | ||||
| -                        return ret;
 | ||||
| +                ret = sysdb_initgroups(cmdctx, dom, sysdb_name, &dctx->res);
 | ||||
| +                if (ret == EOK && DOM_HAS_VIEWS(dom)) {
 | ||||
| +                    for (c = 0; c < dctx->res->count; c++) {
 | ||||
| +                        ret = sysdb_add_overrides_to_object(dom, dctx->res->msgs[c],
 | ||||
| +                                                            NULL, NULL);
 | ||||
| +                        if (ret != EOK) {
 | ||||
| +                            DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +                                "sysdb_add_overrides_to_object failed.\n");
 | ||||
| +                            return ret;
 | ||||
| +                        }
 | ||||
|                      } | ||||
|                  } | ||||
|              } | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										40
									
								
								0024-MAN-libkrb5-and-SSSD-use-different-expansions.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								0024-MAN-libkrb5-and-SSSD-use-different-expansions.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| From e66ff0a610aa9342f16e61018963b2c7f1d60812 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Wed, 14 Jan 2015 12:06:01 -0500 | ||||
| Subject: [PATCH 24/99] MAN: libkrb5 and SSSD use different expansions | ||||
| 
 | ||||
| Users often wrongly use SSSD expansions in libkrb5 expansion template | ||||
| for principals. State explicitly it won't work. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2528 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 33b8bf140b1d82d2626eeeaaea29af49dcdb3c99) | ||||
| ---
 | ||||
|  src/man/sssd-krb5.5.xml | 9 +++++++++ | ||||
|  1 file changed, 9 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/man/sssd-krb5.5.xml b/src/man/sssd-krb5.5.xml
 | ||||
| index a774dce35fb6271fdb1c015adba4ff8576465010..9f61f8f707c6a97548919e8a67c37c9b135c756c 100644
 | ||||
| --- a/src/man/sssd-krb5.5.xml
 | ||||
| +++ b/src/man/sssd-krb5.5.xml
 | ||||
| @@ -222,6 +222,15 @@
 | ||||
|                              defined by krb5.conf. | ||||
|                          </para> | ||||
|                          <para> | ||||
| +                          NOTE: Please be aware that libkrb5 ccache expansion
 | ||||
| +                          template from
 | ||||
| +                          <citerefentry>
 | ||||
| +                                <refentrytitle>krb5.conf</refentrytitle>
 | ||||
| +                                <manvolnum>5</manvolnum>
 | ||||
| +                          </citerefentry>
 | ||||
| +                          uses different expansion sequences than SSSD.
 | ||||
| +                        </para>
 | ||||
| +                        <para>
 | ||||
|                              Default: (from libkrb5) | ||||
|                          </para> | ||||
|                      </listitem> | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										51
									
								
								0025-DEBUG-Add-missing-strings-for-error-messages.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								0025-DEBUG-Add-missing-strings-for-error-messages.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| From b54376696a0f41b8187718c3589307dd1d9d1d4f Mon Sep 17 00:00:00 2001 | ||||
| From: Michal Zidek <mzidek@redhat.com> | ||||
| Date: Tue, 10 Mar 2015 17:30:48 +0100 | ||||
| Subject: [PATCH 25/99] DEBUG: Add missing strings for error messages | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| We had more error codes than corresponding | ||||
| messages. Also order of two messages was | ||||
| wrong. | ||||
| 
 | ||||
| Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com> | ||||
| ---
 | ||||
|  src/util/util_errors.c | 3 +++ | ||||
|  src/util/util_errors.h | 2 +- | ||||
|  2 files changed, 4 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/util/util_errors.c b/src/util/util_errors.c
 | ||||
| index bfae5cd189902ed82ba8b7db29e85a309e4bd19c..180d2e713b3cefdfdaabd9b3acc736c2aeaccbdf 100644
 | ||||
| --- a/src/util/util_errors.c
 | ||||
| +++ b/src/util/util_errors.c
 | ||||
| @@ -42,6 +42,9 @@ struct err_string error_to_str[] = {
 | ||||
|      { "Network I/O Error" }, /* ERR_NETWORK_IO */ | ||||
|      { "Account Expired" }, /* ERR_ACCOUNT_EXPIRED */ | ||||
|      { "Password Expired" }, /* ERR_PASSWORD_EXPIRED */ | ||||
| +    { "Password Expired (reject access)" }, /* ERR_PASSWORD_EXPIRED_REJECT */
 | ||||
| +    { "Password Expired (warn user)" }, /* ERR_PASSWORD_EXPIRED_WARN */
 | ||||
| +    { "Password Expired (ask for new password)" }, /* ERR_PASSWORD_EXPIRED_RENEW */
 | ||||
|      { "Host Access Denied" }, /* ERR_ACCESS_DENIED */ | ||||
|      { "SRV record not found" }, /* ERR_SRV_NOT_FOUND */ | ||||
|      { "SRV lookup error" }, /* ERR_SRV_LOOKUP_ERROR */ | ||||
| diff --git a/src/util/util_errors.h b/src/util/util_errors.h
 | ||||
| index 069d4b78aa5ed6c756affdacab99c7141b7849e4..5ebce631d4520944b387d20028e4f32613c1d3a8 100644
 | ||||
| --- a/src/util/util_errors.h
 | ||||
| +++ b/src/util/util_errors.h
 | ||||
| @@ -53,10 +53,10 @@ enum sssd_errors {
 | ||||
|      ERR_INVALID_CRED_TYPE, | ||||
|      ERR_NO_CREDS, | ||||
|      ERR_CREDS_EXPIRED, | ||||
| +    ERR_CREDS_EXPIRED_CCACHE,
 | ||||
|      ERR_CREDS_INVALID, | ||||
|      ERR_NO_CACHED_CREDS, | ||||
|      ERR_CACHED_CREDS_EXPIRED, | ||||
| -    ERR_CREDS_EXPIRED_CCACHE,
 | ||||
|      ERR_AUTH_DENIED, | ||||
|      ERR_AUTH_FAILED, | ||||
|      ERR_CHPASS_DENIED, | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										78
									
								
								0026-test-Check-ERR_LAST.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								0026-test-Check-ERR_LAST.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | ||||
| From c82b150d9599e212a71996d3f987f9b236833fe4 Mon Sep 17 00:00:00 2001 | ||||
| From: Michal Zidek <mzidek@redhat.com> | ||||
| Date: Tue, 10 Mar 2015 18:38:10 +0100 | ||||
| Subject: [PATCH 26/99] test: Check ERR_LAST | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| Check if number of error codes and messages is the same. | ||||
| 
 | ||||
| Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com> | ||||
| ---
 | ||||
|  src/tests/util-tests.c | 10 ++++++++++ | ||||
|  src/util/util_errors.c |  1 + | ||||
|  src/util/util_errors.h |  2 +- | ||||
|  3 files changed, 12 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/tests/util-tests.c b/src/tests/util-tests.c
 | ||||
| index 21eb02f14a7225ae9b9de4aa7f958b73f84a066d..7ee40dbca6b87b18c876caaa2a535b08d708415d 100644
 | ||||
| --- a/src/tests/util-tests.c
 | ||||
| +++ b/src/tests/util-tests.c
 | ||||
| @@ -1050,6 +1050,12 @@ START_TEST(test_convert_time)
 | ||||
|  } | ||||
|  END_TEST | ||||
|   | ||||
| +START_TEST(test_sss_strerror_err_last)
 | ||||
| +{
 | ||||
| +    ck_assert_str_eq(sss_strerror(ERR_LAST), "ERR_LAST");
 | ||||
| +}
 | ||||
| +END_TEST
 | ||||
| +
 | ||||
|  Suite *util_suite(void) | ||||
|  { | ||||
|      Suite *s = suite_create("util"); | ||||
| @@ -1102,11 +1108,15 @@ Suite *util_suite(void)
 | ||||
|                                ck_leak_check_teardown); | ||||
|      tcase_add_test(tc_convert_time, test_convert_time); | ||||
|   | ||||
| +    TCase *tc_sss_strerror = tcase_create("sss_strerror");
 | ||||
| +    tcase_add_test(tc_sss_strerror, test_sss_strerror_err_last);
 | ||||
| +
 | ||||
|      suite_add_tcase (s, tc_util); | ||||
|      suite_add_tcase (s, tc_utf8); | ||||
|      suite_add_tcase (s, tc_mh3); | ||||
|      suite_add_tcase (s, tc_atomicio); | ||||
|      suite_add_tcase (s, tc_convert_time); | ||||
| +    suite_add_tcase (s, tc_sss_strerror);
 | ||||
|   | ||||
|      return s; | ||||
|  } | ||||
| diff --git a/src/util/util_errors.c b/src/util/util_errors.c
 | ||||
| index 180d2e713b3cefdfdaabd9b3acc736c2aeaccbdf..dad988bce2515c3614a19205f038053152916a16 100644
 | ||||
| --- a/src/util/util_errors.c
 | ||||
| +++ b/src/util/util_errors.c
 | ||||
| @@ -69,6 +69,7 @@ struct err_string error_to_str[] = {
 | ||||
|      { "Error setting SELinux user context" }, /* ERR_SELINUX_CONTEXT */ | ||||
|      { "Username format not allowed by re_expression" }, /* ERR_REGEX_NOMATCH */ | ||||
|      { "Time specification not supported" }, /* ERR_TIMESPEC_NOT_SUPPORTED */ | ||||
| +    { "ERR_LAST" } /* ERR_LAST */
 | ||||
|  }; | ||||
|   | ||||
|   | ||||
| diff --git a/src/util/util_errors.h b/src/util/util_errors.h
 | ||||
| index 5ebce631d4520944b387d20028e4f32613c1d3a8..5d657c707dabc74cf5771af2b601500ba2664ee0 100644
 | ||||
| --- a/src/util/util_errors.h
 | ||||
| +++ b/src/util/util_errors.h
 | ||||
| @@ -97,7 +97,7 @@ enum sssd_errors {
 | ||||
|  #define SSSD_ERR_BASE(err) ((err) & ~ERR_MASK) | ||||
|  #define SSSD_ERR_IDX(err) ((err) & ERR_MASK) | ||||
|  #define IS_SSSD_ERROR(err) \ | ||||
| -    ((SSSD_ERR_BASE(err) == ERR_BASE) && ((err) < ERR_LAST))
 | ||||
| +    ((SSSD_ERR_BASE(err) == ERR_BASE) && ((err) <= ERR_LAST))
 | ||||
|   | ||||
|  #define ERR_OK      0 | ||||
|  /* Backwards compat */ | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,73 @@ | ||||
| From e9457990c14446fc46b72f7f927e6d5fc776d490 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Thu, 5 Mar 2015 15:10:43 +0100 | ||||
| Subject: [PATCH 27/99] PAM: use the logon_name as the key for the PAM initgr | ||||
|  cache | ||||
| 
 | ||||
| Currently the name member of the pam_data struct is used as a key but it | ||||
| can change during a request. Especially for sub-domain users the name is | ||||
| changed from the short to the fully-qualified version before the cache | ||||
| entry is created. As a result the cache searches are always done with | ||||
| the short name while the entry was written with the fully-qualified name. | ||||
| 
 | ||||
| The logon_name member of the pam_data struct contains the name which was | ||||
| send by the PAM client and is never changed during the request. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 7bbf9d1d054f0571fa90ff5dd400a6f4a5a7f6c8) | ||||
| ---
 | ||||
|  src/responder/pam/pamsrv_cmd.c | 16 +++------------- | ||||
|  1 file changed, 3 insertions(+), 13 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c
 | ||||
| index 86e763f825096edc0c07adbe2e02820e5f2bdac9..0b54402729e77f22391c6bd17fd8c937ddea3592 100644
 | ||||
| --- a/src/responder/pam/pamsrv_cmd.c
 | ||||
| +++ b/src/responder/pam/pamsrv_cmd.c
 | ||||
| @@ -1140,7 +1140,8 @@ static int pam_check_user_search(struct pam_auth_req *preq)
 | ||||
|           * the number of updates within a reasonable timeout | ||||
|           */ | ||||
|          if (preq->check_provider) { | ||||
| -            ret = pam_initgr_check_timeout(pctx->id_table, name);
 | ||||
| +            ret = pam_initgr_check_timeout(pctx->id_table,
 | ||||
| +                                           preq->pd->logon_name);
 | ||||
|              if (ret != EOK | ||||
|                      && ret != ENOENT) { | ||||
|                  DEBUG(SSSDBG_OP_FAILURE, | ||||
| @@ -1334,7 +1335,6 @@ static void pam_check_user_dp_callback(uint16_t err_maj, uint32_t err_min,
 | ||||
|      int ret; | ||||
|      struct pam_ctx *pctx = | ||||
|              talloc_get_type(preq->cctx->rctx->pvt_ctx, struct pam_ctx); | ||||
| -    char *name;
 | ||||
|   | ||||
|      if (err_maj) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, | ||||
| @@ -1346,17 +1346,8 @@ static void pam_check_user_dp_callback(uint16_t err_maj, uint32_t err_min,
 | ||||
|      ret = pam_check_user_search(preq); | ||||
|      if (ret == EOK) { | ||||
|          /* Make sure we don't go to the ID provider too often */ | ||||
| -        name = preq->domain->case_sensitive ?
 | ||||
| -                talloc_strdup(preq, preq->pd->user) :
 | ||||
| -                sss_tc_utf8_str_tolower(preq, preq->pd->user);
 | ||||
| -        if (!name) {
 | ||||
| -            ret = ENOMEM;
 | ||||
| -            goto done;
 | ||||
| -        }
 | ||||
| -
 | ||||
|          ret = pam_initgr_cache_set(pctx->rctx->ev, pctx->id_table, | ||||
| -                                   name, pctx->id_timeout);
 | ||||
| -        talloc_free(name);
 | ||||
| +                                   preq->pd->logon_name, pctx->id_timeout);
 | ||||
|          if (ret != EOK) { | ||||
|              DEBUG(SSSDBG_OP_FAILURE, | ||||
|                    "Could not save initgr timestamp. " | ||||
| @@ -1371,7 +1362,6 @@ static void pam_check_user_dp_callback(uint16_t err_maj, uint32_t err_min,
 | ||||
|   | ||||
|      ret = pam_check_user_done(preq, ret); | ||||
|   | ||||
| -done:
 | ||||
|      if (ret) { | ||||
|          preq->pd->pam_status = PAM_SYSTEM_ERR; | ||||
|          pam_reply(preq); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										37
									
								
								0028-pam_initgr_check_timeout-add-debug-output.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								0028-pam_initgr_check_timeout-add-debug-output.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | ||||
| From d505e55f761124fa4cce7e0bc5ea27fbfb8f2ddb Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Thu, 5 Mar 2015 15:26:35 +0100 | ||||
| Subject: [PATCH 28/99] pam_initgr_check_timeout: add debug output | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 10da5ea89b2b963e5e0bb0e0113d118e3bdea892) | ||||
| ---
 | ||||
|  src/responder/pam/pam_helpers.c | 4 ++++ | ||||
|  1 file changed, 4 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/responder/pam/pam_helpers.c b/src/responder/pam/pam_helpers.c
 | ||||
| index 1b94f7adf34b3c1f02c302c6161de4ef6e296cc1..586888cae48ced8d6a6f47234fbec0ef89dd84d2 100644
 | ||||
| --- a/src/responder/pam/pam_helpers.c
 | ||||
| +++ b/src/responder/pam/pam_helpers.c
 | ||||
| @@ -140,14 +140,18 @@ errno_t pam_initgr_check_timeout(hash_table_t *id_table,
 | ||||
|      hret = hash_lookup(id_table, &key, &val); | ||||
|      if (hret != HASH_SUCCESS | ||||
|              && hret != HASH_ERROR_KEY_NOT_FOUND) { | ||||
| +            DEBUG(SSSDBG_TRACE_ALL, "Error searching user [%s] in PAM cache.\n",
 | ||||
| +                                    name);
 | ||||
|          return EIO; | ||||
|      } else if (hret == HASH_ERROR_KEY_NOT_FOUND) { | ||||
| +        DEBUG(SSSDBG_TRACE_ALL, "User [%s] not found in PAM cache.\n", name);
 | ||||
|          return ENOENT; | ||||
|      } | ||||
|   | ||||
|      /* If there's a value here, then the cache | ||||
|       * entry is still valid. | ||||
|       */ | ||||
| +    DEBUG(SSSDBG_TRACE_INTERNAL, "User [%s] found in PAM cache.\n", name);
 | ||||
|      return EOK; | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,37 @@ | ||||
| From 8d13b13f8f5bbcdac7161d55d60cb5eedaccd95c Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Wed, 4 Mar 2015 15:05:11 +0100 | ||||
| Subject: [PATCH 29/99] ipa: do not treat missing sub-domain users as error | ||||
| 
 | ||||
| Resolves: https://fedorahosted.org/sssd/ticket/2444 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 3e9712c2fdbba8f9cd25886943331e76e0b2cedd) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 10 +++++++--- | ||||
|  1 file changed, 7 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index 18f2a867df3ad705008537843ea94e38dab0006e..d5e94806115df8fc6c6fcb9af9782f51119ba7f0 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -147,9 +147,13 @@ static void ipa_s2n_exop_done(struct sdap_op *op,
 | ||||
|            sss_ldap_err2string(result), result, errmsg); | ||||
|   | ||||
|      if (result != LDAP_SUCCESS) { | ||||
| -        DEBUG(SSSDBG_OP_FAILURE, "ldap_extended_operation failed, " \
 | ||||
| -                                 "server logs might contain more details.\n");
 | ||||
| -        ret = ERR_NETWORK_IO;
 | ||||
| +        if (result == LDAP_NO_SUCH_OBJECT) {
 | ||||
| +            ret = ENOENT;
 | ||||
| +        } else {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "ldap_extended_operation failed, server " \
 | ||||
| +                                     "logs might contain more details.\n");
 | ||||
| +            ret = ERR_NETWORK_IO;
 | ||||
| +        }
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										30
									
								
								0030-ipa-make-sure-extdom-expo-data-is-available.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								0030-ipa-make-sure-extdom-expo-data-is-available.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| From 052e37d891612ea4637c6de99cc4982383d65947 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Wed, 4 Mar 2015 14:08:09 +0100 | ||||
| Subject: [PATCH 30/99] ipa: make sure extdom expo data is available | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 7ee9ac32485483beece872d6fcb3096fa77a004b) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 5 +++++ | ||||
|  1 file changed, 5 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index d5e94806115df8fc6c6fcb9af9782f51119ba7f0..d3502443c59b96fa854fff199833cf1239a8955e 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -165,6 +165,11 @@ static void ipa_s2n_exop_done(struct sdap_op *op,
 | ||||
|          ret = ERR_NETWORK_IO; | ||||
|          goto done; | ||||
|      } | ||||
| +    if (retdata == NULL) {
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "Missing exop result data.\n");
 | ||||
| +        ret = EINVAL;
 | ||||
| +        goto done;
 | ||||
| +    }
 | ||||
|   | ||||
|      state->retoid = talloc_strdup(state, retoid); | ||||
|      if (state->retoid == NULL) { | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										35
									
								
								0031-ipa_selinux-Fix-warning-may-be-used-uninitialized.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								0031-ipa_selinux-Fix-warning-may-be-used-uninitialized.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| From befd8f4639ecef8185e82092beae801d68fa7eae Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Fri, 13 Mar 2015 12:38:29 +0100 | ||||
| Subject: [PATCH 31/99] ipa_selinux: Fix warning may be used uninitialized | ||||
| 
 | ||||
| src/providers/ipa/ipa_selinux.c: In function 'ipa_selinux_handler_done': | ||||
| src/providers/ipa/ipa_selinux.c:927:16: error: 'sci' may be used uninitialized in this function [-Werror=maybe-uninitialized] | ||||
|      state->sci = sci; | ||||
|                 ^ | ||||
| src/providers/ipa/ipa_selinux.c:333:33: note: 'sci' was declared here | ||||
|      struct selinux_child_input *sci; | ||||
|                                  ^ | ||||
| cc1: all warnings being treated as errors | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_selinux.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_selinux.c b/src/providers/ipa/ipa_selinux.c
 | ||||
| index 00c793a2643b51e59884730fa4f0ba3c7ed1bea6..19bda3c461c712efebc61265dd8f69ab50be5f2a 100644
 | ||||
| --- a/src/providers/ipa/ipa_selinux.c
 | ||||
| +++ b/src/providers/ipa/ipa_selinux.c
 | ||||
| @@ -330,7 +330,7 @@ static void ipa_selinux_handler_done(struct tevent_req *req)
 | ||||
|      struct sysdb_attrs **hbac_rules = 0; | ||||
|      struct sysdb_attrs **best_match_maps; | ||||
|      struct map_order_ctx *map_order_ctx; | ||||
| -    struct selinux_child_input *sci;
 | ||||
| +    struct selinux_child_input *sci = NULL;
 | ||||
|      struct tevent_req *child_req; | ||||
|   | ||||
|      ret = ipa_get_selinux_recv(req, breq, &map_count, &maps, | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										297
									
								
								0032-LDAP-AD-do-not-resolve-group-members-during-tokenGro.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										297
									
								
								0032-LDAP-AD-do-not-resolve-group-members-during-tokenGro.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,297 @@ | ||||
| From b8d9eca0d9469c1209161b31a0109d8e4ea2868c Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Mon, 9 Mar 2015 16:36:29 +0100 | ||||
| Subject: [PATCH 32/99] LDAP/AD: do not resolve group members during | ||||
|  tokenGroups request | ||||
| 
 | ||||
| During initgroups requests we try to avoid to resolve the complete | ||||
| member list of groups if possible, e.g. if there are no nested groups. | ||||
| The tokenGroups LDAP lookup return the complete list of memberships for | ||||
| a user hence it is not necessary lookup the other group member and | ||||
| un-roll nested groups. With this patch only the group entry is looked up | ||||
| and saved as incomplete group to the cache. | ||||
| 
 | ||||
| This is achieved by adding a new boolean parameter no_members to | ||||
| groups_get_send() and sdap_get_groups_send(). The difference to config | ||||
| options like ldap_group_nesting_level = 0 or ignore_group_members is | ||||
| that if no_members is set to true groups which are missing in the cache | ||||
| are created a incomplete groups. As a result a request to lookup this | ||||
| group will trigger a new LDAP request to resolve the group completely. | ||||
| This way no information is ignored but the time needed to read all data | ||||
| is better distributed between different requests. | ||||
| 
 | ||||
| https://fedorahosted.org/sssd/ticket/2601 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit d81d8d3dc151ebc95cd0e3f3b14c1cdaa48980f1) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_subdomains_ext_groups.c |  2 +- | ||||
|  src/providers/ldap/ldap_common.h              |  3 ++- | ||||
|  src/providers/ldap/ldap_id.c                  | 14 +++++++---- | ||||
|  src/providers/ldap/sdap_async.h               |  3 ++- | ||||
|  src/providers/ldap/sdap_async_enum.c          |  2 +- | ||||
|  src/providers/ldap/sdap_async_groups.c        | 36 ++++++++++++++++++++++++++- | ||||
|  src/providers/ldap/sdap_async_initgroups.c    | 14 +++++------ | ||||
|  src/providers/ldap/sdap_async_initgroups_ad.c |  2 +- | ||||
|  src/providers/ldap/sdap_async_private.h       |  6 +++++ | ||||
|  9 files changed, 64 insertions(+), 18 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_subdomains_ext_groups.c b/src/providers/ipa/ipa_subdomains_ext_groups.c
 | ||||
| index ad278b248ec2a2a157fed0a455dbe97049e83f9d..976a71cfe3ab42425e3884c5f6d9e096fe61bb34 100644
 | ||||
| --- a/src/providers/ipa/ipa_subdomains_ext_groups.c
 | ||||
| +++ b/src/providers/ipa/ipa_subdomains_ext_groups.c
 | ||||
| @@ -872,7 +872,7 @@ static void ipa_add_ad_memberships_get_next(struct tevent_req *req)
 | ||||
|                                   state->sdap_id_ctx->conn, | ||||
|                                   (const char *) val->data, | ||||
|                                   BE_FILTER_NAME, BE_ATTR_CORE, | ||||
| -                                 false);
 | ||||
| +                                 false, false);
 | ||||
|      if (subreq == NULL) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "groups_get_send failed.\n"); | ||||
|          ret = ENOMEM; | ||||
| diff --git a/src/providers/ldap/ldap_common.h b/src/providers/ldap/ldap_common.h
 | ||||
| index bf69489a79e903a98878edb53d372d2242df2b0f..57ad1b8458988d7e108f019c20f67bcde32539d4 100644
 | ||||
| --- a/src/providers/ldap/ldap_common.h
 | ||||
| +++ b/src/providers/ldap/ldap_common.h
 | ||||
| @@ -212,7 +212,8 @@ struct tevent_req *groups_get_send(TALLOC_CTX *memctx,
 | ||||
|                                     const char *name, | ||||
|                                     int filter_type, | ||||
|                                     int attrs_type, | ||||
| -                                   bool noexist_delete);
 | ||||
| +                                   bool noexist_delete,
 | ||||
| +                                   bool no_members);
 | ||||
|  int groups_get_recv(struct tevent_req *req, int *dp_error_out, int *sdap_ret); | ||||
|   | ||||
|  struct tevent_req *ldap_netgroup_get_send(TALLOC_CTX *memctx, | ||||
| diff --git a/src/providers/ldap/ldap_id.c b/src/providers/ldap/ldap_id.c
 | ||||
| index 6de5b72a8b66cd95b16d25a2c37dc21a57695de3..55bb3c9fbd6f623e7795d7399c9e5ac4d5192e85 100644
 | ||||
| --- a/src/providers/ldap/ldap_id.c
 | ||||
| +++ b/src/providers/ldap/ldap_id.c
 | ||||
| @@ -528,6 +528,7 @@ struct groups_get_state {
 | ||||
|      int dp_error; | ||||
|      int sdap_ret; | ||||
|      bool noexist_delete; | ||||
| +    bool no_members;
 | ||||
|  }; | ||||
|   | ||||
|  static int groups_get_retry(struct tevent_req *req); | ||||
| @@ -544,7 +545,8 @@ struct tevent_req *groups_get_send(TALLOC_CTX *memctx,
 | ||||
|                                     const char *name, | ||||
|                                     int filter_type, | ||||
|                                     int attrs_type, | ||||
| -                                   bool noexist_delete)
 | ||||
| +                                   bool noexist_delete,
 | ||||
| +                                   bool no_members)
 | ||||
|  { | ||||
|      struct tevent_req *req; | ||||
|      struct groups_get_state *state; | ||||
| @@ -567,6 +569,7 @@ struct tevent_req *groups_get_send(TALLOC_CTX *memctx,
 | ||||
|      state->conn = conn; | ||||
|      state->dp_error = DP_ERR_FATAL; | ||||
|      state->noexist_delete = noexist_delete; | ||||
| +    state->no_members = no_members;
 | ||||
|   | ||||
|      state->op = sdap_id_op_create(state, state->conn->conn_cache); | ||||
|      if (!state->op) { | ||||
| @@ -713,7 +716,8 @@ struct tevent_req *groups_get_send(TALLOC_CTX *memctx,
 | ||||
|   | ||||
|      /* TODO: handle attrs_type */ | ||||
|      ret = build_attrs_from_map(state, ctx->opts->group_map, SDAP_OPTS_GROUP, | ||||
| -                               state->domain->ignore_group_members ?
 | ||||
| +                               (state->domain->ignore_group_members
 | ||||
| +                                    || state->no_members) ?
 | ||||
|                                     (const char **)member_filter : NULL, | ||||
|                                 &state->attrs, NULL); | ||||
|   | ||||
| @@ -845,7 +849,7 @@ static void groups_get_search(struct tevent_req *req)
 | ||||
|                                    state->attrs, state->filter, | ||||
|                                    dp_opt_get_int(state->ctx->opts->basic, | ||||
|                                                   SDAP_SEARCH_TIMEOUT), | ||||
| -                                  false);
 | ||||
| +                                  false, state->no_members);
 | ||||
|      if (!subreq) { | ||||
|          tevent_req_error(req, ENOMEM); | ||||
|          return; | ||||
| @@ -1383,7 +1387,7 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|                                   ar->filter_value, | ||||
|                                   ar->filter_type, | ||||
|                                   ar->attr_type, | ||||
| -                                 noexist_delete);
 | ||||
| +                                 noexist_delete, false);
 | ||||
|          break; | ||||
|   | ||||
|      case BE_REQ_INITGROUPS: /* init groups for user */ | ||||
| @@ -1718,7 +1722,7 @@ static struct tevent_req *get_user_and_group_send(TALLOC_CTX *memctx,
 | ||||
|      subreq = groups_get_send(req, state->ev, state->id_ctx, | ||||
|                               state->sdom, state->conn, | ||||
|                               state->filter_val, state->filter_type, | ||||
| -                             state->attrs_type, state->noexist_delete);
 | ||||
| +                             state->attrs_type, state->noexist_delete, false);
 | ||||
|      if (subreq == NULL) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "users_get_send failed.\n"); | ||||
|          ret = ENOMEM; | ||||
| diff --git a/src/providers/ldap/sdap_async.h b/src/providers/ldap/sdap_async.h
 | ||||
| index 1239f28c173373aac23c5796d694c7bd5ca24c96..ef9b3bbadba830bcf730b6fa70867c17d51380af 100644
 | ||||
| --- a/src/providers/ldap/sdap_async.h
 | ||||
| +++ b/src/providers/ldap/sdap_async.h
 | ||||
| @@ -96,7 +96,8 @@ struct tevent_req *sdap_get_groups_send(TALLOC_CTX *memctx,
 | ||||
|                                         const char **attrs, | ||||
|                                         const char *filter, | ||||
|                                         int timeout, | ||||
| -                                       bool enumeration);
 | ||||
| +                                       bool enumeration,
 | ||||
| +                                       bool no_members);
 | ||||
|  int sdap_get_groups_recv(struct tevent_req *req, | ||||
|                           TALLOC_CTX *mem_ctx, char **timestamp); | ||||
|   | ||||
| diff --git a/src/providers/ldap/sdap_async_enum.c b/src/providers/ldap/sdap_async_enum.c
 | ||||
| index 242b3172f367b0b35738bd2e86ea927a4409d2d6..1cc09abdf1aa14e3d1690ea1abe32604ae4ff1cd 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_enum.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_enum.c
 | ||||
| @@ -811,7 +811,7 @@ static struct tevent_req *enum_groups_send(TALLOC_CTX *memctx,
 | ||||
|                                    state->attrs, state->filter, | ||||
|                                    dp_opt_get_int(state->ctx->opts->basic, | ||||
|                                                   SDAP_ENUM_SEARCH_TIMEOUT), | ||||
| -                                  true);
 | ||||
| +                                  true, false);
 | ||||
|      if (!subreq) { | ||||
|          ret = ENOMEM; | ||||
|          goto fail; | ||||
| diff --git a/src/providers/ldap/sdap_async_groups.c b/src/providers/ldap/sdap_async_groups.c
 | ||||
| index c86b5c6b59a4de7e945b95cafae9149f681e2e18..818f30b95d4a4707c32d16b9866b008d89141e4d 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_groups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_groups.c
 | ||||
| @@ -1750,6 +1750,7 @@ struct sdap_get_groups_state {
 | ||||
|      char *filter; | ||||
|      int timeout; | ||||
|      bool enumeration; | ||||
| +    bool no_members;
 | ||||
|   | ||||
|      char *higher_usn; | ||||
|      struct sysdb_attrs **groups; | ||||
| @@ -1779,7 +1780,8 @@ struct tevent_req *sdap_get_groups_send(TALLOC_CTX *memctx,
 | ||||
|                                         const char **attrs, | ||||
|                                         const char *filter, | ||||
|                                         int timeout, | ||||
| -                                       bool enumeration)
 | ||||
| +                                       bool enumeration,
 | ||||
| +                                       bool no_members)
 | ||||
|  { | ||||
|      errno_t ret; | ||||
|      struct tevent_req *req; | ||||
| @@ -1802,6 +1804,7 @@ struct tevent_req *sdap_get_groups_send(TALLOC_CTX *memctx,
 | ||||
|      state->count = 0; | ||||
|      state->timeout = timeout; | ||||
|      state->enumeration = enumeration; | ||||
| +    state->no_members = no_members;
 | ||||
|      state->base_filter = filter; | ||||
|      state->base_iter = 0; | ||||
|      state->search_bases = sdom->group_search_bases; | ||||
| @@ -1926,6 +1929,7 @@ static void sdap_get_groups_process(struct tevent_req *subreq)
 | ||||
|      bool next_base = false; | ||||
|      size_t count; | ||||
|      struct sysdb_attrs **groups; | ||||
| +    char **groupnamelist;
 | ||||
|   | ||||
|      ret = sdap_get_generic_recv(subreq, state, | ||||
|                                  &count, &groups); | ||||
| @@ -1992,6 +1996,36 @@ static void sdap_get_groups_process(struct tevent_req *subreq)
 | ||||
|          return; | ||||
|      } | ||||
|   | ||||
| +    if (state->no_members) {
 | ||||
| +        ret = sysdb_attrs_primary_name_list(state->sysdb, state,
 | ||||
| +                                state->groups, state->count,
 | ||||
| +                                state->opts->group_map[SDAP_AT_GROUP_NAME].name,
 | ||||
| +                                &groupnamelist);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +                  "sysdb_attrs_primary_name_list failed.\n");
 | ||||
| +            tevent_req_error(req, ret);
 | ||||
| +            return;
 | ||||
| +        }
 | ||||
| +
 | ||||
| +        ret = sdap_add_incomplete_groups(state->sysdb, state->dom, state->opts,
 | ||||
| +                                         groupnamelist, state->groups,
 | ||||
| +                                         state->count);
 | ||||
| +        if (ret == EOK) {
 | ||||
| +            DEBUG(SSSDBG_TRACE_LIBS,
 | ||||
| +                  "Reading only group data without members successful.\n");
 | ||||
| +            tevent_req_done(req);
 | ||||
| +        } else {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "sdap_add_incomplete_groups failed.\n");
 | ||||
| +            tevent_req_error(req, ret);
 | ||||
| +        }
 | ||||
| +        return;
 | ||||
| +
 | ||||
| +        ret = sdap_save_groups(state, state->sysdb, state->dom, state->opts,
 | ||||
| +                               state->groups, state->count, false,
 | ||||
| +                               NULL, true, NULL);
 | ||||
| +    }
 | ||||
| +
 | ||||
|      /* Check whether we need to do nested searches | ||||
|       * for RFC2307bis/FreeIPA/ActiveDirectory | ||||
|       * We don't need to do this for enumeration, | ||||
| diff --git a/src/providers/ldap/sdap_async_initgroups.c b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| index 48c16b71637f83399d9a523f64f6d812b91681ef..2fd235f2868b877c0e5d5d9f7b1b76d269eee8ee 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| @@ -29,12 +29,12 @@
 | ||||
|  #include "providers/ldap/sdap_users.h" | ||||
|   | ||||
|  /* ==Save-fake-group-list=====================================*/ | ||||
| -static errno_t sdap_add_incomplete_groups(struct sysdb_ctx *sysdb,
 | ||||
| -                                          struct sss_domain_info *domain,
 | ||||
| -                                          struct sdap_options *opts,
 | ||||
| -                                          char **groupnames,
 | ||||
| -                                          struct sysdb_attrs **ldap_groups,
 | ||||
| -                                          int ldap_groups_count)
 | ||||
| +errno_t sdap_add_incomplete_groups(struct sysdb_ctx *sysdb,
 | ||||
| +                                   struct sss_domain_info *domain,
 | ||||
| +                                   struct sdap_options *opts,
 | ||||
| +                                   char **groupnames,
 | ||||
| +                                   struct sysdb_attrs **ldap_groups,
 | ||||
| +                                   int ldap_groups_count)
 | ||||
|  { | ||||
|      TALLOC_CTX *tmp_ctx; | ||||
|      struct ldb_message *msg; | ||||
| @@ -3152,7 +3152,7 @@ static void sdap_get_initgr_done(struct tevent_req *subreq)
 | ||||
|   | ||||
|      subreq = groups_get_send(req, state->ev, state->id_ctx, | ||||
|                               state->id_ctx->opts->sdom, state->conn, | ||||
| -                             gid, BE_FILTER_IDNUM, BE_ATTR_ALL, NULL);
 | ||||
| +                             gid, BE_FILTER_IDNUM, BE_ATTR_ALL, false, false);
 | ||||
|      if (!subreq) { | ||||
|          ret = ENOMEM; | ||||
|          goto fail; | ||||
| diff --git a/src/providers/ldap/sdap_async_initgroups_ad.c b/src/providers/ldap/sdap_async_initgroups_ad.c
 | ||||
| index 1b8c8d981ea14ac0fca0903f16296c8a6701c5dd..9915f1863f172d5d3f59afe03abbbfb87fdf3409 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_initgroups_ad.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_initgroups_ad.c
 | ||||
| @@ -630,7 +630,7 @@ static errno_t sdap_ad_resolve_sids_step(struct tevent_req *req)
 | ||||
|   | ||||
|      subreq = groups_get_send(state, state->ev, state->id_ctx, sdap_domain, | ||||
|                               state->conn, state->current_sid, | ||||
| -                             BE_FILTER_SECID, BE_ATTR_CORE, false);
 | ||||
| +                             BE_FILTER_SECID, BE_ATTR_CORE, false, true);
 | ||||
|      if (subreq == NULL) { | ||||
|          return ENOMEM; | ||||
|      } | ||||
| diff --git a/src/providers/ldap/sdap_async_private.h b/src/providers/ldap/sdap_async_private.h
 | ||||
| index e689394c5db8a3385c333e6b98372c6f6d34366c..3995a2ac357c52f546696284d71d2127d0302409 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_private.h
 | ||||
| +++ b/src/providers/ldap/sdap_async_private.h
 | ||||
| @@ -132,4 +132,10 @@ errno_t sdap_nested_group_recv(TALLOC_CTX *mem_ctx,
 | ||||
|                                 unsigned long *_num_groups, | ||||
|                                 struct sysdb_attrs ***_groups); | ||||
|   | ||||
| +errno_t sdap_add_incomplete_groups(struct sysdb_ctx *sysdb,
 | ||||
| +                                   struct sss_domain_info *domain,
 | ||||
| +                                   struct sdap_options *opts,
 | ||||
| +                                   char **groupnames,
 | ||||
| +                                   struct sysdb_attrs **ldap_groups,
 | ||||
| +                                   int ldap_groups_count);
 | ||||
|  #endif /* _SDAP_ASYNC_PRIVATE_H_ */ | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										50
									
								
								0033-IPA-idviews-check-if-view-name-is-set.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								0033-IPA-idviews-check-if-view-name-is-set.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | ||||
| From 2c7b61d223667868d284711fc0800cb9d34177e9 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Tue, 17 Mar 2015 11:08:05 +0100 | ||||
| Subject: [PATCH 33/99] IPA idviews: check if view name is set | ||||
| 
 | ||||
| When working with older FreeIPA releases the view name might not always | ||||
| been set. This patch add checks to might sure it is only dereferenced | ||||
| when set. | ||||
| 
 | ||||
| Resolves https://fedorahosted.org/sssd/ticket/2604 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 8be0cf3eea892e13410c13abb030322599ca1b4f) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 5 ++++- | ||||
|  1 file changed, 4 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index d3502443c59b96fa854fff199833cf1239a8955e..89fe0ce2289e58e0199a394a1377758569f463f7 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -1036,7 +1036,8 @@ static void ipa_s2n_get_fqlist_next(struct tevent_req *subreq)
 | ||||
|          goto fail; | ||||
|      } | ||||
|   | ||||
| -    if (strcmp(state->ipa_ctx->view_name, SYSDB_DEFAULT_VIEW_NAME) == 0) {
 | ||||
| +    if (state->ipa_ctx->view_name == NULL ||
 | ||||
| +            strcmp(state->ipa_ctx->view_name, SYSDB_DEFAULT_VIEW_NAME) == 0) {
 | ||||
|          ret = ipa_s2n_get_fqlist_save_step(req); | ||||
|          if (ret == EOK) { | ||||
|              tevent_req_done(req); | ||||
| @@ -1611,6 +1612,7 @@ static void ipa_s2n_get_user_done(struct tevent_req *subreq)
 | ||||
|      } | ||||
|   | ||||
|      if (ret == ENOENT | ||||
| +            || state->ipa_ctx->view_name == NULL
 | ||||
|              || strcmp(state->ipa_ctx->view_name, | ||||
|                        SYSDB_DEFAULT_VIEW_NAME) == 0) { | ||||
|          ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, | ||||
| @@ -2220,6 +2222,7 @@ static void ipa_s2n_get_fqlist_done(struct tevent_req  *subreq)
 | ||||
|      } | ||||
|   | ||||
|      if (state->override_attrs == NULL | ||||
| +            && state->ipa_ctx->view_name != NULL
 | ||||
|              && strcmp(state->ipa_ctx->view_name, | ||||
|                        SYSDB_DEFAULT_VIEW_NAME) != 0) { | ||||
|          subreq = ipa_get_ad_override_send(state, state->ev, | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 4c047cc4720227ca7ad80f02546493ba6e0199ef Mon Sep 17 00:00:00 2001 | ||||
| From 4b6ee69fb1f713aae125b0fc2d345846e7a0d642 Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Thu, 12 Mar 2015 16:31:13 +0100 | ||||
| Subject: [PATCH 17/17] selinux: Handle setup with empty default and no | ||||
| Subject: [PATCH 34/99] selinux: Handle setup with empty default and no | ||||
|  configured rules | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| @ -21,7 +21,7 @@ Reviewed-by: Michal Židek <mzidek@redhat.com> | ||||
|  2 files changed, 10 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_selinux.c b/src/providers/ipa/ipa_selinux.c
 | ||||
| index 00c793a2643b51e59884730fa4f0ba3c7ed1bea6..cdb0dfa388eb3743e0b937befd63cf05ae94b71e 100644
 | ||||
| index 19bda3c461c712efebc61265dd8f69ab50be5f2a..631f9ab80afba7dbdb091823b0fb4a0dc1126d49 100644
 | ||||
| --- a/src/providers/ipa/ipa_selinux.c
 | ||||
| +++ b/src/providers/ipa/ipa_selinux.c
 | ||||
| @@ -808,7 +808,7 @@ selinux_child_setup(TALLOC_CTX *mem_ctx,
 | ||||
| @ -78,5 +78,5 @@ index 3756557a5e28624e6437e805ca8a387d2f65dd1f..81c1de877ef08a299d07837fefcd195d | ||||
|      } else { | ||||
|          if ((p + len ) > size) return EINVAL; | ||||
| -- 
 | ||||
| 2.3.3 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										29
									
								
								0035-IPA-make-sure-output-variable-is-set.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								0035-IPA-make-sure-output-variable-is-set.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| From ee3cd052a2aca57040a9b435def5442922f8af76 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Thu, 19 Mar 2015 14:26:26 +0100 | ||||
| Subject: [PATCH 35/99] IPA: make sure output variable is set | ||||
| 
 | ||||
| Reviewed-by: Pavel Reichl <preichl@redhat.com> | ||||
| (cherry picked from commit abb093b4ae10f2a5748bf9f194bf76794002eba0) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 4 +++- | ||||
|  1 file changed, 3 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index 89fe0ce2289e58e0199a394a1377758569f463f7..c7fd1009b14bcfa7502236bbf707fcbe72f537c1 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -1253,7 +1253,9 @@ static errno_t process_members(struct sss_domain_info *domain,
 | ||||
|   | ||||
|      if (members == NULL) { | ||||
|          DEBUG(SSSDBG_TRACE_INTERNAL, "No members\n"); | ||||
| -        *_missing_members = NULL;
 | ||||
| +        if (_missing_members != NULL) {
 | ||||
| +            *_missing_members = NULL;
 | ||||
| +        }
 | ||||
|          return EOK; | ||||
|      } | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										26
									
								
								0036-IPA-set-EINVAL-if-dn-can-t-be-linearized.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								0036-IPA-set-EINVAL-if-dn-can-t-be-linearized.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| From e8f5e135b4d389a1ae224da174c15dfe66b30810 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Thu, 19 Mar 2015 10:21:21 -0400 | ||||
| Subject: [PATCH 36/99] IPA: set EINVAL if dn can't be linearized | ||||
| 
 | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit 131da4d9f40e0e407d7bcae18ff16507976bc6c7) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index c7fd1009b14bcfa7502236bbf707fcbe72f537c1..a844ee99d25ec28bb02ec7b7fd0afa722b6ac189 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -1293,6 +1293,7 @@ static errno_t process_members(struct sss_domain_info *domain,
 | ||||
|                  dn_str = ldb_dn_get_linearized(msg->dn); | ||||
|                  if (dn_str == NULL) { | ||||
|                      DEBUG(SSSDBG_OP_FAILURE, "ldb_dn_get_linearized failed.\n"); | ||||
| +                    ret = EINVAL;
 | ||||
|                      goto done; | ||||
|                  } | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,38 @@ | ||||
| From 0d628f98500a0fd642ba0c720c40393460988f73 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Fri, 20 Mar 2015 18:41:52 +0100 | ||||
| Subject: [PATCH 37/99] GPO: error out instead of leaving array element | ||||
|  uninitialized | ||||
| 
 | ||||
| In general every object created by the AD provider should have a SID | ||||
| attribute. Since SIDs and GPOs are used for access control a missing SID | ||||
| should be treated as error for now until it is known if there is a valid | ||||
| reason why the SID is missing. | ||||
| 
 | ||||
| Resolves https://fedorahosted.org/sssd/ticket/2608 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 4cfab2330323834574c179f774a0c6b1fff4936e) | ||||
| ---
 | ||||
|  src/providers/ad/ad_gpo.c | 5 ++++- | ||||
|  1 file changed, 4 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ad/ad_gpo.c b/src/providers/ad/ad_gpo.c
 | ||||
| index c45b7963e221ae30e0c003762e4a8320449cd211..69ff6daaa7e060cca4cab129ecde83d3406702d1 100644
 | ||||
| --- a/src/providers/ad/ad_gpo.c
 | ||||
| +++ b/src/providers/ad/ad_gpo.c
 | ||||
| @@ -581,7 +581,10 @@ ad_gpo_get_sids(TALLOC_CTX *mem_ctx,
 | ||||
|          group_sid = ldb_msg_find_attr_as_string(res->msgs[i+1], | ||||
|                                                  SYSDB_SID_STR, NULL); | ||||
|          if (group_sid == NULL) { | ||||
| -            continue;
 | ||||
| +            DEBUG(SSSDBG_CRIT_FAILURE, "Missing SID for cache entry [%s].\n",
 | ||||
| +                  ldb_dn_get_linearized(res->msgs[i+1]->dn));
 | ||||
| +            ret = EINVAL;
 | ||||
| +            goto done;
 | ||||
|          } | ||||
|   | ||||
|          group_sids[i] = talloc_steal(group_sids, group_sid); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										39
									
								
								0038-LDAP-remove-unused-code.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								0038-LDAP-remove-unused-code.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| From f5c1ef14c603dda7ca3e5d9fe8c4cf54d72e97f2 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Fri, 20 Mar 2015 05:23:49 -0400 | ||||
| Subject: [PATCH 38/99] LDAP: remove unused code | ||||
| 
 | ||||
| Also fix debug message. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit ef9ca5848ea08aafa0827f5d2922d49130ba324d) | ||||
| ---
 | ||||
|  src/providers/ldap/sdap_async_groups.c | 6 +----- | ||||
|  1 file changed, 1 insertion(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/sdap_async_groups.c b/src/providers/ldap/sdap_async_groups.c
 | ||||
| index 818f30b95d4a4707c32d16b9866b008d89141e4d..7779d499de87e2f0657512cb1f8e1980f9bf1f71 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_groups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_groups.c
 | ||||
| @@ -2013,17 +2013,13 @@ static void sdap_get_groups_process(struct tevent_req *subreq)
 | ||||
|                                           state->count); | ||||
|          if (ret == EOK) { | ||||
|              DEBUG(SSSDBG_TRACE_LIBS, | ||||
| -                  "Reading only group data without members successful.\n");
 | ||||
| +                  "Writing only group data without members was successful.\n");
 | ||||
|              tevent_req_done(req); | ||||
|          } else { | ||||
|              DEBUG(SSSDBG_OP_FAILURE, "sdap_add_incomplete_groups failed.\n"); | ||||
|              tevent_req_error(req, ret); | ||||
|          } | ||||
|          return; | ||||
| -
 | ||||
| -        ret = sdap_save_groups(state, state->sysdb, state->dom, state->opts,
 | ||||
| -                               state->groups, state->count, false,
 | ||||
| -                               NULL, true, NULL);
 | ||||
|      } | ||||
|   | ||||
|      /* Check whether we need to do nested searches | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,42 @@ | ||||
| From cbab37e665d948278a491733e3993ac62beb0427 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Wed, 11 Mar 2015 18:11:13 +0100 | ||||
| Subject: [PATCH 39/99] memberof: Do not create request with 0 attribute values | ||||
| 
 | ||||
| [sysdb_set_entry_attr] (0x0080): ldb_modify failed: [Constraint violation](19) | ||||
|   [attribute 'ghost': attribute on 'name=Escalation,cn=groups,cn=LDAP,cn=sysdb' | ||||
|   specified, but with 0 values (illegal)] | ||||
| [sysdb_error_to_errno] (0x0020): LDB returned unexpected error: | ||||
|   [Constraint violation] | ||||
| [sysdb_set_entry_attr] (0x0040): Error: 14 (Bad address) | ||||
| [sdap_store_group_with_gid] (0x0040): Could not store group Escalation | ||||
| [sdap_save_group] (0x0080): Could not store group with GID: [Bad address] | ||||
| [sdap_save_group] (0x0080): Failed to save group [Escalation]: [Bad address] | ||||
| [sdap_save_groups] (0x0040): Failed to store group 1. Ignoring. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 999c87114479f230c840a5c020e107c45b29fd56) | ||||
| ---
 | ||||
|  src/ldb_modules/memberof.c | 6 ++++++ | ||||
|  1 file changed, 6 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/ldb_modules/memberof.c b/src/ldb_modules/memberof.c
 | ||||
| index 995c382a8ee36bfc010f2761010db1fb48343d5d..4d7b23ea1b95bed0ec5c7cc717b95e6da3cd0717 100644
 | ||||
| --- a/src/ldb_modules/memberof.c
 | ||||
| +++ b/src/ldb_modules/memberof.c
 | ||||
| @@ -3302,6 +3302,12 @@ static int mbof_inherited_mod(struct mbof_mod_ctx *mod_ctx)
 | ||||
|      } | ||||
|      el->num_values = j; | ||||
|   | ||||
| +    if (el->num_values == 0) {
 | ||||
| +        /* nothing to do */
 | ||||
| +        /* We cannot modify element which has 0 values */
 | ||||
| +        msg->num_elements = 0;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      mod_ctx->igh->mod_msg = msg; | ||||
|      mod_ctx->igh->el = el; | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										2795
									
								
								0040-tests-convert-all-unit-tests-to-cmocka-1.0-or-later.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2795
									
								
								0040-tests-convert-all-unit-tests-to-cmocka-1.0-or-later.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										30
									
								
								0041-RPM-BuildRequire-libcmocka-1.0.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								0041-RPM-BuildRequire-libcmocka-1.0.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| From 2bbf29b268bd2e7f9399ad6d7f5be6ca73ef7223 Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Tue, 10 Mar 2015 11:02:30 +0100 | ||||
| Subject: [PATCH 41/99] RPM: BuildRequire libcmocka >= 1.0 | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com> | ||||
| (cherry picked from commit 0aad066baeed6833cf061b71d72c6bbbb2d2b9e8) | ||||
| ---
 | ||||
|  contrib/sssd.spec.in | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
 | ||||
| index bea68f1bbceac232f4ca019111b6262dca3380eb..d5f69149047bf691cc2f9663252a41c1f28f216b 100644
 | ||||
| --- a/contrib/sssd.spec.in
 | ||||
| +++ b/contrib/sssd.spec.in
 | ||||
| @@ -112,7 +112,7 @@ BuildRequires: findutils
 | ||||
|  BuildRequires: glib2-devel | ||||
|  BuildRequires: selinux-policy-targeted | ||||
|  %if 0%{?fedora} | ||||
| -BuildRequires: libcmocka-devel
 | ||||
| +BuildRequires: libcmocka-devel >= 1.0.0
 | ||||
|  %endif | ||||
|  %if (0%{?fedora} >= 20) | ||||
|  BuildRequires: uid_wrapper | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,40 @@ | ||||
| From 1acadc807209b24f681a4866812e11d04b5a129f Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Tue, 10 Mar 2015 18:10:37 +0100 | ||||
| Subject: [PATCH 42/99] build: Only run cmocka tests if cmocka 1.0 or newer is | ||||
|  available | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com> | ||||
| (cherry picked from commit cecee447d41c3ca22e94880a7d0cbd910f230fe5) | ||||
| ---
 | ||||
|  src/external/libcmocka.m4 | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/external/libcmocka.m4 b/src/external/libcmocka.m4
 | ||||
| index 740d9ad254b50563d4d1cbcab3d10f5920ffd79f..230aa92697d8ea4ca12fce21dbaa417bbe3c9b96 100644
 | ||||
| --- a/src/external/libcmocka.m4
 | ||||
| +++ b/src/external/libcmocka.m4
 | ||||
| @@ -1,7 +1,7 @@
 | ||||
|  dnl A macro to check presence of cmocka on the system | ||||
|  AC_DEFUN([AM_CHECK_CMOCKA], | ||||
|  [ | ||||
| -    PKG_CHECK_EXISTS(cmocka,
 | ||||
| +    PKG_CHECK_EXISTS(cmocka >= 1.0.0,
 | ||||
|          [AC_CHECK_HEADERS([stdarg.h stddef.h setjmp.h], | ||||
|              [], dnl We are only intrested in action-if-not-found | ||||
|              [AC_MSG_WARN([Header files stdarg.h stddef.h setjmp.h are required by cmocka]) | ||||
| @@ -12,7 +12,7 @@ AC_DEFUN([AM_CHECK_CMOCKA],
 | ||||
|                [PKG_CHECK_MODULES([CMOCKA], [cmocka], [have_cmocka="yes"])] | ||||
|          )], | ||||
|          dnl PKG_CHECK_EXISTS ACTION-IF-NOT-FOUND | ||||
| -        [AC_MSG_WARN([No libcmocka library found, cmocka tests will not be built])]
 | ||||
| +        [AC_MSG_WARN([No libcmocka-1.0.0 or newer library found, cmocka tests will not be built])]
 | ||||
|      ) | ||||
|      AM_CONDITIONAL([HAVE_CMOCKA], [test x$have_cmocka = xyes]) | ||||
|  ]) | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										549
									
								
								0043-sdap-properly-handle-binary-objectGuid-attribute.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										549
									
								
								0043-sdap-properly-handle-binary-objectGuid-attribute.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,549 @@ | ||||
| From 4619742836ec22edf8f9d274d928bc896c5b0883 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Tue, 17 Feb 2015 04:41:21 +0100 | ||||
| Subject: [PATCH 43/99] sdap: properly handle binary objectGuid attribute | ||||
| 
 | ||||
| Although in the initial processing SSSD treats the binary value right at | ||||
| some point it mainly assumes that it is a string. Depending on the value | ||||
| this might end up with the correct binary value stored in the cache but | ||||
| in most cases there will be only a broken entry in the cache. | ||||
| 
 | ||||
| This patch converts the binary value into a string representation which | ||||
| is described in [MS-DTYP] and stores the result in the cache. | ||||
| 
 | ||||
| Resolves https://fedorahosted.org/sssd/ticket/2588 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| ---
 | ||||
|  Makefile.am                                |  16 ++++ | ||||
|  src/db/sysdb.h                             |   6 ++ | ||||
|  src/db/sysdb_ops.c                         |  52 +++++++++++ | ||||
|  src/providers/ldap/sdap_async_groups.c     |  25 ++---- | ||||
|  src/providers/ldap/sdap_async_initgroups.c |   7 +- | ||||
|  src/providers/ldap/sdap_async_users.c      |  23 ++--- | ||||
|  src/tests/cmocka/test_string_utils.c       |  59 +++++++++++++ | ||||
|  src/tests/cmocka/test_sysdb_utils.c        | 134 +++++++++++++++++++++++++++++ | ||||
|  src/tests/cmocka/test_utils.c              |   1 + | ||||
|  src/tests/cmocka/test_utils.h              |   1 + | ||||
|  src/tests/cwrap/Makefile.am                |   2 + | ||||
|  src/util/string_utils.c                    |  25 ++++++ | ||||
|  src/util/util.h                            |   7 ++ | ||||
|  13 files changed, 324 insertions(+), 34 deletions(-) | ||||
|  create mode 100644 src/tests/cmocka/test_sysdb_utils.c | ||||
| 
 | ||||
| diff --git a/Makefile.am b/Makefile.am
 | ||||
| index 5099043549a46c15a9d7f6a581c864cbbe3137b5..df34840747bdcc3e2cc68ac1a3ca448b4aa67433 100644
 | ||||
| --- a/Makefile.am
 | ||||
| +++ b/Makefile.am
 | ||||
| @@ -214,6 +214,7 @@ if HAVE_CMOCKA
 | ||||
|          test_search_bases \ | ||||
|          sdap-tests \ | ||||
|          test_sysdb_views \ | ||||
| +        test_sysdb_utils \
 | ||||
|          test_be_ptask \ | ||||
|          test_copy_ccache \ | ||||
|          test_copy_keytab \ | ||||
| @@ -2113,6 +2114,21 @@ test_sysdb_views_LDADD = \
 | ||||
|      libsss_test_common.la \ | ||||
|      $(NULL) | ||||
|   | ||||
| +test_sysdb_utils_SOURCES = \
 | ||||
| +    src/tests/cmocka/test_sysdb_utils.c \
 | ||||
| +    $(NULL)
 | ||||
| +test_sysdb_utils_CFLAGS = \
 | ||||
| +    $(AM_CFLAGS) \
 | ||||
| +    $(NULL)
 | ||||
| +test_sysdb_utils_LDADD = \
 | ||||
| +    $(CMOCKA_LIBS) \
 | ||||
| +    $(LDB_LIBS) \
 | ||||
| +    $(POPT_LIBS) \
 | ||||
| +    $(TALLOC_LIBS) \
 | ||||
| +    $(SSSD_INTERNAL_LTLIBS) \
 | ||||
| +    libsss_test_common.la \
 | ||||
| +    $(NULL)
 | ||||
| +
 | ||||
|  test_be_ptask_SOURCES = \ | ||||
|      src/tests/cmocka/test_be_ptask.c \ | ||||
|      src/providers/dp_ptask.c \ | ||||
| diff --git a/src/db/sysdb.h b/src/db/sysdb.h
 | ||||
| index 1362f377837d25815b04b4929a2895ee3a6485a9..a1b6f207399555c85c14c8decf89edc498deb871 100644
 | ||||
| --- a/src/db/sysdb.h
 | ||||
| +++ b/src/db/sysdb.h
 | ||||
| @@ -1117,4 +1117,10 @@ errno_t sysdb_get_sids_of_members(TALLOC_CTX *mem_ctx,
 | ||||
|                                    const char ***_sids, | ||||
|                                    const char ***_dns, | ||||
|                                    size_t *_n); | ||||
| +
 | ||||
| +errno_t sysdb_handle_original_uuid(const char *orig_name,
 | ||||
| +                                   struct sysdb_attrs *src_attrs,
 | ||||
| +                                   const char *src_name,
 | ||||
| +                                   struct sysdb_attrs *dest_attrs,
 | ||||
| +                                   const char *dest_name);
 | ||||
|  #endif /* __SYS_DB_H__ */ | ||||
| diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
 | ||||
| index 06d24f220afc28b39f3856f3f0170818e11d9cf9..37529fd12c2c5c6896a2ca71293a61f93ba0eee3 100644
 | ||||
| --- a/src/db/sysdb_ops.c
 | ||||
| +++ b/src/db/sysdb_ops.c
 | ||||
| @@ -3696,3 +3696,55 @@ done:
 | ||||
|      talloc_free(tmp_ctx); | ||||
|      return ret; | ||||
|  } | ||||
| +
 | ||||
| +errno_t sysdb_handle_original_uuid(const char *orig_name,
 | ||||
| +                                   struct sysdb_attrs *src_attrs,
 | ||||
| +                                   const char *src_name,
 | ||||
| +                                   struct sysdb_attrs *dest_attrs,
 | ||||
| +                                   const char *dest_name)
 | ||||
| +{
 | ||||
| +    int ret;
 | ||||
| +    struct ldb_message_element *el;
 | ||||
| +    char guid_str_buf[GUID_STR_BUF_SIZE];
 | ||||
| +
 | ||||
| +    if (orig_name == NULL || src_attrs == NULL || src_name == NULL
 | ||||
| +            || dest_attrs == NULL || dest_name == NULL) {
 | ||||
| +        return EINVAL;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = sysdb_attrs_get_el_ext(src_attrs, src_name, false, &el);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        if (ret != ENOENT) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_el failed.\n");
 | ||||
| +        }
 | ||||
| +        return ret;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (el->num_values != 1) {
 | ||||
| +        DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +              "Found more than one UUID value, using the first.\n");
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    /* Check if we got a binary AD objectGUID */
 | ||||
| +    if (el->values[0].length == GUID_BIN_LENGTH
 | ||||
| +            && strcasecmp(orig_name, "objectGUID") == 0) {
 | ||||
| +        ret = guid_blob_to_string_buf(el->values[0].data, guid_str_buf,
 | ||||
| +                                      GUID_STR_BUF_SIZE);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "guid_blob_to_string_buf failed.\n");
 | ||||
| +            return ret;
 | ||||
| +        }
 | ||||
| +
 | ||||
| +        ret = sysdb_attrs_add_string(dest_attrs, dest_name, guid_str_buf);
 | ||||
| +    } else {
 | ||||
| +        ret = sysdb_attrs_add_string(dest_attrs, dest_name,
 | ||||
| +                                     (const char *)el->values[0].data);
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_add_string failed.\n");
 | ||||
| +        return ret;;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return EOK;
 | ||||
| +}
 | ||||
| diff --git a/src/providers/ldap/sdap_async_groups.c b/src/providers/ldap/sdap_async_groups.c
 | ||||
| index 7779d499de87e2f0657512cb1f8e1980f9bf1f71..f9613ddd72d1e1796bc6a034daf98275b07a5c79 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_groups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_groups.c
 | ||||
| @@ -511,7 +511,6 @@ static int sdap_save_group(TALLOC_CTX *memctx,
 | ||||
|      bool posix_group; | ||||
|      bool use_id_mapping; | ||||
|      char *sid_str; | ||||
| -    const char *uuid;
 | ||||
|      struct sss_domain_info *subdomain; | ||||
|      int32_t ad_group_type; | ||||
|   | ||||
| @@ -549,22 +548,14 @@ static int sdap_save_group(TALLOC_CTX *memctx,
 | ||||
|      } | ||||
|   | ||||
|      /* Always store UUID if available */ | ||||
| -    ret = sysdb_attrs_get_string(attrs,
 | ||||
| -                                 opts->group_map[SDAP_AT_GROUP_UUID].sys_name,
 | ||||
| -                                 &uuid);
 | ||||
| -    if (ret == EOK) {
 | ||||
| -        ret = sysdb_attrs_add_string(group_attrs, SYSDB_UUID, uuid);
 | ||||
| -        if (ret != EOK) {
 | ||||
| -            DEBUG(SSSDBG_MINOR_FAILURE, "Could not add UUID string: [%s]\n",
 | ||||
| -                                         sss_strerror(ret));
 | ||||
| -            goto done;
 | ||||
| -        }
 | ||||
| -    } else if (ret == ENOENT) {
 | ||||
| -        DEBUG(SSSDBG_TRACE_ALL, "UUID not available for group [%s].\n",
 | ||||
| -                                 group_name);
 | ||||
| -    } else {
 | ||||
| -        DEBUG(SSSDBG_MINOR_FAILURE, "Could not identify UUID [%s]\n",
 | ||||
| -                                     sss_strerror(ret));
 | ||||
| +    ret = sysdb_handle_original_uuid(
 | ||||
| +                                   opts->group_map[SDAP_AT_GROUP_UUID].def_name,
 | ||||
| +                                   attrs,
 | ||||
| +                                   opts->group_map[SDAP_AT_GROUP_UUID].sys_name,
 | ||||
| +                                   group_attrs, SYSDB_UUID);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG((ret == ENOENT) ? SSSDBG_TRACE_ALL : SSSDBG_MINOR_FAILURE,
 | ||||
| +              "Failed to retrieve UUID [%d][%s].\n", ret, sss_strerror(ret));
 | ||||
|      } | ||||
|   | ||||
|      /* If this object has a SID available, we will determine the correct | ||||
| diff --git a/src/providers/ldap/sdap_async_initgroups.c b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| index 2fd235f2868b877c0e5d5d9f7b1b76d269eee8ee..96617aecc4e9c948bbbdccb1ba75e81577a19c70 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| @@ -196,8 +196,13 @@ errno_t sdap_add_incomplete_groups(struct sysdb_ctx *sysdb,
 | ||||
|                      original_dn = NULL; | ||||
|                  } | ||||
|   | ||||
| +                ret = sysdb_handle_original_uuid(
 | ||||
| +                                   opts->group_map[SDAP_AT_GROUP_UUID].def_name,
 | ||||
| +                                   ldap_groups[ai],
 | ||||
| +                                   opts->group_map[SDAP_AT_GROUP_UUID].sys_name,
 | ||||
| +                                   ldap_groups[ai], "uniqueIDstr");
 | ||||
|                  ret = sysdb_attrs_get_string(ldap_groups[ai], | ||||
| -                                             SYSDB_UUID,
 | ||||
| +                                             "uniqueIDstr",
 | ||||
|                                               &uuid); | ||||
|                  if (ret) { | ||||
|                      DEBUG(SSSDBG_FUNC_DATA, | ||||
| diff --git a/src/providers/ldap/sdap_async_users.c b/src/providers/ldap/sdap_async_users.c
 | ||||
| index 367e3d795ddd0db5c1c2f8e57d700419f371cd15..82b4df4793f5f0679046f259c251f5897af831cf 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_users.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_users.c
 | ||||
| @@ -140,7 +140,6 @@ int sdap_save_user(TALLOC_CTX *memctx,
 | ||||
|      TALLOC_CTX *tmpctx = NULL; | ||||
|      bool use_id_mapping; | ||||
|      char *sid_str; | ||||
| -    const char *uuid;
 | ||||
|      char *dom_sid_str = NULL; | ||||
|      struct sss_domain_info *subdomain; | ||||
|   | ||||
| @@ -179,21 +178,13 @@ int sdap_save_user(TALLOC_CTX *memctx,
 | ||||
|      } | ||||
|   | ||||
|      /* Always store UUID if available */ | ||||
| -    ret = sysdb_attrs_get_string(attrs,
 | ||||
| -                                 opts->user_map[SDAP_AT_USER_UUID].sys_name,
 | ||||
| -                                 &uuid);
 | ||||
| -    if (ret == EOK) {
 | ||||
| -        ret = sysdb_attrs_add_string(user_attrs, SYSDB_UUID, uuid);
 | ||||
| -        if (ret != EOK) {
 | ||||
| -            DEBUG(SSSDBG_MINOR_FAILURE, "Could not add UUID string: [%s]\n",
 | ||||
| -                                         sss_strerror(ret));
 | ||||
| -            goto done;
 | ||||
| -        }
 | ||||
| -    } else if (ret == ENOENT) {
 | ||||
| -        DEBUG(SSSDBG_TRACE_ALL, "UUID not available for user.\n");
 | ||||
| -    } else {
 | ||||
| -        DEBUG(SSSDBG_MINOR_FAILURE, "Could not identify UUID [%s]\n",
 | ||||
| -                                     sss_strerror(ret));
 | ||||
| +    ret = sysdb_handle_original_uuid(opts->user_map[SDAP_AT_USER_UUID].def_name,
 | ||||
| +                                     attrs,
 | ||||
| +                                     opts->user_map[SDAP_AT_USER_UUID].sys_name,
 | ||||
| +                                     user_attrs, SYSDB_UUID);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG((ret == ENOENT) ? SSSDBG_TRACE_ALL : SSSDBG_MINOR_FAILURE,
 | ||||
| +              "Failed to retrieve UUID [%d][%s].\n", ret, sss_strerror(ret));
 | ||||
|      } | ||||
|   | ||||
|      /* If this object has a SID available, we will determine the correct | ||||
| diff --git a/src/tests/cmocka/test_string_utils.c b/src/tests/cmocka/test_string_utils.c
 | ||||
| index e446387d6c429515360b23b428555befa915b49a..5d3fcf4fe454a0be3a4c72b778003481f66910bb 100644
 | ||||
| --- a/src/tests/cmocka/test_string_utils.c
 | ||||
| +++ b/src/tests/cmocka/test_string_utils.c
 | ||||
| @@ -133,3 +133,62 @@ void test_reverse_replace_whitespaces(void **state)
 | ||||
|      assert_true(check_leaks_pop(mem_ctx) == true); | ||||
|      talloc_free(mem_ctx); | ||||
|  } | ||||
| +
 | ||||
| +void test_guid_blob_to_string_buf(void **state)
 | ||||
| +{
 | ||||
| +    int ret;
 | ||||
| +    char str_buf[GUID_STR_BUF_SIZE];
 | ||||
| +    size_t c;
 | ||||
| +
 | ||||
| +    /* How to get test data:
 | ||||
| +     * The objectGUID attribute contains a 16byte long binary value
 | ||||
| +     * representing the GUID of the object. This data can be converted
 | ||||
| +     * manually to the string representation but it might be easier to use
 | ||||
| +     * LDAP_SERVER_EXTENDED_DN_OID as described in [MS-ADST] section
 | ||||
| +     * 3.1.1.3.4.1.5. This is an LDAP extended control which adds the GUID and
 | ||||
| +     * the SID to the DN of an object. This can be activate with the -E
 | ||||
| +     * ldapsearch option like:
 | ||||
| +     *
 | ||||
| +     *  ldapsearch -E 1.2.840.113556.1.4.529=::MAMCAQE= ....
 | ||||
| +     *
 | ||||
| +     * where 'MAMCAQE=' is the base64 encoded BER sequence with the integer
 | ||||
| +     * value 1 (see [MS-ADTS] for details about possible values).
 | ||||
| +     *
 | ||||
| +     * Btw, if you want to use the string representation of a GUID to search
 | ||||
| +     * for an object in AD you have to use the GUID as the search base in the
 | ||||
| +     * following form:
 | ||||
| +     *
 | ||||
| +     *  ldapsearch b '<GUID=fea80d8d-dbd5-4f84-8574-7db0477f962e>' ...
 | ||||
| +     *
 | ||||
| +     * (please note that the '<' and '>' are really needed).
 | ||||
| +     */
 | ||||
| +    struct test_data {
 | ||||
| +        uint8_t blob[16];
 | ||||
| +        const char *guid_str;
 | ||||
| +    } test_data[] = {
 | ||||
| +        {{0x8d, 0x0d, 0xa8, 0xfe, 0xd5, 0xdb, 0x84, 0x4f,
 | ||||
| +          0x85, 0x74, 0x7d, 0xb0, 0x47, 0x7f, 0x96, 0x2e},
 | ||||
| +        "fea80d8d-dbd5-4f84-8574-7db0477f962e"},
 | ||||
| +        {{0x91, 0x7e, 0x2e, 0xf8, 0x4e, 0x44, 0xfa, 0x4e,
 | ||||
| +         0xb1, 0x13, 0x08, 0x98, 0x63, 0x49, 0x6c, 0xc6},
 | ||||
| +        "f82e7e91-444e-4efa-b113-089863496cc6"},
 | ||||
| +        {{0}, NULL}
 | ||||
| +    };
 | ||||
| +
 | ||||
| +    ret = guid_blob_to_string_buf(NULL, str_buf, GUID_STR_BUF_SIZE);
 | ||||
| +    assert_int_equal(ret, EINVAL);
 | ||||
| +
 | ||||
| +    ret = guid_blob_to_string_buf((const uint8_t *) "1234567812345678", NULL,
 | ||||
| +                                  GUID_STR_BUF_SIZE);
 | ||||
| +    assert_int_equal(ret, EINVAL);
 | ||||
| +
 | ||||
| +    ret = guid_blob_to_string_buf((const uint8_t *) "1234567812345678", str_buf, 0);
 | ||||
| +    assert_int_equal(ret, EINVAL);
 | ||||
| +
 | ||||
| +    for (c = 0; test_data[c].guid_str != NULL; c++) {
 | ||||
| +        ret = guid_blob_to_string_buf(test_data[c].blob, str_buf,
 | ||||
| +                                      sizeof(str_buf));
 | ||||
| +        assert_int_equal(ret, EOK);
 | ||||
| +        assert_string_equal(test_data[c].guid_str, str_buf);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| diff --git a/src/tests/cmocka/test_sysdb_utils.c b/src/tests/cmocka/test_sysdb_utils.c
 | ||||
| new file mode 100644 | ||||
| index 0000000000000000000000000000000000000000..d217314ccb9234f8d0d329d87c5dc9e847acbcf0
 | ||||
| --- /dev/null
 | ||||
| +++ b/src/tests/cmocka/test_sysdb_utils.c
 | ||||
| @@ -0,0 +1,134 @@
 | ||||
| +/*
 | ||||
| +    SSSD
 | ||||
| +
 | ||||
| +    sysdb_utils - Tests for various sysdb calls
 | ||||
| +
 | ||||
| +    Authors:
 | ||||
| +        Sumit Bose <sbose@redhat.com>
 | ||||
| +
 | ||||
| +    Copyright (C) 2015 Red Hat
 | ||||
| +
 | ||||
| +    This program is free software; you can redistribute it and/or modify
 | ||||
| +    it under the terms of the GNU General Public License as published by
 | ||||
| +    the Free Software Foundation; either version 3 of the License, or
 | ||||
| +    (at your option) any later version.
 | ||||
| +
 | ||||
| +    This program is distributed in the hope that it will be useful,
 | ||||
| +    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| +    GNU General Public License for more details.
 | ||||
| +
 | ||||
| +    You should have received a copy of the GNU General Public License
 | ||||
| +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| +*/
 | ||||
| +
 | ||||
| +#include <stdarg.h>
 | ||||
| +#include <stddef.h>
 | ||||
| +#include <setjmp.h>
 | ||||
| +#include <cmocka.h>
 | ||||
| +#include <popt.h>
 | ||||
| +
 | ||||
| +#include "tests/cmocka/common_mock.h"
 | ||||
| +
 | ||||
| +#define IPA_UUID "bcae7c40-97eb-11e4-88ca-525400e96a6b"
 | ||||
| +
 | ||||
| +#define AD_GUID_BIN {0x8d, 0x0d, 0xa8, 0xfe, 0xd5, 0xdb, 0x84, 0x4f, \
 | ||||
| +                     0x85, 0x74, 0x7d, 0xb0, 0x47, 0x7f, 0x96, 0x2e};
 | ||||
| +#define AD_GUID "fea80d8d-dbd5-4f84-8574-7db0477f962e"
 | ||||
| +static void test_sysdb_handle_original_uuid(void **state)
 | ||||
| +{
 | ||||
| +    int ret;
 | ||||
| +    struct sysdb_attrs *src_attrs;
 | ||||
| +    struct sysdb_attrs *dest_attrs;
 | ||||
| +    const char *guid;
 | ||||
| +    uint8_t bin_guid[] = AD_GUID_BIN;
 | ||||
| +    struct ldb_val guid_val = {bin_guid, 16};
 | ||||
| +
 | ||||
| +    ret = sysdb_handle_original_uuid(NULL, NULL, NULL, NULL, NULL);
 | ||||
| +    assert_int_equal(ret, EINVAL);
 | ||||
| +
 | ||||
| +    src_attrs = sysdb_new_attrs(NULL);
 | ||||
| +    assert_non_null(src_attrs);
 | ||||
| +
 | ||||
| +    dest_attrs = sysdb_new_attrs(NULL);
 | ||||
| +    assert_non_null(dest_attrs);
 | ||||
| +
 | ||||
| +    ret = sysdb_handle_original_uuid("xyz", src_attrs, "abc", dest_attrs,
 | ||||
| +                                     "def");
 | ||||
| +    assert_int_equal(ret, ENOENT);
 | ||||
| +
 | ||||
| +    ret = sysdb_attrs_add_val(src_attrs, "GUID", &guid_val);
 | ||||
| +    assert_int_equal(ret, EOK);
 | ||||
| +
 | ||||
| +    ret = sysdb_attrs_add_string(src_attrs, "UUID", IPA_UUID);
 | ||||
| +    assert_int_equal(ret, EOK);
 | ||||
| +
 | ||||
| +    ret = sysdb_handle_original_uuid("objectGUID", src_attrs, "GUID",
 | ||||
| +                                     dest_attrs, "def");
 | ||||
| +    assert_int_equal(ret, EOK);
 | ||||
| +    ret = sysdb_attrs_get_string(dest_attrs, "def", &guid);
 | ||||
| +    assert_int_equal(ret, EOK);
 | ||||
| +    assert_string_equal(guid, AD_GUID);
 | ||||
| +
 | ||||
| +    ret = sysdb_handle_original_uuid("ipaUniqueID", src_attrs, "UUID",
 | ||||
| +                                     dest_attrs, "ghi");
 | ||||
| +    assert_int_equal(ret, EOK);
 | ||||
| +    ret = sysdb_attrs_get_string(dest_attrs, "ghi", &guid);
 | ||||
| +    assert_int_equal(ret, EOK);
 | ||||
| +    assert_string_equal(guid, IPA_UUID);
 | ||||
| +
 | ||||
| +    talloc_free(src_attrs);
 | ||||
| +    src_attrs = sysdb_new_attrs(NULL);
 | ||||
| +    assert_non_null(src_attrs);
 | ||||
| +
 | ||||
| +    /* check objectGUID with length other than 16 */
 | ||||
| +    ret = sysdb_attrs_add_string(src_attrs, "GUID", IPA_UUID);
 | ||||
| +    assert_int_equal(ret, EOK);
 | ||||
| +    ret = sysdb_handle_original_uuid("objectGUID", src_attrs, "GUID",
 | ||||
| +                                     dest_attrs, "jkl");
 | ||||
| +    assert_int_equal(ret, EOK);
 | ||||
| +    ret = sysdb_attrs_get_string(dest_attrs, "jkl", &guid);
 | ||||
| +    assert_int_equal(ret, EOK);
 | ||||
| +    assert_string_equal(guid, IPA_UUID);
 | ||||
| +
 | ||||
| +    talloc_free(src_attrs);
 | ||||
| +    talloc_free(dest_attrs);
 | ||||
| +}
 | ||||
| +
 | ||||
| +int main(int argc, const char *argv[])
 | ||||
| +{
 | ||||
| +    int rv;
 | ||||
| +    poptContext pc;
 | ||||
| +    int opt;
 | ||||
| +    struct poptOption long_options[] = {
 | ||||
| +        POPT_AUTOHELP
 | ||||
| +        SSSD_DEBUG_OPTS
 | ||||
| +        POPT_TABLEEND
 | ||||
| +    };
 | ||||
| +
 | ||||
| +    const UnitTest tests[] = {
 | ||||
| +        unit_test(test_sysdb_handle_original_uuid),
 | ||||
| +    };
 | ||||
| +
 | ||||
| +    /* Set debug level to invalid value so we can deside if -d 0 was used. */
 | ||||
| +    debug_level = SSSDBG_INVALID;
 | ||||
| +
 | ||||
| +    pc = poptGetContext(argv[0], argc, argv, long_options, 0);
 | ||||
| +    while((opt = poptGetNextOpt(pc)) != -1) {
 | ||||
| +        switch(opt) {
 | ||||
| +        default:
 | ||||
| +            fprintf(stderr, "\nInvalid option %s: %s\n\n",
 | ||||
| +                    poptBadOption(pc, 0), poptStrerror(opt));
 | ||||
| +            poptPrintUsage(pc, stderr, 0);
 | ||||
| +            return 1;
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +    poptFreeContext(pc);
 | ||||
| +
 | ||||
| +    DEBUG_CLI_INIT(debug_level);
 | ||||
| +
 | ||||
| +    tests_set_cwd();
 | ||||
| +    rv = run_tests(tests);
 | ||||
| +
 | ||||
| +    return rv;
 | ||||
| +}
 | ||||
| diff --git a/src/tests/cmocka/test_utils.c b/src/tests/cmocka/test_utils.c
 | ||||
| index 2203e2c49efacab27e9cf4c6c699319cfdf5370c..4cc6ec85add6bb8f9ae17ddc9af38b0316c9d49f 100644
 | ||||
| --- a/src/tests/cmocka/test_utils.c
 | ||||
| +++ b/src/tests/cmocka/test_utils.c
 | ||||
| @@ -1127,6 +1127,7 @@ int main(int argc, const char *argv[])
 | ||||
|          cmocka_unit_test(test_textual_public_key), | ||||
|          cmocka_unit_test(test_replace_whitespaces), | ||||
|          cmocka_unit_test(test_reverse_replace_whitespaces), | ||||
| +        cmocka_unit_test(test_guid_blob_to_string_buf),
 | ||||
|          cmocka_unit_test_setup_teardown(test_add_strings_lists, | ||||
|                                          setup_add_strings_lists, | ||||
|                                          teardown_add_strings_lists), | ||||
| diff --git a/src/tests/cmocka/test_utils.h b/src/tests/cmocka/test_utils.h
 | ||||
| index f85ac2f2b3c50a60099970752b06adbad38b9fd1..61ef7e43a82649d775d9b932def9e957b0761bed 100644
 | ||||
| --- a/src/tests/cmocka/test_utils.h
 | ||||
| +++ b/src/tests/cmocka/test_utils.h
 | ||||
| @@ -29,5 +29,6 @@ void test_textual_public_key(void **state);
 | ||||
|  /* from src/tests/cmocka/test_string_utils.c */ | ||||
|  void test_replace_whitespaces(void **state); | ||||
|  void test_reverse_replace_whitespaces(void **state); | ||||
| +void test_guid_blob_to_string_buf(void **state);
 | ||||
|   | ||||
|  #endif /* __TESTS__CMOCKA__TEST_UTILS_H__ */ | ||||
| diff --git a/src/tests/cwrap/Makefile.am b/src/tests/cwrap/Makefile.am
 | ||||
| index c1991a19c3a39f957b6547854126ff6d219394e0..b805e834977f60d6ba2efdf0f700061bb5e0e264 100644
 | ||||
| --- a/src/tests/cwrap/Makefile.am
 | ||||
| +++ b/src/tests/cwrap/Makefile.am
 | ||||
| @@ -78,6 +78,7 @@ server_tests_SOURCES = \
 | ||||
|      ../../../src/util/atomic_io.c \ | ||||
|      ../../../src/util/signal.c \ | ||||
|      ../../../src/util/util.c \ | ||||
| +    ../../../src/util/string_utils.c \
 | ||||
|      ../../../src/util/strtonum.c \ | ||||
|      ../../../src/util/util_errors.c \ | ||||
|      ../../../src/util/safe-format-string.c \ | ||||
| @@ -115,6 +116,7 @@ usertools_tests_SOURCES = \
 | ||||
|      ../../../src/util/domain_info_utils.c \ | ||||
|      ../../../src/util/safe-format-string.c \ | ||||
|      ../../../src/util/usertools.c \ | ||||
| +    ../../../src/util/string_utils.c \
 | ||||
|      ../../../src/util/strtonum.c \ | ||||
|      ../../../src/util/backup_file.c \ | ||||
|      ../../../src/util/atomic_io.c \ | ||||
| diff --git a/src/util/string_utils.c b/src/util/string_utils.c
 | ||||
| index a39b950e852de7ed43d6e8a32de3e7fb08a0dc56..71b2a092018076fd9c20ef9ac39a11964876cfc3 100644
 | ||||
| --- a/src/util/string_utils.c
 | ||||
| +++ b/src/util/string_utils.c
 | ||||
| @@ -83,3 +83,28 @@ char * sss_reverse_replace_space(TALLOC_CTX *mem_ctx,
 | ||||
|   | ||||
|      return replace_char(mem_ctx, orig_name, subst, ' '); | ||||
|  } | ||||
| +
 | ||||
| +errno_t guid_blob_to_string_buf(const uint8_t *blob, char *str_buf,
 | ||||
| +                                size_t buf_size)
 | ||||
| +{
 | ||||
| +    int ret;
 | ||||
| +
 | ||||
| +    if (blob == NULL || str_buf == NULL || buf_size < GUID_STR_BUF_SIZE) {
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "Buffer too small.\n");
 | ||||
| +        return EINVAL;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = snprintf(str_buf, buf_size,
 | ||||
| +         "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
 | ||||
| +         blob[3], blob[2], blob[1], blob[0],
 | ||||
| +         blob[5], blob[4],
 | ||||
| +         blob[7], blob[6],
 | ||||
| +         blob[8], blob[9],
 | ||||
| +         blob[10], blob[11],blob[12], blob[13],blob[14], blob[15]);;
 | ||||
| +    if (ret != (GUID_STR_BUF_SIZE -1)) {
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "snprintf failed.\n");
 | ||||
| +        return EIO;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return EOK;
 | ||||
| +}
 | ||||
| diff --git a/src/util/util.h b/src/util/util.h
 | ||||
| index 22a67a55855282441379477236a323362c8bdb4d..91df09914abfa1a72e9280ab708e11abf9e07e18 100644
 | ||||
| --- a/src/util/util.h
 | ||||
| +++ b/src/util/util.h
 | ||||
| @@ -618,6 +618,13 @@ char * sss_reverse_replace_space(TALLOC_CTX *mem_ctx,
 | ||||
|                                   const char *orig_name, | ||||
|                                   const char replace_char); | ||||
|   | ||||
| +#define GUID_BIN_LENGTH 16
 | ||||
| +/* 16 2-digit hex values + 4 dashes + terminating 0 */
 | ||||
| +#define GUID_STR_BUF_SIZE (2 * GUID_BIN_LENGTH + 4 + 1)
 | ||||
| +
 | ||||
| +errno_t guid_blob_to_string_buf(const uint8_t *blob, char *str_buf,
 | ||||
| +                                size_t buf_size);
 | ||||
| +
 | ||||
|  /* from become_user.c */ | ||||
|  errno_t become_user(uid_t uid, gid_t gid); | ||||
|  struct sss_creds; | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										118
									
								
								0044-Resolv-re-read-SRV-query-every-time-if-its-TTL-is-0.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								0044-Resolv-re-read-SRV-query-every-time-if-its-TTL-is-0.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,118 @@ | ||||
| From 9dd8510d5d95d8ff7170f29ef4d9c603b3573cfe Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Mon, 23 Mar 2015 21:09:53 +0100 | ||||
| Subject: [PATCH 44/99] Resolv: re-read SRV query every time if its TTL is 0 | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| We should make sure the client re-checks the SRV query each request if | ||||
| the SRV query is 0. | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit 9797aa5907191cef5db8279e20ec75fd0abbe980) | ||||
| ---
 | ||||
|  src/providers/fail_over.c      |  2 +- | ||||
|  src/tests/cmocka/test_fo_srv.c | 31 ++++++++++++++++++++++++++----- | ||||
|  2 files changed, 27 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/fail_over.c b/src/providers/fail_over.c
 | ||||
| index 8142081526d7902946e756ec05774c471126545e..6d835ae0efdfdf96532e8458e12238ba17910a4f 100644
 | ||||
| --- a/src/providers/fail_over.c
 | ||||
| +++ b/src/providers/fail_over.c
 | ||||
| @@ -275,7 +275,7 @@ get_srv_data_status(struct srv_data *data)
 | ||||
|          timeout = data->ttl; | ||||
|      } | ||||
|   | ||||
| -    if (timeout && STATUS_DIFF(data, tv) > timeout) {
 | ||||
| +    if (STATUS_DIFF(data, tv) > timeout) {
 | ||||
|          switch(data->srv_lookup_status) { | ||||
|          case SRV_EXPIRED: | ||||
|          case SRV_NEUTRAL: | ||||
| diff --git a/src/tests/cmocka/test_fo_srv.c b/src/tests/cmocka/test_fo_srv.c
 | ||||
| index 7a6321006d8383ed901fe9d5df3fddc514c53550..e5c5e4fe3b818ca2df0ab7bcd1a83719fefba191 100644
 | ||||
| --- a/src/tests/cmocka/test_fo_srv.c
 | ||||
| +++ b/src/tests/cmocka/test_fo_srv.c
 | ||||
| @@ -200,6 +200,7 @@ struct test_fo_srv_ctx {
 | ||||
|      struct fo_resolve_srv_dns_ctx *srv_ctx; | ||||
|      struct fo_service *fo_svc; | ||||
|      struct sss_test_ctx *ctx; | ||||
| +    int ttl;
 | ||||
|  }; | ||||
|   | ||||
|  int test_fo_srv_data_cmp(void *ud1, void *ud2) | ||||
| @@ -431,15 +432,23 @@ static void test_fo_srv_done4(struct tevent_req *req)
 | ||||
|  /* Make sure that two queries more than TTL seconds apart resolve | ||||
|   * into two different lists | ||||
|   */ | ||||
| +static void test_fo_srv_ttl_change_step(struct test_fo_srv_ctx *test_ctx);
 | ||||
|  static void test_fo_srv_before(struct tevent_req *req); | ||||
|  static void test_fo_srv_after(struct tevent_req *req); | ||||
|   | ||||
|  void test_fo_srv_ttl_change(void **state) | ||||
|  { | ||||
| -    errno_t ret;
 | ||||
| -    struct tevent_req *req;
 | ||||
|      struct test_fo_srv_ctx *test_ctx = | ||||
|          talloc_get_type(*state, struct test_fo_srv_ctx); | ||||
| +
 | ||||
| +    test_ctx->ttl = TEST_SRV_SHORT_TTL;
 | ||||
| +    test_fo_srv_ttl_change_step(test_ctx);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void test_fo_srv_ttl_change_step(struct test_fo_srv_ctx *test_ctx)
 | ||||
| +{
 | ||||
| +    errno_t ret;
 | ||||
| +    struct tevent_req *req;
 | ||||
|      struct ares_srv_reply *s1; | ||||
|      struct ares_srv_reply *s2; | ||||
|      char *dns_domain; | ||||
| @@ -465,7 +474,7 @@ void test_fo_srv_ttl_change(void **state)
 | ||||
|      dns_domain = talloc_strdup(test_ctx, "sssd.com"); | ||||
|      assert_non_null(dns_domain); | ||||
|   | ||||
| -    mock_srv_results(s1, TEST_SRV_SHORT_TTL, dns_domain);
 | ||||
| +    mock_srv_results(s1, test_ctx->ttl, dns_domain);
 | ||||
|   | ||||
|      ret = fo_add_srv_server(test_ctx->fo_svc, "_ldap", "sssd.com", | ||||
|                              "sssd.local", "tcp", test_ctx); | ||||
| @@ -527,8 +536,8 @@ static void test_fo_srv_before(struct tevent_req *req)
 | ||||
|      dns_domain = talloc_strdup(test_ctx, "sssd.com"); | ||||
|      assert_non_null(dns_domain); | ||||
|   | ||||
| -    mock_srv_results(s1, TEST_SRV_SHORT_TTL, dns_domain);
 | ||||
| -    sleep(TEST_SRV_SHORT_TTL + 1);
 | ||||
| +    mock_srv_results(s1, test_ctx->ttl, dns_domain);
 | ||||
| +    sleep(test_ctx->ttl + 1);
 | ||||
|   | ||||
|      req = fo_resolve_service_send(test_ctx, test_ctx->ctx->ev, | ||||
|                                    test_ctx->resolv, test_ctx->fo_ctx, | ||||
| @@ -555,6 +564,15 @@ static void test_fo_srv_after(struct tevent_req *req)
 | ||||
|      test_ctx->ctx->done = true; | ||||
|  } | ||||
|   | ||||
| +void test_fo_srv_ttl_zero(void **state)
 | ||||
| +{
 | ||||
| +    struct test_fo_srv_ctx *test_ctx =
 | ||||
| +        talloc_get_type(*state, struct test_fo_srv_ctx);
 | ||||
| +
 | ||||
| +    test_ctx->ttl = 0;
 | ||||
| +    test_fo_srv_ttl_change_step(test_ctx);
 | ||||
| +}
 | ||||
| +
 | ||||
|  int main(int argc, const char *argv[]) | ||||
|  { | ||||
|      int rv; | ||||
| @@ -573,6 +591,9 @@ int main(int argc, const char *argv[])
 | ||||
|          cmocka_unit_test_setup_teardown(test_fo_srv_ttl_change, | ||||
|                                          test_fo_srv_setup, | ||||
|                                          test_fo_srv_teardown), | ||||
| +        cmocka_unit_test_setup_teardown(test_fo_srv_ttl_zero,
 | ||||
| +                                        test_fo_srv_setup,
 | ||||
| +                                        test_fo_srv_teardown),
 | ||||
|      }; | ||||
|   | ||||
|      /* Set debug level to invalid value so we can deside if -d 0 was used. */ | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										315
									
								
								0045-IPA-Use-custom-error-codes-when-validating-HBAC-rule.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										315
									
								
								0045-IPA-Use-custom-error-codes-when-validating-HBAC-rule.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,315 @@ | ||||
| From 319f9710185929186778814b48f2227359d4f8f4 Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Mon, 16 Mar 2015 10:35:59 +0100 | ||||
| Subject: [PATCH 45/99] IPA: Use custom error codes when validating HBAC rules | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| https://fedorahosted.org/sssd/ticket/2603 | ||||
| 
 | ||||
| Instead of reusing EINVAL/ENOENT, use more descriptive error codes. This | ||||
| will be useful in the next patch where we act on certain codes. | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit 1243e093fd31c5660adf1bb3dd477d6935a755be) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_hbac_common.c   | 10 +++++----- | ||||
|  src/providers/ipa/ipa_hbac_hosts.c    | 16 ++++++++-------- | ||||
|  src/providers/ipa/ipa_hbac_services.c | 16 ++++++++-------- | ||||
|  src/providers/ipa/ipa_hbac_users.c    | 16 ++++++++-------- | ||||
|  src/util/util_errors.c                |  2 ++ | ||||
|  src/util/util_errors.h                |  2 ++ | ||||
|  6 files changed, 33 insertions(+), 29 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_hbac_common.c b/src/providers/ipa/ipa_hbac_common.c
 | ||||
| index 7d68aa5125682e1b43012ac978d42a0bbd2c5d55..d537db1ea591589ad687a432fb0ebba3dd4fa42a 100644
 | ||||
| --- a/src/providers/ipa/ipa_hbac_common.c
 | ||||
| +++ b/src/providers/ipa/ipa_hbac_common.c
 | ||||
| @@ -567,7 +567,7 @@ hbac_eval_user_element(TALLOC_CTX *mem_ctx,
 | ||||
|   | ||||
|          ret = get_ipa_groupname(users->groups, sysdb, member_dn, | ||||
|                                  &users->groups[num_groups]); | ||||
| -        if (ret != EOK && ret != ENOENT) {
 | ||||
| +        if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) {
 | ||||
|              DEBUG(SSSDBG_MINOR_FAILURE, "Parse error on [%s]\n", member_dn); | ||||
|              goto done; | ||||
|          } else if (ret == EOK) { | ||||
| @@ -676,9 +676,9 @@ hbac_eval_service_element(TALLOC_CTX *mem_ctx,
 | ||||
|          ret = get_ipa_servicegroupname(tmp_ctx, sysdb, | ||||
|                                         (const char *)el->values[i].data, | ||||
|                                         &name); | ||||
| -        if (ret != EOK && ret != ENOENT) goto done;
 | ||||
| +        if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) goto done;
 | ||||
|   | ||||
| -        /* ENOENT means we had a memberOf entry that wasn't a
 | ||||
| +        /* ERR_UNEXPECTED_ENTRY_TYPE means we had a memberOf entry that wasn't a
 | ||||
|           * service group. We'll just ignore those (could be | ||||
|           * HBAC rules) | ||||
|           */ | ||||
| @@ -783,9 +783,9 @@ hbac_eval_host_element(TALLOC_CTX *mem_ctx,
 | ||||
|          ret = get_ipa_hostgroupname(tmp_ctx, sysdb, | ||||
|                                      (const char *)el->values[i].data, | ||||
|                                      &name); | ||||
| -        if (ret != EOK && ret != ENOENT) goto done;
 | ||||
| +        if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) goto done;
 | ||||
|   | ||||
| -        /* ENOENT means we had a memberOf entry that wasn't a
 | ||||
| +        /* ERR_UNEXPECTED_ENTRY_TYPE means we had a memberOf entry that wasn't a
 | ||||
|           * host group. We'll just ignore those (could be | ||||
|           * HBAC rules) | ||||
|           */ | ||||
| diff --git a/src/providers/ipa/ipa_hbac_hosts.c b/src/providers/ipa/ipa_hbac_hosts.c
 | ||||
| index 656e0e5654a2390093fb5a7c4d7254b87be0589f..d331cdfabb489914658487734042086361c7e7b1 100644
 | ||||
| --- a/src/providers/ipa/ipa_hbac_hosts.c
 | ||||
| +++ b/src/providers/ipa/ipa_hbac_hosts.c
 | ||||
| @@ -362,14 +362,14 @@ get_ipa_hostgroupname(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      if (!ldb_dn_validate(dn)) { | ||||
| -        ret = EINVAL;
 | ||||
| +        ret = ERR_MALFORMED_ENTRY;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
|      if (ldb_dn_get_comp_num(dn) < 4) { | ||||
|          /* RDN, hostgroups, accounts, and at least one DC= */ | ||||
|          /* If it's fewer, it's not a group DN */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -379,7 +379,7 @@ get_ipa_hostgroupname(TALLOC_CTX *mem_ctx,
 | ||||
|          /* Shouldn't happen if ldb_dn_validate() | ||||
|           * passed, but we'll be careful. | ||||
|           */ | ||||
| -        ret = EINVAL;
 | ||||
| +        ret = ERR_MALFORMED_ENTRY;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -387,7 +387,7 @@ get_ipa_hostgroupname(TALLOC_CTX *mem_ctx,
 | ||||
|          /* RDN has the wrong attribute name. | ||||
|           * It's not a host. | ||||
|           */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -395,7 +395,7 @@ get_ipa_hostgroupname(TALLOC_CTX *mem_ctx,
 | ||||
|      hostgroup_comp_name = ldb_dn_get_component_name(dn, 1); | ||||
|      if (strcasecmp("cn", hostgroup_comp_name) != 0) { | ||||
|          /* The second component name is not "cn" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -404,7 +404,7 @@ get_ipa_hostgroupname(TALLOC_CTX *mem_ctx,
 | ||||
|                      (const char *) hostgroup_comp_val->data, | ||||
|                      hostgroup_comp_val->length) != 0) { | ||||
|          /* The second component value is not "hostgroups" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -412,7 +412,7 @@ get_ipa_hostgroupname(TALLOC_CTX *mem_ctx,
 | ||||
|      account_comp_name = ldb_dn_get_component_name(dn, 2); | ||||
|      if (strcasecmp("cn", account_comp_name) != 0) { | ||||
|          /* The third component name is not "cn" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -421,7 +421,7 @@ get_ipa_hostgroupname(TALLOC_CTX *mem_ctx,
 | ||||
|                      (const char *) account_comp_val->data, | ||||
|                      account_comp_val->length) != 0) { | ||||
|          /* The third component value is not "accounts" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| diff --git a/src/providers/ipa/ipa_hbac_services.c b/src/providers/ipa/ipa_hbac_services.c
 | ||||
| index 3040ce68a68520d7eee0ec478ee0adbfb80eb083..35ee003effb5ac933843cbc3bd662f81a58246ad 100644
 | ||||
| --- a/src/providers/ipa/ipa_hbac_services.c
 | ||||
| +++ b/src/providers/ipa/ipa_hbac_services.c
 | ||||
| @@ -606,14 +606,14 @@ get_ipa_servicegroupname(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      if (!ldb_dn_validate(dn)) { | ||||
| -        ret = EINVAL;
 | ||||
| +        ret = ERR_MALFORMED_ENTRY;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
|      if (ldb_dn_get_comp_num(dn) < 4) { | ||||
|          /* RDN, services, hbac, and at least one DC= */ | ||||
|          /* If it's fewer, it's not a group DN */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -623,7 +623,7 @@ get_ipa_servicegroupname(TALLOC_CTX *mem_ctx,
 | ||||
|          /* Shouldn't happen if ldb_dn_validate() | ||||
|           * passed, but we'll be careful. | ||||
|           */ | ||||
| -        ret = EINVAL;
 | ||||
| +        ret = ERR_MALFORMED_ENTRY;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -631,7 +631,7 @@ get_ipa_servicegroupname(TALLOC_CTX *mem_ctx,
 | ||||
|          /* RDN has the wrong attribute name. | ||||
|           * It's not a service. | ||||
|           */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -639,7 +639,7 @@ get_ipa_servicegroupname(TALLOC_CTX *mem_ctx,
 | ||||
|      svc_comp_name = ldb_dn_get_component_name(dn, 1); | ||||
|      if (strcasecmp("cn", svc_comp_name) != 0) { | ||||
|          /* The second component name is not "cn" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -648,7 +648,7 @@ get_ipa_servicegroupname(TALLOC_CTX *mem_ctx,
 | ||||
|                      (const char *) svc_comp_val->data, | ||||
|                      svc_comp_val->length) != 0) { | ||||
|          /* The second component value is not "hbacservicegroups" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -656,7 +656,7 @@ get_ipa_servicegroupname(TALLOC_CTX *mem_ctx,
 | ||||
|      hbac_comp_name = ldb_dn_get_component_name(dn, 2); | ||||
|      if (strcasecmp("cn", hbac_comp_name) != 0) { | ||||
|          /* The third component name is not "cn" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -665,7 +665,7 @@ get_ipa_servicegroupname(TALLOC_CTX *mem_ctx,
 | ||||
|                      (const char *) hbac_comp_val->data, | ||||
|                      hbac_comp_val->length) != 0) { | ||||
|          /* The third component value is not "hbac" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| diff --git a/src/providers/ipa/ipa_hbac_users.c b/src/providers/ipa/ipa_hbac_users.c
 | ||||
| index ebf4bf9d591135e19492a89e2fab4aac05f873d9..a8d52ffa51ba1a04cf0101cb00537c58d1a4848d 100644
 | ||||
| --- a/src/providers/ipa/ipa_hbac_users.c
 | ||||
| +++ b/src/providers/ipa/ipa_hbac_users.c
 | ||||
| @@ -60,14 +60,14 @@ get_ipa_groupname(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      if (!ldb_dn_validate(dn)) { | ||||
| -        ret = EINVAL;
 | ||||
| +        ret = ERR_MALFORMED_ENTRY;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
|      if (ldb_dn_get_comp_num(dn) < 4) { | ||||
|          /* RDN, groups, accounts, and at least one DC= */ | ||||
|          /* If it's fewer, it's not a group DN */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -77,7 +77,7 @@ get_ipa_groupname(TALLOC_CTX *mem_ctx,
 | ||||
|          /* Shouldn't happen if ldb_dn_validate() | ||||
|           * passed, but we'll be careful. | ||||
|           */ | ||||
| -        ret = EINVAL;
 | ||||
| +        ret = ERR_MALFORMED_ENTRY;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -85,7 +85,7 @@ get_ipa_groupname(TALLOC_CTX *mem_ctx,
 | ||||
|          /* RDN has the wrong attribute name. | ||||
|           * It's not a group. | ||||
|           */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -93,7 +93,7 @@ get_ipa_groupname(TALLOC_CTX *mem_ctx,
 | ||||
|      group_comp_name = ldb_dn_get_component_name(dn, 1); | ||||
|      if (strcasecmp("cn", group_comp_name) != 0) { | ||||
|          /* The second component name is not "cn" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -102,7 +102,7 @@ get_ipa_groupname(TALLOC_CTX *mem_ctx,
 | ||||
|                      (const char *) group_comp_val->data, | ||||
|                      group_comp_val->length) != 0) { | ||||
|          /* The second component value is not "groups" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -110,7 +110,7 @@ get_ipa_groupname(TALLOC_CTX *mem_ctx,
 | ||||
|      account_comp_name = ldb_dn_get_component_name(dn, 2); | ||||
|      if (strcasecmp("cn", account_comp_name) != 0) { | ||||
|          /* The third component name is not "cn" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -119,7 +119,7 @@ get_ipa_groupname(TALLOC_CTX *mem_ctx,
 | ||||
|                      (const char *) account_comp_val->data, | ||||
|                      account_comp_val->length) != 0) { | ||||
|          /* The third component value is not "accounts" */ | ||||
| -        ret = ENOENT;
 | ||||
| +        ret = ERR_UNEXPECTED_ENTRY_TYPE;
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| diff --git a/src/util/util_errors.c b/src/util/util_errors.c
 | ||||
| index dad988bce2515c3614a19205f038053152916a16..b481210aa21e05eda3a4c5b0699836d085baa892 100644
 | ||||
| --- a/src/util/util_errors.c
 | ||||
| +++ b/src/util/util_errors.c
 | ||||
| @@ -69,6 +69,8 @@ struct err_string error_to_str[] = {
 | ||||
|      { "Error setting SELinux user context" }, /* ERR_SELINUX_CONTEXT */ | ||||
|      { "Username format not allowed by re_expression" }, /* ERR_REGEX_NOMATCH */ | ||||
|      { "Time specification not supported" }, /* ERR_TIMESPEC_NOT_SUPPORTED */ | ||||
| +    { "Malformed cache entry" }, /* ERR_MALFORMED_ENTRY */
 | ||||
| +    { "Unexpected cache entry type" }, /* ERR_UNEXPECTED_ENTRY_TYPE */
 | ||||
|      { "ERR_LAST" } /* ERR_LAST */ | ||||
|  }; | ||||
|   | ||||
| diff --git a/src/util/util_errors.h b/src/util/util_errors.h
 | ||||
| index 5d657c707dabc74cf5771af2b601500ba2664ee0..b6a667fffbbddc77de53e501e185defbd30b23e0 100644
 | ||||
| --- a/src/util/util_errors.h
 | ||||
| +++ b/src/util/util_errors.h
 | ||||
| @@ -91,6 +91,8 @@ enum sssd_errors {
 | ||||
|      ERR_SELINUX_CONTEXT, | ||||
|      ERR_REGEX_NOMATCH, | ||||
|      ERR_TIMESPEC_NOT_SUPPORTED, | ||||
| +    ERR_MALFORMED_ENTRY,
 | ||||
| +    ERR_UNEXPECTED_ENTRY_TYPE,
 | ||||
|      ERR_LAST            /* ALWAYS LAST */ | ||||
|  }; | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										154
									
								
								0046-IPA-Drop-useless-sysdb-parameter.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								0046-IPA-Drop-useless-sysdb-parameter.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,154 @@ | ||||
| From a7c2e661a9bedd114941c9d5f33d20b70c18e878 Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Mon, 16 Mar 2015 11:00:09 +0100 | ||||
| Subject: [PATCH 46/99] IPA: Drop useless sysdb parameter | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| https://fedorahosted.org/sssd/ticket/2603 | ||||
| 
 | ||||
| It's better to dereference the domain structure. | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit 64d8e2df816323a004bf6e7e9d05ba373b9e033d) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_hbac_common.c | 26 ++++++++++---------------- | ||||
|  1 file changed, 10 insertions(+), 16 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_hbac_common.c b/src/providers/ipa/ipa_hbac_common.c
 | ||||
| index d537db1ea591589ad687a432fb0ebba3dd4fa42a..8436b7e2d1e9b745e3265c319669cf196f610ee1 100644
 | ||||
| --- a/src/providers/ipa/ipa_hbac_common.c
 | ||||
| +++ b/src/providers/ipa/ipa_hbac_common.c
 | ||||
| @@ -401,21 +401,18 @@ done:
 | ||||
|   | ||||
|  static errno_t | ||||
|  hbac_eval_user_element(TALLOC_CTX *mem_ctx, | ||||
| -                       struct sysdb_ctx *sysdb,
 | ||||
|                         struct sss_domain_info *domain, | ||||
|                         const char *username, | ||||
|                         struct hbac_request_element **user_element); | ||||
|   | ||||
|  static errno_t | ||||
|  hbac_eval_service_element(TALLOC_CTX *mem_ctx, | ||||
| -                          struct sysdb_ctx *sysdb,
 | ||||
|                            struct sss_domain_info *domain, | ||||
|                            const char *servicename, | ||||
|                            struct hbac_request_element **svc_element); | ||||
|   | ||||
|  static errno_t | ||||
|  hbac_eval_host_element(TALLOC_CTX *mem_ctx, | ||||
| -                       struct sysdb_ctx *sysdb,
 | ||||
|                         struct sss_domain_info *domain, | ||||
|                         const char *hostname, | ||||
|                         struct hbac_request_element **host_element); | ||||
| @@ -455,16 +452,16 @@ hbac_ctx_to_eval_request(TALLOC_CTX *mem_ctx,
 | ||||
|              ret = ENOMEM; | ||||
|              goto done; | ||||
|          } | ||||
| -        ret = hbac_eval_user_element(eval_req, user_dom->sysdb, user_dom,
 | ||||
| +        ret = hbac_eval_user_element(eval_req, user_dom,
 | ||||
|                                       pd->user, &eval_req->user); | ||||
|      } else { | ||||
| -        ret = hbac_eval_user_element(eval_req, domain->sysdb, domain,
 | ||||
| +        ret = hbac_eval_user_element(eval_req, domain,
 | ||||
|                                       pd->user, &eval_req->user); | ||||
|      } | ||||
|      if (ret != EOK) goto done; | ||||
|   | ||||
|      /* Get the PAM service and service groups */ | ||||
| -    ret = hbac_eval_service_element(eval_req, domain->sysdb, domain,
 | ||||
| +    ret = hbac_eval_service_element(eval_req, domain,
 | ||||
|                                      pd->service, &eval_req->service); | ||||
|      if (ret != EOK) goto done; | ||||
|   | ||||
| @@ -480,7 +477,7 @@ hbac_ctx_to_eval_request(TALLOC_CTX *mem_ctx,
 | ||||
|          rhost = pd->rhost; | ||||
|      } | ||||
|   | ||||
| -    ret = hbac_eval_host_element(eval_req, domain->sysdb, domain,
 | ||||
| +    ret = hbac_eval_host_element(eval_req, domain,
 | ||||
|                                   rhost, &eval_req->srchost); | ||||
|      if (ret != EOK) goto done; | ||||
|   | ||||
| @@ -493,7 +490,7 @@ hbac_ctx_to_eval_request(TALLOC_CTX *mem_ctx,
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    ret = hbac_eval_host_element(eval_req, domain->sysdb, domain,
 | ||||
| +    ret = hbac_eval_host_element(eval_req, domain,
 | ||||
|                                   thost, &eval_req->targethost); | ||||
|      if (ret != EOK) goto done; | ||||
|   | ||||
| @@ -508,7 +505,6 @@ done:
 | ||||
|   | ||||
|  static errno_t | ||||
|  hbac_eval_user_element(TALLOC_CTX *mem_ctx, | ||||
| -                       struct sysdb_ctx *sysdb,
 | ||||
|                         struct sss_domain_info *domain, | ||||
|                         const char *username, | ||||
|                         struct hbac_request_element **user_element) | ||||
| @@ -565,7 +561,7 @@ hbac_eval_user_element(TALLOC_CTX *mem_ctx,
 | ||||
|      for (i = 0; i < el->num_values; i++) { | ||||
|          member_dn = (const char *)el->values[i].data; | ||||
|   | ||||
| -        ret = get_ipa_groupname(users->groups, sysdb, member_dn,
 | ||||
| +        ret = get_ipa_groupname(users->groups, domain->sysdb, member_dn,
 | ||||
|                                  &users->groups[num_groups]); | ||||
|          if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) { | ||||
|              DEBUG(SSSDBG_MINOR_FAILURE, "Parse error on [%s]\n", member_dn); | ||||
| @@ -603,7 +599,6 @@ done:
 | ||||
|   | ||||
|  static errno_t | ||||
|  hbac_eval_service_element(TALLOC_CTX *mem_ctx, | ||||
| -                          struct sysdb_ctx *sysdb,
 | ||||
|                            struct sss_domain_info *domain, | ||||
|                            const char *servicename, | ||||
|                            struct hbac_request_element **svc_element) | ||||
| @@ -636,7 +631,7 @@ hbac_eval_service_element(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      /* Look up the service to get its originalMemberOf entries */ | ||||
| -    ret = sysdb_search_entry(tmp_ctx, sysdb, svc_dn,
 | ||||
| +    ret = sysdb_search_entry(tmp_ctx, domain->sysdb, svc_dn,
 | ||||
|                               LDB_SCOPE_BASE, NULL, | ||||
|                               memberof_attrs, | ||||
|                               &count, &msgs); | ||||
| @@ -673,7 +668,7 @@ hbac_eval_service_element(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      for (i = j = 0; i < el->num_values; i++) { | ||||
| -        ret = get_ipa_servicegroupname(tmp_ctx, sysdb,
 | ||||
| +        ret = get_ipa_servicegroupname(tmp_ctx, domain->sysdb,
 | ||||
|                                         (const char *)el->values[i].data, | ||||
|                                         &name); | ||||
|          if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) goto done; | ||||
| @@ -702,7 +697,6 @@ done:
 | ||||
|   | ||||
|  static errno_t | ||||
|  hbac_eval_host_element(TALLOC_CTX *mem_ctx, | ||||
| -                       struct sysdb_ctx *sysdb,
 | ||||
|                         struct sss_domain_info *domain, | ||||
|                         const char *hostname, | ||||
|                         struct hbac_request_element **host_element) | ||||
| @@ -743,7 +737,7 @@ hbac_eval_host_element(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      /* Look up the host to get its originalMemberOf entries */ | ||||
| -    ret = sysdb_search_entry(tmp_ctx, sysdb, host_dn,
 | ||||
| +    ret = sysdb_search_entry(tmp_ctx, domain->sysdb, host_dn,
 | ||||
|                               LDB_SCOPE_BASE, NULL, | ||||
|                               memberof_attrs, | ||||
|                               &count, &msgs); | ||||
| @@ -780,7 +774,7 @@ hbac_eval_host_element(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      for (i = j = 0; i < el->num_values; i++) { | ||||
| -        ret = get_ipa_hostgroupname(tmp_ctx, sysdb,
 | ||||
| +        ret = get_ipa_hostgroupname(tmp_ctx, domain->sysdb,
 | ||||
|                                      (const char *)el->values[i].data, | ||||
|                                      &name); | ||||
|          if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) goto done; | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										183
									
								
								0047-IPA-Only-treat-malformed-HBAC-rules-as-fatal-if-deny.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								0047-IPA-Only-treat-malformed-HBAC-rules-as-fatal-if-deny.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,183 @@ | ||||
| From 4df47543690a8b185d04ca6a0270e231e4491e6d Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Mon, 16 Mar 2015 11:12:25 +0100 | ||||
| Subject: [PATCH 47/99] IPA: Only treat malformed HBAC rules as fatal if deny | ||||
|  rules are enabled | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| https://fedorahosted.org/sssd/ticket/2603 | ||||
| 
 | ||||
| If deny rules are not in effect, we can skip malformed HBAC rules | ||||
| because at worst we will deny access. If deny rules are in effect, we | ||||
| need to error out to be on the safe side and avoid skipping a deny rule. | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit c41ae115bfa808d04e729dcbd759d8aae8387ce7) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_hbac_common.c | 68 +++++++++++++++++++++++++++++-------- | ||||
|  1 file changed, 54 insertions(+), 14 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_hbac_common.c b/src/providers/ipa/ipa_hbac_common.c
 | ||||
| index 8436b7e2d1e9b745e3265c319669cf196f610ee1..a7e338e995de0f2e4142132c056476bc301d80cc 100644
 | ||||
| --- a/src/providers/ipa/ipa_hbac_common.c
 | ||||
| +++ b/src/providers/ipa/ipa_hbac_common.c
 | ||||
| @@ -403,18 +403,21 @@ static errno_t
 | ||||
|  hbac_eval_user_element(TALLOC_CTX *mem_ctx, | ||||
|                         struct sss_domain_info *domain, | ||||
|                         const char *username, | ||||
| +                       bool deny_rules,
 | ||||
|                         struct hbac_request_element **user_element); | ||||
|   | ||||
|  static errno_t | ||||
|  hbac_eval_service_element(TALLOC_CTX *mem_ctx, | ||||
|                            struct sss_domain_info *domain, | ||||
|                            const char *servicename, | ||||
| +                          bool deny_rules,
 | ||||
|                            struct hbac_request_element **svc_element); | ||||
|   | ||||
|  static errno_t | ||||
|  hbac_eval_host_element(TALLOC_CTX *mem_ctx, | ||||
|                         struct sss_domain_info *domain, | ||||
|                         const char *hostname, | ||||
| +                       bool deny_rules,
 | ||||
|                         struct hbac_request_element **host_element); | ||||
|   | ||||
|  static errno_t | ||||
| @@ -452,17 +455,20 @@ hbac_ctx_to_eval_request(TALLOC_CTX *mem_ctx,
 | ||||
|              ret = ENOMEM; | ||||
|              goto done; | ||||
|          } | ||||
| -        ret = hbac_eval_user_element(eval_req, user_dom,
 | ||||
| -                                     pd->user, &eval_req->user);
 | ||||
| +        ret = hbac_eval_user_element(eval_req, user_dom, pd->user,
 | ||||
| +                                     hbac_ctx->get_deny_rules,
 | ||||
| +                                     &eval_req->user);
 | ||||
|      } else { | ||||
| -        ret = hbac_eval_user_element(eval_req, domain,
 | ||||
| -                                     pd->user, &eval_req->user);
 | ||||
| +        ret = hbac_eval_user_element(eval_req, domain, pd->user,
 | ||||
| +                                     hbac_ctx->get_deny_rules,
 | ||||
| +                                     &eval_req->user);
 | ||||
|      } | ||||
|      if (ret != EOK) goto done; | ||||
|   | ||||
|      /* Get the PAM service and service groups */ | ||||
| -    ret = hbac_eval_service_element(eval_req, domain,
 | ||||
| -                                    pd->service, &eval_req->service);
 | ||||
| +    ret = hbac_eval_service_element(eval_req, domain, pd->service,
 | ||||
| +                                    hbac_ctx->get_deny_rules,
 | ||||
| +                                    &eval_req->service);
 | ||||
|      if (ret != EOK) goto done; | ||||
|   | ||||
|      /* Get the source host */ | ||||
| @@ -477,8 +483,9 @@ hbac_ctx_to_eval_request(TALLOC_CTX *mem_ctx,
 | ||||
|          rhost = pd->rhost; | ||||
|      } | ||||
|   | ||||
| -    ret = hbac_eval_host_element(eval_req, domain,
 | ||||
| -                                 rhost, &eval_req->srchost);
 | ||||
| +    ret = hbac_eval_host_element(eval_req, domain, rhost,
 | ||||
| +                                 hbac_ctx->get_deny_rules,
 | ||||
| +                                 &eval_req->srchost);
 | ||||
|      if (ret != EOK) goto done; | ||||
|   | ||||
|      /* The target host is always the current machine */ | ||||
| @@ -490,8 +497,9 @@ hbac_ctx_to_eval_request(TALLOC_CTX *mem_ctx,
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    ret = hbac_eval_host_element(eval_req, domain,
 | ||||
| -                                 thost, &eval_req->targethost);
 | ||||
| +    ret = hbac_eval_host_element(eval_req, domain, thost,
 | ||||
| +                                 hbac_ctx->get_deny_rules,
 | ||||
| +                                 &eval_req->targethost);
 | ||||
|      if (ret != EOK) goto done; | ||||
|   | ||||
|      *request = talloc_steal(mem_ctx, eval_req); | ||||
| @@ -507,6 +515,7 @@ static errno_t
 | ||||
|  hbac_eval_user_element(TALLOC_CTX *mem_ctx, | ||||
|                         struct sss_domain_info *domain, | ||||
|                         const char *username, | ||||
| +                       bool deny_rules,
 | ||||
|                         struct hbac_request_element **user_element) | ||||
|  { | ||||
|      errno_t ret; | ||||
| @@ -564,8 +573,15 @@ hbac_eval_user_element(TALLOC_CTX *mem_ctx,
 | ||||
|          ret = get_ipa_groupname(users->groups, domain->sysdb, member_dn, | ||||
|                                  &users->groups[num_groups]); | ||||
|          if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) { | ||||
| -            DEBUG(SSSDBG_MINOR_FAILURE, "Parse error on [%s]\n", member_dn);
 | ||||
| -            goto done;
 | ||||
| +            if (deny_rules) {
 | ||||
| +                DEBUG(SSSDBG_OP_FAILURE, "Parse error on [%s]: %s\n",
 | ||||
| +                      member_dn, sss_strerror(ret));
 | ||||
| +                goto done;
 | ||||
| +            } else {
 | ||||
| +                DEBUG(SSSDBG_MINOR_FAILURE,
 | ||||
| +                      "Skipping malformed entry [%s]\n", member_dn);
 | ||||
| +                continue;
 | ||||
| +            }
 | ||||
|          } else if (ret == EOK) { | ||||
|              DEBUG(SSSDBG_TRACE_LIBS, "Added group [%s] for user [%s]\n", | ||||
|                        users->groups[num_groups], users->name); | ||||
| @@ -601,6 +617,7 @@ static errno_t
 | ||||
|  hbac_eval_service_element(TALLOC_CTX *mem_ctx, | ||||
|                            struct sss_domain_info *domain, | ||||
|                            const char *servicename, | ||||
| +                          bool deny_rules,
 | ||||
|                            struct hbac_request_element **svc_element) | ||||
|  { | ||||
|      errno_t ret; | ||||
| @@ -671,7 +688,18 @@ hbac_eval_service_element(TALLOC_CTX *mem_ctx,
 | ||||
|          ret = get_ipa_servicegroupname(tmp_ctx, domain->sysdb, | ||||
|                                         (const char *)el->values[i].data, | ||||
|                                         &name); | ||||
| -        if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) goto done;
 | ||||
| +        if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) {
 | ||||
| +            if (deny_rules) {
 | ||||
| +                DEBUG(SSSDBG_OP_FAILURE, "Parse error on [%s]: %s\n",
 | ||||
| +                                         (const char *)el->values[i].data,
 | ||||
| +                                         sss_strerror(ret));
 | ||||
| +                goto done;
 | ||||
| +            } else {
 | ||||
| +                DEBUG(SSSDBG_MINOR_FAILURE, "Skipping malformed entry [%s]\n",
 | ||||
| +                                            (const char *)el->values[i].data);
 | ||||
| +                continue;
 | ||||
| +            }
 | ||||
| +        }
 | ||||
|   | ||||
|          /* ERR_UNEXPECTED_ENTRY_TYPE means we had a memberOf entry that wasn't a | ||||
|           * service group. We'll just ignore those (could be | ||||
| @@ -699,6 +727,7 @@ static errno_t
 | ||||
|  hbac_eval_host_element(TALLOC_CTX *mem_ctx, | ||||
|                         struct sss_domain_info *domain, | ||||
|                         const char *hostname, | ||||
| +                       bool deny_rules,
 | ||||
|                         struct hbac_request_element **host_element) | ||||
|  { | ||||
|      errno_t ret; | ||||
| @@ -777,7 +806,18 @@ hbac_eval_host_element(TALLOC_CTX *mem_ctx,
 | ||||
|          ret = get_ipa_hostgroupname(tmp_ctx, domain->sysdb, | ||||
|                                      (const char *)el->values[i].data, | ||||
|                                      &name); | ||||
| -        if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) goto done;
 | ||||
| +        if (ret != EOK && ret != ERR_UNEXPECTED_ENTRY_TYPE) {
 | ||||
| +            if (deny_rules) {
 | ||||
| +                DEBUG(SSSDBG_OP_FAILURE, "Parse error on [%s]: %s\n",
 | ||||
| +                                         (const char *)el->values[i].data,
 | ||||
| +                                         sss_strerror(ret));
 | ||||
| +                goto done;
 | ||||
| +            } else {
 | ||||
| +                DEBUG(SSSDBG_MINOR_FAILURE, "Skipping malformed entry [%s]\n",
 | ||||
| +                                            (const char *)el->values[i].data);
 | ||||
| +                continue;
 | ||||
| +            }
 | ||||
| +        }
 | ||||
|   | ||||
|          /* ERR_UNEXPECTED_ENTRY_TYPE means we had a memberOf entry that wasn't a | ||||
|           * host group. We'll just ignore those (could be | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										37
									
								
								0048-IPA-Deprecate-the-ipa_hbac_treat_deny_as-option.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								0048-IPA-Deprecate-the-ipa_hbac_treat_deny_as-option.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | ||||
| From 010c1c605cfcd2879a6f91ba61ea8db53aa4c5ae Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Mon, 16 Mar 2015 11:28:25 +0100 | ||||
| Subject: [PATCH 48/99] IPA: Deprecate the ipa_hbac_treat_deny_as option | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| https://fedorahosted.org/sssd/ticket/2603 | ||||
| 
 | ||||
| Deny rules have not been supported by the IPA server since 2.1. We | ||||
| should deprecate the ipa_hbac_treat_deny_as option. | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit fdfe33975cd902bf7a334e49f2667f6346c4e6ae) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_access.c | 4 ++++ | ||||
|  1 file changed, 4 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_access.c b/src/providers/ipa/ipa_access.c
 | ||||
| index 2ebaec337eedd205bab7c7cbb2a77568616062d0..d1ae18999d0b1c7637ab6de52b0290cde1c40e87 100644
 | ||||
| --- a/src/providers/ipa/ipa_access.c
 | ||||
| +++ b/src/providers/ipa/ipa_access.c
 | ||||
| @@ -178,6 +178,10 @@ static void ipa_hbac_check(struct tevent_req *req)
 | ||||
|          hbac_ctx->get_deny_rules = false; | ||||
|      } else { | ||||
|          hbac_ctx->get_deny_rules = true; | ||||
| +        sss_log(SSS_LOG_NOTICE,
 | ||||
| +                "WARNING: Using deny rules is deprecated, the option "
 | ||||
| +                "ipa_hbac_treat_deny_as will be removed in the next "
 | ||||
| +                "upstream version\n");
 | ||||
|      } | ||||
|   | ||||
|      ret = hbac_retry(hbac_ctx); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										30
									
								
								0049-LDAP-fix-a-typo-in-debug-message.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								0049-LDAP-fix-a-typo-in-debug-message.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| From 8dc685c6e8658a7844811a86cb1d7f3809026f44 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Tue, 24 Mar 2015 12:14:50 -0400 | ||||
| Subject: [PATCH 49/99] LDAP: fix a typo in debug message | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit 871f340834f25ca92a481718939164e708a70e29) | ||||
| ---
 | ||||
|  src/providers/ldap/sdap_access.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/sdap_access.c b/src/providers/ldap/sdap_access.c
 | ||||
| index 0b251121335841b357e55deac608f50e24311285..c10b9ddcfc6ae08ce27e6a4fbdf2e273fdee6ed9 100644
 | ||||
| --- a/src/providers/ldap/sdap_access.c
 | ||||
| +++ b/src/providers/ldap/sdap_access.c
 | ||||
| @@ -1727,7 +1727,7 @@ is_account_locked(const char *pwdAccountLockedTime,
 | ||||
|           * permanently. | ||||
|           */ | ||||
|          DEBUG(SSSDBG_TRACE_FUNC, | ||||
| -              "Account of: %s is beeing blocked by password policy, "
 | ||||
| +              "Account of: %s is being blocked by password policy, "
 | ||||
|                "but value: [%s] value is ignored by SSSD.\n", | ||||
|                username, pwdAccountLockedTime); | ||||
|          locked = false; | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										40
									
								
								0050-MAN-Update-ppolicy-description.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								0050-MAN-Update-ppolicy-description.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| From b025247b620206d31917cd5fb40943b1f2c55201 Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Thu, 26 Mar 2015 12:38:32 -0400 | ||||
| Subject: [PATCH 50/99] MAN: Update ppolicy description | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2612 | ||||
| 
 | ||||
| Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
| (cherry picked from commit 1426ee8756a1df4ec0651417dce92e1dcc8a246d) | ||||
| ---
 | ||||
|  src/man/sssd-ldap.5.xml | 11 +++++++---- | ||||
|  1 file changed, 7 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/man/sssd-ldap.5.xml b/src/man/sssd-ldap.5.xml
 | ||||
| index 00da3964af7619f19525e76c4f1292586dd60f54..7de0faef29b3112383a7f7863912b542a6c5e1ca 100644
 | ||||
| --- a/src/man/sssd-ldap.5.xml
 | ||||
| +++ b/src/man/sssd-ldap.5.xml
 | ||||
| @@ -1959,11 +1959,14 @@ ldap_access_filter = (employeeType=admin)
 | ||||
|                              If set, this option denies access in case that ldap | ||||
|                              attribute 'pwdAccountLockedTime' is present and has | ||||
|                              value of '000001010000Z' or represents any time in the past. | ||||
| -                            The value of 'pwdAccountLockedTime' attribute
 | ||||
| -                            must end with 'Z' as only UTC time zone is
 | ||||
| -                            currently suported. Please see the option
 | ||||
| -                            ldap_pwdlockout_dn.
 | ||||
|   | ||||
| +                            The value of the 'pwdAccountLockedTime' attribute
 | ||||
| +                            must end with 'Z', which denotes the UTC time zone.
 | ||||
| +                            Other time zones are not currently supported and
 | ||||
| +                            will result in "access-denied" when users attempt
 | ||||
| +                            to log in.
 | ||||
| +
 | ||||
| +                            Please see the option ldap_pwdlockout_dn.
 | ||||
|                              Please note that 'access_provider = ldap' must | ||||
|                              be set for this feature to work. | ||||
|                          </para> | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,76 @@ | ||||
| From 9e030a229277cfb598fd80e861e6bb0b7cfdec9c Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Tue, 7 Apr 2015 10:53:12 +0200 | ||||
| Subject: [PATCH 51/99] CLIENT: Clear errno with enabled sss-default-nss-plugin | ||||
| 
 | ||||
| Although errno was cleared in function sss_nss_make_request | ||||
| some sss glic functions set errno with value of output argument errnop. | ||||
| 
 | ||||
| Reproducer: | ||||
| * sssd compiled with enabled option sss-default-nss-plugin | ||||
| * sss is the last value in group (/etc/nsswitch.conf) | ||||
| * sssd-client is installed but sssd is stopped. | ||||
| 
 | ||||
| C-program: | ||||
|   #include <stdio.h> | ||||
|   #include <stdlib.h> | ||||
|   #include <errno.h> | ||||
|   #include <grp.h> | ||||
| 
 | ||||
|   int main(int argc, char *argv[]) | ||||
|   { | ||||
|       struct group *p_group; | ||||
| 
 | ||||
|       setgrent(); | ||||
|       while (1) { | ||||
|           errno = 0;  /* initialize for  getgrent() */ | ||||
|           p_group = getgrent(); | ||||
|           if (p_group == NULL) { | ||||
|               if (errno == 0) { | ||||
|                       break;   /* end of groups */ | ||||
|               } else { | ||||
|                   perror("getgrent"); | ||||
|                   printf("getgrent error %d \n", errno); | ||||
|                   endgrent(); | ||||
|                   exit(-2); | ||||
|               } | ||||
|           } | ||||
|           printf("getgrent() OK group(%d) = %s \n", | ||||
|                  p_group->gr_gid, p_group->gr_name); | ||||
|       } | ||||
| 
 | ||||
|       exit(0); | ||||
|   } | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2619 | ||||
| 
 | ||||
| Reviewed-by: Pavel Reichl <preichl@redhat.com> | ||||
| (cherry picked from commit d51bc5f43fffa516446ef62c2b860be9fa939c9d) | ||||
| ---
 | ||||
|  src/sss_client/common.c | 2 ++ | ||||
|  1 file changed, 2 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/sss_client/common.c b/src/sss_client/common.c
 | ||||
| index 1b0fb1223f3509ef0b5aaf4a53851b868e12d6f0..383572bada613e745ed198de2260a7fd27e43544 100644
 | ||||
| --- a/src/sss_client/common.c
 | ||||
| +++ b/src/sss_client/common.c
 | ||||
| @@ -725,6 +725,7 @@ enum nss_status sss_nss_make_request(enum sss_cli_command cmd,
 | ||||
|      ret = sss_cli_check_socket(errnop, SSS_NSS_SOCKET_NAME); | ||||
|      if (ret != SSS_STATUS_SUCCESS) { | ||||
|  #ifdef NONSTANDARD_SSS_NSS_BEHAVIOUR | ||||
| +        *errnop = 0;
 | ||||
|          errno = 0; | ||||
|          return NSS_STATUS_NOTFOUND; | ||||
|  #else | ||||
| @@ -741,6 +742,7 @@ enum nss_status sss_nss_make_request(enum sss_cli_command cmd,
 | ||||
|      case SSS_STATUS_UNAVAIL: | ||||
|      default: | ||||
|  #ifdef NONSTANDARD_SSS_NSS_BEHAVIOUR | ||||
| +        *errnop = 0;
 | ||||
|          errno = 0; | ||||
|          return NSS_STATUS_NOTFOUND; | ||||
|  #else | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,30 @@ | ||||
| From 5a4e7bf91a90e3ece5ef7ad8c2043480902677cc Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Fri, 6 Mar 2015 20:42:35 +0100 | ||||
| Subject: [PATCH 52/99] GPO: Check return value of ad_gpo_store_policy_settings | ||||
| 
 | ||||
| Reviewed-by: Pavel Reichl <preichl@redhat.com> | ||||
| ---
 | ||||
|  src/providers/ad/ad_gpo.c | 6 ++++++ | ||||
|  1 file changed, 6 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/providers/ad/ad_gpo.c b/src/providers/ad/ad_gpo.c
 | ||||
| index 69ff6daaa7e060cca4cab129ecde83d3406702d1..a881741a6ead9244ac123608234d1a0c35f830e3 100644
 | ||||
| --- a/src/providers/ad/ad_gpo.c
 | ||||
| +++ b/src/providers/ad/ad_gpo.c
 | ||||
| @@ -2184,6 +2184,12 @@ ad_gpo_cse_done(struct tevent_req *subreq)
 | ||||
|       */ | ||||
|      ret = ad_gpo_store_policy_settings(state->domain, | ||||
|                                         cse_filtered_gpo->policy_filename); | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +              "ad_gpo_store_policy_settings failed: [%d](%s)\n",
 | ||||
| +              ret, sss_strerror(ret));
 | ||||
| +        goto done;
 | ||||
| +    }
 | ||||
|   | ||||
|      state->cse_gpo_index++; | ||||
|      ret = ad_gpo_cse_step(req); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										51
									
								
								0053-enumeration-fix-talloc-context.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								0053-enumeration-fix-talloc-context.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| From 81bb9be1ae0b2a4ebe960f136a52576abcdfbbac Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com> | ||||
| Date: Wed, 25 Mar 2015 12:08:04 +0100 | ||||
| Subject: [PATCH 53/99] enumeration: fix talloc context | ||||
| 
 | ||||
| If for some reason ptask fails (e.g. timeout), req is talloc freed | ||||
| but because subreq is attached to ectx which is permanent it is | ||||
| finished anyway. Then a crash occures when we are trying to access | ||||
| callback data. | ||||
| 
 | ||||
| The same happens in sdap_dom_enum_ex_send. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2611 | ||||
| 
 | ||||
| Reviewed-by: Pavel Reichl <preichl@redhat.com> | ||||
| (cherry picked from commit 725bb2a9901c4f673b107ed179f5d68ec443ca63) | ||||
| ---
 | ||||
|  src/providers/ldap/ldap_id_enum.c    | 2 +- | ||||
|  src/providers/ldap/sdap_async_enum.c | 2 +- | ||||
|  2 files changed, 2 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/ldap_id_enum.c b/src/providers/ldap/ldap_id_enum.c
 | ||||
| index 13d2a62544b3956165ef9eb480fb5b813c890fd4..1aec91a99a322911fcc5d2a3e8a89cd98bbc7a96 100644
 | ||||
| --- a/src/providers/ldap/ldap_id_enum.c
 | ||||
| +++ b/src/providers/ldap/ldap_id_enum.c
 | ||||
| @@ -133,7 +133,7 @@ ldap_enumeration_send(TALLOC_CTX *mem_ctx,
 | ||||
|      state->dom = ectx->sdom->dom; | ||||
|      state->id_ctx = talloc_get_type_abort(ectx->pvt, struct sdap_id_ctx); | ||||
|   | ||||
| -    subreq = sdap_dom_enum_send(ectx, ev, state->id_ctx, ectx->sdom,
 | ||||
| +    subreq = sdap_dom_enum_send(state, ev, state->id_ctx, ectx->sdom,
 | ||||
|                                  state->id_ctx->conn); | ||||
|      if (subreq == NULL) { | ||||
|          /* The ptask API will reschedule the enumeration on its own on | ||||
| diff --git a/src/providers/ldap/sdap_async_enum.c b/src/providers/ldap/sdap_async_enum.c
 | ||||
| index 1cc09abdf1aa14e3d1690ea1abe32604ae4ff1cd..35afc55f809669a44aa2beda7d87dfe62d6ec10b 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_enum.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_enum.c
 | ||||
| @@ -91,7 +91,7 @@ sdap_dom_enum_ex_send(TALLOC_CTX *memctx,
 | ||||
|      int t; | ||||
|      errno_t ret; | ||||
|   | ||||
| -    req = tevent_req_create(ctx, &state, struct sdap_dom_enum_ex_state);
 | ||||
| +    req = tevent_req_create(memctx, &state, struct sdap_dom_enum_ex_state);
 | ||||
|      if (req == NULL) return NULL; | ||||
|   | ||||
|      state->ev = ev; | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										61
									
								
								0054-sudo-sanitize-filter-values.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								0054-sudo-sanitize-filter-values.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | ||||
| From 2fb2a267d0d15cce84b0ccea7e088a4b580e42fb Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com> | ||||
| Date: Thu, 9 Apr 2015 13:03:08 +0200 | ||||
| Subject: [PATCH 54/99] sudo: sanitize filter values | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2613 | ||||
| 
 | ||||
| Reviewed-by: Pavel Reichl <preichl@redhat.com> | ||||
| (cherry picked from commit c526cd124515cc2d44a413dcbfd4a74ddb490150) | ||||
| ---
 | ||||
|  src/db/sysdb_sudo.c | 15 +++++++++++++-- | ||||
|  1 file changed, 13 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/db/sysdb_sudo.c b/src/db/sysdb_sudo.c
 | ||||
| index 4c50d32c779732a5fb78f23f4344ba4ba0825e84..784ac8af3ae5cb08f30eb9631c7ffa4aa92bde23 100644
 | ||||
| --- a/src/db/sysdb_sudo.c
 | ||||
| +++ b/src/db/sysdb_sudo.c
 | ||||
| @@ -221,6 +221,7 @@ sysdb_get_sudo_filter(TALLOC_CTX *mem_ctx, const char *username,
 | ||||
|      TALLOC_CTX *tmp_ctx = NULL; | ||||
|      char *filter = NULL; | ||||
|      char *specific_filter = NULL; | ||||
| +    char *sanitized = NULL;
 | ||||
|      time_t now; | ||||
|      errno_t ret; | ||||
|      int i; | ||||
| @@ -246,9 +247,14 @@ sysdb_get_sudo_filter(TALLOC_CTX *mem_ctx, const char *username,
 | ||||
|      } | ||||
|   | ||||
|      if ((flags & SYSDB_SUDO_FILTER_USERNAME) && (username != NULL)) { | ||||
| +        ret = sss_filter_sanitize(tmp_ctx, username, &sanitized);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            goto done;
 | ||||
| +        }
 | ||||
| +
 | ||||
|          specific_filter = talloc_asprintf_append(specific_filter, "(%s=%s)", | ||||
|                                                   SYSDB_SUDO_CACHE_AT_USER, | ||||
| -                                                 username);
 | ||||
| +                                                 sanitized);
 | ||||
|          NULL_CHECK(specific_filter, ret, done); | ||||
|      } | ||||
|   | ||||
| @@ -261,9 +267,14 @@ sysdb_get_sudo_filter(TALLOC_CTX *mem_ctx, const char *username,
 | ||||
|   | ||||
|      if ((flags & SYSDB_SUDO_FILTER_GROUPS) && (groupnames != NULL)) { | ||||
|          for (i=0; groupnames[i] != NULL; i++) { | ||||
| +            ret = sss_filter_sanitize(tmp_ctx, groupnames[i], &sanitized);
 | ||||
| +            if (ret != EOK) {
 | ||||
| +                goto done;
 | ||||
| +            }
 | ||||
| +
 | ||||
|              specific_filter = talloc_asprintf_append(specific_filter, "(%s=%%%s)", | ||||
|                                                       SYSDB_SUDO_CACHE_AT_USER, | ||||
| -                                                     groupnames[i]);
 | ||||
| +                                                     sanitized);
 | ||||
|              NULL_CHECK(specific_filter, ret, done); | ||||
|          } | ||||
|      } | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										49
									
								
								0055-SDAP-Do-not-set-gid-0-twice.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								0055-SDAP-Do-not-set-gid-0-twice.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| From cf7047634308c431f4cfbff1d88564668d2a33c7 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Fri, 10 Apr 2015 14:33:35 +0200 | ||||
| Subject: [PATCH 55/99] SDAP: Do not set gid 0 twice | ||||
| 
 | ||||
| The gid o was added to sysdb attrs directly in sdap_save_group for 1st time | ||||
| and for second time in the function sdap_store_group_with_gid, | ||||
| which was called every time from function sdap_save_group | ||||
| 
 | ||||
| [sysdb_set_entry_attr] (0x0080): ldb_modify failed: | ||||
|     [Attribute or value exists](20)[attribute 'gidNumber': value #1 | ||||
|     on 'name=domainlocalgroup1_dom2-493341@sssdad_tree.com,cn=groups,cn=sssdad_tree.com,cn=sysdb' provided more than once] | ||||
| [sysdb_set_entry_attr] (0x0040): Error: 17 (File exists) | ||||
| [sysdb_store_group] (0x1000): sysdb_set_group_attr failed. | ||||
| [sysdb_store_group] (0x0400): Error: 17 (File exists) | ||||
| [sdap_store_group_with_gid] (0x0040): | ||||
|     Could not store group domainlocalgroup1_dom2-493341@sssdad_tree.com | ||||
| [sdap_save_group] (0x0080): Could not store group with GID: [File exists] | ||||
| [sdap_save_group] (0x0080): | ||||
|     Failed to save group [domainlocalgroup1_dom2-493341@sssdad_tree.com]: [File exists] | ||||
| [sdap_save_groups] (0x0040): Failed to store group 0. Ignoring. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 5d864e7a9d0e1e6fb7dd8158c5b8bfb71040b908) | ||||
| ---
 | ||||
|  src/providers/ldap/sdap_async_groups.c | 7 ------- | ||||
|  1 file changed, 7 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/sdap_async_groups.c b/src/providers/ldap/sdap_async_groups.c
 | ||||
| index f9613ddd72d1e1796bc6a034daf98275b07a5c79..454d302eabf32e0837a7a4ba03063a360524b412 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_groups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_groups.c
 | ||||
| @@ -599,13 +599,6 @@ static int sdap_save_group(TALLOC_CTX *memctx,
 | ||||
|              gid = 0; | ||||
|              DEBUG(SSSDBG_TRACE_FUNC, "Filtering AD group [%s].\n", | ||||
|                                        group_name); | ||||
| -            ret = sysdb_attrs_add_uint32(group_attrs,
 | ||||
| -                                         opts->group_map[SDAP_AT_GROUP_GID].sys_name, 0);
 | ||||
| -            if (ret != EOK) {
 | ||||
| -                DEBUG(SSSDBG_CRIT_FAILURE,
 | ||||
| -                      "Failed to add a GID to non-posix group!\n");
 | ||||
| -                return ret;
 | ||||
| -            }
 | ||||
|              ret = sysdb_attrs_add_bool(group_attrs, SYSDB_POSIX, false); | ||||
|              if (ret != EOK) { | ||||
|                  DEBUG(SSSDBG_OP_FAILURE, | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										239
									
								
								0056-SDAP-Extract-filtering-AD-group-to-function.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								0056-SDAP-Extract-filtering-AD-group-to-function.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,239 @@ | ||||
| From bdd031d274659263db5f28408d8b75c63d3485a0 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 13 Apr 2015 09:44:35 +0200 | ||||
| Subject: [PATCH 56/99] SDAP: Extract filtering AD group to function | ||||
| 
 | ||||
| Patch remove code duplication. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit bad2fc8133d941e5a6c8d8016c9689e039265c61) | ||||
| ---
 | ||||
|  Makefile.am                                   |  2 + | ||||
|  src/providers/ldap/sdap_ad_groups.c           | 68 +++++++++++++++++++++++++++ | ||||
|  src/providers/ldap/sdap_async_groups.c        | 40 ++++++---------- | ||||
|  src/providers/ldap/sdap_async_nested_groups.c | 31 ++++-------- | ||||
|  src/providers/ldap/sdap_async_private.h       |  7 +++ | ||||
|  5 files changed, 101 insertions(+), 47 deletions(-) | ||||
|  create mode 100644 src/providers/ldap/sdap_ad_groups.c | ||||
| 
 | ||||
| diff --git a/Makefile.am b/Makefile.am
 | ||||
| index df34840747bdcc3e2cc68ac1a3ca448b4aa67433..973f8cb35d75982c1b66f94af96a9e4cfe39d467 100644
 | ||||
| --- a/Makefile.am
 | ||||
| +++ b/Makefile.am
 | ||||
| @@ -1886,6 +1886,7 @@ nestedgroups_tests_SOURCES = \
 | ||||
|      src/providers/ldap/sdap_idmap.c \ | ||||
|      src/tests/cmocka/test_nested_groups.c \ | ||||
|      src/providers/ldap/sdap_async_nested_groups.c \ | ||||
| +    src/providers/ldap/sdap_ad_groups.c \
 | ||||
|      $(NULL) | ||||
|  nestedgroups_tests_CFLAGS = \ | ||||
|      $(AM_CFLAGS) \ | ||||
| @@ -2412,6 +2413,7 @@ libsss_ldap_common_la_SOURCES = \
 | ||||
|      src/providers/ldap/sdap_async_connection.c \ | ||||
|      src/providers/ldap/sdap_async_netgroups.c \ | ||||
|      src/providers/ldap/sdap_async_services.c \ | ||||
| +    src/providers/ldap/sdap_ad_groups.c \
 | ||||
|      src/providers/ldap/sdap_child_helpers.c \ | ||||
|      src/providers/ldap/sdap_fd_events.c \ | ||||
|      src/providers/ldap/sdap_id_op.c \ | ||||
| diff --git a/src/providers/ldap/sdap_ad_groups.c b/src/providers/ldap/sdap_ad_groups.c
 | ||||
| new file mode 100644 | ||||
| index 0000000000000000000000000000000000000000..0e36328b9b52643a2ec698b2a41f2a56a8ff69b6
 | ||||
| --- /dev/null
 | ||||
| +++ b/src/providers/ldap/sdap_ad_groups.c
 | ||||
| @@ -0,0 +1,68 @@
 | ||||
| +/*
 | ||||
| +    SSSD
 | ||||
| +
 | ||||
| +    AD groups helper routines
 | ||||
| +
 | ||||
| +    Authors:
 | ||||
| +        Lukas Slebodnik <lslebodn@redhat.com>
 | ||||
| +
 | ||||
| +    Copyright (C) 2013 Red Hat
 | ||||
| +
 | ||||
| +    This program is free software; you can redistribute it and/or modify
 | ||||
| +    it under the terms of the GNU General Public License as published by
 | ||||
| +    the Free Software Foundation; either version 3 of the License, or
 | ||||
| +    (at your option) any later version.
 | ||||
| +
 | ||||
| +    This program is distributed in the hope that it will be useful,
 | ||||
| +    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| +    GNU General Public License for more details.
 | ||||
| +
 | ||||
| +    You should have received a copy of the GNU General Public License
 | ||||
| +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| +*/
 | ||||
| +
 | ||||
| +#include "db/sysdb.h"
 | ||||
| +#include "providers/ldap/sdap.h"
 | ||||
| +#include "providers/ldap/sdap_async_private.h"
 | ||||
| +
 | ||||
| +/* ==Group-Parsing Routines=============================================== */
 | ||||
| +
 | ||||
| +errno_t sdap_check_ad_group_type(struct sss_domain_info *dom,
 | ||||
| +                                 struct sdap_options *opts,
 | ||||
| +                                 struct sysdb_attrs *group_attrs,
 | ||||
| +                                 const char *group_name,
 | ||||
| +                                 bool *_need_filter)
 | ||||
| +{
 | ||||
| +    int32_t ad_group_type;
 | ||||
| +    errno_t ret = EOK;
 | ||||
| +    *_need_filter = false;
 | ||||
| +
 | ||||
| +    if (opts->schema_type == SDAP_SCHEMA_AD) {
 | ||||
| +        ret = sysdb_attrs_get_int32_t(group_attrs, SYSDB_GROUP_TYPE,
 | ||||
| +                                      &ad_group_type);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_int32_t failed.\n");
 | ||||
| +            return ret;
 | ||||
| +        }
 | ||||
| +
 | ||||
| +        DEBUG(SSSDBG_TRACE_ALL,
 | ||||
| +              "AD group [%s] has type flags %#x.\n",
 | ||||
| +              group_name, ad_group_type);
 | ||||
| +
 | ||||
| +        /* Only security groups from AD are considered for POSIX groups.
 | ||||
| +         * Additionally only global and universal group are taken to account
 | ||||
| +         * for trusted domains. */
 | ||||
| +        if (!(ad_group_type & SDAP_AD_GROUP_TYPE_SECURITY)
 | ||||
| +            || (IS_SUBDOMAIN(dom)
 | ||||
| +                && (!((ad_group_type & SDAP_AD_GROUP_TYPE_GLOBAL)
 | ||||
| +                      || (ad_group_type & SDAP_AD_GROUP_TYPE_UNIVERSAL))))) {
 | ||||
| +            DEBUG(SSSDBG_TRACE_FUNC,
 | ||||
| +                  "Filtering AD group [%s].\n", group_name);
 | ||||
| +
 | ||||
| +            *_need_filter = true;
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return ret;
 | ||||
| +}
 | ||||
| diff --git a/src/providers/ldap/sdap_async_groups.c b/src/providers/ldap/sdap_async_groups.c
 | ||||
| index 454d302eabf32e0837a7a4ba03063a360524b412..fb1912d2b4fae1bdaf5f94d8f72c8f8deca2b17f 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_groups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_groups.c
 | ||||
| @@ -510,9 +510,9 @@ static int sdap_save_group(TALLOC_CTX *memctx,
 | ||||
|      TALLOC_CTX *tmpctx = NULL; | ||||
|      bool posix_group; | ||||
|      bool use_id_mapping; | ||||
| +    bool need_filter;
 | ||||
|      char *sid_str; | ||||
|      struct sss_domain_info *subdomain; | ||||
| -    int32_t ad_group_type;
 | ||||
|   | ||||
|      tmpctx = talloc_new(NULL); | ||||
|      if (!tmpctx) { | ||||
| @@ -579,32 +579,20 @@ static int sdap_save_group(TALLOC_CTX *memctx,
 | ||||
|      DEBUG(SSSDBG_TRACE_FUNC, "Processing group %s\n", group_name); | ||||
|   | ||||
|      posix_group = true; | ||||
| -    if (opts->schema_type == SDAP_SCHEMA_AD) {
 | ||||
| -        ret = sysdb_attrs_get_int32_t(attrs, SYSDB_GROUP_TYPE, &ad_group_type);
 | ||||
| -        if (ret != EOK) {
 | ||||
| -            DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_int32_t failed.\n");
 | ||||
| -            goto done;
 | ||||
| -        }
 | ||||
| +    ret = sdap_check_ad_group_type(dom, opts, attrs, group_name,
 | ||||
| +                                   &need_filter);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        goto done;
 | ||||
| +    }
 | ||||
| +    if (need_filter) {
 | ||||
| +        posix_group = false;
 | ||||
| +        gid = 0;
 | ||||
|   | ||||
| -        DEBUG(SSSDBG_TRACE_ALL, "AD group [%s] has type flags %#x.\n",
 | ||||
| -                                 group_name, ad_group_type);
 | ||||
| -        /* Only security groups from AD are considered for POSIX groups.
 | ||||
| -         * Additionally only global and universal group are taken to account
 | ||||
| -         * for trusted domains. */
 | ||||
| -        if (!(ad_group_type & SDAP_AD_GROUP_TYPE_SECURITY)
 | ||||
| -                || (IS_SUBDOMAIN(dom)
 | ||||
| -                    && (!((ad_group_type & SDAP_AD_GROUP_TYPE_GLOBAL)
 | ||||
| -                        || (ad_group_type & SDAP_AD_GROUP_TYPE_UNIVERSAL))))) {
 | ||||
| -            posix_group = false;
 | ||||
| -            gid = 0;
 | ||||
| -            DEBUG(SSSDBG_TRACE_FUNC, "Filtering AD group [%s].\n",
 | ||||
| -                                      group_name);
 | ||||
| -            ret = sysdb_attrs_add_bool(group_attrs, SYSDB_POSIX, false);
 | ||||
| -            if (ret != EOK) {
 | ||||
| -                DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| -                      "Error: Failed to mark group as non-posix!\n");
 | ||||
| -                return ret;
 | ||||
| -            }
 | ||||
| +        ret = sysdb_attrs_add_bool(group_attrs, SYSDB_POSIX, false);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +                  "Error: Failed to mark group as non-posix!\n");
 | ||||
| +            return ret;
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| diff --git a/src/providers/ldap/sdap_async_nested_groups.c b/src/providers/ldap/sdap_async_nested_groups.c
 | ||||
| index 1eba35ae8ac90acac8a2d46e8cc5f2b57e3a9256..08e199869ad16c3b19d998a2a28eae9a0dd0a371 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_nested_groups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_nested_groups.c
 | ||||
| @@ -240,32 +240,21 @@ sdap_nested_group_hash_group(struct sdap_nested_group_ctx *group_ctx,
 | ||||
|  { | ||||
|      struct sdap_attr_map *map = group_ctx->opts->group_map; | ||||
|      gid_t gid; | ||||
| -    errno_t ret = ENOENT;
 | ||||
| -    int32_t ad_group_type;
 | ||||
| +    errno_t ret;
 | ||||
|      bool posix_group = true; | ||||
|      bool use_id_mapping; | ||||
|      bool can_find_gid; | ||||
| +    bool need_filter;
 | ||||
|   | ||||
| -    if (group_ctx->opts->schema_type == SDAP_SCHEMA_AD) {
 | ||||
| -        ret = sysdb_attrs_get_int32_t(group, SYSDB_GROUP_TYPE, &ad_group_type);
 | ||||
| -        if (ret != EOK) {
 | ||||
| -            DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_int32_t failed.\n");
 | ||||
| -            return ret;
 | ||||
| -        }
 | ||||
| +    ret = sdap_check_ad_group_type(group_ctx->domain, group_ctx->opts,
 | ||||
| +                                   group, "", &need_filter);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        return ret;
 | ||||
| +    }
 | ||||
|   | ||||
| -        DEBUG(SSSDBG_TRACE_ALL, "AD group has type flags %#x.\n",
 | ||||
| -                                 ad_group_type);
 | ||||
| -        /* Only security groups from AD are considered for POSIX groups.
 | ||||
| -         * Additionally only global and universal group are taken to account
 | ||||
| -         * for trusted domains. */
 | ||||
| -        if (!(ad_group_type & SDAP_AD_GROUP_TYPE_SECURITY)
 | ||||
| -                || (IS_SUBDOMAIN(group_ctx->domain)
 | ||||
| -                    && (!((ad_group_type & SDAP_AD_GROUP_TYPE_GLOBAL)
 | ||||
| -                        || (ad_group_type & SDAP_AD_GROUP_TYPE_UNIVERSAL))))) {
 | ||||
| -            posix_group = false;
 | ||||
| -            gid = 0;
 | ||||
| -            DEBUG(SSSDBG_TRACE_FUNC, "Filtering AD group.\n");
 | ||||
| -        }
 | ||||
| +    if (need_filter) {
 | ||||
| +        posix_group = false;
 | ||||
| +        gid = 0;
 | ||||
|      } | ||||
|   | ||||
|      use_id_mapping = sdap_idmap_domain_has_algorithmic_mapping( | ||||
| diff --git a/src/providers/ldap/sdap_async_private.h b/src/providers/ldap/sdap_async_private.h
 | ||||
| index 3995a2ac357c52f546696284d71d2127d0302409..db542eaf869efcd53d0937bef3fc6e99cc78b938 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_private.h
 | ||||
| +++ b/src/providers/ldap/sdap_async_private.h
 | ||||
| @@ -138,4 +138,11 @@ errno_t sdap_add_incomplete_groups(struct sysdb_ctx *sysdb,
 | ||||
|                                     char **groupnames, | ||||
|                                     struct sysdb_attrs **ldap_groups, | ||||
|                                     int ldap_groups_count); | ||||
| +
 | ||||
| +/* from sdap_async_nested_groups.c */
 | ||||
| +errno_t sdap_check_ad_group_type(struct sss_domain_info *dom,
 | ||||
| +                                 struct sdap_options *opts,
 | ||||
| +                                 struct sysdb_attrs *group_attrs,
 | ||||
| +                                 const char *group_name,
 | ||||
| +                                 bool *_need_filter);
 | ||||
|  #endif /* _SDAP_ASYNC_PRIVATE_H_ */ | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										50
									
								
								0057-SDAP-Filter-ad-groups-in-initgroups.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								0057-SDAP-Filter-ad-groups-in-initgroups.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | ||||
| From 49895bb18508a4f4b83b99d9875e99e17c81285b Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 13 Apr 2015 09:50:29 +0200 | ||||
| Subject: [PATCH 57/99] SDAP: Filter ad groups in initgroups | ||||
| 
 | ||||
| Function sdap_add_incomplete_groups stored domain local groups | ||||
| from subdomain as POSIX group, which should not be done. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2614 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit b9fbeb75e7a4f50f98d979a70a710f9221892483) | ||||
| ---
 | ||||
|  src/providers/ldap/sdap_async_initgroups.c | 12 ++++++++++++ | ||||
|  1 file changed, 12 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/sdap_async_initgroups.c b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| index 96617aecc4e9c948bbbdccb1ba75e81577a19c70..ae617b9c4c6899d0b85dcc4c4b6b971d0f235b88 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| @@ -51,6 +51,7 @@ errno_t sdap_add_incomplete_groups(struct sysdb_ctx *sysdb,
 | ||||
|      time_t now; | ||||
|      char *sid_str = NULL; | ||||
|      bool use_id_mapping; | ||||
| +    bool need_filter;
 | ||||
|      char *tmp_name; | ||||
|   | ||||
|      /* There are no groups in LDAP but we should add user to groups ?? */ | ||||
| @@ -210,6 +211,17 @@ errno_t sdap_add_incomplete_groups(struct sysdb_ctx *sysdb,
 | ||||
|                      uuid = NULL; | ||||
|                  } | ||||
|   | ||||
| +                ret = sdap_check_ad_group_type(domain, opts, ldap_groups[ai],
 | ||||
| +                                               groupname, &need_filter);
 | ||||
| +                if (ret != EOK) {
 | ||||
| +                    goto done;
 | ||||
| +                }
 | ||||
| +
 | ||||
| +                if (need_filter) {
 | ||||
| +                    posix = false;
 | ||||
| +                    gid = 0;
 | ||||
| +                }
 | ||||
| +
 | ||||
|                  DEBUG(SSSDBG_TRACE_INTERNAL, | ||||
|                        "Adding fake group %s to sysdb\n", groupname); | ||||
|                  ret = sysdb_add_incomplete_group(domain, groupname, gid, | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 8f4a60a1fb0c24cfb01bc683a31b52786df68ccc Mon Sep 17 00:00:00 2001 | ||||
| From 816d3cc041e276b138057aacb81d1a2bfb25add6 Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Fri, 10 Apr 2015 10:55:22 +0200 | ||||
| Subject: [PATCH 18/20] selinux: Disconnect before closing the handle | ||||
| Subject: [PATCH 58/99] selinux: Disconnect before closing the handle | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| @ -15,6 +15,7 @@ was connected. | ||||
| Otherwise we get a memory leak. | ||||
| 
 | ||||
| Reviewed-by: Michal Židek <mzidek@redhat.com> | ||||
| (cherry picked from commit aa00d67b2a8e07c9080e7798defdc6c774c93465) | ||||
| ---
 | ||||
|  src/util/sss_semanage.c | 13 ++++++++++--- | ||||
|  1 file changed, 10 insertions(+), 3 deletions(-) | ||||
| @ -65,5 +66,5 @@ index b85831c3d3f262f49b19082e96aa62ccf3afeaa8..d141de1c671e6d62a731e56b10ee1406 | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.3.5 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 342165ced656d64ec78bdb6f8897e15666cc08d2 Mon Sep 17 00:00:00 2001 | ||||
| From 9c695e3a82fe5903b36b2d514b3284efeadc908c Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Fri, 10 Apr 2015 11:06:44 +0200 | ||||
| Subject: [PATCH 19/20] selinux: Begin and end the transaction on the same | ||||
| Subject: [PATCH 59/99] selinux: Begin and end the transaction on the same | ||||
|  nesting level | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| @ -13,6 +13,7 @@ and splitting them from initialization will make init function reusable | ||||
| by read-only libsemanage functions. | ||||
| 
 | ||||
| Reviewed-by: Michal Židek <mzidek@redhat.com> | ||||
| (cherry picked from commit 748b38a7991d78cbf4726f2a14ace5e926629a54) | ||||
| ---
 | ||||
|  src/util/sss_semanage.c | 20 ++++++++++++++------ | ||||
|  1 file changed, 14 insertions(+), 6 deletions(-) | ||||
| @ -63,5 +64,5 @@ index d141de1c671e6d62a731e56b10ee14069f27ae87..c0342498cbd0495733a0bf701a06a02c | ||||
|      if (ret != 0) { | ||||
|          DEBUG(SSSDBG_CRIT_FAILURE, "Cannot create SELinux user key\n"); | ||||
| -- 
 | ||||
| 2.3.5 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 92a0931dfc57ec386b4c797ff4a144d2de7ffc25 Mon Sep 17 00:00:00 2001 | ||||
| From 4d31f2c294db6090047e4d5348322b32ea0aaac1 Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Thu, 9 Apr 2015 22:18:35 +0200 | ||||
| Subject: [PATCH 20/20] selinux: Only call semanage if the context actually | ||||
| Subject: [PATCH 60/99] selinux: Only call semanage if the context actually | ||||
|  changes | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| @ -16,6 +16,7 @@ server. | ||||
| Adds talloc dependency to libsss_semanage. | ||||
| 
 | ||||
| Reviewed-by: Michal Židek <mzidek@redhat.com> | ||||
| (cherry picked from commit 1e0fa55fb377db788e065de917ba8e149eb56161) | ||||
| ---
 | ||||
|  Makefile.am                       |  5 +++ | ||||
|  src/providers/ipa/selinux_child.c | 35 ++++++++++++++++--- | ||||
| @ -24,10 +25,10 @@ Reviewed-by: Michal Židek <mzidek@redhat.com> | ||||
|  4 files changed, 109 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/Makefile.am b/Makefile.am
 | ||||
| index 605fd1ff5e479078d579ac7524507546261d469c..ed89028ebdbb85752f1f7f06ef8464613ee96377 100644
 | ||||
| index 973f8cb35d75982c1b66f94af96a9e4cfe39d467..65b9773d8804992f7553609b77553b3b3944a54d 100644
 | ||||
| --- a/Makefile.am
 | ||||
| +++ b/Makefile.am
 | ||||
| @@ -784,10 +784,15 @@ endif
 | ||||
| @@ -770,10 +770,15 @@ endif
 | ||||
|  libsss_util_la_LDFLAGS = -avoid-version | ||||
|   | ||||
|  pkglib_LTLIBRARIES += libsss_semanage.la | ||||
| @ -191,17 +192,18 @@ index c0342498cbd0495733a0bf701a06a02cfb705fc7..01a2f41d8752e127f2aa1b72faa61c23 | ||||
| +}
 | ||||
|  #endif  /* HAVE_SEMANAGE */ | ||||
| diff --git a/src/util/util.h b/src/util/util.h
 | ||||
| index bf3a9a057aed77e93949370f8651af2631d91432..d217688f81d7a2e49cd3eaaf0d1be609a0f679ea 100644
 | ||||
| index 91df09914abfa1a72e9280ab708e11abf9e07e18..81a8709d6840a9c5cd2acb23c40fdea7f9714e98 100644
 | ||||
| --- a/src/util/util.h
 | ||||
| +++ b/src/util/util.h
 | ||||
| @@ -635,5 +635,7 @@ errno_t restore_creds(struct sss_creds *saved_creds);
 | ||||
| @@ -642,6 +642,8 @@ errno_t restore_creds(struct sss_creds *saved_creds);
 | ||||
|  int set_seuser(const char *login_name, const char *seuser_name, | ||||
|                 const char *mlsrange); | ||||
|  int del_seuser(const char *login_name); | ||||
| +int get_seuser(TALLOC_CTX *mem_ctx, const char *login_name,
 | ||||
| +               char **_seuser, char **_mls_range);
 | ||||
|   | ||||
|  #endif /* __SSSD_UTIL_H__ */ | ||||
|  /* convert time from generalized form to unix time */ | ||||
|  errno_t sss_utc_to_time_t(const char *str, const char *format, time_t *unix_time); | ||||
| -- 
 | ||||
| 2.3.5 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										121
									
								
								0061-Option-filter_users-had-no-effect-for-retrieving-sud.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								0061-Option-filter_users-had-no-effect-for-retrieving-sud.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,121 @@ | ||||
| From d008c239c62ab6a467559156d5df854b099e4422 Mon Sep 17 00:00:00 2001 | ||||
| From: Adam Tkac <vonsch@gmail.com> | ||||
| Date: Mon, 13 Apr 2015 15:00:18 +0200 | ||||
| Subject: [PATCH 61/99] Option filter_users had no effect for retrieving sudo | ||||
|  rules | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| Previously sssd_sudo always obtained sudo rules for user from LDAP even | ||||
| when user was enlisted in filter_users. | ||||
| 
 | ||||
| Resolves https://fedorahosted.org/sssd/ticket/2625 | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit 2a25713afc6beefb11a799903a43f695c5d7a4f9) | ||||
| ---
 | ||||
|  src/responder/sudo/sudosrv.c         | 24 ++++++++++++++++++++++++ | ||||
|  src/responder/sudo/sudosrv_cmd.c     | 12 ++++++++++++ | ||||
|  src/responder/sudo/sudosrv_private.h |  3 +++ | ||||
|  3 files changed, 39 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/responder/sudo/sudosrv.c b/src/responder/sudo/sudosrv.c
 | ||||
| index e480c7a43d453cffcd6ca07e41402c1cf6eef91c..bcc0a07f04bdd7dbccc3b47932a7917312395b12 100644
 | ||||
| --- a/src/responder/sudo/sudosrv.c
 | ||||
| +++ b/src/responder/sudo/sudosrv.c
 | ||||
| @@ -27,6 +27,7 @@
 | ||||
|  #include "responder/common/responder_sbus.h" | ||||
|  #include "responder/sudo/sudosrv_private.h" | ||||
|  #include "providers/data_provider.h" | ||||
| +#include "responder/common/negcache.h"
 | ||||
|   | ||||
|  struct mon_cli_iface monitor_sudo_methods = { | ||||
|      { &mon_cli_iface_meta, 0 }, | ||||
| @@ -113,9 +114,32 @@ int sudo_process_init(TALLOC_CTX *mem_ctx,
 | ||||
|          goto fail; | ||||
|      } | ||||
|   | ||||
| +    ret = sss_ncache_init(rctx, &sudo_ctx->ncache);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_FATAL_FAILURE,
 | ||||
| +              "fatal error initializing ncache\n");
 | ||||
| +        goto fail;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      sudo_ctx->rctx = rctx; | ||||
|      sudo_ctx->rctx->pvt_ctx = sudo_ctx; | ||||
|   | ||||
| +    ret = confdb_get_int(cdb, CONFDB_NSS_CONF_ENTRY,
 | ||||
| +                         CONFDB_NSS_ENTRY_NEG_TIMEOUT, 15,
 | ||||
| +                         &sudo_ctx->neg_timeout);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_FATAL_FAILURE,
 | ||||
| +              "fatal error getting ncache timeout\n");
 | ||||
| +        goto fail;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    sss_ncache_prepopulate(sudo_ctx->ncache, sudo_ctx->rctx->cdb, rctx);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_FATAL_FAILURE,
 | ||||
| +              "failed to set ncache for sudo's filter_users\n");
 | ||||
| +        goto fail;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      /* Enable automatic reconnection to the Data Provider */ | ||||
|      ret = confdb_get_int(sudo_ctx->rctx->cdb, | ||||
|                           CONFDB_SUDO_CONF_ENTRY, | ||||
| diff --git a/src/responder/sudo/sudosrv_cmd.c b/src/responder/sudo/sudosrv_cmd.c
 | ||||
| index fd8c46d638ecbd0275b44511dbc6d31e0e316581..dd636e949200dd49c1422a5789e9328dc4b25fb0 100644
 | ||||
| --- a/src/responder/sudo/sudosrv_cmd.c
 | ||||
| +++ b/src/responder/sudo/sudosrv_cmd.c
 | ||||
| @@ -28,6 +28,7 @@
 | ||||
|  #include "responder/sudo/sudosrv_private.h" | ||||
|  #include "db/sysdb_sudo.h" | ||||
|  #include "sss_client/sss_cli.h" | ||||
| +#include "responder/common/negcache.h"
 | ||||
|   | ||||
|  static errno_t sudosrv_cmd_send_reply(struct sudo_cmd_ctx *cmd_ctx, | ||||
|                                        uint8_t *response_body, | ||||
| @@ -239,6 +240,7 @@ static void sudosrv_cmd_parse_query_done(struct tevent_req *req)
 | ||||
|  { | ||||
|      struct sudo_cmd_ctx *cmd_ctx = NULL; | ||||
|      struct sudo_dom_ctx *dom_ctx = NULL; | ||||
| +    struct sudo_ctx *sudo_ctx = NULL;
 | ||||
|      errno_t ret; | ||||
|   | ||||
|      cmd_ctx = tevent_req_callback_data(req, struct sudo_cmd_ctx); | ||||
| @@ -278,6 +280,16 @@ static void sudosrv_cmd_parse_query_done(struct tevent_req *req)
 | ||||
|      dom_ctx->domain = cmd_ctx->domain != NULL ? cmd_ctx->domain | ||||
|                                                : cmd_ctx->cli_ctx->rctx->domains; | ||||
|   | ||||
| +    sudo_ctx = talloc_get_type(cmd_ctx->cli_ctx->rctx->pvt_ctx, struct sudo_ctx);
 | ||||
| +    ret = sss_ncache_check_user(sudo_ctx->ncache, sudo_ctx->neg_timeout,
 | ||||
| +                                dom_ctx->domain, cmd_ctx->username);
 | ||||
| +    if (ret == EEXIST) {
 | ||||
| +        DEBUG(SSSDBG_TRACE_FUNC, "User [%s@%s] filtered out (ncache)\n",
 | ||||
| +              cmd_ctx->username, dom_ctx->domain->name);
 | ||||
| +        ret = ENOENT;
 | ||||
| +        goto done;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      ret = sudosrv_get_sudorules(dom_ctx); | ||||
|   | ||||
|  done: | ||||
| diff --git a/src/responder/sudo/sudosrv_private.h b/src/responder/sudo/sudosrv_private.h
 | ||||
| index 71a272ab4b06864738ac86b31e89a0c45658665b..3c53755f9e8ec56f3dea52021d14b50f715a54e7 100644
 | ||||
| --- a/src/responder/sudo/sudosrv_private.h
 | ||||
| +++ b/src/responder/sudo/sudosrv_private.h
 | ||||
| @@ -43,6 +43,9 @@ enum sss_sudo_type {
 | ||||
|  struct sudo_ctx { | ||||
|      struct resp_ctx *rctx; | ||||
|   | ||||
| +    int neg_timeout;
 | ||||
| +    struct sss_nc_ctx *ncache;
 | ||||
| +
 | ||||
|      /* | ||||
|       * options | ||||
|       */ | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										59
									
								
								0062-AD-Clean-up-ad_access_gpo.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								0062-AD-Clean-up-ad_access_gpo.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | ||||
| From d7efa39ab732fb034f51501cb2b1b8d3b1716979 Mon Sep 17 00:00:00 2001 | ||||
| From: Stephen Gallagher <sgallagh@redhat.com> | ||||
| Date: Tue, 14 Apr 2015 13:07:36 -0400 | ||||
| Subject: [PATCH 62/99] AD: Clean up ad_access_gpo | ||||
| 
 | ||||
| Align goto usage with conventions in the rest of the source. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit d9079aa05eb8aacb488992fdce328c1abadd08d8) | ||||
| ---
 | ||||
|  src/providers/ad/ad_gpo.c | 12 +++++------- | ||||
|  1 file changed, 5 insertions(+), 7 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ad/ad_gpo.c b/src/providers/ad/ad_gpo.c
 | ||||
| index a881741a6ead9244ac123608234d1a0c35f830e3..54e5545a57b7e697f730431ae35a95ccabbe21db 100644
 | ||||
| --- a/src/providers/ad/ad_gpo.c
 | ||||
| +++ b/src/providers/ad/ad_gpo.c
 | ||||
| @@ -1534,8 +1534,6 @@ ad_gpo_access_send(TALLOC_CTX *mem_ctx,
 | ||||
|   | ||||
|      if (gpo_map_type == GPO_MAP_PERMIT) { | ||||
|          ret = EOK; | ||||
| -        tevent_req_done(req);
 | ||||
| -        tevent_req_post(req, ev);
 | ||||
|          goto immediately; | ||||
|      } | ||||
|   | ||||
| @@ -1551,8 +1549,6 @@ ad_gpo_access_send(TALLOC_CTX *mem_ctx,
 | ||||
|                          "ad_gpo_access_control option were set to enforcing " \ | ||||
|                          "mode."); | ||||
|              ret = EOK; | ||||
| -            tevent_req_done(req);
 | ||||
| -            tevent_req_post(req, ev);
 | ||||
|              goto immediately; | ||||
|          default: | ||||
|              ret = EINVAL; | ||||
| @@ -1592,15 +1588,17 @@ ad_gpo_access_send(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|      tevent_req_set_callback(subreq, ad_gpo_connect_done, req); | ||||
|   | ||||
| -    ret = EOK;
 | ||||
| +    return req;
 | ||||
|   | ||||
|  immediately: | ||||
|   | ||||
| -    if (ret != EOK) {
 | ||||
| +    if (ret == EOK) {
 | ||||
| +        tevent_req_done(req);
 | ||||
| +    } else {
 | ||||
|          tevent_req_error(req, ret); | ||||
| -        tevent_req_post(req, ev);
 | ||||
|      } | ||||
|   | ||||
| +    tevent_req_post(req, ev);
 | ||||
|      return req; | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										69
									
								
								0063-AD-Always-get-domain-specific-ID-connection.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								0063-AD-Always-get-domain-specific-ID-connection.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | ||||
| From 89a706acf3131bbe8c0aefa9c740dd44e892754f Mon Sep 17 00:00:00 2001 | ||||
| From: Stephen Gallagher <sgallagh@redhat.com> | ||||
| Date: Tue, 14 Apr 2015 21:50:36 -0400 | ||||
| Subject: [PATCH 63/99] AD: Always get domain-specific ID connection | ||||
| 
 | ||||
| ad_get_dom_ldap_conn() assumed that ad_ctx->ldap_ctx always points at | ||||
| the LDAP connection for the primary domain, however it turns out that | ||||
| this is not always the case. It's currently unclear why, but this | ||||
| connection can sometimes be pointing at a subdomain. Since the value of | ||||
| subdom_id_ctx->ldap_ctx always points to the correct domain (including | ||||
| the primary domain case), there's no benefit to trying to shortcut to | ||||
| the ad_ctx->ldap_ctx when performing this lookup. | ||||
| 
 | ||||
| This patch also makes a minor tweak to the tests so that the primary | ||||
| domain passes the sdap_domain_get() check for validity (since it needs | ||||
| to have a private member assigned). | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit e2bd4f8a41b72aea0712ad21ad02ccebb707f536) | ||||
| ---
 | ||||
|  src/providers/ad/ad_common.c      | 18 +++++++----------- | ||||
|  src/tests/cmocka/test_ad_common.c |  1 + | ||||
|  2 files changed, 8 insertions(+), 11 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ad/ad_common.c b/src/providers/ad/ad_common.c
 | ||||
| index 120878977d08aab04bbd9e3cf87a00a4b018b6e4..5eeb8dd74d1df89a1a0afa50560b8341b0088778 100644
 | ||||
| --- a/src/providers/ad/ad_common.c
 | ||||
| +++ b/src/providers/ad/ad_common.c
 | ||||
| @@ -1140,18 +1140,14 @@ ad_get_dom_ldap_conn(struct ad_id_ctx *ad_ctx, struct sss_domain_info *dom)
 | ||||
|      struct sdap_domain *sdom; | ||||
|      struct ad_id_ctx *subdom_id_ctx; | ||||
|   | ||||
| -    if (IS_SUBDOMAIN(dom)) {
 | ||||
| -        sdom = sdap_domain_get(ad_ctx->sdap_id_ctx->opts, dom);
 | ||||
| -        if (sdom == NULL || sdom->pvt == NULL) {
 | ||||
| -            DEBUG(SSSDBG_CRIT_FAILURE, "No ID ctx available for [%s].\n",
 | ||||
| -                                        dom->name);
 | ||||
| -            return NULL;
 | ||||
| -        }
 | ||||
| -        subdom_id_ctx = talloc_get_type(sdom->pvt, struct ad_id_ctx);
 | ||||
| -        conn = subdom_id_ctx->ldap_ctx;
 | ||||
| -    } else {
 | ||||
| -        conn = ad_ctx->ldap_ctx;
 | ||||
| +    sdom = sdap_domain_get(ad_ctx->sdap_id_ctx->opts, dom);
 | ||||
| +    if (sdom == NULL || sdom->pvt == NULL) {
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "No ID ctx available for [%s].\n",
 | ||||
| +                                    dom->name);
 | ||||
| +        return NULL;
 | ||||
|      } | ||||
| +    subdom_id_ctx = talloc_get_type(sdom->pvt, struct ad_id_ctx);
 | ||||
| +    conn = subdom_id_ctx->ldap_ctx;
 | ||||
|   | ||||
|      return conn; | ||||
|  } | ||||
| diff --git a/src/tests/cmocka/test_ad_common.c b/src/tests/cmocka/test_ad_common.c
 | ||||
| index 19a4d395ba3fc4eae6601b3ad7056c41384a5c4f..1c44bc34b9350c4c7bca1dfb3fedd3184d7f14f2 100644
 | ||||
| --- a/src/tests/cmocka/test_ad_common.c
 | ||||
| +++ b/src/tests/cmocka/test_ad_common.c
 | ||||
| @@ -94,6 +94,7 @@ ad_common_test_setup(void **state)
 | ||||
|   | ||||
|      ret = sdap_domain_add(ad_ctx->sdap_id_ctx->opts, test_ctx->dom, &sdom); | ||||
|      assert_int_equal(ret, EOK); | ||||
| +    sdom->pvt = ad_ctx;
 | ||||
|   | ||||
|      subdom_ad_ctx = talloc_zero(test_ctx, struct ad_id_ctx); | ||||
|      assert_non_null(subdom_ad_ctx); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										217
									
								
								0064-AD-GPO-Always-look-up-GPOs-from-machine-domain.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								0064-AD-GPO-Always-look-up-GPOs-from-machine-domain.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,217 @@ | ||||
| From b025f8a22cab47ac1f705a872917e3da0799fdd9 Mon Sep 17 00:00:00 2001 | ||||
| From: Stephen Gallagher <sgallagh@redhat.com> | ||||
| Date: Fri, 10 Apr 2015 16:34:37 -0400 | ||||
| Subject: [PATCH 64/99] AD GPO: Always look up GPOs from machine domain | ||||
| 
 | ||||
| When dealing with users from a child domain, SSSD was attempting to use | ||||
| the subdomain for lookups. However, all GPOs applicable to this machine | ||||
| are stored in the primary domain (the domain the host directly joined). | ||||
| 
 | ||||
| This patch has the GPO processing use the primary domain instead of the | ||||
| user domain. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2606 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 475d986b534c5e0dfdb8e2348ab89b13fd4874aa) | ||||
| ---
 | ||||
|  src/providers/ad/ad_gpo.c | 54 +++++++++++++++++++++++++++++------------------ | ||||
|  1 file changed, 33 insertions(+), 21 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ad/ad_gpo.c b/src/providers/ad/ad_gpo.c
 | ||||
| index 54e5545a57b7e697f730431ae35a95ccabbe21db..990acf94ae6d8fbd8f0e512354d22e1d0a71c292 100644
 | ||||
| --- a/src/providers/ad/ad_gpo.c
 | ||||
| +++ b/src/providers/ad/ad_gpo.c
 | ||||
| @@ -1401,7 +1401,8 @@ ad_gpo_perform_hbac_processing(TALLOC_CTX *mem_ctx,
 | ||||
|                                 enum gpo_access_control_mode gpo_mode, | ||||
|                                 enum gpo_map_type gpo_map_type, | ||||
|                                 const char *user, | ||||
| -                               struct sss_domain_info *domain)
 | ||||
| +                               struct sss_domain_info *user_domain,
 | ||||
| +                               struct sss_domain_info *host_domain)
 | ||||
|  { | ||||
|      int ret; | ||||
|      const char *allow_key = NULL; | ||||
| @@ -1416,7 +1417,7 @@ ad_gpo_perform_hbac_processing(TALLOC_CTX *mem_ctx,
 | ||||
|      deny_key = gpo_map_option_entries[gpo_map_type].deny_key; | ||||
|      DEBUG(SSSDBG_TRACE_ALL, "deny_key: %s\n", deny_key); | ||||
|   | ||||
| -    ret = parse_policy_setting_value(mem_ctx, domain, allow_key,
 | ||||
| +    ret = parse_policy_setting_value(mem_ctx, host_domain, allow_key,
 | ||||
|                                       &allow_sids, &allow_size); | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, | ||||
| @@ -1426,7 +1427,7 @@ ad_gpo_perform_hbac_processing(TALLOC_CTX *mem_ctx,
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    ret = parse_policy_setting_value(mem_ctx, domain, deny_key,
 | ||||
| +    ret = parse_policy_setting_value(mem_ctx, host_domain, deny_key,
 | ||||
|                                       &deny_sids, &deny_size); | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, | ||||
| @@ -1437,8 +1438,9 @@ ad_gpo_perform_hbac_processing(TALLOC_CTX *mem_ctx,
 | ||||
|      } | ||||
|   | ||||
|      /* perform access check with the final resultant allow_sids and deny_sids */ | ||||
| -    ret = ad_gpo_access_check(mem_ctx, gpo_mode, gpo_map_type, user, domain,
 | ||||
| -                              allow_sids, allow_size, deny_sids, deny_size);
 | ||||
| +    ret = ad_gpo_access_check(mem_ctx, gpo_mode, gpo_map_type, user,
 | ||||
| +                              user_domain, allow_sids, allow_size, deny_sids,
 | ||||
| +                              deny_size);
 | ||||
|   | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, | ||||
| @@ -1463,7 +1465,8 @@ struct ad_gpo_access_state {
 | ||||
|      char *server_hostname; | ||||
|      struct sdap_options *opts; | ||||
|      int timeout; | ||||
| -    struct sss_domain_info *domain;
 | ||||
| +    struct sss_domain_info *user_domain;
 | ||||
| +    struct sss_domain_info *host_domain;
 | ||||
|      const char *user; | ||||
|      int gpo_timeout_option; | ||||
|      const char *ad_hostname; | ||||
| @@ -1556,8 +1559,13 @@ ad_gpo_access_send(TALLOC_CTX *mem_ctx,
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| +    /* GPO Operations all happen against the enrolled domain,
 | ||||
| +     * not the user's domain (which may be a trusted realm)
 | ||||
| +     */
 | ||||
| +    state->user_domain = domain;
 | ||||
| +    state->host_domain = get_domains_head(domain);
 | ||||
| +
 | ||||
|      state->gpo_map_type = gpo_map_type; | ||||
| -    state->domain = domain;
 | ||||
|      state->dacl_filtered_gpos = NULL; | ||||
|      state->num_dacl_filtered_gpos = 0; | ||||
|      state->cse_filtered_gpos = NULL; | ||||
| @@ -1565,13 +1573,13 @@ ad_gpo_access_send(TALLOC_CTX *mem_ctx,
 | ||||
|      state->cse_gpo_index = 0; | ||||
|      state->ev = ev; | ||||
|      state->user = user; | ||||
| -    state->ldb_ctx = sysdb_ctx_get_ldb(domain->sysdb);
 | ||||
| +    state->ldb_ctx = sysdb_ctx_get_ldb(state->host_domain->sysdb);
 | ||||
|      state->gpo_mode = ctx->gpo_access_control_mode; | ||||
|      state->gpo_timeout_option = ctx->gpo_cache_timeout; | ||||
|      state->ad_hostname = dp_opt_get_string(ctx->ad_options, AD_HOSTNAME); | ||||
|      state->opts = ctx->sdap_access_ctx->id_ctx->opts; | ||||
|      state->timeout = dp_opt_get_int(state->opts->basic, SDAP_SEARCH_TIMEOUT); | ||||
| -    state->conn = ad_get_dom_ldap_conn(ctx->ad_id_ctx, domain);
 | ||||
| +    state->conn = ad_get_dom_ldap_conn(ctx->ad_id_ctx, state->host_domain);
 | ||||
|      state->sdap_op = sdap_id_op_create(state, state->conn->conn_cache); | ||||
|      if (state->sdap_op == NULL) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "sdap_id_op_create failed.\n"); | ||||
| @@ -1606,7 +1614,8 @@ static errno_t
 | ||||
|  process_offline_gpos(TALLOC_CTX *mem_ctx, | ||||
|                       const char *user, | ||||
|                       enum gpo_access_control_mode gpo_mode, | ||||
| -                     struct sss_domain_info *domain,
 | ||||
| +                     struct sss_domain_info *user_domain,
 | ||||
| +                     struct sss_domain_info *host_domain,
 | ||||
|                       enum gpo_map_type gpo_map_type) | ||||
|   | ||||
|  { | ||||
| @@ -1616,7 +1625,8 @@ process_offline_gpos(TALLOC_CTX *mem_ctx,
 | ||||
|                                           gpo_mode, | ||||
|                                           gpo_map_type, | ||||
|                                           user, | ||||
| -                                         domain);
 | ||||
| +                                         user_domain,
 | ||||
| +                                         host_domain);
 | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "HBAC processing failed: [%d](%s}\n", | ||||
|                ret, sss_strerror(ret)); | ||||
| @@ -1662,7 +1672,8 @@ ad_gpo_connect_done(struct tevent_req *subreq)
 | ||||
|              ret = process_offline_gpos(state, | ||||
|                                         state->user, | ||||
|                                         state->gpo_mode, | ||||
| -                                       state->domain,
 | ||||
| +                                       state->user_domain,
 | ||||
| +                                       state->host_domain,
 | ||||
|                                         state->gpo_map_type); | ||||
|   | ||||
|              if (ret == EOK) { | ||||
| @@ -1714,11 +1725,11 @@ ad_gpo_connect_done(struct tevent_req *subreq)
 | ||||
|      DEBUG(SSSDBG_TRACE_FUNC, "sam_account_name is %s\n", sam_account_name); | ||||
|   | ||||
|      /* Convert the domain name into domain DN */ | ||||
| -    ret = domain_to_basedn(state, state->domain->name, &domain_dn);
 | ||||
| +    ret = domain_to_basedn(state, state->host_domain->name, &domain_dn);
 | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, | ||||
|                "Cannot convert domain name [%s] to base DN [%d]: %s\n", | ||||
| -               state->domain->name, ret, sss_strerror(ret));
 | ||||
| +               state->host_domain->name, ret, sss_strerror(ret));
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| @@ -1837,7 +1848,7 @@ ad_gpo_target_dn_retrieval_done(struct tevent_req *subreq)
 | ||||
|                                       state->opts, | ||||
|                                       state->timeout, | ||||
|                                       state->target_dn, | ||||
| -                                     state->domain->name);
 | ||||
| +                                     state->host_domain->name);
 | ||||
|      if (subreq == NULL) { | ||||
|          ret = ENOMEM; | ||||
|          goto done; | ||||
| @@ -1939,7 +1950,7 @@ ad_gpo_process_gpo_done(struct tevent_req *subreq)
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    ret = ad_gpo_filter_gpos_by_dacl(state, state->user, state->domain,
 | ||||
| +    ret = ad_gpo_filter_gpos_by_dacl(state, state->user, state->user_domain,
 | ||||
|                                       state->opts->idmap_ctx->map, | ||||
|                                       candidate_gpos, num_candidate_gpos, | ||||
|                                       &state->dacl_filtered_gpos, | ||||
| @@ -2014,7 +2025,7 @@ ad_gpo_process_gpo_done(struct tevent_req *subreq)
 | ||||
|       * subsequent functions will add the GPO Result object (and populate it | ||||
|       * with resultant policy settings) for this policy application | ||||
|       */ | ||||
| -    ret = sysdb_gpo_delete_gpo_result_object(state, state->domain);
 | ||||
| +    ret = sysdb_gpo_delete_gpo_result_object(state, state->host_domain);
 | ||||
|      if (ret != EOK) { | ||||
|          switch (ret) { | ||||
|          case ENOENT: | ||||
| @@ -2085,7 +2096,7 @@ ad_gpo_cse_step(struct tevent_req *req)
 | ||||
|      DEBUG(SSSDBG_TRACE_FUNC, "retrieving GPO from cache [%s]\n", | ||||
|            cse_filtered_gpo->gpo_guid); | ||||
|      ret = sysdb_gpo_get_gpo_by_guid(state, | ||||
| -                                    state->domain,
 | ||||
| +                                    state->host_domain,
 | ||||
|                                      cse_filtered_gpo->gpo_guid, | ||||
|                                      &res); | ||||
|      if (ret == EOK) { | ||||
| @@ -2127,7 +2138,7 @@ ad_gpo_cse_step(struct tevent_req *req)
 | ||||
|      subreq = ad_gpo_process_cse_send(state, | ||||
|                                       state->ev, | ||||
|                                       send_to_child, | ||||
| -                                     state->domain,
 | ||||
| +                                     state->host_domain,
 | ||||
|                                       cse_filtered_gpo->gpo_guid, | ||||
|                                       cse_filtered_gpo->smb_server, | ||||
|                                       cse_filtered_gpo->smb_share, | ||||
| @@ -2180,7 +2191,7 @@ ad_gpo_cse_done(struct tevent_req *subreq)
 | ||||
|       * GPO CACHE, we store all of the supported keys present in the file | ||||
|       * (as part of the GPO Result object in the sysdb cache). | ||||
|       */ | ||||
| -    ret = ad_gpo_store_policy_settings(state->domain,
 | ||||
| +    ret = ad_gpo_store_policy_settings(state->host_domain,
 | ||||
|                                         cse_filtered_gpo->policy_filename); | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, | ||||
| @@ -2198,7 +2209,8 @@ ad_gpo_cse_done(struct tevent_req *subreq)
 | ||||
|                                               state->gpo_mode, | ||||
|                                               state->gpo_map_type, | ||||
|                                               state->user, | ||||
| -                                             state->domain);
 | ||||
| +                                             state->user_domain,
 | ||||
| +                                             state->host_domain);
 | ||||
|          if (ret != EOK) { | ||||
|              DEBUG(SSSDBG_OP_FAILURE, "HBAC processing failed: [%d](%s}\n", | ||||
|                    ret, sss_strerror(ret)); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										38
									
								
								0065-tests-Use-cmocka-1.0-API-in-test_sysdb_utils.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								0065-tests-Use-cmocka-1.0-API-in-test_sysdb_utils.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | ||||
| From bdb7e7f514629696e73902b2af3a93839be3e8a4 Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Tue, 24 Mar 2015 11:17:20 +0100 | ||||
| Subject: [PATCH 65/99] tests: Use cmocka-1.0+ API in test_sysdb_utils | ||||
| 
 | ||||
| Reviewed-by: Pavel Reichl <preichl@redhat.com> | ||||
| (cherry picked from commit e2405de14e2fb3d58af4108ecc2726818e6c7c71) | ||||
| ---
 | ||||
|  src/tests/cmocka/test_sysdb_utils.c | 6 +++--- | ||||
|  1 file changed, 3 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/tests/cmocka/test_sysdb_utils.c b/src/tests/cmocka/test_sysdb_utils.c
 | ||||
| index d217314ccb9234f8d0d329d87c5dc9e847acbcf0..1e9baa88cd82e7631a1de3db7f567f1f050ca67b 100644
 | ||||
| --- a/src/tests/cmocka/test_sysdb_utils.c
 | ||||
| +++ b/src/tests/cmocka/test_sysdb_utils.c
 | ||||
| @@ -106,8 +106,8 @@ int main(int argc, const char *argv[])
 | ||||
|          POPT_TABLEEND | ||||
|      }; | ||||
|   | ||||
| -    const UnitTest tests[] = {
 | ||||
| -        unit_test(test_sysdb_handle_original_uuid),
 | ||||
| +    const struct CMUnitTest tests[] = {
 | ||||
| +        cmocka_unit_test(test_sysdb_handle_original_uuid),
 | ||||
|      }; | ||||
|   | ||||
|      /* Set debug level to invalid value so we can deside if -d 0 was used. */ | ||||
| @@ -128,7 +128,7 @@ int main(int argc, const char *argv[])
 | ||||
|      DEBUG_CLI_INIT(debug_level); | ||||
|   | ||||
|      tests_set_cwd(); | ||||
| -    rv = run_tests(tests);
 | ||||
| +    rv = cmocka_run_group_tests(tests, NULL, NULL);
 | ||||
|   | ||||
|      return rv; | ||||
|  } | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,32 @@ | ||||
| From c61b3f050d82785525c845b839f545b5114b47f5 Mon Sep 17 00:00:00 2001 | ||||
| From: Jakub Hrozek <jhrozek@redhat.com> | ||||
| Date: Mon, 30 Mar 2015 12:18:23 +0200 | ||||
| Subject: [PATCH 66/99] sysdb: Add cache_expire to the default | ||||
|  sysdb_search_object_by_str_attr set | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com> | ||||
| (cherry picked from commit ce6f3b6b2925d2c3ec02a76c3a1b6fbe4c7b145e) | ||||
| ---
 | ||||
|  src/db/sysdb_ops.c | 3 ++- | ||||
|  1 file changed, 2 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
 | ||||
| index 37529fd12c2c5c6896a2ca71293a61f93ba0eee3..ea786d59158eb8a82952c7e457ea83286abbf2c4 100644
 | ||||
| --- a/src/db/sysdb_ops.c
 | ||||
| +++ b/src/db/sysdb_ops.c
 | ||||
| @@ -3543,7 +3543,8 @@ static errno_t sysdb_search_object_by_str_attr(TALLOC_CTX *mem_ctx,
 | ||||
|      TALLOC_CTX *tmp_ctx; | ||||
|      const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, SYSDB_GIDNUM, | ||||
|                                  ORIGINALAD_PREFIX SYSDB_NAME, | ||||
| -                                SYSDB_OBJECTCLASS, NULL };
 | ||||
| +                                SYSDB_DEFAULT_ATTRS,
 | ||||
| +                                NULL };
 | ||||
|      struct ldb_dn *basedn; | ||||
|      int ret; | ||||
|      struct ldb_result *res = NULL; | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,47 @@ | ||||
| From 3453e4734d2f7738034af61edb7d33c0c7095d8a Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Wed, 22 Apr 2015 15:10:07 +0200 | ||||
| Subject: [PATCH 67/99] IPA: do not try to save override data for the default | ||||
|  view | ||||
| 
 | ||||
| For the default view all override data is available in the cached user | ||||
| or group object. Even if separate override data is available it should | ||||
| not be written into the cache. | ||||
| 
 | ||||
| Resolves https://fedorahosted.org/sssd/ticket/2630 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 2ab9a4538eb2e1a255e645f7efdcfd6bb722d265) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 15 ++++++++++----- | ||||
|  1 file changed, 10 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index a844ee99d25ec28bb02ec7b7fd0afa722b6ac189..b9de88984ea36d5010d5544258d7d0cc68bfa669 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -2164,11 +2164,16 @@ static errno_t ipa_s2n_save_objects(struct sss_domain_info *dom,
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    ret = sysdb_store_override(dom, view_name, type, override_attrs,
 | ||||
| -                               res->msgs[0]->dn);
 | ||||
| -    if (ret != EOK) {
 | ||||
| -        DEBUG(SSSDBG_OP_FAILURE, "sysdb_store_override failed.\n");
 | ||||
| -        goto done;
 | ||||
| +    if (strcmp(view_name, SYSDB_DEFAULT_VIEW_NAME) != 0) {
 | ||||
| +        /* For the default view the data return by the extdom plugin already
 | ||||
| +         * contains all needed data and it is not expected to have a separate
 | ||||
| +         * override object. */
 | ||||
| +        ret = sysdb_store_override(dom, view_name, type, override_attrs,
 | ||||
| +                                   res->msgs[0]->dn);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "sysdb_store_override failed.\n");
 | ||||
| +            goto done;
 | ||||
| +        }
 | ||||
|      } | ||||
|   | ||||
|  done: | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,37 @@ | ||||
| From 7752046aea558e4fbf057d4efc9aea1a61b1e009 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Fri, 3 Apr 2015 12:12:34 +0200 | ||||
| Subject: [PATCH 68/99] IPA: use sysdb_attrs_add_string_safe to add group | ||||
|  member | ||||
| 
 | ||||
| The member list returned by the extdom plugin might contain some entries | ||||
| more than once. Although this is an issue on the server side to avoid | ||||
| ldb errors duplicates should be filtered out on the client as well. | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 625cff0b0938538e51fdd3b2d985e6082b492ea5) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 5 +++-- | ||||
|  1 file changed, 3 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index b9de88984ea36d5010d5544258d7d0cc68bfa669..688fdefe8eefe29a0cd13010bb3998527f3111f4 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -1300,10 +1300,11 @@ static errno_t process_members(struct sss_domain_info *domain,
 | ||||
|                  DEBUG(SSSDBG_TRACE_ALL, "Adding member [%s][%s]\n", | ||||
|                                          members[c], dn_str); | ||||
|   | ||||
| -                ret = sysdb_attrs_add_string(group_attrs, SYSDB_MEMBER, dn_str);
 | ||||
| +                ret = sysdb_attrs_add_string_safe(group_attrs, SYSDB_MEMBER,
 | ||||
| +                                                  dn_str);
 | ||||
|                  if (ret != EOK) { | ||||
|                      DEBUG(SSSDBG_OP_FAILURE, | ||||
| -                          "sysdb_attrs_add_string failed.\n");
 | ||||
| +                          "sysdb_attrs_add_string_safe failed.\n");
 | ||||
|                      goto done; | ||||
|                  } | ||||
|              } | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										64
									
								
								0069-IPA-check-ghosts-in-groups-found-by-uuid-as-well.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								0069-IPA-check-ghosts-in-groups-found-by-uuid-as-well.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| From 1b2119aab14a4ea3ca6de0d29a661b2825bfec8d Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Fri, 24 Apr 2015 17:07:22 +0200 | ||||
| Subject: [PATCH 69/99] IPA: check ghosts in groups found by uuid as well | ||||
| 
 | ||||
| With views and overrides groups are not allowed to have ghost members | ||||
| anymore because the name of a member might be overridden. To achieve | ||||
| this ghost members are looked up and resolved later during group | ||||
| lookups. Currently this is only done for group lookups by name but | ||||
| should happen as well if the group is looked up by uuid. | ||||
| 
 | ||||
| Resolves https://fedorahosted.org/sssd/ticket/2631 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 605dc7fcc848dffb7c9d270c864c70e6dff1242e) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_id.c | 21 ++++++++++++--------- | ||||
|  1 file changed, 12 insertions(+), 9 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_id.c b/src/providers/ipa/ipa_id.c
 | ||||
| index 384e39a31022b1ec47c3d1abf19e8630762a5da6..38ac4904dcd97c3e241b28143e1f7b8fade37d70 100644
 | ||||
| --- a/src/providers/ipa/ipa_id.c
 | ||||
| +++ b/src/providers/ipa/ipa_id.c
 | ||||
| @@ -789,10 +789,21 @@ static void ipa_id_get_account_info_orig_done(struct tevent_req *subreq)
 | ||||
|          goto fail; | ||||
|      } | ||||
|   | ||||
| +    class = ldb_msg_find_attr_as_string(state->obj_msg, SYSDB_OBJECTCLASS,
 | ||||
| +                                        NULL);
 | ||||
| +    if (class == NULL) {
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "Cannot find an objectclass.\n");
 | ||||
| +        ret = EINVAL;
 | ||||
| +        goto fail;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +
 | ||||
|      if (state->ipa_ctx->view_name != NULL && | ||||
|              strcmp(state->ipa_ctx->view_name, SYSDB_DEFAULT_VIEW_NAME) != 0) { | ||||
|   | ||||
| -        if ((state->ar->entry_type & BE_REQ_TYPE_MASK) == BE_REQ_GROUP) {
 | ||||
| +        if ((state->ar->entry_type & BE_REQ_TYPE_MASK) == BE_REQ_GROUP
 | ||||
| +                || ((state->ar->entry_type & BE_REQ_TYPE_MASK) == BE_REQ_BY_UUID
 | ||||
| +                        && strcmp(class, SYSDB_GROUP_CLASS) == 0)) {
 | ||||
|              /* check for ghost members because ghost members are not allowed | ||||
|               * if a view other than the default view is applied.*/ | ||||
|              state->ghosts = ldb_msg_find_element(state->obj_msg, SYSDB_GHOST); | ||||
| @@ -840,14 +851,6 @@ static void ipa_id_get_account_info_orig_done(struct tevent_req *subreq)
 | ||||
|          tevent_req_set_callback(subreq, ipa_id_get_account_info_done, req); | ||||
|          return; | ||||
|      } else { | ||||
| -        class = ldb_msg_find_attr_as_string(state->obj_msg, SYSDB_OBJECTCLASS,
 | ||||
| -                                            NULL);
 | ||||
| -        if (class == NULL) {
 | ||||
| -            DEBUG(SSSDBG_CRIT_FAILURE, "Cannot find an objectclass.\n");
 | ||||
| -            ret = EINVAL;
 | ||||
| -            goto fail;
 | ||||
| -        }
 | ||||
| -
 | ||||
|          if (strcmp(class, SYSDB_USER_CLASS) == 0) { | ||||
|              type = SYSDB_MEMBER_USER; | ||||
|          } else { | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										117
									
								
								0070-simple-access-provider-make-user-grp-res-more-robust.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								0070-simple-access-provider-make-user-grp-res-more-robust.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,117 @@ | ||||
| From 45a089a7bcf54e27fb46dc1a2c08c21ac07db96a Mon Sep 17 00:00:00 2001 | ||||
| From: Pavel Reichl <preichl@redhat.com> | ||||
| Date: Mon, 20 Apr 2015 11:33:29 -0400 | ||||
| Subject: [PATCH 70/99] simple-access-provider: make user grp res more robust | ||||
| 
 | ||||
| Not all user groups need to be resolved if group deny list is empty. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2519 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 82a958e6592c4a4078e45b7197bbe4751b70f511) | ||||
| ---
 | ||||
|  src/providers/simple/simple_access_check.c | 26 ++++++++++++++++++++++---- | ||||
|  src/util/util_errors.c                     |  1 + | ||||
|  src/util/util_errors.h                     |  1 + | ||||
|  3 files changed, 24 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/simple/simple_access_check.c b/src/providers/simple/simple_access_check.c
 | ||||
| index c8217f6d4ef2560931d3151276085eb2a6028be5..14d833be2bccda9ded3b04b881b09fd0be6684bf 100644
 | ||||
| --- a/src/providers/simple/simple_access_check.c
 | ||||
| +++ b/src/providers/simple/simple_access_check.c
 | ||||
| @@ -395,6 +395,8 @@ struct simple_check_groups_state {
 | ||||
|   | ||||
|      const char **group_names; | ||||
|      size_t num_names; | ||||
| +
 | ||||
| +    bool failed_to_resolve_groups;
 | ||||
|  }; | ||||
|   | ||||
|  static void simple_check_get_groups_next(struct tevent_req *subreq); | ||||
| @@ -430,6 +432,7 @@ simple_check_get_groups_send(TALLOC_CTX *mem_ctx,
 | ||||
|   | ||||
|      state->ev = ev; | ||||
|      state->ctx = ctx; | ||||
| +    state->failed_to_resolve_groups = false;
 | ||||
|   | ||||
|      DEBUG(SSSDBG_TRACE_LIBS, "Looking up groups for user %s\n", username); | ||||
|   | ||||
| @@ -548,11 +551,10 @@ static void simple_check_get_groups_next(struct tevent_req *subreq)
 | ||||
|          DEBUG(SSSDBG_OP_FAILURE, | ||||
|                "Could not resolve name of group with GID %"SPRIgid"\n", | ||||
|                state->lookup_groups[state->giter].gid); | ||||
| -        tevent_req_error(req, ret);
 | ||||
| -        return;
 | ||||
| +        state->failed_to_resolve_groups = true;
 | ||||
| +    } else {
 | ||||
| +        state->num_names++;
 | ||||
|      } | ||||
| -
 | ||||
| -    state->num_names++;
 | ||||
|      state->giter++; | ||||
|   | ||||
|      if (state->giter < state->num_groups) { | ||||
| @@ -686,6 +688,9 @@ simple_check_get_groups_recv(struct tevent_req *req,
 | ||||
|      TEVENT_REQ_RETURN_ON_ERROR(req); | ||||
|   | ||||
|      *_group_names = talloc_steal(mem_ctx, state->group_names); | ||||
| +    if (state->failed_to_resolve_groups) {
 | ||||
| +        return ERR_SIMPLE_GROUPS_MISSING;
 | ||||
| +    }
 | ||||
|      return EOK; | ||||
|  } | ||||
|   | ||||
| @@ -775,12 +780,25 @@ static void simple_access_check_done(struct tevent_req *subreq)
 | ||||
|   | ||||
|      /* We know the names now. Run the check. */ | ||||
|      ret = simple_check_get_groups_recv(subreq, state, &state->group_names); | ||||
| +
 | ||||
|      talloc_zfree(subreq); | ||||
|      if (ret == ENOENT) { | ||||
|          /* If the user wasn't found, just shortcut */ | ||||
|          state->access_granted = false; | ||||
|          tevent_req_done(req); | ||||
|          return; | ||||
| +    } else if (ret == ERR_SIMPLE_GROUPS_MISSING) {
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +              "Could not collect groups of user %s\n", state->username);
 | ||||
| +        if (state->ctx->deny_groups == NULL) {
 | ||||
| +            DEBUG(SSSDBG_TRACE_FUNC,
 | ||||
| +                  "But no deny groups were defined so we can continue.\n");
 | ||||
| +        } else {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +                  "Some deny groups were defined, we can't continue\n");
 | ||||
| +            tevent_req_error(req, ret);
 | ||||
| +            return;
 | ||||
| +        }
 | ||||
|      } else if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, | ||||
|                "Could not collect groups of user %s\n", state->username); | ||||
| diff --git a/src/util/util_errors.c b/src/util/util_errors.c
 | ||||
| index b481210aa21e05eda3a4c5b0699836d085baa892..4f9a2e7001695e0babe8342c497480b325f3322a 100644
 | ||||
| --- a/src/util/util_errors.c
 | ||||
| +++ b/src/util/util_errors.c
 | ||||
| @@ -71,6 +71,7 @@ struct err_string error_to_str[] = {
 | ||||
|      { "Time specification not supported" }, /* ERR_TIMESPEC_NOT_SUPPORTED */ | ||||
|      { "Malformed cache entry" }, /* ERR_MALFORMED_ENTRY */ | ||||
|      { "Unexpected cache entry type" }, /* ERR_UNEXPECTED_ENTRY_TYPE */ | ||||
| +    { "Failed to resolve one of user groups." }, /* ERR_SIMPLE_GROUPS_MISSING */
 | ||||
|      { "ERR_LAST" } /* ERR_LAST */ | ||||
|  }; | ||||
|   | ||||
| diff --git a/src/util/util_errors.h b/src/util/util_errors.h
 | ||||
| index b6a667fffbbddc77de53e501e185defbd30b23e0..5842a71550a7d14342f976c69f117f41bee1f531 100644
 | ||||
| --- a/src/util/util_errors.h
 | ||||
| +++ b/src/util/util_errors.h
 | ||||
| @@ -93,6 +93,7 @@ enum sssd_errors {
 | ||||
|      ERR_TIMESPEC_NOT_SUPPORTED, | ||||
|      ERR_MALFORMED_ENTRY, | ||||
|      ERR_UNEXPECTED_ENTRY_TYPE, | ||||
| +    ERR_SIMPLE_GROUPS_MISSING,
 | ||||
|      ERR_LAST            /* ALWAYS LAST */ | ||||
|  }; | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										205
									
								
								0071-IPA-allow-initgroups-by-SID-for-AD-users.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								0071-IPA-allow-initgroups-by-SID-for-AD-users.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,205 @@ | ||||
| From 85287a6b897d818d279171a83aa3c8a0de66f13b Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Wed, 22 Apr 2015 16:57:37 +0200 | ||||
| Subject: [PATCH 71/99] IPA: allow initgroups by SID for AD users | ||||
| 
 | ||||
| If a user from a trusted AD domain is search with the help of an | ||||
| override name the SID from the override anchor is used to search the | ||||
| user in AD. Currently the initgroups request only allows searches by | ||||
| name.  With this patch a SID can be used as well. | ||||
| 
 | ||||
| Resolves https://fedorahosted.org/sssd/ticket/2632 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit f70a1adbfc30b9acc302027439fb8157e0c6ea2a) | ||||
| ---
 | ||||
|  src/db/sysdb_search.c                      | 24 ++++++++++++++++-------- | ||||
|  src/providers/data_provider.h              |  1 + | ||||
|  src/providers/ipa/ipa_subdomains_id.c      | 13 +++++++++++++ | ||||
|  src/providers/ldap/ldap_id.c               | 15 +++++++++++++-- | ||||
|  src/providers/ldap/sdap_async_initgroups.c |  2 ++ | ||||
|  src/tests/sysdb-tests.c                    | 12 +++++++++++- | ||||
|  6 files changed, 56 insertions(+), 11 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/db/sysdb_search.c b/src/db/sysdb_search.c
 | ||||
| index 677257405fae51774d4cd0c17516238e74fb7592..da0c6d90c6b3a88cfa928aaffa2c8eb843cb1a74 100644
 | ||||
| --- a/src/db/sysdb_search.c
 | ||||
| +++ b/src/db/sysdb_search.c
 | ||||
| @@ -1589,7 +1589,7 @@ done:
 | ||||
|   | ||||
|  errno_t sysdb_get_real_name(TALLOC_CTX *mem_ctx, | ||||
|                              struct sss_domain_info *domain, | ||||
| -                            const char *name_or_upn,
 | ||||
| +                            const char *name_or_upn_or_sid,
 | ||||
|                              const char **_cname) | ||||
|  { | ||||
|      errno_t ret; | ||||
| @@ -1603,20 +1603,28 @@ errno_t sysdb_get_real_name(TALLOC_CTX *mem_ctx,
 | ||||
|          return ENOMEM; | ||||
|      } | ||||
|   | ||||
| -    ret = sysdb_getpwnam(tmp_ctx, domain, name_or_upn, &res);
 | ||||
| +    ret = sysdb_getpwnam(tmp_ctx, domain, name_or_upn_or_sid, &res);
 | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "Cannot canonicalize username\n"); | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
|      if (res->count == 0) { | ||||
| -        ret = sysdb_search_user_by_upn(tmp_ctx, domain, name_or_upn, NULL,
 | ||||
| -                                       &msg);
 | ||||
| +        ret = sysdb_search_user_by_upn(tmp_ctx, domain, name_or_upn_or_sid,
 | ||||
| +                                       NULL, &msg);
 | ||||
|          if (ret != EOK) { | ||||
| -            /* User cannot be found in cache */
 | ||||
| -            DEBUG(SSSDBG_OP_FAILURE, "Cannot find user [%s] in cache\n",
 | ||||
| -                                     name_or_upn);
 | ||||
| -            goto done;
 | ||||
| +            if (ret == ENOENT) {
 | ||||
| +                ret = sysdb_search_user_by_sid_str(tmp_ctx, domain,
 | ||||
| +                                                   name_or_upn_or_sid, NULL,
 | ||||
| +                                                   &msg);
 | ||||
| +            }
 | ||||
| +
 | ||||
| +            if (ret != EOK) {
 | ||||
| +                /* User cannot be found in cache */
 | ||||
| +                DEBUG(SSSDBG_OP_FAILURE, "Cannot find user [%s] in cache\n",
 | ||||
| +                                         name_or_upn_or_sid);
 | ||||
| +                goto done;
 | ||||
| +            }
 | ||||
|          } | ||||
|      } else if (res->count == 1) { | ||||
|          msg = res->msgs[0]; | ||||
| diff --git a/src/providers/data_provider.h b/src/providers/data_provider.h
 | ||||
| index 5df493e9d1ae21ada6f5fd6198a6d9c36680d044..89fb06a0d6f791a8ae50f9d8b4b69d6176912c6c 100644
 | ||||
| --- a/src/providers/data_provider.h
 | ||||
| +++ b/src/providers/data_provider.h
 | ||||
| @@ -150,6 +150,7 @@
 | ||||
|  #define DP_SEC_ID_LEN (sizeof(DP_SEC_ID) - 1) | ||||
|   | ||||
|  #define EXTRA_NAME_IS_UPN "U" | ||||
| +#define EXTRA_NAME_IS_SID "S"
 | ||||
|  #define EXTRA_INPUT_MAYBE_WITH_VIEW "V" | ||||
|   | ||||
|  /* AUTH related common data and functions */ | ||||
| diff --git a/src/providers/ipa/ipa_subdomains_id.c b/src/providers/ipa/ipa_subdomains_id.c
 | ||||
| index 0508e14b690c144f4bace9ed14a326ac724eb910..15776d2e13af158058a874f761671a5801cf3d6a 100644
 | ||||
| --- a/src/providers/ipa/ipa_subdomains_id.c
 | ||||
| +++ b/src/providers/ipa/ipa_subdomains_id.c
 | ||||
| @@ -201,6 +201,7 @@ static void ipa_subdomain_account_got_override(struct tevent_req *subreq)
 | ||||
|      } | ||||
|   | ||||
|      if (state->override_attrs != NULL) { | ||||
| +        DEBUG(SSSDBG_TRACE_ALL, "Processing override.\n");
 | ||||
|          ret = sysdb_attrs_get_string(state->override_attrs, | ||||
|                                       SYSDB_OVERRIDE_ANCHOR_UUID, | ||||
|                                       &anchor); | ||||
| @@ -219,6 +220,16 @@ static void ipa_subdomain_account_got_override(struct tevent_req *subreq)
 | ||||
|                  DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n"); | ||||
|                  goto fail; | ||||
|              } | ||||
| +
 | ||||
| +            if (state->ipa_server_mode
 | ||||
| +                    && (state->ar->entry_type & BE_REQ_TYPE_MASK)
 | ||||
| +                                                         == BE_REQ_INITGROUPS) {
 | ||||
| +                DEBUG(SSSDBG_TRACE_ALL,
 | ||||
| +                      "Switching back to BE_REQ_INITGROUPS.\n");
 | ||||
| +                ar->entry_type = BE_REQ_INITGROUPS;
 | ||||
| +                ar->filter_type = BE_FILTER_SECID;
 | ||||
| +                ar->attr_type = BE_ATTR_CORE;
 | ||||
| +            }
 | ||||
|          } else { | ||||
|              DEBUG(SSSDBG_CRIT_FAILURE, | ||||
|                    "Unsupported override anchor type [%s].\n", anchor); | ||||
| @@ -1125,6 +1136,8 @@ static errno_t ipa_get_ad_apply_override_step(struct tevent_req *req)
 | ||||
|   | ||||
|      /* Replace ID with name in search filter */ | ||||
|      if ((entry_type == BE_REQ_USER && state->ar->filter_type == BE_FILTER_IDNUM) | ||||
| +            || (entry_type == BE_REQ_INITGROUPS
 | ||||
| +                    && state->ar->filter_type == BE_FILTER_SECID)
 | ||||
|              || entry_type == BE_REQ_BY_SECID) { | ||||
|          if (state->obj_msg == NULL) { | ||||
|              ret = get_object_from_cache(state, state->obj_dom, state->ar, | ||||
| diff --git a/src/providers/ldap/ldap_id.c b/src/providers/ldap/ldap_id.c
 | ||||
| index 55bb3c9fbd6f623e7795d7399c9e5ac4d5192e85..c2686d249ddf5448c3589c4d8afe32caf09c90a4 100644
 | ||||
| --- a/src/providers/ldap/ldap_id.c
 | ||||
| +++ b/src/providers/ldap/ldap_id.c
 | ||||
| @@ -1391,7 +1391,8 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|          break; | ||||
|   | ||||
|      case BE_REQ_INITGROUPS: /* init groups for user */ | ||||
| -        if (ar->filter_type != BE_FILTER_NAME) {
 | ||||
| +        if (ar->filter_type != BE_FILTER_NAME
 | ||||
| +                && ar->filter_type != BE_FILTER_SECID) {
 | ||||
|              ret = EINVAL; | ||||
|              state->err = "Invalid filter type"; | ||||
|              goto done; | ||||
| @@ -1401,11 +1402,21 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              state->err = "Invalid attr type"; | ||||
|              goto done; | ||||
|          } | ||||
| +        if (ar->filter_type == BE_FILTER_SECID && ar->extra_value != NULL
 | ||||
| +                && strcmp(ar->extra_value, EXTRA_NAME_IS_SID) != 0) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +                  "Unexpected extra value [%s] for BE_FILTER_SECID.\n",
 | ||||
| +                  ar->extra_value);
 | ||||
| +            ret = EINVAL;
 | ||||
| +            state->err = "Invalid extra value";
 | ||||
| +            goto done;
 | ||||
| +        }
 | ||||
|   | ||||
|          subreq = groups_by_user_send(state, be_ctx->ev, id_ctx, | ||||
|                                       sdom, conn, | ||||
|                                       ar->filter_value, | ||||
| -                                     ar->extra_value,
 | ||||
| +                                     (ar->filter_type == BE_FILTER_SECID)
 | ||||
| +                                        ? EXTRA_NAME_IS_SID : ar->extra_value,
 | ||||
|                                       noexist_delete); | ||||
|          break; | ||||
|   | ||||
| diff --git a/src/providers/ldap/sdap_async_initgroups.c b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| index ae617b9c4c6899d0b85dcc4c4b6b971d0f235b88..5c5be5eabd7006b457291062519cdad9626f13fa 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| @@ -2716,6 +2716,8 @@ struct tevent_req *sdap_get_initgr_send(TALLOC_CTX *memctx,
 | ||||
|   | ||||
|      if (extra_value && strcmp(extra_value, EXTRA_NAME_IS_UPN) == 0) { | ||||
|          search_attr =  state->opts->user_map[SDAP_AT_USER_PRINC].name; | ||||
| +    } else if (extra_value && strcmp(extra_value, EXTRA_NAME_IS_SID) == 0) {
 | ||||
| +        search_attr =  state->opts->user_map[SDAP_AT_USER_OBJECTSID].name;
 | ||||
|      } else { | ||||
|          search_attr =  state->opts->user_map[SDAP_AT_USER_NAME].name; | ||||
|      } | ||||
| diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c
 | ||||
| index 7c2c6d208127b0b6f9025435619b027246c6dd35..0185beeaf03d0fc72c9ead22bc73887c701d964f 100644
 | ||||
| --- a/src/tests/sysdb-tests.c
 | ||||
| +++ b/src/tests/sysdb-tests.c
 | ||||
| @@ -3577,6 +3577,10 @@ START_TEST(test_sysdb_get_real_name)
 | ||||
|      ret = sysdb_attrs_add_string(user_attrs, SYSDB_UPN, "foo@bar"); | ||||
|      fail_unless(ret == EOK, "sysdb_attrs_add_string failed."); | ||||
|   | ||||
| +    ret = sysdb_attrs_add_string(user_attrs, SYSDB_SID_STR,
 | ||||
| +                                 "S-1-5-21-123-456-789-111");
 | ||||
| +    fail_unless(ret == EOK, "sysdb_attrs_add_string failed.");
 | ||||
| +
 | ||||
|      ret = sysdb_store_user(test_ctx->domain, "RealName", | ||||
|                             NULL, 22345, 0, "gecos", | ||||
|                             "/home/realname", "/bin/bash", | ||||
| @@ -3592,7 +3596,13 @@ START_TEST(test_sysdb_get_real_name)
 | ||||
|      ret = sysdb_get_real_name(test_ctx, test_ctx->domain, "foo@bar", &str); | ||||
|      fail_unless(ret == EOK, "sysdb_get_real_name failed."); | ||||
|      fail_unless(strcmp(str, "RealName") == 0, "Expected [%s], got [%s].", | ||||
| -                                              "foo@bar", str);
 | ||||
| +                                              "RealName", str);
 | ||||
| +
 | ||||
| +    ret = sysdb_get_real_name(test_ctx, test_ctx->domain,
 | ||||
| +                              "S-1-5-21-123-456-789-111", &str);
 | ||||
| +    fail_unless(ret == EOK, "sysdb_get_real_name failed.");
 | ||||
| +    fail_unless(strcmp(str, "RealName") == 0, "Expected [%s], got [%s].",
 | ||||
| +                                              "RealName", str);
 | ||||
|   | ||||
|  } | ||||
|  END_TEST | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										31
									
								
								0072-IPA-fix-segfault-in-ipa_s2n_exop.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								0072-IPA-fix-segfault-in-ipa_s2n_exop.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| From e31d5babfd036cf64c9179dc60bbd79f541ef89b Mon Sep 17 00:00:00 2001 | ||||
| From: Aron Parsons <parsonsa@bit-sys.com> | ||||
| Date: Wed, 29 Apr 2015 03:19:32 +0000 | ||||
| Subject: [PATCH 72/99] IPA: fix segfault in ipa_s2n_exop | ||||
| 
 | ||||
| can be triggered on demand by assigning a POSIX group | ||||
| with external members sudo privileges, then dropping | ||||
| the cache and doing a sudo -U <user> -l. | ||||
| 
 | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit c520f40d1a2d77cf1d413451b5682297733521ed) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index 688fdefe8eefe29a0cd13010bb3998527f3111f4..d07923cffb49bbfeb7d500f281b1a2aff547ed1c 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -2165,7 +2165,7 @@ static errno_t ipa_s2n_save_objects(struct sss_domain_info *dom,
 | ||||
|          goto done; | ||||
|      } | ||||
|   | ||||
| -    if (strcmp(view_name, SYSDB_DEFAULT_VIEW_NAME) != 0) {
 | ||||
| +    if (view_name != NULL && strcmp(view_name, SYSDB_DEFAULT_VIEW_NAME) != 0) {
 | ||||
|          /* For the default view the data return by the extdom plugin already | ||||
|           * contains all needed data and it is not expected to have a separate | ||||
|           * override object. */ | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										36
									
								
								0073-autofs-fix-Cannot-allocate-memory-with-FQDNs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								0073-autofs-fix-Cannot-allocate-memory-with-FQDNs.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| From 8f57c6765b10de36582ef1dbee32d75452451a94 Mon Sep 17 00:00:00 2001 | ||||
| From: Aron Parsons <parsonsa@bit-sys.com> | ||||
| Date: Wed, 29 Apr 2015 02:44:18 +0000 | ||||
| Subject: [PATCH 73/99] autofs: fix 'Cannot allocate memory' with FQDNs | ||||
| 
 | ||||
| https://fedorahosted.org/sssd/ticket/2643 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 4df706219e64527209f12ad0c7814ee1be979c07) | ||||
| ---
 | ||||
|  src/responder/autofs/autofssrv_cmd.c | 9 --------- | ||||
|  1 file changed, 9 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/responder/autofs/autofssrv_cmd.c b/src/responder/autofs/autofssrv_cmd.c
 | ||||
| index 797e638d53a8adbac658541496bd0ab85d271533..27b6617c2dd2403aa50cf2c9d96886b3bfee7ea7 100644
 | ||||
| --- a/src/responder/autofs/autofssrv_cmd.c
 | ||||
| +++ b/src/responder/autofs/autofssrv_cmd.c
 | ||||
| @@ -628,15 +628,6 @@ lookup_automntmap_step(struct setautomntent_lookup_ctx *lookup_ctx)
 | ||||
|   | ||||
|      /* Check each domain for this map name */ | ||||
|      while (dom) { | ||||
| -        /* if it is a domainless search, skip domains that require fully
 | ||||
| -         * qualified names instead */
 | ||||
| -        while (dom && dctx->cmd_ctx->check_next && dom->fqnames) {
 | ||||
| -            dom = get_next_domain(dom, false);
 | ||||
| -        }
 | ||||
| -
 | ||||
| -        /* No domains left to search */
 | ||||
| -        if (!dom) break;
 | ||||
| -
 | ||||
|          if (dom != dctx->domain) { | ||||
|              /* make sure we reset the check_provider flag when we check | ||||
|               * a new domain */ | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										57
									
								
								0074-GPO-Do-not-ignore-missing-attrs-for-GPOs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								0074-GPO-Do-not-ignore-missing-attrs-for-GPOs.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | ||||
| From 7c8c34c1ad152892f93d8e01336258bfd0bc35b9 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Wed, 29 Apr 2015 09:17:18 +0200 | ||||
| Subject: [PATCH 74/99] GPO: Do not ignore missing attrs for GPOs | ||||
| 
 | ||||
| We don't want to skip over a GPO that might properly be denying | ||||
| users. | ||||
| 
 | ||||
| [sssd[be[a.foo.com]]] [sdap_sd_search_send] (0x0400): | ||||
|     Searching entry [cn={2BA15B73-9524-419F-B4B7-185E1F0D3DCF},cn=policies,cn=system,DC=foo,DC=com] using SD | ||||
| [sssd[be[a.foo.com]]] [sdap_get_generic_ext_step] (0x0400): | ||||
|     calling ldap_search_ext with [(objectclass=*)][cn={2BA15B73-9524-419F-B4B7-185E1F0D3DCF},cn=policies,cn=system,DC=lzb,DC=hq]. | ||||
| [sssd[be[a.foo.com]]] [sdap_process_message] (0x4000): | ||||
|     Message type: [LDAP_RES_SEARCH_RESULT] | ||||
| [sssd[be[a.foo.com]]] [sdap_get_generic_op_finished] (0x0400): | ||||
|     Search result: Referral(10), 0000202B: RefErr: DSID-0310063C, data 0, 1 access points | ||||
|         ref 1: 'lzb.hq' | ||||
| [sssd[be[a.foo.com]]] [sdap_get_generic_op_finished] (0x1000): | ||||
|     Ref: ldap://foo.com/cn=%7B2BA15B73-9524-419F-B4B7-185E1F0D3DCF%7D,cn=policies,cn=system,DC=foo,DC=com | ||||
| [sssd[be[a.foo.com]]] [ad_gpo_get_gpo_attrs_done] (0x0040): | ||||
|     no attrs found for GPO; try next GPO. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2629 | ||||
| 
 | ||||
| Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
| (cherry picked from commit 03e5f1528184a558fd990e66f083157b404dce08) | ||||
| ---
 | ||||
|  src/providers/ad/ad_gpo.c | 12 +++++++++--- | ||||
|  1 file changed, 9 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ad/ad_gpo.c b/src/providers/ad/ad_gpo.c
 | ||||
| index 990acf94ae6d8fbd8f0e512354d22e1d0a71c292..af864dfbe021438feceffd610cc0ad2b69ca670a 100644
 | ||||
| --- a/src/providers/ad/ad_gpo.c
 | ||||
| +++ b/src/providers/ad/ad_gpo.c
 | ||||
| @@ -3497,9 +3497,15 @@ ad_gpo_get_gpo_attrs_done(struct tevent_req *subreq)
 | ||||
|      } | ||||
|   | ||||
|      if ((num_results < 1) || (results == NULL)) { | ||||
| -        DEBUG(SSSDBG_OP_FAILURE, "no attrs found for GPO; try next GPO.\n");
 | ||||
| -        state->gpo_index++;
 | ||||
| -        ret = ad_gpo_get_gpo_attrs_step(req);
 | ||||
| +        const char *gpo_dn = state->candidate_gpos[state->gpo_index]->gpo_dn;
 | ||||
| +
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +              "BUG: No attrs found for GPO [%s]. This was likely caused by "
 | ||||
| +              "the GPO entry being a referred to another domain controller."
 | ||||
| +              " SSSD does not yet support this configuration. See upstream "
 | ||||
| +              "ticket #2645 for more information.\n",
 | ||||
| +              gpo_dn);
 | ||||
| +        ret = ERR_INTERNAL;
 | ||||
|          goto done; | ||||
|      } | ||||
|      else if (num_results > 1) { | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,65 @@ | ||||
| From 21d34cf3c25de9e39f3947059f65b56c8e7dbe25 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 4 May 2015 07:34:19 +0200 | ||||
| Subject: [PATCH 75/99] sss_nss_idmap-tests: Use different prepared buffers for | ||||
|  big endian | ||||
| 
 | ||||
| We get error EBADMSG instead of EOK due to endianess issue | ||||
| 
 | ||||
| [==========] Running 2 test(s). | ||||
| [ RUN      ] test_getsidbyname | ||||
| 0x4a != 0 | ||||
| src/tests/cmocka/sss_nss_idmap-tests.c:108: error: Failure! | ||||
| 
 | ||||
| [  FAILED  ] test_getsidbyname | ||||
| [ RUN      ] test_getorigbyname | ||||
| 0x4a != 0 | ||||
| src/tests/cmocka/sss_nss_idmap-tests.c:127: error: Failure! | ||||
| 
 | ||||
| [  FAILED  ] test_getorigbyname | ||||
| 
 | ||||
| Reviewed-by: Sumit Bose <sbose@redhat.com> | ||||
| (cherry picked from commit 582f6b1d15d216a39a66b70f0b3ecdf5b0f47673) | ||||
| ---
 | ||||
|  src/tests/cmocka/sss_nss_idmap-tests.c | 12 ++++++++++++ | ||||
|  1 file changed, 12 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/tests/cmocka/sss_nss_idmap-tests.c b/src/tests/cmocka/sss_nss_idmap-tests.c
 | ||||
| index 4ba8f2f9265389d63983e44fe14f026c9a7b8d50..8807eca619d7b07d919168e5629042cf38f654ac 100644
 | ||||
| --- a/src/tests/cmocka/sss_nss_idmap-tests.c
 | ||||
| +++ b/src/tests/cmocka/sss_nss_idmap-tests.c
 | ||||
| @@ -28,6 +28,7 @@
 | ||||
|   | ||||
|   | ||||
|  #include "util/util.h" | ||||
| +#include "util/sss_endian.h"
 | ||||
|   | ||||
|  #include "sss_client/idmap/sss_nss_idmap.h" | ||||
|  #include "tests/cmocka/common_mock.h" | ||||
| @@ -42,12 +43,23 @@ struct sss_nss_make_request_test_data {
 | ||||
|      enum nss_status nss_status; | ||||
|  }; | ||||
|   | ||||
| +#if (__BYTE_ORDER == __LITTLE_ENDIAN)
 | ||||
|  uint8_t buf1[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 't', 'e', 's', 't', 0x00}; | ||||
|  uint8_t buf2[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 't', 'e', 's', 't', 0x00}; | ||||
|  uint8_t buf3[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 't', 'e', 's', 't', 0x00}; | ||||
|  uint8_t buf4[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 't', 'e', 's', 't', 'x'}; | ||||
|   | ||||
|  uint8_t buf_orig1[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 'k', 'e', 'y', 0x00, 'v', 'a', 'l', 'u', 'e', 0x00}; | ||||
| +#elif (__BYTE_ORDER == __BIG_ENDIAN)
 | ||||
| +uint8_t buf1[] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 't', 'e', 's', 't', 0x00};
 | ||||
| +uint8_t buf2[] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 't', 'e', 's', 't', 0x00};
 | ||||
| +uint8_t buf3[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 't', 'e', 's', 't', 0x00};
 | ||||
| +uint8_t buf4[] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 't', 'e', 's', 't', 'x'};
 | ||||
| +
 | ||||
| +uint8_t buf_orig1[] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 'k', 'e', 'y', 0x00, 'v', 'a', 'l', 'u', 'e', 0x00};
 | ||||
| +#else
 | ||||
| + #error "unknow endianess"
 | ||||
| +#endif
 | ||||
|   | ||||
|  enum nss_status sss_nss_make_request(enum sss_cli_command cmd, | ||||
|                        struct sss_cli_req_data *rd, | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										65
									
								
								0076-SDAP-Fix-id-mapping-with-disabled-subdomains.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								0076-SDAP-Fix-id-mapping-with-disabled-subdomains.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,65 @@ | ||||
| From 2bf32678c96304d04e69813fd6d317d981ad2c41 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Tue, 28 Apr 2015 20:26:47 +0200 | ||||
| Subject: [PATCH 76/99] SDAP: Fix id mapping with disabled subdomains | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| If subdomains are disabled "subdomain_provider = none" | ||||
| then auto-discovery discovery of domain SID is disabled. | ||||
| It is possible to configure options ldap_idmap_default_domain{,_sid} | ||||
| and id mapping should work. | ||||
| 
 | ||||
| However value of option ldap_idmap_default_domain_sid was not assigned to | ||||
| sss_domain_info for main domain. It was only used for initialisation of | ||||
| sdap_idmap_ctx. As a result of this bug posix attributes were used in | ||||
| ldap filter and id mapping worked just for users with posix attributes. | ||||
| 
 | ||||
| [be_get_account_info] (0x0100): Got request for [0x1001][1][name=user] | ||||
| [be_req_set_domain] (0x0400): | ||||
|         Changing request domain from [EXAMPLE.TEST] to [EXAMPLE.TEST] | ||||
| [sdap_idmap_domain_has_algorithmic_mapping] (0x0080): | ||||
|         Could not parse domain SID from [(null)] | ||||
| [sdap_idmap_domain_has_algorithmic_mapping] (0x0080): | ||||
|         Could not parse domain SID from [(null)] | ||||
| [sdap_search_user_next_base] (0x0400): | ||||
|         Searching for users with base [DC=EXAMPLE,DC=TEST] | ||||
| [sdap_get_generic_ext_step] (0x0400): | ||||
|         calling ldap_search_ext with | ||||
|                         [(&(sAMAccountName=hdpadmin)(objectclass=user) | ||||
|                            (sAMAccountName=*)(&(uidNumber=*)(!(uidNumber=0))))] | ||||
|                         [DC=EXAMPLE,DC=TEST]. | ||||
| [sdap_search_user_process] (0x0400): Search for users, returned 0 results. | ||||
| [sdap_get_users_done] (0x0040): Failed to retrieve users | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2635 | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit 21687d1d553579e81aa43bfa20f2e70fb39e8461) | ||||
| ---
 | ||||
|  src/providers/ldap/sdap_idmap.c | 7 +++++++ | ||||
|  1 file changed, 7 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/providers/ldap/sdap_idmap.c b/src/providers/ldap/sdap_idmap.c
 | ||||
| index 0a82e61f788b663e564d68c5d48bb705a33584eb..dd959b2c133b342f105f76c26c889d678ce40391 100644
 | ||||
| --- a/src/providers/ldap/sdap_idmap.c
 | ||||
| +++ b/src/providers/ldap/sdap_idmap.c
 | ||||
| @@ -288,6 +288,13 @@ sdap_idmap_init(TALLOC_CTX *mem_ctx,
 | ||||
|   | ||||
|          sid_str = dp_opt_get_string(idmap_ctx->id_ctx->opts->basic, SDAP_IDMAP_DEFAULT_DOMAIN_SID); | ||||
|          if (sid_str) { | ||||
| +            struct sss_domain_info *domain = idmap_ctx->id_ctx->be->domain;
 | ||||
| +            domain->domain_id = talloc_strdup(domain, sid_str);
 | ||||
| +            if (domain->domain_id == NULL) {
 | ||||
| +                ret = ENOMEM;
 | ||||
| +                goto done;
 | ||||
| +            }
 | ||||
| +
 | ||||
|              /* Set the default domain as slice 0 */ | ||||
|              ret = sdap_idmap_add_domain(idmap_ctx, dom_name, | ||||
|                                          sid_str, 0); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										99
									
								
								0077-IPA-do-initgroups-if-extdom-exop-supports-it.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								0077-IPA-do-initgroups-if-extdom-exop-supports-it.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,99 @@ | ||||
| From 24905d4ecbf210687e385449448f5a5ec97d2833 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Tue, 28 Apr 2015 17:18:48 +0200 | ||||
| Subject: [PATCH 77/99] IPA: do initgroups if extdom exop supports it | ||||
| 
 | ||||
| Newer versions of the extdom plugin return the full list of | ||||
| group-memberships during a user lookup request. With these version there | ||||
| is no need to reject a initgroups request for sub/trusted-domain users | ||||
| anymore. This is e.g. useful for callers which call getgrouplist() | ||||
| directly without calling getpwnam() before. Additionally it helps if for | ||||
| some reasons the lifetime of the user entry and the lifetime of the | ||||
| initgroups data is different. | ||||
| 
 | ||||
| Related to https://fedorahosted.org/sssd/ticket/2633 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit e87badc0f6fb20a443cf12bde9582ecbc2aef727) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c      |  3 --- | ||||
|  src/providers/ipa/ipa_subdomains.h    |  4 ++++ | ||||
|  src/providers/ipa/ipa_subdomains_id.c | 24 +++++++++++++++++------- | ||||
|  3 files changed, 21 insertions(+), 10 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index d07923cffb49bbfeb7d500f281b1a2aff547ed1c..3830a2b4b0a82f056b0992c260bef6fe718c10da 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -50,9 +50,6 @@ enum response_types {
 | ||||
|  }; | ||||
|   | ||||
|  /* ==Sid2Name Extended Operation============================================= */ | ||||
| -#define EXOP_SID2NAME_OID "2.16.840.1.113730.3.8.10.4"
 | ||||
| -#define EXOP_SID2NAME_V1_OID "2.16.840.1.113730.3.8.10.4.1"
 | ||||
| -
 | ||||
|  struct ipa_s2n_exop_state { | ||||
|      struct sdap_handle *sh; | ||||
|   | ||||
| diff --git a/src/providers/ipa/ipa_subdomains.h b/src/providers/ipa/ipa_subdomains.h
 | ||||
| index ceb862226b504bca6c9c596554fb88e6df1d51c3..9b179792dcab7ea935fa7159ca879d12b561a55f 100644
 | ||||
| --- a/src/providers/ipa/ipa_subdomains.h
 | ||||
| +++ b/src/providers/ipa/ipa_subdomains.h
 | ||||
| @@ -28,6 +28,10 @@
 | ||||
|  #include "providers/dp_backend.h" | ||||
|  #include "providers/ipa/ipa_common.h" | ||||
|   | ||||
| +/* ==Sid2Name Extended Operation============================================= */
 | ||||
| +#define EXOP_SID2NAME_OID "2.16.840.1.113730.3.8.10.4"
 | ||||
| +#define EXOP_SID2NAME_V1_OID "2.16.840.1.113730.3.8.10.4.1"
 | ||||
| +
 | ||||
|  struct be_ctx *ipa_get_subdomains_be_ctx(struct be_ctx *be_ctx); | ||||
|   | ||||
|  const char *get_flat_name_from_subdomain_name(struct be_ctx *be_ctx, | ||||
| diff --git a/src/providers/ipa/ipa_subdomains_id.c b/src/providers/ipa/ipa_subdomains_id.c
 | ||||
| index 15776d2e13af158058a874f761671a5801cf3d6a..1253510dcb8523c19d879d4351ffa07995f161f7 100644
 | ||||
| --- a/src/providers/ipa/ipa_subdomains_id.c
 | ||||
| +++ b/src/providers/ipa/ipa_subdomains_id.c
 | ||||
| @@ -386,15 +386,9 @@ struct tevent_req *ipa_get_subdom_acct_send(TALLOC_CTX *memctx,
 | ||||
|          case BE_REQ_GROUP: | ||||
|          case BE_REQ_BY_SECID: | ||||
|          case BE_REQ_USER_AND_GROUP: | ||||
| +        case BE_REQ_INITGROUPS:
 | ||||
|              ret = EOK; | ||||
|              break; | ||||
| -        case BE_REQ_INITGROUPS:
 | ||||
| -            ret = ENOTSUP;
 | ||||
| -            DEBUG(SSSDBG_TRACE_FUNC, "Initgroups requests are not handled " \
 | ||||
| -                                      "by the IPA provider but are resolved " \
 | ||||
| -                                      "by the responder directly from the " \
 | ||||
| -                                      "cache.\n");
 | ||||
| -            break;
 | ||||
|          default: | ||||
|              ret = EINVAL; | ||||
|              DEBUG(SSSDBG_OP_FAILURE, "Invalid sub-domain request type.\n"); | ||||
| @@ -434,6 +428,22 @@ static void ipa_get_subdom_acct_connected(struct tevent_req *subreq)
 | ||||
|          return; | ||||
|      } | ||||
|   | ||||
| +    if (state->entry_type == BE_REQ_INITGROUPS) {
 | ||||
| +        /* With V1 of the extdom plugin a user lookup will resolve the full
 | ||||
| +         * group membership of the user. */
 | ||||
| +        if (sdap_is_extension_supported(sdap_id_op_handle(state->op),
 | ||||
| +                                        EXOP_SID2NAME_V1_OID)) {
 | ||||
| +            state->entry_type = BE_REQ_USER;
 | ||||
| +        } else {
 | ||||
| +            DEBUG(SSSDBG_TRACE_FUNC, "Initgroups requests are not handled " \
 | ||||
| +                                      "by the IPA provider but are resolved " \
 | ||||
| +                                      "by the responder directly from the " \
 | ||||
| +                                      "cache.\n");
 | ||||
| +            tevent_req_error(req, ENOTSUP);
 | ||||
| +            return;
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +
 | ||||
|      req_input = talloc(state, struct req_input); | ||||
|      if (req_input == NULL) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "talloc failed.\n"); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										104
									
								
								0078-IPA-update-initgr-expire-timestamp-conditionally.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								0078-IPA-update-initgr-expire-timestamp-conditionally.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,104 @@ | ||||
| From f643fadbd072a9d3725f5f750340d5b13628ce6a Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Tue, 28 Apr 2015 17:20:05 +0200 | ||||
| Subject: [PATCH 78/99] IPA: update initgr expire timestamp conditionally | ||||
| 
 | ||||
| Newer versions of the extdom plugin return the full list of | ||||
| group-memberships during user lookups. As a result the lifetime of the | ||||
| group-membership data is updates in those cases. But if the user is not | ||||
| looked up directly but is resolved as a group member during a group | ||||
| lookup SSSD does not resolve all group-membership of the user to avoid | ||||
| deep recursion and eventually a complete enumeration of the user and | ||||
| group base. In this case the lifetime of the group-memberships should | ||||
| not be updated because it might be incomplete. | ||||
| 
 | ||||
| Related to https://fedorahosted.org/sssd/ticket/2633 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit cffe3135f29c737f2598f3c1384bfba1694fb843) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 19 +++++++++++-------- | ||||
|  1 file changed, 11 insertions(+), 8 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index 3830a2b4b0a82f056b0992c260bef6fe718c10da..daebd68853c2d8671b752edb8f2639f795093014 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -685,7 +685,8 @@ static errno_t ipa_s2n_save_objects(struct sss_domain_info *dom,
 | ||||
|                                      struct resp_attrs *attrs, | ||||
|                                      struct resp_attrs *simple_attrs, | ||||
|                                      const char *view_name, | ||||
| -                                    struct sysdb_attrs *override_attrs);
 | ||||
| +                                    struct sysdb_attrs *override_attrs,
 | ||||
| +                                    bool update_initgr_timeout);
 | ||||
|   | ||||
|  static errno_t s2n_response_to_attrs(TALLOC_CTX *mem_ctx, | ||||
|                                       char *retoid, | ||||
| @@ -1118,7 +1119,7 @@ static errno_t ipa_s2n_get_fqlist_save_step(struct tevent_req *req)
 | ||||
|   | ||||
|      ret = ipa_s2n_save_objects(state->dom, &state->req_input, state->attrs, | ||||
|                                 NULL, state->ipa_ctx->view_name, | ||||
| -                               state->override_attrs);
 | ||||
| +                               state->override_attrs, false);
 | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n"); | ||||
|          return ret; | ||||
| @@ -1617,7 +1618,7 @@ static void ipa_s2n_get_user_done(struct tevent_req *subreq)
 | ||||
|              || strcmp(state->ipa_ctx->view_name, | ||||
|                        SYSDB_DEFAULT_VIEW_NAME) == 0) { | ||||
|          ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, | ||||
| -                                   state->simple_attrs, NULL, NULL);
 | ||||
| +                                   state->simple_attrs, NULL, NULL, true);
 | ||||
|          if (ret != EOK) { | ||||
|              DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n"); | ||||
|              goto done; | ||||
| @@ -1739,7 +1740,8 @@ static errno_t ipa_s2n_save_objects(struct sss_domain_info *dom,
 | ||||
|                                      struct resp_attrs *attrs, | ||||
|                                      struct resp_attrs *simple_attrs, | ||||
|                                      const char *view_name, | ||||
| -                                    struct sysdb_attrs *override_attrs)
 | ||||
| +                                    struct sysdb_attrs *override_attrs,
 | ||||
| +                                    bool update_initgr_timeout)
 | ||||
|  { | ||||
|      int ret; | ||||
|      time_t now; | ||||
| @@ -1938,7 +1940,8 @@ static errno_t ipa_s2n_save_objects(struct sss_domain_info *dom,
 | ||||
|                  } | ||||
|              } | ||||
|   | ||||
| -            if (attrs->response_type == RESP_USER_GROUPLIST) {
 | ||||
| +            if (attrs->response_type == RESP_USER_GROUPLIST
 | ||||
| +                    && update_initgr_timeout) {
 | ||||
|                  /* Since RESP_USER_GROUPLIST contains all group memberships it | ||||
|                   * is effectively an initgroups request hence | ||||
|                   * SYSDB_INITGR_EXPIRE will be set.*/ | ||||
| @@ -2209,7 +2212,7 @@ static void ipa_s2n_get_fqlist_done(struct tevent_req  *subreq)
 | ||||
|                                   &sid_str); | ||||
|      if (ret == ENOENT) { | ||||
|          ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, | ||||
| -                                   state->simple_attrs, NULL, NULL);
 | ||||
| +                                   state->simple_attrs, NULL, NULL, true);
 | ||||
|          if (ret != EOK) { | ||||
|              DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n"); | ||||
|              goto fail; | ||||
| @@ -2249,7 +2252,7 @@ static void ipa_s2n_get_fqlist_done(struct tevent_req  *subreq)
 | ||||
|          ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, | ||||
|                                     state->simple_attrs, | ||||
|                                     state->ipa_ctx->view_name, | ||||
| -                                   state->override_attrs);
 | ||||
| +                                   state->override_attrs, true);
 | ||||
|          if (ret != EOK) { | ||||
|              DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n"); | ||||
|              tevent_req_error(req, ret); | ||||
| @@ -2285,7 +2288,7 @@ static void ipa_s2n_get_user_get_override_done(struct tevent_req *subreq)
 | ||||
|   | ||||
|      ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, | ||||
|                                 state->simple_attrs, state->ipa_ctx->view_name, | ||||
| -                               override_attrs);
 | ||||
| +                               override_attrs, true);
 | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n"); | ||||
|          tevent_req_error(req, ret); | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										198
									
								
								0079-IPA-enhance-ipa_initgr_get_overrides_send.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								0079-IPA-enhance-ipa_initgr_get_overrides_send.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,198 @@ | ||||
| From 58a19d50888b1a7da0ee78b49e7d3dcbebc8614d Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Tue, 28 Apr 2015 20:58:15 +0200 | ||||
| Subject: [PATCH 79/99] IPA: enhance ipa_initgr_get_overrides_send() | ||||
| 
 | ||||
| This patch makes ipa_initgr_get_overrides_send() public and add support | ||||
| to search overrides by UUID or by SID. | ||||
| 
 | ||||
| Related to https://fedorahosted.org/sssd/ticket/2633 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 145578006684481434ced78461ab8d1c3570f478) | ||||
| ---
 | ||||
|  src/db/sysdb_views.c       |  5 ++++ | ||||
|  src/providers/ipa/ipa_id.c | 63 +++++++++++++++++++++++++++++++++------------- | ||||
|  src/providers/ipa/ipa_id.h | 10 ++++++++ | ||||
|  3 files changed, 61 insertions(+), 17 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/db/sysdb_views.c b/src/db/sysdb_views.c
 | ||||
| index 945f16ac1753e3b4dfa0c799b00ad177b24d438c..aadd6018f4d1e2ca33e2e00dd8b13b55a8c03f3e 100644
 | ||||
| --- a/src/db/sysdb_views.c
 | ||||
| +++ b/src/db/sysdb_views.c
 | ||||
| @@ -739,6 +739,11 @@ errno_t sysdb_apply_default_override(struct sss_domain_info *domain,
 | ||||
|                                      NULL }; | ||||
|      bool override_attrs_found = false; | ||||
|   | ||||
| +    if (override_attrs == NULL) {
 | ||||
| +        /* nothing to do */
 | ||||
| +        return EOK;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      tmp_ctx = talloc_new(NULL); | ||||
|      if (tmp_ctx == NULL) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n"); | ||||
| diff --git a/src/providers/ipa/ipa_id.c b/src/providers/ipa/ipa_id.c
 | ||||
| index 38ac4904dcd97c3e241b28143e1f7b8fade37d70..ebf5f03b822e00aa04e45eeca79b8dade67631d2 100644
 | ||||
| --- a/src/providers/ipa/ipa_id.c
 | ||||
| +++ b/src/providers/ipa/ipa_id.c
 | ||||
| @@ -294,6 +294,7 @@ struct ipa_initgr_get_overrides_state {
 | ||||
|   | ||||
|      struct ldb_message **groups; | ||||
|      size_t group_count; | ||||
| +    const char *groups_id_attr;
 | ||||
|      size_t group_idx; | ||||
|      struct be_acct_req *ar; | ||||
|   | ||||
| @@ -302,13 +303,14 @@ struct ipa_initgr_get_overrides_state {
 | ||||
|   | ||||
|  static int ipa_initgr_get_overrides_step(struct tevent_req *req); | ||||
|   | ||||
| -static struct tevent_req *
 | ||||
| +struct tevent_req *
 | ||||
|  ipa_initgr_get_overrides_send(TALLOC_CTX *memctx, | ||||
|                               struct tevent_context *ev, | ||||
|                               struct ipa_id_ctx *ipa_ctx, | ||||
|                               struct sss_domain_info *user_dom, | ||||
|                               size_t groups_count, | ||||
| -                             struct ldb_message **groups)
 | ||||
| +                             struct ldb_message **groups,
 | ||||
| +                             const char *groups_id_attr)
 | ||||
|  { | ||||
|      int ret; | ||||
|      struct tevent_req *req; | ||||
| @@ -334,6 +336,12 @@ ipa_initgr_get_overrides_send(TALLOC_CTX *memctx,
 | ||||
|          ret = EINVAL; | ||||
|          goto done; | ||||
|      } | ||||
| +    state->groups_id_attr = talloc_strdup(state, groups_id_attr);
 | ||||
| +    if (state->groups_id_attr == NULL) {
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n");
 | ||||
| +        ret = ENOMEM;
 | ||||
| +        goto done;
 | ||||
| +    }
 | ||||
|   | ||||
|      ret = ipa_initgr_get_overrides_step(req); | ||||
|  done: | ||||
| @@ -366,7 +374,7 @@ static int ipa_initgr_get_overrides_step(struct tevent_req *req)
 | ||||
|      } | ||||
|   | ||||
|      ipa_uuid = ldb_msg_find_attr_as_string(state->groups[state->group_idx], | ||||
| -                                            SYSDB_UUID, NULL);
 | ||||
| +                                           state->groups_id_attr, NULL);
 | ||||
|      if (ipa_uuid == NULL) { | ||||
|          /* This should never happen, the search filter used to get the list | ||||
|           * of groups includes "uuid=*" | ||||
| @@ -377,11 +385,24 @@ static int ipa_initgr_get_overrides_step(struct tevent_req *req)
 | ||||
|   | ||||
|      talloc_free(state->ar); /* Avoid spiking memory with many groups */ | ||||
|   | ||||
| -    ret = get_be_acct_req_for_uuid(state, ipa_uuid,
 | ||||
| -                                   state->user_dom->name, &state->ar);
 | ||||
| -    if (ret != EOK) {
 | ||||
| -        DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n");
 | ||||
| -        return ret;
 | ||||
| +    if (strcmp(state->groups_id_attr, SYSDB_UUID) == 0) {
 | ||||
| +        ret = get_be_acct_req_for_uuid(state, ipa_uuid,
 | ||||
| +                                       state->user_dom->name, &state->ar);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n");
 | ||||
| +            return ret;
 | ||||
| +        }
 | ||||
| +    } else if (strcmp(state->groups_id_attr, SYSDB_SID_STR) == 0) {
 | ||||
| +        ret = get_be_acct_req_for_sid(state, ipa_uuid,
 | ||||
| +                                      state->user_dom->name, &state->ar);
 | ||||
| +        if (ret != EOK) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n");
 | ||||
| +            return ret;
 | ||||
| +        }
 | ||||
| +    } else {
 | ||||
| +        DEBUG(SSSDBG_CRIT_FAILURE, "Unsupported groups ID type [%s].\n",
 | ||||
| +                                   state->groups_id_attr);
 | ||||
| +        return EINVAL;
 | ||||
|      } | ||||
|   | ||||
|      DEBUG(SSSDBG_TRACE_LIBS, "Fetching group %s\n", ipa_uuid); | ||||
| @@ -408,7 +429,7 @@ static void ipa_initgr_get_overrides_override_done(struct tevent_req *subreq)
 | ||||
|      struct ipa_initgr_get_overrides_state *state = tevent_req_data(req, | ||||
|                                          struct ipa_initgr_get_overrides_state); | ||||
|      int ret; | ||||
| -    struct sysdb_attrs *override_attrs;
 | ||||
| +    struct sysdb_attrs *override_attrs = NULL;
 | ||||
|   | ||||
|      ret = ipa_get_ad_override_recv(subreq, &state->dp_error, state, | ||||
|                                     &override_attrs); | ||||
| @@ -419,10 +440,16 @@ static void ipa_initgr_get_overrides_override_done(struct tevent_req *subreq)
 | ||||
|          return; | ||||
|      } | ||||
|   | ||||
| -    ret = sysdb_store_override(state->user_dom, state->ipa_ctx->view_name,
 | ||||
| -                               SYSDB_MEMBER_GROUP,
 | ||||
| -                               override_attrs,
 | ||||
| -                               state->groups[state->group_idx]->dn);
 | ||||
| +    if (strcmp(state->ipa_ctx->view_name, SYSDB_DEFAULT_VIEW_NAME) == 0) {
 | ||||
| +        ret = sysdb_apply_default_override(state->user_dom, override_attrs,
 | ||||
| +                                       state->groups[state->group_idx]->dn);
 | ||||
| +    } else {
 | ||||
| +        ret = sysdb_store_override(state->user_dom,
 | ||||
| +                                   state->ipa_ctx->view_name,
 | ||||
| +                                   SYSDB_MEMBER_GROUP,
 | ||||
| +                                   override_attrs,
 | ||||
| +                                   state->groups[state->group_idx]->dn);
 | ||||
| +    }
 | ||||
|      talloc_free(override_attrs); | ||||
|      if (ret != EOK) { | ||||
|          DEBUG(SSSDBG_OP_FAILURE, "sysdb_store_override failed.\n"); | ||||
| @@ -443,7 +470,7 @@ static void ipa_initgr_get_overrides_override_done(struct tevent_req *subreq)
 | ||||
|      tevent_req_done(req); | ||||
|  } | ||||
|   | ||||
| -static int ipa_initgr_get_overrides_recv(struct tevent_req *req, int *dp_error)
 | ||||
| +int ipa_initgr_get_overrides_recv(struct tevent_req *req, int *dp_error)
 | ||||
|  { | ||||
|      struct ipa_initgr_get_overrides_state *state = tevent_req_data(req, | ||||
|                                          struct ipa_initgr_get_overrides_state); | ||||
| @@ -884,7 +911,8 @@ static void ipa_id_get_account_info_orig_done(struct tevent_req *subreq)
 | ||||
|      if (state->user_groups != NULL) { | ||||
|          subreq = ipa_initgr_get_overrides_send(state, state->ev, state->ipa_ctx, | ||||
|                                                state->domain, state->group_cnt, | ||||
| -                                              state->user_groups);
 | ||||
| +                                              state->user_groups,
 | ||||
| +                                              SYSDB_UUID);
 | ||||
|          if (subreq == NULL) { | ||||
|              DEBUG(SSSDBG_OP_FAILURE, "ipa_resolve_user_list_send failed.\n"); | ||||
|              ret = ENOMEM; | ||||
| @@ -962,8 +990,9 @@ static void ipa_id_get_account_info_done(struct tevent_req *subreq)
 | ||||
|   | ||||
|      if (state->user_groups != NULL) { | ||||
|          subreq = ipa_initgr_get_overrides_send(state, state->ev, state->ipa_ctx, | ||||
| -                                              state->domain, state->group_cnt,
 | ||||
| -                                              state->user_groups);
 | ||||
| +                                               state->domain, state->group_cnt,
 | ||||
| +                                               state->user_groups,
 | ||||
| +                                               SYSDB_UUID);
 | ||||
|          if (subreq == NULL) { | ||||
|              DEBUG(SSSDBG_OP_FAILURE, "ipa_resolve_user_list_send failed.\n"); | ||||
|              ret = ENOMEM; | ||||
| diff --git a/src/providers/ipa/ipa_id.h b/src/providers/ipa/ipa_id.h
 | ||||
| index 2bb5e0d38f42d4bbb04854dfb04804fecf6257e8..c03ca037a2850478a8f4933bac4fcf8bd70ada04 100644
 | ||||
| --- a/src/providers/ipa/ipa_id.h
 | ||||
| +++ b/src/providers/ipa/ipa_id.h
 | ||||
| @@ -119,4 +119,14 @@ errno_t get_object_from_cache(TALLOC_CTX *mem_ctx,
 | ||||
|                                struct sss_domain_info *dom, | ||||
|                                struct be_acct_req *ar, | ||||
|                                struct ldb_message **_msg); | ||||
| +
 | ||||
| +struct tevent_req *
 | ||||
| +ipa_initgr_get_overrides_send(TALLOC_CTX *memctx,
 | ||||
| +                             struct tevent_context *ev,
 | ||||
| +                             struct ipa_id_ctx *ipa_ctx,
 | ||||
| +                             struct sss_domain_info *user_dom,
 | ||||
| +                             size_t groups_count,
 | ||||
| +                             struct ldb_message **groups,
 | ||||
| +                             const char *groups_id_attr);
 | ||||
| +int ipa_initgr_get_overrides_recv(struct tevent_req *req, int *dp_error);
 | ||||
|  #endif | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										115
									
								
								0080-IPA-search-for-overrides-during-initgroups-in-sever-.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								0080-IPA-search-for-overrides-during-initgroups-in-sever-.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,115 @@ | ||||
| From eaf656843831d579f30f94154d88aba2201c1712 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Tue, 28 Apr 2015 20:59:43 +0200 | ||||
| Subject: [PATCH 80/99] IPA: search for overrides during initgroups in sever | ||||
|  mode | ||||
| 
 | ||||
| After the group memberships of a user from a trusted domain are read it | ||||
| must be checked if there are overrides for the discovered groups to be | ||||
| able to return the right gid or name to the caller. | ||||
| 
 | ||||
| Related to https://fedorahosted.org/sssd/ticket/2633 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 2263c6dd1242c92253240f4998c86a04b6a0ca3a) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_subdomains_id.c | 69 +++++++++++++++++++++++++++++++++++ | ||||
|  1 file changed, 69 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_subdomains_id.c b/src/providers/ipa/ipa_subdomains_id.c
 | ||||
| index 1253510dcb8523c19d879d4351ffa07995f161f7..617c091d3abc4808da4a279213ffc3e1119001bf 100644
 | ||||
| --- a/src/providers/ipa/ipa_subdomains_id.c
 | ||||
| +++ b/src/providers/ipa/ipa_subdomains_id.c
 | ||||
| @@ -569,6 +569,8 @@ struct ipa_get_ad_acct_state {
 | ||||
|  static void ipa_get_ad_acct_ad_part_done(struct tevent_req *subreq); | ||||
|  static void ipa_get_ad_override_done(struct tevent_req *subreq); | ||||
|  static errno_t ipa_get_ad_apply_override_step(struct tevent_req *req); | ||||
| +static errno_t ipa_get_ad_ipa_membership_step(struct tevent_req *req);
 | ||||
| +static void ipa_id_get_groups_overrides_done(struct tevent_req *subreq);
 | ||||
|  static void ipa_get_ad_acct_done(struct tevent_req *subreq); | ||||
|  static struct ad_id_ctx *ipa_get_ad_id_ctx(struct ipa_id_ctx *ipa_ctx, | ||||
|                                             struct sss_domain_info *dom); | ||||
| @@ -1123,6 +1125,9 @@ static errno_t ipa_get_ad_apply_override_step(struct tevent_req *req)
 | ||||
|      struct tevent_req *subreq; | ||||
|      const char *obj_name; | ||||
|      int entry_type; | ||||
| +    size_t groups_count = 0;
 | ||||
| +    struct ldb_message **groups = NULL;
 | ||||
| +    const char *attrs[] = SYSDB_INITGR_ATTRS;
 | ||||
|   | ||||
|      if (state->override_attrs != NULL) { | ||||
|          /* We are in ipa-server-mode, so the view is the default view by | ||||
| @@ -1179,6 +1184,70 @@ static errno_t ipa_get_ad_apply_override_step(struct tevent_req *req)
 | ||||
|          state->ar->entry_type = BE_REQ_USER; | ||||
|      } | ||||
|   | ||||
| +    /* Lookup all groups the user is a member of which do not have ORIGINALAD
 | ||||
| +     * attributes set, i.e. where overrides might not have been applied. */
 | ||||
| +    ret = sysdb_asq_search(state, state->obj_dom, state->obj_msg->dn,
 | ||||
| +                          "(&("SYSDB_GC")("SYSDB_GIDNUM"=*)" \
 | ||||
| +                            "(!("ORIGINALAD_PREFIX SYSDB_GIDNUM"=*))" \
 | ||||
| +                            "(!("ORIGINALAD_PREFIX SYSDB_NAME"=*)))",
 | ||||
| +                          SYSDB_INITGR_ATTR,
 | ||||
| +                          attrs, &groups_count, &groups);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE, "ipa_get_ad_groups_without_orig failed.\n");
 | ||||
| +        return ret;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (groups != NULL) {
 | ||||
| +        subreq = ipa_initgr_get_overrides_send(state, state->ev, state->ipa_ctx,
 | ||||
| +                                               state->obj_dom, groups_count,
 | ||||
| +                                               groups, SYSDB_SID_STR);
 | ||||
| +        if (subreq == NULL) {
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "ipa_initgr_get_overrides_send failed.\n");
 | ||||
| +            return ENOMEM;
 | ||||
| +        }
 | ||||
| +        tevent_req_set_callback(subreq, ipa_id_get_groups_overrides_done, req);
 | ||||
| +        return EOK;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = ipa_get_ad_ipa_membership_step(req);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE, "ipa_get_ad_ipa_membership_step failed.\n");
 | ||||
| +        return ret;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return EOK;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void ipa_id_get_groups_overrides_done(struct tevent_req *subreq)
 | ||||
| +{
 | ||||
| +    struct tevent_req *req = tevent_req_callback_data(subreq,
 | ||||
| +                                                struct tevent_req);
 | ||||
| +    errno_t ret;
 | ||||
| +
 | ||||
| +    ret = ipa_initgr_get_overrides_recv(subreq, NULL);
 | ||||
| +    talloc_zfree(subreq);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +              "IPA resolve user groups overrides failed [%d].\n", ret);
 | ||||
| +        tevent_req_error(req, ret);
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ret = ipa_get_ad_ipa_membership_step(req);
 | ||||
| +    if (ret != EOK) {
 | ||||
| +        DEBUG(SSSDBG_OP_FAILURE, "ipa_get_ad_ipa_membership_step failed.\n");
 | ||||
| +        tevent_req_error(req, ret);
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static errno_t ipa_get_ad_ipa_membership_step(struct tevent_req *req)
 | ||||
| +{
 | ||||
| +    struct ipa_get_ad_acct_state *state = tevent_req_data(req,
 | ||||
| +                                                struct ipa_get_ad_acct_state);
 | ||||
| +    struct tevent_req *subreq;
 | ||||
|   | ||||
|      /* For initgroups request we have to check IPA group memberships of AD | ||||
|       * users. This has to be done for other user-request as well to make sure | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										61
									
								
								0081-IPA-do-not-add-domain-name-unconditionally.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								0081-IPA-do-not-add-domain-name-unconditionally.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | ||||
| From 226224c91971247f60a86d9c46dd1402f5c29e8a Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Fri, 17 Apr 2015 18:22:10 +0200 | ||||
| Subject: [PATCH 81/99] IPA: do not add domain name unconditionally | ||||
| 
 | ||||
| Depending on the server-side configuration the extdom plugin can return | ||||
| short or fully qualified names for IPA objects. The client must handle | ||||
| the names according to its own configuration and not add the domain part | ||||
| of the fully-qualified name unconditionally. | ||||
| 
 | ||||
| Resolves https://fedorahosted.org/sssd/ticket/2647 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 3fe2e555edd3963d72483600e5d9616873afd00a) | ||||
| ---
 | ||||
|  src/providers/ipa/ipa_s2n_exop.c | 2 ++ | ||||
|  src/tests/cmocka/test_utils.c    | 1 + | ||||
|  src/util/domain_info_utils.c     | 2 +- | ||||
|  3 files changed, 4 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| index daebd68853c2d8671b752edb8f2639f795093014..fa00691af579659905e43e71503bd36bf0415bad 100644
 | ||||
| --- a/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| +++ b/src/providers/ipa/ipa_s2n_exop.c
 | ||||
| @@ -1724,6 +1724,8 @@ static errno_t get_groups_dns(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom,
 | ||||
|              ret = ENOMEM; | ||||
|              goto done; | ||||
|          } | ||||
| +
 | ||||
| +        DEBUG(SSSDBG_TRACE_ALL, "Added [%s][%s].\n", name_list[c], dn_list[c]);
 | ||||
|      } | ||||
|   | ||||
|      *_dn_list = talloc_steal(mem_ctx, dn_list); | ||||
| diff --git a/src/tests/cmocka/test_utils.c b/src/tests/cmocka/test_utils.c
 | ||||
| index 4cc6ec85add6bb8f9ae17ddc9af38b0316c9d49f..933e7cd462c11c8ff0f048ec434c8a45f5827e0c 100644
 | ||||
| --- a/src/tests/cmocka/test_utils.c
 | ||||
| +++ b/src/tests/cmocka/test_utils.c
 | ||||
| @@ -1063,6 +1063,7 @@ void test_fix_domain_in_name_list(void **state)
 | ||||
|      sd->name = talloc_strdup(sd, "TesT.CasE.DoM"); | ||||
|      assert_non_null(sd->name); | ||||
|      sd->names = dom->names; | ||||
| +    sd->fqnames = true;
 | ||||
|      DLIST_ADD(dom->subdomains, sd); | ||||
|      sd->parent = dom; | ||||
|   | ||||
| diff --git a/src/util/domain_info_utils.c b/src/util/domain_info_utils.c
 | ||||
| index e76c1cefb49334bf70ef9709b3986134f7ef565c..9fb2110eb34c7e7f5d9933f1aabed43970be1149 100644
 | ||||
| --- a/src/util/domain_info_utils.c
 | ||||
| +++ b/src/util/domain_info_utils.c
 | ||||
| @@ -831,7 +831,7 @@ errno_t fix_domain_in_name_list(TALLOC_CTX *mem_ctx,
 | ||||
|                  goto done; | ||||
|              } | ||||
|   | ||||
| -            out[c] = sss_tc_fqname(out, head->names, out_domain, in_name);
 | ||||
| +            out[c] = sss_get_domain_name(out, in_name, out_domain);
 | ||||
|          } | ||||
|   | ||||
|          if (out[c] == NULL) { | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										101
									
								
								0082-NSS-check-for-overrides-before-calling-backend.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								0082-NSS-check-for-overrides-before-calling-backend.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,101 @@ | ||||
| From a4a447b7bf394ded65c8ae872832e7cd135425d1 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Wed, 29 Apr 2015 15:21:17 +0200 | ||||
| Subject: [PATCH 82/99] NSS: check for overrides before calling backend | ||||
| 
 | ||||
| Currently the flag that the input data in a user or group lookup request | ||||
| might be an override value is only set if no cached entry was found. If | ||||
| the cached entry of an object with overrides is expired and a request | ||||
| with the override value as input is processed the flag is not set and | ||||
| the backend might not be able to find the right entry on the server. | ||||
| Typically this should not happen because of mid-point refreshes. To | ||||
| reproduce this create a FreeIPA user and override the login name for a | ||||
| specific view. On a client which has this view applied call | ||||
| 
 | ||||
| getent passwd overridename | ||||
| sss_cache -E | ||||
| getent passwd overridename | ||||
| 
 | ||||
| The second getent command will still show the right output but in the | ||||
| logs a | ||||
| 
 | ||||
| [sss_dp_get_reply] (0x1000): Got reply from Data Provider - DP error | ||||
|  code: 3 errno: 0 error message: Account info lookup failed | ||||
| 
 | ||||
| message can be found for the second request. | ||||
| 
 | ||||
| Related to https://fedorahosted.org/sssd/ticket/2642 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 35b178d02dfd293778aefbc0b465a5a3a4b6cd8f) | ||||
| ---
 | ||||
|  src/responder/nss/nsssrv_cmd.c | 25 ++++++++++++++++++++----- | ||||
|  1 file changed, 20 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
 | ||||
| index 4c0e9414d2cdebe61fd91de06f4900f00904ef22..70da3924f2b087f463a25748d0ea1a4d88b0e818 100644
 | ||||
| --- a/src/responder/nss/nsssrv_cmd.c
 | ||||
| +++ b/src/responder/nss/nsssrv_cmd.c
 | ||||
| @@ -948,7 +948,10 @@ static int nss_cmd_getpwnam_search(struct nss_dom_ctx *dctx)
 | ||||
|   | ||||
|              if (cmdctx->name_is_upn) { | ||||
|                  extra_flag = EXTRA_NAME_IS_UPN; | ||||
| -            } else if (DOM_HAS_VIEWS(dom) && dctx->res->count == 0) {
 | ||||
| +            } else if (DOM_HAS_VIEWS(dom) && (dctx->res->count == 0
 | ||||
| +                    || ldb_msg_find_attr_as_string(dctx->res->msgs[0],
 | ||||
| +                                                   OVERRIDE_PREFIX SYSDB_NAME,
 | ||||
| +                                                   NULL) != NULL)) {
 | ||||
|                  extra_flag = EXTRA_INPUT_MAYBE_WITH_VIEW; | ||||
|              } else { | ||||
|                  extra_flag = NULL; | ||||
| @@ -1608,7 +1611,10 @@ static int nss_cmd_getpwuid_search(struct nss_dom_ctx *dctx)
 | ||||
|           * yet) then verify that the cache is uptodate */ | ||||
|          if (dctx->check_provider) { | ||||
|   | ||||
| -            if (DOM_HAS_VIEWS(dom) && dctx->res->count == 0) {
 | ||||
| +            if (DOM_HAS_VIEWS(dom) && (dctx->res->count == 0
 | ||||
| +                    || ldb_msg_find_attr_as_uint64(dctx->res->msgs[0],
 | ||||
| +                                                   OVERRIDE_PREFIX SYSDB_UIDNUM,
 | ||||
| +                                                   0) != 0)) {
 | ||||
|                  extra_flag = EXTRA_INPUT_MAYBE_WITH_VIEW; | ||||
|              } else { | ||||
|                  extra_flag = NULL; | ||||
| @@ -3049,7 +3055,10 @@ static int nss_cmd_getgrnam_search(struct nss_dom_ctx *dctx)
 | ||||
|           * yet) then verify that the cache is uptodate */ | ||||
|          if (dctx->check_provider) { | ||||
|   | ||||
| -            if (DOM_HAS_VIEWS(dom) && dctx->res->count == 0) {
 | ||||
| +            if (DOM_HAS_VIEWS(dom) && (dctx->res->count == 0
 | ||||
| +                    || ldb_msg_find_attr_as_string(dctx->res->msgs[0],
 | ||||
| +                                                   OVERRIDE_PREFIX SYSDB_NAME,
 | ||||
| +                                                   NULL) != NULL)) {
 | ||||
|                  extra_flag = EXTRA_INPUT_MAYBE_WITH_VIEW; | ||||
|              } else { | ||||
|                  extra_flag = NULL; | ||||
| @@ -3173,7 +3182,10 @@ static int nss_cmd_getgrgid_search(struct nss_dom_ctx *dctx)
 | ||||
|           * yet) then verify that the cache is uptodate */ | ||||
|          if (dctx->check_provider) { | ||||
|   | ||||
| -            if (DOM_HAS_VIEWS(dom) && dctx->res->count == 0) {
 | ||||
| +            if (DOM_HAS_VIEWS(dom) && (dctx->res->count == 0
 | ||||
| +                    || ldb_msg_find_attr_as_uint64(dctx->res->msgs[0],
 | ||||
| +                                                   OVERRIDE_PREFIX SYSDB_GIDNUM,
 | ||||
| +                                                   0) != 0)) {
 | ||||
|                  extra_flag = EXTRA_INPUT_MAYBE_WITH_VIEW; | ||||
|              } else { | ||||
|                  extra_flag = NULL; | ||||
| @@ -4131,7 +4143,10 @@ static int nss_cmd_initgroups_search(struct nss_dom_ctx *dctx)
 | ||||
|   | ||||
|              if (cmdctx->name_is_upn) { | ||||
|                  extra_flag = EXTRA_NAME_IS_UPN; | ||||
| -            } else if (DOM_HAS_VIEWS(dom) && dctx->res->count == 0) {
 | ||||
| +            } else if (DOM_HAS_VIEWS(dom) && (dctx->res->count == 0
 | ||||
| +                    || ldb_msg_find_attr_as_string(dctx->res->msgs[0],
 | ||||
| +                                                   OVERRIDE_PREFIX SYSDB_NAME,
 | ||||
| +                                                   NULL) != NULL)) {
 | ||||
|                  extra_flag = EXTRA_INPUT_MAYBE_WITH_VIEW; | ||||
|              } else { | ||||
|                  extra_flag = NULL; | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										266
									
								
								0083-IPA-allow-initgroups-by-UUID-for-FreeIPA-users.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								0083-IPA-allow-initgroups-by-UUID-for-FreeIPA-users.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,266 @@ | ||||
| From 3b00bcd8b6d53d33207005c4e7a631b6a241d300 Mon Sep 17 00:00:00 2001 | ||||
| From: Sumit Bose <sbose@redhat.com> | ||||
| Date: Wed, 29 Apr 2015 16:46:14 +0200 | ||||
| Subject: [PATCH 83/99] IPA: allow initgroups by UUID for FreeIPA users | ||||
| 
 | ||||
| If a FreeIPA user is searched with the help of an override name the UUID | ||||
| from the override anchor is used to search the user. Currently the | ||||
| initgroups request only allows searches by SID or name. With this patch | ||||
| a UUID can be used as well. | ||||
| 
 | ||||
| Related to https://fedorahosted.org/sssd/ticket/2642 | ||||
| 
 | ||||
| Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> | ||||
| (cherry picked from commit 0f9c28eb52d2b45c8a97f709308dc11377831b8c) | ||||
| ---
 | ||||
|  src/db/sysdb_search.c                      | 32 ++++++++++++++++++++---------- | ||||
|  src/providers/data_provider.h              |  1 - | ||||
|  src/providers/ipa/ipa_id.c                 | 15 +++++++++++++- | ||||
|  src/providers/ldap/ldap_id.c               | 20 ++++++++----------- | ||||
|  src/providers/ldap/sdap_async.h            |  1 + | ||||
|  src/providers/ldap/sdap_async_initgroups.c | 14 ++++++++++--- | ||||
|  src/tests/sysdb-tests.c                    |  9 +++++++++ | ||||
|  7 files changed, 64 insertions(+), 28 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/db/sysdb_search.c b/src/db/sysdb_search.c
 | ||||
| index da0c6d90c6b3a88cfa928aaffa2c8eb843cb1a74..ccd8fa0808cded46a6306912d161cbac60fcc24b 100644
 | ||||
| --- a/src/db/sysdb_search.c
 | ||||
| +++ b/src/db/sysdb_search.c
 | ||||
| @@ -1612,20 +1612,30 @@ errno_t sysdb_get_real_name(TALLOC_CTX *mem_ctx,
 | ||||
|      if (res->count == 0) { | ||||
|          ret = sysdb_search_user_by_upn(tmp_ctx, domain, name_or_upn_or_sid, | ||||
|                                         NULL, &msg); | ||||
| -        if (ret != EOK) {
 | ||||
| +        if (ret == ENOENT) {
 | ||||
| +            ret = sysdb_search_user_by_sid_str(tmp_ctx, domain,
 | ||||
| +                                               name_or_upn_or_sid, NULL, &msg);
 | ||||
|              if (ret == ENOENT) { | ||||
| -                ret = sysdb_search_user_by_sid_str(tmp_ctx, domain,
 | ||||
| -                                                   name_or_upn_or_sid, NULL,
 | ||||
| -                                                   &msg);
 | ||||
| -            }
 | ||||
| -
 | ||||
| -            if (ret != EOK) {
 | ||||
| -                /* User cannot be found in cache */
 | ||||
| -                DEBUG(SSSDBG_OP_FAILURE, "Cannot find user [%s] in cache\n",
 | ||||
| -                                         name_or_upn_or_sid);
 | ||||
| -                goto done;
 | ||||
| +                ret = sysdb_search_object_by_uuid(tmp_ctx, domain,
 | ||||
| +                                                  name_or_upn_or_sid, NULL,
 | ||||
| +                                                  &res);
 | ||||
| +                if (ret == EOK && res->count == 1) {
 | ||||
| +                    msg = res->msgs[0];
 | ||||
| +                } else {
 | ||||
| +                    DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| +                          "sysdb_search_object_by_uuid did not return a " \
 | ||||
| +                          "single result.\n");
 | ||||
| +                    ret = ENOENT;
 | ||||
| +                    goto done;
 | ||||
| +                }
 | ||||
|              } | ||||
|          } | ||||
| +        if (ret != EOK) {
 | ||||
| +            /* User cannot be found in cache */
 | ||||
| +            DEBUG(SSSDBG_OP_FAILURE, "Cannot find user [%s] in cache\n",
 | ||||
| +                                     name_or_upn_or_sid);
 | ||||
| +            goto done;
 | ||||
| +        }
 | ||||
|      } else if (res->count == 1) { | ||||
|          msg = res->msgs[0]; | ||||
|      } else { | ||||
| diff --git a/src/providers/data_provider.h b/src/providers/data_provider.h
 | ||||
| index 89fb06a0d6f791a8ae50f9d8b4b69d6176912c6c..5df493e9d1ae21ada6f5fd6198a6d9c36680d044 100644
 | ||||
| --- a/src/providers/data_provider.h
 | ||||
| +++ b/src/providers/data_provider.h
 | ||||
| @@ -150,7 +150,6 @@
 | ||||
|  #define DP_SEC_ID_LEN (sizeof(DP_SEC_ID) - 1) | ||||
|   | ||||
|  #define EXTRA_NAME_IS_UPN "U" | ||||
| -#define EXTRA_NAME_IS_SID "S"
 | ||||
|  #define EXTRA_INPUT_MAYBE_WITH_VIEW "V" | ||||
|   | ||||
|  /* AUTH related common data and functions */ | ||||
| diff --git a/src/providers/ipa/ipa_id.c b/src/providers/ipa/ipa_id.c
 | ||||
| index ebf5f03b822e00aa04e45eeca79b8dade67631d2..e3a7fffc35021ad0490246cd435fb618956b91a4 100644
 | ||||
| --- a/src/providers/ipa/ipa_id.c
 | ||||
| +++ b/src/providers/ipa/ipa_id.c
 | ||||
| @@ -555,6 +555,7 @@ struct ipa_id_get_account_info_state {
 | ||||
|      struct sss_domain_info *domain; | ||||
|      struct be_req *be_req; | ||||
|      struct be_acct_req *ar; | ||||
| +    struct be_acct_req *orig_ar;
 | ||||
|      const char *realm; | ||||
|   | ||||
|      struct sysdb_attrs *override_attrs; | ||||
| @@ -733,13 +734,25 @@ static void ipa_id_get_account_info_got_override(struct tevent_req *subreq)
 | ||||
|   | ||||
|          if (strcmp(state->ar->domain, anchor_domain) == 0) { | ||||
|   | ||||
| +            state->orig_ar = state->ar;
 | ||||
| +
 | ||||
|              ret = get_be_acct_req_for_uuid(state, ipa_uuid, | ||||
|                                             state->ar->domain, | ||||
|                                             &state->ar); | ||||
|              if (ret != EOK) { | ||||
| -                DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n");
 | ||||
| +                DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_uuid failed.\n");
 | ||||
|                  goto fail; | ||||
|              } | ||||
| +
 | ||||
| +            if ((state->orig_ar->entry_type & BE_REQ_TYPE_MASK)
 | ||||
| +                                                         == BE_REQ_INITGROUPS) {
 | ||||
| +                DEBUG(SSSDBG_TRACE_ALL,
 | ||||
| +                      "Switching back to BE_REQ_INITGROUPS.\n");
 | ||||
| +                state->ar->entry_type = BE_REQ_INITGROUPS;
 | ||||
| +                state->ar->filter_type = BE_FILTER_UUID;
 | ||||
| +                state->ar->attr_type = BE_ATTR_CORE;
 | ||||
| +            }
 | ||||
| +
 | ||||
|          } else { | ||||
|              DEBUG(SSSDBG_MINOR_FAILURE, | ||||
|                    "Anchor from a different domain [%s], expected [%s]. " \ | ||||
| diff --git a/src/providers/ldap/ldap_id.c b/src/providers/ldap/ldap_id.c
 | ||||
| index c2686d249ddf5448c3589c4d8afe32caf09c90a4..63098a82e96b0f6a020b94bdaf238eee4559c09b 100644
 | ||||
| --- a/src/providers/ldap/ldap_id.c
 | ||||
| +++ b/src/providers/ldap/ldap_id.c
 | ||||
| @@ -964,6 +964,7 @@ struct groups_by_user_state {
 | ||||
|      struct sss_domain_info *domain; | ||||
|   | ||||
|      const char *name; | ||||
| +    int name_type;
 | ||||
|      const char *extra_value; | ||||
|      const char **attrs; | ||||
|   | ||||
| @@ -982,6 +983,7 @@ static struct tevent_req *groups_by_user_send(TALLOC_CTX *memctx,
 | ||||
|                                                struct sdap_domain *sdom, | ||||
|                                                struct sdap_id_conn_ctx *conn, | ||||
|                                                const char *name, | ||||
| +                                              int name_type,
 | ||||
|                                                const char *extra_value, | ||||
|                                                bool noexist_delete) | ||||
|  { | ||||
| @@ -1007,6 +1009,7 @@ static struct tevent_req *groups_by_user_send(TALLOC_CTX *memctx,
 | ||||
|      } | ||||
|   | ||||
|      state->name = name; | ||||
| +    state->name_type = name_type;
 | ||||
|      state->extra_value = extra_value; | ||||
|      state->domain = sdom->dom; | ||||
|      state->sysdb = sdom->dom->sysdb; | ||||
| @@ -1069,6 +1072,7 @@ static void groups_by_user_connect_done(struct tevent_req *subreq)
 | ||||
|                                    state->ctx, | ||||
|                                    state->conn, | ||||
|                                    state->name, | ||||
| +                                  state->name_type,
 | ||||
|                                    state->extra_value, | ||||
|                                    state->attrs); | ||||
|      if (!subreq) { | ||||
| @@ -1392,7 +1396,8 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|   | ||||
|      case BE_REQ_INITGROUPS: /* init groups for user */ | ||||
|          if (ar->filter_type != BE_FILTER_NAME | ||||
| -                && ar->filter_type != BE_FILTER_SECID) {
 | ||||
| +                && ar->filter_type != BE_FILTER_SECID
 | ||||
| +                && ar->filter_type != BE_FILTER_UUID) {
 | ||||
|              ret = EINVAL; | ||||
|              state->err = "Invalid filter type"; | ||||
|              goto done; | ||||
| @@ -1402,21 +1407,12 @@ sdap_handle_acct_req_send(TALLOC_CTX *mem_ctx,
 | ||||
|              state->err = "Invalid attr type"; | ||||
|              goto done; | ||||
|          } | ||||
| -        if (ar->filter_type == BE_FILTER_SECID && ar->extra_value != NULL
 | ||||
| -                && strcmp(ar->extra_value, EXTRA_NAME_IS_SID) != 0) {
 | ||||
| -            DEBUG(SSSDBG_OP_FAILURE,
 | ||||
| -                  "Unexpected extra value [%s] for BE_FILTER_SECID.\n",
 | ||||
| -                  ar->extra_value);
 | ||||
| -            ret = EINVAL;
 | ||||
| -            state->err = "Invalid extra value";
 | ||||
| -            goto done;
 | ||||
| -        }
 | ||||
|   | ||||
|          subreq = groups_by_user_send(state, be_ctx->ev, id_ctx, | ||||
|                                       sdom, conn, | ||||
|                                       ar->filter_value, | ||||
| -                                     (ar->filter_type == BE_FILTER_SECID)
 | ||||
| -                                        ? EXTRA_NAME_IS_SID : ar->extra_value,
 | ||||
| +                                     ar->filter_type,
 | ||||
| +                                     ar->extra_value,
 | ||||
|                                       noexist_delete); | ||||
|          break; | ||||
|   | ||||
| diff --git a/src/providers/ldap/sdap_async.h b/src/providers/ldap/sdap_async.h
 | ||||
| index ef9b3bbadba830bcf730b6fa70867c17d51380af..e9bfc5759dff5bca06c95a920752c66343fd2924 100644
 | ||||
| --- a/src/providers/ldap/sdap_async.h
 | ||||
| +++ b/src/providers/ldap/sdap_async.h
 | ||||
| @@ -135,6 +135,7 @@ struct tevent_req *sdap_get_initgr_send(TALLOC_CTX *memctx,
 | ||||
|                                          struct sdap_id_ctx *id_ctx, | ||||
|                                          struct sdap_id_conn_ctx *conn, | ||||
|                                          const char *name, | ||||
| +                                        int name_type,
 | ||||
|                                          const char *extra_value, | ||||
|                                          const char **grp_attrs); | ||||
|  int sdap_get_initgr_recv(struct tevent_req *req); | ||||
| diff --git a/src/providers/ldap/sdap_async_initgroups.c b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| index 5c5be5eabd7006b457291062519cdad9626f13fa..4f775d76b77a311c3394beec4546c4f6c7dc5f6f 100644
 | ||||
| --- a/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| +++ b/src/providers/ldap/sdap_async_initgroups.c
 | ||||
| @@ -2667,6 +2667,7 @@ struct tevent_req *sdap_get_initgr_send(TALLOC_CTX *memctx,
 | ||||
|                                          struct sdap_id_ctx *id_ctx, | ||||
|                                          struct sdap_id_conn_ctx *conn, | ||||
|                                          const char *name, | ||||
| +                                        int name_type,
 | ||||
|                                          const char *extra_value, | ||||
|                                          const char **grp_attrs) | ||||
|  { | ||||
| @@ -2716,10 +2717,17 @@ struct tevent_req *sdap_get_initgr_send(TALLOC_CTX *memctx,
 | ||||
|   | ||||
|      if (extra_value && strcmp(extra_value, EXTRA_NAME_IS_UPN) == 0) { | ||||
|          search_attr =  state->opts->user_map[SDAP_AT_USER_PRINC].name; | ||||
| -    } else if (extra_value && strcmp(extra_value, EXTRA_NAME_IS_SID) == 0) {
 | ||||
| -        search_attr =  state->opts->user_map[SDAP_AT_USER_OBJECTSID].name;
 | ||||
|      } else { | ||||
| -        search_attr =  state->opts->user_map[SDAP_AT_USER_NAME].name;
 | ||||
| +        switch (name_type) {
 | ||||
| +        case BE_FILTER_SECID:
 | ||||
| +            search_attr =  state->opts->user_map[SDAP_AT_USER_OBJECTSID].name;
 | ||||
| +            break;
 | ||||
| +        case BE_FILTER_UUID:
 | ||||
| +            search_attr =  state->opts->user_map[SDAP_AT_USER_UUID].name;
 | ||||
| +            break;
 | ||||
| +        default:
 | ||||
| +            search_attr =  state->opts->user_map[SDAP_AT_USER_NAME].name;
 | ||||
| +        }
 | ||||
|      } | ||||
|   | ||||
|      state->user_base_filter = | ||||
| diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c
 | ||||
| index 0185beeaf03d0fc72c9ead22bc73887c701d964f..450a9d1d693135c296f3433d905d1aba115548b8 100644
 | ||||
| --- a/src/tests/sysdb-tests.c
 | ||||
| +++ b/src/tests/sysdb-tests.c
 | ||||
| @@ -3581,6 +3581,10 @@ START_TEST(test_sysdb_get_real_name)
 | ||||
|                                   "S-1-5-21-123-456-789-111"); | ||||
|      fail_unless(ret == EOK, "sysdb_attrs_add_string failed."); | ||||
|   | ||||
| +    ret = sysdb_attrs_add_string(user_attrs, SYSDB_UUID,
 | ||||
| +                                 "12345678-9012-3456-7890-123456789012");
 | ||||
| +    fail_unless(ret == EOK, "sysdb_attrs_add_string failed.");
 | ||||
| +
 | ||||
|      ret = sysdb_store_user(test_ctx->domain, "RealName", | ||||
|                             NULL, 22345, 0, "gecos", | ||||
|                             "/home/realname", "/bin/bash", | ||||
| @@ -3604,6 +3608,11 @@ START_TEST(test_sysdb_get_real_name)
 | ||||
|      fail_unless(strcmp(str, "RealName") == 0, "Expected [%s], got [%s].", | ||||
|                                                "RealName", str); | ||||
|   | ||||
| +    ret = sysdb_get_real_name(test_ctx, test_ctx->domain,
 | ||||
| +                              "12345678-9012-3456-7890-123456789012", &str);
 | ||||
| +    fail_unless(ret == EOK, "sysdb_get_real_name failed.");
 | ||||
| +    fail_unless(strcmp(str, "RealName") == 0, "Expected [%s], got [%s].",
 | ||||
| +                                              "RealName", str);
 | ||||
|  } | ||||
|  END_TEST | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -0,0 +1,61 @@ | ||||
| From 79d0c56ea407a1747f7aa30f916613da314f2ac5 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Sat, 18 Apr 2015 17:36:35 +0200 | ||||
| Subject: [PATCH 84/99] SPEC: Fix cyclic dependencies between | ||||
|  sssd-{krb5,}-common | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| libsss_ldap_common(sssd-common) requires libsss_krb5_common.so(sssd-krb5-common) | ||||
| and sssd-krb5-common requires sssd-common. | ||||
| 
 | ||||
| sh$ nm --dynamic --defined-only /usr/lib64/sssd/libsss_krb5_common.so | ||||
| 000000000000c4d0 T krb5_service_init | ||||
| 000000000000b8c0 T krb5_try_kdcip | ||||
| 000000000000c710 T remove_krb5_info_files | ||||
| 0000000000014960 T select_principal_from_keytab | ||||
| 00000000000141d0 T sss_krb5_get_error_message | ||||
| 
 | ||||
| sh$ nm --dynamic --undefined-only /usr/lib64/sssd/libsss_ldap_common.so | ||||
|                  U krb5_service_init | ||||
|                  U krb5_try_kdcip | ||||
|                  U remove_krb5_info_files | ||||
|                  U select_principal_from_keytab | ||||
|                  U sss_krb5_get_error_message | ||||
| 
 | ||||
| This patch fix cyclic dependency with rpm packaging becuase | ||||
| it's not simple task to remove krb5 dependency from ldap provider. | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2507 | ||||
| 
 | ||||
| Reviewed-by: Pavel Březina <pbrezina@redhat.com> | ||||
| (cherry picked from commit 56552c518a07b45b25d4a2ef58d37fac0918ce60) | ||||
| ---
 | ||||
|  contrib/sssd.spec.in | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
 | ||||
| index d5f69149047bf691cc2f9663252a41c1f28f216b..35de4449318a763358265c25518e00b34c07da10 100644
 | ||||
| --- a/contrib/sssd.spec.in
 | ||||
| +++ b/contrib/sssd.spec.in
 | ||||
| @@ -588,6 +588,7 @@ rm -rf $RPM_BUILD_ROOT
 | ||||
|  %{_libdir}/%{name}/libsss_child.so | ||||
|  %{_libdir}/%{name}/libsss_crypt.so | ||||
|  %{_libdir}/%{name}/libsss_debug.so | ||||
| +%{_libdir}/%{name}/libsss_krb5_common.so
 | ||||
|  %{_libdir}/%{name}/libsss_ldap_common.so | ||||
|  %{_libdir}/%{name}/libsss_util.so | ||||
|  %{_libdir}/%{name}/libsss_semanage.so | ||||
| @@ -645,7 +646,6 @@ rm -rf $RPM_BUILD_ROOT
 | ||||
|  %files krb5-common | ||||
|  %defattr(-,root,root,-) | ||||
|  %doc COPYING | ||||
| -%{_libdir}/%{name}/libsss_krb5_common.so
 | ||||
|  %attr(4750,root,sssd) %{_libexecdir}/%{servicename}/ldap_child | ||||
|  %attr(4750,root,sssd) %{_libexecdir}/%{servicename}/krb5_child | ||||
|   | ||||
| -- 
 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 12098bc18511c9becb375302f29ab87b94352f43 Mon Sep 17 00:00:00 2001 | ||||
| From e8f00c8792ac1fcffffc3cf8bdf7e23898c9511f Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 9 Feb 2015 17:40:07 +0100 | ||||
| Subject: [PATCH 01/15] BUILD: Remove unused libraries for pysss.so | ||||
| Subject: [PATCH 85/99] BUILD: Remove unused libraries for pysss.so | ||||
| 
 | ||||
| Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
| ---
 | ||||
| @ -9,10 +9,10 @@ Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
|  1 file changed, 1 insertion(+), 7 deletions(-) | ||||
| 
 | ||||
| diff --git a/Makefile.am b/Makefile.am
 | ||||
| index 29d148c4a0cbda6882b4a619d6c71d2efcc8fb43..176c193d97389f14da6f202fef46579b2e2a2e59 100644
 | ||||
| index 65b9773d8804992f7553609b77553b3b3944a54d..697ec14bf6340961fa93612472a54d3f83edfd6c 100644
 | ||||
| --- a/Makefile.am
 | ||||
| +++ b/Makefile.am
 | ||||
| @@ -443,15 +443,9 @@ SSSD_LIBS = \
 | ||||
| @@ -445,15 +445,9 @@ SSSD_LIBS = \
 | ||||
|   | ||||
|  PYTHON_BINDINGS_LIBS = \ | ||||
|      $(TALLOC_LIBS) \ | ||||
| @ -30,5 +30,5 @@ index 29d148c4a0cbda6882b4a619d6c71d2efcc8fb43..176c193d97389f14da6f202fef46579b | ||||
|  TOOLS_LIBS = \ | ||||
|      $(LTLIBINTL) \ | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From f8b0f5158332b5c8ae5828512e3fd5f1d64851a8 Mon Sep 17 00:00:00 2001 | ||||
| From 56fb38fb620cce336a10b4487cdc2d687ebad5e1 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 9 Feb 2015 18:46:16 +0100 | ||||
| Subject: [PATCH 02/15] BUILD: Remove unused variables | ||||
| Subject: [PATCH 86/99] BUILD: Remove unused variables | ||||
| 
 | ||||
| Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
| ---
 | ||||
| @ -22,5 +22,5 @@ index a1bd87a0ee3a56ddd25c4aba7687ffc7540b4ec2..241de9fd0e401c40f8136861e7c7070c | ||||
|   | ||||
|      AC_SUBST(PYTHON_INCLUDES) | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From d262610c969e0a3d8c3ad5a7deecc4d0519c6845 Mon Sep 17 00:00:00 2001 | ||||
| From f5fa6265e747c582e783f1b867cc96e9afc84d79 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 9 Feb 2015 19:16:30 +0100 | ||||
| Subject: [PATCH 03/15] BUILD: Remove detection of type Py_ssize_t | ||||
| Subject: [PATCH 87/99] BUILD: Remove detection of type Py_ssize_t | ||||
| 
 | ||||
| The type Py_ssize_t is defined in python >= 2.6 | ||||
| 
 | ||||
| @ -53,5 +53,5 @@ index 828bd22ec44fe9493bfaa246b072777b70c7b585..cf8c848482d82e0060cbfe748c05bd09 | ||||
|  PyObject *sss_python_set_new(void); | ||||
|  int sss_python_set_add(PyObject *set, PyObject *key); | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 51308d75c1d128ca6ff90bb5a50aab7720781948 Mon Sep 17 00:00:00 2001 | ||||
| From ecbcf8d863aa8888bc3ee7b642ba9a82d8015a08 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 9 Feb 2015 19:19:55 +0100 | ||||
| Subject: [PATCH 04/15] UTIL: Remove python wrapper sss_python_set_new | ||||
| Subject: [PATCH 88/99] UTIL: Remove python wrapper sss_python_set_new | ||||
| 
 | ||||
| The function PySet_New is available in python >= 2.6 | ||||
| 
 | ||||
| @ -82,5 +82,5 @@ index cf8c848482d82e0060cbfe748c05bd09c7492c4f..6851a64e816ccf3bb84321bbeb9946ad | ||||
|  bool sss_python_set_check(PyObject *set); | ||||
|   | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From a54cfca2362b2fb7a7b6ecc90881c3de6bb3556f Mon Sep 17 00:00:00 2001 | ||||
| From 3ef450d7bce2c6af6f3ea06de5bae5bc7fe7e81a Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 9 Feb 2015 19:23:44 +0100 | ||||
| Subject: [PATCH 05/15] UTIL: Remove python wrapper sss_python_set_add | ||||
| Subject: [PATCH 89/99] UTIL: Remove python wrapper sss_python_set_add | ||||
| 
 | ||||
| The function PySet_Add is available in python >= 2.6 | ||||
| 
 | ||||
| @ -89,5 +89,5 @@ index 6851a64e816ccf3bb84321bbeb9946ad2fbfbc41..1ff13c4ef4380ff791cf3cfbe12845fb | ||||
|   | ||||
|  /* Unicode compatibility */ | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 6176976f2a895cca5eba9f714c6a6607f61aa8aa Mon Sep 17 00:00:00 2001 | ||||
| From 2d282d0aab99219337d27ee520825539405c65a6 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 9 Feb 2015 19:30:39 +0100 | ||||
| Subject: [PATCH 06/15] UTIL: Remove python wrapper sss_python_set_check | ||||
| Subject: [PATCH 90/99] UTIL: Remove python wrapper sss_python_set_check | ||||
| 
 | ||||
| The macro PySet_Check is defined in python >= 2.6 | ||||
| 
 | ||||
| @ -75,5 +75,5 @@ index 1ff13c4ef4380ff791cf3cfbe12845fb26b3b873..56c25ebb74bffc061688c3c32515d6e0 | ||||
|  PyObject *sss_python_unicode_from_string(const char *u); | ||||
|   | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From fb70347a6f68cb7cde82c0d31b66b192b7404a03 Mon Sep 17 00:00:00 2001 | ||||
| From b08e99dc192b21695406753ebbbca1e3adb4d4f2 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 9 Feb 2015 19:33:44 +0100 | ||||
| Subject: [PATCH 07/15] UTIL: Remove compatibility macro PyModule_AddIntMacro | ||||
| Subject: [PATCH 91/99] UTIL: Remove compatibility macro PyModule_AddIntMacro | ||||
| 
 | ||||
| The macro PyModule_AddIntMacro is defined in python >= 2.6 | ||||
| 
 | ||||
| @ -41,5 +41,5 @@ index 56c25ebb74bffc061688c3c32515d6e0288ac94d..5521aa5cfd84acffc65edbe76a264b1f | ||||
|  #define TYPE_READY(module, type, name) do {         \ | ||||
|      if (PyType_Ready(&type) < 0)                    \ | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 65b439f58285de44c7dcd4a03e0f32a2fb247d82 Mon Sep 17 00:00:00 2001 | ||||
| From 6bbd0c9a30247f22c3581702b310beff51d39b08 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 9 Feb 2015 19:38:42 +0100 | ||||
| Subject: [PATCH 08/15] UTIL: Remove python wrapper | ||||
| Subject: [PATCH 92/99] UTIL: Remove python wrapper | ||||
|  sss_python_unicode_from_string | ||||
| 
 | ||||
| The function PyUnicode_FromString is available in python >= 2.6 | ||||
| @ -156,5 +156,5 @@ index 5521aa5cfd84acffc65edbe76a264b1f2a52e9fd..7e2bac33656dcbac91bb4f4d32ec9fbc | ||||
|  PyObject * | ||||
|  sss_exception_with_doc(char *name, char *doc, PyObject *base, PyObject *dict); | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From daeaf3b5d3bd3877f1a5b8cc60f0cf401d09e31f Mon Sep 17 00:00:00 2001 | ||||
| From 79e1d351cf71cc15a13223b093174377b83ae6a8 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Tue, 10 Feb 2015 16:14:59 +0100 | ||||
| Subject: [PATCH 09/15] BUILD: Use python-config for detection *FLAGS | ||||
| Subject: [PATCH 93/99] BUILD: Use python-config for detection *FLAGS | ||||
| 
 | ||||
| The script python-config was not available in older versions of python. | ||||
| This patch simplify detection of python CFLAGS and LDFLAGS and increase | ||||
| @ -129,5 +129,5 @@ index d59233aa01ac591cfc86be974d8ae26ebbe4635d..c91e8df17b0371538f02bfeb9cade1ce | ||||
| +    unset ac_cv_path_PYTHON_CONFIG
 | ||||
| +])
 | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 0bb5eeeedf08dcd6b49e24d3480f2bc5b09c38b0 Mon Sep 17 00:00:00 2001 | ||||
| From 0a238d24c721fcc8b009367283b1ffaa77a9abe2 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Tue, 10 Feb 2015 16:33:04 +0100 | ||||
| Subject: [PATCH 10/15] SPEC: Use new convention for python packages | ||||
| Subject: [PATCH 94/99] SPEC: Use new convention for python packages | ||||
| 
 | ||||
| Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
| ---
 | ||||
| @ -9,7 +9,7 @@ Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
|  1 file changed, 12 insertions(+), 8 deletions(-) | ||||
| 
 | ||||
| diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
 | ||||
| index bea68f1bbceac232f4ca019111b6262dca3380eb..fc87ff2c9a2012683bb0c989c992b8706851148a 100644
 | ||||
| index 35de4449318a763358265c25518e00b34c07da10..ce9291d65411e1ab8db6e4d33afb8f862de0020d 100644
 | ||||
| --- a/contrib/sssd.spec.in
 | ||||
| +++ b/contrib/sssd.spec.in
 | ||||
| @@ -339,14 +339,16 @@ Requires: libipa_hbac = %{version}-%{release}
 | ||||
| @ -67,5 +67,5 @@ index bea68f1bbceac232f4ca019111b6262dca3380eb..fc87ff2c9a2012683bb0c989c992b870 | ||||
|  %{python_sitearch}/pyhbac.so | ||||
|   | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 79ff61df76fdf77a5942bc555e9dc584192eebe0 Mon Sep 17 00:00:00 2001 | ||||
| From 16f4dea2c58236942e7c062b2b410b0cb14cee6d Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Tue, 10 Feb 2015 16:50:12 +0100 | ||||
| Subject: [PATCH 11/15] SPEC: Move python bindings to separate packages | ||||
| Subject: [PATCH 95/99] SPEC: Move python bindings to separate packages | ||||
| 
 | ||||
| Some pyhton bindings pysss and pysss_murmur was in package sssd-common. | ||||
| Therefore package sssd-common had python as a dependency. | ||||
| @ -12,7 +12,7 @@ Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
|  1 file changed, 33 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
 | ||||
| index fc87ff2c9a2012683bb0c989c992b8706851148a..6d6f0b9294e2150549f36c64a11ace64be8a83cc 100644
 | ||||
| index ce9291d65411e1ab8db6e4d33afb8f862de0020d..66c209a4619b942ca262e4a4f2bd43731beae788 100644
 | ||||
| --- a/contrib/sssd.spec.in
 | ||||
| +++ b/contrib/sssd.spec.in
 | ||||
| @@ -196,6 +196,9 @@ Summary: Userspace tools for use with the SSSD
 | ||||
| @ -54,7 +54,7 @@ index fc87ff2c9a2012683bb0c989c992b8706851148a..6d6f0b9294e2150549f36c64a11ace64 | ||||
|  %package ldap | ||||
|  Summary: The LDAP back end of the SSSD | ||||
|  Group: Applications/System | ||||
| @@ -637,8 +662,6 @@ rm -rf $RPM_BUILD_ROOT
 | ||||
| @@ -638,8 +663,6 @@ rm -rf $RPM_BUILD_ROOT
 | ||||
|  %{_mandir}/man8/sss_cache.8* | ||||
|  %{_mandir}/man1/sss_ssh_authorizedkeys.1* | ||||
|  %{_mandir}/man1/sss_ssh_knownhostsproxy.1* | ||||
| @ -79,5 +79,5 @@ index fc87ff2c9a2012683bb0c989c992b8706851148a..6d6f0b9294e2150549f36c64a11ace64 | ||||
|  %defattr(-,root,root,-) | ||||
|  %doc src/sss_client/COPYING src/sss_client/COPYING.LESSER | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From a80ec6ff2bdb9367ac7d5c50c3ab7d83877bd7bb Mon Sep 17 00:00:00 2001 | ||||
| From 263ae7b08d8ecacd7de671a7f2e6041966b4aff4 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Tue, 10 Feb 2015 17:22:03 +0100 | ||||
| Subject: [PATCH 12/15] BUILD: Add possibility to build python{2,3} bindings | ||||
| Subject: [PATCH 96/99] BUILD: Add possibility to build python{2,3} bindings | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2574 | ||||
| @ -17,10 +17,10 @@ Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
|  6 files changed, 267 insertions(+), 65 deletions(-) | ||||
| 
 | ||||
| diff --git a/Makefile.am b/Makefile.am
 | ||||
| index 176c193d97389f14da6f202fef46579b2e2a2e59..14ee3dd528f0d89b3e0d2afdb99313e6c570234f 100644
 | ||||
| index 697ec14bf6340961fa93612472a54d3f83edfd6c..027d627586aad212ce7f62d6e6b01b7da2ea2126 100644
 | ||||
| --- a/Makefile.am
 | ||||
| +++ b/Makefile.am
 | ||||
| @@ -299,12 +299,22 @@ noinst_LTLIBRARIES =
 | ||||
| @@ -301,12 +301,22 @@ noinst_LTLIBRARIES =
 | ||||
|   | ||||
|  pkglib_LTLIBRARIES = | ||||
|   | ||||
| @ -49,7 +49,7 @@ index 176c193d97389f14da6f202fef46579b2e2a2e59..14ee3dd528f0d89b3e0d2afdb99313e6 | ||||
|  endif | ||||
|   | ||||
|  dist_noinst_SCRIPTS = \ | ||||
| @@ -2782,58 +2792,109 @@ sssd_pac_plugin_la_LDFLAGS = \
 | ||||
| @@ -2833,58 +2843,109 @@ sssd_pac_plugin_la_LDFLAGS = \
 | ||||
|      -avoid-version \ | ||||
|      -module | ||||
|   | ||||
| @ -185,7 +185,7 @@ index 176c193d97389f14da6f202fef46579b2e2a2e59..14ee3dd528f0d89b3e0d2afdb99313e6 | ||||
|   | ||||
|  if BUILD_CIFS_IDMAP_PLUGIN | ||||
|  cifs_idmap_sss_la_SOURCES = \ | ||||
| @@ -2995,17 +3056,51 @@ SSSSCONFIG_MODULES =
 | ||||
| @@ -3046,17 +3107,51 @@ SSSSCONFIG_MODULES =
 | ||||
|  endif | ||||
|   | ||||
|  all-local: ldb_mod_test_dir $(SSSDCONFIG_MODULES) | ||||
| @ -242,7 +242,7 @@ index 176c193d97389f14da6f202fef46579b2e2a2e59..14ee3dd528f0d89b3e0d2afdb99313e6 | ||||
|  endif | ||||
|  	for doc in $(SSSD_DOCS); do \ | ||||
|  		$(MKDIR_P) $$doc $(DESTDIR)/$(docdir); \ | ||||
| @@ -3039,16 +3134,20 @@ install-data-hook:
 | ||||
| @@ -3090,16 +3185,20 @@ install-data-hook:
 | ||||
|  	fi | ||||
|   | ||||
|  uninstall-hook: | ||||
| @ -267,7 +267,7 @@ index 176c193d97389f14da6f202fef46579b2e2a2e59..14ee3dd528f0d89b3e0d2afdb99313e6 | ||||
|  	if [ ! $(srcdir)/src/config/SSSDConfig/ipachangeconf.py -ef $(builddir)/src/config/SSSDConfig/ipachangeconf.py ]; then \ | ||||
|  		rm -f $(builddir)/src/config/SSSDConfig/ipachangeconf.py ; \ | ||||
|  	fi | ||||
| @@ -3059,7 +3158,20 @@ if BUILD_PYTHON_BINDINGS
 | ||||
| @@ -3110,7 +3209,20 @@ if BUILD_PYTHON_BINDINGS
 | ||||
|   | ||||
|  	rm -f $(builddir)/src/config/SSSDConfig/*.pyc | ||||
|   | ||||
| @ -362,7 +362,7 @@ index f72e448528edcffb855504a38a179c400f98ac42..e30405f3a17ffd2c9899b6eb17af85ec | ||||
|      AM_CHECK_SELINUX | ||||
|      AM_CHECK_SELINUX_LOGIN_DIR | ||||
| diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
 | ||||
| index 6d6f0b9294e2150549f36c64a11ace64be8a83cc..ecbb29dd9222578fdd2c8505770f0345684012f3 100644
 | ||||
| index 66c209a4619b942ca262e4a4f2bd43731beae788..847b6cf2a36f5323cdfad77dd5ef5772b261c2b9 100644
 | ||||
| --- a/contrib/sssd.spec.in
 | ||||
| +++ b/contrib/sssd.spec.in
 | ||||
| @@ -781,10 +781,12 @@ rm -rf $RPM_BUILD_ROOT
 | ||||
| @ -528,5 +528,5 @@ index 0b28f45e67cb4b033516a585867085dba7b412e6..faa8bb2d33b9d94d380b8f7045ba45aa | ||||
|          except ImportError as e: | ||||
|              print("Could not load the pysss_murmur module. Please check if it is compiled", file=sys.stderr) | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From 63f84d9c9b662bc66ac7125307c1918dc6a671a7 Mon Sep 17 00:00:00 2001 | ||||
| From 9240213bf2bf604bdd2cf9a91fb410326865805f Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Mon, 23 Feb 2015 22:56:55 +0100 | ||||
| Subject: [PATCH 13/15] TESTS: Run python tests with all supported python | ||||
| Subject: [PATCH 97/99] TESTS: Run python tests with all supported python | ||||
|  versions | ||||
| 
 | ||||
| This patch add simple bash wrappers for python tests. | ||||
| @ -25,10 +25,10 @@ Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
|  create mode 100755 src/tests/pysss_murmur-test.py3.sh | ||||
| 
 | ||||
| diff --git a/Makefile.am b/Makefile.am
 | ||||
| index 14ee3dd528f0d89b3e0d2afdb99313e6c570234f..605fd1ff5e479078d579ac7524507546261d469c 100644
 | ||||
| index 027d627586aad212ce7f62d6e6b01b7da2ea2126..99729ff6041a29dc79de7f90511d60420af8fd19 100644
 | ||||
| --- a/Makefile.am
 | ||||
| +++ b/Makefile.am
 | ||||
| @@ -248,13 +248,20 @@ endif # HAVE_CMOCKA
 | ||||
| @@ -250,13 +250,20 @@ endif # HAVE_CMOCKA
 | ||||
|   | ||||
|  PYTHON_TESTS = | ||||
|   | ||||
| @ -54,7 +54,7 @@ index 14ee3dd528f0d89b3e0d2afdb99313e6c570234f..605fd1ff5e479078d579ac7524507546 | ||||
|  TESTS = \ | ||||
|      $(PYTHON_TESTS) \ | ||||
|      $(non_interactive_cmocka_based_tests) \ | ||||
| @@ -323,6 +330,8 @@ dist_noinst_SCRIPTS = \
 | ||||
| @@ -325,6 +332,8 @@ dist_noinst_SCRIPTS = \
 | ||||
|      src/config/SSSDConfig/ipachangeconf.py \ | ||||
|      src/config/SSSDConfig/__init__.py \ | ||||
|      src/config/SSSDConfigTest.py \ | ||||
| @ -63,7 +63,7 @@ index 14ee3dd528f0d89b3e0d2afdb99313e6c570234f..605fd1ff5e479078d579ac7524507546 | ||||
|      src/config/SSSDConfig/sssd_upgrade_config.py \ | ||||
|      contrib/rhel/update_debug_levels.py \ | ||||
|      contrib/fedora/bashrc_sssd \ | ||||
| @@ -333,7 +342,11 @@ dist_noinst_SCRIPTS = \
 | ||||
| @@ -335,7 +344,11 @@ dist_noinst_SCRIPTS = \
 | ||||
|      contrib/ci/run \ | ||||
|      contrib/ci/valgrind-condense \ | ||||
|      src/tests/pyhbac-test.py \ | ||||
| @ -142,5 +142,5 @@ index 0000000000000000000000000000000000000000..00b352ad3e15ba7d53885b86129bf76e | ||||
| +SCRIPT_PATH=$(dirname "$SCRIPT")
 | ||||
| +exec python3 $SCRIPT_PATH/pysss_murmur-test.py
 | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From dfd30a859fb397afa3346e282f70c07b88010744 Mon Sep 17 00:00:00 2001 | ||||
| From eca9ad01d4e5e6e90ee7b6eeec36f6425308c21a Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Tue, 10 Feb 2015 18:07:05 +0100 | ||||
| Subject: [PATCH 14/15] SPEC: Replace python_ macros with python2_ | ||||
| Subject: [PATCH 98/99] SPEC: Replace python_ macros with python2_ | ||||
| 
 | ||||
| Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
| ---
 | ||||
| @ -9,7 +9,7 @@ Reviewed-by: Stephen Gallagher <sgallagh@redhat.com> | ||||
|  1 file changed, 20 insertions(+), 14 deletions(-) | ||||
| 
 | ||||
| diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
 | ||||
| index ecbb29dd9222578fdd2c8505770f0345684012f3..0a12fff74101ae4beaa41685bc6a5d13c1795447 100644
 | ||||
| index 847b6cf2a36f5323cdfad77dd5ef5772b261c2b9..2640c806b5c34479bea5d7d3bc19dba18f9afbad 100644
 | ||||
| --- a/contrib/sssd.spec.in
 | ||||
| +++ b/contrib/sssd.spec.in
 | ||||
| @@ -1,8 +1,14 @@
 | ||||
| @ -87,5 +87,5 @@ index ecbb29dd9222578fdd2c8505770f0345684012f3..0a12fff74101ae4beaa41685bc6a5d13 | ||||
|  %files libwbclient | ||||
|  %defattr(-,root,root,-) | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
| @ -1,7 +1,7 @@ | ||||
| From ee4ce01ae70a318eee764176d924dbc92b789c53 Mon Sep 17 00:00:00 2001 | ||||
| From 9b9be004de2a9bc00b78756f6a63cc27ac513ea9 Mon Sep 17 00:00:00 2001 | ||||
| From: Lukas Slebodnik <lslebodn@redhat.com> | ||||
| Date: Tue, 10 Feb 2015 19:39:45 +0100 | ||||
| Subject: [PATCH 15/15] SPEC: Build python3 bindings on available platforms | ||||
| Subject: [PATCH 99/99] SPEC: Build python3 bindings on available platforms | ||||
| 
 | ||||
| Resolves: | ||||
| https://fedorahosted.org/sssd/ticket/2574 | ||||
| @ -48,7 +48,7 @@ index 0cdb9962987edddf4dd2fff659e3262bbd50b045..4e0ce1e0328927f42b3849d9c39180b4 | ||||
|          systemd | ||||
|          xml-core | ||||
| diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
 | ||||
| index 0a12fff74101ae4beaa41685bc6a5d13c1795447..7d0fbdc36747671a69eecdff26f49b4fbaedb586 100644
 | ||||
| index 2640c806b5c34479bea5d7d3bc19dba18f9afbad..948bf26ef13f4c1b8a2dda7f01c1aed0f1cd07d4 100644
 | ||||
| --- a/contrib/sssd.spec.in
 | ||||
| +++ b/contrib/sssd.spec.in
 | ||||
| @@ -9,6 +9,7 @@
 | ||||
| @ -374,5 +374,5 @@ index 5cc6cae693f09adae12df0d2267e0868ae2f74c0..e808f23e7560241e3fc158d71da2dbdb | ||||
|  #ifdef HAVE_CONFIG_LIB | ||||
|      { "libsss_config.so", { LIBPFX"libsss_config.so", NULL } }, | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 2.4.0 | ||||
| 
 | ||||
							
								
								
									
										124
									
								
								sssd.spec
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								sssd.spec
									
									
									
									
									
								
							| @ -27,7 +27,7 @@ | ||||
| 
 | ||||
| Name: sssd | ||||
| Version: 1.12.4 | ||||
| Release: 6%{?dist} | ||||
| Release: 7%{?dist} | ||||
| Group: Applications/System | ||||
| Summary: System Security Services Daemon | ||||
| License: GPLv3+ | ||||
| @ -36,26 +36,105 @@ Source0: https://fedorahosted.org/released/sssd/%{name}-%{version}.tar.gz | ||||
| BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) | ||||
| 
 | ||||
| ### Patches ### | ||||
| Patch0001: 0001-BUILD-Remove-unused-libraries-for-pysss.so.patch | ||||
| Patch0002: 0002-BUILD-Remove-unused-variables.patch | ||||
| Patch0003: 0003-BUILD-Remove-detection-of-type-Py_ssize_t.patch | ||||
| Patch0004: 0004-UTIL-Remove-python-wrapper-sss_python_set_new.patch | ||||
| Patch0005: 0005-UTIL-Remove-python-wrapper-sss_python_set_add.patch | ||||
| Patch0006: 0006-UTIL-Remove-python-wrapper-sss_python_set_check.patch | ||||
| Patch0007: 0007-UTIL-Remove-compatibility-macro-PyModule_AddIntMacro.patch | ||||
| Patch0008: 0008-UTIL-Remove-python-wrapper-sss_python_unicode_from_s.patch | ||||
| Patch0009: 0009-BUILD-Use-python-config-for-detection-FLAGS.patch | ||||
| Patch0010: 0010-SPEC-Use-new-convention-for-python-packages.patch | ||||
| Patch0011: 0011-SPEC-Move-python-bindings-to-separate-packages.patch | ||||
| Patch0012: 0012-BUILD-Add-possibility-to-build-python-2-3-bindings.patch | ||||
| Patch0013: 0013-TESTS-Run-python-tests-with-all-supported-python-ver.patch | ||||
| Patch0014: 0014-SPEC-Replace-python_-macros-with-python2_.patch | ||||
| Patch0015: 0015-SPEC-Build-python3-bindings-on-available-platforms.patch | ||||
| Patch0016: 0016-selinux-Delete-existing-user-mapping-on-empty-defaul.patch | ||||
| Patch0017: 0017-selinux-Handle-setup-with-empty-default-and-no-confi.patch | ||||
| Patch0018: 0018-selinux-Disconnect-before-closing-the-handle.patch | ||||
| Patch0019: 0019-selinux-Begin-and-end-the-transaction-on-the-same-ne.patch | ||||
| Patch0020: 0020-selinux-Only-call-semanage-if-the-context-actually-c.patch | ||||
| Patch0001: 0001-PAM-do-not-reject-abruptly.patch | ||||
| Patch0002: 0002-PAM-new-option-pam_account_expired_message.patch | ||||
| Patch0003: 0003-PAM-warn-all-services-about-account-expiration.patch | ||||
| Patch0004: 0004-PAM-check-return-value-of-confdb_get_string.patch | ||||
| Patch0005: 0005-resolv-Use-the-same-default-timeout-for-SRV-queries-.patch | ||||
| Patch0006: 0006-FO-Use-SRV-TTL-in-fail-over-code.patch | ||||
| Patch0007: 0007-SDAP-refactor-pwexpire-policy.patch | ||||
| Patch0008: 0008-SDAP-enable-change-phase-of-pw-expire-policy-check.patch | ||||
| Patch0009: 0009-LDAP-unlink-ccname_file_dummy-if-there-is-an-error.patch | ||||
| Patch0010: 0010-selinux-Delete-existing-user-mapping-on-empty-defaul.patch | ||||
| Patch0011: 0011-ldap_child-initialized-ccname_file_dummy.patch | ||||
| Patch0012: 0012-UTIL-convert-GeneralizedTime-to-unix-time.patch | ||||
| Patch0013: 0013-SDAP-Lock-out-ssh-keys-when-account-naturally-expire.patch | ||||
| Patch0014: 0014-SDAP-fix-minor-neglect-in-is_account_locked.patch | ||||
| Patch0015: 0015-be_refresh-refresh-all-domains-in-backend.patch | ||||
| Patch0016: 0016-sdap_handle_acct_req_send-remove-be_req.patch | ||||
| Patch0017: 0017-be_refresh-refactor-netgroups-refresh.patch | ||||
| Patch0018: 0018-be_refresh-add-sdap_refresh_init.patch | ||||
| Patch0019: 0019-be_refresh-support-users.patch | ||||
| Patch0020: 0020-be_refresh-support-groups.patch | ||||
| Patch0021: 0021-Log-reason-in-debug-message-why-ldb_modify-failed.patch | ||||
| Patch0022: 0022-ldap_child-fix-coverity-warning.patch | ||||
| Patch0023: 0023-NSS-Handle-ENOENT-when-doing-initgroups-by-UPN.patch | ||||
| Patch0024: 0024-MAN-libkrb5-and-SSSD-use-different-expansions.patch | ||||
| Patch0025: 0025-DEBUG-Add-missing-strings-for-error-messages.patch | ||||
| Patch0026: 0026-test-Check-ERR_LAST.patch | ||||
| Patch0027: 0027-PAM-use-the-logon_name-as-the-key-for-the-PAM-initgr.patch | ||||
| Patch0028: 0028-pam_initgr_check_timeout-add-debug-output.patch | ||||
| Patch0029: 0029-ipa-do-not-treat-missing-sub-domain-users-as-error.patch | ||||
| Patch0030: 0030-ipa-make-sure-extdom-expo-data-is-available.patch | ||||
| Patch0031: 0031-ipa_selinux-Fix-warning-may-be-used-uninitialized.patch | ||||
| Patch0032: 0032-LDAP-AD-do-not-resolve-group-members-during-tokenGro.patch | ||||
| Patch0033: 0033-IPA-idviews-check-if-view-name-is-set.patch | ||||
| Patch0034: 0034-selinux-Handle-setup-with-empty-default-and-no-confi.patch | ||||
| Patch0035: 0035-IPA-make-sure-output-variable-is-set.patch | ||||
| Patch0036: 0036-IPA-set-EINVAL-if-dn-can-t-be-linearized.patch | ||||
| Patch0037: 0037-GPO-error-out-instead-of-leaving-array-element-unini.patch | ||||
| Patch0038: 0038-LDAP-remove-unused-code.patch | ||||
| Patch0039: 0039-memberof-Do-not-create-request-with-0-attribute-valu.patch | ||||
| Patch0040: 0040-tests-convert-all-unit-tests-to-cmocka-1.0-or-later.patch | ||||
| Patch0041: 0041-RPM-BuildRequire-libcmocka-1.0.patch | ||||
| Patch0042: 0042-build-Only-run-cmocka-tests-if-cmocka-1.0-or-newer-i.patch | ||||
| Patch0043: 0043-sdap-properly-handle-binary-objectGuid-attribute.patch | ||||
| Patch0044: 0044-Resolv-re-read-SRV-query-every-time-if-its-TTL-is-0.patch | ||||
| Patch0045: 0045-IPA-Use-custom-error-codes-when-validating-HBAC-rule.patch | ||||
| Patch0046: 0046-IPA-Drop-useless-sysdb-parameter.patch | ||||
| Patch0047: 0047-IPA-Only-treat-malformed-HBAC-rules-as-fatal-if-deny.patch | ||||
| Patch0048: 0048-IPA-Deprecate-the-ipa_hbac_treat_deny_as-option.patch | ||||
| Patch0049: 0049-LDAP-fix-a-typo-in-debug-message.patch | ||||
| Patch0050: 0050-MAN-Update-ppolicy-description.patch | ||||
| Patch0051: 0051-CLIENT-Clear-errno-with-enabled-sss-default-nss-plug.patch | ||||
| Patch0052: 0052-GPO-Check-return-value-of-ad_gpo_store_policy_settin.patch | ||||
| Patch0053: 0053-enumeration-fix-talloc-context.patch | ||||
| Patch0054: 0054-sudo-sanitize-filter-values.patch | ||||
| Patch0055: 0055-SDAP-Do-not-set-gid-0-twice.patch | ||||
| Patch0056: 0056-SDAP-Extract-filtering-AD-group-to-function.patch | ||||
| Patch0057: 0057-SDAP-Filter-ad-groups-in-initgroups.patch | ||||
| Patch0058: 0058-selinux-Disconnect-before-closing-the-handle.patch | ||||
| Patch0059: 0059-selinux-Begin-and-end-the-transaction-on-the-same-ne.patch | ||||
| Patch0060: 0060-selinux-Only-call-semanage-if-the-context-actually-c.patch | ||||
| Patch0061: 0061-Option-filter_users-had-no-effect-for-retrieving-sud.patch | ||||
| Patch0062: 0062-AD-Clean-up-ad_access_gpo.patch | ||||
| Patch0063: 0063-AD-Always-get-domain-specific-ID-connection.patch | ||||
| Patch0064: 0064-AD-GPO-Always-look-up-GPOs-from-machine-domain.patch | ||||
| Patch0065: 0065-tests-Use-cmocka-1.0-API-in-test_sysdb_utils.patch | ||||
| Patch0066: 0066-sysdb-Add-cache_expire-to-the-default-sysdb_search_o.patch | ||||
| Patch0067: 0067-IPA-do-not-try-to-save-override-data-for-the-default.patch | ||||
| Patch0068: 0068-IPA-use-sysdb_attrs_add_string_safe-to-add-group-mem.patch | ||||
| Patch0069: 0069-IPA-check-ghosts-in-groups-found-by-uuid-as-well.patch | ||||
| Patch0070: 0070-simple-access-provider-make-user-grp-res-more-robust.patch | ||||
| Patch0071: 0071-IPA-allow-initgroups-by-SID-for-AD-users.patch | ||||
| Patch0072: 0072-IPA-fix-segfault-in-ipa_s2n_exop.patch | ||||
| Patch0073: 0073-autofs-fix-Cannot-allocate-memory-with-FQDNs.patch | ||||
| Patch0074: 0074-GPO-Do-not-ignore-missing-attrs-for-GPOs.patch | ||||
| Patch0075: 0075-sss_nss_idmap-tests-Use-different-prepared-buffers-f.patch | ||||
| Patch0076: 0076-SDAP-Fix-id-mapping-with-disabled-subdomains.patch | ||||
| Patch0077: 0077-IPA-do-initgroups-if-extdom-exop-supports-it.patch | ||||
| Patch0078: 0078-IPA-update-initgr-expire-timestamp-conditionally.patch | ||||
| Patch0079: 0079-IPA-enhance-ipa_initgr_get_overrides_send.patch | ||||
| Patch0080: 0080-IPA-search-for-overrides-during-initgroups-in-sever-.patch | ||||
| Patch0081: 0081-IPA-do-not-add-domain-name-unconditionally.patch | ||||
| Patch0082: 0082-NSS-check-for-overrides-before-calling-backend.patch | ||||
| Patch0083: 0083-IPA-allow-initgroups-by-UUID-for-FreeIPA-users.patch | ||||
| Patch0084: 0084-SPEC-Fix-cyclic-dependencies-between-sssd-krb5-commo.patch | ||||
| Patch0085: 0085-BUILD-Remove-unused-libraries-for-pysss.so.patch | ||||
| Patch0086: 0086-BUILD-Remove-unused-variables.patch | ||||
| Patch0087: 0087-BUILD-Remove-detection-of-type-Py_ssize_t.patch | ||||
| Patch0088: 0088-UTIL-Remove-python-wrapper-sss_python_set_new.patch | ||||
| Patch0089: 0089-UTIL-Remove-python-wrapper-sss_python_set_add.patch | ||||
| Patch0090: 0090-UTIL-Remove-python-wrapper-sss_python_set_check.patch | ||||
| Patch0091: 0091-UTIL-Remove-compatibility-macro-PyModule_AddIntMacro.patch | ||||
| Patch0092: 0092-UTIL-Remove-python-wrapper-sss_python_unicode_from_s.patch | ||||
| Patch0093: 0093-BUILD-Use-python-config-for-detection-FLAGS.patch | ||||
| Patch0094: 0094-SPEC-Use-new-convention-for-python-packages.patch | ||||
| Patch0095: 0095-SPEC-Move-python-bindings-to-separate-packages.patch | ||||
| Patch0096: 0096-BUILD-Add-possibility-to-build-python-2-3-bindings.patch | ||||
| Patch0097: 0097-TESTS-Run-python-tests-with-all-supported-python-ver.patch | ||||
| Patch0098: 0098-SPEC-Replace-python_-macros-with-python2_.patch | ||||
| Patch0099: 0099-SPEC-Build-python3-bindings-on-available-platforms.patch | ||||
| 
 | ||||
| ### Dependencies ### | ||||
| Requires: sssd-common = %{version}-%{release} | ||||
| @ -1015,6 +1094,9 @@ if [ $1 -eq 0 ]; then | ||||
| fi | ||||
| 
 | ||||
| %changelog | ||||
| * Fri May 08 2015 Lukas Slebodnik <lslebodn@redhat.com> - 1.12.4-7 | ||||
| - Backport patches from upstream 1.12.5 prerelease - contains many fixes | ||||
| 
 | ||||
| * Wed Apr 15 2015 Lukas Slebodnik <lslebodn@redhat.com> - 1.12.4-6 | ||||
| - Fix slow login with ipa and SELinux | ||||
| - Resolves: upstream #2624 - Only set the selinux context if the context | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user