402{
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
448 vomsdata vomsInit;
449
450 XrdOucString oos(cfg);
451
452 XrdOucString fmt, go, grps, voss, gfmt, rfmt, vfmt, sdbg, sdbg2;
453 XrdOucString gr, vo, ss;
454 bool aOK = true;
455
456 if (oos.length() > 0) {
457
458#define NTAG 9
459 XrdOucString *var[
NTAG] = { &fmt, &go, &grps, &voss, &gfmt, &rfmt, &vfmt,
460 &sdbg, &sdbg2};
461 const char *tag[] = {"certfmt=", "grpopt=", "grps=", "vos=",
462 "grpfmt=", "rolefmt=", "vofmt=", "dbg", "dbg2"};
464
465
466 int i = 0, j = -1;
467 for(; i <
NTAG; i++) {
468 jb[i] = -1;
469 int j = oos.find(tag[i]);
471
472 }
473
474 for(i = 0; i <
NTAG; i++) {
475 je[i] = -1;
476
477 if (jb[i] > -1) {
478 int k = -1;
479 for(j = 0; j <
NTAG; j++) {
480 if (j != i) {
481 if (jb[j] > jb[i] && (k < 0 || jb[j] < jb[k])) k = j;
482
483 }
484 }
485 if (k >= 0) {
486 je[i] = jb[k] - 2;
487 } else {
488 je[i] = oos.length() - 1;
489 }
491 ss.
assign(oos, jb[i], je[i]);
492 FmtExtract(*var[i], ss, tag[i]);
493 } else {
494 *var[i] = tag[i];
495 }
496 DEBUG(tag[i] <<
"\"" << *var[i] <<
"\"");
497 }
498
499 }
500
501
502
504 if (fmt == "raw") {
505#ifdef HAVE_XRDCRYPTO
507#else
508
509
510
511 PRINT(
"VomsFun: support for RAW format not available: forcing PEM");
513#endif
514 } else if (fmt == "pem") {
516 } else if (fmt == "x509") {
518 }
519 else FATAL(
"Unsupported cert format - '"<<fmt.
c_str()<<
"'.")
520 }
521
522
525 int grpopt = go.
atoi();
526 int n = grpopt / 10;
527 if (n != gSelAll && n != gSelGrps) {
528 FATAL(
"grpopt 'select' must be in [0,1] not '"<<n<<
"'");
529 }
530 gGrpWhich = grpopt % 10;
531 if (gGrpWhich != gUseFirst && gGrpWhich != gUseLast
532 && gGrpWhich != gUseAll) {
533 FATAL(
"grpopt 'which' must be in [0,2] not '"<<gGrpWhich<<
"'");
534 }
535 } else {
536 if (go == "useall") gGrpWhich = gUseAll;
537 else if (go == "usefirst") gGrpWhich = gUseFirst;
538 else if (go == "uselast") gGrpWhich = gUseLast;
539 else FATAL(
"Invalid grpopt '"<<go<<
"'");
540 }
541 gRequire = "grpopt="; gRequire += go;
542 }
543
544
546 int from = 0, flag = 1;
547 while ((from = grps.
tokenize(gr, from,
',')) != -1) {
548
550 gGrps.Add(gr.
c_str(), &flag);
551 }
552 if (gRequire.length() > 0) gRequire += ";";
553 gRequire += "grps="; gRequire += grps;
554 }
555
556
558 int from = 0, flag = 1;
559 while ((from = voss.
tokenize(vo, from,
',')) != -1) {
560
562 gVOs.Add(vo.
c_str(), &flag);
563 }
564 if (gRequire.length() > 0) gRequire += ";";
565 gRequire += "vos="; gRequire += voss;
566 }
567
568
569 FmtExtract(gGrpFmt, gfmt, "grpfmt=");
570
571 FmtExtract(gRoleFmt, rfmt, "rolefmt=");
572
573 FmtExtract(gVoFmt, vfmt, "vofmt=");
574
575
576 if (sdbg == "dbg" && !gDebug) gDebug = 1;
577 if (sdbg2 == "dbg2") gDebug = 2;
578 }
579
580
581 const char *cfmt[3] = { "raw", "pem base64", "STACK_OF(X509)" };
582 const char *cgrs[2] = { "all groups", "specified group(s)"};
583 const char *cgrw[3] = { "first", "last", "all" };
584 int n = (gGrps.Num() ? 1 : 0);
585 PRINT(
"++++++++++++++++++ VOMS plug-in +++++++++++++++++++++++++++++++");
586 PRINT(
"+++ proxy fmt: "<< cfmt[gCertFmt]);
587 PRINT(
"+++ group option: "<<cgrw[gGrpWhich]<<
" of "<<cgrs[n]);
589 PRINT(
"+++ group(s): "<< grps);
590 } else {
591 PRINT(
"+++ group(s): <not specified>");
592 }
593 if (gGrpFmt.length() > 0)
594 PRINT(
"+++ grps fmt: "<< gGrpFmt);
595 if (gRoleFmt.length() > 0)
596 PRINT(
"+++ role fmt: "<< gRoleFmt);
597 if (gVoFmt.length() > 0)
598 PRINT(
"+++ vorg fmt: "<< gVoFmt);
599 if (gVOs.Num() > 0) {
PRINT(
"+++ VO(s): "<< voss);}
600 else {
PRINT(
"+++ VO(s): all");}
601 PRINT(
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
602
605 aOK = false;
606 PRINT(
"VOMS mapfile requested but initialization failed; failing VOMS plugin config.");
607 }
608
609
610 return (aOK ? gCertFmt : -1);
611}
void assign(const char *s, int j, int k=-1)
bool isdigit(int from=0, int to=-1)
long atoi(int from=0, int to=-1)
int tokenize(XrdOucString &tok, int from, char del=':')
static XrdVomsMapfile * Configure(XrdSysError *)