]> granicus.if.org Git - curl/commitdiff
ftpserver.pl: Expanded the SMTP MAIL handler to validate messages
authorSteve Holme <steve_holme@hotmail.com>
Wed, 18 Sep 2013 06:16:53 +0000 (07:16 +0100)
committerSteve Holme <steve_holme@hotmail.com>
Wed, 18 Sep 2013 06:23:32 +0000 (07:23 +0100)
MAIl_smtp() will now check for a correctly formatted FROM address as
well as the optional SIZE parameter comparing it against the server
capability when specified.

tests/ftpserver.pl

index c647982b44f2b841686a237ab1acda8c1036e156..65e522312464371620f7baefb71eee03b5b0ef50 100755 (executable)
@@ -739,7 +739,56 @@ sub EHLO_smtp {
 }
 
 sub MAIL_smtp {
-    sendcontrol "250 Sender OK\r\n";
+    my ($args) = @_;
+
+    logmsg "MAIL_smtp got $args\n";
+
+    if (!$args) {
+        sendcontrol "501 Unrecognized parameter\r\n";
+    }
+    else {
+        my $from;
+        my $size;
+        my @elements = split(/ /, $args);
+
+        # Get the FROM and SIZE parameters
+        for my $e (@elements) {
+            if($e =~ /^FROM:(.*)$/) {
+                $from = $1;
+            }
+            elsif($e =~ /^SIZE=(\d+)$/) {
+                $size = $1;
+            }
+        }
+
+        # Validate the from address (only <> and a valid email address inside
+        # <> are allowed, such as <user@example.com>)
+        if ((!$from) || (($from ne "<>") && ($from !~
+            /^<([a-zA-Z][\w_.]+)\@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})>$/))) {
+            sendcontrol "501 Invalid address\r\n";
+        }
+        else {
+            my @found;
+            my $valid = 1;
+
+            # Check the capabilities for SIZE and if the specified size is
+            # greater than the message size then reject it
+            if (@found = grep /^SIZE (\d+)$/, @capabilities) {
+                if ($found[0] =~ /^SIZE (\d+)$/) {
+                    if ($size > $1) {
+                        valid = 0;
+                    }
+                }
+            }
+
+            if(!$valid) {
+                sendcontrol "552 Message size too large\r\n";
+            }
+            else {
+                sendcontrol "250 Sender OK\r\n";
+            }
+        }
+    }
 
     return 0;
 }