public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation
@ 2024-02-15 12:39 Christoph Heiss
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 1/5] common: fqdn: do not allow overlong FQDNs as per Debian spec Christoph Heiss
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Christoph Heiss @ 2024-02-15 12:39 UTC (permalink / raw)
  To: pve-devel

This series improves various aspects regarding FQDN handling and
validation across both the GUI and TUI installer.

It (partially) addresses issue #5230 [0] in patch #5, by fixing the
regex through which we validate FQDNs in the GUI installer.

It also refactors the FQDN validation/parsing in the GUI installer, by
moving it into its own subroutine - making the whole thing bit easier to
reason about, as well as adding loads of test cases.

[0] https://bugzilla.proxmox.com/show_bug.cgi?id=5230

Christoph Heiss (5):
  common: fqdn: do not allow overlong FQDNs as per Debian spec
  common: fqdn: implement case-insensitive comparison as per RFC 952
  proxinstall: avoid open-coding FQDN sanity check
  sys: net: do not allow overlong FQDNs as per RFCs and Debian spec
  fix #5230: sys: net: properly escape FQDN regex

 Proxmox/Sys/Net.pm                    | 29 +++++++++-
 proxinstall                           | 22 +++-----
 proxmox-installer-common/src/utils.rs | 79 ++++++++++++++++++++++++++-
 test/Makefile                         |  6 +-
 test/parse-fqdn.pl                    | 57 +++++++++++++++++++
 5 files changed, 172 insertions(+), 21 deletions(-)
 create mode 100755 test/parse-fqdn.pl

--
2.43.0





