Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Use the display name rather than the login for forum posts. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
2e71dc25d94c3f9a8b652d73057dd737 |
| User & Date: | drh 2020-03-27 14:30:58.217 |
Context
|
2020-03-27
| ||
| 14:41 | Show both the display name and the login on forum pages. check-in: d5455f5b1b user: drh tags: trunk | |
| 14:30 | Use the display name rather than the login for forum posts. check-in: 2e71dc25d9 user: drh tags: trunk | |
| 13:00 | Add the "unused" query parameter to the /setup_ulist page. check-in: 7711a4fbc2 user: drh tags: trunk | |
Changes
Changes to src/alerts.c.
| ︙ | ︙ | |||
669 670 671 672 673 674 675 676 677 678 679 680 681 682 |
){
const char *zIn = (const char*)sqlite3_value_text(argv[0]);
char *zOut = alert_find_emailaddr(zIn);
if( zOut ){
sqlite3_result_text(context, zOut, -1, fossil_free);
}
}
/*
** Return the hostname portion of an email address - the part following
** the @
*/
char *alert_hostname(const char *zAddr){
char *z = strchr(zAddr, '@');
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 |
){
const char *zIn = (const char*)sqlite3_value_text(argv[0]);
char *zOut = alert_find_emailaddr(zIn);
if( zOut ){
sqlite3_result_text(context, zOut, -1, fossil_free);
}
}
/*
** SQL function: display_name(X)
**
** If X is a string, search for a user name at the beginning of that
** string. The user name must be followed by an email address. If
** found, return the user name. If not found, return NULL.
**
** This routine is used to extract the display name from the USER.INFO
** field.
*/
void alert_display_name_func(
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
const char *zIn = (const char*)sqlite3_value_text(argv[0]);
int i;
if( zIn==0 ) return;
while( fossil_isspace(zIn[0]) ) zIn++;
for(i=0; zIn[i] && zIn[i]!='<' && zIn[i]!='\n'; i++){}
if( zIn[i]=='<' ){
while( i>0 && fossil_isspace(zIn[i-1]) ){ i--; }
if( i>0 ){
sqlite3_result_text(context, zIn, i, SQLITE_TRANSIENT);
}
}
}
/*
** Return the hostname portion of an email address - the part following
** the @
*/
char *alert_hostname(const char *zAddr){
char *z = strchr(zAddr, '@');
|
| ︙ | ︙ | |||
2140 2141 2142 2143 2144 2145 2146 |
"SELECT"
" forumpost.fpid," /* 0 */
" (SELECT uuid FROM blob WHERE rid=forumpost.fpid)," /* 1 */
" datetime(event.mtime)," /* 2 */
" substr(comment,instr(comment,':')+2)," /* 3 */
" (SELECT uuid FROM blob WHERE rid=forumpost.firt)," /* 4 */
" wantalert.needMod," /* 5 */
| | | | 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 |
"SELECT"
" forumpost.fpid," /* 0 */
" (SELECT uuid FROM blob WHERE rid=forumpost.fpid)," /* 1 */
" datetime(event.mtime)," /* 2 */
" substr(comment,instr(comment,':')+2)," /* 3 */
" (SELECT uuid FROM blob WHERE rid=forumpost.firt)," /* 4 */
" wantalert.needMod," /* 5 */
" coalesce(display_name(info),euser,user)," /* 6 */
" forumpost.fprev IS NULL" /* 7 */
" FROM temp.wantalert, event, forumpost"
" LEFT JOIN user ON (login=coalesce(euser,user))"
" WHERE event.objid=substr(wantalert.eventId,2)+0"
" AND eventId GLOB 'f*'"
" AND forumpost.fpid=event.objid"
" ORDER BY event.mtime"
);
|
| ︙ | ︙ |
Changes to src/db.c.
| ︙ | ︙ | |||
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 |
db_hextoblob, 0, 0);
sqlite3_create_function(db, "capunion", 1, SQLITE_UTF8, 0,
0, capability_union_step, capability_union_finalize);
sqlite3_create_function(db, "fullcap", 1, SQLITE_UTF8, 0,
capability_fullcap, 0, 0);
sqlite3_create_function(db, "find_emailaddr", 1, SQLITE_UTF8, 0,
alert_find_emailaddr_func, 0, 0);
}
#if USE_SEE
/*
** This is a pointer to the saved database encryption key string.
*/
static char *zSavedKey = 0;
| > > | 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 |
db_hextoblob, 0, 0);
sqlite3_create_function(db, "capunion", 1, SQLITE_UTF8, 0,
0, capability_union_step, capability_union_finalize);
sqlite3_create_function(db, "fullcap", 1, SQLITE_UTF8, 0,
capability_fullcap, 0, 0);
sqlite3_create_function(db, "find_emailaddr", 1, SQLITE_UTF8, 0,
alert_find_emailaddr_func, 0, 0);
sqlite3_create_function(db, "display_name", 1, SQLITE_UTF8, 0,
alert_display_name_func, 0, 0);
}
#if USE_SEE
/*
** This is a pointer to the saved database encryption key string.
*/
static char *zSavedKey = 0;
|
| ︙ | ︙ |
Changes to src/forum.c.
| ︙ | ︙ | |||
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 |
@ <br>
@ <label><input type="checkbox" name="trust">
@ Trust user "%h(pPost->zUser)"
@ so that future posts by "%h(pPost->zUser)" do not require moderation.
@ </label>
@ <input type="hidden" name="trustuser" value="%h(pPost->zUser)">
}
/*
** Display all posts in a forum thread in chronological order
*/
static void forum_display_chronological(int froot, int target, int bRawMode){
ForumThread *pThread = forumthread_create(froot, 0);
ForumEntry *p;
int notAnon = login_is_individual();
char cMode = bRawMode ? 'r' : 'c';
for(p=pThread->pFirst; p; p=p->pNext){
char *zDate;
Manifest *pPost;
int isPrivate; /* True for posts awaiting moderation */
int sameUser; /* True if author is also the reader */
const char *zUuid;
pPost = manifest_get(p->fpid, CFTYPE_FORUM, 0);
if( pPost==0 ) continue;
if( p->fpid==target ){
@ <div id="forum%d(p->fpid)" class="forumTime forumSel">
}else if( p->pLeaf!=0 ){
@ <div id="forum%d(p->fpid)" class="forumTime forumObs">
}else{
@ <div id="forum%d(p->fpid)" class="forumTime">
}
if( pPost->zThreadTitle ){
@ <h1>%h(pPost->zThreadTitle)</h1>
}
zDate = db_text(0, "SELECT datetime(%.17g)", pPost->rDate);
| > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 |
@ <br>
@ <label><input type="checkbox" name="trust">
@ Trust user "%h(pPost->zUser)"
@ so that future posts by "%h(pPost->zUser)" do not require moderation.
@ </label>
@ <input type="hidden" name="trustuser" value="%h(pPost->zUser)">
}
/*
** Compute a display name from a login name.
**
** If the input login is found in the USER table, then check the USER.INFO
** field to see if it has display-name followed by an email address.
** If it does, that becomes the new display name. If not, let the display
** name just be the login.
**
** Space to hold the returned name is obtained form fossil_strdup()
** and should be freed by the caller.
*/
char *display_name_from_login(const char *zLogin){
static Stmt q;
char *zResult;
db_static_prepare(&q,
"SELECT coalesce(display_name(info),$login) FROM user WHERE login=$login"
);
db_bind_text(&q, "$login", zLogin);
db_step(&q);
zResult = fossil_strdup(db_column_text(&q,0));
db_reset(&q);
return zResult;
}
/*
** Display all posts in a forum thread in chronological order
*/
static void forum_display_chronological(int froot, int target, int bRawMode){
ForumThread *pThread = forumthread_create(froot, 0);
ForumEntry *p;
int notAnon = login_is_individual();
char cMode = bRawMode ? 'r' : 'c';
for(p=pThread->pFirst; p; p=p->pNext){
char *zDate;
Manifest *pPost;
int isPrivate; /* True for posts awaiting moderation */
int sameUser; /* True if author is also the reader */
const char *zUuid;
char *zDisplayName; /* The display name */
pPost = manifest_get(p->fpid, CFTYPE_FORUM, 0);
if( pPost==0 ) continue;
if( p->fpid==target ){
@ <div id="forum%d(p->fpid)" class="forumTime forumSel">
}else if( p->pLeaf!=0 ){
@ <div id="forum%d(p->fpid)" class="forumTime forumObs">
}else{
@ <div id="forum%d(p->fpid)" class="forumTime">
}
if( pPost->zThreadTitle ){
@ <h1>%h(pPost->zThreadTitle)</h1>
}
zDate = db_text(0, "SELECT datetime(%.17g)", pPost->rDate);
zDisplayName = display_name_from_login(pPost->zUser);
@ <h3 class='forumPostHdr'>(%d(p->sid)) By %h(zDisplayName) on %h(zDate)
fossil_free(zDisplayName);
fossil_free(zDate);
if( p->pEdit ){
@ edit of %z(href("%R/forumpost/%S?t=%c",p->pEdit->zUuid,cMode))\
@ %d(p->pEdit->sid)</a>
}
if( g.perm.Debug ){
@ <span class="debug">\
|
| ︙ | ︙ | |||
477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
}
while( iIndentScale>1 && iIndentScale*pThread->mxIndent>25 ){
iIndentScale--;
}
for(p=pThread->pDisplay; p; p=p->pDisplay){
int isPrivate; /* True for posts awaiting moderation */
int sameUser; /* True if reader is also the poster */
pOPost = manifest_get(p->fpid, CFTYPE_FORUM, 0);
if( p->pLeaf ){
fpid = p->pLeaf->fpid;
zUuid = p->pLeaf->zUuid;
pPost = manifest_get(fpid, CFTYPE_FORUM, 0);
}else{
fpid = p->fpid;
| > | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 |
}
while( iIndentScale>1 && iIndentScale*pThread->mxIndent>25 ){
iIndentScale--;
}
for(p=pThread->pDisplay; p; p=p->pDisplay){
int isPrivate; /* True for posts awaiting moderation */
int sameUser; /* True if reader is also the poster */
char *zDisplayName; /* User name to be displayed */
pOPost = manifest_get(p->fpid, CFTYPE_FORUM, 0);
if( p->pLeaf ){
fpid = p->pLeaf->fpid;
zUuid = p->pLeaf->zUuid;
pPost = manifest_get(fpid, CFTYPE_FORUM, 0);
}else{
fpid = p->fpid;
|
| ︙ | ︙ | |||
500 501 502 503 504 505 506 507 |
}
pPost = manifest_get(fpid, CFTYPE_FORUM, 0);
if( pPost==0 ) continue;
if( pPost->zThreadTitle ){
@ <h1>%h(pPost->zThreadTitle)</h1>
}
zDate = db_text(0, "SELECT datetime(%.17g)", pOPost->rDate);
@ <h3 class='forumPostHdr'>\
| > | > | 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 |
}
pPost = manifest_get(fpid, CFTYPE_FORUM, 0);
if( pPost==0 ) continue;
if( pPost->zThreadTitle ){
@ <h1>%h(pPost->zThreadTitle)</h1>
}
zDate = db_text(0, "SELECT datetime(%.17g)", pOPost->rDate);
zDisplayName = display_name_from_login(pOPost->zUser);
@ <h3 class='forumPostHdr'>\
@ (%d(p->pLeaf?p->pLeaf->sid:p->sid)) By %h(zDisplayName) on %h(zDate)
fossil_free(zDisplayName);
fossil_free(zDate);
if( g.perm.Debug ){
@ <span class="debug">\
@ <a href="%R/artifact/%h(p->zUuid)">(artifact)</a></span>
}
if( p->pLeaf ){
zDate = db_text(0, "SELECT datetime(%.17g)", pPost->rDate);
|
| ︙ | ︙ | |||
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 |
@ <form action="%R/forume2" method="POST">
@ <input type="hidden" name="fpid" value="%h(P("fpid"))">
@ <input type="hidden" name="edit" value="1">
forum_from_line();
forum_entry_widget(zTitle, zMimetype, zContent);
}else{
/* Reply */
zMimetype = PD("mimetype",DEFAULT_FORUM_MIMETYPE);
zContent = PDT("content","");
style_header("Reply");
if( pRootPost->zThreadTitle ){
@ <h1>Thread: %h(pRootPost->zThreadTitle)</h1>
}
@ <h2>Replying To:</h2>
zDate = db_text(0, "SELECT datetime(%.17g)", pPost->rDate);
| > > | > | 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 |
@ <form action="%R/forume2" method="POST">
@ <input type="hidden" name="fpid" value="%h(P("fpid"))">
@ <input type="hidden" name="edit" value="1">
forum_from_line();
forum_entry_widget(zTitle, zMimetype, zContent);
}else{
/* Reply */
char *zDisplayName;
zMimetype = PD("mimetype",DEFAULT_FORUM_MIMETYPE);
zContent = PDT("content","");
style_header("Reply");
if( pRootPost->zThreadTitle ){
@ <h1>Thread: %h(pRootPost->zThreadTitle)</h1>
}
@ <h2>Replying To:</h2>
zDate = db_text(0, "SELECT datetime(%.17g)", pPost->rDate);
zDisplayName = display_name_from_login(pPost->zUser);
@ <h3 class='forumPostHdr'>By %h(zDisplayName) on %h(zDate)</h3>
fossil_free(zDisplayName);
fossil_free(zDate);
forum_render(0, pPost->zMimetype, pPost->zWiki, "forumEdit");
if( P("preview") ){
@ <h2>Preview:</h2>
forum_render(0, zMimetype,zContent, "forumEdit");
}
@ <h2>Enter Reply:</h2>
|
| ︙ | ︙ |