Fossil SCM

Work on the webmail interface. Still very incomplete.

drh 2018-07-14 16:34 webmail
Commit 0af017583ec46feb7c60c7328511c2f9f27243cff63e357e0e4b705527f1f6d8
1 file changed +53 -24
+53 -24
--- src/webmail.c
+++ src/webmail.c
@@ -363,12 +363,12 @@
363363
**
364364
** Query parameters:
365365
**
366366
** id=N Show a single email entry emailbox.ebid==N
367367
** 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).
370370
** d=N 0: inbox+unread 1: unread-only 2: trash 3: all
371371
** eN Select email entry emailbox.ebid==N
372372
** trash Move selected entries to trash (estate=2)
373373
** read Mark selected entries as read (estate=1)
374374
** unread Mark selected entries as unread (estate=0)
@@ -406,30 +406,32 @@
406406
}
407407
}
408408
if( emailid>0 ){
409409
style_submenu_element("Index", "%s", url_render(&url,"id",0,0,0));
410410
blob_init(&sql, 0, 0);
411
+ db_begin_transaction();
411412
blob_append_sql(&sql, "SELECT decompress(etxt)"
412
- " FROM emailblob WHERE emailid=%d",
413
+ " FROM emailblob, emailbox"
414
+ " WHERE emailid=emsgid AND ebid=%d",
413415
emailid);
414416
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);
417418
}
418419
db_prepare_blob(&q, &sql);
419420
blob_reset(&sql);
420421
if( db_step(&q)==SQLITE_ROW ){
421422
Blob msg = db_column_text_as_blob(&q, 0);
423
+ int eFormat = atoi(PD("f","0"));
422424
url_add_parameter(&url, "id", P("id"));
423425
style_header("Message %d",emailid);
424
- if( PB("raw") ){
426
+ if( eFormat==1 ){
425427
@ <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));
427429
}else{
428430
EmailToc *p = emailtoc_from_email(&msg);
429431
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));
431433
@ <p>
432434
for(i=0; i<p->nHdr; i++){
433435
char *z = p->azHdr[i];
434436
email_hdr_unfold(z);
435437
for(j=0; z[j] && z[j]!=':'; j++){}
@@ -469,49 +471,76 @@
469471
db_finalize(&q);
470472
}
471473
style_header("Webmail");
472474
blob_init(&sql, 0, 0);
473475
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 */
476482
" FROM emailbox"
477483
);
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
+
478503
if( showAll ){
479504
style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0));
480505
}else if( zUser!=0 ){
481506
style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0));
482507
if( fossil_strcmp(zUser, g.zLogin)!=0 ){
483508
style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0));
484509
}
485510
if( zUser ){
486
- blob_append_sql(&sql, " WHERE euser=%Q", zUser);
511
+ blob_append_sql(&sql, " AND euser=%Q", zUser);
487512
}else{
488
- blob_append_sql(&sql, " WHERE euser=%Q", g.zLogin);
513
+ blob_append_sql(&sql, " AND euser=%Q", g.zLogin);
489514
}
490515
}else{
491516
if( g.perm.Admin ){
492517
style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0));
493518
}
494
- blob_append_sql(&sql, " WHERE euser=%Q", g.zLogin);
519
+ blob_append_sql(&sql, " AND euser=%Q", g.zLogin);
495520
}
496521
blob_append_sql(&sql, " ORDER BY edate DESC limit 50");
497522
db_prepare_blob(&q, &sql);
498523
blob_reset(&sql);
499
- @ <ol>
524
+ @ <form action="%R/webmail" method="POST">
525
+ @ <table>
500526
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>
506536
if( showAll ){
507537
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>
509539
}
510
- @ <a href="%s(url_render(&url,"id",zId,0,0))">\
511
- @ %h(zFrom) &rarr; %h(zSubject)</a>
512
- @ %h(zDate)
540
+ @ </tr>
513541
}
514542
db_finalize(&q);
515
- @ </ol>
543
+ @ </table>
544
+ @ </form>
516545
style_footer();
517546
}
518547
--- 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) &rarr; %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

Keyboard Shortcuts

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