[users] Add hostname guessing to Config
This commit is contained in:
parent
411a202ba5
commit
5ffa09000a
@ -26,6 +26,7 @@
|
|||||||
#include "utils/String.h"
|
#include "utils/String.h"
|
||||||
#include "utils/Variant.h"
|
#include "utils/Variant.h"
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
|
|
||||||
Config::Config( QObject* parent )
|
Config::Config( QObject* parent )
|
||||||
@ -84,12 +85,56 @@ Config::setLoginName( const QString& login )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const QRegExp USERNAME_RX( "^[a-z_][a-z0-9_-]*[$]?$" );
|
void
|
||||||
|
Config::setHostName( const QString& host )
|
||||||
|
{
|
||||||
|
if ( host != m_hostName )
|
||||||
|
{
|
||||||
|
m_customHostName = !host.isEmpty();
|
||||||
|
m_hostName = host;
|
||||||
|
emit hostNameChanged( host );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** @brief Guess the machine's name
|
||||||
|
*
|
||||||
|
* If there is DMI data, use that; otherwise, just call the machine "-pc".
|
||||||
|
* Reads the DMI data just once.
|
||||||
|
*/
|
||||||
|
static QString
|
||||||
|
guessProductName()
|
||||||
|
{
|
||||||
|
static bool tried = false;
|
||||||
|
static QString dmiProduct;
|
||||||
|
|
||||||
|
if ( !tried )
|
||||||
|
{
|
||||||
|
// yes validateHostnameText() but these files can be a mess
|
||||||
|
QRegExp dmirx( "[^a-zA-Z0-9]", Qt::CaseInsensitive );
|
||||||
|
QFile dmiFile( QStringLiteral( "/sys/devices/virtual/dmi/id/product_name" ) );
|
||||||
|
|
||||||
|
if ( dmiFile.exists() && dmiFile.open( QIODevice::ReadOnly ) )
|
||||||
|
{
|
||||||
|
dmiProduct = QString::fromLocal8Bit( dmiFile.readAll().simplified().data() )
|
||||||
|
.toLower()
|
||||||
|
.replace( dmirx, " " )
|
||||||
|
.remove( ' ' );
|
||||||
|
}
|
||||||
|
if ( dmiProduct.isEmpty() )
|
||||||
|
{
|
||||||
|
dmiProduct = QStringLiteral( "-pc" );
|
||||||
|
}
|
||||||
|
tried = true;
|
||||||
|
}
|
||||||
|
return dmiProduct;
|
||||||
|
}
|
||||||
|
|
||||||
static QString
|
static QString
|
||||||
makeLoginNameSuggestion( const QStringList& parts )
|
makeLoginNameSuggestion( const QStringList& parts )
|
||||||
{
|
{
|
||||||
if ( parts.isEmpty() )
|
static const QRegExp USERNAME_RX( "^[a-z_][a-z0-9_-]*[$]?$" );
|
||||||
|
if ( parts.isEmpty() || parts.first().isEmpty() )
|
||||||
{
|
{
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
@ -106,6 +151,20 @@ makeLoginNameSuggestion( const QStringList& parts )
|
|||||||
return USERNAME_RX.indexIn( usernameSuggestion ) != -1 ? usernameSuggestion : QString();
|
return USERNAME_RX.indexIn( usernameSuggestion ) != -1 ? usernameSuggestion : QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QString
|
||||||
|
makeHostnameSuggestion( const QStringList& parts )
|
||||||
|
{
|
||||||
|
static const QRegExp HOSTNAME_RX( "^[a-zA-Z0-9][-a-zA-Z0-9_]*$" );
|
||||||
|
if ( parts.isEmpty() || parts.first().isEmpty() )
|
||||||
|
{
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString productName = guessProductName();
|
||||||
|
QString hostnameSuggestion = QStringLiteral( "%1-%2" ).arg( parts.first() ).arg( productName );
|
||||||
|
return HOSTNAME_RX.indexIn( hostnameSuggestion ) != -1 ? hostnameSuggestion : QString();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Config::setUserName( const QString& name )
|
Config::setUserName( const QString& name )
|
||||||
{
|
{
|
||||||
@ -128,10 +187,18 @@ Config::setUserName( const QString& name )
|
|||||||
emit loginNameChanged( login );
|
emit loginNameChanged( login );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ( !m_customHostName )
|
||||||
|
{
|
||||||
|
QString hostname = makeHostnameSuggestion( cleanParts );
|
||||||
|
if ( !hostname.isEmpty() && hostname != m_hostName )
|
||||||
|
{
|
||||||
|
m_hostName = hostname;
|
||||||
|
emit hostNameChanged( hostname );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Config::setConfigurationMap( const QVariantMap& configurationMap )
|
Config::setConfigurationMap( const QVariantMap& configurationMap )
|
||||||
{
|
{
|
||||||
|
@ -36,6 +36,8 @@ class Config : public QObject
|
|||||||
Q_PROPERTY( QString userName READ userName WRITE setUserName NOTIFY userNameChanged )
|
Q_PROPERTY( QString userName READ userName WRITE setUserName NOTIFY userNameChanged )
|
||||||
Q_PROPERTY( QString loginName READ loginName WRITE setLoginName NOTIFY loginNameChanged )
|
Q_PROPERTY( QString loginName READ loginName WRITE setLoginName NOTIFY loginNameChanged )
|
||||||
|
|
||||||
|
Q_PROPERTY( QString hostName READ hostName WRITE setHostName NOTIFY hostNameChanged )
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Config( QObject* parent = nullptr );
|
Config( QObject* parent = nullptr );
|
||||||
~Config();
|
~Config();
|
||||||
@ -59,6 +61,9 @@ public:
|
|||||||
/// The login name of the user
|
/// The login name of the user
|
||||||
QString loginName() const { return m_loginName; }
|
QString loginName() const { return m_loginName; }
|
||||||
|
|
||||||
|
/// The host name (name for the system)
|
||||||
|
QString hostName() const { return m_hostName; }
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
/** @brief Sets the user's shell if possible
|
/** @brief Sets the user's shell if possible
|
||||||
*
|
*
|
||||||
@ -80,12 +85,16 @@ public Q_SLOTS:
|
|||||||
/// Sets the login name (flags it as "custom")
|
/// Sets the login name (flags it as "custom")
|
||||||
void setLoginName( const QString& login );
|
void setLoginName( const QString& login );
|
||||||
|
|
||||||
|
/// Sets the host name (flags it as "custom")
|
||||||
|
void setHostName( const QString& host );
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void userShellChanged( const QString& );
|
void userShellChanged( const QString& );
|
||||||
void autologinGroupChanged( const QString& );
|
void autologinGroupChanged( const QString& );
|
||||||
void sudoersGroupChanged( const QString& );
|
void sudoersGroupChanged( const QString& );
|
||||||
void userNameChanged( const QString& );
|
void userNameChanged( const QString& );
|
||||||
void loginNameChanged( const QString& );
|
void loginNameChanged( const QString& );
|
||||||
|
void hostNameChanged( const QString& );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_userShell;
|
QString m_userShell;
|
||||||
@ -93,7 +102,9 @@ private:
|
|||||||
QString m_sudoersGroup;
|
QString m_sudoersGroup;
|
||||||
QString m_fullName;
|
QString m_fullName;
|
||||||
QString m_loginName;
|
QString m_loginName;
|
||||||
|
QString m_hostName;
|
||||||
bool m_customLoginName = false;
|
bool m_customLoginName = false;
|
||||||
|
bool m_customHostName = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user