]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1083737: Validate the smtpserver parameter
authorFrédéric Buclin <LpSolit@gmail.com>
Tue, 21 Oct 2014 10:07:31 +0000 (12:07 +0200)
committerFrédéric Buclin <LpSolit@gmail.com>
Tue, 21 Oct 2014 10:07:31 +0000 (12:07 +0200)
r=dkl a=glob

Bugzilla/Config/Common.pm
Bugzilla/Config/MTA.pm

index 9f38436e896448a50f123ae1eb4c5b96b4c81542..fe6a2c2c0aa8cfc8b5cedd2762f5f64b64166eca 100644 (file)
@@ -29,7 +29,7 @@ use parent qw(Exporter);
        check_mail_delivery_method check_notification check_utf8
        check_bug_status check_smtp_auth check_theschwartz_available
        check_maxattachmentsize check_email check_smtp_ssl
-       check_comment_taggers_group
+       check_comment_taggers_group check_smtp_server
 );
 
 # Checking functions for the various values
@@ -342,6 +342,33 @@ sub check_notification {
     return "";
 }
 
+sub check_smtp_server {
+    my $host = shift;
+    my $port;
+
+    if ($host =~ /:/) {
+        ($host, $port) = split(/:/, $host, 2);
+        unless ($port && detaint_natural($port)) {
+            return "Invalid port. It must be an integer (typically 25, 465 or 587)";
+        }
+    }
+    trick_taint($host);
+    # Let's first try to connect using SSL. If this fails, we fall back to
+    # an unencrypted connection.
+    foreach my $method (['Net::SMTP::SSL', 465], ['Net::SMTP', 25]) {
+        my ($class, $default_port) = @$method;
+        next if $class eq 'Net::SMTP::SSL' && !Bugzilla->feature('smtp_ssl');
+        eval "require $class";
+        my $smtp = $class->new($host, Port => $port || $default_port, Timeout => 5);
+        if ($smtp) {
+            # The connection works!
+            $smtp->quit;
+            return '';
+        }
+    }
+    return "Cannot connect to $host" . ($port ? " using port $port" : "");
+}
+
 sub check_smtp_auth {
     my $username = shift;
     if ($username and !Bugzilla->feature('smtp_auth')) {
@@ -498,6 +525,8 @@ valid group is provided.
 
 =item check_shadowdb
 
+=item check_smtp_server
+
 =item check_smtp_auth
 
 =item check_url
index 7be439bf69557a324289d8e97f211400bf75dae3..467bdab3f9384d5e0305fe0c823867773c856710 100644 (file)
@@ -42,7 +42,8 @@ sub get_param_list {
   {
    name => 'smtpserver',
    type => 't',
-   default => 'localhost'
+   default => 'localhost',
+   checker => \&check_smtp_server
   },
   {
    name => 'smtp_username',