We now check all allowed chars in the address before the @ sign.
To check the fqdn of an email the function validfqdn has been adapted as well. Here a valid domain part is for example: user@ipfire or user@localhost.localdomain
Signed-off-by: Alexander Marx alexander.marx@ipfire.org --- config/cfgroot/general-functions.pl | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/config/cfgroot/general-functions.pl b/config/cfgroot/general-functions.pl index 2b5cd19..564a904 100644 --- a/config/cfgroot/general-functions.pl +++ b/config/cfgroot/general-functions.pl @@ -653,9 +653,6 @@ sub validfqdn # Checks a fully qualified domain name against RFC1035 my $fqdn = $_[0]; my @parts = split (/./, $fqdn); # Split hostname at the '.' - if (scalar(@parts) < 2) { # At least two parts should - return 0;} # exist in a FQDN - # (i.e. hostname.domain) foreach $part (@parts) { # Each part should be at least one character in length # but no more than 63 characters @@ -747,14 +744,25 @@ sub ipcidr2msk { }
sub validemail { - my $mail = shift; - return 0 if ( $mail !~ /^[0-9a-zA-Z.-_]+@[0-9a-zA-Z.-]+$/ ); - return 0 if ( $mail =~ /^[^0-9a-zA-Z]|[^0-9a-zA-Z]$/); - return 0 if ( $mail !~ /([0-9a-zA-Z]{1})@./ ); - return 0 if ( $mail !~ /.@([0-9a-zA-Z]{1})/ ); - return 0 if ( $mail =~ /..-.|.-..|....|.--./g ); - return 0 if ( $mail =~ /.._.|.-_.|._..|._-.|.__./g ); - return 0 if ( $mail !~ /.([a-zA-Z]{2,4})$/ ); + my $address = shift; + my @parts = split( /@/, $address ); + my $count=@parts; + + #check if we have one part before and after '@' + return 0 if ( $count != 2 ); + + #check if one of the parts starts or ends with a dot + return 0 if ( substr($parts[0],0,1) eq '.' ); + return 0 if ( substr($parts[0],-1,1) eq '.' ); + return 0 if ( substr($parts[1],0,1) eq '.' ); + return 0 if ( substr($parts[1],-1,1) eq '.' ); + + #check first addresspart (before '@' sign) + return 0 if ( $parts[0] !~ m/^[a-zA-Z0-9.!-+#]+$/ ); + + #check second addresspart (after '@' sign) + return 0 if ( !&validfqdn( $parts[1] ) ); + return 1; }
Hi,
okay, this looks better, but I still would like to request a change:
On Mon, 2015-11-16 at 11:53 +0100, Alexander Marx wrote:
We now check all allowed chars in the address before the @ sign.
To check the fqdn of an email the function validfqdn has been adapted as well. Here a valid domain part is for example: user@ipfire or user@localhost.localdomain
Signed-off-by: Alexander Marx alexander.marx@ipfire.org
config/cfgroot/general-functions.pl | 30 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/config/cfgroot/general-functions.pl b/config/cfgroot/general-functions.pl index 2b5cd19..564a904 100644 --- a/config/cfgroot/general-functions.pl +++ b/config/cfgroot/general-functions.pl @@ -653,9 +653,6 @@ sub validfqdn # Checks a fully qualified domain name against RFC1035 my $fqdn = $_[0]; my @parts = split (/./, $fqdn); # Split hostname at the '.'
- if (scalar(@parts) < 2) { # At least two
parts should
return 0;} # exist in a FQDN
# (i.e.
hostname.domain) foreach $part (@parts) { # Each part should be at least one character in length # but no more than 63 characters @@ -747,14 +744,25 @@ sub ipcidr2msk { }
This function above is called validfqdn and is supposed (according to the comment) to check for a FQDN as defined in RFC1035. You change changes that. Therefore I think this function should be left as it is so other things that use this function don't break.
sub validemail {
- my $mail = shift;
- return 0 if ( $mail !~ /^[0-9a-zA-Z.-_]+@[0-9a-zA-Z.-]+$/
);
- return 0 if ( $mail =~ /^[^0-9a-zA-Z]|[^0-9a-zA-Z]$/);
- return 0 if ( $mail !~ /([0-9a-zA-Z]{1})@./ );
- return 0 if ( $mail !~ /.@([0-9a-zA-Z]{1})/ );
- return 0 if ( $mail =~ /..-.|.-..|....|.--./g );
- return 0 if ( $mail =~ /.._.|.-_.|._..|._-.|.__./g );
- return 0 if ( $mail !~ /.([a-zA-Z]{2,4})$/ );
- my $address = shift;
- my @parts = split( /@/, $address );
- my $count=@parts;
- #check if we have one part before and after '@'
- return 0 if ( $count != 2 );
- #check if one of the parts starts or ends with a dot
- return 0 if ( substr($parts[0],0,1) eq '.' );
- return 0 if ( substr($parts[0],-1,1) eq '.' );
- return 0 if ( substr($parts[1],0,1) eq '.' );
- return 0 if ( substr($parts[1],-1,1) eq '.' );
- #check first addresspart (before '@' sign)
- return 0 if ( $parts[0] !~ m/^[a-zA-Z0-9.!-+#]+$/ );
- #check second addresspart (after '@' sign)
- return 0 if ( !&validfqdn( $parts[1] ) );
If the FQDN function is not amended, the domain name should just be checked for invalid characters.
- return 1;
}
-Michael
Well, according to your last mail regarding this patch, you stated that we *should* use the validfqdn function to check the domainpart... (The reason was, that i just checked for valid chars in the domainpart already)?! As we earlier discussed, a valid domain could be "user@ipfire", if we own a top-level domain...
I am a little bit confused now...
Am 16.11.2015 um 15:12 schrieb Michael Tremer:
Hi,
okay, this looks better, but I still would like to request a change:
On Mon, 2015-11-16 at 11:53 +0100, Alexander Marx wrote:
We now check all allowed chars in the address before the @ sign.
To check the fqdn of an email the function validfqdn has been adapted as well. Here a valid domain part is for example: user@ipfire or user@localhost.localdomain
Signed-off-by: Alexander Marx alexander.marx@ipfire.org
config/cfgroot/general-functions.pl | 30 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/config/cfgroot/general-functions.pl b/config/cfgroot/general-functions.pl index 2b5cd19..564a904 100644 --- a/config/cfgroot/general-functions.pl +++ b/config/cfgroot/general-functions.pl @@ -653,9 +653,6 @@ sub validfqdn # Checks a fully qualified domain name against RFC1035 my $fqdn = $_[0]; my @parts = split (/./, $fqdn); # Split hostname at the '.'
- if (scalar(@parts) < 2) { # At least two
parts should
return 0;} # exist in a FQDN
# (i.e.
hostname.domain) foreach $part (@parts) { # Each part should be at least one character in length # but no more than 63 characters @@ -747,14 +744,25 @@ sub ipcidr2msk { }
This function above is called validfqdn and is supposed (according to the comment) to check for a FQDN as defined in RFC1035. You change changes that. Therefore I think this function should be left as it is so other things that use this function don't break.
sub validemail {
- my $mail = shift;
- return 0 if ( $mail !~ /^[0-9a-zA-Z.-_]+@[0-9a-zA-Z.-]+$/
);
- return 0 if ( $mail =~ /^[^0-9a-zA-Z]|[^0-9a-zA-Z]$/);
- return 0 if ( $mail !~ /([0-9a-zA-Z]{1})@./ );
- return 0 if ( $mail !~ /.@([0-9a-zA-Z]{1})/ );
- return 0 if ( $mail =~ /..-.|.-..|....|.--./g );
- return 0 if ( $mail =~ /.._.|.-_.|._..|._-.|.__./g );
- return 0 if ( $mail !~ /.([a-zA-Z]{2,4})$/ );
- my $address = shift;
- my @parts = split( /@/, $address );
- my $count=@parts;
- #check if we have one part before and after '@'
- return 0 if ( $count != 2 );
- #check if one of the parts starts or ends with a dot
- return 0 if ( substr($parts[0],0,1) eq '.' );
- return 0 if ( substr($parts[0],-1,1) eq '.' );
- return 0 if ( substr($parts[1],0,1) eq '.' );
- return 0 if ( substr($parts[1],-1,1) eq '.' );
- #check first addresspart (before '@' sign)
- return 0 if ( $parts[0] !~ m/^[a-zA-Z0-9.!-+#]+$/ );
- #check second addresspart (after '@' sign)
- return 0 if ( !&validfqdn( $parts[1] ) );
If the FQDN function is not amended, the domain name should just be checked for invalid characters.
}return 1;
-Michael
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Sorry to jump in here since I really don't contribute much to this except testing. But, has anyone simply considered one regex to validate the e-mail? I remembered reading Jeffrey Friedl's book "Mastering Regular Expressions" a long, long time ago, and then Jan Goyvaert/Steve Levithans "Regular Expressions Cookbook" so I went and looked at Goyvaerts web site, http://www.regular-expressions.info/email.html.
Goyvaert's "99% matching" e-mail regex is simple:
\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,}\b
If anyone wants to look at it, it is discussed at http://www.regular-expressions.info/email.html. He has much more inclusive regex's that will even match some edge cases the above simple one won't, but really, if you just warn when an invalid address is entered (instead of erroring), that might be the simplest solution, and will really simplify the checking.
Rod
On 11/16/2015 08:12 AM, Michael Tremer wrote:
Hi,
okay, this looks better, but I still would like to request a change:
On Mon, 2015-11-16 at 11:53 +0100, Alexander Marx wrote:
We now check all allowed chars in the address before the @ sign.
To check the fqdn of an email the function validfqdn has been adapted as well. Here a valid domain part is for example: user@ipfire or user@localhost.localdomain
Signed-off-by: Alexander Marx alexander.marx@ipfire.org --- config/cfgroot/general-functions.pl | 30 +++++++++++++++++++-------- --- 1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/config/cfgroot/general-functions.pl b/config/cfgroot/general-functions.pl index 2b5cd19..564a904 100644 --- a/config/cfgroot/general-functions.pl +++ b/config/cfgroot/general-functions.pl @@ -653,9 +653,6 @@ sub validfqdn # Checks a fully qualified domain name against RFC1035 my $fqdn = $_[0]; my @parts = split (/./, $fqdn); # Split hostname at the '.' - if (scalar(@parts) < 2) { # At least two parts should - return 0;} # exist in a FQDN - # (i.e. hostname.domain) foreach $part (@parts) { # Each part should be at least one character in length # but no more than 63 characters @@ -747,14 +744,25 @@ sub ipcidr2msk { }
This function above is called validfqdn and is supposed (according to the comment) to check for a FQDN as defined in RFC1035. You change changes that. Therefore I think this function should be left as it is so other things that use this function don't break.
sub validemail { - my $mail = shift; - return 0 if ( $mail !~ /^[0-9a-zA-Z.-_]+@[0-9a-zA-Z.-]+$/ ); - return 0 if ( $mail =~ /^[^0-9a-zA-Z]|[^0-9a-zA-Z]$/); - return 0 if ( $mail !~ /([0-9a-zA-Z]{1})@./ ); - return 0 if ( $mail !~ /.@([0-9a-zA-Z]{1})/ ); - return 0 if ( $mail =~ /..-.|.-..|....|.--./g ); - return 0 if ( $mail =~ /.._.|.-_.|._..|._-.|.__./g ); - return 0 if ( $mail !~ /.([a-zA-Z]{2,4})$/ ); + my $address = shift; + my @parts = split( /@/, $address ); + my $count=@parts; + + #check if we have one part before and after '@' + return 0 if ( $count != 2 ); + + #check if one of the parts starts or ends with a dot + return 0 if ( substr($parts[0],0,1) eq '.' ); + return 0 if ( substr($parts[0],-1,1) eq '.' ); + return 0 if ( substr($parts[1],0,1) eq '.' ); + return 0 if ( substr($parts[1],-1,1) eq '.' ); + + #check first addresspart (before '@' sign) + return 0 if ( $parts[0] !~ m/^[a-zA-Z0-9.!-+#]+$/ ); + + #check second addresspart (after '@' sign) + return 0 if ( !&validfqdn( $parts[1] ) );
If the FQDN function is not amended, the domain name should just be checked for invalid characters.
- return 1; }
-Michael
- -- Rod Rodolico Daily Data, Inc. POB 140465 Dallas TX 75214-0465 214.827.2170 http://www.dailydata.net