Fossil SCM
Work on the webmail interface. Still very incomplete.
Commit
0af017583ec46feb7c60c7328511c2f9f27243cff63e357e0e4b705527f1f6d8
Parent
d68879f70cd6e35…
1 file changed
+53
-24
+53
-24
| --- src/webmail.c | ||
| +++ src/webmail.c | ||
| @@ -363,12 +363,12 @@ | ||
| 363 | 363 | ** |
| 364 | 364 | ** Query parameters: |
| 365 | 365 | ** |
| 366 | 366 | ** id=N Show a single email entry emailbox.ebid==N |
| 367 | 367 | ** f=N Display format. 0: decoded 1: raw |
| 368 | -** u=USER Show mailbox for USER (admin only). | |
| 369 | -** u=* Show mailbox for all users (admin only). | |
| 368 | +** user=USER Show mailbox for USER (admin only). | |
| 369 | +** user=* Show mailbox for all users (admin only). | |
| 370 | 370 | ** d=N 0: inbox+unread 1: unread-only 2: trash 3: all |
| 371 | 371 | ** eN Select email entry emailbox.ebid==N |
| 372 | 372 | ** trash Move selected entries to trash (estate=2) |
| 373 | 373 | ** read Mark selected entries as read (estate=1) |
| 374 | 374 | ** unread Mark selected entries as unread (estate=0) |
| @@ -406,30 +406,32 @@ | ||
| 406 | 406 | } |
| 407 | 407 | } |
| 408 | 408 | if( emailid>0 ){ |
| 409 | 409 | style_submenu_element("Index", "%s", url_render(&url,"id",0,0,0)); |
| 410 | 410 | blob_init(&sql, 0, 0); |
| 411 | + db_begin_transaction(); | |
| 411 | 412 | blob_append_sql(&sql, "SELECT decompress(etxt)" |
| 412 | - " FROM emailblob WHERE emailid=%d", | |
| 413 | + " FROM emailblob, emailbox" | |
| 414 | + " WHERE emailid=emsgid AND ebid=%d", | |
| 413 | 415 | emailid); |
| 414 | 416 | if( !g.perm.Admin ){ |
| 415 | - blob_append_sql(&sql, " AND EXISTS(SELECT 1 FROM emailbox WHERE" | |
| 416 | - " euser=%Q AND emsgid=emailid)", g.zLogin); | |
| 417 | + blob_append_sql(&sql, " AND euser=%Q", g.zLogin); | |
| 417 | 418 | } |
| 418 | 419 | db_prepare_blob(&q, &sql); |
| 419 | 420 | blob_reset(&sql); |
| 420 | 421 | if( db_step(&q)==SQLITE_ROW ){ |
| 421 | 422 | Blob msg = db_column_text_as_blob(&q, 0); |
| 423 | + int eFormat = atoi(PD("f","0")); | |
| 422 | 424 | url_add_parameter(&url, "id", P("id")); |
| 423 | 425 | style_header("Message %d",emailid); |
| 424 | - if( PB("raw") ){ | |
| 426 | + if( eFormat==1 ){ | |
| 425 | 427 | @ <pre>%h(db_column_text(&q, 0))</pre> |
| 426 | - style_submenu_element("Decoded", "%s", url_render(&url,"raw",0,0,0)); | |
| 428 | + style_submenu_element("Decoded", "%s", url_render(&url,"f",0,0,0)); | |
| 427 | 429 | }else{ |
| 428 | 430 | EmailToc *p = emailtoc_from_email(&msg); |
| 429 | 431 | int i, j; |
| 430 | - style_submenu_element("Raw", "%s", url_render(&url,"raw","1",0,0)); | |
| 432 | + style_submenu_element("Raw", "%s", url_render(&url,"f","1",0,0)); | |
| 431 | 433 | @ <p> |
| 432 | 434 | for(i=0; i<p->nHdr; i++){ |
| 433 | 435 | char *z = p->azHdr[i]; |
| 434 | 436 | email_hdr_unfold(z); |
| 435 | 437 | for(j=0; z[j] && z[j]!=':'; j++){} |
| @@ -469,49 +471,76 @@ | ||
| 469 | 471 | db_finalize(&q); |
| 470 | 472 | } |
| 471 | 473 | style_header("Webmail"); |
| 472 | 474 | blob_init(&sql, 0, 0); |
| 473 | 475 | blob_append_sql(&sql, |
| 474 | - /* 0 1 2 3 4 5 */ | |
| 475 | - "SELECT efrom, datetime(edate,'unixepoch'), estate, esubject, emsgid, euser" | |
| 476 | + "SELECT ebid," /* 0 */ | |
| 477 | + " efrom," /* 1 */ | |
| 478 | + " datetime(edate,'unixepoch')," /* 2 */ | |
| 479 | + " estate," /* 3 */ | |
| 480 | + " esubject," /* 4 */ | |
| 481 | + " euser" /* 5 */ | |
| 476 | 482 | " FROM emailbox" |
| 477 | 483 | ); |
| 484 | + switch( atoi(PD("d","0")) ){ | |
| 485 | + case 0: { /* Show unread and read */ | |
| 486 | + blob_append_sql(&sql, " WHERE estate<=1"); | |
| 487 | + break; | |
| 488 | + } | |
| 489 | + case 1: { /* Unread messages only */ | |
| 490 | + blob_append_sql(&sql, " WHERE estate=0"); | |
| 491 | + break; | |
| 492 | + } | |
| 493 | + case 2: { /* Trashcan only */ | |
| 494 | + blob_append_sql(&sql, " WHERE estate=2"); | |
| 495 | + break; | |
| 496 | + } | |
| 497 | + case 3: { /* Everything */ | |
| 498 | + blob_append_sql(&sql, " WHERE 1"); | |
| 499 | + break; | |
| 500 | + } | |
| 501 | + } | |
| 502 | + | |
| 478 | 503 | if( showAll ){ |
| 479 | 504 | style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0)); |
| 480 | 505 | }else if( zUser!=0 ){ |
| 481 | 506 | style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0)); |
| 482 | 507 | if( fossil_strcmp(zUser, g.zLogin)!=0 ){ |
| 483 | 508 | style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0)); |
| 484 | 509 | } |
| 485 | 510 | if( zUser ){ |
| 486 | - blob_append_sql(&sql, " WHERE euser=%Q", zUser); | |
| 511 | + blob_append_sql(&sql, " AND euser=%Q", zUser); | |
| 487 | 512 | }else{ |
| 488 | - blob_append_sql(&sql, " WHERE euser=%Q", g.zLogin); | |
| 513 | + blob_append_sql(&sql, " AND euser=%Q", g.zLogin); | |
| 489 | 514 | } |
| 490 | 515 | }else{ |
| 491 | 516 | if( g.perm.Admin ){ |
| 492 | 517 | style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0)); |
| 493 | 518 | } |
| 494 | - blob_append_sql(&sql, " WHERE euser=%Q", g.zLogin); | |
| 519 | + blob_append_sql(&sql, " AND euser=%Q", g.zLogin); | |
| 495 | 520 | } |
| 496 | 521 | blob_append_sql(&sql, " ORDER BY edate DESC limit 50"); |
| 497 | 522 | db_prepare_blob(&q, &sql); |
| 498 | 523 | blob_reset(&sql); |
| 499 | - @ <ol> | |
| 524 | + @ <form action="%R/webmail" method="POST"> | |
| 525 | + @ <table> | |
| 500 | 526 | while( db_step(&q)==SQLITE_ROW ){ |
| 501 | - char *zId = db_column_text(&q,4); | |
| 502 | - const char *zFrom = db_column_text(&q, 0); | |
| 503 | - const char *zDate = db_column_text(&q, 1); | |
| 504 | - const char *zSubject = db_column_text(&q, 3); | |
| 505 | - @ <li> | |
| 527 | + const char *zId = db_column_text(&q,0); | |
| 528 | + const char *zFrom = db_column_text(&q, 1); | |
| 529 | + const char *zDate = db_column_text(&q, 2); | |
| 530 | + const char *zSubject = db_column_text(&q, 4); | |
| 531 | + @ <tr> | |
| 532 | + @ <td><input type="checkbox" name="e%s(zId)"></td> | |
| 533 | + @ <td>%h(zFrom)</td> | |
| 534 | + @ <td><a href="%s(url_render(&url,"id",zId,0,0))">%h(zSubject)</a> \ | |
| 535 | + @ %s(zDate)</td> | |
| 506 | 536 | if( showAll ){ |
| 507 | 537 | const char *zTo = db_column_text(&q,5); |
| 508 | - @ <a href="%s(url_render(&url,"user",zTo,0,0))">%h(zTo)</a>: | |
| 538 | + @ <td><a href="%s(url_render(&url,"user",zTo,0,0))">%h(zTo)</a></td> | |
| 509 | 539 | } |
| 510 | - @ <a href="%s(url_render(&url,"id",zId,0,0))">\ | |
| 511 | - @ %h(zFrom) → %h(zSubject)</a> | |
| 512 | - @ %h(zDate) | |
| 540 | + @ </tr> | |
| 513 | 541 | } |
| 514 | 542 | db_finalize(&q); |
| 515 | - @ </ol> | |
| 543 | + @ </table> | |
| 544 | + @ </form> | |
| 516 | 545 | style_footer(); |
| 517 | 546 | } |
| 518 | 547 |
| --- src/webmail.c | |
| +++ src/webmail.c | |
| @@ -363,12 +363,12 @@ | |
| 363 | ** |
| 364 | ** Query parameters: |
| 365 | ** |
| 366 | ** id=N Show a single email entry emailbox.ebid==N |
| 367 | ** f=N Display format. 0: decoded 1: raw |
| 368 | ** u=USER Show mailbox for USER (admin only). |
| 369 | ** u=* Show mailbox for all users (admin only). |
| 370 | ** d=N 0: inbox+unread 1: unread-only 2: trash 3: all |
| 371 | ** eN Select email entry emailbox.ebid==N |
| 372 | ** trash Move selected entries to trash (estate=2) |
| 373 | ** read Mark selected entries as read (estate=1) |
| 374 | ** unread Mark selected entries as unread (estate=0) |
| @@ -406,30 +406,32 @@ | |
| 406 | } |
| 407 | } |
| 408 | if( emailid>0 ){ |
| 409 | style_submenu_element("Index", "%s", url_render(&url,"id",0,0,0)); |
| 410 | blob_init(&sql, 0, 0); |
| 411 | blob_append_sql(&sql, "SELECT decompress(etxt)" |
| 412 | " FROM emailblob WHERE emailid=%d", |
| 413 | emailid); |
| 414 | if( !g.perm.Admin ){ |
| 415 | blob_append_sql(&sql, " AND EXISTS(SELECT 1 FROM emailbox WHERE" |
| 416 | " euser=%Q AND emsgid=emailid)", g.zLogin); |
| 417 | } |
| 418 | db_prepare_blob(&q, &sql); |
| 419 | blob_reset(&sql); |
| 420 | if( db_step(&q)==SQLITE_ROW ){ |
| 421 | Blob msg = db_column_text_as_blob(&q, 0); |
| 422 | url_add_parameter(&url, "id", P("id")); |
| 423 | style_header("Message %d",emailid); |
| 424 | if( PB("raw") ){ |
| 425 | @ <pre>%h(db_column_text(&q, 0))</pre> |
| 426 | style_submenu_element("Decoded", "%s", url_render(&url,"raw",0,0,0)); |
| 427 | }else{ |
| 428 | EmailToc *p = emailtoc_from_email(&msg); |
| 429 | int i, j; |
| 430 | style_submenu_element("Raw", "%s", url_render(&url,"raw","1",0,0)); |
| 431 | @ <p> |
| 432 | for(i=0; i<p->nHdr; i++){ |
| 433 | char *z = p->azHdr[i]; |
| 434 | email_hdr_unfold(z); |
| 435 | for(j=0; z[j] && z[j]!=':'; j++){} |
| @@ -469,49 +471,76 @@ | |
| 469 | db_finalize(&q); |
| 470 | } |
| 471 | style_header("Webmail"); |
| 472 | blob_init(&sql, 0, 0); |
| 473 | blob_append_sql(&sql, |
| 474 | /* 0 1 2 3 4 5 */ |
| 475 | "SELECT efrom, datetime(edate,'unixepoch'), estate, esubject, emsgid, euser" |
| 476 | " FROM emailbox" |
| 477 | ); |
| 478 | if( showAll ){ |
| 479 | style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0)); |
| 480 | }else if( zUser!=0 ){ |
| 481 | style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0)); |
| 482 | if( fossil_strcmp(zUser, g.zLogin)!=0 ){ |
| 483 | style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0)); |
| 484 | } |
| 485 | if( zUser ){ |
| 486 | blob_append_sql(&sql, " WHERE euser=%Q", zUser); |
| 487 | }else{ |
| 488 | blob_append_sql(&sql, " WHERE euser=%Q", g.zLogin); |
| 489 | } |
| 490 | }else{ |
| 491 | if( g.perm.Admin ){ |
| 492 | style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0)); |
| 493 | } |
| 494 | blob_append_sql(&sql, " WHERE euser=%Q", g.zLogin); |
| 495 | } |
| 496 | blob_append_sql(&sql, " ORDER BY edate DESC limit 50"); |
| 497 | db_prepare_blob(&q, &sql); |
| 498 | blob_reset(&sql); |
| 499 | @ <ol> |
| 500 | while( db_step(&q)==SQLITE_ROW ){ |
| 501 | char *zId = db_column_text(&q,4); |
| 502 | const char *zFrom = db_column_text(&q, 0); |
| 503 | const char *zDate = db_column_text(&q, 1); |
| 504 | const char *zSubject = db_column_text(&q, 3); |
| 505 | @ <li> |
| 506 | if( showAll ){ |
| 507 | const char *zTo = db_column_text(&q,5); |
| 508 | @ <a href="%s(url_render(&url,"user",zTo,0,0))">%h(zTo)</a>: |
| 509 | } |
| 510 | @ <a href="%s(url_render(&url,"id",zId,0,0))">\ |
| 511 | @ %h(zFrom) → %h(zSubject)</a> |
| 512 | @ %h(zDate) |
| 513 | } |
| 514 | db_finalize(&q); |
| 515 | @ </ol> |
| 516 | style_footer(); |
| 517 | } |
| 518 |
| --- src/webmail.c | |
| +++ src/webmail.c | |
| @@ -363,12 +363,12 @@ | |
| 363 | ** |
| 364 | ** Query parameters: |
| 365 | ** |
| 366 | ** id=N Show a single email entry emailbox.ebid==N |
| 367 | ** f=N Display format. 0: decoded 1: raw |
| 368 | ** user=USER Show mailbox for USER (admin only). |
| 369 | ** user=* Show mailbox for all users (admin only). |
| 370 | ** d=N 0: inbox+unread 1: unread-only 2: trash 3: all |
| 371 | ** eN Select email entry emailbox.ebid==N |
| 372 | ** trash Move selected entries to trash (estate=2) |
| 373 | ** read Mark selected entries as read (estate=1) |
| 374 | ** unread Mark selected entries as unread (estate=0) |
| @@ -406,30 +406,32 @@ | |
| 406 | } |
| 407 | } |
| 408 | if( emailid>0 ){ |
| 409 | style_submenu_element("Index", "%s", url_render(&url,"id",0,0,0)); |
| 410 | blob_init(&sql, 0, 0); |
| 411 | db_begin_transaction(); |
| 412 | blob_append_sql(&sql, "SELECT decompress(etxt)" |
| 413 | " FROM emailblob, emailbox" |
| 414 | " WHERE emailid=emsgid AND ebid=%d", |
| 415 | emailid); |
| 416 | if( !g.perm.Admin ){ |
| 417 | blob_append_sql(&sql, " AND euser=%Q", g.zLogin); |
| 418 | } |
| 419 | db_prepare_blob(&q, &sql); |
| 420 | blob_reset(&sql); |
| 421 | if( db_step(&q)==SQLITE_ROW ){ |
| 422 | Blob msg = db_column_text_as_blob(&q, 0); |
| 423 | int eFormat = atoi(PD("f","0")); |
| 424 | url_add_parameter(&url, "id", P("id")); |
| 425 | style_header("Message %d",emailid); |
| 426 | if( eFormat==1 ){ |
| 427 | @ <pre>%h(db_column_text(&q, 0))</pre> |
| 428 | style_submenu_element("Decoded", "%s", url_render(&url,"f",0,0,0)); |
| 429 | }else{ |
| 430 | EmailToc *p = emailtoc_from_email(&msg); |
| 431 | int i, j; |
| 432 | style_submenu_element("Raw", "%s", url_render(&url,"f","1",0,0)); |
| 433 | @ <p> |
| 434 | for(i=0; i<p->nHdr; i++){ |
| 435 | char *z = p->azHdr[i]; |
| 436 | email_hdr_unfold(z); |
| 437 | for(j=0; z[j] && z[j]!=':'; j++){} |
| @@ -469,49 +471,76 @@ | |
| 471 | db_finalize(&q); |
| 472 | } |
| 473 | style_header("Webmail"); |
| 474 | blob_init(&sql, 0, 0); |
| 475 | blob_append_sql(&sql, |
| 476 | "SELECT ebid," /* 0 */ |
| 477 | " efrom," /* 1 */ |
| 478 | " datetime(edate,'unixepoch')," /* 2 */ |
| 479 | " estate," /* 3 */ |
| 480 | " esubject," /* 4 */ |
| 481 | " euser" /* 5 */ |
| 482 | " FROM emailbox" |
| 483 | ); |
| 484 | switch( atoi(PD("d","0")) ){ |
| 485 | case 0: { /* Show unread and read */ |
| 486 | blob_append_sql(&sql, " WHERE estate<=1"); |
| 487 | break; |
| 488 | } |
| 489 | case 1: { /* Unread messages only */ |
| 490 | blob_append_sql(&sql, " WHERE estate=0"); |
| 491 | break; |
| 492 | } |
| 493 | case 2: { /* Trashcan only */ |
| 494 | blob_append_sql(&sql, " WHERE estate=2"); |
| 495 | break; |
| 496 | } |
| 497 | case 3: { /* Everything */ |
| 498 | blob_append_sql(&sql, " WHERE 1"); |
| 499 | break; |
| 500 | } |
| 501 | } |
| 502 | |
| 503 | if( showAll ){ |
| 504 | style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0)); |
| 505 | }else if( zUser!=0 ){ |
| 506 | style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0)); |
| 507 | if( fossil_strcmp(zUser, g.zLogin)!=0 ){ |
| 508 | style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0)); |
| 509 | } |
| 510 | if( zUser ){ |
| 511 | blob_append_sql(&sql, " AND euser=%Q", zUser); |
| 512 | }else{ |
| 513 | blob_append_sql(&sql, " AND euser=%Q", g.zLogin); |
| 514 | } |
| 515 | }else{ |
| 516 | if( g.perm.Admin ){ |
| 517 | style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0)); |
| 518 | } |
| 519 | blob_append_sql(&sql, " AND euser=%Q", g.zLogin); |
| 520 | } |
| 521 | blob_append_sql(&sql, " ORDER BY edate DESC limit 50"); |
| 522 | db_prepare_blob(&q, &sql); |
| 523 | blob_reset(&sql); |
| 524 | @ <form action="%R/webmail" method="POST"> |
| 525 | @ <table> |
| 526 | while( db_step(&q)==SQLITE_ROW ){ |
| 527 | const char *zId = db_column_text(&q,0); |
| 528 | const char *zFrom = db_column_text(&q, 1); |
| 529 | const char *zDate = db_column_text(&q, 2); |
| 530 | const char *zSubject = db_column_text(&q, 4); |
| 531 | @ <tr> |
| 532 | @ <td><input type="checkbox" name="e%s(zId)"></td> |
| 533 | @ <td>%h(zFrom)</td> |
| 534 | @ <td><a href="%s(url_render(&url,"id",zId,0,0))">%h(zSubject)</a> \ |
| 535 | @ %s(zDate)</td> |
| 536 | if( showAll ){ |
| 537 | const char *zTo = db_column_text(&q,5); |
| 538 | @ <td><a href="%s(url_render(&url,"user",zTo,0,0))">%h(zTo)</a></td> |
| 539 | } |
| 540 | @ </tr> |
| 541 | } |
| 542 | db_finalize(&q); |
| 543 | @ </table> |
| 544 | @ </form> |
| 545 | style_footer(); |
| 546 | } |
| 547 |