Ignore:
Timestamp:
Apr 25, 2007, 9:44:55 AM (14 years ago)
Author:
Paul Smedley
Message:

Code updated to Samba 3.0.25rc2 level

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/samba/source/nsswitch/idmap_ad.c

    r26 r30  
    161161 ***********************************************************************/
    162162
    163 static NTSTATUS idmap_ad_initialize(struct idmap_domain *dom, const char *params)
     163static NTSTATUS idmap_ad_initialize(struct idmap_domain *dom)
    164164{
    165165        struct idmap_ad_context *ctx;
    166166        char *config_option;
    167         const char *range;
    168         ADS_STRUCT *ads;
    169 
    170         /* verify AD is reachable (not critical, we may just be offline at start) */
    171         if ( (ads = ad_idmap_cached_connection()) == NULL ) {
    172                 DEBUG(1, ("WARNING: Could not init an AD connection! Mapping might not work.\n"));
    173         }
     167        const char *range = NULL;
     168        const char *schema_mode = NULL;
    174169
    175170        if ( (ctx = talloc_zero(dom, struct idmap_ad_context)) == NULL ) {
     
    195190        }
    196191
     192        /* schema mode */
     193        if ( ad_map_type == WB_POSIX_MAP_UNKNOWN )
     194                ad_map_type = WB_POSIX_MAP_RFC2307;
     195        schema_mode = lp_parm_const_string(-1, config_option, "schema_mode", NULL);
     196        if ( schema_mode && schema_mode[0] ) {
     197                if ( strequal(schema_mode, "sfu") )
     198                        ad_map_type = WB_POSIX_MAP_SFU;
     199                else if ( strequal(schema_mode, "rfc2307" ) )
     200                        ad_map_type = WB_POSIX_MAP_RFC2307;
     201                else
     202                        DEBUG(0,("idmap_ad_initialize: Unknown schema_mode (%s)\n",
     203                                 schema_mode));
     204        }
     205
    197206        dom->private_data = ctx;
     207        dom->initialized = True;
    198208
    199209        talloc_free(config_option);
     
    252262                                NULL };
    253263        LDAPMessage *res = NULL;
     264        LDAPMessage *entry = NULL;
    254265        char *filter = NULL;
    255266        int idx = 0;
     
    259270        char *u_filter = NULL;
    260271        char *g_filter = NULL;
     272
     273        /* Only do query if we are online */
     274        if (idmap_is_offline()) {
     275                return NT_STATUS_FILE_IS_OFFLINE;
     276        }
     277
     278        /* Initilization my have been deferred because we were offline */
     279        if ( ! dom->initialized) {
     280                ret = idmap_ad_initialize(dom);
     281                if ( ! NT_STATUS_IS_OK(ret)) {
     282                        return ret;
     283                }
     284        }
    261285
    262286        ctx = talloc_get_type(dom->private_data, struct idmap_ad_context);
     
    311335
    312336                default:
    313                         DEBUG(3, ("Unknown ID type\n"));
     337                        DEBUG(3, ("Error: mapping requested but Unknown ID type\n"));
    314338                        ids[idx]->status = ID_UNKNOWN;
    315339                        continue;
     
    330354        filter = talloc_asprintf_append(filter, ")");
    331355        CHECK_ALLOC_DONE(filter);
    332         DEBUG(10, ("Filter: [%s]\n", filter));
     356
    333357        rc = ads_search_retry(ads, &res, filter, attrs);
    334358        if (!ADS_ERR_OK(rc)) {
     
    342366        }
    343367
    344         for (i = 0; i < count; i++) {
    345                 LDAPMessage *entry = NULL;
     368        entry = res;
     369        for (i = 0; (i < count) && entry; i++) {
    346370                DOM_SID sid;
    347371                enum id_type type;
     
    351375
    352376                if (i == 0) { /* first entry */
    353                         entry = ads_first_entry(ads, res);
     377                        entry = ads_first_entry(ads, entry);
    354378                } else { /* following ones */
    355379                        entry = ads_next_entry(ads, entry);
    356380                }
    357                 if ( ! entry) {
     381
     382                if ( !entry ) {
    358383                        DEBUG(2, ("ERROR: Unable to fetch ldap entries from results\n"));
    359                         continue;
     384                        break;
    360385                }
    361386
     
    431456        ret = NT_STATUS_OK;
    432457
    433         /* mark all unknown ones as unmapped */
     458        /* mark all unknown/expired ones as unmapped */
    434459        for (i = 0; ids[i]; i++) {
    435                 if (ids[i]->status == ID_UNKNOWN)
     460                if (ids[i]->status != ID_MAPPED)
    436461                        ids[i]->status = ID_UNMAPPED;
    437462        }
     
    458483                                NULL };
    459484        LDAPMessage *res = NULL;
     485        LDAPMessage *entry = NULL;
    460486        char *filter = NULL;
    461487        int idx = 0;
     
    464490        int i;
    465491        char *sidstr;
     492
     493        /* Only do query if we are online */
     494        if (idmap_is_offline()) {
     495                return NT_STATUS_FILE_IS_OFFLINE;
     496        }
     497
     498        /* Initilization my have been deferred because we were offline */
     499        if ( ! dom->initialized) {
     500                ret = idmap_ad_initialize(dom);
     501                if ( ! NT_STATUS_IS_OK(ret)) {
     502                        return ret;
     503                }
     504        }
    466505
    467506        ctx = talloc_get_type(dom->private_data, struct idmap_ad_context);     
     
    515554        }
    516555
    517         for (i = 0; i < count; i++) {
    518                 LDAPMessage *entry = NULL;
     556        entry = res;   
     557        for (i = 0; (i < count) && entry; i++) {
    519558                DOM_SID sid;
    520559                enum id_type type;
     
    524563
    525564                if (i == 0) { /* first entry */
    526                         entry = ads_first_entry(ads, res);
     565                        entry = ads_first_entry(ads, entry);
    527566                } else { /* following ones */
    528567                        entry = ads_next_entry(ads, entry);
    529568                }
    530                 if ( ! entry) {
     569
     570                if ( !entry ) {
    531571                        DEBUG(2, ("ERROR: Unable to fetch ldap entries from results\n"));
    532                         continue;
     572                        break;
    533573                }
    534574
     
    603643        ret = NT_STATUS_OK;
    604644
    605         /* mark all unknwon ones as unmapped */
     645        /* mark all unknwoni/expired ones as unmapped */
    606646        for (i = 0; ids[i]; i++) {
    607                 if (ids[i]->status == ID_UNKNOWN)
     647                if (ids[i]->status != ID_MAPPED)
    608648                        ids[i]->status = ID_UNMAPPED;
    609649        }
     
    655695       
    656696        ad_map_type =  WB_POSIX_MAP_SFU;       
    657 
    658         if ( !ad_idmap_ads )
    659                 return idmap_ad_initialize( NULL, NULL );       
    660697
    661698        return NT_STATUS_OK;
     
    677714        ad_map_type =  WB_POSIX_MAP_RFC2307;
    678715
    679         if ( !ad_idmap_ads )
    680                 return idmap_ad_initialize( NULL, NULL );       
    681 
    682716        return NT_STATUS_OK;
    683717}
     
    698732        ADS_STRUCT *ads_internal = NULL;
    699733
     734        /* Only do query if we are online */
     735        if (idmap_is_offline()) {
     736                return NT_STATUS_FILE_IS_OFFLINE;
     737        }
     738
    700739        /* We are assuming that the internal ADS_STRUCT is for the
    701740           same forest as the incoming *ads pointer */
Note: See TracChangeset for help on using the changeset viewer.