LCOV - code coverage report
Current view: top level - db - sysdb_autofs.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 103 136 75.7 %
Date: 2012-11-29 Functions: 7 9 77.8 %
Branches: 54 286 18.9 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :     Authors:
       3                 :            :         Jakub Hrozek <jhrozek@redhat.com>
       4                 :            : 
       5                 :            :     Copyright (C) 2012 Red Hat
       6                 :            : 
       7                 :            :     This program is free software; you can redistribute it and/or modify
       8                 :            :     it under the terms of the GNU General Public License as published by
       9                 :            :     the Free Software Foundation; either version 3 of the License, or
      10                 :            :     (at your option) any later version.
      11                 :            : 
      12                 :            :     This program is distributed in the hope that it will be useful,
      13                 :            :     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14                 :            :     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15                 :            :     GNU General Public License for more details.
      16                 :            : 
      17                 :            :     You should have received a copy of the GNU General Public License
      18                 :            :     along with this program.  If not, see <http://www.gnu.org/licenses/>.
      19                 :            : */
      20                 :            : 
      21                 :            : #include <talloc.h>
      22                 :            : 
      23                 :            : #include "db/sysdb.h"
      24                 :            : #include "db/sysdb_private.h"
      25                 :            : #include "db/sysdb_autofs.h"
      26                 :            : 
      27                 :            : #define SYSDB_TMPL_AUTOFS_ENTRY SYSDB_NAME"=%s,"SYSDB_TMPL_CUSTOM
      28                 :            : 
      29                 :            : static struct ldb_dn *
      30                 :         10 : sysdb_autofsmap_dn(TALLOC_CTX *mem_ctx,
      31                 :            :                    struct sysdb_ctx *sysdb,
      32                 :            :                    const char *map_name)
      33                 :            : {
      34                 :         10 :     return sysdb_custom_dn(sysdb, mem_ctx, map_name, AUTOFS_MAP_SUBDIR);
      35                 :            : }
      36                 :            : 
      37                 :            : static struct ldb_dn *
      38                 :        110 : sysdb_autofsentry_dn(TALLOC_CTX *mem_ctx,
      39                 :            :                      struct sysdb_ctx *sysdb,
      40                 :            :                      const char *map_name,
      41                 :            :                      const char *entry_name,
      42                 :            :                      const char *entry_value)
      43                 :            : {
      44                 :            :     errno_t ret;
      45                 :            :     TALLOC_CTX *tmp_ctx;
      46                 :            :     char *clean_name;
      47                 :            :     char *clean_value;
      48                 :            :     const char *rdn;
      49                 :        110 :     struct ldb_dn *dn = NULL;
      50                 :            : 
      51                 :        110 :     tmp_ctx = talloc_new(NULL);
      52         [ +  - ]:        110 :     if (!tmp_ctx) {
      53                 :            :         return NULL;
      54                 :            :     }
      55                 :            : 
      56                 :        110 :     ret = sysdb_dn_sanitize(tmp_ctx, entry_name, &clean_name);
      57         [ +  - ]:        110 :     if (ret != EOK) {
      58                 :            :         goto done;
      59                 :            :     }
      60                 :            : 
      61                 :        110 :     ret = sysdb_dn_sanitize(tmp_ctx, entry_value, &clean_value);
      62         [ +  - ]:        110 :     if (ret != EOK) {
      63                 :            :         goto done;
      64                 :            :     }
      65                 :            : 
      66                 :        110 :     rdn = talloc_asprintf(tmp_ctx, "%s%s", clean_name, clean_value);
      67         [ +  - ]:        110 :     if (!rdn) {
      68                 :            :         goto done;
      69                 :            :     }
      70                 :            : 
      71                 :        110 :     dn = ldb_dn_new_fmt(mem_ctx, sysdb->ldb, SYSDB_TMPL_AUTOFS_ENTRY,
      72                 :            :                         rdn, map_name, AUTOFS_MAP_SUBDIR,
      73                 :        110 :                         sysdb->domain->name);
      74                 :            : 
      75                 :            : done:
      76                 :        110 :     talloc_free(tmp_ctx);
      77                 :            :     return dn;
      78                 :            : }
      79                 :            : 
      80                 :            : errno_t
      81                 :         10 : sysdb_save_autofsmap(struct sysdb_ctx *sysdb_ctx,
      82                 :            :                      const char *name,
      83                 :            :                      const char *autofsmapname,
      84                 :            :                      struct sysdb_attrs *attrs,
      85                 :            :                      int cache_timeout,
      86                 :            :                      time_t now)
      87                 :            : {
      88                 :            :     errno_t ret;
      89                 :            :     TALLOC_CTX *tmp_ctx;
      90                 :            : 
      91 [ +  - ][ +  - ]:         10 :     DEBUG(SSSDBG_TRACE_FUNC, ("Adding autofs map %s\n", autofsmapname));
         [ -  + ][ #  # ]
                 [ #  # ]
      92                 :            : 
      93                 :         10 :     tmp_ctx = talloc_new(NULL);
      94         [ +  - ]:         10 :     if (!tmp_ctx) {
      95                 :            :         return ENOMEM;
      96                 :            :     }
      97                 :            : 
      98         [ +  - ]:         10 :     if (!attrs) {
      99                 :         10 :         attrs = sysdb_new_attrs(tmp_ctx);
     100         [ +  - ]:         10 :         if (!attrs) {
     101                 :            :             ret = ENOMEM;
     102                 :            :             goto done;
     103                 :            :         }
     104                 :            :     }
     105                 :            : 
     106                 :         10 :     ret = sysdb_attrs_add_string(attrs, SYSDB_OBJECTCLASS,
     107                 :            :                                  SYSDB_AUTOFS_MAP_OC);
     108         [ -  + ]:         10 :     if (ret != EOK) {
     109 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Could not set map object class [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     110                 :            :               ret, strerror(ret)));
     111                 :            :         goto done;
     112                 :            :     }
     113                 :            : 
     114                 :         10 :     ret = sysdb_attrs_add_string(attrs, SYSDB_AUTOFS_MAP_NAME, autofsmapname);
     115         [ -  + ]:         10 :     if (ret != EOK) {
     116 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Could not set map name [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     117                 :            :               ret, strerror(ret)));
     118                 :            :         goto done;
     119                 :            :     }
     120                 :            : 
     121                 :         10 :     ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, name);
     122         [ -  + ]:         10 :     if (ret != EOK) {
     123 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Could not set name attribute [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     124                 :            :               ret, strerror(ret)));
     125                 :            :         goto done;
     126                 :            :     }
     127                 :            : 
     128                 :         10 :     ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
     129         [ -  + ]:         10 :     if (ret) {
     130 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Could not set sysdb lastUpdate [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     131                 :            :               ret, strerror(ret)));
     132                 :            :         goto done;
     133                 :            :     }
     134                 :            : 
     135         [ -  + ]:         10 :     ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
     136                 :            :                                  ((cache_timeout) ?
     137                 :          0 :                                   (now + cache_timeout) : 0));
     138         [ -  + ]:         10 :     if (ret) {
     139 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Could not set sysdb cache expire [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     140                 :            :               ret, strerror(ret)));
     141                 :            :         goto done;
     142                 :            :     }
     143                 :            : 
     144                 :         10 :     ret = sysdb_store_custom(sysdb_ctx, name, AUTOFS_MAP_SUBDIR, attrs);
     145         [ -  + ]:         10 :     if (ret != EOK) {
     146 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("sysdb_store_custom failed [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     147                 :            :               ret, strerror(ret)));
     148                 :            :         goto done;
     149                 :            :     }
     150                 :            : 
     151                 :            :     ret = EOK;
     152                 :            : done:
     153                 :         10 :     talloc_free(tmp_ctx);
     154                 :         10 :     return ret;
     155                 :            : }
     156                 :            : 
     157                 :            : errno_t
     158                 :         10 : sysdb_delete_autofsmap(struct sysdb_ctx *sysdb_ctx,
     159                 :            :                        const char *name)
     160                 :            : {
     161 [ +  - ][ +  - ]:         10 :     DEBUG(SSSDBG_TRACE_FUNC, ("Deleting autofs map %s\n", name));
         [ -  + ][ #  # ]
                 [ #  # ]
     162                 :         10 :     return sysdb_delete_custom(sysdb_ctx, name, AUTOFS_MAP_SUBDIR);
     163                 :            : }
     164                 :            : 
     165                 :            : errno_t
     166                 :         20 : sysdb_get_map_byname(TALLOC_CTX *mem_ctx,
     167                 :            :                      struct sysdb_ctx *sysdb,
     168                 :            :                      const char *map_name,
     169                 :            :                      struct ldb_message **_map)
     170                 :            : {
     171                 :            :     errno_t ret;
     172                 :            :     TALLOC_CTX *tmp_ctx;
     173                 :            :     const char *filter;
     174                 :            :     char *safe_map_name;
     175                 :            :     size_t count;
     176                 :            :     struct ldb_message **msgs;
     177                 :         20 :     const char *attrs[] = { SYSDB_OBJECTCLASS,
     178                 :            :                             SYSDB_CACHE_EXPIRE,
     179                 :            :                             SYSDB_LAST_UPDATE,
     180                 :            :                             SYSDB_AUTOFS_MAP_NAME,
     181                 :            :                             SYSDB_MEMBER,
     182                 :            :                             NULL };
     183                 :            : 
     184                 :         20 :     tmp_ctx = talloc_new(NULL);
     185         [ +  - ]:         20 :     if (!tmp_ctx) return ENOMEM;
     186                 :            : 
     187                 :         20 :     ret = sss_filter_sanitize(tmp_ctx, map_name, &safe_map_name);
     188         [ -  + ]:         20 :     if (ret != EOK) {
     189 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_CRIT_FAILURE,
         [ #  # ][ #  # ]
                 [ #  # ]
     190                 :            :               ("Cannot sanitize map [%s] error [%d]: %s\n",
     191                 :            :                map_name, ret, strerror(ret)));
     192                 :            :         goto done;
     193                 :            :     }
     194                 :            : 
     195                 :         20 :     filter = talloc_asprintf(tmp_ctx, "(&(objectclass=%s)(%s=%s))",
     196                 :            :                              SYSDB_AUTOFS_MAP_OC, SYSDB_NAME, safe_map_name);
     197         [ +  - ]:         20 :     if (!filter) {
     198                 :            :         ret = EOK;
     199                 :            :         goto done;
     200                 :            :     }
     201                 :            : 
     202                 :         20 :     ret = sysdb_search_custom(tmp_ctx, sysdb, filter,
     203                 :            :                               AUTOFS_MAP_SUBDIR, attrs,
     204                 :            :                               &count, &msgs);
     205         [ -  + ]:         20 :     if (ret != EOK && ret != ENOENT) {
     206 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_CRIT_FAILURE,
         [ #  # ][ #  # ]
                 [ #  # ]
     207                 :            :               ("Error looking up autofs map [%s]", safe_map_name));
     208                 :            :         goto done;
     209         [ +  + ]:         20 :     } else if (ret == ENOENT) {
     210 [ +  - ][ +  - ]:         10 :         DEBUG(SSSDBG_TRACE_FUNC, ("No such map\n"));
         [ -  + ][ #  # ]
                 [ #  # ]
     211                 :         10 :         *_map = NULL;
     212                 :         10 :         goto done;
     213                 :            :     }
     214                 :            : 
     215         [ -  + ]:         10 :     if (count != 1) {
     216 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_CRIT_FAILURE,
         [ #  # ][ #  # ]
                 [ #  # ]
     217                 :            :               ("More than one map named %s\n", safe_map_name));
     218                 :            :         goto done;
     219                 :            :     }
     220                 :            : 
     221                 :         10 :     *_map = talloc_steal(mem_ctx, msgs[0]);
     222                 :         10 :     ret = EOK;
     223                 :            : done:
     224                 :         20 :     talloc_free(tmp_ctx);
     225                 :            :     return ret;
     226                 :            : }
     227                 :            : 
     228                 :            : errno_t
     229                 :        110 : sysdb_save_autofsentry(struct sysdb_ctx *sysdb_ctx,
     230                 :            :                        const char *map,
     231                 :            :                        const char *key,
     232                 :            :                        const char *value,
     233                 :            :                        struct sysdb_attrs *attrs)
     234                 :            : {
     235                 :            :     errno_t ret;
     236                 :            :     TALLOC_CTX *tmp_ctx;
     237                 :            :     struct ldb_message *msg;
     238                 :            :     struct ldb_dn *dn;
     239                 :            :     const char *name;
     240                 :            : 
     241 [ +  - ][ +  - ]:        110 :     DEBUG(SSSDBG_TRACE_FUNC,
         [ -  + ][ #  # ]
                 [ #  # ]
     242                 :            :           ("Adding autofs entry [%s] - [%s]\n", key, value));
     243                 :            : 
     244                 :        110 :     tmp_ctx = talloc_new(NULL);
     245         [ +  - ]:        110 :     if (!tmp_ctx) {
     246                 :            :         return ENOMEM;
     247                 :            :     }
     248                 :            : 
     249         [ +  - ]:        110 :     if (!attrs) {
     250                 :        110 :         attrs = sysdb_new_attrs(tmp_ctx);
     251         [ +  - ]:        110 :         if (!attrs) {
     252                 :            :             ret = ENOMEM;
     253                 :            :             goto done;
     254                 :            :         }
     255                 :            :     }
     256                 :            : 
     257                 :        110 :     ret = sysdb_attrs_add_string(attrs, SYSDB_OBJECTCLASS,
     258                 :            :                                  SYSDB_AUTOFS_ENTRY_OC);
     259         [ -  + ]:        110 :     if (ret != EOK) {
     260 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Could not set entry object class [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     261                 :            :               ret, strerror(ret)));
     262                 :            :         goto done;
     263                 :            :     }
     264                 :            : 
     265                 :        110 :     ret = sysdb_attrs_add_string(attrs, SYSDB_AUTOFS_ENTRY_KEY, key);
     266         [ -  + ]:        110 :     if (ret != EOK) {
     267 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Could not set entry key [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     268                 :            :               ret, strerror(ret)));
     269                 :            :         goto done;
     270                 :            :     }
     271                 :            : 
     272                 :        110 :     ret = sysdb_attrs_add_string(attrs, SYSDB_AUTOFS_ENTRY_VALUE, value);
     273         [ -  + ]:        110 :     if (ret != EOK) {
     274 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Could not set entry key [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     275                 :            :               ret, strerror(ret)));
     276                 :            :         goto done;
     277                 :            :     }
     278                 :            : 
     279                 :        110 :     name = talloc_asprintf(tmp_ctx, "%s%s", key, value);
     280         [ +  - ]:        110 :     if (!name) {
     281                 :            :         ret = ENOMEM;
     282                 :            :         goto done;
     283                 :            :     }
     284                 :            : 
     285                 :        110 :     ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, name);
     286         [ -  + ]:        110 :     if (ret != EOK) {
     287 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("Could not set name attribute [%d]: %s\n",
         [ #  # ][ #  # ]
                 [ #  # ]
     288                 :            :               ret, strerror(ret)));
     289                 :            :         goto done;
     290                 :            :     }
     291                 :            : 
     292                 :        110 :     dn = sysdb_autofsentry_dn(tmp_ctx, sysdb_ctx, map, key, value);
     293         [ +  - ]:        110 :     if (!dn) {
     294                 :            :         ret = ENOMEM;
     295                 :            :         goto done;
     296                 :            :     }
     297                 :            : 
     298                 :        110 :     msg = ldb_msg_new(tmp_ctx);
     299         [ +  - ]:        110 :     if (!msg) {
     300                 :            :         ret = ENOMEM;
     301                 :            :         goto done;
     302                 :            :     }
     303                 :            : 
     304                 :        110 :     msg->dn = dn;
     305                 :        110 :     msg->elements = attrs->a;
     306                 :        110 :     msg->num_elements = attrs->num;
     307                 :            : 
     308                 :        110 :     ret = ldb_add(sysdb_ctx->ldb, msg);
     309                 :        110 :     ret = sysdb_error_to_errno(ret);
     310                 :            : done:
     311                 :        110 :     talloc_free(tmp_ctx);
     312                 :        110 :     return ret;
     313                 :            : }
     314                 :            : 
     315                 :            : errno_t
     316                 :          0 : sysdb_del_autofsentry(struct sysdb_ctx *sysdb_ctx,
     317                 :            :                       const char *map,
     318                 :            :                       const char *key,
     319                 :            :                       const char *value)
     320                 :            : {
     321                 :            :     struct ldb_dn *dn;
     322                 :            :     errno_t ret;
     323                 :            : 
     324                 :          0 :     dn = sysdb_autofsentry_dn(sysdb_ctx, sysdb_ctx, map, key, value);
     325         [ #  # ]:          0 :     if (!dn) {
     326                 :            :         return ENOMEM;
     327                 :            :     }
     328                 :            : 
     329                 :          0 :     ret = sysdb_delete_entry(sysdb_ctx, dn, true);
     330                 :          0 :     talloc_free(dn);
     331                 :          0 :     return ret;
     332                 :            : }
     333                 :            : 
     334                 :            : errno_t
     335                 :         10 : sysdb_autofs_entries_by_map(TALLOC_CTX *mem_ctx,
     336                 :            :                             struct sysdb_ctx *sysdb,
     337                 :            :                             const char *mapname,
     338                 :            :                             size_t *_count,
     339                 :            :                             struct ldb_message ***_entries)
     340                 :            : {
     341                 :            :     errno_t ret;
     342                 :            :     TALLOC_CTX *tmp_ctx;
     343                 :            :     char *filter;
     344                 :         10 :     const char *attrs[] = { SYSDB_AUTOFS_ENTRY_KEY,
     345                 :            :                             SYSDB_AUTOFS_ENTRY_VALUE,
     346                 :            :                             NULL };
     347                 :            :     size_t count;
     348                 :            :     struct ldb_message **msgs;
     349                 :            :     struct ldb_dn *mapdn;
     350                 :            : 
     351 [ +  - ][ +  - ]:         10 :     DEBUG(SSSDBG_TRACE_FUNC, ("Getting entries for map %s\n", mapname));
         [ -  + ][ #  # ]
                 [ #  # ]
     352                 :            : 
     353                 :         10 :     tmp_ctx = talloc_new(NULL);
     354         [ +  - ]:         10 :     if (!tmp_ctx) {
     355                 :            :         return ENOMEM;
     356                 :            :     }
     357                 :            : 
     358                 :         10 :     mapdn = sysdb_autofsmap_dn(tmp_ctx, sysdb, mapname);
     359         [ +  - ]:         10 :     if (!mapdn) {
     360                 :            :         ret = ENOMEM;
     361                 :            :         goto done;
     362                 :            :     }
     363                 :            : 
     364                 :         10 :     filter = talloc_asprintf(tmp_ctx, "(objectclass=%s)",
     365                 :            :                              SYSDB_AUTOFS_ENTRY_OC);
     366         [ +  - ]:         10 :     if (!filter) {
     367                 :            :         ret = ENOMEM;
     368                 :            :         goto done;
     369                 :            :     }
     370                 :            : 
     371                 :         10 :     ret = sysdb_search_entry(tmp_ctx, sysdb, mapdn, LDB_SCOPE_ONELEVEL,
     372                 :            :                              filter, attrs, &count, &msgs);
     373         [ -  + ]:         10 :     if (ret != EOK && ret != ENOENT) {
     374 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_OP_FAILURE, ("sysdb search failed: %d\n", ret));
         [ #  # ][ #  # ]
                 [ #  # ]
     375                 :            :         goto done;
     376         [ -  + ]:         10 :     } else if (ret == ENOENT) {
     377 [ #  # ][ #  # ]:          0 :         DEBUG(SSSDBG_TRACE_FUNC, ("No entries for the map\n"));
         [ #  # ][ #  # ]
                 [ #  # ]
     378                 :          0 :         *_count = 0;
     379                 :          0 :         *_entries = NULL;
     380                 :          0 :         goto done;
     381                 :            :     }
     382                 :            : 
     383                 :         10 :     *_count = count;
     384                 :         10 :     *_entries = talloc_steal(mem_ctx, msgs);
     385                 :         10 :     ret = EOK;
     386 [ +  - ][ +  - ]:         10 :     DEBUG(SSSDBG_TRACE_INTERNAL, ("found %d entries for map %s\n",
         [ -  + ][ #  # ]
                 [ #  # ]
     387                 :            :                                    count, mapname));
     388                 :            : done:
     389                 :         10 :     talloc_free(tmp_ctx);
     390                 :            :     return ret;
     391                 :            : }
     392                 :            : 
     393                 :            : errno_t
     394                 :          0 : sysdb_set_autofsmap_attr(struct sysdb_ctx *sysdb,
     395                 :            :                          const char *name,
     396                 :            :                          struct sysdb_attrs *attrs,
     397                 :            :                          int mod_op)
     398                 :            : {
     399                 :            :     errno_t ret;
     400                 :            :     struct ldb_dn *dn;
     401                 :            :     TALLOC_CTX *tmp_ctx;
     402                 :            : 
     403                 :          0 :     tmp_ctx = talloc_new(NULL);
     404         [ #  # ]:          0 :     if (!tmp_ctx) {
     405                 :            :         return ENOMEM;
     406                 :            :     }
     407                 :            : 
     408                 :          0 :     dn = sysdb_autofsmap_dn(tmp_ctx, sysdb, name);
     409         [ #  # ]:          0 :     if (!dn) {
     410                 :            :         ret = ENOMEM;
     411                 :            :         goto done;
     412                 :            :     }
     413                 :            : 
     414                 :          0 :     ret = sysdb_set_entry_attr(sysdb, dn, attrs, mod_op);
     415                 :            : 
     416                 :            : done:
     417                 :          0 :     talloc_free(tmp_ctx);
     418                 :          0 :     return ret;
     419                 :        110 : }

Generated by: LCOV version 1.9