From 93eb169ea53f93a5a778567e4cc33253aff80094 Mon Sep 17 00:00:00 2001
From: Adriaan de Groot <groot@kde.org>
Date: Fri, 1 Nov 2019 13:05:58 +0100
Subject: [PATCH] [users] Improve error messages

 - distinguish beginning of username from the rest
 - must start with a letter or _
 - tighten message for bad username and bad hostname

FIXES #1261
---
 src/modules/users/UsersPage.cpp | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/modules/users/UsersPage.cpp b/src/modules/users/UsersPage.cpp
index a60532022..acb4f79b6 100644
--- a/src/modules/users/UsersPage.cpp
+++ b/src/modules/users/UsersPage.cpp
@@ -305,7 +305,8 @@ void
 UsersPage::validateUsernameText( const QString& textRef )
 {
     QString text( textRef );
-    QRegExpValidator val( USERNAME_RX );
+    QRegExpValidator val_whole( USERNAME_RX );
+    QRegExpValidator val_start( QRegExp( "[a-z_].*" ) );  // anchors are implicit in QRegExpValidator
     int pos = -1;
 
     if ( text.isEmpty() )
@@ -319,12 +320,20 @@ UsersPage::validateUsernameText( const QString& textRef )
         labelError( ui->labelUsername, ui->labelUsernameError, tr( "Your username is too long." ) );
         m_readyUsername = false;
     }
-    else if ( val.validate( text, pos ) == QValidator::Invalid )
+    else if ( val_start.validate( text, pos ) == QValidator::Invalid )
+    {
+        labelError(
+            ui->labelUsername,
+            ui->labelUsernameError,
+            tr( "Your username must start with a lowercase letter or underscore." ) );
+        m_readyUsername = false;
+    }
+    else if ( val_whole.validate( text, pos ) == QValidator::Invalid )
     {
         labelError(
             ui->labelUsername,
             ui->labelUsernameError,
-            tr( "Your username contains invalid characters. Only lowercase letters and numbers are allowed." ) );
+            tr( "Only lowercase letters, numbers, underscore and hyphen are allowed." ) );
         m_readyUsername = false;
     }
     else
@@ -372,7 +381,7 @@ UsersPage::validateHostnameText( const QString& textRef )
     {
         labelError( ui->labelHostname,
                     ui->labelHostnameError,
-                    tr( "Your hostname contains invalid characters. Only letters, numbers and dashes are allowed." ) );
+                    tr( "Only letters, numbers, underscore and hyphen are allowed." ) );
         m_readyHostname = false;
     }
     else