diff --git a/install/froxlor.sql.php b/install/froxlor.sql.php index 140dcf45..c51e1c5e 100644 --- a/install/froxlor.sql.php +++ b/install/froxlor.sql.php @@ -42,7 +42,8 @@ CREATE TABLE `ftp_users` ( `username` varchar(255) NOT NULL, `uid` int(5) NOT NULL default '0', `gid` int(5) NOT NULL default '0', - `password` varchar(128) NOT NULL, + `password` varchar(255) NOT NULL, + `password_compat` varchar(255) NOT NULL, `homedir` varchar(255) NOT NULL default '', `shell` varchar(255) NOT NULL default '/bin/false', `login_enabled` enum('N','Y') NOT NULL default 'N', @@ -65,8 +66,8 @@ CREATE TABLE `mail_users` ( `id` int(11) NOT NULL auto_increment, `email` varchar(255) NOT NULL default '', `username` varchar(255) NOT NULL default '', - `password` varchar(128) NOT NULL default '', - `password_enc` varchar(128) NOT NULL default '', + `password` varchar(255) NOT NULL default '', + `password_enc` varchar(255) NOT NULL default '', `uid` int(11) NOT NULL default '0', `gid` int(11) NOT NULL default '0', `homedir` varchar(255) NOT NULL default '', diff --git a/install/updates/froxlor/update_2.x.inc.php b/install/updates/froxlor/update_2.x.inc.php index 61844be3..fceeeaf1 100644 --- a/install/updates/froxlor/update_2.x.inc.php +++ b/install/updates/froxlor/update_2.x.inc.php @@ -68,6 +68,14 @@ if (Froxlor::isFroxlorVersion('0.10.38')) { Database::query($sql); // new customer allowed_mysqlserver field Database::query("ALTER TABLE `" . TABLE_PANEL_CUSTOMERS . "` ADD `allowed_mysqlserver` varchar(500) NOT NULL default '[0]';"); + // ftp_users adjustments + Database::query("ALTER TABLE `" . TABLE_FTP_USERS . "` CHANGE `password` varchar(255) NOT NULL default '';"); + Database::query("ALTER TABLE `" . TABLE_FTP_USERS . "` ADD `password_compat` varchar(255) NOT NULL default '' AFTER `password`;"); + // update existing entries + Database::query("UPDATE `" . TABLE_FTP_USERS . "` SET `password_compat` = `password`;"); + // mail_users adjustments + Database::query("ALTER TABLE `" . TABLE_MAIL_USERS . "` CHANGE `password` varchar(255) NOT NULL default '';"); + Database::query("ALTER TABLE `" . TABLE_MAIL_USERS . "` CHANGE `password_enc` varchar(255) NOT NULL default '';"); Update::lastStepStatus(0); Update::showUpdateStep("Checking for multiple mysql-servers to allow acccess to customers for existing databases"); diff --git a/lib/Froxlor/Api/Commands/Ftps.php b/lib/Froxlor/Api/Commands/Ftps.php index 76826087..99e2e4d6 100644 --- a/lib/Froxlor/Api/Commands/Ftps.php +++ b/lib/Froxlor/Api/Commands/Ftps.php @@ -173,15 +173,17 @@ class Ftps extends ApiCommand implements ResourceEntity } else { $path = FileDir::makeCorrectDir($customer['documentroot'] . '/' . $path); $cryptPassword = Crypt::makeCryptPassword($password, false, true); + $cryptPasswordCompat = Crypt::makeCryptPassword($password, true, true); $stmt = Database::prepare("INSERT INTO `" . TABLE_FTP_USERS . "` - (`customerid`, `username`, `description`, `password`, `homedir`, `login_enabled`, `uid`, `gid`, `shell`) - VALUES (:customerid, :username, :description, :password, :homedir, 'y', :guid, :guid, :shell)"); + (`customerid`, `username`, `description`, `password`, `password_compat`, `homedir`, `login_enabled`, `uid`, `gid`, `shell`) + VALUES (:customerid, :username, :description, :password, :passwordc, :homedir, 'y', :guid, :guid, :shell)"); $params = [ "customerid" => $customer['customerid'], "username" => $username, "description" => $description, "password" => $cryptPassword, + "passwordc" => $cryptPasswordCompat, "homedir" => $path, "guid" => $customer['guid'], "shell" => $shell @@ -442,16 +444,18 @@ class Ftps extends ApiCommand implements ResourceEntity Response::standardError('passwordshouldnotbeusername', '', true); } $cryptPassword = Crypt::makeCryptPassword($password, false, true); + $cryptPasswordCompat = Crypt::makeCryptPassword($password, true, true); $stmt = Database::prepare("UPDATE `" . TABLE_FTP_USERS . "` - SET `password` = :password + SET `password` = :password, `password_compat` = :passwordc WHERE `customerid` = :customerid AND `id` = :id "); Database::pexecute($stmt, [ "customerid" => $customer['customerid'], "id" => $id, - "password" => $cryptPassword + "password" => $cryptPassword, + "passwordc" => $cryptPasswordCompat ], true, true); $this->logger()->logAction($this->isAdmin() ? FroxlorLogger::ADM_ACTION : FroxlorLogger::USR_ACTION, LOG_INFO, "[API] updated ftp-account password for '" . $result['username'] . "'"); } diff --git a/lib/Froxlor/System/Crypt.php b/lib/Froxlor/System/Crypt.php index ebe00c86..791cd481 100644 --- a/lib/Froxlor/System/Crypt.php +++ b/lib/Froxlor/System/Crypt.php @@ -207,24 +207,23 @@ class Crypt * @param string $password * Password to be encrypted * @param bool $htpasswd - * optional whether to generate a SHA1 password for directory protection + * optional whether to generate a SHA1 password for directory protection, if this and $openssl is set, outputs sha1-hash * @param bool $openssl - * optional generates $htpasswd like strings but for proftpd - * - * @return string encrypted password) - * - * 0 - default crypt (depends on system configuration) - * 1 - MD5 $1$ - * 2 - BLOWFISH $2y$07$ - * 3 - SHA-256 $5$ (default) - * 4 - SHA-512 $6$ + * optional generates $htpasswd like strings but for proftpd {algo}base64encoded_hash, if this and $htpasswd is set, outputs sha1-hash * + * @return string encrypted password */ public static function makeCryptPassword($password, $htpasswd = false, $openssl = false) { if ($htpasswd || $openssl) { + if ($htpasswd && $openssl) { + // sha1 compatible for pure-ftpd (not encoded) + return sha1($password); + } + // sha1 hash for either dir-protection or (if openssl=1) for proftpd return '{SHA' . ($openssl ? '1' : '') . '}' . base64_encode(sha1($password, true)); } + // crypt using the specified crypt-algorithm or system default $algo = Settings::Get('system.passwordcryptfunc') !== null ? Settings::Get('system.passwordcryptfunc') : PASSWORD_DEFAULT; return password_hash($password, $algo); } diff --git a/lib/configfiles/bionic.xml b/lib/configfiles/bionic.xml index eaa141a8..c985303b 100644 --- a/lib/configfiles/bionic.xml +++ b/lib/configfiles/bionic.xml @@ -4333,6 +4333,26 @@ TLSVerifyClient off + + " +openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 3072 +chmod 0600 /etc/ssl/private/pure-ftpd.pem /etc/ssl/private/pure-ftpd-dhparams.pem +]]> + + + + + + + + + + + + " +openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 3072 +chmod 0600 /etc/ssl/private/pure-ftpd.pem /etc/ssl/private/pure-ftpd-dhparams.pem +]]> + + + + + + + + + + + + " +openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 3072 +chmod 0600 /etc/ssl/private/pure-ftpd.pem /etc/ssl/private/pure-ftpd-dhparams.pem +]]> + + + + + + + + + + + + " +openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 3072 +chmod 0600 /etc/ssl/private/pure-ftpd.pem /etc/ssl/private/pure-ftpd-dhparams.pem +]]> + + + + + + + + + + + + " +openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 3072 +chmod 0600 /etc/ssl/private/pure-ftpd.pem /etc/ssl/private/pure-ftpd-dhparams.pem +]]> + + + + + + + + + + > /etc/portage/package.use/froxlor]]> + + " +openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 3072 +chmod 0600 /etc/ssl/private/pure-ftpd.pem /etc/ssl/private/pure-ftpd-dhparams.pem +]]> + + + + + + @@ -3563,8 +3576,8 @@ MYSQLSocket /var/run/mysqld/mysqld.sock MYSQLUser MYSQLPassword MYSQLDatabase -MYSQLCrypt Crypt -MYSQLGetPW SELECT password FROM ftp_users WHERE username="\L" AND login_enabled="y" +MYSQLCrypt any +MYSQLGetPW SELECT password_compat FROM ftp_users WHERE username="\L" AND login_enabled="y" MYSQLGetUID SELECT uid FROM ftp_users WHERE username="\L" AND login_enabled="y" MYSQLGetGID SELECT gid FROM ftp_users WHERE username="\L" AND login_enabled="y" MYSQLGetDir SELECT homedir FROM ftp_users WHERE username="\L" AND login_enabled="y" diff --git a/lib/configfiles/jammy.xml b/lib/configfiles/jammy.xml index 86389836..60c8faab 100644 --- a/lib/configfiles/jammy.xml +++ b/lib/configfiles/jammy.xml @@ -3750,6 +3750,26 @@ TLSVerifyClient off + + " +openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 3072 +chmod 0600 /etc/ssl/private/pure-ftpd.pem /etc/ssl/private/pure-ftpd-dhparams.pem +]]> + + + + + + + + + +