Fossil SCM

Merged in inherit-priv-mark-sub with one minor layout tweak.

stephan 2014-10-02 17:01 trunk merge
Commit 54a783e39ff9c7b981e98ee3832c9ad2e4a4c987
3 files changed +101 -31 +101 -31 +8
+101 -31
--- src/setup.c
+++ src/setup.c
@@ -307,11 +307,11 @@
307307
int uid, i;
308308
int higherUser = 0; /* True if user being edited is SETUP and the */
309309
/* user doing the editing is ADMIN. Disallow editing */
310310
char *inherit[128];
311311
int a[128];
312
- char *oa[128];
312
+ const char *oa[128];
313313
314314
/* Must have ADMIN privileges to access this page
315315
*/
316316
login_check_credentials();
317317
if( !g.perm.Admin ){ login_needed(); return; }
@@ -441,38 +441,38 @@
441441
if( fossil_strcmp(zLogin, "developer") ){
442442
char *z1, *z2;
443443
z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='developer'");
444444
while( z1 && *z1 ){
445445
inherit[0x7f & *(z1++)] =
446
- "<span class=\"ueditInheritDeveloper\"><sub>D</sub></span>";
446
+ "<span class=\"ueditInheritDeveloper\"><sub>[D]</sub></span>";
447447
}
448448
free(z2);
449449
}
450450
if( fossil_strcmp(zLogin, "reader") ){
451451
char *z1, *z2;
452452
z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='reader'");
453453
while( z1 && *z1 ){
454454
inherit[0x7f & *(z1++)] =
455
- "<span class=\"ueditInheritReader\"><sub>R</sub></span>";
455
+ "<span class=\"ueditInheritReader\"><sub>[R]</sub></span>";
456456
}
457457
free(z2);
458458
}
459459
if( fossil_strcmp(zLogin, "anonymous") ){
460460
char *z1, *z2;
461461
z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='anonymous'");
462462
while( z1 && *z1 ){
463463
inherit[0x7f & *(z1++)] =
464
- "<span class=\"ueditInheritAnonymous\"><sub>A</sub></span>";
464
+ "<span class=\"ueditInheritAnonymous\"><sub>[A]</sub></span>";
465465
}
466466
free(z2);
467467
}
468468
if( fossil_strcmp(zLogin, "nobody") ){
469469
char *z1, *z2;
470470
z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='nobody'");
471471
while( z1 && *z1 ){
472472
inherit[0x7f & *(z1++)] =
473
- "<span class=\"ueditInheritNobody\"><sub>N</sub></span>";
473
+ "<span class=\"ueditInheritNobody\"><sub>[N]</sub></span>";
474474
}
475475
free(z2);
476476
}
477477
478478
/* Begin generating the page
@@ -489,10 +489,47 @@
489489
if( login_is_special(zLogin) ){
490490
@ <input type="hidden" name="login" value="%s(zLogin)">
491491
@ <input type="hidden" name="info" value="">
492492
@ <input type="hidden" name="pw" value="*">
493493
}
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>
494531
@ <table>
495532
@ <tr>
496533
@ <td class="usetupEditLabel">User ID:</td>
497534
if( uid ){
498535
@ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td>
@@ -516,64 +553,96 @@
516553
@ <td class="usetupEditLabel">Capabilities:</td>
517554
@ <td>
518555
#define B(x) inherit[x]
519556
@ <table border=0><tr><td valign="top">
520557
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()"/>
522560
@ Setup%s(B('s'))</label><br />
523561
}
524
- @ <label><input type="checkbox" name="aa"%s(oa['a']) />
562
+ @ <label><input type="checkbox" name="aa"%s(oa['a'])
563
+ @ onchange="updateCapabilityString()" />
525564
@ 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()" />
527567
@ 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()" />
529570
@ 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()" />
531573
@ 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()" />
533576
@ 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()" />
535579
@ 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()" />
537582
@ 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()" />
539585
@ Attachments%s(B('b'))</label><br />
540586
@ </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()" />
542589
@ 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()" />
544592
@ 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()" />
546595
@ 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()" />
548598
@ 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()" />
550601
@ 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()" />
552604
@ 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()" />
554607
@ 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()" />
556610
@ Moderate Wiki%s(B('l'))</label><br />
557611
@ </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()" />
559614
@ 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()" />
561617
@ 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()" />
563620
@ 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()" />
565623
@ 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()" />
567626
@ 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()" />
569629
@ 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()" />
571632
@ 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()" />
573635
@ 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>
575644
@ </td>
576645
@ </tr>
577646
if( !login_is_special(zLogin) ){
578647
@ <tr>
579648
@ <td align="right">Password:</td>
@@ -604,10 +673,11 @@
604673
@ </tr>
605674
}
606675
@ </table>
607676
@ </div></form>
608677
@ </div>
678
+ @ <script type='text/javascript'>updateCapabilityString();</script>
609679
@ <h2>Privileges And Capabilities:</h2>
610680
@ <ul>
611681
if( higherUser ){
612682
@ <li><p class="missingPriv">
613683
@ User %h(zLogin) has Setup privileges and you only have Admin privileges
614684
--- src/setup.c
+++ src/setup.c
@@ -307,11 +307,11 @@
307 int uid, i;
308 int higherUser = 0; /* True if user being edited is SETUP and the */
309 /* user doing the editing is ADMIN. Disallow editing */
310 char *inherit[128];
311 int a[128];
312 char *oa[128];
313
314 /* Must have ADMIN privileges to access this page
315 */
316 login_check_credentials();
317 if( !g.perm.Admin ){ login_needed(); return; }
@@ -441,38 +441,38 @@
441 if( fossil_strcmp(zLogin, "developer") ){
442 char *z1, *z2;
443 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='developer'");
444 while( z1 && *z1 ){
445 inherit[0x7f & *(z1++)] =
446 "<span class=\"ueditInheritDeveloper\"><sub>D</sub></span>";
447 }
448 free(z2);
449 }
450 if( fossil_strcmp(zLogin, "reader") ){
451 char *z1, *z2;
452 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='reader'");
453 while( z1 && *z1 ){
454 inherit[0x7f & *(z1++)] =
455 "<span class=\"ueditInheritReader\"><sub>R</sub></span>";
456 }
457 free(z2);
458 }
459 if( fossil_strcmp(zLogin, "anonymous") ){
460 char *z1, *z2;
461 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='anonymous'");
462 while( z1 && *z1 ){
463 inherit[0x7f & *(z1++)] =
464 "<span class=\"ueditInheritAnonymous\"><sub>A</sub></span>";
465 }
466 free(z2);
467 }
468 if( fossil_strcmp(zLogin, "nobody") ){
469 char *z1, *z2;
470 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='nobody'");
471 while( z1 && *z1 ){
472 inherit[0x7f & *(z1++)] =
473 "<span class=\"ueditInheritNobody\"><sub>N</sub></span>";
474 }
475 free(z2);
476 }
477
478 /* Begin generating the page
@@ -489,10 +489,47 @@
489 if( login_is_special(zLogin) ){
490 @ <input type="hidden" name="login" value="%s(zLogin)">
491 @ <input type="hidden" name="info" value="">
492 @ <input type="hidden" name="pw" value="*">
493 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
494 @ <table>
495 @ <tr>
496 @ <td class="usetupEditLabel">User ID:</td>
497 if( uid ){
498 @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td>
@@ -516,64 +553,96 @@
516 @ <td class="usetupEditLabel">Capabilities:</td>
517 @ <td>
518 #define B(x) inherit[x]
519 @ <table border=0><tr><td valign="top">
520 if( g.perm.Setup ){
521 @ <label><input type="checkbox" name="as"%s(oa['s']) />
 
522 @ Setup%s(B('s'))</label><br />
523 }
524 @ <label><input type="checkbox" name="aa"%s(oa['a']) />
 
525 @ Admin%s(B('a'))</label><br />
526 @ <label><input type="checkbox" name="ad"%s(oa['d']) />
 
527 @ Delete%s(B('d'))</label><br />
528 @ <label><input type="checkbox" name="ae"%s(oa['e']) />
 
529 @ Email%s(B('e'))</label><br />
530 @ <label><input type="checkbox" name="ap"%s(oa['p']) />
 
531 @ Password%s(B('p'))</label><br />
532 @ <label><input type="checkbox" name="ai"%s(oa['i']) />
 
533 @ Check-In%s(B('i'))</label><br />
534 @ <label><input type="checkbox" name="ao"%s(oa['o']) />
 
535 @ Check-Out%s(B('o'))</label><br />
536 @ <label><input type="checkbox" name="ah"%s(oa['h']) />
 
537 @ Hyperlinks%s(B('h'))</label><br />
538 @ <label><input type="checkbox" name="ab"%s(oa['b']) />
 
539 @ Attachments%s(B('b'))</label><br />
540 @ </td><td><td width="40"></td><td valign="top">
541 @ <label><input type="checkbox" name="au"%s(oa['u']) />
 
542 @ Reader%s(B('u'))</label><br />
543 @ <label><input type="checkbox" name="av"%s(oa['v']) />
 
544 @ Developer%s(B('v'))</label><br />
545 @ <label><input type="checkbox" name="ag"%s(oa['g']) />
 
546 @ Clone%s(B('g'))</label><br />
547 @ <label><input type="checkbox" name="aj"%s(oa['j']) />
 
548 @ Read Wiki%s(B('j'))</label><br />
549 @ <label><input type="checkbox" name="af"%s(oa['f']) />
 
550 @ New Wiki%s(B('f'))</label><br />
551 @ <label><input type="checkbox" name="am"%s(oa['m']) />
 
552 @ Append Wiki%s(B('m'))</label><br />
553 @ <label><input type="checkbox" name="ak"%s(oa['k']) />
 
554 @ Write Wiki%s(B('k'))</label><br />
555 @ <label><input type="checkbox" name="al"%s(oa['l']) />
 
556 @ Moderate Wiki%s(B('l'))</label><br />
557 @ </td><td><td width="40"></td><td valign="top">
558 @ <label><input type="checkbox" name="ar"%s(oa['r']) />
 
559 @ Read Ticket%s(B('r'))</label><br />
560 @ <label><input type="checkbox" name="an"%s(oa['n']) />
 
561 @ New Tickets%s(B('n'))</label><br />
562 @ <label><input type="checkbox" name="ac"%s(oa['c']) />
 
563 @ Append To Ticket%s(B('c'))</label><br />
564 @ <label><input type="checkbox" name="aw"%s(oa['w']) />
 
565 @ Write Tickets%s(B('w'))</label><br />
566 @ <label><input type="checkbox" name="aq"%s(oa['q']) />
 
567 @ Moderate Tickets%s(B('q'))</label><br />
568 @ <label><input type="checkbox" name="at"%s(oa['t']) />
 
569 @ Ticket Report%s(B('t'))</label><br />
570 @ <label><input type="checkbox" name="ax"%s(oa['x']) />
 
571 @ Private%s(B('x'))</label><br />
572 @ <label><input type="checkbox" name="az"%s(oa['z']) />
 
573 @ Download Zip%s(B('z'))</label>
574 @ </td></tr></table>
 
 
 
 
 
 
 
575 @ </td>
576 @ </tr>
577 if( !login_is_special(zLogin) ){
578 @ <tr>
579 @ <td align="right">Password:</td>
@@ -604,10 +673,11 @@
604 @ </tr>
605 }
606 @ </table>
607 @ </div></form>
608 @ </div>
 
609 @ <h2>Privileges And Capabilities:</h2>
610 @ <ul>
611 if( higherUser ){
612 @ <li><p class="missingPriv">
613 @ User %h(zLogin) has Setup privileges and you only have Admin privileges
614
--- src/setup.c
+++ src/setup.c
@@ -307,11 +307,11 @@
307 int uid, i;
308 int higherUser = 0; /* True if user being edited is SETUP and the */
309 /* user doing the editing is ADMIN. Disallow editing */
310 char *inherit[128];
311 int a[128];
312 const char *oa[128];
313
314 /* Must have ADMIN privileges to access this page
315 */
316 login_check_credentials();
317 if( !g.perm.Admin ){ login_needed(); return; }
@@ -441,38 +441,38 @@
441 if( fossil_strcmp(zLogin, "developer") ){
442 char *z1, *z2;
443 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='developer'");
444 while( z1 && *z1 ){
445 inherit[0x7f & *(z1++)] =
446 "<span class=\"ueditInheritDeveloper\"><sub>[D]</sub></span>";
447 }
448 free(z2);
449 }
450 if( fossil_strcmp(zLogin, "reader") ){
451 char *z1, *z2;
452 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='reader'");
453 while( z1 && *z1 ){
454 inherit[0x7f & *(z1++)] =
455 "<span class=\"ueditInheritReader\"><sub>[R]</sub></span>";
456 }
457 free(z2);
458 }
459 if( fossil_strcmp(zLogin, "anonymous") ){
460 char *z1, *z2;
461 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='anonymous'");
462 while( z1 && *z1 ){
463 inherit[0x7f & *(z1++)] =
464 "<span class=\"ueditInheritAnonymous\"><sub>[A]</sub></span>";
465 }
466 free(z2);
467 }
468 if( fossil_strcmp(zLogin, "nobody") ){
469 char *z1, *z2;
470 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='nobody'");
471 while( z1 && *z1 ){
472 inherit[0x7f & *(z1++)] =
473 "<span class=\"ueditInheritNobody\"><sub>[N]</sub></span>";
474 }
475 free(z2);
476 }
477
478 /* Begin generating the page
@@ -489,10 +489,47 @@
489 if( login_is_special(zLogin) ){
490 @ <input type="hidden" name="login" value="%s(zLogin)">
491 @ <input type="hidden" name="info" value="">
492 @ <input type="hidden" name="pw" value="*">
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>
531 @ <table>
532 @ <tr>
533 @ <td class="usetupEditLabel">User ID:</td>
534 if( uid ){
535 @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td>
@@ -516,64 +553,96 @@
553 @ <td class="usetupEditLabel">Capabilities:</td>
554 @ <td>
555 #define B(x) inherit[x]
556 @ <table border=0><tr><td valign="top">
557 if( g.perm.Setup ){
558 @ <label><input type="checkbox" name="as"%s(oa['s'])
559 @ onchange="updateCapabilityString()"/>
560 @ Setup%s(B('s'))</label><br />
561 }
562 @ <label><input type="checkbox" name="aa"%s(oa['a'])
563 @ onchange="updateCapabilityString()" />
564 @ Admin%s(B('a'))</label><br />
565 @ <label><input type="checkbox" name="ad"%s(oa['d'])
566 @ onchange="updateCapabilityString()" />
567 @ Delete%s(B('d'))</label><br />
568 @ <label><input type="checkbox" name="ae"%s(oa['e'])
569 @ onchange="updateCapabilityString()" />
570 @ Email%s(B('e'))</label><br />
571 @ <label><input type="checkbox" name="ap"%s(oa['p'])
572 @ onchange="updateCapabilityString()" />
573 @ Password%s(B('p'))</label><br />
574 @ <label><input type="checkbox" name="ai"%s(oa['i'])
575 @ onchange="updateCapabilityString()" />
576 @ Check-In%s(B('i'))</label><br />
577 @ <label><input type="checkbox" name="ao"%s(oa['o'])
578 @ onchange="updateCapabilityString()" />
579 @ Check-Out%s(B('o'))</label><br />
580 @ <label><input type="checkbox" name="ah"%s(oa['h'])
581 @ onchange="updateCapabilityString()" />
582 @ Hyperlinks%s(B('h'))</label><br />
583 @ <label><input type="checkbox" name="ab"%s(oa['b'])
584 @ onchange="updateCapabilityString()" />
585 @ Attachments%s(B('b'))</label><br />
586 @ </td><td><td width="40"></td><td valign="top">
587 @ <label><input type="checkbox" name="au"%s(oa['u'])
588 @ onchange="updateCapabilityString()" />
589 @ Reader%s(B('u'))</label><br />
590 @ <label><input type="checkbox" name="av"%s(oa['v'])
591 @ onchange="updateCapabilityString()" />
592 @ Developer%s(B('v'))</label><br />
593 @ <label><input type="checkbox" name="ag"%s(oa['g'])
594 @ onchange="updateCapabilityString()" />
595 @ Clone%s(B('g'))</label><br />
596 @ <label><input type="checkbox" name="aj"%s(oa['j'])
597 @ onchange="updateCapabilityString()" />
598 @ Read Wiki%s(B('j'))</label><br />
599 @ <label><input type="checkbox" name="af"%s(oa['f'])
600 @ onchange="updateCapabilityString()" />
601 @ New Wiki%s(B('f'))</label><br />
602 @ <label><input type="checkbox" name="am"%s(oa['m'])
603 @ onchange="updateCapabilityString()" />
604 @ Append Wiki%s(B('m'))</label><br />
605 @ <label><input type="checkbox" name="ak"%s(oa['k'])
606 @ onchange="updateCapabilityString()" />
607 @ Write Wiki%s(B('k'))</label><br />
608 @ <label><input type="checkbox" name="al"%s(oa['l'])
609 @ onchange="updateCapabilityString()" />
610 @ Moderate Wiki%s(B('l'))</label><br />
611 @ </td><td><td width="40"></td><td valign="top">
612 @ <label><input type="checkbox" name="ar"%s(oa['r'])
613 @ onchange="updateCapabilityString()" />
614 @ Read Ticket%s(B('r'))</label><br />
615 @ <label><input type="checkbox" name="an"%s(oa['n'])
616 @ onchange="updateCapabilityString()" />
617 @ New Tickets%s(B('n'))</label><br />
618 @ <label><input type="checkbox" name="ac"%s(oa['c'])
619 @ onchange="updateCapabilityString()" />
620 @ Append To Ticket%s(B('c'))</label><br />
621 @ <label><input type="checkbox" name="aw"%s(oa['w'])
622 @ onchange="updateCapabilityString()" />
623 @ Write Tickets%s(B('w'))</label><br />
624 @ <label><input type="checkbox" name="aq"%s(oa['q'])
625 @ onchange="updateCapabilityString()" />
626 @ Moderate Tickets%s(B('q'))</label><br />
627 @ <label><input type="checkbox" name="at"%s(oa['t'])
628 @ onchange="updateCapabilityString()" />
629 @ Ticket Report%s(B('t'))</label><br />
630 @ <label><input type="checkbox" name="ax"%s(oa['x'])
631 @ onchange="updateCapabilityString()" />
632 @ Private%s(B('x'))</label><br />
633 @ <label><input type="checkbox" name="az"%s(oa['z'])
634 @ onchange="updateCapabilityString()" />
635 @ Download Zip%s(B('z'))</label>
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>
644 @ </td>
645 @ </tr>
646 if( !login_is_special(zLogin) ){
647 @ <tr>
648 @ <td align="right">Password:</td>
@@ -604,10 +673,11 @@
673 @ </tr>
674 }
675 @ </table>
676 @ </div></form>
677 @ </div>
678 @ <script type='text/javascript'>updateCapabilityString();</script>
679 @ <h2>Privileges And Capabilities:</h2>
680 @ <ul>
681 if( higherUser ){
682 @ <li><p class="missingPriv">
683 @ User %h(zLogin) has Setup privileges and you only have Admin privileges
684
+101 -31
--- src/setup.c
+++ src/setup.c
@@ -307,11 +307,11 @@
307307
int uid, i;
308308
int higherUser = 0; /* True if user being edited is SETUP and the */
309309
/* user doing the editing is ADMIN. Disallow editing */
310310
char *inherit[128];
311311
int a[128];
312
- char *oa[128];
312
+ const char *oa[128];
313313
314314
/* Must have ADMIN privileges to access this page
315315
*/
316316
login_check_credentials();
317317
if( !g.perm.Admin ){ login_needed(); return; }
@@ -441,38 +441,38 @@
441441
if( fossil_strcmp(zLogin, "developer") ){
442442
char *z1, *z2;
443443
z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='developer'");
444444
while( z1 && *z1 ){
445445
inherit[0x7f & *(z1++)] =
446
- "<span class=\"ueditInheritDeveloper\"><sub>D</sub></span>";
446
+ "<span class=\"ueditInheritDeveloper\"><sub>[D]</sub></span>";
447447
}
448448
free(z2);
449449
}
450450
if( fossil_strcmp(zLogin, "reader") ){
451451
char *z1, *z2;
452452
z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='reader'");
453453
while( z1 && *z1 ){
454454
inherit[0x7f & *(z1++)] =
455
- "<span class=\"ueditInheritReader\"><sub>R</sub></span>";
455
+ "<span class=\"ueditInheritReader\"><sub>[R]</sub></span>";
456456
}
457457
free(z2);
458458
}
459459
if( fossil_strcmp(zLogin, "anonymous") ){
460460
char *z1, *z2;
461461
z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='anonymous'");
462462
while( z1 && *z1 ){
463463
inherit[0x7f & *(z1++)] =
464
- "<span class=\"ueditInheritAnonymous\"><sub>A</sub></span>";
464
+ "<span class=\"ueditInheritAnonymous\"><sub>[A]</sub></span>";
465465
}
466466
free(z2);
467467
}
468468
if( fossil_strcmp(zLogin, "nobody") ){
469469
char *z1, *z2;
470470
z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='nobody'");
471471
while( z1 && *z1 ){
472472
inherit[0x7f & *(z1++)] =
473
- "<span class=\"ueditInheritNobody\"><sub>N</sub></span>";
473
+ "<span class=\"ueditInheritNobody\"><sub>[N]</sub></span>";
474474
}
475475
free(z2);
476476
}
477477
478478
/* Begin generating the page
@@ -489,10 +489,47 @@
489489
if( login_is_special(zLogin) ){
490490
@ <input type="hidden" name="login" value="%s(zLogin)">
491491
@ <input type="hidden" name="info" value="">
492492
@ <input type="hidden" name="pw" value="*">
493493
}
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>
494531
@ <table>
495532
@ <tr>
496533
@ <td class="usetupEditLabel">User ID:</td>
497534
if( uid ){
498535
@ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td>
@@ -516,64 +553,96 @@
516553
@ <td class="usetupEditLabel">Capabilities:</td>
517554
@ <td>
518555
#define B(x) inherit[x]
519556
@ <table border=0><tr><td valign="top">
520557
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()"/>
522560
@ Setup%s(B('s'))</label><br />
523561
}
524
- @ <label><input type="checkbox" name="aa"%s(oa['a']) />
562
+ @ <label><input type="checkbox" name="aa"%s(oa['a'])
563
+ @ onchange="updateCapabilityString()" />
525564
@ 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()" />
527567
@ 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()" />
529570
@ 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()" />
531573
@ 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()" />
533576
@ 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()" />
535579
@ 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()" />
537582
@ 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()" />
539585
@ Attachments%s(B('b'))</label><br />
540586
@ </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()" />
542589
@ 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()" />
544592
@ 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()" />
546595
@ 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()" />
548598
@ 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()" />
550601
@ 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()" />
552604
@ 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()" />
554607
@ 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()" />
556610
@ Moderate Wiki%s(B('l'))</label><br />
557611
@ </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()" />
559614
@ 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()" />
561617
@ 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()" />
563620
@ 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()" />
565623
@ 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()" />
567626
@ 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()" />
569629
@ 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()" />
571632
@ 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()" />
573635
@ 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>
575644
@ </td>
576645
@ </tr>
577646
if( !login_is_special(zLogin) ){
578647
@ <tr>
579648
@ <td align="right">Password:</td>
@@ -604,10 +673,11 @@
604673
@ </tr>
605674
}
606675
@ </table>
607676
@ </div></form>
608677
@ </div>
678
+ @ <script type='text/javascript'>updateCapabilityString();</script>
609679
@ <h2>Privileges And Capabilities:</h2>
610680
@ <ul>
611681
if( higherUser ){
612682
@ <li><p class="missingPriv">
613683
@ User %h(zLogin) has Setup privileges and you only have Admin privileges
614684
--- src/setup.c
+++ src/setup.c
@@ -307,11 +307,11 @@
307 int uid, i;
308 int higherUser = 0; /* True if user being edited is SETUP and the */
309 /* user doing the editing is ADMIN. Disallow editing */
310 char *inherit[128];
311 int a[128];
312 char *oa[128];
313
314 /* Must have ADMIN privileges to access this page
315 */
316 login_check_credentials();
317 if( !g.perm.Admin ){ login_needed(); return; }
@@ -441,38 +441,38 @@
441 if( fossil_strcmp(zLogin, "developer") ){
442 char *z1, *z2;
443 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='developer'");
444 while( z1 && *z1 ){
445 inherit[0x7f & *(z1++)] =
446 "<span class=\"ueditInheritDeveloper\"><sub>D</sub></span>";
447 }
448 free(z2);
449 }
450 if( fossil_strcmp(zLogin, "reader") ){
451 char *z1, *z2;
452 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='reader'");
453 while( z1 && *z1 ){
454 inherit[0x7f & *(z1++)] =
455 "<span class=\"ueditInheritReader\"><sub>R</sub></span>";
456 }
457 free(z2);
458 }
459 if( fossil_strcmp(zLogin, "anonymous") ){
460 char *z1, *z2;
461 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='anonymous'");
462 while( z1 && *z1 ){
463 inherit[0x7f & *(z1++)] =
464 "<span class=\"ueditInheritAnonymous\"><sub>A</sub></span>";
465 }
466 free(z2);
467 }
468 if( fossil_strcmp(zLogin, "nobody") ){
469 char *z1, *z2;
470 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='nobody'");
471 while( z1 && *z1 ){
472 inherit[0x7f & *(z1++)] =
473 "<span class=\"ueditInheritNobody\"><sub>N</sub></span>";
474 }
475 free(z2);
476 }
477
478 /* Begin generating the page
@@ -489,10 +489,47 @@
489 if( login_is_special(zLogin) ){
490 @ <input type="hidden" name="login" value="%s(zLogin)">
491 @ <input type="hidden" name="info" value="">
492 @ <input type="hidden" name="pw" value="*">
493 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
494 @ <table>
495 @ <tr>
496 @ <td class="usetupEditLabel">User ID:</td>
497 if( uid ){
498 @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td>
@@ -516,64 +553,96 @@
516 @ <td class="usetupEditLabel">Capabilities:</td>
517 @ <td>
518 #define B(x) inherit[x]
519 @ <table border=0><tr><td valign="top">
520 if( g.perm.Setup ){
521 @ <label><input type="checkbox" name="as"%s(oa['s']) />
 
522 @ Setup%s(B('s'))</label><br />
523 }
524 @ <label><input type="checkbox" name="aa"%s(oa['a']) />
 
525 @ Admin%s(B('a'))</label><br />
526 @ <label><input type="checkbox" name="ad"%s(oa['d']) />
 
527 @ Delete%s(B('d'))</label><br />
528 @ <label><input type="checkbox" name="ae"%s(oa['e']) />
 
529 @ Email%s(B('e'))</label><br />
530 @ <label><input type="checkbox" name="ap"%s(oa['p']) />
 
531 @ Password%s(B('p'))</label><br />
532 @ <label><input type="checkbox" name="ai"%s(oa['i']) />
 
533 @ Check-In%s(B('i'))</label><br />
534 @ <label><input type="checkbox" name="ao"%s(oa['o']) />
 
535 @ Check-Out%s(B('o'))</label><br />
536 @ <label><input type="checkbox" name="ah"%s(oa['h']) />
 
537 @ Hyperlinks%s(B('h'))</label><br />
538 @ <label><input type="checkbox" name="ab"%s(oa['b']) />
 
539 @ Attachments%s(B('b'))</label><br />
540 @ </td><td><td width="40"></td><td valign="top">
541 @ <label><input type="checkbox" name="au"%s(oa['u']) />
 
542 @ Reader%s(B('u'))</label><br />
543 @ <label><input type="checkbox" name="av"%s(oa['v']) />
 
544 @ Developer%s(B('v'))</label><br />
545 @ <label><input type="checkbox" name="ag"%s(oa['g']) />
 
546 @ Clone%s(B('g'))</label><br />
547 @ <label><input type="checkbox" name="aj"%s(oa['j']) />
 
548 @ Read Wiki%s(B('j'))</label><br />
549 @ <label><input type="checkbox" name="af"%s(oa['f']) />
 
550 @ New Wiki%s(B('f'))</label><br />
551 @ <label><input type="checkbox" name="am"%s(oa['m']) />
 
552 @ Append Wiki%s(B('m'))</label><br />
553 @ <label><input type="checkbox" name="ak"%s(oa['k']) />
 
554 @ Write Wiki%s(B('k'))</label><br />
555 @ <label><input type="checkbox" name="al"%s(oa['l']) />
 
556 @ Moderate Wiki%s(B('l'))</label><br />
557 @ </td><td><td width="40"></td><td valign="top">
558 @ <label><input type="checkbox" name="ar"%s(oa['r']) />
 
559 @ Read Ticket%s(B('r'))</label><br />
560 @ <label><input type="checkbox" name="an"%s(oa['n']) />
 
561 @ New Tickets%s(B('n'))</label><br />
562 @ <label><input type="checkbox" name="ac"%s(oa['c']) />
 
563 @ Append To Ticket%s(B('c'))</label><br />
564 @ <label><input type="checkbox" name="aw"%s(oa['w']) />
 
565 @ Write Tickets%s(B('w'))</label><br />
566 @ <label><input type="checkbox" name="aq"%s(oa['q']) />
 
567 @ Moderate Tickets%s(B('q'))</label><br />
568 @ <label><input type="checkbox" name="at"%s(oa['t']) />
 
569 @ Ticket Report%s(B('t'))</label><br />
570 @ <label><input type="checkbox" name="ax"%s(oa['x']) />
 
571 @ Private%s(B('x'))</label><br />
572 @ <label><input type="checkbox" name="az"%s(oa['z']) />
 
573 @ Download Zip%s(B('z'))</label>
574 @ </td></tr></table>
 
 
 
 
 
 
 
575 @ </td>
576 @ </tr>
577 if( !login_is_special(zLogin) ){
578 @ <tr>
579 @ <td align="right">Password:</td>
@@ -604,10 +673,11 @@
604 @ </tr>
605 }
606 @ </table>
607 @ </div></form>
608 @ </div>
 
609 @ <h2>Privileges And Capabilities:</h2>
610 @ <ul>
611 if( higherUser ){
612 @ <li><p class="missingPriv">
613 @ User %h(zLogin) has Setup privileges and you only have Admin privileges
614
--- src/setup.c
+++ src/setup.c
@@ -307,11 +307,11 @@
307 int uid, i;
308 int higherUser = 0; /* True if user being edited is SETUP and the */
309 /* user doing the editing is ADMIN. Disallow editing */
310 char *inherit[128];
311 int a[128];
312 const char *oa[128];
313
314 /* Must have ADMIN privileges to access this page
315 */
316 login_check_credentials();
317 if( !g.perm.Admin ){ login_needed(); return; }
@@ -441,38 +441,38 @@
441 if( fossil_strcmp(zLogin, "developer") ){
442 char *z1, *z2;
443 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='developer'");
444 while( z1 && *z1 ){
445 inherit[0x7f & *(z1++)] =
446 "<span class=\"ueditInheritDeveloper\"><sub>[D]</sub></span>";
447 }
448 free(z2);
449 }
450 if( fossil_strcmp(zLogin, "reader") ){
451 char *z1, *z2;
452 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='reader'");
453 while( z1 && *z1 ){
454 inherit[0x7f & *(z1++)] =
455 "<span class=\"ueditInheritReader\"><sub>[R]</sub></span>";
456 }
457 free(z2);
458 }
459 if( fossil_strcmp(zLogin, "anonymous") ){
460 char *z1, *z2;
461 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='anonymous'");
462 while( z1 && *z1 ){
463 inherit[0x7f & *(z1++)] =
464 "<span class=\"ueditInheritAnonymous\"><sub>[A]</sub></span>";
465 }
466 free(z2);
467 }
468 if( fossil_strcmp(zLogin, "nobody") ){
469 char *z1, *z2;
470 z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='nobody'");
471 while( z1 && *z1 ){
472 inherit[0x7f & *(z1++)] =
473 "<span class=\"ueditInheritNobody\"><sub>[N]</sub></span>";
474 }
475 free(z2);
476 }
477
478 /* Begin generating the page
@@ -489,10 +489,47 @@
489 if( login_is_special(zLogin) ){
490 @ <input type="hidden" name="login" value="%s(zLogin)">
491 @ <input type="hidden" name="info" value="">
492 @ <input type="hidden" name="pw" value="*">
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>
531 @ <table>
532 @ <tr>
533 @ <td class="usetupEditLabel">User ID:</td>
534 if( uid ){
535 @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td>
@@ -516,64 +553,96 @@
553 @ <td class="usetupEditLabel">Capabilities:</td>
554 @ <td>
555 #define B(x) inherit[x]
556 @ <table border=0><tr><td valign="top">
557 if( g.perm.Setup ){
558 @ <label><input type="checkbox" name="as"%s(oa['s'])
559 @ onchange="updateCapabilityString()"/>
560 @ Setup%s(B('s'))</label><br />
561 }
562 @ <label><input type="checkbox" name="aa"%s(oa['a'])
563 @ onchange="updateCapabilityString()" />
564 @ Admin%s(B('a'))</label><br />
565 @ <label><input type="checkbox" name="ad"%s(oa['d'])
566 @ onchange="updateCapabilityString()" />
567 @ Delete%s(B('d'))</label><br />
568 @ <label><input type="checkbox" name="ae"%s(oa['e'])
569 @ onchange="updateCapabilityString()" />
570 @ Email%s(B('e'))</label><br />
571 @ <label><input type="checkbox" name="ap"%s(oa['p'])
572 @ onchange="updateCapabilityString()" />
573 @ Password%s(B('p'))</label><br />
574 @ <label><input type="checkbox" name="ai"%s(oa['i'])
575 @ onchange="updateCapabilityString()" />
576 @ Check-In%s(B('i'))</label><br />
577 @ <label><input type="checkbox" name="ao"%s(oa['o'])
578 @ onchange="updateCapabilityString()" />
579 @ Check-Out%s(B('o'))</label><br />
580 @ <label><input type="checkbox" name="ah"%s(oa['h'])
581 @ onchange="updateCapabilityString()" />
582 @ Hyperlinks%s(B('h'))</label><br />
583 @ <label><input type="checkbox" name="ab"%s(oa['b'])
584 @ onchange="updateCapabilityString()" />
585 @ Attachments%s(B('b'))</label><br />
586 @ </td><td><td width="40"></td><td valign="top">
587 @ <label><input type="checkbox" name="au"%s(oa['u'])
588 @ onchange="updateCapabilityString()" />
589 @ Reader%s(B('u'))</label><br />
590 @ <label><input type="checkbox" name="av"%s(oa['v'])
591 @ onchange="updateCapabilityString()" />
592 @ Developer%s(B('v'))</label><br />
593 @ <label><input type="checkbox" name="ag"%s(oa['g'])
594 @ onchange="updateCapabilityString()" />
595 @ Clone%s(B('g'))</label><br />
596 @ <label><input type="checkbox" name="aj"%s(oa['j'])
597 @ onchange="updateCapabilityString()" />
598 @ Read Wiki%s(B('j'))</label><br />
599 @ <label><input type="checkbox" name="af"%s(oa['f'])
600 @ onchange="updateCapabilityString()" />
601 @ New Wiki%s(B('f'))</label><br />
602 @ <label><input type="checkbox" name="am"%s(oa['m'])
603 @ onchange="updateCapabilityString()" />
604 @ Append Wiki%s(B('m'))</label><br />
605 @ <label><input type="checkbox" name="ak"%s(oa['k'])
606 @ onchange="updateCapabilityString()" />
607 @ Write Wiki%s(B('k'))</label><br />
608 @ <label><input type="checkbox" name="al"%s(oa['l'])
609 @ onchange="updateCapabilityString()" />
610 @ Moderate Wiki%s(B('l'))</label><br />
611 @ </td><td><td width="40"></td><td valign="top">
612 @ <label><input type="checkbox" name="ar"%s(oa['r'])
613 @ onchange="updateCapabilityString()" />
614 @ Read Ticket%s(B('r'))</label><br />
615 @ <label><input type="checkbox" name="an"%s(oa['n'])
616 @ onchange="updateCapabilityString()" />
617 @ New Tickets%s(B('n'))</label><br />
618 @ <label><input type="checkbox" name="ac"%s(oa['c'])
619 @ onchange="updateCapabilityString()" />
620 @ Append To Ticket%s(B('c'))</label><br />
621 @ <label><input type="checkbox" name="aw"%s(oa['w'])
622 @ onchange="updateCapabilityString()" />
623 @ Write Tickets%s(B('w'))</label><br />
624 @ <label><input type="checkbox" name="aq"%s(oa['q'])
625 @ onchange="updateCapabilityString()" />
626 @ Moderate Tickets%s(B('q'))</label><br />
627 @ <label><input type="checkbox" name="at"%s(oa['t'])
628 @ onchange="updateCapabilityString()" />
629 @ Ticket Report%s(B('t'))</label><br />
630 @ <label><input type="checkbox" name="ax"%s(oa['x'])
631 @ onchange="updateCapabilityString()" />
632 @ Private%s(B('x'))</label><br />
633 @ <label><input type="checkbox" name="az"%s(oa['z'])
634 @ onchange="updateCapabilityString()" />
635 @ Download Zip%s(B('z'))</label>
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>
644 @ </td>
645 @ </tr>
646 if( !login_is_special(zLogin) ){
647 @ <tr>
648 @ <td align="right">Password:</td>
@@ -604,10 +673,11 @@
673 @ </tr>
674 }
675 @ </table>
676 @ </div></form>
677 @ </div>
678 @ <script type='text/javascript'>updateCapabilityString();</script>
679 @ <h2>Privileges And Capabilities:</h2>
680 @ <ul>
681 if( higherUser ){
682 @ <li><p class="missingPriv">
683 @ User %h(zLogin) has Setup privileges and you only have Admin privileges
684
--- src/style.c
+++ src/style.c
@@ -934,22 +934,26 @@
934934
@ white-space: nowrap;
935935
},
936936
{ "span.ueditInheritNobody",
937937
"color for capabilities, inherited by nobody",
938938
@ color: green;
939
+ @ padding: .2em;
939940
},
940941
{ "span.ueditInheritDeveloper",
941942
"color for capabilities, inherited by developer",
942943
@ color: red;
944
+ @ padding: .2em;
943945
},
944946
{ "span.ueditInheritReader",
945947
"color for capabilities, inherited by reader",
946948
@ color: black;
949
+ @ padding: .2em;
947950
},
948951
{ "span.ueditInheritAnonymous",
949952
"color for capabilities, inherited by anonymous",
950953
@ color: blue;
954
+ @ padding: .2em;
951955
},
952956
{ "span.capability",
953957
"format for capabilities, mentioned on the user edit page",
954958
@ font-weight: bold;
955959
},
@@ -1191,10 +1195,14 @@
11911195
@ /* use default */
11921196
},
11931197
{ "tr.row1",
11941198
"odd table row color",
11951199
@ /* Use default */
1200
+ },
1201
+ { "#usetupEditCapability",
1202
+ "format for capabilities string, mentioned on the user edit page",
1203
+ @ font-weight: bold;
11961204
},
11971205
{ "#canvas", "timeline graph node colors",
11981206
@ color: black;
11991207
@ background-color: white;
12001208
},
12011209
--- src/style.c
+++ src/style.c
@@ -934,22 +934,26 @@
934 @ white-space: nowrap;
935 },
936 { "span.ueditInheritNobody",
937 "color for capabilities, inherited by nobody",
938 @ color: green;
 
939 },
940 { "span.ueditInheritDeveloper",
941 "color for capabilities, inherited by developer",
942 @ color: red;
 
943 },
944 { "span.ueditInheritReader",
945 "color for capabilities, inherited by reader",
946 @ color: black;
 
947 },
948 { "span.ueditInheritAnonymous",
949 "color for capabilities, inherited by anonymous",
950 @ color: blue;
 
951 },
952 { "span.capability",
953 "format for capabilities, mentioned on the user edit page",
954 @ font-weight: bold;
955 },
@@ -1191,10 +1195,14 @@
1191 @ /* use default */
1192 },
1193 { "tr.row1",
1194 "odd table row color",
1195 @ /* Use default */
 
 
 
 
1196 },
1197 { "#canvas", "timeline graph node colors",
1198 @ color: black;
1199 @ background-color: white;
1200 },
1201
--- src/style.c
+++ src/style.c
@@ -934,22 +934,26 @@
934 @ white-space: nowrap;
935 },
936 { "span.ueditInheritNobody",
937 "color for capabilities, inherited by nobody",
938 @ color: green;
939 @ padding: .2em;
940 },
941 { "span.ueditInheritDeveloper",
942 "color for capabilities, inherited by developer",
943 @ color: red;
944 @ padding: .2em;
945 },
946 { "span.ueditInheritReader",
947 "color for capabilities, inherited by reader",
948 @ color: black;
949 @ padding: .2em;
950 },
951 { "span.ueditInheritAnonymous",
952 "color for capabilities, inherited by anonymous",
953 @ color: blue;
954 @ padding: .2em;
955 },
956 { "span.capability",
957 "format for capabilities, mentioned on the user edit page",
958 @ font-weight: bold;
959 },
@@ -1191,10 +1195,14 @@
1195 @ /* use default */
1196 },
1197 { "tr.row1",
1198 "odd table row color",
1199 @ /* Use default */
1200 },
1201 { "#usetupEditCapability",
1202 "format for capabilities string, mentioned on the user edit page",
1203 @ font-weight: bold;
1204 },
1205 { "#canvas", "timeline graph node colors",
1206 @ color: black;
1207 @ background-color: white;
1208 },
1209

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button