388{
389
390
391
392
393
394
395
396
397
398
399
400
401
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
434 vomsdata vomsInit;
435
436 XrdOucString oos(cfg);
437
438 XrdOucString fmt, go, grps, voss, gfmt, rfmt, vfmt, sdbg, sdbg2;
439 XrdOucString gr, vo, ss;
440 bool aOK = true;
441
442 if (oos.length() > 0) {
443
444#define NTAG 9
445 XrdOucString *var[
NTAG] = { &fmt, &go, &grps, &voss, &gfmt, &rfmt, &vfmt,
446 &sdbg, &sdbg2};
447 const char *tag[] = {"certfmt=", "grpopt=", "grps=", "vos=",
448 "grpfmt=", "rolefmt=", "vofmt=", "dbg", "dbg2"};
450
451
452 int i = 0, j = -1;
453 for(; i <
NTAG; i++) {
454 jb[i] = -1;
455 int j = oos.find(tag[i]);
457
458 }
459
460 for(i = 0; i <
NTAG; i++) {
461 je[i] = -1;
462
463 if (jb[i] > -1) {
464 int k = -1;
465 for(j = 0; j <
NTAG; j++) {
466 if (j != i) {
467 if (jb[j] > jb[i] && (k < 0 || jb[j] < jb[k])) k = j;
468
469 }
470 }
471 if (k >= 0) {
472 je[i] = jb[k] - 2;
473 } else {
474 je[i] = oos.length() - 1;
475 }
477 ss.
assign(oos, jb[i], je[i]);
478 FmtExtract(*var[i], ss, tag[i]);
479 } else {
480 *var[i] = tag[i];
481 }
482 DEBUG(tag[i] <<
"\"" << *var[i] <<
"\"");
483 }
484
485 }
486
487
488
490 if (fmt == "raw") {
492 } else if (fmt == "pem") {
494 } else if (fmt == "x509") {
496 }
497 else FATAL(
"Unsupported cert format - '"<<fmt.
c_str()<<
"'.")
498 }
499
500
503 int grpopt = go.
atoi();
504 int n = grpopt / 10;
505 if (n != gSelAll && n != gSelGrps) {
506 FATAL(
"grpopt 'select' must be in [0,1] not '"<<n<<
"'");
507 }
508 gGrpWhich = grpopt % 10;
509 if (gGrpWhich != gUseFirst && gGrpWhich != gUseLast
510 && gGrpWhich != gUseAll) {
511 FATAL(
"grpopt 'which' must be in [0,2] not '"<<gGrpWhich<<
"'");
512 }
513 } else {
514 if (go == "useall") gGrpWhich = gUseAll;
515 else if (go == "usefirst") gGrpWhich = gUseFirst;
516 else if (go == "uselast") gGrpWhich = gUseLast;
517 else FATAL(
"Invalid grpopt '"<<go<<
"'");
518 }
519 gRequire = "grpopt="; gRequire += go;
520 }
521
522
524 int from = 0, flag = 1;
525 while ((from = grps.
tokenize(gr, from,
',')) != -1) {
526
528 gGrps.Add(gr.
c_str(), &flag);
529 }
530 if (gRequire.length() > 0) gRequire += ";";
531 gRequire += "grps="; gRequire += grps;
532 }
533
534
536 int from = 0, flag = 1;
537 while ((from = voss.
tokenize(vo, from,
',')) != -1) {
538
540 gVOs.Add(vo.
c_str(), &flag);
541 }
542 if (gRequire.length() > 0) gRequire += ";";
543 gRequire += "vos="; gRequire += voss;
544 }
545
546
547 FmtExtract(gGrpFmt, gfmt, "grpfmt=");
548
549 FmtExtract(gRoleFmt, rfmt, "rolefmt=");
550
551 FmtExtract(gVoFmt, vfmt, "vofmt=");
552
553
554 if (sdbg == "dbg" && !gDebug) gDebug = 1;
555 if (sdbg2 == "dbg2") gDebug = 2;
556 }
557
558
559 const char *cfmt[3] = { "raw", "pem base64", "STACK_OF(X509)" };
560 const char *cgrs[2] = { "all groups", "specified group(s)"};
561 const char *cgrw[3] = { "first", "last", "all" };
562 int n = (gGrps.Num() ? 1 : 0);
563 PRINT(
"++++++++++++++++++ VOMS plug-in +++++++++++++++++++++++++++++++");
564 PRINT(
"+++ proxy fmt: "<< cfmt[gCertFmt]);
565 PRINT(
"+++ group option: "<<cgrw[gGrpWhich]<<
" of "<<cgrs[n]);
567 PRINT(
"+++ group(s): "<< grps);
568 } else {
569 PRINT(
"+++ group(s): <not specified>");
570 }
571 if (gGrpFmt.length() > 0)
572 PRINT(
"+++ grps fmt: "<< gGrpFmt);
573 if (gRoleFmt.length() > 0)
574 PRINT(
"+++ role fmt: "<< gRoleFmt);
575 if (gVoFmt.length() > 0)
576 PRINT(
"+++ vorg fmt: "<< gVoFmt);
577 if (gVOs.Num() > 0) {
PRINT(
"+++ VO(s): "<< voss);}
578 else {
PRINT(
"+++ VO(s): all");}
579 PRINT(
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
580
583 aOK = false;
584 PRINT(
"VOMS mapfile requested but initialization failed; failing VOMS plugin config.");
585 }
586
587
588 return (aOK ? gCertFmt : -1);
589}
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 *)