]> git.proxmox.com Git - pve-common.git/commitdiff
sendmail: use more complete email regex and shellquote
authorFabian Ebner <f.ebner@proxmox.com>
Mon, 15 Feb 2021 12:24:55 +0000 (13:24 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 18 Feb 2021 11:49:12 +0000 (12:49 +0100)
Shellquote is needed for '~', and while it doesn't help with '-',
there should be no problem, because options are separated from mailto
since commit 216a3f4f131693dc4bbad5e06e96a61baef5f5e9.

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
Reviewed-By: Dominik Csapak <d.csapak@proxmox.com>
src/PVE/JSONSchema.pm
src/PVE/Tools.pm

index 29ada5bc06570ea6853ca0736e303f5fd89befa5..5870b69507ac718823d74a57168afc893987c52e 100644 (file)
@@ -471,7 +471,7 @@ register_format('email', \&pve_verify_email);
 sub pve_verify_email {
     my ($email, $noerr) = @_;
 
-    if ($email !~ /^[\w\+\-\~]+(\.[\w\+\-\~]+)*@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*$/) {
+    if ($email !~ /^$PVE::Tools::EMAIL_RE$/) {
           return undef if $noerr;
           die "value does not look like a valid email address\n";
     }
index 7fefa52778a99662c0260435e425b8c2dbadba22..fc4a367214af378451c4bab63035086e9918d5e9 100644 (file)
@@ -87,6 +87,9 @@ our $IPV6RE = "(?:" .
 
 our $IPRE = "(?:$IPV4RE|$IPV6RE)";
 
+our $EMAIL_USER_RE = qr/[\w\+\-\~]+(\.[\w\+\-\~]+)*/;
+our $EMAIL_RE = qr/$EMAIL_USER_RE@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*/;
+
 use constant {CLONE_NEWNS   => 0x00020000,
               CLONE_NEWUTS  => 0x04000000,
               CLONE_NEWIPC  => 0x08000000,
@@ -1469,23 +1472,27 @@ sub sync_mountpoint {
 # mailto may be a single email string or an array of receivers
 sub sendmail {
     my ($mailto, $subject, $text, $html, $mailfrom, $author) = @_;
-    my $mail_re = qr/[^-a-zA-Z0-9+._@]/;
 
     $mailto = [ $mailto ] if !ref($mailto);
 
+    my $mailto_quoted = [];
     for my $to (@$mailto) {
-       die "illegal character in mailto address\n" if $to =~ $mail_re;
+       die "mailto does not look like a valid email address or username\n"
+           if $to !~ /^$EMAIL_RE$/ && $to !~ /^$EMAIL_USER_RE$/;
+       push @$mailto_quoted, shellquote($to);
     }
 
     my $rcvrtxt = join (', ', @$mailto);
 
     $mailfrom = $mailfrom || "root";
-    die "illegal character in mailfrom address\n" if $mailfrom =~ $mail_re;
+    die "mailfrom does not look like a valid email address or username\n"
+           if $mailfrom !~ /^$EMAIL_RE$/ && $mailfrom !~ /^$EMAIL_USER_RE$/;
+    my $mailfrom_quoted = shellquote($mailfrom);
 
     $author = $author // 'Proxmox VE';
 
-    open (MAIL, "|-", "sendmail", "-B", "8BITMIME", "-f", $mailfrom, "--", @$mailto) ||
-       die "unable to open 'sendmail' - $!";
+    open (MAIL, "|-", "sendmail", "-B", "8BITMIME", "-f", $mailfrom_quoted,
+       "--", @$mailto_quoted) || die "unable to open 'sendmail' - $!";
 
     my $date = time2str('%a, %d %b %Y %H:%M:%S %z', time());