^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH installer 1/5] common: fqdn: do not allow overlong FQDNs as per Debian spec
  2024-02-15 12:39 [pve-devel] [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Christoph Heiss
@ 2024-02-15 12:39 ` Christoph Heiss
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 2/5] common: fqdn: implement case-insensitive comparison as per RFC 952 Christoph Heiss
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Christoph Heiss @ 2024-02-15 12:39 UTC (permalink / raw)
  To: pve-devel

Debian limits labels to 63 characters each and the total length to 253
characters [0].

While at it, reference all the RFCs that apply when parsing FQDNs.

[0] https://manpages.debian.org/stable/manpages/hostname.7.en.html

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
 proxmox-installer-common/src/utils.rs | 45 ++++++++++++++++++++++++++-
 1 file changed, 44 insertions(+), 1 deletion(-)

diff --git a/proxmox-installer-common/src/utils.rs b/proxmox-installer-common/src/utils.rs
index c038524..067e025 100644
--- a/proxmox-installer-common/src/utils.rs
+++ b/proxmox-installer-common/src/utils.rs
@@ -117,6 +117,7 @@ pub enum FqdnParseError {
     MissingHostname,
     NumericHostname,
     InvalidPart(String),
+    TooLong(usize),
 }

 impl fmt::Display for FqdnParseError {
@@ -129,17 +130,46 @@ impl fmt::Display for FqdnParseError {
                 f,
                 "FQDN must only consist of alphanumeric characters and dashes. Invalid part: '{part}'",
             ),
+            TooLong(len) => write!(f, "FQDN too long: {len} > {}", Fqdn::MAX_LENGTH),
         }
     }
 }

+/// A type for safely representing fully-qualified domain names (FQDNs).
+///
+/// It considers following RFCs:
+/// https://www.ietf.org/rfc/rfc952.txt (sec. "ASSUMPTIONS", 1.)
+/// https://www.ietf.org/rfc/rfc1035.txt (sec. 2.3. "Conventions")
+/// https://www.ietf.org/rfc/rfc1123.txt (sec. 2.1. "Host Names and Numbers")
+/// https://www.ietf.org/rfc/rfc3492.txt
+/// https://www.ietf.org/rfc/rfc4343.txt
+///
+/// .. and applies some restriction given by Debian, e.g. 253 instead of 255
+/// maximum total length and maximum 63 characters per label.
+/// https://manpages.debian.org/stable/manpages/hostname.7.en.html
+///
+/// Additionally:
+/// - It enforces the restriction as per Bugzilla #1054, in that
+///   purely numeric hostnames are not allowed - against RFC1123 sec. 2.1.
+///
+/// Some terminology:
+/// - "label" - a single part of a FQDN, e.g. <label>.<label>.<tld>
 #[derive(Clone, Debug, Eq, PartialEq)]
 pub struct Fqdn {
     parts: Vec<String>,
 }

 impl Fqdn {
+    /// Maximum length of a single label of the FQDN
+    const MAX_LABEL_LENGTH: usize = 63;
+    /// Maximum total length of the FQDN
+    const MAX_LENGTH: usize = 253;
+
     pub fn from(fqdn: &str) -> Result<Self, FqdnParseError> {
+        if fqdn.len() > Self::MAX_LENGTH {
+            return Err(FqdnParseError::TooLong(fqdn.len()));
+        }
+
         let parts = fqdn
             .split('.')
             .map(ToOwned::to_owned)
@@ -154,7 +184,8 @@ impl Fqdn {
         if parts.len() < 2 {
             Err(FqdnParseError::MissingHostname)
         } else if parts[0].chars().all(|c| c.is_ascii_digit()) {
-            // Not allowed/supported on Debian systems.
+            // Do not allow a purely numeric hostname, see:
+            // https://bugzilla.proxmox.com/show_bug.cgi?id=1054
             Err(FqdnParseError::NumericHostname)
         } else {
             Ok(Self { parts })
@@ -182,6 +213,7 @@ impl Fqdn {

     fn validate_single(s: &String) -> bool {
         !s.is_empty()
+            && s.len() <= Self::MAX_LABEL_LENGTH
             // First character must be alphanumeric
             && s.chars()
                 .next()
@@ -243,9 +275,20 @@ mod tests {
         assert_eq!(Fqdn::from("foo.com-"), Err(InvalidPart("com-".to_owned())));
         assert_eq!(Fqdn::from("-o-.com"), Err(InvalidPart("-o-".to_owned())));

+        // https://bugzilla.proxmox.com/show_bug.cgi?id=1054
         assert_eq!(Fqdn::from("123.com"), Err(NumericHostname));
         assert!(Fqdn::from("foo123.com").is_ok());
         assert!(Fqdn::from("123foo.com").is_ok());
+
+        assert!(Fqdn::from(&format!("{}.com", "a".repeat(63))).is_ok());
+        assert_eq!(
+            Fqdn::from(&format!("{}.com", "a".repeat(250))),
+            Err(TooLong(254)),
+        );
+        assert_eq!(
+            Fqdn::from(&format!("{}.com", "a".repeat(64))),
+            Err(InvalidPart("a".repeat(64))),
+        );
     }

     #[test]
--
2.43.0





^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH installer 2/5] common: fqdn: implement case-insensitive comparison as per RFC 952
  2024-02-15 12:39 [pve-devel] [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Christoph Heiss
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 1/5] common: fqdn: do not allow overlong FQDNs as per Debian spec Christoph Heiss
@ 2024-02-15 12:39 ` Christoph Heiss
  2024-02-23 16:10   ` Thomas Lamprecht
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 3/5] proxinstall: avoid open-coding FQDN sanity check Christoph Heiss
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: Christoph Heiss @ 2024-02-15 12:39 UTC (permalink / raw)
  To: pve-devel

Multiple DNS-related RFCs (notably RFC 952, RFC 1035 and RFC 4343)
reinforce that FQDN must not be case-sensitive.

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
 proxmox-installer-common/src/utils.rs | 28 ++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/proxmox-installer-common/src/utils.rs b/proxmox-installer-common/src/utils.rs
index 067e025..0ed7438 100644
--- a/proxmox-installer-common/src/utils.rs
+++ b/proxmox-installer-common/src/utils.rs
@@ -154,7 +154,7 @@ impl fmt::Display for FqdnParseError {
 ///
 /// Some terminology:
 /// - "label" - a single part of a FQDN, e.g. <label>.<label>.<tld>
-#[derive(Clone, Debug, Eq, PartialEq)]
+#[derive(Clone, Debug, Eq)]
 pub struct Fqdn {
     parts: Vec<String>,
 }
@@ -257,6 +257,26 @@ impl<'de> Deserialize<'de> for Fqdn {
     }
 }
 
+impl PartialEq for Fqdn {
+    fn eq(&self, other: &Self) -> bool {
+        // Case-insensitive comparison, as per RFC 952 "ASSUMPTIONS",
+        // RFC 1035 sec. 2.3.3. "Character Case" and RFC 4343 as a whole
+        let a = self
+            .parts
+            .iter()
+            .map(|s| s.to_lowercase())
+            .collect::<Vec<String>>();
+
+        let b = other
+            .parts
+            .iter()
+            .map(|s| s.to_lowercase())
+            .collect::<Vec<String>>();
+
+        a == b
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use super::*;
@@ -309,4 +329,10 @@ mod tests {
             "foo.example.com"
         );
     }
+
+    #[test]
+    fn fqdn_compare() {
+        assert_eq!(Fqdn::from("example.com"), Fqdn::from("ExAmPle.Com"));
+        assert_eq!(Fqdn::from("ExAmPle.Com"), Fqdn::from("example.com"));
+    }
 }
-- 
2.43.0





^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH installer 3/5] proxinstall: avoid open-coding FQDN sanity check
  2024-02-15 12:39 [pve-devel] [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Christoph Heiss
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 1/5] common: fqdn: do not allow overlong FQDNs as per Debian spec Christoph Heiss
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 2/5] common: fqdn: implement case-insensitive comparison as per RFC 952 Christoph Heiss
@ 2024-02-15 12:39 ` Christoph Heiss
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 4/5] sys: net: do not allow overlong FQDNs as per RFCs and Debian spec Christoph Heiss
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Christoph Heiss @ 2024-02-15 12:39 UTC (permalink / raw)
  To: pve-devel

