From: Christoph Heiss <c.heiss@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH installer 5/7] tui: use email regex from HTML specification for validation
Date: Tue, 28 May 2024 10:13:46 +0200 [thread overview]
Message-ID: <20240528081359.832986-6-c.heiss@proxmox.com> (raw)
In-Reply-To: <20240528081359.832986-1-c.heiss@proxmox.com>
That regex should be a lot more accurate in what it allows - if it's
good enough for the HTML spec, it should be for us too.
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
proxmox-installer-common/Cargo.toml | 1 +
proxmox-installer-common/src/options.rs | 29 ++++++++++++++++++++++++-
proxmox-tui-installer/Cargo.toml | 1 -
proxmox-tui-installer/src/main.rs | 18 +++++----------
4 files changed, 34 insertions(+), 15 deletions(-)
diff --git a/proxmox-installer-common/Cargo.toml b/proxmox-installer-common/Cargo.toml
index 70f828a..e151b0e 100644
--- a/proxmox-installer-common/Cargo.toml
+++ b/proxmox-installer-common/Cargo.toml
@@ -8,6 +8,7 @@ exclude = [ "build", "debian" ]
homepage = "https://www.proxmox.com"
[dependencies]
+anyhow.workspace = true
regex = "1.7"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
diff --git a/proxmox-installer-common/src/options.rs b/proxmox-installer-common/src/options.rs
index e77914b..1962f87 100644
--- a/proxmox-installer-common/src/options.rs
+++ b/proxmox-installer-common/src/options.rs
@@ -1,5 +1,8 @@
+use anyhow::{bail, Result};
+use regex::Regex;
use serde::Deserialize;
use std::net::{IpAddr, Ipv4Addr};
+use std::sync::OnceLock;
use std::{cmp, fmt};
use crate::setup::{
@@ -327,6 +330,8 @@ impl TimezoneOptions {
}
}
+const EMAIL_DEFAULT_PLACEHOLDER: &str = "mail@example.invalid";
+
#[derive(Clone, Debug)]
pub struct PasswordOptions {
pub email: String,
@@ -336,7 +341,7 @@ pub struct PasswordOptions {
impl Default for PasswordOptions {
fn default() -> Self {
Self {
- email: "mail@example.invalid".to_string(),
+ email: EMAIL_DEFAULT_PLACEHOLDER.to_owned(),
root_password: String::new(),
}
}
@@ -418,6 +423,28 @@ impl NetworkOptions {
}
}
+/// Validates an email address using the regex for <input type="email" /> elements
+/// as defined in the HTML specification [0].
+/// Using that /should/ cover all possible cases that are encountered in the wild.
+///
+/// It additionally checks whether the email our default email placeholder value.
+///
+/// [0] https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
+pub fn email_validate(email: &str) -> Result<()> {
+ static RE: OnceLock<Regex> = OnceLock::new();
+ let re = RE.get_or_init(|| {
+ Regex::new(r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$").unwrap()
+ });
+
+ if !re.is_match(email) {
+ bail!("Email does not look like a valid address (user@domain.tld)")
+ } else if email == EMAIL_DEFAULT_PLACEHOLDER {
+ bail!("Invalid (default) email address")
+ }
+
+ Ok(())
+}
+
#[cfg(test)]
mod tests {
use super::*;
diff --git a/proxmox-tui-installer/Cargo.toml b/proxmox-tui-installer/Cargo.toml
index fc653f0..d3087d8 100644
--- a/proxmox-tui-installer/Cargo.toml
+++ b/proxmox-tui-installer/Cargo.toml
@@ -11,5 +11,4 @@ homepage = "https://www.proxmox.com"
cursive = { version = "0.20.0", default-features = false, features = ["termion-backend"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
-regex = "1.7"
proxmox-installer-common = { path = "../proxmox-installer-common" }
diff --git a/proxmox-tui-installer/src/main.rs b/proxmox-tui-installer/src/main.rs
index a24fb0b..67dd479 100644
--- a/proxmox-tui-installer/src/main.rs
+++ b/proxmox-tui-installer/src/main.rs
@@ -13,13 +13,11 @@ use cursive::{
Cursive, CursiveRunnable, ScreenId, View, XY,
};
-use regex::Regex;
-
mod options;
use options::InstallerOptions;
use proxmox_installer_common::{
- options::{BootdiskOptions, NetworkOptions, PasswordOptions, TimezoneOptions},
+ options::{email_validate, BootdiskOptions, NetworkOptions, PasswordOptions, TimezoneOptions},
setup::{installer_setup, LocaleInfo, ProxmoxProduct, RuntimeInfo, SetupInfo},
utils::Fqdn,
};
@@ -448,18 +446,12 @@ fn password_dialog(siv: &mut Cursive) -> InstallerView {
.get_value::<EditView, _>(2)
.ok_or("failed to retrieve email")?;
- let email_regex =
- Regex::new(r"^[\w\+\-\~]+(\.[\w\+\-\~]+)*@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*$")
- .unwrap();
-
if root_password.len() < 5 {
- Err("password too short, must be at least 5 characters long")
+ Err("password too short, must be at least 5 characters long".to_owned())
} else if root_password != confirm_password {
- Err("passwords do not match")
- } else if email == "mail@example.invalid" {
- Err("invalid email address")
- } else if !email_regex.is_match(&email) {
- Err("Email does not look like a valid address (user@domain.tld)")
+ Err("passwords do not match".to_owned())
+ } else if let Err(err) = email_validate(&email) {
+ Err(err.to_string())
} else {
Ok(PasswordOptions {
root_password,
--
2.44.0
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2024-05-28 8:14 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-28 8:13 [pve-devel] [PATCH installer 0/7] use email regex from HTML spec " Christoph Heiss
2024-05-28 8:13 ` [pve-devel] [PATCH installer 1/7] cargo: convert `anyhow` to workspace dependency Christoph Heiss
2024-05-28 8:13 ` [pve-devel] [PATCH installer 2/7] tui: fix new clippy lint Christoph Heiss
2024-05-28 8:13 ` [pve-devel] [PATCH installer 3/7] auto-installer: drop some unneeded `pub` modifiers Christoph Heiss
2024-05-28 8:13 ` [pve-devel] [PATCH installer 4/7] auto-installer: print full anyhow message on failure Christoph Heiss
2024-05-28 8:13 ` Christoph Heiss [this message]
2024-05-28 8:13 ` [pve-devel] [PATCH installer 6/7] auto-installer: validate `global.mailto` answer option Christoph Heiss
2024-05-28 8:13 ` [pve-devel] [PATCH installer 7/7] proxinstall: use email regex from HTML specification for validation Christoph Heiss
2024-06-03 8:20 ` [pve-devel] [PATCH installer 0/7] use email regex from HTML spec " Max Carrara
2024-06-28 8:16 ` Christoph Heiss
2024-10-02 12:32 ` Christoph Heiss
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240528081359.832986-6-c.heiss@proxmox.com \
--to=c.heiss@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.