Fossil SCM

Use colored bullets to indicate the privileges of "nobody", "anonymous", and "developer" on the user edit page.

drh 2008-11-22 18:16 trunk
Commit 77bdac3b195d12f7e0f8fdd12cf9313cd4008559
1 file changed +75 -38
+75 -38
--- src/setup.c
+++ src/setup.c
@@ -200,14 +200,10 @@
200200
@ <li><p>
201201
@ Users with privilege <b>v</b> inherit the combined privileges of
202202
@ <b>developer</b>, <b>anonymous</b>, and <b>nobody</b>.
203203
@ </p></li>
204204
@
205
- @ <li><p>
206
- @ A blank password disables login for a user.
207
- @ </p></li>
208
- @
209205
@ </ol>
210206
@ </td></tr></table>
211207
style_footer();
212208
}
213209
@@ -231,10 +227,11 @@
231227
void user_edit(void){
232228
const char *zId, *zLogin, *zInfo, *zCap, *zPw;
233229
char *oaa, *oas, *oar, *oaw, *oan, *oai, *oaj, *oao, *oap;
234230
char *oak, *oad, *oac, *oaf, *oam, *oah, *oag, *oae;
235231
char *oat, *oav, *oaz;
232
+ const char *inherit[128];
236233
int doWrite;
237234
int uid;
238235
int higherUser = 0; /* True if user being edited is SETUP and the */
239236
/* user doing the editing is ADMIN. Disallow editing */
240237
@@ -367,10 +364,37 @@
367364
if( strchr(zCap, 't') ) oat = " checked";
368365
if( strchr(zCap, 'v') ) oav = " checked";
369366
if( strchr(zCap, 'w') ) oaw = " checked";
370367
if( strchr(zCap, 'z') ) oaz = " checked";
371368
}
369
+
370
+ /* figure out inherited permissions */
371
+ memset(inherit, 0, sizeof(inherit));
372
+ if( strcmp(zLogin, "developer") ){
373
+ char *z1, *z2;
374
+ z1 = z2 = db_text("","SELECT cap FROM user WHERE login='developer'");
375
+ while( *z1 ){
376
+ inherit[0x7f & *(z1++)] = "<font color=\"red\">&#149;</font>";
377
+ }
378
+ free(z2);
379
+ }
380
+ if( strcmp(zLogin, "anonymous") ){
381
+ char *z1, *z2;
382
+ z1 = z2 = db_text("","SELECT cap FROM user WHERE login='anonymous'");
383
+ while( *z1 ){
384
+ inherit[0x7f & *(z1++)] = "<font color=\"blue\">&#149;</font>";
385
+ }
386
+ free(z2);
387
+ }
388
+ if( strcmp(zLogin, "nobody") ){
389
+ char *z1, *z2;
390
+ z1 = z2 = db_text("","SELECT cap FROM user WHERE login='nobody'");
391
+ while( *z1 ){
392
+ inherit[0x7f & *(z1++)] = "<font color=\"green\">&#149;</font>";
393
+ }
394
+ free(z2);
395
+ }
372396
373397
/* Begin generating the page
374398
*/
375399
style_submenu_element("Cancel", "Cancel", "setup_ulist");
376400
if( uid ){
@@ -399,32 +423,33 @@
399423
@ <td><input type="text" name="info" size=40 value="%h(zInfo)"></td>
400424
@ </tr>
401425
@ <tr>
402426
@ <td align="right" valign="top">Capabilities:</td>
403427
@ <td>
428
+#define B(x) inherit[x]
404429
if( g.okSetup ){
405
- @ <input type="checkbox" name="as"%s(oas)>Setup</input><br>
406
- }
407
- @ <input type="checkbox" name="aa"%s(oaa)>Admin</input><br>
408
- @ <input type="checkbox" name="ad"%s(oad)>Delete</input><br>
409
- @ <input type="checkbox" name="ae"%s(oad)>Email</input><br>
410
- @ <input type="checkbox" name="ap"%s(oap)>Password</input><br>
411
- @ <input type="checkbox" name="ai"%s(oai)>Check-In</input><br>
412
- @ <input type="checkbox" name="ao"%s(oao)>Check-Out</input><br>
413
- @ <input type="checkbox" name="ah"%s(oah)>History</input><br>
414
- @ <input type="checkbox" name="av"%s(oav)>Developer</input><br>
415
- @ <input type="checkbox" name="ag"%s(oag)>Clone</input><br>
416
- @ <input type="checkbox" name="aj"%s(oaj)>Read Wiki</input><br>
417
- @ <input type="checkbox" name="af"%s(oaf)>New Wiki</input><br>
418
- @ <input type="checkbox" name="am"%s(oam)>Append Wiki</input><br>
419
- @ <input type="checkbox" name="ak"%s(oak)>Write Wiki</input><br>
420
- @ <input type="checkbox" name="ar"%s(oar)>Read Tkt</input><br>
421
- @ <input type="checkbox" name="an"%s(oan)>New Tkt</input><br>
422
- @ <input type="checkbox" name="ac"%s(oac)>Append Tkt</input><br>
423
- @ <input type="checkbox" name="aw"%s(oaw)>Write Tkt</input><br>
424
- @ <input type="checkbox" name="at"%s(oat)>Tkt Report</input><br>
425
- @ <input type="checkbox" name="az"%s(oaz)>Download Zip</input>
430
+ @ <input type="checkbox" name="as"%s(oas)>%s(B('s'))Setup</input><br>
431
+ }
432
+ @ <input type="checkbox" name="aa"%s(oaa)>%s(B('a'))Admin</input><br>
433
+ @ <input type="checkbox" name="ad"%s(oad)>%s(B('d'))Delete</input><br>
434
+ @ <input type="checkbox" name="ae"%s(oae)>%s(B('e'))Email</input><br>
435
+ @ <input type="checkbox" name="ap"%s(oap)>%s(B('p'))Password</input><br>
436
+ @ <input type="checkbox" name="ai"%s(oai)>%s(B('i'))Check-In</input><br>
437
+ @ <input type="checkbox" name="ao"%s(oao)>%s(B('o'))Check-Out</input><br>
438
+ @ <input type="checkbox" name="ah"%s(oah)>%s(B('h'))History</input><br>
439
+ @ <input type="checkbox" name="av"%s(oav)>%s(B('v'))Developer</input><br>
440
+ @ <input type="checkbox" name="ag"%s(oag)>%s(B('g'))Clone</input><br>
441
+ @ <input type="checkbox" name="aj"%s(oaj)>%s(B('j'))Read Wiki</input><br>
442
+ @ <input type="checkbox" name="af"%s(oaf)>%s(B('f'))New Wiki</input><br>
443
+ @ <input type="checkbox" name="am"%s(oam)>%s(B('m'))Append Wiki</input><br>
444
+ @ <input type="checkbox" name="ak"%s(oak)>%s(B('k'))Write Wiki</input><br>
445
+ @ <input type="checkbox" name="ar"%s(oar)>%s(B('r'))Read Tkt</input><br>
446
+ @ <input type="checkbox" name="an"%s(oan)>%s(B('n'))New Tkt</input><br>
447
+ @ <input type="checkbox" name="ac"%s(oac)>%s(B('c'))Append Tkt</input><br>
448
+ @ <input type="checkbox" name="aw"%s(oaw)>%s(B('w'))Write Tkt</input><br>
449
+ @ <input type="checkbox" name="at"%s(oat)>%s(B('t'))Tkt Report</input><br>
450
+ @ <input type="checkbox" name="az"%s(oaz)>%s(B('z'))Download Zip</input>
426451
@ </td>
427452
@ </tr>
428453
@ <tr>
429454
@ <td align="right">Password:</td>
430455
if( strcmp(zLogin, "anonymous")==0 ){
@@ -452,18 +477,34 @@
452477
@ User %h(zLogin) has Setup privileges and you only have Admin privileges
453478
@ so you are not permitted to make changes to %h(zLogin).
454479
@ </b></font></p></li>
455480
@
456481
}
457
- @
458482
@ <li><p>
459483
@ The <b>Setup</b> user can make arbitrary configuration changes.
460484
@ An <b>Admin</b> user can add other users and change user privileges
461485
@ and reset user passwords. Both automatically get all other privileges
462486
@ listed below. Use these two settings with discretion.
463487
@ </p></li>
464488
@
489
+ @ <li><p>
490
+ @ The "<font color="green"><big>&#149;</big></font>" mark indicates
491
+ @ the privileges of "nobody" that are available to all users
492
+ @ regardless of whether or not they are logged in.
493
+ @ </p></li>
494
+ @
495
+ @ <li><p>
496
+ @ The "<font color="blue"><big>&#149;</big></font>" mark indicates
497
+ @ the privileges of "anonymous" that are inherited by all logged-in users.
498
+ @ </p></li>
499
+ @
500
+ @ <li><p>
501
+ @ The "<font color="red"><big>&#149;</big></font>" mark indicates
502
+ @ the privileges of "developer" that are inherited by all users with
503
+ @ the <b>Developer</b> privilege.
504
+ @ </p></li>
505
+ @
465506
@ <li><p>
466507
@ The <b>Delete</b> privilege give the user the ability to erase
467508
@ wiki, tickets, and attachments that have been added by anonymous
468509
@ users. This capability is intended for deletion of spam. The
469510
@ delete capability is only in effect for 24 hours after the item
@@ -476,21 +517,16 @@
476517
@ user "nobody" to avoid problems with spiders trying to walk every
477518
@ historical version of every baseline and file.
478519
@ </p></li>
479520
@
480521
@ <li><p>
481
- @ The <b>Zip</b> privilege allows a user to see the download as zip hyperlink
482
- @ as well as permit access to the <tt>/zip</tt> page. It can be allowed for
483
- @ user "nobody" to grant him access to download artifacts he know from the
484
- @ server without giving him other rights like <b>Read</b> or <b>History</b>.
485
- @ So automatic package dowloaders could be able to obtain the sources without
486
- @ going thru the login procedure.
487
- @ </p></li>
488
- @
489
- @ <li><p>
490
- @ The <b>Developer</b> privilege causes all privileges of the user
491
- @ named "developer" to be inherited by this user.
522
+ @ The <b>Zip</b> privilege allows a user to see the "download as ZIP"
523
+ @ hyperlink and permits access to the <tt>/zip</tt> page. This allows
524
+ @ users to download ZIP archives without granting other rights like
525
+ @ <b>Read</b> or <b>History</b>. This privilege is recommended for
526
+ @ user <b>nobody</b> so that automatic package downloaders can obtain
527
+ @ the sources without going through the login procedure.
492528
@ </p></li>
493529
@
494530
@ <li><p>
495531
@ The <b>Check-in</b> privilege allows remote users to "push".
496532
@ The <b>Check-out</b> privilege allows remote users to "pull".
@@ -513,11 +549,12 @@
513549
@ </p></li>
514550
@
515551
@ <li><p>
516552
@ The <b>EMail</b> privilege allows the display of sensitive information
517553
@ such as the email address of users and contact information on tickets.
518
- @ Recommended OFF for "anonymous" and for "nobody".
554
+ @ Recommended OFF for "anonymous" and for "nobody" but ON for
555
+ @ "developer".
519556
@ </p></li>
520557
@
521558
@ <li><p>
522559
@ Login is prohibited if the password is an empty string.
523560
@ </p></li>
524561
--- src/setup.c
+++ src/setup.c
@@ -200,14 +200,10 @@
200 @ <li><p>
201 @ Users with privilege <b>v</b> inherit the combined privileges of
202 @ <b>developer</b>, <b>anonymous</b>, and <b>nobody</b>.
203 @ </p></li>
204 @
205 @ <li><p>
206 @ A blank password disables login for a user.
207 @ </p></li>
208 @
209 @ </ol>
210 @ </td></tr></table>
211 style_footer();
212 }
213
@@ -231,10 +227,11 @@
231 void user_edit(void){
232 const char *zId, *zLogin, *zInfo, *zCap, *zPw;
233 char *oaa, *oas, *oar, *oaw, *oan, *oai, *oaj, *oao, *oap;
234 char *oak, *oad, *oac, *oaf, *oam, *oah, *oag, *oae;
235 char *oat, *oav, *oaz;
 
236 int doWrite;
237 int uid;
238 int higherUser = 0; /* True if user being edited is SETUP and the */
239 /* user doing the editing is ADMIN. Disallow editing */
240
@@ -367,10 +364,37 @@
367 if( strchr(zCap, 't') ) oat = " checked";
368 if( strchr(zCap, 'v') ) oav = " checked";
369 if( strchr(zCap, 'w') ) oaw = " checked";
370 if( strchr(zCap, 'z') ) oaz = " checked";
371 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
372
373 /* Begin generating the page
374 */
375 style_submenu_element("Cancel", "Cancel", "setup_ulist");
376 if( uid ){
@@ -399,32 +423,33 @@
399 @ <td><input type="text" name="info" size=40 value="%h(zInfo)"></td>
400 @ </tr>
401 @ <tr>
402 @ <td align="right" valign="top">Capabilities:</td>
403 @ <td>
 
404 if( g.okSetup ){
405 @ <input type="checkbox" name="as"%s(oas)>Setup</input><br>
406 }
407 @ <input type="checkbox" name="aa"%s(oaa)>Admin</input><br>
408 @ <input type="checkbox" name="ad"%s(oad)>Delete</input><br>
409 @ <input type="checkbox" name="ae"%s(oad)>Email</input><br>
410 @ <input type="checkbox" name="ap"%s(oap)>Password</input><br>
411 @ <input type="checkbox" name="ai"%s(oai)>Check-In</input><br>
412 @ <input type="checkbox" name="ao"%s(oao)>Check-Out</input><br>
413 @ <input type="checkbox" name="ah"%s(oah)>History</input><br>
414 @ <input type="checkbox" name="av"%s(oav)>Developer</input><br>
415 @ <input type="checkbox" name="ag"%s(oag)>Clone</input><br>
416 @ <input type="checkbox" name="aj"%s(oaj)>Read Wiki</input><br>
417 @ <input type="checkbox" name="af"%s(oaf)>New Wiki</input><br>
418 @ <input type="checkbox" name="am"%s(oam)>Append Wiki</input><br>
419 @ <input type="checkbox" name="ak"%s(oak)>Write Wiki</input><br>
420 @ <input type="checkbox" name="ar"%s(oar)>Read Tkt</input><br>
421 @ <input type="checkbox" name="an"%s(oan)>New Tkt</input><br>
422 @ <input type="checkbox" name="ac"%s(oac)>Append Tkt</input><br>
423 @ <input type="checkbox" name="aw"%s(oaw)>Write Tkt</input><br>
424 @ <input type="checkbox" name="at"%s(oat)>Tkt Report</input><br>
425 @ <input type="checkbox" name="az"%s(oaz)>Download Zip</input>
426 @ </td>
427 @ </tr>
428 @ <tr>
429 @ <td align="right">Password:</td>
430 if( strcmp(zLogin, "anonymous")==0 ){
@@ -452,18 +477,34 @@
452 @ User %h(zLogin) has Setup privileges and you only have Admin privileges
453 @ so you are not permitted to make changes to %h(zLogin).
454 @ </b></font></p></li>
455 @
456 }
457 @
458 @ <li><p>
459 @ The <b>Setup</b> user can make arbitrary configuration changes.
460 @ An <b>Admin</b> user can add other users and change user privileges
461 @ and reset user passwords. Both automatically get all other privileges
462 @ listed below. Use these two settings with discretion.
463 @ </p></li>
464 @
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
465 @ <li><p>
466 @ The <b>Delete</b> privilege give the user the ability to erase
467 @ wiki, tickets, and attachments that have been added by anonymous
468 @ users. This capability is intended for deletion of spam. The
469 @ delete capability is only in effect for 24 hours after the item
@@ -476,21 +517,16 @@
476 @ user "nobody" to avoid problems with spiders trying to walk every
477 @ historical version of every baseline and file.
478 @ </p></li>
479 @
480 @ <li><p>
481 @ The <b>Zip</b> privilege allows a user to see the download as zip hyperlink
482 @ as well as permit access to the <tt>/zip</tt> page. It can be allowed for
483 @ user "nobody" to grant him access to download artifacts he know from the
484 @ server without giving him other rights like <b>Read</b> or <b>History</b>.
485 @ So automatic package dowloaders could be able to obtain the sources without
486 @ going thru the login procedure.
487 @ </p></li>
488 @
489 @ <li><p>
490 @ The <b>Developer</b> privilege causes all privileges of the user
491 @ named "developer" to be inherited by this user.
492 @ </p></li>
493 @
494 @ <li><p>
495 @ The <b>Check-in</b> privilege allows remote users to "push".
496 @ The <b>Check-out</b> privilege allows remote users to "pull".
@@ -513,11 +549,12 @@
513 @ </p></li>
514 @
515 @ <li><p>
516 @ The <b>EMail</b> privilege allows the display of sensitive information
517 @ such as the email address of users and contact information on tickets.
518 @ Recommended OFF for "anonymous" and for "nobody".
 
519 @ </p></li>
520 @
521 @ <li><p>
522 @ Login is prohibited if the password is an empty string.
523 @ </p></li>
524
--- src/setup.c
+++ src/setup.c
@@ -200,14 +200,10 @@
200 @ <li><p>
201 @ Users with privilege <b>v</b> inherit the combined privileges of
202 @ <b>developer</b>, <b>anonymous</b>, and <b>nobody</b>.
203 @ </p></li>
204 @
 
 
 
 
205 @ </ol>
206 @ </td></tr></table>
207 style_footer();
208 }
209
@@ -231,10 +227,11 @@
227 void user_edit(void){
228 const char *zId, *zLogin, *zInfo, *zCap, *zPw;
229 char *oaa, *oas, *oar, *oaw, *oan, *oai, *oaj, *oao, *oap;
230 char *oak, *oad, *oac, *oaf, *oam, *oah, *oag, *oae;
231 char *oat, *oav, *oaz;
232 const char *inherit[128];
233 int doWrite;
234 int uid;
235 int higherUser = 0; /* True if user being edited is SETUP and the */
236 /* user doing the editing is ADMIN. Disallow editing */
237
@@ -367,10 +364,37 @@
364 if( strchr(zCap, 't') ) oat = " checked";
365 if( strchr(zCap, 'v') ) oav = " checked";
366 if( strchr(zCap, 'w') ) oaw = " checked";
367 if( strchr(zCap, 'z') ) oaz = " checked";
368 }
369
370 /* figure out inherited permissions */
371 memset(inherit, 0, sizeof(inherit));
372 if( strcmp(zLogin, "developer") ){
373 char *z1, *z2;
374 z1 = z2 = db_text("","SELECT cap FROM user WHERE login='developer'");
375 while( *z1 ){
376 inherit[0x7f & *(z1++)] = "<font color=\"red\">&#149;</font>";
377 }
378 free(z2);
379 }
380 if( strcmp(zLogin, "anonymous") ){
381 char *z1, *z2;
382 z1 = z2 = db_text("","SELECT cap FROM user WHERE login='anonymous'");
383 while( *z1 ){
384 inherit[0x7f & *(z1++)] = "<font color=\"blue\">&#149;</font>";
385 }
386 free(z2);
387 }
388 if( strcmp(zLogin, "nobody") ){
389 char *z1, *z2;
390 z1 = z2 = db_text("","SELECT cap FROM user WHERE login='nobody'");
391 while( *z1 ){
392 inherit[0x7f & *(z1++)] = "<font color=\"green\">&#149;</font>";
393 }
394 free(z2);
395 }
396
397 /* Begin generating the page
398 */
399 style_submenu_element("Cancel", "Cancel", "setup_ulist");
400 if( uid ){
@@ -399,32 +423,33 @@
423 @ <td><input type="text" name="info" size=40 value="%h(zInfo)"></td>
424 @ </tr>
425 @ <tr>
426 @ <td align="right" valign="top">Capabilities:</td>
427 @ <td>
428 #define B(x) inherit[x]
429 if( g.okSetup ){
430 @ <input type="checkbox" name="as"%s(oas)>%s(B('s'))Setup</input><br>
431 }
432 @ <input type="checkbox" name="aa"%s(oaa)>%s(B('a'))Admin</input><br>
433 @ <input type="checkbox" name="ad"%s(oad)>%s(B('d'))Delete</input><br>
434 @ <input type="checkbox" name="ae"%s(oae)>%s(B('e'))Email</input><br>
435 @ <input type="checkbox" name="ap"%s(oap)>%s(B('p'))Password</input><br>
436 @ <input type="checkbox" name="ai"%s(oai)>%s(B('i'))Check-In</input><br>
437 @ <input type="checkbox" name="ao"%s(oao)>%s(B('o'))Check-Out</input><br>
438 @ <input type="checkbox" name="ah"%s(oah)>%s(B('h'))History</input><br>
439 @ <input type="checkbox" name="av"%s(oav)>%s(B('v'))Developer</input><br>
440 @ <input type="checkbox" name="ag"%s(oag)>%s(B('g'))Clone</input><br>
441 @ <input type="checkbox" name="aj"%s(oaj)>%s(B('j'))Read Wiki</input><br>
442 @ <input type="checkbox" name="af"%s(oaf)>%s(B('f'))New Wiki</input><br>
443 @ <input type="checkbox" name="am"%s(oam)>%s(B('m'))Append Wiki</input><br>
444 @ <input type="checkbox" name="ak"%s(oak)>%s(B('k'))Write Wiki</input><br>
445 @ <input type="checkbox" name="ar"%s(oar)>%s(B('r'))Read Tkt</input><br>
446 @ <input type="checkbox" name="an"%s(oan)>%s(B('n'))New Tkt</input><br>
447 @ <input type="checkbox" name="ac"%s(oac)>%s(B('c'))Append Tkt</input><br>
448 @ <input type="checkbox" name="aw"%s(oaw)>%s(B('w'))Write Tkt</input><br>
449 @ <input type="checkbox" name="at"%s(oat)>%s(B('t'))Tkt Report</input><br>
450 @ <input type="checkbox" name="az"%s(oaz)>%s(B('z'))Download Zip</input>
451 @ </td>
452 @ </tr>
453 @ <tr>
454 @ <td align="right">Password:</td>
455 if( strcmp(zLogin, "anonymous")==0 ){
@@ -452,18 +477,34 @@
477 @ User %h(zLogin) has Setup privileges and you only have Admin privileges
478 @ so you are not permitted to make changes to %h(zLogin).
479 @ </b></font></p></li>
480 @
481 }
 
482 @ <li><p>
483 @ The <b>Setup</b> user can make arbitrary configuration changes.
484 @ An <b>Admin</b> user can add other users and change user privileges
485 @ and reset user passwords. Both automatically get all other privileges
486 @ listed below. Use these two settings with discretion.
487 @ </p></li>
488 @
489 @ <li><p>
490 @ The "<font color="green"><big>&#149;</big></font>" mark indicates
491 @ the privileges of "nobody" that are available to all users
492 @ regardless of whether or not they are logged in.
493 @ </p></li>
494 @
495 @ <li><p>
496 @ The "<font color="blue"><big>&#149;</big></font>" mark indicates
497 @ the privileges of "anonymous" that are inherited by all logged-in users.
498 @ </p></li>
499 @
500 @ <li><p>
501 @ The "<font color="red"><big>&#149;</big></font>" mark indicates
502 @ the privileges of "developer" that are inherited by all users with
503 @ the <b>Developer</b> privilege.
504 @ </p></li>
505 @
506 @ <li><p>
507 @ The <b>Delete</b> privilege give the user the ability to erase
508 @ wiki, tickets, and attachments that have been added by anonymous
509 @ users. This capability is intended for deletion of spam. The
510 @ delete capability is only in effect for 24 hours after the item
@@ -476,21 +517,16 @@
517 @ user "nobody" to avoid problems with spiders trying to walk every
518 @ historical version of every baseline and file.
519 @ </p></li>
520 @
521 @ <li><p>
522 @ The <b>Zip</b> privilege allows a user to see the "download as ZIP"
523 @ hyperlink and permits access to the <tt>/zip</tt> page. This allows
524 @ users to download ZIP archives without granting other rights like
525 @ <b>Read</b> or <b>History</b>. This privilege is recommended for
526 @ user <b>nobody</b> so that automatic package downloaders can obtain
527 @ the sources without going through the login procedure.
 
 
 
 
 
528 @ </p></li>
529 @
530 @ <li><p>
531 @ The <b>Check-in</b> privilege allows remote users to "push".
532 @ The <b>Check-out</b> privilege allows remote users to "pull".
@@ -513,11 +549,12 @@
549 @ </p></li>
550 @
551 @ <li><p>
552 @ The <b>EMail</b> privilege allows the display of sensitive information
553 @ such as the email address of users and contact information on tickets.
554 @ Recommended OFF for "anonymous" and for "nobody" but ON for
555 @ "developer".
556 @ </p></li>
557 @
558 @ <li><p>
559 @ Login is prohibited if the password is an empty string.
560 @ </p></li>
561

Keyboard Shortcuts

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