LCOV - code coverage report
Current view: top level - db - sysdb_subdomains.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 134 244 54.9 %
Date: 2012-11-29 Functions: 12 16 75.0 %
Branches: 75 424 17.7 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :    SSSD
       3                 :            : 
       4                 :            :    System Database - Sub-domain related calls
       5                 :            : 
       6                 :            :    Copyright (C) 2012 Jan Zeleny <jzeleny@redhat.com>
       7                 :            :    Copyright (C) 2012 Sumit Bose <sbose@redhat.com>
       8                 :            : 
       9                 :            :    This program is free software; you can redistribute it and/or modify
      10                 :            :    it under the terms of the GNU General Public License as published by
      11                 :            :    the Free Software Foundation; either version 3 of the License, or
      12                 :            :    (at your option) any later version.
      13                 :            : 
      14                 :            :    This program is distributed in the hope that it will be useful,
      15                 :            :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      16                 :            :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17                 :            :    GNU General Public License for more details.
      18                 :            : 
      19                 :            :    You should have received a copy of the GNU General Public License
      20                 :            :    along with this program.  If not, see <http://www.gnu.org/licenses/>.
      21                 :            : */
      22                 :            : 
      23                 :            : #include "util/util.h"
      24                 :            : #include "db/sysdb_private.h"
      25                 :            : 
      26                 :         10 : errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
      27                 :            :                              size_t *subdomain_count,
      28                 :            :                              struct sysdb_subdom ***subdomain_list)
      29                 :            : {
      30                 :            :     int i;
      31                 :            :     errno_t ret;
      32                 :            :     TALLOC_CTX *tmp_ctx;
      33                 :            :     struct ldb_result *res;
      34                 :         10 :     const char *attrs[] = {"cn",
      35                 :            :                            SYSDB_SUBDOMAIN_REALM,
      36                 :            :                            SYSDB_SUBDOMAIN_FLAT,
      37                 :            :                            SYSDB_SUBDOMAIN_ID,
      38                 :            :                            NULL};
      39                 :            :     struct sysdb_subdom **list;
      40                 :            :     struct ldb_dn *basedn;
      41                 :            :     const char *tmp_str;
      42                 :            : 
      43                 :         10 :     tmp_ctx = talloc_new(NULL);
      44         [ +  - ]:         10 :     if (tmp_ctx == NULL) {
      45                 :            :         ret = ENOMEM;
      46                 :            :         goto done;
      47                 :            :     }
      48                 :            : 
      49                 :         10 :     basedn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE);
      50         [ +  - ]:         10 :     if (basedn == NULL) {
      51                 :            :         ret = EIO;
      52                 :            :         goto done;
      53                 :            :     }
      54                 :         10 :     ret = ldb_search(sysdb->ldb, tmp_ctx, &res,
      55                 :            :                      basedn, LDB_SCOPE_ONELEVEL,
      56                 :            :                      attrs, "objectclass=%s", SYSDB_SUBDOMAIN_CLASS);
      57         [ +  - ]:         10 :     if (ret != LDB_SUCCESS) {
      58                 :            :         ret = EIO;
      59                 :            :         goto done;
      60                 :            :     }
      61                 :            : 
      62                 :         10 :     list = talloc_zero_array(tmp_ctx, struct sysdb_subdom *, res->count + 1);
      63         [ +  - ]:         10 :     if (list == NULL) {
      64                 :            :         ret = ENOMEM;
      65                 :            :         goto done;
      66                 :            :     }
      67                 :            : 
      68         [ +  + ]:         16 :     for (i = 0; i < res->count; i++) {
      69                 :          6 :         list[i] = talloc_zero(list, struct sysdb_subdom);
      70         [ +  - ]:          6 :         if (list[i] == NULL) {
      71                 :            :             ret = ENOMEM;
      72                 :            :             goto done;
      73                 :            :         }
      74                 :          6 :         tmp_str = ldb_msg_find_attr_as_string(res->msgs[i], "cn", NULL);
      75         [ -  + ]:          6 :         if (tmp_str == NULL) {
      76 [ #  # ][ #  # ]:          0 :             DEBUG(SSSDBG_MINOR_FAILURE,
         [ #  # ][ #  # ]
                 [ #  # ]
      77                 :            :                   ("The object [%s] doesn't have a name\n",
      78                 :            :                    ldb_dn_get_linearized(res->msgs[i]->dn)));
      79                 :            :             ret = EINVAL;
      80                 :            :             goto done;
      81                 :            :         }
      82                 :            : 
      83                 :          6 :         list[i]->name = talloc_strdup(list, tmp_str);
      84         [ +  - ]:          6 :         if (list[i]->name == NULL) {
      85                 :            :             ret = ENOMEM;
      86                 :            :             goto done;
      87                 :            :         }
      88                 :            : 
      89                 :          6 :         tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
      90                 :            :                                               SYSDB_SUBDOMAIN_REALM, NULL);
      91         [ +  - ]:          6 :         if (tmp_str != NULL) {
      92                 :          6 :             list[i]->realm = talloc_strdup(list, tmp_str);
      93         [ +  - ]:          6 :             if (list[i]->realm == NULL) {
      94                 :            :                 ret = ENOMEM;
      95                 :            :                 goto done;
      96                 :            :             }
      97                 :            :         }
      98                 :            : 
      99                 :          6 :         tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
     100                 :            :                                               SYSDB_SUBDOMAIN_FLAT, NULL);
     101         [ +  - ]:          6 :         if (tmp_str != NULL) {
     102                 :          6 :             list[i]->flat_name = talloc_strdup(list, tmp_str);
     103         [ +  - ]:          6 :             if (list[i]->flat_name == NULL) {
     104                 :            :                 ret = ENOMEM;
     105                 :            :                 goto done;
     106                 :            :             }
     107                 :            :         }
     108                 :            : 
     109                 :          6 :         tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
     110                 :            :                                               SYSDB_SUBDOMAIN_ID, NULL);
     111         [ +  - ]:          6 :         if (tmp_str != NULL) {
     112                 :          6 :             list[i]->id = talloc_strdup(list, tmp_str);
     113         [ +  - ]:          6 :             if (list[i]->id == NULL) {
     114                 :            :                 ret = ENOMEM;
     115                 :            :                 goto done;
     116                 :            :             }
     117                 :            :         }
     118                 :            :     }
     119                 :            : 
     120                 :         10 :     list[res->count] = NULL;
     121                 :            : 
     122                 :         10 :     *subdomain_count = res->count;
     123                 :         10 :     *subdomain_list = talloc_steal(mem_ctx, list);
     124                 :         10 :     ret = EOK;
     125                 :            : 
     126                 :            : done:
     127                 :         10 :     talloc_free(tmp_ctx);
     128                 :         10 :     return ret;
     129                 :            : }
     130                 :            : 
     131                 :          0 : errno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
     132                 :            :                                      struct sysdb_ctx *sysdb,
     133                 :            :                                      struct sysdb_subdom **_info)
     134                 :            : {
     135                 :            :     errno_t ret;
     136                 :            :     TALLOC_CTX *tmp_ctx;
     137                 :            :     const char *tmp_str;
     138                 :            :     struct ldb_dn *basedn;
     139                 :            :     struct sysdb_subdom *info;
     140                 :            :     struct ldb_result *res;
     141                 :          0 :     const char *attrs[] = {"cn",
     142                 :            :                            SYSDB_SUBDOMAIN_REALM,
     143                 :            :                            SYSDB_SUBDOMAIN_FLAT,
     144                 :            :                            SYSDB_SUBDOMAIN_ID,
     145                 :            :                            NULL};
     146                 :            : 
     147                 :          0 :     tmp_ctx = talloc_new(NULL);
     148         [ #  # ]:          0 :     if (tmp_ctx == NULL) {
     149                 :            :         return ENOMEM;
     150                 :            :     }
     151                 :            : 
     152                 :          0 :     info = talloc_zero(tmp_ctx, struct sysdb_subdom);
     153         [ #  # ]:          0 :     if (info == NULL) {
     154                 :            :         ret = ENOMEM;
     155                 :            :         goto done;
     156                 :            :     }
     157                 :            : 
     158                 :          0 :     basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
     159                 :          0 :                             sysdb->domain->name);
     160         [ #  # ]:          0 :     if (basedn == NULL) {
     161                 :            :         ret = EIO;
     162                 :            :         goto done;
     163                 :            :     }
     164                 :          0 :     ret = ldb_search(sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_BASE, attrs,
     165                 :            :                      NULL);
     166         [ #  # ]:          0 :     if (ret != LDB_SUCCESS) {
     167                 :            :         ret = EIO;
     168                 :            :         goto done;
     169                 :            :     }
     170                 :            : 
     171         [ #  # ]:          0 :     if (res->count == 0) {
     172                 :            :         ret = ENOENT;
     173                 :            :         goto done;
     174                 :            :     }
     175                 :            : 
     176         [ #  # ]:          0 :     if (res->count > 1) {
     177 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Base search returned [%d] results, "
         [ #  # ][ #  # ]
                 [ #  # ]
     178                 :            :                                  "expected 1.\n", res->count));
     179                 :            :         ret = EINVAL;
     180                 :            :         goto done;
     181                 :            :     }
     182                 :            : 
     183                 :          0 :     tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_REALM,
     184                 :            :                                           NULL);
     185         [ #  # ]:          0 :     if (tmp_str != NULL) {
     186                 :          0 :         info->realm = talloc_strdup(info, tmp_str);
     187         [ #  # ]:          0 :         if (info->realm == NULL) {
     188                 :            :             ret = ENOMEM;
     189                 :            :             goto done;
     190                 :            :         }
     191                 :            :     }
     192                 :            : 
     193                 :          0 :     tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_FLAT,
     194                 :            :                                           NULL);
     195         [ #  # ]:          0 :     if (tmp_str != NULL) {
     196                 :          0 :         info->flat_name = talloc_strdup(info, tmp_str);
     197         [ #  # ]:          0 :         if (info->flat_name == NULL) {
     198                 :            :             ret = ENOMEM;
     199                 :            :             goto done;
     200                 :            :         }
     201                 :            :     }
     202                 :            : 
     203                 :          0 :     tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_ID,
     204                 :            :                                           NULL);
     205         [ #  # ]:          0 :     if (tmp_str != NULL) {
     206                 :          0 :         info->id = talloc_strdup(info, tmp_str);
     207         [ #  # ]:          0 :         if (info->id == NULL) {
     208                 :            :             ret = ENOMEM;
     209                 :            :             goto done;
     210                 :            :         }
     211                 :            :     }
     212                 :            : 
     213                 :          0 :     *_info = talloc_steal(mem_ctx, info);
     214                 :            : done:
     215                 :          0 :     talloc_free(tmp_ctx);
     216                 :            :     return ret;
     217                 :            : }
     218                 :            : 
     219                 :          0 : errno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
     220                 :            :                                      struct sysdb_subdom *domain_info)
     221                 :            : {
     222                 :            :     TALLOC_CTX *tmp_ctx;
     223                 :            :     struct ldb_message *msg;
     224                 :            :     int ret;
     225                 :          0 :     bool do_update = false;
     226                 :            :     struct sysdb_subdom *current_info;
     227                 :            : 
     228                 :          0 :     tmp_ctx = talloc_new(NULL);
     229         [ #  # ]:          0 :     if (tmp_ctx == NULL) {
     230                 :            :         return ENOMEM;
     231                 :            :     }
     232                 :            : 
     233                 :          0 :     ret = sysdb_master_domain_get_info(tmp_ctx, sysdb, &current_info);
     234         [ #  # ]:          0 :     if (ret != EOK) {
     235                 :            :         goto done;
     236                 :            :     }
     237                 :            : 
     238                 :          0 :     msg = ldb_msg_new(tmp_ctx);
     239         [ #  # ]:          0 :     if (msg == NULL) {
     240                 :            :         ret = ENOMEM;
     241                 :            :         goto done;
     242                 :            :     }
     243                 :            : 
     244                 :          0 :     msg->dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
     245                 :          0 :                              sysdb->domain->name);
     246         [ #  # ]:          0 :     if (msg->dn == NULL) {
     247                 :            :         ret = EIO;
     248                 :            :         goto done;
     249                 :            :     }
     250                 :            : 
     251 [ #  # ][ #  # ]:          0 :     if (domain_info->realm != NULL &&
     252         [ #  # ]:          0 :         (current_info->realm == NULL ||
     253                 :          0 :          strcmp(current_info->realm, domain_info->realm) != 0) ) {
     254                 :          0 :         ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM,
     255                 :            :                                 LDB_FLAG_MOD_REPLACE, NULL);
     256         [ #  # ]:          0 :         if (ret != LDB_SUCCESS) {
     257                 :          0 :             ret = sysdb_error_to_errno(ret);
     258                 :            :             goto done;
     259                 :            :         }
     260                 :            : 
     261                 :          0 :         ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM,
     262                 :            :                                  domain_info->realm);
     263         [ #  # ]:          0 :         if (ret != LDB_SUCCESS) {
     264                 :          0 :             ret = sysdb_error_to_errno(ret);
     265                 :            :             goto done;
     266                 :            :         }
     267                 :            : 
     268                 :            :         do_update = true;
     269                 :            :     }
     270                 :            : 
     271 [ #  # ][ #  # ]:          0 :     if (domain_info->flat_name != NULL &&
     272         [ #  # ]:          0 :         (current_info->flat_name == NULL ||
     273                 :          0 :          strcmp(current_info->flat_name, domain_info->flat_name) != 0) ) {
     274                 :          0 :         ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT,
     275                 :            :                                 LDB_FLAG_MOD_REPLACE, NULL);
     276         [ #  # ]:          0 :         if (ret != LDB_SUCCESS) {
     277                 :          0 :             ret = sysdb_error_to_errno(ret);
     278                 :            :             goto done;
     279                 :            :         }
     280                 :            : 
     281                 :          0 :         ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT,
     282                 :            :                                  domain_info->flat_name);
     283         [ #  # ]:          0 :         if (ret != LDB_SUCCESS) {
     284                 :          0 :             ret = sysdb_error_to_errno(ret);
     285                 :            :             goto done;
     286                 :            :         }
     287                 :            : 
     288                 :            :         do_update = true;
     289                 :            :     }
     290                 :            : 
     291 [ #  # ][ #  # ]:          0 :     if (domain_info->id != NULL &&
     292         [ #  # ]:          0 :         (current_info->id == NULL ||
     293                 :          0 :          strcmp(current_info->id, domain_info->id) != 0) ) {
     294                 :          0 :         ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_REPLACE,
     295                 :            :                                 NULL);
     296         [ #  # ]:          0 :         if (ret != LDB_SUCCESS) {
     297                 :          0 :             ret = sysdb_error_to_errno(ret);
     298                 :            :             goto done;
     299                 :            :         }
     300                 :            : 
     301                 :          0 :         ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_info->id);
     302         [ #  # ]:          0 :         if (ret != LDB_SUCCESS) {
     303                 :          0 :             ret = sysdb_error_to_errno(ret);
     304                 :            :             goto done;
     305                 :            :         }
     306                 :            : 
     307                 :            :         do_update = true;
     308                 :            :     }
     309                 :            : 
     310         [ #  # ]:          0 :     if (do_update == false) {
     311                 :            :         ret = EOK;
     312                 :            :         goto done;
     313                 :            :     }
     314                 :            : 
     315                 :          0 :     ret = ldb_modify(sysdb->ldb, msg);
     316         [ #  # ]:          0 :     if (ret != LDB_SUCCESS) {
     317 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
         [ #  # ][ #  # ]
                 [ #  # ]
     318                 :            :                                      "[%s]: [%d][%s]!\n",
     319                 :            :                                      domain_info->name, ret,
     320                 :            :                                      ldb_errstring(sysdb->ldb)));
     321                 :          0 :         ret = sysdb_error_to_errno(ret);
     322                 :            :         goto done;
     323                 :            :     }
     324                 :            : 
     325                 :            :     ret = EOK;
     326                 :            : 
     327                 :            : done:
     328                 :          0 :     talloc_free(tmp_ctx);
     329                 :            : 
     330                 :            :     return ret;
     331                 :            : }
     332                 :          3 : static errno_t sysdb_add_subdomain_attributes(struct sysdb_ctx *sysdb,
     333                 :            :                                              struct sysdb_subdom *domain_info)
     334                 :            : {
     335                 :            :     TALLOC_CTX *tmp_ctx;
     336                 :            :     struct ldb_message *msg;
     337                 :            :     int ret;
     338                 :            : 
     339                 :          3 :     tmp_ctx = talloc_new(NULL);
     340         [ +  - ]:          3 :     if (tmp_ctx == NULL) {
     341                 :            :         return ENOMEM;
     342                 :            :     }
     343                 :            : 
     344                 :          3 :     msg = ldb_msg_new(tmp_ctx);
     345         [ +  - ]:          3 :     if (msg == NULL) {
     346                 :            :         ret = ENOMEM;
     347                 :            :         goto done;
     348                 :            :     }
     349                 :            : 
     350                 :          3 :     msg->dn = ldb_dn_new_fmt(msg, sysdb->ldb, SYSDB_DOM_BASE,
     351                 :            :                              domain_info->name);
     352         [ +  - ]:          3 :     if (msg->dn == NULL) {
     353                 :            :         ret = ENOMEM;
     354                 :            :         goto done;
     355                 :            :     }
     356                 :            : 
     357                 :          3 :     ret = ldb_msg_add_empty(msg, SYSDB_OBJECTCLASS, LDB_FLAG_MOD_ADD, NULL);
     358         [ -  + ]:          3 :     if (ret != LDB_SUCCESS) {
     359                 :          0 :         ret = sysdb_error_to_errno(ret);
     360                 :            :         goto done;
     361                 :            :     }
     362                 :            : 
     363                 :          3 :     ret = ldb_msg_add_string(msg, SYSDB_OBJECTCLASS, SYSDB_SUBDOMAIN_CLASS);
     364         [ -  + ]:          3 :     if (ret != LDB_SUCCESS) {
     365                 :          0 :         ret = sysdb_error_to_errno(ret);
     366                 :            :         goto done;
     367                 :            :     }
     368                 :            : 
     369         [ +  - ]:          3 :     if (domain_info->realm != NULL) {
     370                 :          3 :         ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM, LDB_FLAG_MOD_ADD,
     371                 :            :                                 NULL);
     372         [ -  + ]:          3 :         if (ret != LDB_SUCCESS) {
     373                 :          0 :             ret = sysdb_error_to_errno(ret);
     374                 :            :             goto done;
     375                 :            :         }
     376                 :            : 
     377                 :          3 :         ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM,
     378                 :            :                                  domain_info->realm);
     379         [ -  + ]:          3 :         if (ret != LDB_SUCCESS) {
     380                 :          0 :             ret = sysdb_error_to_errno(ret);
     381                 :            :             goto done;
     382                 :            :         }
     383                 :            :     }
     384                 :            : 
     385         [ +  - ]:          3 :     if (domain_info->flat_name != NULL) {
     386                 :          3 :         ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT, LDB_FLAG_MOD_ADD,
     387                 :            :                                 NULL);
     388         [ -  + ]:          3 :         if (ret != LDB_SUCCESS) {
     389                 :          0 :             ret = sysdb_error_to_errno(ret);
     390                 :            :             goto done;
     391                 :            :         }
     392                 :            : 
     393                 :          3 :         ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT,
     394                 :            :                                  domain_info->flat_name);
     395         [ -  + ]:          3 :         if (ret != LDB_SUCCESS) {
     396                 :          0 :             ret = sysdb_error_to_errno(ret);
     397                 :            :             goto done;
     398                 :            :         }
     399                 :            :     }
     400                 :            : 
     401         [ +  - ]:          3 :     if (domain_info->id != NULL) {
     402                 :          3 :         ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_ADD,
     403                 :            :                                 NULL);
     404         [ -  + ]:          3 :         if (ret != LDB_SUCCESS) {
     405                 :          0 :             ret = sysdb_error_to_errno(ret);
     406                 :            :             goto done;
     407                 :            :         }
     408                 :            : 
     409                 :          3 :         ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_info->id);
     410         [ -  + ]:          3 :         if (ret != LDB_SUCCESS) {
     411                 :          0 :             ret = sysdb_error_to_errno(ret);
     412                 :            :             goto done;
     413                 :            :         }
     414                 :            :     }
     415                 :            : 
     416                 :          3 :     ret = ldb_modify(sysdb->ldb, msg);
     417         [ -  + ]:          3 :     if (ret != LDB_SUCCESS) {
     418 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
         [ #  # ][ #  # ]
                 [ #  # ]
     419                 :            :                                      "[%s]: [%d][%s]!\n",
     420                 :            :                                      domain_info->name, ret,
     421                 :            :                                      ldb_errstring(sysdb->ldb)));
     422                 :          0 :         ret = sysdb_error_to_errno(ret);
     423                 :            :         goto done;
     424                 :            :     }
     425                 :            : 
     426                 :            :     ret = EOK;
     427                 :            : 
     428                 :            : done:
     429                 :          3 :     talloc_free(tmp_ctx);
     430                 :            : 
     431                 :            :     return ret;
     432                 :            : }
     433                 :            : 
     434                 :          6 : errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb,
     435                 :            :                                 int num_subdoms,
     436                 :            :                                 struct sysdb_subdom *subdoms)
     437                 :            : {
     438                 :            :     int ret;
     439                 :            :     int sret;
     440                 :            :     size_t c;
     441                 :            :     size_t d;
     442                 :          6 :     TALLOC_CTX *tmp_ctx = NULL;
     443                 :            :     size_t cur_subdomains_count;
     444                 :            :     struct sysdb_subdom **cur_subdomains;
     445                 :            :     struct ldb_dn *dn;
     446                 :          6 :     bool in_transaction = false;
     447                 :            :     bool *keep_subdomain;
     448                 :            : 
     449                 :          6 :     tmp_ctx = talloc_new(NULL);
     450         [ +  - ]:          6 :     if (tmp_ctx == NULL) {
     451                 :            :         ret = ENOMEM;
     452                 :            :         goto done;
     453                 :            :     }
     454                 :            : 
     455                 :            :     /* Retrieve all subdomains that are currently in sysdb */
     456                 :          6 :     ret = sysdb_get_subdomains(tmp_ctx, sysdb, &cur_subdomains_count,
     457                 :            :                                &cur_subdomains);
     458         [ -  + ]:          6 :     if (ret != EOK) {
     459 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("sysdb_get_subdomains failed.\n"));
         [ #  # ][ #  # ]
                 [ #  # ]
     460                 :            :         goto done;
     461                 :            :     }
     462                 :            : 
     463                 :          6 :     keep_subdomain = talloc_zero_array(tmp_ctx, bool, cur_subdomains_count);
     464         [ -  + ]:          6 :     if (keep_subdomain == NULL) {
     465                 :          0 :         ret = ENOMEM;
     466 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero_array failed.\n"));
         [ #  # ][ #  # ]
                 [ #  # ]
     467                 :            :         goto done;
     468                 :            :     }
     469                 :            : 
     470                 :          6 :     ret = sysdb_transaction_start(sysdb);
     471         [ +  - ]:          6 :     if (ret != EOK) {
     472 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("sysdb_transaction_start failed.\n"));
         [ #  # ][ #  # ]
                 [ #  # ]
     473                 :            :         goto done;
     474                 :            :     }
     475                 :            :     in_transaction = true;
     476                 :            : 
     477                 :            :     /* Go through a list of retrieved subdomains and:
     478                 :            :      * - if a subdomain already exists in sysdb, mark it for preservation
     479                 :            :      * - if the subdomain doesn't exist in sysdb, create its bare structure
     480                 :            :      */
     481         [ +  + ]:         11 :     for (c = 0; c < num_subdoms; c++) {
     482         [ +  + ]:          6 :         for (d = 0; d < cur_subdomains_count; d++) {
     483         [ +  + ]:          3 :             if (strcasecmp(subdoms[c].name,
     484                 :          3 :                            cur_subdomains[d]->name) == 0) {
     485                 :          2 :                 keep_subdomain[d] = true;
     486                 :            :                 /* sub-domain already in cache, nothing to do */
     487                 :          2 :                 break;
     488                 :            :             }
     489                 :            :         }
     490                 :            : 
     491         [ +  + ]:          5 :         if (d == cur_subdomains_count) {
     492 [ +  - ][ +  - ]:          3 :             DEBUG(SSSDBG_TRACE_FUNC, ("Adding sub-domain [%s].\n",
         [ -  + ][ #  # ]
                 [ #  # ]
     493                 :            :                                       subdoms[c].name));
     494                 :          3 :             ret = sysdb_domain_create(sysdb, subdoms[c].name);
     495         [ -  + ]:          3 :             if (ret != EOK) {
     496 [ #  # ][ #  # ]:          0 :                 DEBUG(SSSDBG_OP_FAILURE, ("sysdb_domain_create failed.\n"));
         [ #  # ][ #  # ]
                 [ #  # ]
     497                 :            :                 goto done;
     498                 :            :             }
     499                 :            : 
     500                 :          3 :             ret = sysdb_add_subdomain_attributes(sysdb, &subdoms[c]);
     501         [ -  + ]:          3 :             if (ret != EOK) {
     502 [ #  # ][ #  # ]:          0 :                 DEBUG(SSSDBG_OP_FAILURE,
         [ #  # ][ #  # ]
                 [ #  # ]
     503                 :            :                       ("sysdb_add_subdomain_attributes failed.\n"));
     504                 :            :                 goto done;
     505                 :            :             }
     506                 :            :         }
     507                 :            :     }
     508                 :            : 
     509                 :            :     /* Now delete all subdomains that have been in sysdb prior to
     510                 :            :      * refreshing the list and are not marked for preservation
     511                 :            :      * (i.e. they are not in the new list of subdomains)
     512                 :            :      */
     513         [ +  + ]:         10 :     for (d = 0; d < cur_subdomains_count; d++) {
     514         [ +  + ]:          4 :         if (!keep_subdomain[d]) {
     515 [ +  - ][ +  - ]:          2 :             DEBUG(SSSDBG_TRACE_FUNC, ("Removing sub-domain [%s].\n",
         [ -  + ][ #  # ]
                 [ #  # ]
     516                 :            :                                       cur_subdomains[d]->name));
     517                 :          2 :             dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
     518                 :          2 :                                 cur_subdomains[d]->name);
     519         [ +  - ]:          2 :             if (dn == NULL) {
     520                 :            :                 ret = ENOMEM;
     521                 :            :                 goto done;
     522                 :            :             }
     523                 :            : 
     524                 :          2 :             ret = sysdb_delete_recursive(sysdb, dn, true);
     525         [ -  + ]:          2 :             if (ret != EOK) {
     526 [ #  # ][ #  # ]:          0 :                 DEBUG(SSSDBG_OP_FAILURE, ("sysdb_delete_recursive failed.\n"));
         [ #  # ][ #  # ]
                 [ #  # ]
     527                 :            :                 goto done;
     528                 :            :             }
     529                 :            :         }
     530                 :            :     }
     531                 :            : 
     532                 :          6 :     ret = sysdb_transaction_commit(sysdb);
     533         [ -  + ]:          6 :     if (ret != EOK) {
     534 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_MINOR_FAILURE, ("Could not commit transaction\n"));
         [ #  # ][ #  # ]
                 [ #  # ]
     535                 :            :         goto done;
     536                 :            :     }
     537                 :            :     in_transaction = false;
     538                 :            : 
     539                 :            : done:
     540         [ -  + ]:          6 :     if (in_transaction) {
     541                 :          0 :         sret = sysdb_transaction_cancel(sysdb);
     542         [ #  # ]:          0 :         if (sret != EOK) {
     543 [ #  # ][ #  # ]:          0 :             DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
         [ #  # ][ #  # ]
                 [ #  # ]
     544                 :            :         }
     545                 :            :     }
     546                 :          6 :     talloc_free(tmp_ctx);
     547                 :          6 :     return ret;
     548                 :            : }
     549                 :            : 
     550                 :          3 : errno_t sysdb_get_subdomain_context(TALLOC_CTX *mem_ctx,
     551                 :            :                                     struct sysdb_ctx *sysdb,
     552                 :            :                                     struct sss_domain_info *subdomain,
     553                 :            :                                     struct sysdb_ctx **subdomain_ctx)
     554                 :            : {
     555                 :            :     struct sysdb_ctx *new_ctx;
     556                 :            : 
     557                 :          3 :     new_ctx = talloc_zero(mem_ctx, struct sysdb_ctx);
     558         [ +  - ]:          3 :     if (new_ctx == NULL) {
     559                 :            :         return ENOMEM;
     560                 :            :     }
     561                 :            : 
     562                 :          3 :     new_ctx->domain = subdomain;
     563                 :          3 :     new_ctx->mpg = true;
     564                 :            : 
     565                 :          3 :     new_ctx->ldb = sysdb->ldb;
     566                 :          3 :     new_ctx->ldb_file = sysdb->ldb_file;
     567                 :            : 
     568                 :          3 :     *subdomain_ctx = new_ctx;
     569                 :            : 
     570                 :          3 :     return EOK;
     571                 :            : }
     572                 :            : 
     573                 :            : #define CHECK_DOMAIN_INFO(dom_info) do { \
     574                 :            :     if (dom_info == NULL || dom_info->sysdb == NULL) { \
     575                 :            :         DEBUG(SSSDBG_OP_FAILURE, ("Invalid domain info.\n")); \
     576                 :            :         return EINVAL; \
     577                 :            :     } \
     578                 :            : } while(0)
     579                 :            : 
     580                 :          1 : errno_t sysdb_search_domuser_by_name(TALLOC_CTX *mem_ctx,
     581                 :            :                                      struct sss_domain_info *domain,
     582                 :            :                                      const char *name,
     583                 :            :                                      const char **attrs,
     584                 :            :                                      struct ldb_message **msg)
     585                 :            : {
     586 [ +  - ][ -  + ]:          1 :     CHECK_DOMAIN_INFO(domain);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     587                 :            : 
     588                 :          1 :     return sysdb_search_user_by_name(mem_ctx, domain->sysdb, name, attrs, msg);
     589                 :            : }
     590                 :            : 
     591                 :          1 : errno_t sysdb_search_domuser_by_uid(TALLOC_CTX *mem_ctx,
     592                 :            :                                     struct sss_domain_info *domain,
     593                 :            :                                     uid_t uid,
     594                 :            :                                     const char **attrs,
     595                 :            :                                     struct ldb_message **msg)
     596                 :            : {
     597 [ +  - ][ -  + ]:          1 :     CHECK_DOMAIN_INFO(domain);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     598                 :            : 
     599                 :          1 :     return sysdb_search_user_by_uid(mem_ctx, domain->sysdb, uid, attrs, msg);
     600                 :            : }
     601                 :            : 
     602                 :          1 : errno_t sysdb_store_domuser(struct sss_domain_info *domain,
     603                 :            :                             const char *name,
     604                 :            :                             const char *pwd,
     605                 :            :                             uid_t uid, gid_t gid,
     606                 :            :                             const char *gecos,
     607                 :            :                             const char *homedir,
     608                 :            :                             const char *shell,
     609                 :            :                             struct sysdb_attrs *attrs,
     610                 :            :                             char **remove_attrs,
     611                 :            :                             uint64_t cache_timeout,
     612                 :            :                             time_t now)
     613                 :            : {
     614 [ +  - ][ -  + ]:          1 :     CHECK_DOMAIN_INFO(domain);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     615                 :            : 
     616                 :          1 :     return sysdb_store_user(domain->sysdb, name, pwd, uid, gid, gecos, homedir,
     617                 :            :                             shell, NULL, attrs, remove_attrs, cache_timeout, now);
     618                 :            : }
     619                 :            : 
     620                 :          1 : errno_t sysdb_delete_domuser(struct sss_domain_info *domain,
     621                 :            :                              const char *name, uid_t uid)
     622                 :            : {
     623 [ +  - ][ -  + ]:          1 :     CHECK_DOMAIN_INFO(domain);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     624                 :            : 
     625                 :          1 :     return sysdb_delete_user(domain->sysdb, name, uid);
     626                 :            : }
     627                 :            : 
     628                 :          1 : errno_t sysdb_search_domgroup_by_name(TALLOC_CTX *mem_ctx,
     629                 :            :                                       struct sss_domain_info *domain,
     630                 :            :                                       const char *name,
     631                 :            :                                       const char **attrs,
     632                 :            :                                       struct ldb_message **msg)
     633                 :            : {
     634 [ +  - ][ -  + ]:          1 :     CHECK_DOMAIN_INFO(domain);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     635                 :            : 
     636                 :          1 :     return sysdb_search_group_by_name(mem_ctx, domain->sysdb,
     637                 :            :                                       name, attrs, msg);
     638                 :            : }
     639                 :            : 
     640                 :          1 : errno_t sysdb_search_domgroup_by_gid(TALLOC_CTX *mem_ctx,
     641                 :            :                                      struct sss_domain_info *domain,
     642                 :            :                                      gid_t gid,
     643                 :            :                                      const char **attrs,
     644                 :            :                                      struct ldb_message **msg)
     645                 :            : {
     646 [ +  - ][ -  + ]:          1 :     CHECK_DOMAIN_INFO(domain);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     647                 :            : 
     648                 :          1 :     return sysdb_search_group_by_gid(mem_ctx, domain->sysdb, gid, attrs, msg);
     649                 :            : }
     650                 :            : 
     651                 :          1 : errno_t sysdb_store_domgroup(struct sss_domain_info *domain,
     652                 :            :                              const char *name,
     653                 :            :                              gid_t gid,
     654                 :            :                              struct sysdb_attrs *attrs,
     655                 :            :                              uint64_t cache_timeout,
     656                 :            :                              time_t now)
     657                 :            : {
     658 [ +  - ][ -  + ]:          1 :     CHECK_DOMAIN_INFO(domain);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     659                 :            : 
     660                 :          1 :     return sysdb_store_group(domain->sysdb, name, gid, attrs, cache_timeout,
     661                 :            :                              now);
     662                 :            : }
     663                 :            : 
     664                 :          1 : errno_t sysdb_delete_domgroup(struct sss_domain_info *domain,
     665                 :            :                               const char *name, gid_t gid)
     666                 :            : {
     667 [ +  - ][ -  + ]:          1 :     CHECK_DOMAIN_INFO(domain);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     668                 :            : 
     669                 :          1 :     return sysdb_delete_group(domain->sysdb, name, gid);
     670                 :            : }
     671                 :            : 
     672                 :          0 : int sysdb_subdom_getpwnam(TALLOC_CTX *mem_ctx,
     673                 :            :                           struct sysdb_ctx *sysdb,
     674                 :            :                           const char *name,
     675                 :            :                           struct ldb_result **res)
     676                 :            : {
     677                 :          0 :     char *src_name = NULL;
     678                 :            :     int ret;
     679                 :            : 
     680         [ #  # ]:          0 :     if (sysdb->domain->parent) {
     681                 :          0 :         src_name = talloc_asprintf(mem_ctx, sysdb->domain->names->fq_fmt,
     682                 :            :                                    name, sysdb->domain->name);
     683         [ #  # ]:          0 :         if (!src_name) return ENOMEM;
     684                 :            :     }
     685                 :            : 
     686         [ #  # ]:          0 :     ret = sysdb_getpwnam(mem_ctx, sysdb, src_name ? src_name : name, res);
     687                 :          0 :     talloc_zfree(src_name);
     688                 :            : 
     689                 :          0 :     return ret;
     690                 :            : }
     691                 :            : 
     692                 :          0 : int sysdb_subdom_getgrnam(TALLOC_CTX *mem_ctx,
     693                 :            :                           struct sysdb_ctx *sysdb,
     694                 :            :                           const char *name,
     695                 :            :                           struct ldb_result **res)
     696                 :            : {
     697                 :          0 :     char *src_name = NULL;
     698                 :            :     int ret;
     699                 :            : 
     700         [ #  # ]:          0 :     if (sysdb->domain->parent) {
     701                 :          0 :         src_name = talloc_asprintf(mem_ctx, sysdb->domain->names->fq_fmt,
     702                 :            :                                    name, sysdb->domain->name);
     703         [ #  # ]:          0 :         if (!src_name) return ENOMEM;
     704                 :            :     }
     705                 :            : 
     706         [ #  # ]:          0 :     ret = sysdb_getgrnam(mem_ctx, sysdb, src_name ? src_name : name, res);
     707                 :          0 :     talloc_zfree(src_name);
     708                 :            : 
     709                 :          0 :     return ret;
     710                 :          3 : }

Generated by: LCOV version 1.9