LCOV - code coverage report
Current view: top level - db - sysdb_gpo.c (source / functions) Hit Total Coverage
Test: .coverage.total Lines: 201 314 64.0 %
Date: 2015-10-19 Functions: 9 9 100.0 %

          Line data    Source code
       1             : /*
       2             :     SSSD
       3             : 
       4             :     Authors:
       5             :         Yassir Elley <yelley@redhat.com>
       6             : 
       7             :     Copyright (C) 2014 Red Hat
       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             : 
      24             : #include "db/sysdb.h"
      25             : #include "db/sysdb_private.h"
      26             : 
      27             : static struct ldb_dn *
      28           2 : sysdb_gpo_dn(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain,
      29             :              const char *gpo_guid)
      30             : {
      31             :     errno_t ret;
      32             :     char *clean_gpo_guid;
      33             :     struct ldb_dn *dn;
      34             : 
      35           2 :     ret = sysdb_dn_sanitize(NULL, gpo_guid, &clean_gpo_guid);
      36           2 :     if (ret != EOK) {
      37           0 :         return NULL;
      38             :     }
      39             : 
      40           2 :     DEBUG(SSSDBG_TRACE_ALL, SYSDB_TMPL_GPO"\n", clean_gpo_guid, domain->name);
      41             : 
      42           2 :     dn = ldb_dn_new_fmt(mem_ctx, domain->sysdb->ldb, SYSDB_TMPL_GPO,
      43             :                         clean_gpo_guid, domain->name);
      44           2 :     talloc_free(clean_gpo_guid);
      45             : 
      46           2 :     return dn;
      47             : }
      48             : 
      49             : errno_t
      50           2 : sysdb_gpo_store_gpo(struct sss_domain_info *domain,
      51             :                     const char *gpo_guid,
      52             :                     int gpo_version,
      53             :                     int cache_timeout,
      54             :                     time_t now)
      55             : {
      56             :     errno_t ret, sret;
      57             :     int lret;
      58             :     struct ldb_message *update_msg;
      59             :     struct ldb_message **msgs;
      60             :     static const char *attrs[] = SYSDB_GPO_ATTRS;
      61             :     size_t count;
      62           2 :     bool in_transaction = false;
      63             :     TALLOC_CTX *tmp_ctx;
      64             : 
      65           2 :     tmp_ctx = talloc_new(NULL);
      66           2 :     if (!tmp_ctx) return ENOMEM;
      67             : 
      68           2 :     update_msg = ldb_msg_new(tmp_ctx);
      69           2 :     if (!update_msg) {
      70           0 :         ret = ENOMEM;
      71           0 :         goto done;
      72             :     }
      73             : 
      74           2 :     update_msg->dn = sysdb_gpo_dn(update_msg, domain, gpo_guid);
      75           2 :     if (!update_msg->dn) {
      76           0 :         ret = ENOMEM;
      77           0 :         goto done;
      78             :     }
      79             : 
      80           2 :     ret = sysdb_transaction_start(domain->sysdb);
      81           2 :     if (ret != EOK) {
      82           0 :         DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n");
      83           0 :         goto done;
      84             :     }
      85             : 
      86           2 :     if (!now) {
      87           2 :         now = time(NULL);
      88             :     }
      89             : 
      90           2 :     in_transaction = true;
      91             : 
      92             :     /* Check for an existing gpo_guid entry */
      93           2 :     ret = sysdb_search_entry(tmp_ctx, domain->sysdb, update_msg->dn,
      94             :                              LDB_SCOPE_BASE, NULL, attrs, &count, &msgs);
      95             : 
      96           2 :     if (ret == ENOENT) {
      97             :         /* Create new GPO */
      98           1 :         DEBUG(SSSDBG_TRACE_FUNC,
      99             :               "Adding new GPO [gpo_guid:%s][gpo_version:%d]\n",
     100             :               gpo_guid, gpo_version);
     101             : 
     102             :         /* Add the objectClass */
     103           1 :         lret = ldb_msg_add_empty(update_msg, SYSDB_OBJECTCLASS,
     104             :                                  LDB_FLAG_MOD_ADD,
     105             :                                  NULL);
     106           1 :         if (lret != LDB_SUCCESS) {
     107           0 :             ret = sysdb_error_to_errno(lret);
     108           0 :             goto done;
     109             :         }
     110             : 
     111           1 :         lret = ldb_msg_add_string(update_msg, SYSDB_OBJECTCLASS,
     112             :                                   SYSDB_GPO_OC);
     113           1 :         if (lret != LDB_SUCCESS) {
     114           0 :             ret = sysdb_error_to_errno(lret);
     115           0 :             goto done;
     116             :         }
     117             : 
     118             :         /* Add the GPO GUID */
     119           1 :         lret = ldb_msg_add_empty(update_msg, SYSDB_GPO_GUID_ATTR,
     120             :                                  LDB_FLAG_MOD_ADD,
     121             :                                  NULL);
     122           1 :         if (lret != LDB_SUCCESS) {
     123           0 :             ret = sysdb_error_to_errno(lret);
     124           0 :             goto done;
     125             :         }
     126             : 
     127           1 :         lret = ldb_msg_add_string(update_msg, SYSDB_GPO_GUID_ATTR, gpo_guid);
     128           1 :         if (lret != LDB_SUCCESS) {
     129           0 :             ret = sysdb_error_to_errno(lret);
     130           0 :             goto done;
     131             :         }
     132             : 
     133             :         /* Add the Version */
     134           1 :         lret = ldb_msg_add_empty(update_msg, SYSDB_GPO_VERSION_ATTR,
     135             :                                  LDB_FLAG_MOD_ADD,
     136             :                                  NULL);
     137           1 :         if (lret != LDB_SUCCESS) {
     138           0 :             ret = sysdb_error_to_errno(lret);
     139           0 :             goto done;
     140             :         }
     141             : 
     142           1 :         lret = ldb_msg_add_fmt(update_msg, SYSDB_GPO_VERSION_ATTR,
     143             :                                "%d", gpo_version);
     144           1 :         if (lret != LDB_SUCCESS) {
     145           0 :             ret = sysdb_error_to_errno(lret);
     146           0 :             goto done;
     147             :         }
     148             : 
     149             :         /* Add the Policy File Timeout */
     150           1 :         lret = ldb_msg_add_empty(update_msg, SYSDB_GPO_TIMEOUT_ATTR,
     151             :                                  LDB_FLAG_MOD_ADD, NULL);
     152           1 :         if (lret != LDB_SUCCESS) {
     153           0 :             ret = sysdb_error_to_errno(lret);
     154           0 :             goto done;
     155             :         }
     156             : 
     157           2 :         lret = ldb_msg_add_fmt(update_msg, SYSDB_GPO_TIMEOUT_ATTR, "%lu",
     158           1 :                                ((cache_timeout) ? (now + cache_timeout) : 0));
     159           1 :         if (lret != LDB_SUCCESS) {
     160           0 :             ret = sysdb_error_to_errno(lret);
     161           0 :             goto done;
     162             :         }
     163             : 
     164           1 :         lret = ldb_add(domain->sysdb->ldb, update_msg);
     165           1 :         if (lret != LDB_SUCCESS) {
     166           0 :             DEBUG(SSSDBG_MINOR_FAILURE,
     167             :                   "Failed to add GPO: [%s]\n",
     168             :                    ldb_strerror(lret));
     169           0 :             ret = sysdb_error_to_errno(lret);
     170           0 :             goto done;
     171             :         }
     172           1 :     } else if (ret == EOK && count == 1) {
     173             :         /* Update the existing GPO */
     174             : 
     175           1 :         DEBUG(SSSDBG_TRACE_ALL, "Updating new GPO [%s][%s]\n", domain->name, gpo_guid);
     176             : 
     177             :         /* Add the Version */
     178           1 :         lret = ldb_msg_add_empty(update_msg, SYSDB_GPO_VERSION_ATTR,
     179             :                                  LDB_FLAG_MOD_REPLACE,
     180             :                                  NULL);
     181           1 :         if (lret != LDB_SUCCESS) {
     182           0 :             ret = sysdb_error_to_errno(lret);
     183           0 :             goto done;
     184             :         }
     185             : 
     186           1 :         lret = ldb_msg_add_fmt(update_msg, SYSDB_GPO_VERSION_ATTR,
     187             :                                "%d", gpo_version);
     188           1 :         if (lret != LDB_SUCCESS) {
     189           0 :             ret = sysdb_error_to_errno(lret);
     190           0 :             goto done;
     191             :         }
     192             : 
     193             :         /* Add the Policy File Timeout */
     194           1 :         lret = ldb_msg_add_empty(update_msg, SYSDB_GPO_TIMEOUT_ATTR,
     195             :                                  LDB_FLAG_MOD_REPLACE, NULL);
     196           1 :         if (lret != LDB_SUCCESS) {
     197           0 :             ret = sysdb_error_to_errno(lret);
     198           0 :             goto done;
     199             :         }
     200             : 
     201           2 :         lret = ldb_msg_add_fmt(update_msg, SYSDB_GPO_TIMEOUT_ATTR, "%lu",
     202           1 :                                ((cache_timeout) ? (now + cache_timeout) : 0));
     203           1 :         if (lret != LDB_SUCCESS) {
     204           0 :             ret = sysdb_error_to_errno(lret);
     205           0 :             goto done;
     206             :         }
     207             : 
     208           1 :         lret = ldb_modify(domain->sysdb->ldb, update_msg);
     209           2 :         if (lret != LDB_SUCCESS) {
     210           0 :             DEBUG(SSSDBG_MINOR_FAILURE,
     211             :                   "Failed to modify GPO: [%s](%d)[%s]\n",
     212             :                   ldb_strerror(lret), lret, ldb_errstring(domain->sysdb->ldb));
     213           0 :             ret = sysdb_error_to_errno(lret);
     214           0 :             goto done;
     215             :         }
     216             :     } else {
     217           0 :         ret = EIO;
     218           0 :         goto done;
     219             :     }
     220             : 
     221           2 :     ret = sysdb_transaction_commit(domain->sysdb);
     222           2 :     if (ret != EOK) {
     223           0 :         DEBUG(SSSDBG_CRIT_FAILURE,
     224             :               "Could not commit transaction: [%s]\n", strerror(ret));
     225           0 :         goto done;
     226             :     }
     227           2 :     in_transaction = false;
     228             : 
     229             : done:
     230           2 :     if (in_transaction) {
     231           0 :         sret = sysdb_transaction_cancel(domain->sysdb);
     232           0 :         if (sret != EOK) {
     233           0 :             DEBUG(SSSDBG_CRIT_FAILURE, "Could not cancel transaction\n");
     234             :         }
     235             :     }
     236           2 :     talloc_free(tmp_ctx);
     237           2 :     return ret;
     238             : }
     239             : 
     240             : errno_t
     241           4 : sysdb_gpo_get_gpo_by_guid(TALLOC_CTX *mem_ctx,
     242             :                           struct sss_domain_info *domain,
     243             :                           const char *gpo_guid,
     244             :                           struct ldb_result **_result)
     245             : {
     246             :     errno_t ret;
     247             :     int lret;
     248             :     struct ldb_dn *base_dn;
     249             :     TALLOC_CTX *tmp_ctx;
     250             :     struct ldb_result *res;
     251             : 
     252           4 :     const char *attrs[] = SYSDB_GPO_ATTRS;
     253             : 
     254           4 :     tmp_ctx = talloc_new(NULL);
     255           4 :     if (!tmp_ctx) return ENOMEM;
     256             : 
     257           4 :     DEBUG(SSSDBG_TRACE_ALL, SYSDB_TMPL_GPO_BASE"\n", domain->name);
     258             : 
     259           4 :     base_dn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
     260             :                              SYSDB_TMPL_GPO_BASE,
     261             :                              domain->name);
     262           4 :     if (!base_dn) {
     263           0 :         ret = ENOMEM;
     264           0 :         goto done;
     265             :     }
     266             : 
     267           4 :     lret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res, base_dn,
     268             :                       LDB_SCOPE_SUBTREE, attrs, SYSDB_GPO_GUID_FILTER, gpo_guid);
     269           4 :     if (lret) {
     270           0 :         DEBUG(SSSDBG_MINOR_FAILURE,
     271             :               "Could not locate GPO: [%s]\n",
     272             :               ldb_strerror(lret));
     273           0 :         ret = sysdb_error_to_errno(lret);
     274           0 :         goto done;
     275             :     }
     276             : 
     277           4 :     if (res->count > 1) {
     278           0 :         DEBUG(SSSDBG_CRIT_FAILURE, "Search for GUID [%s] returned more than " \
     279             :               "one object.\n", gpo_guid);
     280           0 :         ret = EINVAL;
     281           0 :         goto done;
     282           4 :     } else if (res->count == 0) {
     283           1 :         ret = ENOENT;
     284           1 :         goto done;
     285             :     }
     286           3 :     *_result = talloc_steal(mem_ctx, res);
     287           3 :     ret = EOK;
     288             : done:
     289             : 
     290           4 :     if (ret == ENOENT) {
     291           1 :         DEBUG(SSSDBG_TRACE_ALL, "No such entry.\n");
     292           3 :     } else if (ret) {
     293           0 :         DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret));
     294             :     }
     295             : 
     296           4 :     talloc_free(tmp_ctx);
     297           4 :     return ret;
     298             : }
     299             : 
     300             : errno_t
     301           2 : sysdb_gpo_get_gpos(TALLOC_CTX *mem_ctx,
     302             :                    struct sss_domain_info *domain,
     303             :                    struct ldb_result **_result)
     304             : {
     305             :     errno_t ret;
     306             :     int lret;
     307             :     struct ldb_dn *base_dn;
     308             :     TALLOC_CTX *tmp_ctx;
     309             :     struct ldb_result *res;
     310             : 
     311           2 :     const char *attrs[] = SYSDB_GPO_ATTRS;
     312             : 
     313           2 :     tmp_ctx = talloc_new(NULL);
     314           2 :     if (!tmp_ctx) return ENOMEM;
     315             : 
     316           2 :     DEBUG(SSSDBG_TRACE_ALL, SYSDB_TMPL_GPO_BASE"\n", domain->name);
     317             : 
     318           2 :     base_dn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
     319             :                              SYSDB_TMPL_GPO_BASE,
     320             :                              domain->name);
     321           2 :     if (!base_dn) {
     322           0 :         ret = ENOMEM;
     323           0 :         goto done;
     324             :     }
     325             : 
     326           2 :     lret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res, base_dn,
     327             :                       LDB_SCOPE_SUBTREE, attrs, SYSDB_GPO_FILTER);
     328           2 :     if (lret) {
     329           0 :         DEBUG(SSSDBG_MINOR_FAILURE,
     330             :               "Could not locate GPOs: [%s]\n",
     331             :               ldb_strerror(lret));
     332           0 :         ret = sysdb_error_to_errno(lret);
     333           0 :         goto done;
     334             :     }
     335             : 
     336           2 :     if (res->count == 0) {
     337           1 :         ret = ENOENT;
     338           1 :         goto done;
     339             :     }
     340             : 
     341           1 :     *_result = talloc_steal(mem_ctx, res);
     342           1 :     ret = EOK;
     343             : 
     344             : done:
     345             : 
     346           2 :     if (ret == ENOENT) {
     347           1 :         DEBUG(SSSDBG_TRACE_ALL, "No GPO entries.\n");
     348           1 :     } else if (ret) {
     349           0 :         DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret));
     350             :     }
     351             : 
     352           2 :     talloc_free(tmp_ctx);
     353           2 :     return ret;
     354             : }
     355             : 
     356             : /* GPO Result */
     357             : 
     358             : static struct ldb_dn *
     359           3 : sysdb_gpo_result_dn(TALLOC_CTX *mem_ctx,
     360             :                     struct sss_domain_info *domain,
     361             :                     const char *result_name)
     362             : {
     363             :     errno_t ret;
     364             :     char *clean_result_name;
     365             :     struct ldb_dn *dn;
     366             : 
     367           3 :     ret = sysdb_dn_sanitize(NULL, result_name, &clean_result_name);
     368           3 :     if (ret != EOK) {
     369           0 :         return NULL;
     370             :     }
     371             : 
     372           3 :     DEBUG(SSSDBG_TRACE_ALL, SYSDB_TMPL_GPO_RESULT"\n",
     373             :           clean_result_name, domain->name);
     374             : 
     375           3 :     dn = ldb_dn_new_fmt(mem_ctx, domain->sysdb->ldb, SYSDB_TMPL_GPO_RESULT,
     376             :                         clean_result_name, domain->name);
     377           3 :     talloc_free(clean_result_name);
     378             : 
     379           3 :     return dn;
     380             : }
     381             : 
     382             : errno_t
     383           3 : sysdb_gpo_store_gpo_result_setting(struct sss_domain_info *domain,
     384             :                                    const char *ini_key,
     385             :                                    const char *ini_value)
     386             : {
     387             :     errno_t ret, sret;
     388             :     int lret;
     389             :     struct ldb_message *update_msg;
     390             :     struct ldb_message **msgs;
     391             :     size_t count;
     392           3 :     bool in_transaction = false;
     393             :     TALLOC_CTX *tmp_ctx;
     394             : 
     395           3 :     tmp_ctx = talloc_new(NULL);
     396           3 :     if (!tmp_ctx) return ENOMEM;
     397             : 
     398           3 :     update_msg = ldb_msg_new(tmp_ctx);
     399           3 :     if (!update_msg) {
     400           0 :         ret = ENOMEM;
     401           0 :         goto done;
     402             :     }
     403             : 
     404           3 :     update_msg->dn = sysdb_gpo_result_dn(update_msg, domain, "gpo_result");
     405           3 :     if (!update_msg->dn) {
     406           0 :         ret = ENOMEM;
     407           0 :         goto done;
     408             :     }
     409             : 
     410           3 :     ret = sysdb_transaction_start(domain->sysdb);
     411           3 :     if (ret != EOK) {
     412           0 :         DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n");
     413           0 :         goto done;
     414             :     }
     415             : 
     416           3 :     in_transaction = true;
     417             : 
     418             :     /* Check for an existing GPO Result object */
     419           3 :     ret = sysdb_search_entry(tmp_ctx, domain->sysdb, update_msg->dn,
     420             :                              LDB_SCOPE_BASE, NULL, NULL, &count, &msgs);
     421             : 
     422           3 :     if (ret == ENOENT) {
     423             :         /* Create new GPO Result object */
     424           1 :         DEBUG(SSSDBG_TRACE_FUNC, "Storing setting: key [%s] value [%s]\n",
     425             :               ini_key, ini_value);
     426             : 
     427             :         /* Add the objectClass */
     428           1 :         lret = ldb_msg_add_empty(update_msg, SYSDB_OBJECTCLASS,
     429             :                                  LDB_FLAG_MOD_ADD,
     430             :                                  NULL);
     431           1 :         if (lret != LDB_SUCCESS) {
     432           0 :             ret = sysdb_error_to_errno(lret);
     433           0 :             goto done;
     434             :         }
     435             : 
     436           1 :         lret = ldb_msg_add_string(update_msg, SYSDB_OBJECTCLASS,
     437             :                                   SYSDB_GPO_RESULT_OC);
     438           1 :         if (lret != LDB_SUCCESS) {
     439           0 :             ret = sysdb_error_to_errno(lret);
     440           0 :             goto done;
     441             :         }
     442             : 
     443             :         /* Store the policy_setting if it is non-NULL */
     444           1 :         if (ini_value) {
     445           1 :             lret = ldb_msg_add_empty(update_msg, ini_key,
     446             :                                      LDB_FLAG_MOD_ADD,
     447             :                                      NULL);
     448           1 :             if (lret != LDB_SUCCESS) {
     449           0 :                 ret = sysdb_error_to_errno(lret);
     450           0 :                 goto done;
     451             :             }
     452             : 
     453           1 :             lret = ldb_msg_add_string(update_msg, ini_key, ini_value);
     454           1 :             if (lret != LDB_SUCCESS) {
     455           0 :                 ret = sysdb_error_to_errno(lret);
     456           0 :                 goto done;
     457             :             }
     458             :         }
     459             : 
     460           1 :         lret = ldb_add(domain->sysdb->ldb, update_msg);
     461           1 :         if (lret != LDB_SUCCESS) {
     462           0 :             DEBUG(SSSDBG_MINOR_FAILURE,
     463             :                   "Failed to add GPO Result: [%s]\n",
     464             :                    ldb_strerror(lret));
     465           0 :             ret = sysdb_error_to_errno(lret);
     466           0 :             goto done;
     467             :         }
     468           2 :     } else if (ret == EOK && count == 1) {
     469             :         /* Update existing GPO Result object*/
     470           2 :         if (ini_value) {
     471           1 :             DEBUG(SSSDBG_TRACE_FUNC, "Updating setting: key [%s] value [%s]\n",
     472             :                   ini_key, ini_value);
     473             :             /* Update the policy setting */
     474           1 :             lret = ldb_msg_add_empty(update_msg, ini_key,
     475             :                                      LDB_FLAG_MOD_REPLACE,
     476             :                                      NULL);
     477           1 :             if (lret != LDB_SUCCESS) {
     478           0 :                 ret = sysdb_error_to_errno(lret);
     479           0 :                 goto done;
     480             :             }
     481             : 
     482           1 :             lret = ldb_msg_add_fmt(update_msg, ini_key, "%s", ini_value);
     483           1 :             if (lret != LDB_SUCCESS) {
     484           0 :                 ret = sysdb_error_to_errno(lret);
     485           0 :                 goto done;
     486             :             }
     487             :         } else {
     488             :             /* If the value is NULL, we need to remove it from the cache */
     489           1 :             DEBUG(SSSDBG_TRACE_FUNC, "Removing setting: key [%s]\n", ini_key);
     490             : 
     491             :             /* Update the policy setting */
     492           1 :             lret = ldb_msg_add_empty(update_msg, ini_key,
     493             :                                      LDB_FLAG_MOD_DELETE,
     494             :                                      NULL);
     495           1 :             if (lret != LDB_SUCCESS) {
     496           0 :                 ret = sysdb_error_to_errno(lret);
     497           0 :                 goto done;
     498             :             }
     499             :         }
     500             : 
     501           2 :         lret = ldb_modify(domain->sysdb->ldb, update_msg);
     502           4 :         if (lret != LDB_SUCCESS) {
     503           0 :             DEBUG(SSSDBG_MINOR_FAILURE,
     504             :                   "Failed to modify GPO Result: [%s](%d)[%s]\n",
     505             :                   ldb_strerror(lret), lret, ldb_errstring(domain->sysdb->ldb));
     506           0 :             ret = sysdb_error_to_errno(lret);
     507           0 :             goto done;
     508             :         }
     509             :     } else {
     510           0 :         ret = EIO;
     511           0 :         goto done;
     512             :     }
     513             : 
     514           3 :     ret = sysdb_transaction_commit(domain->sysdb);
     515           3 :     if (ret != EOK) {
     516           0 :         DEBUG(SSSDBG_CRIT_FAILURE,
     517             :               "Could not commit transaction: [%s]\n", strerror(ret));
     518           0 :         goto done;
     519             :     }
     520           3 :     in_transaction = false;
     521             : 
     522             : done:
     523           3 :     if (in_transaction) {
     524           0 :         sret = sysdb_transaction_cancel(domain->sysdb);
     525           0 :         if (sret != EOK) {
     526           0 :             DEBUG(SSSDBG_CRIT_FAILURE, "Could not cancel transaction\n");
     527             :         }
     528             :     }
     529           3 :     talloc_free(tmp_ctx);
     530           3 :     return ret;
     531             : }
     532             : 
     533             : static errno_t
     534          10 : sysdb_gpo_get_gpo_result_object(TALLOC_CTX *mem_ctx,
     535             :                                 struct sss_domain_info *domain,
     536             :                                 const char **attrs,
     537             :                                 struct ldb_result **_result)
     538             : {
     539             :     errno_t ret;
     540             :     int lret;
     541             :     struct ldb_dn *base_dn;
     542             :     TALLOC_CTX *tmp_ctx;
     543             :     struct ldb_result *res;
     544             : 
     545          10 :     tmp_ctx = talloc_new(NULL);
     546          10 :     if (!tmp_ctx) return ENOMEM;
     547             : 
     548          10 :     DEBUG(SSSDBG_TRACE_ALL, SYSDB_TMPL_GPO_RESULT_BASE"\n", domain->name);
     549             : 
     550          10 :     base_dn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
     551             :                              SYSDB_TMPL_GPO_RESULT_BASE,
     552             :                              domain->name);
     553          10 :     if (!base_dn) {
     554           0 :         ret = ENOMEM;
     555           0 :         goto done;
     556             :     }
     557             : 
     558          10 :     lret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res, base_dn,
     559             :                       LDB_SCOPE_SUBTREE, attrs, SYSDB_GPO_RESULT_FILTER);
     560          10 :     if (lret) {
     561           0 :         DEBUG(SSSDBG_MINOR_FAILURE,
     562             :               "Could not locate GPO Result object: [%s]\n",
     563             :               ldb_strerror(lret));
     564           0 :         ret = sysdb_error_to_errno(lret);
     565           0 :         goto done;
     566             :     }
     567             : 
     568          10 :     if (res->count == 0) {
     569           5 :         ret = ENOENT;
     570           5 :         goto done;
     571             :     }
     572             : 
     573           5 :     *_result = talloc_steal(mem_ctx, res);
     574           5 :     ret = EOK;
     575             : 
     576             : done:
     577             : 
     578          10 :     if (ret == ENOENT) {
     579           5 :         DEBUG(SSSDBG_TRACE_ALL, "No GPO Result object.\n");
     580           5 :     } else if (ret) {
     581           0 :         DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret));
     582             :     }
     583             : 
     584          10 :     talloc_free(tmp_ctx);
     585          10 :     return ret;
     586             : }
     587             : 
     588             : 
     589             : errno_t
     590           8 : sysdb_gpo_get_gpo_result_setting(TALLOC_CTX *mem_ctx,
     591             :                                  struct sss_domain_info *domain,
     592             :                                  const char *ini_key,
     593             :                                  const char **_ini_value)
     594             : {
     595             :     errno_t ret;
     596             :     TALLOC_CTX *tmp_ctx;
     597             :     struct ldb_result *res;
     598             :     const char *ini_value;
     599             : 
     600           8 :     const char *attrs[] = {ini_key, NULL};
     601             : 
     602           8 :     tmp_ctx = talloc_new(NULL);
     603           8 :     if (!tmp_ctx) return ENOMEM;
     604             : 
     605           8 :     ret = sysdb_gpo_get_gpo_result_object(tmp_ctx, domain, attrs, &res);
     606           8 :     if (ret != EOK) {
     607           4 :         goto done;
     608             :     }
     609             : 
     610           4 :     ini_value = ldb_msg_find_attr_as_string(res->msgs[0],
     611             :                                             ini_key,
     612             :                                             NULL);
     613           4 :     DEBUG(SSSDBG_TRACE_FUNC, "key [%s] value [%s]\n", ini_key, ini_value);
     614             : 
     615           4 :     *_ini_value = talloc_strdup(mem_ctx, ini_value);
     616           4 :     if (!*_ini_value && ini_value) {
     617             :         /* If ini_value was NULL, this is expected to also be NULL */
     618           0 :         ret = ENOMEM;
     619           0 :         goto done;
     620             :     }
     621             : 
     622           4 :     ret = EOK;
     623             : 
     624             : done:
     625             : 
     626           8 :     if (ret == ENOENT) {
     627           4 :         DEBUG(SSSDBG_TRACE_ALL, "No setting for key [%s].\n", ini_key);
     628           4 :     } else if (ret) {
     629           0 :         DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret));
     630             :     }
     631             : 
     632           8 :     talloc_free(tmp_ctx);
     633           8 :     return ret;
     634             : }
     635             : 
     636             : 
     637           2 : errno_t sysdb_gpo_delete_gpo_result_object(TALLOC_CTX *mem_ctx,
     638             :                                            struct sss_domain_info *domain)
     639             : {
     640             :     struct ldb_result *res;
     641             :     errno_t ret, sret;
     642           2 :     bool in_transaction = false;
     643             : 
     644           2 :     ret = sysdb_transaction_start(domain->sysdb);
     645           2 :     if (ret != EOK) {
     646           0 :         DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n");
     647           0 :         goto done;
     648             :     }
     649             : 
     650           2 :     in_transaction = true;
     651             : 
     652           2 :     ret = sysdb_gpo_get_gpo_result_object(mem_ctx, domain, NULL, &res);
     653           2 :     if (ret != EOK && ret != ENOENT) {
     654           0 :         DEBUG(SSSDBG_OP_FAILURE,
     655             :               "Could not delete GPO result object: %d\n", ret);
     656           0 :         goto done;
     657           2 :     } else if (ret != ENOENT) {
     658           1 :         DEBUG(SSSDBG_TRACE_FUNC, "Deleting GPO Result object\n");
     659             : 
     660           1 :         ret = sysdb_delete_entry(domain->sysdb, res->msgs[0]->dn, true);
     661           1 :         if (ret != EOK) {
     662           0 :             DEBUG(SSSDBG_MINOR_FAILURE,
     663             :                   "Could not delete GPO Result cache entry\n");
     664           0 :             goto done;
     665             :         }
     666             :     }
     667             : 
     668           2 :     ret = sysdb_transaction_commit(domain->sysdb);
     669           2 :     if (ret != EOK) {
     670           0 :         DEBUG(SSSDBG_CRIT_FAILURE,
     671             :               "Could not commit transaction: [%s]\n", strerror(ret));
     672           0 :         goto done;
     673             :     }
     674           2 :     in_transaction = false;
     675             : 
     676             : done:
     677           2 :     if (in_transaction) {
     678           0 :         sret = sysdb_transaction_cancel(domain->sysdb);
     679           0 :         if (sret != EOK) {
     680           0 :             DEBUG(SSSDBG_CRIT_FAILURE, "Could not cancel transaction\n");
     681             :         }
     682             :     }
     683           2 :     return ret;
     684             : 
     685             : }

Generated by: LCOV version 1.10