@@ -352,26 +352,242 @@
352 352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
353 353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
354 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
emailtoc_free(p);
355 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&email);
356 356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Add the select/option box to the timeline submenu that shows
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the various email message formats.
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void webmail_f_submenu(void){
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *az[] = {
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "0", "Normal",
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "1", "Decoded",
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "2", "Raw",
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_submenu_multichoice("f", sizeof(az)/(2*sizeof(az[0])), az, 0);
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the first N characters of z[] are the name of a header field
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that should be shown in "Normal" mode, then return 1.
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int webmail_normal_header(const char *z, int N){
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *az[] = {
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "To", "Cc", "Bcc", "Date", "From", "Subject",
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<sizeof(az)/sizeof(az[0]); i++){
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3_strnicmp(z, az[i], N)==0 ) return 1;
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Paint a page showing a single email message
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void webmail_show_one_message(
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ HQuery *pUrl, /* Calling context */
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int emailid, /* emailbox.ebid to display */
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zUser /* User who owns it, or NULL if does not matter */
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob sql;
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q;
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eState = -1;
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zENum[30];
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_submenu_element("Index", "%s", url_render(pUrl,"id",0,0,0));
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ webmail_f_submenu();
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&sql, 0, 0);
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_begin_transaction();
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql,
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT decompress(etxt), estate"
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " FROM emailblob, emailbox"
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE emailid=emsgid AND ebid=%d",
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ emailid
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zUser ) blob_append_sql(&sql, " AND euser=%Q", zUser);
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare_blob(&q, &sql);
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&sql);
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_header("Message %d",emailid);
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_step(&q)==SQLITE_ROW ){
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob msg = db_column_text_as_blob(&q, 0);
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eFormat = atoi(PD("f","0"));
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eState = db_column_int(&q, 1);
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFormat==2 ){
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <pre>%h(db_column_text(&q, 0))</pre>
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ EmailToc *p = emailtoc_from_email(&msg);
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, j;
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <p>
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->nHdr; i++){
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *z = p->azHdr[i];
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ email_hdr_unfold(z);
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; z[j] && z[j]!=':'; j++){}
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFormat==0 && !webmail_normal_header(z, j) ) continue;
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z[j]!=':' ){
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ %h(z)<br>
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ z[j] = 0;
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <b>%h(z):</b> %h(z+j+1)<br>
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->nBody; i++){
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <hr><b>Messsage Body #%d(i): %h(p->aBody[i].zMimetype) \
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->aBody[i].zFilename ){
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ "%h(p->aBody[i].zFilename)"
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </b>
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFormat==0 ){
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncmp(p->aBody[i].zMimetype, "text/plain", 10)!=0 ) continue;
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->aBody[i].zFilename ) continue;
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncmp(p->aBody[i].zMimetype, "text/", 5)!=0 ) continue;
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( p->aBody[i].encoding ){
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case EMAILENC_B64: {
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = 0;
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ decodeBase64(p->aBody[i].zContent, &n, p->aBody[i].zContent);
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case EMAILENC_QUOTED: {
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = 0;
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ decodeQuotedPrintable(p->aBody[i].zContent, &n);
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <pre>%h(p->aBody[i].zContent)</pre>
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eState==0 ){
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If is message is currently Unread, change it to Read */
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql,
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE emailbox SET estate=1 "
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE estate=0 AND ebid=%d",
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ emailid
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zUser ) blob_append_sql(&sql, " AND euser=%Q", zUser);
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("%s", blob_sql_text(&sql));
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&sql);
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eState = 1;
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_add_parameter(pUrl, "id", 0);
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_snprintf(sizeof(zENum), zENum, "e%d", emailid);
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eState==2 ){
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_submenu_element("Undelete","%s",
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_render(pUrl,"read","1",zENum,"1"));
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eState==1 ){
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_submenu_element("Delete", "%s",
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_render(pUrl,"trash","1",zENum,"1"));
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_submenu_element("Mark As Unread", "%s",
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_render(pUrl,"unread","1",zENum,"1"));
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eState==3 ){
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_submenu_element("Delete", "%s",
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_render(pUrl,"trash","1",zENum,"1"));
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_end_transaction(0);
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_footer();
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Scan the query parameters looking for parameters with name of the
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** form "eN" where N is an integer. For all such integers, change
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the state of every emailbox entry with ebid==N to eStateNew provided
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that either zUser is NULL or matches.
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Or if eNewState==99, then delete the entries.
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void webmail_change_state(int eNewState, const char *zUser){
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob sql;
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sep = '(';
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zName;
512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n;
513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !cgi_csrf_safe(0) ) return;
514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&sql, 0, 0);
515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eNewState==99 ){
516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, "DELETE FROM emailbox WHERE estate==2 AND ebid IN ");
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, "UPDATE emailbox SET estate=%d WHERE ebid IN ",
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eNewState);
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; (zName = cgi_parameter_name(i))!=0; i++){
522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zName[0]!='e' ) continue;
523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !fossil_isdigit(zName[1]) ) continue;
524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = atoi(zName+1);
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, "%c%d", sep, n);
526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sep = ',';
527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zUser ){
529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, ") AND euser=%Q", zUser);
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, ")");
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sep==',' ){
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("%s", blob_sql_text(&sql));
535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&sql);
537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Add the select/option box to the timeline submenu that shows
542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** which messages to include in the index.
543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void webmail_d_submenu(void){
545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *az[] = {
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "0", "InBox",
547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "1", "Unread",
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "2", "Trash",
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "3", "Sent",
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "4", "Everything",
551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_submenu_multichoice("d", sizeof(az)/(2*sizeof(az[0])), az, 0);
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
357 554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
358 555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
359 556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** WEBPAGE: webmail
360 557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
361 558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This page can be used to read content from the EMAILBOX table
362 559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that contains email received by the "fossil smtpd" command.
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Query parameters:
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** id=N Show a single email entry emailbox.ebid==N
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** f=N Display format. 0: decoded 1: raw
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** user=USER Show mailbox for USER (admin only).
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** user=* Show mailbox for all users (admin only).
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** d=N 0: inbox+unread 1: unread-only 2: trash 3: all
568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** eN Select email entry emailbox.ebid==N
569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** trash Move selected entries to trash (estate=2)
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** read Mark selected entries as read (estate=1)
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** unread Mark selected entries as unread (estate=0)
572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
363 573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
364 574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void webmail_page(void){
365 575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int emailid;
366 576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
367 577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob sql;
368 578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int showAll = 0;
369 579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zUser = 0;
580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int d = 0; /* Display mode. 0..3. d= query parameter */
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int pg = 0; /* Page number */
582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int N = 50; /* Results per page */
583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int got; /* Number of results on this page */
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zPPg[30]; /* Previous page */
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zNPg[30]; /* Next page */
370 586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HQuery url;
371 587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.zLogin==0 ){
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !login_is_individual() ){
373 589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_needed(0);
374 590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
375 591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
376 592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !db_table_exists("repository","emailbox") ){
377 593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_header("Webmail Not Available");
@@ -389,116 +605,208 @@
389 605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fossil_strcmp(zUser,"*")==0 ){
390 606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
showAll = 1;
391 607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zUser = 0;
392 608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
393 609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUser = g.zLogin;
394 612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( P("d") ) url_add_parameter(&url, "d", P("d"));
395 614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( emailid>0 ){
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- style_submenu_element("Index", "%s", url_render(&url,"id",0,0,0));
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_init(&sql, 0, 0);
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_sql(&sql, "SELECT decompress(etxt)"
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " FROM emailblob WHERE emailid=%d",
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- emailid);
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !g.perm.Admin ){
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_sql(&sql, " AND EXISTS(SELECT 1 FROM emailbox WHERE"
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " euser=%Q AND emsgid=emailid)", g.zLogin);
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_prepare_blob(&q, &sql);
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&sql);
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( db_step(&q)==SQLITE_ROW ){
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob msg = db_column_text_as_blob(&q, 0);
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- url_add_parameter(&url, "id", P("id"));
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- style_header("Message %d",emailid);
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( PB("raw") ){
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <pre>%h(db_column_text(&q, 0))</pre>
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- style_submenu_element("Decoded", "%s", url_render(&url,"raw",0,0,0));
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- EmailToc *p = emailtoc_from_email(&msg);
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i, j;
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- style_submenu_element("Raw", "%s", url_render(&url,"raw","1",0,0));
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <p>
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<p->nHdr; i++){
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *z = p->azHdr[i];
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- email_hdr_unfold(z);
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(j=0; z[j] && z[j]!=':'; j++){}
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( z[j]!=':' ){
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ %h(z)<br>
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- z[j] = 0;
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <b>%h(z):</b> %h(z+j+1)<br>
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<p->nBody; i++){
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <hr><b>Messsage Body #%d(i): %h(p->aBody[i].zMimetype) \
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->aBody[i].zFilename ){
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ "%h(p->aBody[i].zFilename)"
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ </b>
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strncmp(p->aBody[i].zMimetype, "text/", 5)!=0 ) continue;
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- switch( p->aBody[i].encoding ){
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case EMAILENC_B64: {
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n = 0;
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- decodeBase64(p->aBody[i].zContent, &n, p->aBody[i].zContent);
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case EMAILENC_QUOTED: {
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n = 0;
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- decodeQuotedPrintable(p->aBody[i].zContent, &n);
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <pre>%h(p->aBody[i].zContent)</pre>
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- style_footer();
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_finalize(&q);
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return;
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_finalize(&q);
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ webmail_show_one_message(&url, emailid, zUser);
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
457 617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
458 618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_header("Webmail");
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ webmail_d_submenu();
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_begin_transaction();
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( P("trash")!=0 ) webmail_change_state(2,zUser);
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( P("unread")!=0 ) webmail_change_state(0,zUser);
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( P("read")!=0 ) webmail_change_state(1,zUser);
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( P("purge")!=0 ) webmail_change_state(99,zUser);
459 625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_init(&sql, 0, 0);
460 626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql,
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 0 1 2 3 4 5 */
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT efrom, datetime(edate,'unixepoch'), estate, esubject, emsgid, euser"
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "CREATE TEMP TABLE tmbox AS "
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT ebid," /* 0 */
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " efrom," /* 1 */
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " datetime(edate,'unixepoch')," /* 2 */
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " estate," /* 3 */
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " esubject," /* 4 */
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " euser" /* 5 */
463 634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" FROM emailbox"
464 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ d = atoi(PD("d","0"));
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( d ){
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 0: { /* Show unread and read */
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " WHERE estate<=1");
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 1: { /* Unread messages only */
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " WHERE estate=0");
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 2: { /* Trashcan only */
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " WHERE estate=2");
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 3: { /* Outgoing email only */
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " WHERE estate=3");
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 4: { /* Everything */
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " WHERE 1");
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
465 659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( showAll ){
466 660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0));
467 661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( zUser!=0 ){
468 662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0));
469 663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fossil_strcmp(zUser, g.zLogin)!=0 ){
470 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_submenu_element("My Emails", "%s", url_render(&url,"user",0,0,0));
471 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
472 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zUser ){
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_sql(&sql, " WHERE euser=%Q", zUser);
667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " AND euser=%Q", zUser);
474 668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_sql(&sql, " WHERE euser=%Q", g.zLogin);
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " AND euser=%Q", g.zLogin);
476 670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
477 671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
478 672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.perm.Admin ){
479 673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_submenu_element("All Users", "%s", url_render(&url,"user","*",0,0));
480 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_sql(&sql, " WHERE euser=%Q", g.zLogin);
675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " AND euser=%Q", g.zLogin);
482 676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_sql(&sql, " ORDER BY edate DESC limit 50");
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_prepare_blob(&q, &sql);
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pg = atoi(PD("pg","0"));
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " ORDER BY edate DESC limit %d offset %d", N+1, pg*N);
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("%s", blob_sql_text(&sql));
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ got = db_int(0, "SELECT count(*) FROM tmbox");
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT * FROM tmbox LIMIT %d", N);
485 682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sql);
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <ol>
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <form action="%R/webmail" method="POST">
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <table border="0" width="100%%">
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr><td align="left">
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( d==2 ){
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="submit" name="read" value="Undelete">
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="submit" name="purge" value="Delete Permanently">
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="submit" name="trash", value="Delete">
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( d!=1 ){
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="submit" name="unread" value="Mark as unread">
693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="submit" name="read" value="Mark as read">
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <a href="%s(url_render(&url,0,0,0,0))">refresh</a>
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </td><td align="right">
698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pg>0 ){
699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_snprintf(sizeof(zPPg), zPPg, "%d", pg-1);
700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <a href="%s(url_render(&url,"pg",zPPg,0,0))">< Newer</a>
701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( got>50 ){
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_snprintf(sizeof(zNPg),zNPg,"%d",pg+1);
704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <a href="%s(url_render(&url,"pg",zNPg,0,0))">Older ></a></td>
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </table>
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <table>
487 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zId = db_column_text(&q,4);
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zFrom = db_column_text(&q, 0);
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zDate = db_column_text(&q, 1);
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zSubject = db_column_text(&q, 3);
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <li>
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zId = db_column_text(&q,0);
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zFrom = db_column_text(&q, 1);
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zDate = db_column_text(&q, 2);
712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zSubject = db_column_text(&q, 4);
713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr>
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td><input type="checkbox" name="e%s(zId)"></td>
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td>%h(zFrom)</td>
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td><a href="%s(url_render(&url,"id",zId,0,0))">%h(zSubject)</a> \
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ %s(zDate)</td>
493 718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( showAll ){
494 719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTo = db_column_text(&q,5);
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <a href="%s(url_render(&url,"user",zTo,0,0))">%h(zTo)</a>:
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td><a href="%s(url_render(&url,"user",zTo,0,0))">%h(zTo)</a></td>
496 721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <a href="%s(url_render(&url,"id",zId,0,0))">\
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ %h(zFrom) → %h(zSubject)</a>
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ %h(zDate)
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </tr>
500 723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
501 724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ </ol>
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- style_footer();
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </table>
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </form>
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_footer();
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_end_transaction(0);
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WEBPAGE: test-emailblob
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This page, accessible only to administrators, allows easy viewing of
735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the emailblob table - the table that contains the text of email messages
736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** both inbound and outbound, and transcripts of SMTP sessions.
737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** id=N Show the text of emailblob with emailid==N
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void webmail_emailblob_page(void){
742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int id = atoi(PD("id","0"));
743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q;
744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ login_check_credentials();
745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !g.perm.Setup ){
746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ login_needed(0);
747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ add_content_sql_commands(g.db);
750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_header("emailblob table");
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( id>0 ){
752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_submenu_element("Index", "%R/test-emailblob");
753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <ul>
754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT emailid FROM emailblob WHERE ets=%d", id);
755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int id = db_column_int(&q, 0);
757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <li> <a href="%R/test-emailblob?id=%d(id)">emailblob entry %d(id)</a>
758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT euser, estate FROM emailbox WHERE emsgid=%d", id);
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zUser = db_column_text(&q, 0);
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int e = db_column_int(&q, 1);
764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <li> emailbox for %h(zUser) state %d(e)
765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT efrom, eto FROM emailoutq WHERE emsgid=%d", id);
768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zFrom = db_column_text(&q, 0);
770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTo = db_column_text(&q, 1);
771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <li> emailoutq message body from %h(zFrom) to %h(zTo)
772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT efrom, eto FROM emailoutq WHERE ets=%d", id);
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zFrom = db_column_text(&q, 0);
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTo = db_column_text(&q, 1);
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <li> emailoutq transcript from %h(zFrom) to %h(zTo)
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </ul>
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <hr>
783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT decompress(etxt) FROM emailblob WHERE emailid=%d",
784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id);
785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zContent = db_column_text(&q, 0);
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <pre>%h(zContent)</pre>
788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q,
792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT emailid, enref, ets, datetime(etime,'unixepoch')"
793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " FROM emailblob ORDER BY etime DESC, emailid DESC");
794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <table border="1" cellpadding="5" cellspacing="0">
795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr><th> emailid <th> enref <th> ets <th> etime</tr>
796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int id = db_column_int(&q, 0);
798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nref = db_column_int(&q, 1);
799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ets = db_column_int(&q, 2);
800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zDate = db_column_text(&q, 3);
801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr>
802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td><a href="%R/test-emailblob?id=%d(id)">%d(id)</a>
803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td>%d(nref)</td>
804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td>%d(ets)</td>
805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td>%h(zDate)</td>
806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </tr>
807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </table>
809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_footer();
504 812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
505 813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!