Fossil SCM

Work toward making the "h" permission mean "hyperlink". Without "h", many pages will display, but there are few hyperlinks. A message invites users to login as anonymous.

drh 2008-05-05 20:18 trunk
Commit 2b0d4519dc71e17876c4091dbd30af29d3931839
+7 -3
--- src/diff.c
+++ src/diff.c
@@ -709,12 +709,16 @@
709709
while( db_step(&q)==SQLITE_ROW ){
710710
int pid = db_column_int(&q, 0);
711711
const char *zUuid = db_column_text(&q, 1);
712712
const char *zDate = db_column_text(&q, 2);
713713
const char *zUser = db_column_text(&q, 3);
714
- zLabel = mprintf("<a href='%s/info/%s'>%.10s</a> %s %9.9s",
715
- g.zBaseURL, zUuid, zUuid, zDate, zUser);
714
+ if( g.okHistory ){
715
+ zLabel = mprintf("<a href='%s/info/%s'>%.10s</a> %s %9.9s",
716
+ g.zBaseURL, zUuid, zUuid, zDate, zUser);
717
+ }else{
718
+ zLabel = mprintf("%.10s %s %9.9s", zUuid, zDate, zUser);
719
+ }
716720
content_get(pid, &step);
717721
annotation_step(p, &step, zLabel);
718722
blob_reset(&step);
719723
}
720724
db_finalize(&q);
@@ -733,11 +737,11 @@
733737
int fnid = atoi(PD("fnid","0"));
734738
int i;
735739
Annotator ann;
736740
737741
login_check_credentials();
738
- if( !g.okHistory ){ login_needed(); return; }
742
+ if( !g.okRead ){ login_needed(); return; }
739743
if( mid==0 || fnid==0 ){ cgi_redirect("index"); }
740744
if( !db_exists("SELECT 1 FROM mlink WHERE mid=%d AND fnid=%d",mid,fnid) ){
741745
cgi_redirect("index");
742746
}
743747
style_header("File Annotation");
744748
--- src/diff.c
+++ src/diff.c
@@ -709,12 +709,16 @@
709 while( db_step(&q)==SQLITE_ROW ){
710 int pid = db_column_int(&q, 0);
711 const char *zUuid = db_column_text(&q, 1);
712 const char *zDate = db_column_text(&q, 2);
713 const char *zUser = db_column_text(&q, 3);
714 zLabel = mprintf("<a href='%s/info/%s'>%.10s</a> %s %9.9s",
715 g.zBaseURL, zUuid, zUuid, zDate, zUser);
 
 
 
 
716 content_get(pid, &step);
717 annotation_step(p, &step, zLabel);
718 blob_reset(&step);
719 }
720 db_finalize(&q);
@@ -733,11 +737,11 @@
733 int fnid = atoi(PD("fnid","0"));
734 int i;
735 Annotator ann;
736
737 login_check_credentials();
738 if( !g.okHistory ){ login_needed(); return; }
739 if( mid==0 || fnid==0 ){ cgi_redirect("index"); }
740 if( !db_exists("SELECT 1 FROM mlink WHERE mid=%d AND fnid=%d",mid,fnid) ){
741 cgi_redirect("index");
742 }
743 style_header("File Annotation");
744
--- src/diff.c
+++ src/diff.c
@@ -709,12 +709,16 @@
709 while( db_step(&q)==SQLITE_ROW ){
710 int pid = db_column_int(&q, 0);
711 const char *zUuid = db_column_text(&q, 1);
712 const char *zDate = db_column_text(&q, 2);
713 const char *zUser = db_column_text(&q, 3);
714 if( g.okHistory ){
715 zLabel = mprintf("<a href='%s/info/%s'>%.10s</a> %s %9.9s",
716 g.zBaseURL, zUuid, zUuid, zDate, zUser);
717 }else{
718 zLabel = mprintf("%.10s %s %9.9s", zUuid, zDate, zUser);
719 }
720 content_get(pid, &step);
721 annotation_step(p, &step, zLabel);
722 blob_reset(&step);
723 }
724 db_finalize(&q);
@@ -733,11 +737,11 @@
737 int fnid = atoi(PD("fnid","0"));
738 int i;
739 Annotator ann;
740
741 login_check_credentials();
742 if( !g.okRead ){ login_needed(); return; }
743 if( mid==0 || fnid==0 ){ cgi_redirect("index"); }
744 if( !db_exists("SELECT 1 FROM mlink WHERE mid=%d AND fnid=%d",mid,fnid) ){
745 cgi_redirect("index");
746 }
747 style_header("File Annotation");
748
+47 -32
--- src/info.c
+++ src/info.c
@@ -299,11 +299,11 @@
299299
Stmt q;
300300
int rid;
301301
int isLeaf;
302302
303303
login_check_credentials();
304
- if( !g.okHistory ){ login_needed(); return; }
304
+ if( !g.okRead ){ login_needed(); return; }
305305
rid = name_to_rid(PD("name","0"));
306306
if( rid==0 ){
307307
style_header("Version Information Error");
308308
@ No such object: %h(g.argv[2])
309309
style_footer();
@@ -319,10 +319,11 @@
319319
);
320320
if( db_step(&q)==SQLITE_ROW ){
321321
const char *zUuid = db_column_text(&q, 0);
322322
char *zTitle = mprintf("Baseline [%.10s]", zUuid);
323323
style_header(zTitle);
324
+ login_anonymous_available();
324325
free(zTitle);
325326
/*@ <h2>Version %s(zUuid)</h2>*/
326327
@ <div class="section">Overview</div>
327328
@ <p><table class="label-value">
328329
@ <tr><th>Version:</th><td>%s(zUuid)</td></tr>
@@ -331,25 +332,28 @@
331332
@ <tr><th>Record ID:</th><td>%d(rid)</td></tr>
332333
}
333334
@ <tr><th>Original&nbsp;User:</th><td>%h(db_column_text(&q, 2))</td></tr>
334335
@ <tr><th>Original&nbsp;Comment:</th><td>%w(db_column_text(&q,3))</td></tr>
335336
@ </td></tr>
336
- @ <tr><th>Timelines:</th><td>
337
- @ <a href="%s(g.zBaseURL)/timeline?p=%d(rid)">ancestors</a>
338
- @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)">descendents</a>
339
- @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)&p=%d(rid)">both</a>
340
- @ </td></tr>
341
- @ <tr><th>Commands:</th>
342
- @ <td>
343
- @ <a href="%s(g.zBaseURL)/vdiff/%d(rid)">diff</a>
344
- @ | <a href="%s(g.zBaseURL)/zip/%s(zUuid).zip">ZIP archive</a>
345
- @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">manifest</a>
346
- @ </td>
347
- @ </tr>
337
+ if( g.okHistory ){
338
+ @ <tr><th>Timelines:</th><td>
339
+ @ <a href="%s(g.zBaseURL)/timeline?p=%d(rid)">ancestors</a>
340
+ @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)">descendents</a>
341
+ @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)&p=%d(rid)">both</a>
342
+ @ </td></tr>
343
+ @ <tr><th>Commands:</th>
344
+ @ <td>
345
+ @ <a href="%s(g.zBaseURL)/vdiff/%d(rid)">diff</a>
346
+ @ | <a href="%s(g.zBaseURL)/zip/%s(zUuid).zip">ZIP archive</a>
347
+ @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">manifest</a>
348
+ @ </td>
349
+ @ </tr>
350
+ }
348351
@ </table></p>
349352
}else{
350353
style_header("Baseline Information");
354
+ login_anonymous_available();
351355
}
352356
db_finalize(&q);
353357
showTags(rid, "");
354358
@ <div class="section">Changes</div>
355359
@ <ul>
@@ -370,11 +374,15 @@
370374
}else if( fid ){
371375
@ <b>Added:</b>
372376
}else{
373377
@ <b>Deleted:</b>
374378
}
375
- @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
379
+ if( g.okHistory ){
380
+ @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
381
+ }else{
382
+ @ %h(zName)</li>
383
+ }
376384
}
377385
@ </ul>
378386
compute_leaves(rid);
379387
showDescendents(rid, 2, "Descendents");
380388
showLeaves();
@@ -391,11 +399,11 @@
391399
void winfo_page(void){
392400
Stmt q;
393401
int rid;
394402
395403
login_check_credentials();
396
- if( !g.okHistory ){ login_needed(); return; }
404
+ if( !g.okRdWiki ){ login_needed(); return; }
397405
rid = name_to_rid(PD("name","0"));
398406
if( rid==0 ){
399407
style_header("Wiki Page Information Error");
400408
@ No such object: %h(g.argv[2])
401409
style_footer();
@@ -416,25 +424,28 @@
416424
const char *zName = db_column_text(&q, 0);
417425
const char *zUuid = db_column_text(&q, 1);
418426
char *zTitle = mprintf("Wiki Page %s", zName);
419427
style_header(zTitle);
420428
free(zTitle);
429
+ login_anonymous_available();
421430
@ <div class="section">Overview</div>
422431
@ <p><table class="label-value">
423432
@ <tr><th>Version:</th><td>%s(zUuid)</td></tr>
424433
@ <tr><th>Date:</th><td>%s(db_column_text(&q, 2))</td></tr>
425434
if( g.okSetup ){
426435
@ <tr><th>Record ID:</th><td>%d(rid)</td></tr>
427436
}
428437
@ <tr><th>Original&nbsp;User:</th><td>%s(db_column_text(&q, 3))</td></tr>
429
- @ <tr><th>Commands:</th>
430
- @ <td>
431
-/* @ <a href="%s(g.zBaseURL)/wdiff/%d(rid)">diff</a> | */
432
- @ <a href="%s(g.zBaseURL)/whistory?name=%t(zName)">history</a>
433
- @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">raw-text</a>
434
- @ </td>
435
- @ </tr>
438
+ if( g.okHistory ){
439
+ @ <tr><th>Commands:</th>
440
+ @ <td>
441
+ /* @ <a href="%s(g.zBaseURL)/wdiff/%d(rid)">diff</a> | */
442
+ @ <a href="%s(g.zBaseURL)/whistory?name=%t(zName)">history</a>
443
+ @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">raw-text</a>
444
+ @ </td>
445
+ @ </tr>
446
+ }
436447
@ </table></p>
437448
}else{
438449
style_header("Wiki Information");
439450
rid = 0;
440451
}
@@ -470,12 +481,13 @@
470481
const char *zFilename;
471482
char zPrevDate[20];
472483
Blob title;
473484
474485
login_check_credentials();
475
- if( !g.okHistory ){ login_needed(); return; }
486
+ if( !g.okRead ){ login_needed(); return; }
476487
style_header("File History");
488
+ login_anonymous_available();
477489
478490
zPrevDate[0] = 0;
479491
zFilename = PD("name","");
480492
db_prepare(&q,
481493
"SELECT a.uuid, substr(b.uuid,1,10), datetime(event.mtime,'localtime'),"
@@ -521,17 +533,19 @@
521533
@ <td width="20"></td>
522534
@ <td valign="top" align="left">
523535
hyperlink_to_uuid(zVers);
524536
@ %h(zCom) (By: %h(zUser))
525537
@ Id: %s(zUuid)/%d(frid)
526
- @ <a href="%s(g.zBaseURL)/artifact/%d(frid)">[view]</a>
527
- if( fpid ){
528
- @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
538
+ if( g.okHistory ){
539
+ @ <a href="%s(g.zBaseURL)/artifact/%d(frid)">[view]</a>
540
+ if( fpid ){
541
+ @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
542
+ }
543
+ @ <a href="%s(g.zBaseURL)/annotate?mid=%d(mid)&amp;fnid=%d(fnid)">
544
+ @ [annotate]</a>
545
+ @ </td>
529546
}
530
- @ <a href="%s(g.zBaseURL)/annotate?mid=%d(mid)&amp;fnid=%d(fnid)">
531
- @ [annotate]</a>
532
- @ </td>
533547
}
534548
db_finalize(&q);
535549
@ </table>
536550
style_footer();
537551
}
@@ -562,12 +576,13 @@
562576
int rid;
563577
Stmt q;
564578
char *zUuid;
565579
566580
login_check_credentials();
567
- if( !g.okHistory ){ login_needed(); return; }
581
+ if( !g.okRead ){ login_needed(); return; }
568582
style_header("Baseline Changes");
583
+ login_anonymous_available();
569584
570585
rid = name_to_rid(PD("name",""));
571586
if( rid==0 ){
572587
cgi_redirect("index");
573588
}
@@ -713,11 +728,11 @@
713728
int v1 = name_to_rid(PD("v1","0"));
714729
int v2 = name_to_rid(PD("v2","0"));
715730
Blob c1, c2, diff;
716731
717732
login_check_credentials();
718
- if( !g.okHistory ){ login_needed(); return; }
733
+ if( !g.okRead ){ login_needed(); return; }
719734
style_header("Diff");
720735
@ <h2>Differences From:</h2>
721736
@ <blockquote>
722737
object_description(v1, 1);
723738
@ </blockquote>
@@ -750,11 +765,11 @@
750765
int rid;
751766
Blob content;
752767
753768
rid = name_to_rid(PD("name","0"));
754769
login_check_credentials();
755
- if( !g.okHistory ){ login_needed(); return; }
770
+ if( !g.okRead ){ login_needed(); return; }
756771
if( g.zPath[0]=='i' ){
757772
if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)"
758773
" WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){
759774
winfo_page();
760775
return;
761776
--- src/info.c
+++ src/info.c
@@ -299,11 +299,11 @@
299 Stmt q;
300 int rid;
301 int isLeaf;
302
303 login_check_credentials();
304 if( !g.okHistory ){ login_needed(); return; }
305 rid = name_to_rid(PD("name","0"));
306 if( rid==0 ){
307 style_header("Version Information Error");
308 @ No such object: %h(g.argv[2])
309 style_footer();
@@ -319,10 +319,11 @@
319 );
320 if( db_step(&q)==SQLITE_ROW ){
321 const char *zUuid = db_column_text(&q, 0);
322 char *zTitle = mprintf("Baseline [%.10s]", zUuid);
323 style_header(zTitle);
 
324 free(zTitle);
325 /*@ <h2>Version %s(zUuid)</h2>*/
326 @ <div class="section">Overview</div>
327 @ <p><table class="label-value">
328 @ <tr><th>Version:</th><td>%s(zUuid)</td></tr>
@@ -331,25 +332,28 @@
331 @ <tr><th>Record ID:</th><td>%d(rid)</td></tr>
332 }
333 @ <tr><th>Original&nbsp;User:</th><td>%h(db_column_text(&q, 2))</td></tr>
334 @ <tr><th>Original&nbsp;Comment:</th><td>%w(db_column_text(&q,3))</td></tr>
335 @ </td></tr>
336 @ <tr><th>Timelines:</th><td>
337 @ <a href="%s(g.zBaseURL)/timeline?p=%d(rid)">ancestors</a>
338 @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)">descendents</a>
339 @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)&p=%d(rid)">both</a>
340 @ </td></tr>
341 @ <tr><th>Commands:</th>
342 @ <td>
343 @ <a href="%s(g.zBaseURL)/vdiff/%d(rid)">diff</a>
344 @ | <a href="%s(g.zBaseURL)/zip/%s(zUuid).zip">ZIP archive</a>
345 @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">manifest</a>
346 @ </td>
347 @ </tr>
 
 
348 @ </table></p>
349 }else{
350 style_header("Baseline Information");
 
351 }
352 db_finalize(&q);
353 showTags(rid, "");
354 @ <div class="section">Changes</div>
355 @ <ul>
@@ -370,11 +374,15 @@
370 }else if( fid ){
371 @ <b>Added:</b>
372 }else{
373 @ <b>Deleted:</b>
374 }
375 @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
 
 
 
 
376 }
377 @ </ul>
378 compute_leaves(rid);
379 showDescendents(rid, 2, "Descendents");
380 showLeaves();
@@ -391,11 +399,11 @@
391 void winfo_page(void){
392 Stmt q;
393 int rid;
394
395 login_check_credentials();
396 if( !g.okHistory ){ login_needed(); return; }
397 rid = name_to_rid(PD("name","0"));
398 if( rid==0 ){
399 style_header("Wiki Page Information Error");
400 @ No such object: %h(g.argv[2])
401 style_footer();
@@ -416,25 +424,28 @@
416 const char *zName = db_column_text(&q, 0);
417 const char *zUuid = db_column_text(&q, 1);
418 char *zTitle = mprintf("Wiki Page %s", zName);
419 style_header(zTitle);
420 free(zTitle);
 
421 @ <div class="section">Overview</div>
422 @ <p><table class="label-value">
423 @ <tr><th>Version:</th><td>%s(zUuid)</td></tr>
424 @ <tr><th>Date:</th><td>%s(db_column_text(&q, 2))</td></tr>
425 if( g.okSetup ){
426 @ <tr><th>Record ID:</th><td>%d(rid)</td></tr>
427 }
428 @ <tr><th>Original&nbsp;User:</th><td>%s(db_column_text(&q, 3))</td></tr>
429 @ <tr><th>Commands:</th>
430 @ <td>
431 /* @ <a href="%s(g.zBaseURL)/wdiff/%d(rid)">diff</a> | */
432 @ <a href="%s(g.zBaseURL)/whistory?name=%t(zName)">history</a>
433 @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">raw-text</a>
434 @ </td>
435 @ </tr>
 
 
436 @ </table></p>
437 }else{
438 style_header("Wiki Information");
439 rid = 0;
440 }
@@ -470,12 +481,13 @@
470 const char *zFilename;
471 char zPrevDate[20];
472 Blob title;
473
474 login_check_credentials();
475 if( !g.okHistory ){ login_needed(); return; }
476 style_header("File History");
 
477
478 zPrevDate[0] = 0;
479 zFilename = PD("name","");
480 db_prepare(&q,
481 "SELECT a.uuid, substr(b.uuid,1,10), datetime(event.mtime,'localtime'),"
@@ -521,17 +533,19 @@
521 @ <td width="20"></td>
522 @ <td valign="top" align="left">
523 hyperlink_to_uuid(zVers);
524 @ %h(zCom) (By: %h(zUser))
525 @ Id: %s(zUuid)/%d(frid)
526 @ <a href="%s(g.zBaseURL)/artifact/%d(frid)">[view]</a>
527 if( fpid ){
528 @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
 
 
 
 
 
529 }
530 @ <a href="%s(g.zBaseURL)/annotate?mid=%d(mid)&amp;fnid=%d(fnid)">
531 @ [annotate]</a>
532 @ </td>
533 }
534 db_finalize(&q);
535 @ </table>
536 style_footer();
537 }
@@ -562,12 +576,13 @@
562 int rid;
563 Stmt q;
564 char *zUuid;
565
566 login_check_credentials();
567 if( !g.okHistory ){ login_needed(); return; }
568 style_header("Baseline Changes");
 