.. by moving it into its own subroutine. Makes the whole thing quite a
bit neater and easier to maintain.

No functional changes.

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
FWIW, might be a nice case for refactoring using perlmod and reusing the
(more fleshed-out) Rust implementation from the proxmox-installer-common
crate. Having to implementations of the same thing to keep on par is
kind of a PITA.

 Proxmox/Sys/Net.pm | 22 +++++++++++++++++++-
 proxinstall        | 22 +++++++-------------
 test/Makefile      |  6 +++++-
 test/parse-fqdn.pl | 50 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 83 insertions(+), 17 deletions(-)
 create mode 100755 test/parse-fqdn.pl

diff --git a/Proxmox/Sys/Net.pm b/Proxmox/Sys/Net.pm
index ed83fb0..3e01d37 100644
--- a/Proxmox/Sys/Net.pm
+++ b/Proxmox/Sys/Net.pm
@@ -4,7 +4,7 @@ use strict;
 use warnings;

 use base qw(Exporter);
-our @EXPORT_OK = qw(parse_ip_address parse_ip_mask);
+our @EXPORT_OK = qw(parse_ip_address parse_ip_mask parse_fqdn);

 our $HOSTNAME_RE = "(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?)";
 our $FQDN_RE = "(?:${HOSTNAME_RE}\.)*${HOSTNAME_RE}";
@@ -214,4 +214,24 @@ sub get_dhcp_fqdn : prototype() {
     return $name if defined($name) && $name =~ m/^([^\.]+)(?:\.(?:\S+))?$/;
 }

+# Follows the rules as laid out by proxmox_installer_common::utils::Fqdn
+sub parse_fqdn : prototype($) {
+    my ($text) = @_;
+
+    die "FQDN cannot be empty\n"
+	if !$text || length($text) == 0;
+
+    die "Purely numeric hostnames are not allowed\n"
+	if $text =~ /^[0-9]+(?:\.|$)/;
+
+    die "FQDN must only consist of alphanumeric characters and dashes\n"
+	if $text !~ m/^${Proxmox::Sys::Net::FQDN_RE}$/;
+
+    if ($text =~ m/^([^\.]+)\.(\S+)$/) {
+	return ($1, $2);
+    }
+
+    die "Hostname does not look like a fully qualified domain name\n";
+}
+
 1;
