00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00151 
00152 
00153 
00154 #include <stdio.h>
00155 #include <stdlib.h>
00156 #include <string.h>
00157 #include <pwd.h>
00158 
00159 #include "lcmaps_config.h"
00160 #include "lcmaps_modules.h"
00161 #include "lcmaps_arguments.h"
00162 #include "lcmaps_cred_data.h"
00163 #include "lcmaps_gridlist.h"
00164 
00165 
00166 
00167 
00168 #define LCMAPS_MAXGIDBUFFER 256
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 static char *gridmapfile         = NULL;
00179 static char *gridmapdir          = NULL;
00180 static int   require_primary_gid = 1;
00181 static int   use_secondary_gids  = 1;
00182 static int   override_inconsistency = 0; 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 int plugin_initialize(
00197         int argc,
00198         char ** argv
00199 )
00200 {
00201     char *  logstr = "\tlcmaps_plugin_voms_poolaccount-plugin_initialize()";
00202     int i;
00203 
00204     lcmaps_log_debug(1,"%s: passed arguments:\n", logstr);
00205     for (i=0; i < argc; i++)
00206     {
00207        lcmaps_log_debug(2,"%s: arg %d is %s\n", logstr, i, argv[i]);
00208     }
00209 
00210     
00211 
00212 
00213 
00214 
00215     
00216 
00217 
00218     for (i = 1; i < argc; i++)
00219     {
00220         if ( ((strcmp(argv[i], "-gridmap") == 0) ||
00221               (strcmp(argv[i], "-GRIDMAP") == 0) ||
00222               (strcmp(argv[i], "-gridmapfile") == 0) ||
00223               (strcmp(argv[i], "-GRIDMAPFILE") == 0))
00224              && (i + 1 < argc))
00225         {
00226             if ((argv[i + 1] != NULL) && (strlen(argv[i + 1]) > 0))
00227             {
00228                  gridmapfile = strdup(argv[i + 1]);
00229             }
00230             i++;
00231         }
00232         else if ( ((strcmp(argv[i], "-gridmapdir") == 0) ||
00233               (strcmp(argv[i], "-GRIDMAPDIR") == 0))
00234              && (i + 1 < argc))
00235         {
00236             if ((argv[i + 1] != NULL) && (strlen(argv[i + 1]) > 0))
00237             {
00238                  gridmapdir = strdup(argv[i + 1]);
00239             }
00240             i++;
00241         }
00242         else if (strcmp(argv[i], "-do_not_use_secondary_gids") == 0)
00243         {
00244             use_secondary_gids = 0;
00245         }
00246         else if (strcmp(argv[i], "-do_not_require_primary_gid") == 0)
00247         {
00248             require_primary_gid = 0;
00249         }
00250         else if ( (strcmp(argv[i], "-override_inconsistency") == 0) ||
00251                   (strcmp(argv[i], "-OVERRIDE_INCONSISTENCY") == 0))
00252         {
00253             override_inconsistency = 1;
00254         }
00255         else
00256         {
00257             lcmaps_log(0,"%s: Error in initialization parameter: %s (failure)\n", logstr,
00258                        argv[i]);
00259             return LCMAPS_MOD_FAIL;
00260         }
00261     }
00262 
00263     if ( (use_secondary_gids == 0) && (require_primary_gid == 0) )
00264     {
00265         lcmaps_log(0,"%s: Conflicting voms_poolaccount options: \"-do_not_use_secondary_gids\" and \"-do_not_require_primary_gid\" (failure)\n", logstr);
00266         return LCMAPS_MOD_FAIL;
00267     }
00268 
00269     return LCMAPS_MOD_SUCCESS;
00270 } 
00271 
00272 
00273 
00274 
00275 
00276 
00277 
00278 
00279 
00280 
00281 
00282 int plugin_introspect(
00283         int * argc,
00284         lcmaps_argument_t ** argv
00285 )
00286 {
00287     char *                   logstr = "\tlcmaps_plugin_voms_poolaccount-plugin_introspect()";
00288     static lcmaps_argument_t argList[] = {
00289         {"user_dn"      ,       "char *"        , 0,   NULL},
00290         {"fqan_list"    ,       "char **"       , 0,   NULL},
00291         {"nfqan"        ,       "int"           , 0,   NULL},
00292         {NULL           ,       NULL            , -1,   NULL}
00293     };
00294 
00295     lcmaps_log_debug(1,"%s: introspecting\n", logstr);
00296 
00297     *argv = argList;
00298     *argc = lcmaps_cntArgs(argList);
00299     lcmaps_log_debug(1,"%s: address first argument: 0x%x\n", logstr, argList);
00300 
00301     return LCMAPS_MOD_SUCCESS;
00302 }
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 
00315 
00316 int plugin_run(
00317         int argc,
00318         lcmaps_argument_t * argv
00319 )
00320 {
00321     char *              logstr = "\tlcmaps_plugin_voms_poolaccount-plugin_run()";
00322     char *              dn                  = NULL; 
00323     char *              groupname           = NULL;
00324     struct group        *group_info         = NULL;
00325     char *              username            = NULL;
00326     struct passwd       *user_info          = NULL;
00327     int                 i                   = 0;
00328     int                 cnt_pri_gid         = 0;
00329     gid_t *             pri_gid             = NULL;
00330     int                 cnt_sec_gid         = 0;
00331     gid_t *             sec_gid             = NULL;
00332     char *              gidstring           = NULL;
00333     char                gidbuffer[LCMAPS_MAXGIDBUFFER];
00334     int                 index               = 0;
00335     char **             vo_cred_string_list = NULL;
00336     int                 cnt_vo_cred_string  = 0;
00337     int                 found               = 0;
00338     char *              leasename           = NULL;
00339     int                 leasenamelen        = 0;
00340     unsigned short      matching_type       = ((unsigned short)0x0000);
00341     int                 rc                  = 0;
00342     char **             fqan_list           = NULL;
00343     int                 nfqan               = -1;
00344     
00345     
00346 
00347 
00348     lcmaps_log_debug(1,"%s:\n", logstr);
00349 
00350     
00351 
00352 
00353     if ( ( dn = *(char **) lcmaps_getArgValue("user_dn", "char *", argc, argv) ) )
00354         lcmaps_log_debug(1,"%s: found dn: %s\n", logstr, dn);
00355     else
00356         lcmaps_log_debug(1,"%s: could not get value of dn !\n", logstr);
00357 
00358 
00359     
00360 
00361 
00362 
00363     if ((gridmapfile != NULL) && (strlen(gridmapfile) > 0))
00364         lcmaps_log_debug(1,"%s: gridmapfile is: %s\n", logstr, gridmapfile);
00365     else
00366     {
00367         if (gridmapfile) free(gridmapfile);
00368         gridmapfile = NULL;
00369         lcmaps_log_debug(1,"%s: No gridmapfile assigned, so function must find out for it self\n", logstr);
00370     }
00371 
00372     
00373 
00374 
00375     if (gridmapdir == NULL) 
00376     {
00377         char * tmpptr=NULL;
00378         if ((tmpptr = getenv("GRIDMAPDIR")) == NULL)
00379         {
00380             lcmaps_log(0,"%s: GRIDMAPDIR unknown !\n", logstr);
00381             lcmaps_log(0,"%s:  specify as option or set GRIDMAPDIR\n", logstr);
00382             goto fail_voms_poolaccount;
00383         }
00384         else
00385         {
00386             gridmapdir = strdup(tmpptr);
00387         }
00388     }
00389     if (strlen(gridmapdir) == 0)
00390     {
00391         lcmaps_log(0,"%s: cannot set MAPDIR (strlen(gridmapdir) == 0)\n", logstr);
00392         goto fail_voms_poolaccount;
00393     }
00394     lcmaps_log_debug(1,"%s: setting MAPDIR to %s\n", logstr, gridmapdir);
00395     if (setenv("MAPDIR", gridmapdir, 1))
00396     {
00397         lcmaps_log(0,"%s: cannot set MAPDIR\n", logstr);
00398         goto fail_voms_poolaccount;
00399     }
00400 
00401     
00402 
00403 
00404 
00405 
00406 
00407 
00408 
00409     pri_gid = (gid_t *)getCredentialData(PRI_GID, &cnt_pri_gid);
00410     if (cnt_pri_gid == 0)
00411     {
00412         lcmaps_log(0,"%s: warning: no primary group found ! \n", logstr);
00413     }
00414     else if (cnt_pri_gid < 0)
00415     {
00416         lcmaps_log(0,"%s: negative number of primary groups found ! (failure)\n", logstr);
00417         goto fail_voms_poolaccount;
00418     }
00419     else if (cnt_pri_gid > 1)
00420     {
00421         lcmaps_log(0,"%s: warning more than 1 primary group found\n", logstr);
00422     }
00423     if ( (require_primary_gid == 1) && (cnt_pri_gid < 1) )
00424     {
00425         lcmaps_log(0,"%s: no primary group found (failure)\n", logstr);
00426         goto fail_voms_poolaccount;
00427     }
00428 
00429     sec_gid = (gid_t *)getCredentialData(SEC_GID, &cnt_sec_gid);
00430     if (cnt_sec_gid < 0)
00431     {
00432         lcmaps_log(0,"%s: negative number of secondary groups found ! (failure)\n", logstr);
00433         goto fail_voms_poolaccount;
00434     }
00435     
00436 
00437 
00438     gidbuffer[0] = '\0';
00439     index = 0;
00440     
00441     for (i = 0; i < cnt_pri_gid; i++)
00442     {
00443         if ( ( group_info = getgrgid(pri_gid[i]) ) )
00444         {
00445             groupname = group_info->gr_name;
00446             if ( (strlen(groupname) + 1) < (LCMAPS_MAXGIDBUFFER - index) )
00447             {
00448                 strncat(gidbuffer, ":", 1);
00449                 strncat(gidbuffer, groupname, (LCMAPS_MAXGIDBUFFER - index - 2));
00450                 index += strlen(groupname) + 1;
00451                 lcmaps_log_debug(1,"%s: primary groups, i=%d(%d), group_info->gr_name: %s\n", logstr,
00452                                  i,cnt_pri_gid,group_info->gr_name);
00453                 lcmaps_log_debug(1,"%s: gidbuffer: %s\n", logstr,gidbuffer);
00454             }
00455             else
00456             {
00457                 lcmaps_log(0,"%s: gidbuffer is full (%d bytes) (failure)\n", logstr,
00458                            LCMAPS_MAXGIDBUFFER);
00459                 goto fail_voms_poolaccount;
00460             }
00461         }
00462         else
00463         {
00464             lcmaps_log(0,"%s: no group id found for groupname = \"%s\"\n", logstr, groupname);
00465             goto fail_voms_poolaccount;
00466         }
00467     }
00468     
00469     if (use_secondary_gids)
00470     {
00471         for (i = 0; i < cnt_sec_gid; i++)
00472         {
00473             if ( ( group_info = getgrgid(sec_gid[i]) ) )
00474             {
00475                 groupname = group_info->gr_name;
00476                 if ( (strlen(groupname) + 1) < (LCMAPS_MAXGIDBUFFER - index) )
00477                 {
00478                     strncat(gidbuffer, ":", 1);
00479                     strncat(gidbuffer, groupname, (LCMAPS_MAXGIDBUFFER - index - 2));
00480                     index += strlen(groupname) + 1;
00481                     lcmaps_log_debug(1,"%s: secondary groups, i=%d(%d), group_info->gr_name: %s\n", logstr,
00482                                      i,cnt_sec_gid,group_info->gr_name);
00483                     lcmaps_log_debug(1,"%s: gidbuffer: %s\n", logstr,gidbuffer);
00484                 }
00485                 else
00486                 {
00487                     lcmaps_log(0,"%s: gidbuffer is full (%d bytes) (failure)\n", logstr,
00488                                LCMAPS_MAXGIDBUFFER);
00489                     goto fail_voms_poolaccount;
00490                 }
00491             }
00492             else
00493             {
00494                 lcmaps_log_debug(1,"%s: no group id found for groupname = \"%s\"\n", logstr, groupname);
00495                 goto fail_voms_poolaccount;
00496             }
00497         }
00498     }
00499     if (gidbuffer[0] == '\0')
00500     {
00501         gidstring = NULL;
00502         leasenamelen = strlen(dn) + 1;
00503         leasename = strdup(dn);
00504     }
00505     else
00506     {
00507         gidstring = gidbuffer;
00508         leasenamelen = strlen(dn) + strlen(gidstring) + 1;
00509         leasename = malloc(leasenamelen*sizeof(char));
00510         snprintf(leasename, leasenamelen, "%s%s", dn, gidstring);
00511     }
00512 
00513     
00514 
00515 
00516 
00517 
00518 
00519 
00520 
00521 
00522     lcmaps_log_debug(1,"%s: First try to get the FQAN list from input credential repository ...\n", logstr);
00523     if ( ( nfqan = *(int *) lcmaps_getArgValue("nfqan", "int", argc, argv) ) )
00524     {
00525         lcmaps_log_debug(1,"%s: the list of FQANs should contain %d elements\n", logstr, nfqan);
00526         if ( ( fqan_list = *(char ***) lcmaps_getArgValue("fqan_list", "char **", argc, argv) ) )
00527             lcmaps_log_debug(1, "%s: found list of FQANs\n", logstr);
00528         else
00529         {
00530             lcmaps_log_debug(1, "%s: could not retrieve list of FQANs (failure)!\n", logstr);
00531             goto fail_voms_poolaccount;
00532         }
00533         for (i = 0; i < nfqan; i++)
00534         {
00535             lcmaps_log_debug(3, "%s: FQAN %d: %s\n", logstr, i, fqan_list[i]);
00536         }
00537         vo_cred_string_list = fqan_list;
00538         cnt_vo_cred_string = nfqan;
00539     }
00540     else
00541     {
00542         lcmaps_log_debug(1,"%s: ... did not find input credentials in input credential repository...\n", logstr);
00543         lcmaps_log_debug(1,"%s: ... trying the internal credential repository ...\n", logstr);
00544 
00545         vo_cred_string_list = getCredentialData(LCMAPS_VO_CRED_STRING, &cnt_vo_cred_string);
00546     }
00547 
00548     if (cnt_vo_cred_string == 0)
00549     {
00550         lcmaps_log(0,"%s: no VOMS group info --> no mapping (failure)\n", logstr);
00551         goto fail_voms_poolaccount;
00552     }
00553     else if (cnt_vo_cred_string < 0)
00554     {
00555         lcmaps_log(0,"%s: negative number of VOMS groups found ! (failure)\n", logstr);
00556         goto fail_voms_poolaccount;
00557     }
00558 
00559 
00560     
00561 
00562 
00563 
00564     found = 0;
00565     lcmaps_log_debug(2,"%s: using leasename: %s\n", logstr,leasename);
00566 
00567     matching_type = MATCH_INCLUDE|MATCH_WILD_CHARS;
00568  
00569     
00570     if (override_inconsistency)
00571         matching_type = matching_type|OVERRIDE_INCONSISTANCY;
00572 
00573     for (i = 0; i < cnt_vo_cred_string; i++)
00574     {
00575         if ( (i > 0) && (require_primary_gid == 1) )
00576         {
00577             lcmaps_log(0,"%s: no match (or no poolaccount available) for primary group (%s) in %s (failure)\n", logstr,
00578                        vo_cred_string_list[0], gridmapfile);
00579             goto fail_voms_poolaccount;
00580         }
00581 
00582 
00583         if ( (rc = lcmaps_gridlist(vo_cred_string_list[i], &username, gridmapfile, matching_type, ".", leasename)) == 0)
00584         {
00585             found = 1;
00586             lcmaps_log_debug(1,"%s: found username: %s\n", logstr, username);
00587             break;
00588         }
00589         else if (rc == LCMAPS_MOD_NOFILE)
00590         {
00591             lcmaps_log(0, "%s: Could not find the gridmapfile %s\n", logstr, gridmapfile);
00592             goto fail_voms_poolaccount;
00593         }
00594         else
00595         {
00596             lcmaps_log(0, "%s: no match (or no poolaccount available) for group (%s) in %s\n", logstr, vo_cred_string_list[i], gridmapfile);
00597         }
00598     }
00599 
00600 
00601     
00602 
00603 
00604     if (username && (strlen(username) > 0))
00605     {
00606 
00607         if ( ( user_info = getpwnam(username) ) )
00608         {
00609             char *  encoded_lease = NULL;
00610 
00611             lcmaps_log_debug(2,"%s: address user_info: %p\n", logstr, user_info);
00612             lcmaps_log_debug(2,"%s: username : %s, char ptr: %p, address char ptr: %p\n", logstr, user_info->pw_name, user_info->pw_name, &(user_info->pw_name));
00613             lcmaps_log_debug(2,"%s: password : %s\n", logstr, user_info->pw_passwd);
00614             lcmaps_log_debug(2,"%s: user_id  : %d, address uid: %p\n", logstr, user_info->pw_uid, &(user_info->pw_uid));
00615             lcmaps_log_debug(2,"%s: group_id : %d\n", logstr, user_info->pw_gid);
00616             lcmaps_log_debug(2,"%s: realname : %s\n", logstr, user_info->pw_gecos);
00617             lcmaps_log_debug(2,"%s: home dir : %s\n", logstr, user_info->pw_dir);
00618             lcmaps_log_debug(2,"%s: shellprg : %s\n", logstr, user_info->pw_shell);
00619 
00620             
00621 
00622 
00623             addCredentialData(DN,  &dn);
00624             addCredentialData(UID, &(user_info->pw_uid));
00625 
00626             
00627             encoded_lease = gridmapdir_urlencode(leasename);
00628             addCredentialData(POOL_INDEX, &encoded_lease);
00629             if (encoded_lease)
00630             {
00631                 free(encoded_lease);
00632                 encoded_lease = NULL;
00633             }
00634         }
00635         else
00636         {
00637             lcmaps_log(0,"%s: no user account found name \"%s\"\n", logstr, username);
00638             goto fail_voms_poolaccount;
00639         }
00640     }
00641     else
00642     {   
00643         goto fail_voms_poolaccount;
00644     }
00645 
00646     
00647  success_voms_poolaccount:
00648     if (username) free(username);
00649     lcmaps_log_time(0,"%s: voms_poolaccount plugin succeeded\n", logstr);
00650     return LCMAPS_MOD_SUCCESS;
00651 
00652  fail_voms_poolaccount:
00653     if (username) free(username);
00654     lcmaps_log_time(0,"%s: voms_poolaccount plugin failed\n", logstr);
00655     return LCMAPS_MOD_FAIL;
00656 }
00657 
00658 
00659 
00660 
00661 
00662 
00663 
00664 
00665 
00666 
00667 
00668 int plugin_terminate()
00669 {
00670     char * logstr = "\tlcmaps_plugin_voms_poolaccount-plugin_terminate()";
00671 
00672     lcmaps_log_debug(1,"%s: terminating\n", logstr);
00673 
00674     if (gridmapfile) free(gridmapfile);
00675     if (gridmapdir) free(gridmapdir);
00676 
00677     return LCMAPS_MOD_SUCCESS;
00678 }
00679 
00680 
00681 
00682 
00683 
00684 
00685 
00686