569
570 rid = name_to_rid(PD("name",""));
571 if( rid==0 ){
572 cgi_redirect("index");
573 }
@@ -713,11 +728,11 @@
713 int v1 = name_to_rid(PD("v1","0"));
714 int v2 = name_to_rid(PD("v2","0"));
715 Blob c1, c2, diff;
716
717 login_check_credentials();
718 if( !g.okHistory ){ login_needed(); return; }
719 style_header("Diff");
720 @ <h2>Differences From:</h2>
721 @ <blockquote>
722 object_description(v1, 1);
723 @ </blockquote>
@@ -750,11 +765,11 @@
750 int rid;
751 Blob content;
752
753 rid = name_to_rid(PD("name","0"));
754 login_check_credentials();
755 if( !g.okHistory ){ login_needed(); return; }
756 if( g.zPath[0]=='i' ){
757 if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)"
758 " WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){
759 winfo_page();
760 return;
761
--- src/info.c
+++ src/info.c
@@ -299,11 +299,11 @@
299 Stmt q;
300 int rid;
301 int isLeaf;
302
303 login_check_credentials();
304 if( !g.okRead ){ login_needed(); return; }
305 rid = name_to_rid(PD("name","0"));
306 if( rid==0 ){
307 style_header("Version Information Error");
308 @ No such object: %h(g.argv[2])
309 style_footer();
@@ -319,10 +319,11 @@
319 );
320 if( db_step(&q)==SQLITE_ROW ){
321 const char *zUuid = db_column_text(&q, 0);
322 char *zTitle = mprintf("Baseline [%.10s]", zUuid);
323 style_header(zTitle);
324 login_anonymous_available();
325 free(zTitle);
326 /*@ <h2>Version %s(zUuid)</h2>*/
327 @ <div class="section">Overview</div>
328 @ <p><table class="label-value">
329 @ <tr><th>Version:</th><td>%s(zUuid)</td></tr>
@@ -331,25 +332,28 @@
332 @ <tr><th>Record ID:</th><td>%d(rid)</td></tr>
333 }
334 @ <tr><th>Original&nbsp;User:</th><td>%h(db_column_text(&q, 2))</td></tr>
335 @ <tr><th>Original&nbsp;Comment:</th><td>%w(db_column_text(&q,3))</td></tr>
336 @ </td></tr>
337 if( g.okHistory ){
338 @ <tr><th>Timelines:</th><td>
339 @ <a href="%s(g.zBaseURL)/timeline?p=%d(rid)">ancestors</a>
340 @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)">descendents</a>
341 @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)&p=%d(rid)">both</a>
342 @ </td></tr>
343 @ <tr><th>Commands:</th>
344 @ <td>
345 @ <a href="%s(g.zBaseURL)/vdiff/%d(rid)">diff</a>
346 @ | <a href="%s(g.zBaseURL)/zip/%s(zUuid).zip">ZIP archive</a>
347 @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">manifest</a>
348 @ </td>
349 @ </tr>
350 }
351 @ </table></p>
352 }else{
353 style_header("Baseline Information");
354 login_anonymous_available();
355 }
356 db_finalize(&q);
357 showTags(rid, "");
358 @ <div class="section">Changes</div>
359 @ <ul>
@@ -370,11 +374,15 @@
374 }else if( fid ){
375 @ <b>Added:</b>
376 }else{
377 @ <b>Deleted:</b>
378 }
379 if( g.okHistory ){
380 @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
381 }else{
382 @ %h(zName)</li>
383 }
384 }
385 @ </ul>
386 compute_leaves(rid);
387 showDescendents(rid, 2, "Descendents");
388 showLeaves();
@@ -391,11 +399,11 @@
399 void winfo_page(void){
400 Stmt q;
401 int rid;
402
403 login_check_credentials();
404 if( !g.okRdWiki ){ login_needed(); return; }
405 rid = name_to_rid(PD("name","0"));
406 if( rid==0 ){
407 style_header("Wiki Page Information Error");
408 @ No such object: %h(g.argv[2])
409 style_footer();
@@ -416,25 +424,28 @@
424 const char *zName = db_column_text(&q, 0);
425 const char *zUuid = db_column_text(&q, 1);
426 char *zTitle = mprintf("Wiki Page %s", zName);
427 style_header(zTitle);
428 free(zTitle);
429 login_anonymous_available();
430 @ <div class="section">Overview</div>
431 @ <p><table class="label-value">
432 @ <tr><th>Version:</th><td>%s(zUuid)</td></tr>
433 @ <tr><th>Date:</th><td>%s(db_column_text(&q, 2))</td></tr>
434 if( g.okSetup ){
435 @ <tr><th>Record ID:</th><td>%d(rid)</td></tr>
436 }
437 @ <tr><th>Original&nbsp;User:</th><td>%s(db_column_text(&q, 3))</td></tr>
438 if( g.okHistory ){
439 @ <tr><th>Commands:</th>
440 @ <td>
441 /* @ <a href="%s(g.zBaseURL)/wdiff/%d(rid)">diff</a> | */
442 @ <a href="%s(g.zBaseURL)/whistory?name=%t(zName)">history</a>
443 @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">raw-text</a>
444 @ </td>
445 @ </tr>
446 }
447 @ </table></p>
448 }else{
449 style_header("Wiki Information");
450 rid = 0;
451 }
@@ -470,12 +481,13 @@
481 const char *zFilename;
482 char zPrevDate[20];
483 Blob title;
484
485 login_check_credentials();
486 if( !g.okRead ){ login_needed(); return; }
487 style_header("File History");
488 login_anonymous_available();
489
490 zPrevDate[0] = 0;
491 zFilename = PD("name","");
492 db_prepare(&q,
493 "SELECT a.uuid, substr(b.uuid,1,10), datetime(event.mtime,'localtime'),"
@@ -521,17 +533,19 @@
533 @ <td width="20"></td>
534 @ <td valign="top" align="left">
535 hyperlink_to_uuid(zVers);
536 @ %h(zCom) (By: %h(zUser))
537 @ Id: %s(zUuid)/%d(frid)
538 if( g.okHistory ){
539 @ <a href="%s(g.zBaseURL)/artifact/%d(frid)">[view]</a>
540 if( fpid ){
541 @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
542 }
543 @ <a href="%s(g.zBaseURL)/annotate?mid=%d(mid)&amp;fnid=%d(fnid)">
544 @ [annotate]</a>
545 @ </td>
546 }
 
 
 
547 }
548 db_finalize(&q);
549 @ </table>
550 style_footer();
551 }
@@ -562,12 +576,13 @@
576 int rid;
577 Stmt q;
578 char *zUuid;
579
580 login_check_credentials();
581 if( !g.okRead ){ login_needed(); return; }
582 style_header("Baseline Changes");
583 login_anonymous_available();
584
585 rid = name_to_rid(PD("name",""));
586 if( rid==0 ){
587 cgi_redirect("index");
588 }
@@ -713,11 +728,11 @@
728 int v1 = name_to_rid(PD("v1","0"));
729 int v2 = name_to_rid(PD("v2","0"));
730 Blob c1, c2, diff;
731
732 login_check_credentials();
733 if( !g.okRead ){ login_needed(); return; }
734 style_header("Diff");
735 @ <h2>Differences From:</h2>
736 @ <blockquote>
737 object_description(v1, 1);
738 @ </blockquote>
@@ -750,11 +765,11 @@
765 int rid;
766 Blob content;
767
768 rid = name_to_rid(PD("name","0"));
769 login_check_credentials();
770 if( !g.okRead ){ login_needed(); return; }
771 if( g.zPath[0]=='i' ){
772 if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)"
773 " WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){
774 winfo_page();
775 return;
776
+18
--- src/login.c
+++ src/login.c
@@ -369,5 +369,23 @@
369369
const char *zUrl = PD("REQUEST_URI", "index");
370370
cgi_redirect(mprintf("login?g=%T", zUrl));
371371
/* NOTREACHED */
372372
assert(0);
373373
}
374
+
375
+/*
376
+** Call this routine if the user lacks okHistory permission. If
377
+** the anonymous user has okHistory permission, then paint a mesage
378
+** to inform the user that much more information is available by
379
+** logging in as anonymous.
380
+*/
381
+void login_anonymous_available(void){
382
+ if( !g.okHistory &&
383
+ db_exists("SELECT 1 FROM user"
384
+ " WHERE login='anonymous'"
385
+ " AND cap LIKE '%%h%%'") ){
386
+ @ <p><b>Note:</b> Many hyperlinks are omitted from this page to discourage
387
+ @ <a href="http://en.wikipedia.org/wiki/Web_crawler">spiders</a>.
388
+ @ You will be able to access information more easily if you
389
+ @ <a href="%s(g.zTop)/login">login</a> as user "anonymous".</p>
390
+ }
391
+}
374392
--- src/login.c
+++ src/login.c
@@ -369,5 +369,23 @@
369 const char *zUrl = PD("REQUEST_URI", "index");
370 cgi_redirect(mprintf("login?g=%T", zUrl));
371 /* NOTREACHED */
372 assert(0);
373 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
374
--- src/login.c
+++ src/login.c
@@ -369,5 +369,23 @@
369 const char *zUrl = PD("REQUEST_URI", "index");
370 cgi_redirect(mprintf("login?g=%T", zUrl));
371 /* NOTREACHED */
372 assert(0);
373 }
374
375 /*
376 ** Call this routine if the user lacks okHistory permission. If
377 ** the anonymous user has okHistory permission, then paint a mesage
378 ** to inform the user that much more information is available by
379 ** logging in as anonymous.
380 */
381 void login_anonymous_available(void){
382 if( !g.okHistory &&
383 db_exists("SELECT 1 FROM user"
384 " WHERE login='anonymous'"
385 " AND cap LIKE '%%h%%'") ){
386 @ <p><b>Note:</b> Many hyperlinks are omitted from this page to discourage
387 @ <a href="http://en.wikipedia.org/wiki/Web_crawler">spiders</a>.
388 @ You will be able to access information more easily if you
389 @ <a href="%s(g.zTop)/login">login</a> as user "anonymous".</p>
390 }
391 }
392
+16 -16
--- src/timeline.c
+++ src/timeline.c
@@ -250,17 +250,11 @@
250250
*/
251251
login_check_credentials();
252252
if( !g.okRead ){ login_needed(); return; }
253253
254254
style_header("Timeline");
255
- if( !g.okHistory &&
256
- db_exists("SELECT 1 FROM user"
257
- " WHERE login='anonymous'"
258
- " AND cap LIKE '%%h%%'") ){
259
- @ <p><b>Note:</b> You will be able to access <u>much</u> more
260
- @ historical information if you <a href="%s(g.zTop)/login">login</a>.</p>
261
- }
255
+ login_anonymous_available();
262256
timeline_temp_table();
263257
blob_zero(&sql);
264258
blob_zero(&desc);
265259
blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1);
266260
blob_append(&sql, timeline_query_for_www(), -1);
@@ -293,12 +287,16 @@
293287
if( nd>0 ) blob_appendf(&desc, " and ");
294288
blob_appendf(&desc, "%d ancestors", np);
295289
db_multi_exec("%s", blob_str(&sql));
296290
}
297291
}
298
- blob_appendf(&desc, " of <a href='%s/info/%s'>[%.10s]</a>",
299
- g.zBaseURL, zUuid, zUuid);
292
+ if( g.okHistory ){
293
+ blob_appendf(&desc, " of <a href='%s/info/%s'>[%.10s]</a>",
294
+ g.zBaseURL, zUuid, zUuid);
295
+ }else{
296
+ blob_appendf(&desc, " of [%.10s]", zUuid);
297
+ }
300298
db_prepare(&q, "SELECT * FROM timeline ORDER BY timestamp DESC");
301299
}else{
302300
int n;
303301
Blob url;
304302
const char *zEType = "event";
@@ -357,17 +355,19 @@
357355
if( zAfter ){
358356
blob_appendf(&desc, " occurring on or after %h.<br>", zAfter);
359357
}else if( zBefore ){
360358
blob_appendf(&desc, " occurring on or before %h.<br>", zBefore);
361359
}
362
- if( zAfter || n==nEntry ){
363
- zDate = db_text(0, "SELECT min(timestamp) FROM timeline");
364
- blob_appendf(&desc, " <a href='%b&b=%s'>[older]</a>", &url, zDate);
365
- }
366
- if( zBefore || (zAfter && n==nEntry) ){
367
- zDate = db_text(0, "SELECT max(timestamp) FROM timeline");
368
- blob_appendf(&desc, " <a href='%b&a=%s'>[more recent]</a>", &url, zDate);
360
+ if( g.okHistory ){
361
+ if( zAfter || n==nEntry ){
362
+ zDate = db_text(0, "SELECT min(timestamp) FROM timeline");
363
+ blob_appendf(&desc, " <a href='%b&b=%s'>[older]</a>", &url, zDate);
364
+ }
365
+ if( zBefore || (zAfter && n==nEntry) ){
366
+ zDate = db_text(0, "SELECT max(timestamp) FROM timeline");
367
+ blob_appendf(&desc, " <a href='%b&a=%s'>[more recent]</a>", &url,zDate);
368
+ }
369369
}
370370
}
371371
blob_zero(&sql);
372372
db_prepare(&q, "SELECT * FROM timeline ORDER BY timestamp DESC");
373373
@ <h2>%b(&desc)</h2>
374374
--- src/timeline.c
+++ src/timeline.c
@@ -250,17 +250,11 @@
250 */
251 login_check_credentials();
252 if( !g.okRead ){ login_needed(); return; }
253
254 style_header("Timeline");
255 if( !g.okHistory &&
256 db_exists("SELECT 1 FROM user"
257 " WHERE login='anonymous'"
258 " AND cap LIKE '%%h%%'") ){
259 @ <p><b>Note:</b> You will be able to access <u>much</u> more
260 @ historical information if you <a href="%s(g.zTop)/login">login</a>.</p>
261 }
262 timeline_temp_table();
263 blob_zero(&sql);
264 blob_zero(&desc);
265 blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1);
266 blob_append(&sql, timeline_query_for_www(), -1);
@@ -293,12 +287,16 @@
293 if( nd>0 ) blob_appendf(&desc, " and ");
294 blob_appendf(&desc, "%d ancestors", np);
295 db_multi_exec("%s", blob_str(&sql));
296 }
297 }
298 blob_appendf(&desc, " of <a href='%s/info/%s'>[%.10s]</a>",
299 g.zBaseURL, zUuid, zUuid);
 
 
 
 
300 db_prepare(&q, "SELECT * FROM timeline ORDER BY timestamp DESC");
301 }else{
302 int n;
303 Blob url;
304 const char *zEType = "event";
@@ -357,17 +355,19 @@
357 if( zAfter ){
358 blob_appendf(&desc, " occurring on or after %h.<br>", zAfter);
359 }else if( zBefore ){
360 blob_appendf(&desc, " occurring on or before %h.<br>", zBefore);
361 }
362 if( zAfter || n==nEntry ){
363 zDate = db_text(0, "SELECT min(timestamp) FROM timeline");
364 blob_appendf(&desc, " <a href='%b&b=%s'>[older]</a>", &url, zDate);
365 }
366 if( zBefore || (zAfter && n==nEntry) ){
367 zDate = db_text(0, "SELECT max(timestamp) FROM timeline");
368 blob_appendf(&desc, " <a href='%b&a=%s'>[more recent]</a>", &url, zDate);
 
 
369 }
370 }
371 blob_zero(&sql);
372 db_prepare(&q, "SELECT * FROM timeline ORDER BY timestamp DESC");
373 @ <h2>%b(&desc)</h2>
374
--- src/timeline.c
+++ src/timeline.c
@@ -250,17 +250,11 @@
250 */
251 login_check_credentials();
252 if( !g.okRead ){ login_needed(); return; }
253
254 style_header("Timeline");
255 login_anonymous_available();
 
 
 
 
 
 
256 timeline_temp_table();
257 blob_zero(&sql);
258 blob_zero(&desc);
259 blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1);
260 blob_append(&sql, timeline_query_for_www(), -1);
@@ -293,12 +287,16 @@
287 if( nd>0 ) blob_appendf(&desc, " and ");
288 blob_appendf(&desc, "%d ancestors", np);
289 db_multi_exec("%s", blob_str(&sql));
290 }
291 }
292 if( g.okHistory ){
293 blob_appendf(&desc, " of <a href='%s/info/%s'>[%.10s]</a>",
294 g.zBaseURL, zUuid, zUuid);
295 }else{
296 blob_appendf(&desc, " of [%.10s]", zUuid);
297 }
298 db_prepare(&q, "SELECT * FROM timeline ORDER BY timestamp DESC");
299 }else{
300 int n;
301 Blob url;
302 const char *zEType = "event";
@@ -357,17 +355,19 @@
355 if( zAfter ){
356 blob_appendf(&desc, " occurring on or after %h.<br>", zAfter);
357 }else if( zBefore ){
358 blob_appendf(&desc, " occurring on or before %h.<br>", zBefore);
359 }
360 if( g.okHistory ){
361 if( zAfter || n==nEntry ){
362 zDate = db_text(0, "SELECT min(timestamp) FROM timeline");
363 blob_appendf(&desc, " <a href='%b&b=%s'>[older]</a>", &url, zDate);
364 }
365 if( zBefore || (zAfter && n==nEntry) ){
366 zDate = db_text(0, "SELECT max(timestamp) FROM timeline");
367 blob_appendf(&desc, " <a href='%b&a=%s'>[more recent]</a>", &url,zDate);
368 }
369 }
370 }
371 blob_zero(&sql);
372 db_prepare(&q, "SELECT * FROM timeline ORDER BY timestamp DESC");
373 @ <h2>%b(&desc)</h2>
374

Keyboard Shortcuts

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