| | @@ -307,11 +307,11 @@ |
| 307 | 307 | int uid, i; |
| 308 | 308 | int higherUser = 0; /* True if user being edited is SETUP and the */ |
| 309 | 309 | /* user doing the editing is ADMIN. Disallow editing */ |
| 310 | 310 | char *inherit[128]; |
| 311 | 311 | int a[128]; |
| 312 | | - char *oa[128]; |
| 312 | + const char *oa[128]; |
| 313 | 313 | |
| 314 | 314 | /* Must have ADMIN privileges to access this page |
| 315 | 315 | */ |
| 316 | 316 | login_check_credentials(); |
| 317 | 317 | if( !g.perm.Admin ){ login_needed(); return; } |
| | @@ -441,38 +441,38 @@ |
| 441 | 441 | if( fossil_strcmp(zLogin, "developer") ){ |
| 442 | 442 | char *z1, *z2; |
| 443 | 443 | z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='developer'"); |
| 444 | 444 | while( z1 && *z1 ){ |
| 445 | 445 | inherit[0x7f & *(z1++)] = |
| 446 | | - "<span class=\"ueditInheritDeveloper\"><sub>D</sub></span>"; |
| 446 | + "<span class=\"ueditInheritDeveloper\"><sub>[D]</sub></span>"; |
| 447 | 447 | } |
| 448 | 448 | free(z2); |
| 449 | 449 | } |
| 450 | 450 | if( fossil_strcmp(zLogin, "reader") ){ |
| 451 | 451 | char *z1, *z2; |
| 452 | 452 | z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='reader'"); |
| 453 | 453 | while( z1 && *z1 ){ |
| 454 | 454 | inherit[0x7f & *(z1++)] = |
| 455 | | - "<span class=\"ueditInheritReader\"><sub>R</sub></span>"; |
| 455 | + "<span class=\"ueditInheritReader\"><sub>[R]</sub></span>"; |
| 456 | 456 | } |
| 457 | 457 | free(z2); |
| 458 | 458 | } |
| 459 | 459 | if( fossil_strcmp(zLogin, "anonymous") ){ |
| 460 | 460 | char *z1, *z2; |
| 461 | 461 | z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='anonymous'"); |
| 462 | 462 | while( z1 && *z1 ){ |
| 463 | 463 | inherit[0x7f & *(z1++)] = |
| 464 | | - "<span class=\"ueditInheritAnonymous\"><sub>A</sub></span>"; |
| 464 | + "<span class=\"ueditInheritAnonymous\"><sub>[A]</sub></span>"; |
| 465 | 465 | } |
| 466 | 466 | free(z2); |
| 467 | 467 | } |
| 468 | 468 | if( fossil_strcmp(zLogin, "nobody") ){ |
| 469 | 469 | char *z1, *z2; |
| 470 | 470 | z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='nobody'"); |
| 471 | 471 | while( z1 && *z1 ){ |
| 472 | 472 | inherit[0x7f & *(z1++)] = |
| 473 | | - "<span class=\"ueditInheritNobody\"><sub>N</sub></span>"; |
| 473 | + "<span class=\"ueditInheritNobody\"><sub>[N]</sub></span>"; |
| 474 | 474 | } |
| 475 | 475 | free(z2); |
| 476 | 476 | } |
| 477 | 477 | |
| 478 | 478 | /* Begin generating the page |
| | @@ -489,10 +489,47 @@ |
| 489 | 489 | if( login_is_special(zLogin) ){ |
| 490 | 490 | @ <input type="hidden" name="login" value="%s(zLogin)"> |
| 491 | 491 | @ <input type="hidden" name="info" value=""> |
| 492 | 492 | @ <input type="hidden" name="pw" value="*"> |
| 493 | 493 | } |
| 494 | + @ <script type='text/javascript'> |
| 495 | + @ function updateCapabilityString(){ |
| 496 | + @ /* |
| 497 | + @ ** This function updates the "#usetupEditCapability" span content |
| 498 | + @ ** with the capabilities selected by the interactive user, based |
| 499 | + @ ** upon the state of the capability checkboxes. |
| 500 | + @ */ |
| 501 | + @ try { |
| 502 | + @ var inputs = document.getElementsByTagName('input'); |
| 503 | + @ if( inputs && inputs.length ){ |
| 504 | + @ var output = document.getElementById('usetupEditCapability'); |
| 505 | + @ if( output ){ |
| 506 | + @ var permsIds = [], x = 0; |
| 507 | + @ for(var i = 0; i < inputs.length; i++){ |
| 508 | + @ var e = inputs[i]; |
| 509 | + @ if( !e.name || !e.type ) continue; |
| 510 | + @ if( e.type.toLowerCase()!=='checkbox' ) continue; |
| 511 | + @ if( e.name.length===2 && e.name[0]==='a' ){ |
| 512 | + @ // looks like a capability checkbox |
| 513 | + @ if( e.checked ){ |
| 514 | + @ // grab the second character of the element |
| 515 | + @ // name, which is the textual flag for this |
| 516 | + @ // capability, and then add it to the result |
| 517 | + @ // array. |
| 518 | + @ permsIds[x++] = e.name[1]; |
| 519 | + @ } |
| 520 | + @ } |
| 521 | + @ } |
| 522 | + @ permsIds.sort(); |
| 523 | + @ output.innerHTML = permsIds.join(''); |
| 524 | + @ } |
| 525 | + @ } |
| 526 | + @ } catch (e) { |
| 527 | + @ /* ignore errors */ |
| 528 | + @ } |
| 529 | + @ } |
| 530 | + @ </script> |
| 494 | 531 | @ <table> |
| 495 | 532 | @ <tr> |
| 496 | 533 | @ <td class="usetupEditLabel">User ID:</td> |
| 497 | 534 | if( uid ){ |
| 498 | 535 | @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td> |
| | @@ -516,64 +553,96 @@ |
| 516 | 553 | @ <td class="usetupEditLabel">Capabilities:</td> |
| 517 | 554 | @ <td> |
| 518 | 555 | #define B(x) inherit[x] |
| 519 | 556 | @ <table border=0><tr><td valign="top"> |
| 520 | 557 | if( g.perm.Setup ){ |
| 521 | | - @ <label><input type="checkbox" name="as"%s(oa['s']) /> |
| 558 | + @ <label><input type="checkbox" name="as"%s(oa['s']) |
| 559 | + @ onchange="updateCapabilityString()"/> |
| 522 | 560 | @ Setup%s(B('s'))</label><br /> |
| 523 | 561 | } |
| 524 | | - @ <label><input type="checkbox" name="aa"%s(oa['a']) /> |
| 562 | + @ <label><input type="checkbox" name="aa"%s(oa['a']) |
| 563 | + @ onchange="updateCapabilityString()" /> |
| 525 | 564 | @ Admin%s(B('a'))</label><br /> |
| 526 | | - @ <label><input type="checkbox" name="ad"%s(oa['d']) /> |
| 565 | + @ <label><input type="checkbox" name="ad"%s(oa['d']) |
| 566 | + @ onchange="updateCapabilityString()" /> |
| 527 | 567 | @ Delete%s(B('d'))</label><br /> |
| 528 | | - @ <label><input type="checkbox" name="ae"%s(oa['e']) /> |
| 568 | + @ <label><input type="checkbox" name="ae"%s(oa['e']) |
| 569 | + @ onchange="updateCapabilityString()" /> |
| 529 | 570 | @ Email%s(B('e'))</label><br /> |
| 530 | | - @ <label><input type="checkbox" name="ap"%s(oa['p']) /> |
| 571 | + @ <label><input type="checkbox" name="ap"%s(oa['p']) |
| 572 | + @ onchange="updateCapabilityString()" /> |
| 531 | 573 | @ Password%s(B('p'))</label><br /> |
| 532 | | - @ <label><input type="checkbox" name="ai"%s(oa['i']) /> |
| 574 | + @ <label><input type="checkbox" name="ai"%s(oa['i']) |
| 575 | + @ onchange="updateCapabilityString()" /> |
| 533 | 576 | @ Check-In%s(B('i'))</label><br /> |
| 534 | | - @ <label><input type="checkbox" name="ao"%s(oa['o']) /> |
| 577 | + @ <label><input type="checkbox" name="ao"%s(oa['o']) |
| 578 | + @ onchange="updateCapabilityString()" /> |
| 535 | 579 | @ Check-Out%s(B('o'))</label><br /> |
| 536 | | - @ <label><input type="checkbox" name="ah"%s(oa['h']) /> |
| 580 | + @ <label><input type="checkbox" name="ah"%s(oa['h']) |
| 581 | + @ onchange="updateCapabilityString()" /> |
| 537 | 582 | @ Hyperlinks%s(B('h'))</label><br /> |
| 538 | | - @ <label><input type="checkbox" name="ab"%s(oa['b']) /> |
| 583 | + @ <label><input type="checkbox" name="ab"%s(oa['b']) |
| 584 | + @ onchange="updateCapabilityString()" /> |
| 539 | 585 | @ Attachments%s(B('b'))</label><br /> |
| 540 | 586 | @ </td><td><td width="40"></td><td valign="top"> |
| 541 | | - @ <label><input type="checkbox" name="au"%s(oa['u']) /> |
| 587 | + @ <label><input type="checkbox" name="au"%s(oa['u']) |
| 588 | + @ onchange="updateCapabilityString()" /> |
| 542 | 589 | @ Reader%s(B('u'))</label><br /> |
| 543 | | - @ <label><input type="checkbox" name="av"%s(oa['v']) /> |
| 590 | + @ <label><input type="checkbox" name="av"%s(oa['v']) |
| 591 | + @ onchange="updateCapabilityString()" /> |
| 544 | 592 | @ Developer%s(B('v'))</label><br /> |
| 545 | | - @ <label><input type="checkbox" name="ag"%s(oa['g']) /> |
| 593 | + @ <label><input type="checkbox" name="ag"%s(oa['g']) |
| 594 | + @ onchange="updateCapabilityString()" /> |
| 546 | 595 | @ Clone%s(B('g'))</label><br /> |
| 547 | | - @ <label><input type="checkbox" name="aj"%s(oa['j']) /> |
| 596 | + @ <label><input type="checkbox" name="aj"%s(oa['j']) |
| 597 | + @ onchange="updateCapabilityString()" /> |
| 548 | 598 | @ Read Wiki%s(B('j'))</label><br /> |
| 549 | | - @ <label><input type="checkbox" name="af"%s(oa['f']) /> |
| 599 | + @ <label><input type="checkbox" name="af"%s(oa['f']) |
| 600 | + @ onchange="updateCapabilityString()" /> |
| 550 | 601 | @ New Wiki%s(B('f'))</label><br /> |
| 551 | | - @ <label><input type="checkbox" name="am"%s(oa['m']) /> |
| 602 | + @ <label><input type="checkbox" name="am"%s(oa['m']) |
| 603 | + @ onchange="updateCapabilityString()" /> |
| 552 | 604 | @ Append Wiki%s(B('m'))</label><br /> |
| 553 | | - @ <label><input type="checkbox" name="ak"%s(oa['k']) /> |
| 605 | + @ <label><input type="checkbox" name="ak"%s(oa['k']) |
| 606 | + @ onchange="updateCapabilityString()" /> |
| 554 | 607 | @ Write Wiki%s(B('k'))</label><br /> |
| 555 | | - @ <label><input type="checkbox" name="al"%s(oa['l']) /> |
| 608 | + @ <label><input type="checkbox" name="al"%s(oa['l']) |
| 609 | + @ onchange="updateCapabilityString()" /> |
| 556 | 610 | @ Moderate Wiki%s(B('l'))</label><br /> |
| 557 | 611 | @ </td><td><td width="40"></td><td valign="top"> |
| 558 | | - @ <label><input type="checkbox" name="ar"%s(oa['r']) /> |
| 612 | + @ <label><input type="checkbox" name="ar"%s(oa['r']) |
| 613 | + @ onchange="updateCapabilityString()" /> |
| 559 | 614 | @ Read Ticket%s(B('r'))</label><br /> |
| 560 | | - @ <label><input type="checkbox" name="an"%s(oa['n']) /> |
| 615 | + @ <label><input type="checkbox" name="an"%s(oa['n']) |
| 616 | + @ onchange="updateCapabilityString()" /> |
| 561 | 617 | @ New Tickets%s(B('n'))</label><br /> |
| 562 | | - @ <label><input type="checkbox" name="ac"%s(oa['c']) /> |
| 618 | + @ <label><input type="checkbox" name="ac"%s(oa['c']) |
| 619 | + @ onchange="updateCapabilityString()" /> |
| 563 | 620 | @ Append To Ticket%s(B('c'))</label><br /> |
| 564 | | - @ <label><input type="checkbox" name="aw"%s(oa['w']) /> |
| 621 | + @ <label><input type="checkbox" name="aw"%s(oa['w']) |
| 622 | + @ onchange="updateCapabilityString()" /> |
| 565 | 623 | @ Write Tickets%s(B('w'))</label><br /> |
| 566 | | - @ <label><input type="checkbox" name="aq"%s(oa['q']) /> |
| 624 | + @ <label><input type="checkbox" name="aq"%s(oa['q']) |
| 625 | + @ onchange="updateCapabilityString()" /> |
| 567 | 626 | @ Moderate Tickets%s(B('q'))</label><br /> |
| 568 | | - @ <label><input type="checkbox" name="at"%s(oa['t']) /> |
| 627 | + @ <label><input type="checkbox" name="at"%s(oa['t']) |
| 628 | + @ onchange="updateCapabilityString()" /> |
| 569 | 629 | @ Ticket Report%s(B('t'))</label><br /> |
| 570 | | - @ <label><input type="checkbox" name="ax"%s(oa['x']) /> |
| 630 | + @ <label><input type="checkbox" name="ax"%s(oa['x']) |
| 631 | + @ onchange="updateCapabilityString()" /> |
| 571 | 632 | @ Private%s(B('x'))</label><br /> |
| 572 | | - @ <label><input type="checkbox" name="az"%s(oa['z']) /> |
| 633 | + @ <label><input type="checkbox" name="az"%s(oa['z']) |
| 634 | + @ onchange="updateCapabilityString()" /> |
| 573 | 635 | @ Download Zip%s(B('z'))</label> |
| 574 | | - @ </td></tr></table> |
| 636 | + @ </td></tr> |
| 637 | + @ </table> |
| 638 | + @ </td> |
| 639 | + @ </tr> |
| 640 | + @ <tr> |
| 641 | + @ <td class="usetupEditLabel">Selected Cap.:</td> |
| 642 | + @ <td> |
| 643 | + @ <span id="usetupEditCapability">(missing JS?)</span> |
| 575 | 644 | @ </td> |
| 576 | 645 | @ </tr> |
| 577 | 646 | if( !login_is_special(zLogin) ){ |
| 578 | 647 | @ <tr> |
| 579 | 648 | @ <td align="right">Password:</td> |
| | @@ -604,10 +673,11 @@ |
| 604 | 673 | @ </tr> |
| 605 | 674 | } |
| 606 | 675 | @ </table> |
| 607 | 676 | @ </div></form> |
| 608 | 677 | @ </div> |
| 678 | + @ <script type='text/javascript'>updateCapabilityString();</script> |
| 609 | 679 | @ <h2>Privileges And Capabilities:</h2> |
| 610 | 680 | @ <ul> |
| 611 | 681 | if( higherUser ){ |
| 612 | 682 | @ <li><p class="missingPriv"> |
| 613 | 683 | @ User %h(zLogin) has Setup privileges and you only have Admin privileges |
| 614 | 684 | |