Fossil SCM

Add support for TOP and CAPA to pop3d.

drh 2018-07-18 02:09 trunk
Commit 2c18ed076e008633641ff49d4ca0e1787f04496b3273307eeb66724a750a51d0
1 file changed +24 -7
+24 -7
--- src/smtp.c
+++ src/smtp.c
@@ -1373,11 +1373,11 @@
13731373
void pop3d_command(void){
13741374
char *zDbName;
13751375
char *zA1, *zA2, *zCmd, *z;
13761376
int inAuth = 1;
13771377
int i;
1378
- FILE *pLog;
1378
+ FILE *pLog = 0;
13791379
const char *zDir;
13801380
Stmt q;
13811381
char zIn[1000];
13821382
char zUser[100];
13831383
zDir = find_option("logdir",0,1);
@@ -1397,10 +1397,22 @@
13971397
if( pLog ) fprintf(pLog, "C: %s", zIn);
13981398
zCmd = zIn;
13991399
zA1 = pop3d_arg(zCmd);
14001400
zA2 = zA1 ? pop3d_arg(zA1) : 0;
14011401
for(i=0; zCmd[i]; i++){ zCmd[i] = fossil_tolower(zCmd[i]); }
1402
+ if( strcmp(zCmd,"capa")==0 ){
1403
+ static const char *azCap[] = {
1404
+ "TOP", "USER", "UIDL",
1405
+ };
1406
+ int i;
1407
+ pop3_print(pLog, "+OK");
1408
+ for(i=0; i<sizeof(azCap)/sizeof(azCap[0]); i++){
1409
+ pop3_print(pLog, azCap[i]);
1410
+ }
1411
+ pop3_print(pLog, ".");
1412
+ continue;
1413
+ }
14021414
if( inAuth ){
14031415
if( strcmp(zCmd,"user")==0 ){
14041416
if( zA1==0 || zA2!=0 ) goto cmd_error;
14051417
sqlite3_snprintf(sizeof(zUser),zUser,"%s",zA1);
14061418
goto cmd_ok;
@@ -1471,28 +1483,36 @@
14711483
pop3_print(pLog, ".");
14721484
}
14731485
db_finalize(&q);
14741486
continue;
14751487
}
1476
- if( strcmp(zCmd,"retr")==0 ){
1488
+ if( strcmp(zCmd,"retr")==0 || strcmp(zCmd,"top")==0 ){
14771489
Blob all, line;
14781490
int nLine = 0;
1491
+ int iLimit;
1492
+ int hdrSeen = 0;
14791493
if( zA1==0 ) goto cmd_error;
1494
+ iLimit = zA2 ? atoi(zA2) : 2147483647;
1495
+ if( iLimit<=0 ) goto cmd_error;
14801496
z = db_text(0, "SELECT decompress(emailblob.etxt) "
14811497
" FROM emailblob, pop3"
14821498
" WHERE emailblob.emailid=pop3.emailid"
14831499
" AND pop3.id=%d AND NOT pop3.isDel",
14841500
atoi(zA1));
14851501
if( z==0 ) goto cmd_error;
14861502
pop3_print(pLog, "+OK");
14871503
blob_init(&all, z, -1);
1488
- while( blob_line(&all, &line) ){
1489
- if( blob_buffer(&line)[0]=='.' ){
1504
+ while( iLimit && blob_line(&all, &line) ){
1505
+ char c = blob_buffer(&line)[0];
1506
+ if( c=='.' ){
14901507
fputc('.', stdout);
1508
+ }else if( c=='\r' || c=='\n' ){
1509
+ hdrSeen = 1;
14911510
}
14921511
fwrite(blob_buffer(&line), 1, blob_size(&line), stdout);
14931512
nLine++;
1513
+ if( hdrSeen ) iLimit--;
14941514
}
14951515
if( pLog ) fprintf(pLog, "S: # %d lines of content\n", nLine);
14961516
pop3_print(pLog, ".");
14971517
fossil_free(z);
14981518
blob_reset(&all);
@@ -1507,13 +1527,10 @@
15071527
}
15081528
if( strcmp(zCmd,"rset")==0 ){
15091529
db_multi_exec("UPDATE pop3 SET isDel=0");
15101530
goto cmd_ok;
15111531
}
1512
- if( strcmp(zCmd,"top")==0 ){
1513
- goto cmd_error;
1514
- }
15151532
if( strcmp(zCmd,"uidl")==0 ){
15161533
if( zA1 ){
15171534
db_prepare(&q, "SELECT id, emailid FROM pop3"
15181535
" WHERE id=%d AND NOT isDel", atoi(zA1));
15191536
if( db_step(&q)==SQLITE_ROW ){
15201537
--- src/smtp.c
+++ src/smtp.c
@@ -1373,11 +1373,11 @@
1373 void pop3d_command(void){
1374 char *zDbName;
1375 char *zA1, *zA2, *zCmd, *z;
1376 int inAuth = 1;
1377 int i;
1378 FILE *pLog;
1379 const char *zDir;
1380 Stmt q;
1381 char zIn[1000];
1382 char zUser[100];
1383 zDir = find_option("logdir",0,1);
@@ -1397,10 +1397,22 @@
1397 if( pLog ) fprintf(pLog, "C: %s", zIn);
1398 zCmd = zIn;
1399 zA1 = pop3d_arg(zCmd);
1400 zA2 = zA1 ? pop3d_arg(zA1) : 0;
1401 for(i=0; zCmd[i]; i++){ zCmd[i] = fossil_tolower(zCmd[i]); }
 
 
 
 
 
 
 
 
 
 
 
 
1402 if( inAuth ){
1403 if( strcmp(zCmd,"user")==0 ){
1404 if( zA1==0 || zA2!=0 ) goto cmd_error;
1405 sqlite3_snprintf(sizeof(zUser),zUser,"%s",zA1);
1406 goto cmd_ok;
@@ -1471,28 +1483,36 @@
1471 pop3_print(pLog, ".");
1472 }
1473 db_finalize(&q);
1474 continue;
1475 }
1476 if( strcmp(zCmd,"retr")==0 ){
1477 Blob all, line;
1478 int nLine = 0;
 
 
1479 if( zA1==0 ) goto cmd_error;
 
 
1480 z = db_text(0, "SELECT decompress(emailblob.etxt) "
1481 " FROM emailblob, pop3"
1482 " WHERE emailblob.emailid=pop3.emailid"
1483 " AND pop3.id=%d AND NOT pop3.isDel",
1484 atoi(zA1));
1485 if( z==0 ) goto cmd_error;
1486 pop3_print(pLog, "+OK");
1487 blob_init(&all, z, -1);
1488 while( blob_line(&all, &line) ){
1489 if( blob_buffer(&line)[0]=='.' ){
 
1490 fputc('.', stdout);
 
 
1491 }
1492 fwrite(blob_buffer(&line), 1, blob_size(&line), stdout);
1493 nLine++;
 
1494 }
1495 if( pLog ) fprintf(pLog, "S: # %d lines of content\n", nLine);
1496 pop3_print(pLog, ".");
1497 fossil_free(z);
1498 blob_reset(&all);
@@ -1507,13 +1527,10 @@
1507 }
1508 if( strcmp(zCmd,"rset")==0 ){
1509 db_multi_exec("UPDATE pop3 SET isDel=0");
1510 goto cmd_ok;
1511 }
1512 if( strcmp(zCmd,"top")==0 ){
1513 goto cmd_error;
1514 }
1515 if( strcmp(zCmd,"uidl")==0 ){
1516 if( zA1 ){
1517 db_prepare(&q, "SELECT id, emailid FROM pop3"
1518 " WHERE id=%d AND NOT isDel", atoi(zA1));
1519 if( db_step(&q)==SQLITE_ROW ){
1520
--- src/smtp.c
+++ src/smtp.c
@@ -1373,11 +1373,11 @@
1373 void pop3d_command(void){
1374 char *zDbName;
1375 char *zA1, *zA2, *zCmd, *z;
1376 int inAuth = 1;
1377 int i;
1378 FILE *pLog = 0;
1379 const char *zDir;
1380 Stmt q;
1381 char zIn[1000];
1382 char zUser[100];
1383 zDir = find_option("logdir",0,1);
@@ -1397,10 +1397,22 @@
1397 if( pLog ) fprintf(pLog, "C: %s", zIn);
1398 zCmd = zIn;
1399 zA1 = pop3d_arg(zCmd);
1400 zA2 = zA1 ? pop3d_arg(zA1) : 0;
1401 for(i=0; zCmd[i]; i++){ zCmd[i] = fossil_tolower(zCmd[i]); }
1402 if( strcmp(zCmd,"capa")==0 ){
1403 static const char *azCap[] = {
1404 "TOP", "USER", "UIDL",
1405 };
1406 int i;
1407 pop3_print(pLog, "+OK");
1408 for(i=0; i<sizeof(azCap)/sizeof(azCap[0]); i++){
1409 pop3_print(pLog, azCap[i]);
1410 }
1411 pop3_print(pLog, ".");
1412 continue;
1413 }
1414 if( inAuth ){
1415 if( strcmp(zCmd,"user")==0 ){
1416 if( zA1==0 || zA2!=0 ) goto cmd_error;
1417 sqlite3_snprintf(sizeof(zUser),zUser,"%s",zA1);
1418 goto cmd_ok;
@@ -1471,28 +1483,36 @@
1483 pop3_print(pLog, ".");
1484 }
1485 db_finalize(&q);
1486 continue;
1487 }
1488 if( strcmp(zCmd,"retr")==0 || strcmp(zCmd,"top")==0 ){
1489 Blob all, line;
1490 int nLine = 0;
1491 int iLimit;
1492 int hdrSeen = 0;
1493 if( zA1==0 ) goto cmd_error;
1494 iLimit = zA2 ? atoi(zA2) : 2147483647;
1495 if( iLimit<=0 ) goto cmd_error;
1496 z = db_text(0, "SELECT decompress(emailblob.etxt) "
1497 " FROM emailblob, pop3"
1498 " WHERE emailblob.emailid=pop3.emailid"
1499 " AND pop3.id=%d AND NOT pop3.isDel",
1500 atoi(zA1));
1501 if( z==0 ) goto cmd_error;
1502 pop3_print(pLog, "+OK");
1503 blob_init(&all, z, -1);
1504 while( iLimit && blob_line(&all, &line) ){
1505 char c = blob_buffer(&line)[0];
1506 if( c=='.' ){
1507 fputc('.', stdout);
1508 }else if( c=='\r' || c=='\n' ){
1509 hdrSeen = 1;
1510 }
1511 fwrite(blob_buffer(&line), 1, blob_size(&line), stdout);
1512 nLine++;
1513 if( hdrSeen ) iLimit--;
1514 }
1515 if( pLog ) fprintf(pLog, "S: # %d lines of content\n", nLine);
1516 pop3_print(pLog, ".");
1517 fossil_free(z);
1518 blob_reset(&all);
@@ -1507,13 +1527,10 @@
1527 }
1528 if( strcmp(zCmd,"rset")==0 ){
1529 db_multi_exec("UPDATE pop3 SET isDel=0");
1530 goto cmd_ok;
1531 }
 
 
 
1532 if( strcmp(zCmd,"uidl")==0 ){
1533 if( zA1 ){
1534 db_prepare(&q, "SELECT id, emailid FROM pop3"
1535 " WHERE id=%d AND NOT isDel", atoi(zA1));
1536 if( db_step(&q)==SQLITE_ROW ){
1537

Keyboard Shortcuts

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