LCOV - code coverage report
Current view: top level - source3/libads - ads_struct.c (source / functions) Hit Total Coverage
Test: coverage report for abartlet/fix-coverage dd10fb34 Lines: 81 102 79.4 %
Date: 2021-09-23 10:06:22 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /* 
       2             :    Unix SMB/CIFS implementation.
       3             :    ads (active directory) utility library
       4             :    Copyright (C) Andrew Tridgell 2001
       5             :    Copyright (C) Andrew Bartlett 2001
       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 "includes.h"
      22             : #include "ads.h"
      23             : 
      24             : /* return a ldap dn path from a string, given separators and field name
      25             :    caller must free
      26             : */
      27         578 : char *ads_build_path(const char *realm, const char *sep, const char *field, int reverse)
      28             : {
      29             :         char *p, *r;
      30         578 :         int numbits = 0;
      31             :         char *ret;
      32             :         int len;
      33             :         char *saveptr;
      34             : 
      35         578 :         r = SMB_STRDUP(realm);
      36             : 
      37         578 :         if (!r || !*r) {
      38           0 :                 return r;
      39             :         }
      40             : 
      41       13870 :         for (p=r; *p; p++) {
      42       13292 :                 if (strchr(sep, *p)) {
      43        1699 :                         numbits++;
      44             :                 }
      45             :         }
      46             : 
      47         578 :         len = (numbits+1)*(strlen(field)+1) + strlen(r) + 1;
      48             : 
      49         578 :         ret = (char *)SMB_MALLOC(len);
      50         578 :         if (!ret) {
      51           0 :                 free(r);
      52           0 :                 return NULL;
      53             :         }
      54             : 
      55         578 :         if (strlcpy(ret,field, len) >= len) {
      56             :                 /* Truncate ! */
      57           0 :                 free(r);
      58           0 :                 free(ret);
      59           0 :                 return NULL;
      60             :         }
      61         578 :         p=strtok_r(r, sep, &saveptr);
      62         578 :         if (p) {
      63         578 :                 if (strlcat(ret, p, len) >= len) {
      64           0 :                         free(r);
      65           0 :                         free(ret);
      66           0 :                         return NULL;
      67             :                 }
      68             : 
      69        2584 :                 while ((p=strtok_r(NULL, sep, &saveptr)) != NULL) {
      70             :                         int retval;
      71        1699 :                         char *s = NULL;
      72        1699 :                         if (reverse)
      73           0 :                                 retval = asprintf(&s, "%s%s,%s", field, p, ret);
      74             :                         else
      75        1699 :                                 retval = asprintf(&s, "%s,%s%s", ret, field, p);
      76        1699 :                         free(ret);
      77        1699 :                         if (retval == -1) {
      78           0 :                                 free(r);
      79           0 :                                 return NULL;
      80             :                         }
      81        1699 :                         ret = SMB_STRDUP(s);
      82        1699 :                         free(s);
      83             :                 }
      84             :         }
      85             : 
      86         578 :         free(r);
      87         578 :         return ret;
      88             : }
      89             : 
      90             : /* return a dn of the form "dc=AA,dc=BB,dc=CC" from a 
      91             :    realm of the form AA.BB.CC 
      92             :    caller must free
      93             : */
      94         576 : char *ads_build_dn(const char *realm)
      95             : {
      96         576 :         return ads_build_path(realm, ".", "dc=", 0);
      97             : }
      98             : 
      99             : /* return a DNS name in the for aa.bb.cc from the DN  
     100             :    "dc=AA,dc=BB,dc=CC".  caller must free
     101             : */
     102           2 : char *ads_build_domain(const char *dn)
     103             : {
     104           2 :         char *dnsdomain = NULL;
     105             : 
     106             :         /* result should always be shorter than the DN */
     107             : 
     108           2 :         if ( (dnsdomain = SMB_STRDUP( dn )) == NULL ) {
     109           0 :                 DEBUG(0,("ads_build_domain: malloc() failed!\n"));            
     110           0 :                 return NULL;            
     111             :         }       
     112             : 
     113           2 :         if (!strlower_m( dnsdomain )) {
     114           0 :                 SAFE_FREE(dnsdomain);
     115           0 :                 return NULL;
     116             :         }
     117             : 
     118           2 :         all_string_sub( dnsdomain, "dc=", "", 0);
     119           2 :         all_string_sub( dnsdomain, ",", ".", 0 );
     120             : 
     121           2 :         return dnsdomain;       
     122             : }
     123             : 
     124             : 
     125             : 
     126             : #ifndef LDAP_PORT
     127             : #define LDAP_PORT 389
     128             : #endif
     129             : 
     130             : /*
     131             :   initialise a ADS_STRUCT, ready for some ads_ ops
     132             : */
     133         613 : ADS_STRUCT *ads_init(const char *realm, 
     134             :                      const char *workgroup,
     135             :                      const char *ldap_server,
     136             :                      enum ads_sasl_state_e sasl_state)
     137             : {
     138             :         ADS_STRUCT *ads;
     139             :         int wrap_flags;
     140             : 
     141         613 :         ads = SMB_XMALLOC_P(ADS_STRUCT);
     142         613 :         ZERO_STRUCTP(ads);
     143             : #ifdef HAVE_LDAP
     144         613 :         ads_zero_ldap(ads);
     145             : #endif
     146             : 
     147         613 :         ads->server.realm = realm? SMB_STRDUP(realm) : NULL;
     148         613 :         ads->server.workgroup = workgroup ? SMB_STRDUP(workgroup) : NULL;
     149         613 :         ads->server.ldap_server = ldap_server? SMB_STRDUP(ldap_server) : NULL;
     150             : 
     151             :         /* the caller will own the memory by default */
     152         613 :         ads->is_mine = 1;
     153             : 
     154         613 :         wrap_flags = lp_client_ldap_sasl_wrapping();
     155         613 :         if (wrap_flags == -1) {
     156           0 :                 wrap_flags = 0;
     157             :         }
     158             : 
     159         613 :         switch (sasl_state) {
     160         507 :         case ADS_SASL_PLAIN:
     161         507 :                 break;
     162           0 :         case ADS_SASL_SIGN:
     163           0 :                 wrap_flags |= ADS_AUTH_SASL_SIGN;
     164           0 :                 break;
     165         106 :         case ADS_SASL_SEAL:
     166         106 :                 wrap_flags |= ADS_AUTH_SASL_SEAL;
     167         106 :                 break;
     168             :         }
     169             : 
     170         613 :         ads->auth.flags = wrap_flags;
     171             : 
     172             :         /* Start with the configured page size when the connection is new,
     173             :          * we will drop it by half we get a timeout.   */
     174         613 :         ads->config.ldap_page_size     = lp_ldap_page_size();
     175             : 
     176         613 :         return ads;
     177             : }
     178             : 
     179             : /****************************************************************
     180             : ****************************************************************/
     181             : 
     182          60 : bool ads_set_sasl_wrap_flags(ADS_STRUCT *ads, unsigned flags)
     183             : {
     184             :         unsigned other_flags;
     185             : 
     186          60 :         if (!ads) {
     187           0 :                 return false;
     188             :         }
     189             : 
     190          60 :         other_flags = ads->auth.flags & ~(ADS_AUTH_SASL_SIGN|ADS_AUTH_SASL_SEAL);
     191             : 
     192          60 :         ads->auth.flags = flags | other_flags;
     193             : 
     194          60 :         return true;
     195             : }
     196             : 
     197             : /*
     198             :   free the memory used by the ADS structure initialized with 'ads_init(...)'
     199             : */
     200         539 : void ads_destroy(ADS_STRUCT **ads)
     201             : {
     202         539 :         if (ads && *ads) {
     203             :                 bool is_mine;
     204             : 
     205         537 :                 is_mine = (*ads)->is_mine;
     206             : #ifdef HAVE_LDAP
     207         537 :                 ads_disconnect(*ads);
     208             : #endif
     209         537 :                 SAFE_FREE((*ads)->server.realm);
     210         537 :                 SAFE_FREE((*ads)->server.workgroup);
     211         537 :                 SAFE_FREE((*ads)->server.ldap_server);
     212             : 
     213         537 :                 SAFE_FREE((*ads)->auth.realm);
     214         537 :                 SAFE_FREE((*ads)->auth.password);
     215         537 :                 SAFE_FREE((*ads)->auth.user_name);
     216         537 :                 SAFE_FREE((*ads)->auth.kdc_server);
     217         537 :                 SAFE_FREE((*ads)->auth.ccache_name);
     218             : 
     219         537 :                 SAFE_FREE((*ads)->config.realm);
     220         537 :                 SAFE_FREE((*ads)->config.bind_path);
     221         537 :                 SAFE_FREE((*ads)->config.ldap_server_name);
     222         537 :                 SAFE_FREE((*ads)->config.server_site_name);
     223         537 :                 SAFE_FREE((*ads)->config.client_site_name);
     224         537 :                 SAFE_FREE((*ads)->config.schema_path);
     225         537 :                 SAFE_FREE((*ads)->config.config_path);
     226             : 
     227         537 :                 ZERO_STRUCTP(*ads);
     228             : #ifdef HAVE_LDAP
     229         537 :                 ads_zero_ldap(*ads);
     230             : #endif
     231             : 
     232         537 :                 if ( is_mine )
     233         537 :                         SAFE_FREE(*ads);
     234             :         }
     235         539 : }

Generated by: LCOV version 1.13