[idms-dbma-devel]commit - r46 - trunk/modules/protocols/smtp
Status: Pre-Alpha
Brought to you by:
nkukard
|
From: <idm...@li...> - 2004-10-22 20:26:25
|
Author: nkukard
Date: 2004-10-22 22:26:06 +0200 (Fri, 22 Oct 2004)
New Revision: 46
Modified:
trunk/modules/protocols/smtp/command_lexer.l
trunk/modules/protocols/smtp/command_parser.y
trunk/modules/protocols/smtp/smtp_cmd_rcpt.c
Log:
* Added special case <postmaster> to RCPT command
Modified: trunk/modules/protocols/smtp/command_lexer.l
===================================================================
--- trunk/modules/protocols/smtp/command_lexer.l 2004-10-20 11:07:57 UTC (rev 45)
+++ trunk/modules/protocols/smtp/command_lexer.l 2004-10-22 20:26:06 UTC (rev 46)
@@ -312,7 +312,7 @@
/* Local part stuff */
lp_atom [#&+\-.0-9=A-Z_a-z]+
-lp_quoted \"{lp_atom}\"
+lp_quoted \"{lp_atom}\"
local_part ({lp_atom}|{lp_quoted})
/* Domain definition as per RFC1035 - condensed & with address literals */
@@ -430,8 +430,19 @@
}
<C_LOCAL_PART>{local_part} {
BEGIN(C_AT_SIGN);
- save_text_param(&scanner->commandParams,dequote(yytext));
- return LOCAL_PART;
+ /* Check if this is the special case "postmaster" */
+ if (strncasecmp(yytext,"postmaster",10) != 0)
+ {
+ /* Our local_part can be included in double quotes, use dequote() to remove these */
+ save_text_param(&scanner->commandParams,dequote(yytext));
+ return LOCAL_PART;
+ }
+ else
+ {
+ /* Local part cannot be postmaster and double quoted */
+ save_text_param(&scanner->commandParams,strdup(yytext));
+ return LOCAL_PART_POSTMASTER;
+ }
}
<C_AT_SIGN>{at_sign} {
BEGIN(C_DOMAIN_PART);
@@ -442,7 +453,7 @@
save_text_param(&scanner->commandParams,strdup(yytext));
return DOMAIN_PART;
}
-<C_MAIL_END,C_LOCAL_PART>{gthan} {
+<C_MAIL_END,C_LOCAL_PART,C_AT_SIGN>{gthan} {
/* Check if we can enable some more cool stuff */
if (protoData->mode == SMTP_MODE_ESMTP)
Modified: trunk/modules/protocols/smtp/command_parser.y
===================================================================
--- trunk/modules/protocols/smtp/command_parser.y 2004-10-20 11:07:57 UTC (rev 45)
+++ trunk/modules/protocols/smtp/command_parser.y 2004-10-22 20:26:06 UTC (rev 46)
@@ -57,6 +57,7 @@
%token RCPT
%token STHAN
%token LOCAL_PART
+%token LOCAL_PART_POSTMASTER
%token DOMAIN_PART
%token GTHAN
%token ESMTP_KEYWORD
@@ -166,21 +167,22 @@
| esmtp_params esmtp_param
;
-email_address:
- STHAN LOCAL_PART AT_SIGN DOMAIN_PART GTHAN
+email_address_possible_postmaster:
+ LOCAL_PART AT_SIGN DOMAIN_PART
+ | LOCAL_PART_POSTMASTER
+ | LOCAL_PART_POSTMASTER AT_SIGN DOMAIN_PART
;
-empty_email_address:
- STHAN GTHAN
+email_address_possible_empty:
+ | LOCAL_PART AT_SIGN DOMAIN_PART
;
mail_address:
- possible_whitespace email_address
- | possible_whitespace empty_email_address
+ possible_whitespace STHAN email_address_possible_empty GTHAN
;
rcpt_address:
- possible_whitespace email_address
+ possible_whitespace STHAN email_address_possible_postmaster GTHAN
;
help_params:
Modified: trunk/modules/protocols/smtp/smtp_cmd_rcpt.c
===================================================================
--- trunk/modules/protocols/smtp/smtp_cmd_rcpt.c 2004-10-20 11:07:57 UTC (rev 45)
+++ trunk/modules/protocols/smtp/smtp_cmd_rcpt.c 2004-10-22 20:26:06 UTC (rev 46)
@@ -32,15 +32,16 @@
{
struct smtp_data_t *data = connection->data;
struct smtp_envelope_addy_t *addy;
+ int num_text_params;
- /* Check our params are ok */
- if (cmdNumParams(cmdStruct->params,SMTP_PARAM_TEXT) != 2)
- {
- D_PRINT(D_FATAL,"Wrong number of params");
+ /* Get the number of text parameters we have */
+ num_text_params = cmdNumParams(cmdStruct->params,SMTP_PARAM_TEXT);
+
+ /* This is impossible */
+ if (num_text_params > 2 || num_text_params < 1)
return SMTP_ERROR_FATAL;
- }
-
+
/* Allocate memory for our envelope address */
if (!(addy = malloc(sizeof(struct smtp_envelope_addy_t))))
{
@@ -48,11 +49,21 @@
return SMTP_ERROR_FATAL;
}
- /* First 2 params are the email address & domain */
- addy->localPart = strdup(cmdGetParamData(cmdStruct->params,SMTP_PARAM_TEXT,0));
- addy->domainPart = strdup(cmdGetParamData(cmdStruct->params,SMTP_PARAM_TEXT,1));
+ /* Check our params are ok */
+ if (num_text_params == 2) /* Normal email address */
+ {
+ /* First 2 text params are the email address & domain */
+ addy->localPart = strdup(cmdGetParamData(cmdStruct->params,SMTP_PARAM_TEXT,0));
+ addy->domainPart = strdup(cmdGetParamData(cmdStruct->params,SMTP_PARAM_TEXT,1));
+ }
+ else if (num_text_params == 1) /* Special case <postmaster> */
+ {
+ /* As I said, special case <postmaster> */
+ addy->localPart = strdup(cmdGetParamData(cmdStruct->params,SMTP_PARAM_TEXT,0));
+ addy->domainPart = NULL;
+ }
- /* Add this address to our envelopeFrom */
+ /* Add this address to our envelopeTo */
data->envelopeTo = g_list_append(data->envelopeTo,addy);
data->state = SMTP_STATE_DATA; /* We now waiting for data */
|