diff --git a/proxinstall b/proxinstall
index 81dd368..4265ba7 100755
--- a/proxinstall
+++ b/proxinstall
@@ -446,24 +446,16 @@ sub create_ipconf_view {
 	$text =~ s/^\s+//;
 	$text =~ s/\s+$//;

-	# Debian does not support purely numeric hostnames
-	if ($text && $text =~ /^[0-9]+(?:\.|$)/) {
-	    Proxmox::UI::message("Purely numeric hostnames are not allowed.");
-	    $hostentry->grab_focus();
-	    return;
-	}
+	my ($hostname, $domainname) = eval { Proxmox::Sys::Net::parse_fqdn($text) };
+	my $err = $@;

-	if ($text
-	    && $text =~ m/^${Proxmox::Sys::Net::FQDN_RE}$/
-	    && $text !~ m/.example.invalid$/
-	    && $text =~ m/^([^\.]+)\.(\S+)$/
-	) {
-	    Proxmox::Install::Config::set_hostname($1);
-	    Proxmox::Install::Config::set_domain($2);
-	} else {
-	    Proxmox::UI::message("Hostname does not look like a fully qualified domain name.");
+	if ($err || $text =~ m/.example.invalid$/) {
+	    Proxmox::UI::message($err // 'Hostname does not look like a valid fully qualified domain name');
 	    $hostentry->grab_focus();
 	    return;
+	} else {
+	    Proxmox::Install::Config::set_hostname($hostname);
+	    Proxmox::Install::Config::set_domain($domainname);
 	}

 	# verify ip address
diff --git a/test/Makefile b/test/Makefile
index fb80fc4..004bc1e 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -3,8 +3,12 @@ all:
 export PERLLIB=..

 .PHONY: check
-check: test-zfs-arc-max
+check: test-zfs-arc-max test-parse-fqdn

 .PHONY: test-zfs-arc-max
 test-zfs-arc-max:
 	./zfs-arc-max.pl
+
+.PHONY: test-parse-fqdn
+test-parse-fqdn:
+	./parse-fqdn.pl
diff --git a/test/parse-fqdn.pl b/test/parse-fqdn.pl
new file mode 100755
index 0000000..1ffb300
--- /dev/null
+++ b/test/parse-fqdn.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use Proxmox::Sys::Net qw(parse_fqdn);
+
+# some constants just to avoid repeating ourselves
+use constant ERR_INVALID => "Hostname does not look like a fully qualified domain name\n";
+use constant ERR_ALPHANUM => "FQDN must only consist of alphanumeric characters and dashes\n";
+use constant ERR_NUMERIC => "Purely numeric hostnames are not allowed\n";
+use constant ERR_TOOLONG => "FQDN too long\n";
+use constant ERR_EMPTY => "FQDN cannot be empty\n";
+
+sub is_parsed {
+    my ($fqdn, $expected) = @_;
+
+    my @parsed = parse_fqdn($fqdn);
+    is_deeply(\@parsed, $expected, "FQDN is valid and compared successfully: $fqdn");
+}
+
+sub is_invalid {
+    my ($fqdn, $expected_err) = @_;
+
+    my $parsed = eval { parse_fqdn($fqdn) };
+    is($parsed, undef, "invalid FQDN did fail parsing: $fqdn");
+    is($@, $expected_err, "invalid FQDN threw correct error: $fqdn");
+}
+
+is_invalid(undef, ERR_EMPTY);
+is_invalid('', ERR_EMPTY);
+
+is_parsed('foo.example.com', ['foo', 'example.com']);
+is_parsed('foo-bar.com', ['foo-bar', 'com']);
+is_parsed('a-b.com', ['a-b', 'com']);
+
+is_invalid('foo', ERR_INVALID);
+is_invalid('-foo.com', ERR_ALPHANUM);
+is_invalid('foo-.com', ERR_ALPHANUM);
+is_invalid('foo.com-', ERR_ALPHANUM);
+is_invalid('-o-.com', ERR_ALPHANUM);
+
+# https://bugzilla.proxmox.com/show_bug.cgi?id=1054
+is_invalid('123.com', ERR_NUMERIC);
+is_parsed('foo123.com', ['foo123', 'com']);
+is_parsed('123foo.com', ['123foo', 'com']);
+
+done_testing();
--
2.43.0





^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH installer 4/5] sys: net: do not allow overlong FQDNs as per RFCs and Debian spec
  2024-02-15 12:39 [pve-devel] [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Christoph Heiss
                   ` (2 preceding siblings ...)
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 3/5] proxinstall: avoid open-coding FQDN sanity check Christoph Heiss
@ 2024-02-15 12:39 ` Christoph Heiss
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 5/5] fix #5230: sys: net: properly escape FQDN regex Christoph Heiss
  2024-02-23 16:31 ` [pve-devel] applied-series: [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Thomas Lamprecht
  5 siblings, 0 replies; 10+ messages in thread
From: Christoph Heiss @ 2024-02-15 12:39 UTC (permalink / raw)
  To: pve-devel

Debian limits labels to 63 characters each and the total length to 253
characters [0].

[0] https://manpages.debian.org/stable/manpages/hostname.7.en.html

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
 Proxmox/Sys/Net.pm | 5 ++++-
 test/parse-fqdn.pl | 4 ++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/Proxmox/Sys/Net.pm b/Proxmox/Sys/Net.pm
index 3e01d37..2d29116 100644
--- a/Proxmox/Sys/Net.pm
+++ b/Proxmox/Sys/Net.pm
@@ -6,7 +6,7 @@ use warnings;
 use base qw(Exporter);
 our @EXPORT_OK = qw(parse_ip_address parse_ip_mask parse_fqdn);
 
-our $HOSTNAME_RE = "(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?)";
+our $HOSTNAME_RE = "(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}?[a-zA-Z0-9])?)";
 our $FQDN_RE = "(?:${HOSTNAME_RE}\.)*${HOSTNAME_RE}";
 
 my $IPV4OCTET = "(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])";
@@ -221,6 +221,9 @@ sub parse_fqdn : prototype($) {
     die "FQDN cannot be empty\n"
 	if !$text || length($text) == 0;
 
+    die "FQDN too long\n"
+	if length($text) > 253;
+
     die "Purely numeric hostnames are not allowed\n"
 	if $text =~ /^[0-9]+(?:\.|$)/;
 
diff --git a/test/parse-fqdn.pl b/test/parse-fqdn.pl
index 1ffb300..3009984 100755
--- a/test/parse-fqdn.pl
+++ b/test/parse-fqdn.pl
@@ -47,4 +47,8 @@ is_invalid('123.com', ERR_NUMERIC);
 is_parsed('foo123.com', ['foo123', 'com']);
 is_parsed('123foo.com', ['123foo', 'com']);
 
+is_parsed('a' x 63 . '.com', ['a' x 63, 'com']);
+is_invalid('a' x 250 . '.com', ERR_TOOLONG);
+is_invalid('a' x 64 . '.com', ERR_ALPHANUM);
+
 done_testing();
-- 
2.43.0





^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] [PATCH installer 5/5] fix #5230: sys: net: properly escape FQDN regex
  2024-02-15 12:39 [pve-devel] [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Christoph Heiss
                   ` (3 preceding siblings ...)
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 4/5] sys: net: do not allow overlong FQDNs as per RFCs and Debian spec Christoph Heiss
@ 2024-02-15 12:39 ` Christoph Heiss
  2024-02-23 16:27   ` Thomas Lamprecht
  2024-02-23 16:31 ` [pve-devel] applied-series: [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Thomas Lamprecht
  5 siblings, 1 reply; 10+ messages in thread
From: Christoph Heiss @ 2024-02-15 12:39 UTC (permalink / raw)
  To: pve-devel

Due to interpolation, the \. sequence must be double-escaped.
Previously, this would result in a non-escaped dot, thus matching much
more liberally than it should.

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
 Proxmox/Sys/Net.pm                    | 2 +-
 proxmox-installer-common/src/utils.rs | 6 ++++++
 test/parse-fqdn.pl                    | 3 +++
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/Proxmox/Sys/Net.pm b/Proxmox/Sys/Net.pm
index 2d29116..c2f3e9c 100644
--- a/Proxmox/Sys/Net.pm
+++ b/Proxmox/Sys/Net.pm
@@ -7,7 +7,7 @@ use base qw(Exporter);
 our @EXPORT_OK = qw(parse_ip_address parse_ip_mask parse_fqdn);
 
 our $HOSTNAME_RE = "(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}?[a-zA-Z0-9])?)";
-our $FQDN_RE = "(?:${HOSTNAME_RE}\.)*${HOSTNAME_RE}";
+our $FQDN_RE = "(?:${HOSTNAME_RE}\\.)*${HOSTNAME_RE}";
 
 my $IPV4OCTET = "(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])";
 my $IPV4RE = "(?:(?:$IPV4OCTET\\.){3}$IPV4OCTET)";
diff --git a/proxmox-installer-common/src/utils.rs b/proxmox-installer-common/src/utils.rs
index 0ed7438..03efdd7 100644
--- a/proxmox-installer-common/src/utils.rs
+++ b/proxmox-installer-common/src/utils.rs
@@ -309,6 +309,12 @@ mod tests {
             Fqdn::from(&format!("{}.com", "a".repeat(64))),
             Err(InvalidPart("a".repeat(64))),
         );
+
+        // https://bugzilla.proxmox.com/show_bug.cgi?id=3497
+        assert_eq!(
+            Fqdn::from("123@foo.com"),
+            Err(InvalidPart("123@foo".to_owned()))
+        );
     }
 
     #[test]
diff --git a/test/parse-fqdn.pl b/test/parse-fqdn.pl
index 3009984..df8739d 100755
--- a/test/parse-fqdn.pl
+++ b/test/parse-fqdn.pl
@@ -51,4 +51,7 @@ is_parsed('a' x 63 . '.com', ['a' x 63, 'com']);
 is_invalid('a' x 250 . '.com', ERR_TOOLONG);
 is_invalid('a' x 64 . '.com', ERR_ALPHANUM);
 
+# https://bugzilla.proxmox.com/show_bug.cgi?id=3497
+is_invalid('123@foo.com', ERR_ALPHANUM);
+
 done_testing();
-- 
2.43.0





^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [pve-devel] [PATCH installer 2/5] common: fqdn: implement case-insensitive comparison as per RFC 952
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 2/5] common: fqdn: implement case-insensitive comparison as per RFC 952 Christoph Heiss
@ 2024-02-23 16:10   ` Thomas Lamprecht
  0 siblings, 0 replies; 10+ messages in thread
From: Thomas Lamprecht @ 2024-02-23 16:10 UTC (permalink / raw)
  To: Proxmox VE development discussion, Christoph Heiss

Am 15/02/2024 um 13:39 schrieb Christoph Heiss:
> +impl PartialEq for Fqdn {
> +    fn eq(&self, other: &Self) -> bool {
> +        // Case-insensitive comparison, as per RFC 952 "ASSUMPTIONS",
> +        // RFC 1035 sec. 2.3.3. "Character Case" and RFC 4343 as a whole
> +        let a = self
> +            .parts
> +            .iter()
> +            .map(|s| s.to_lowercase())
> +            .collect::<Vec<String>>();
> +
> +        let b = other
> +            .parts
> +            .iter()
> +            .map(|s| s.to_lowercase())
> +            .collect::<Vec<String>>();
> +
> +        a == b

could be probably more efficiently done by doing the comparison part wise, not
on the whole thing, and with an early abort for mismatching part count, e.g.,
something like:

if self.parts.len() != other.parts.len() {             
    return false;                                      
}                                                      
                                                       
self.parts                                             
    .iter()                                            
    .zip(other.parts.iter())                           
    .all(|(a, b)| a.to_lowercase() == b.to_lowercase())

> @@ -309,4 +329,10 @@ mod tests {
>              "foo.example.com"
>          );
>      }
> +
> +    #[test]
> +    fn fqdn_compare() {
> +        assert_eq!(Fqdn::from("example.com"), Fqdn::from("ExAmPle.Com"));
> +        assert_eq!(Fqdn::from("ExAmPle.Com"), Fqdn::from("example.com"));

I always like throwing in some assert_ne ones for sanity checking (e.g., such
optimization tries like above), as otherwise one won't notice if this is broken,
like by just always returning false..





^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [pve-devel] [PATCH installer 5/5] fix #5230: sys: net: properly escape FQDN regex
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 5/5] fix #5230: sys: net: properly escape FQDN regex Christoph Heiss
@ 2024-02-23 16:27   ` Thomas Lamprecht
  2024-02-26  9:04     ` Christoph Heiss
  0 siblings, 1 reply; 10+ messages in thread
From: Thomas Lamprecht @ 2024-02-23 16:27 UTC (permalink / raw)
  To: Proxmox VE development discussion, Christoph Heiss

Am 15/02/2024 um 13:39 schrieb Christoph Heiss:
> Due to interpolation, the \. sequence must be double-escaped.
> Previously, this would result in a non-escaped dot, thus matching much
> more liberally than it should.
> 

OK, but...


> diff --git a/proxmox-installer-common/src/utils.rs b/proxmox-installer-common/src/utils.rs
> index 0ed7438..03efdd7 100644
> --- a/proxmox-installer-common/src/utils.rs
> +++ b/proxmox-installer-common/src/utils.rs
> @@ -309,6 +309,12 @@ mod tests {
>              Fqdn::from(&format!("{}.com", "a".repeat(64))),
>              Err(InvalidPart("a".repeat(64))),
>          );
> +
> +        // https://bugzilla.proxmox.com/show_bug.cgi?id=3497

...why link on a feature request for terraform support then?


> diff --git a/test/parse-fqdn.pl b/test/parse-fqdn.pl
> index 3009984..df8739d 100755
> --- a/test/parse-fqdn.pl
> +++ b/test/parse-fqdn.pl
> @@ -51,4 +51,7 @@ is_parsed('a' x 63 . '.com', ['a' x 63, 'com']);
>  is_invalid('a' x 250 . '.com', ERR_TOOLONG);
>  is_invalid('a' x 64 . '.com', ERR_ALPHANUM);
>  
> +# https://bugzilla.proxmox.com/show_bug.cgi?id=3497

same here




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [pve-devel] applied-series:  [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation
  2024-02-15 12:39 [pve-devel] [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Christoph Heiss
                   ` (4 preceding siblings ...)
  2024-02-15 12:39 ` [pve-devel] [PATCH installer 5/5] fix #5230: sys: net: properly escape FQDN regex Christoph Heiss
@ 2024-02-23 16:31 ` Thomas Lamprecht
  5 siblings, 0 replies; 10+ messages in thread
From: Thomas Lamprecht @ 2024-02-23 16:31 UTC (permalink / raw)
  To: Proxmox VE development discussion, Christoph Heiss

Am 15/02/2024 um 13:39 schrieb Christoph Heiss:
> This series improves various aspects regarding FQDN handling and
> validation across both the GUI and TUI installer.
> 
> It (partially) addresses issue #5230 [0] in patch #5, by fixing the
> regex through which we validate FQDNs in the GUI installer.
> 
> It also refactors the FQDN validation/parsing in the GUI installer, by
> moving it into its own subroutine - making the whole thing bit easier to
> reason about, as well as adding loads of test cases.
> 
> [0] https://bugzilla.proxmox.com/show_bug.cgi?id=5230
> 
> Christoph Heiss (5):
>   common: fqdn: do not allow overlong FQDNs as per Debian spec
>   common: fqdn: implement case-insensitive comparison as per RFC 952
>   proxinstall: avoid open-coding FQDN sanity check
>   sys: net: do not allow overlong FQDNs as per RFCs and Debian spec
>   fix #5230: sys: net: properly escape FQDN regex
> 
>  Proxmox/Sys/Net.pm                    | 29 +++++++++-
>  proxinstall                           | 22 +++-----
>  proxmox-installer-common/src/utils.rs | 79 ++++++++++++++++++++++++++-
>  test/Makefile                         |  6 +-
>  test/parse-fqdn.pl                    | 57 +++++++++++++++++++
>  5 files changed, 172 insertions(+), 21 deletions(-)
>  create mode 100755 test/parse-fqdn.pl
> 
> --
> 2.43.0
> 
applied, with a fix for the bug # reference squashed into patch 5/5 and
two small follow-ups w.r.t. FQDN test scope and comparison efficiency (not
that it will matter much at those string sizes), thanks!




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [pve-devel] [PATCH installer 5/5] fix #5230: sys: net: properly escape FQDN regex
  2024-02-23 16:27   ` Thomas Lamprecht
@ 2024-02-26  9:04     ` Christoph Heiss
  0 siblings, 0 replies; 10+ messages in thread
From: Christoph Heiss @ 2024-02-26  9:04 UTC (permalink / raw)
  To: Thomas Lamprecht; +Cc: Proxmox VE development discussion

On Fri, Feb 23, 2024 at 05:27:52PM +0100, Thomas Lamprecht wrote:
> Am 15/02/2024 um 13:39 schrieb Christoph Heiss:
> > Due to interpolation, the \. sequence must be double-escaped.
> > Previously, this would result in a non-escaped dot, thus matching much
> > more liberally than it should.
> >
>
> OK, but...
>
>
> > diff --git a/proxmox-installer-common/src/utils.rs b/proxmox-installer-common/src/utils.rs
> > index 0ed7438..03efdd7 100644
> > --- a/proxmox-installer-common/src/utils.rs
> > +++ b/proxmox-installer-common/src/utils.rs
> > @@ -309,6 +309,12 @@ mod tests {
> >              Fqdn::from(&format!("{}.com", "a".repeat(64))),
> >              Err(InvalidPart("a".repeat(64))),
> >          );
> > +
> > +        // https://bugzilla.proxmox.com/show_bug.cgi?id=3497
>
> ...why link on a feature request for terraform support then?

Whoop, sorry for that - apparently had the wrong link in the the
clipboard when writing this ..

>
>
> > diff --git a/test/parse-fqdn.pl b/test/parse-fqdn.pl
> > index 3009984..df8739d 100755
> > --- a/test/parse-fqdn.pl
> > +++ b/test/parse-fqdn.pl
> > @@ -51,4 +51,7 @@ is_parsed('a' x 63 . '.com', ['a' x 63, 'com']);
> >  is_invalid('a' x 250 . '.com', ERR_TOOLONG);
> >  is_invalid('a' x 64 . '.com', ERR_ALPHANUM);
> >
> > +# https://bugzilla.proxmox.com/show_bug.cgi?id=3497
>
> same here




^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-02-26  9:05 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-15 12:39 [pve-devel] [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Christoph Heiss
2024-02-15 12:39 ` [pve-devel] [PATCH installer 1/5] common: fqdn: do not allow overlong FQDNs as per Debian spec Christoph Heiss
2024-02-15 12:39 ` [pve-devel] [PATCH installer 2/5] common: fqdn: implement case-insensitive comparison as per RFC 952 Christoph Heiss
2024-02-23 16:10   ` Thomas Lamprecht
2024-02-15 12:39 ` [pve-devel] [PATCH installer 3/5] proxinstall: avoid open-coding FQDN sanity check Christoph Heiss
2024-02-15 12:39 ` [pve-devel] [PATCH installer 4/5] sys: net: do not allow overlong FQDNs as per RFCs and Debian spec Christoph Heiss
2024-02-15 12:39 ` [pve-devel] [PATCH installer 5/5] fix #5230: sys: net: properly escape FQDN regex Christoph Heiss
2024-02-23 16:27   ` Thomas Lamprecht
2024-02-26  9:04     ` Christoph Heiss
2024-02-23 16:31 ` [pve-devel] applied-series: [PATCH installer 0/5] proxinstall, tui: improve hostname/FQDN validation Thomas Lamprecht

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal