It is not so easy, there is no single module to do this. But I found a solution for this.
It's not optimal because you have to restart ProFTPd server each time you change MySQL configuration, but it works.
As you have a ProFTPd server that already run with MySQL, i will explain only the part of specific user configuration.
For this solution you need ProFTPd to be compiled with these modules:
- mod_ifsession (with this module you will be able to configure
<IfUser>
conditions) - mod_conf_sql (with this module you will be able to load configuration from MySQL)
To help you with ProFTPd recompilation, you can run this command proftpd -V
to see how your version is configured. You can found some documentation here.
Once you have compiled your ProFTPd server and it's run, you will have to log on your MySQL server.
If you read mod_conf_sql, they say to create 3 tables ftpctxt, ftpconf, ftpmap
. We will not create these tables unless you want to have global configuration from MySQL.
We will fake the MySQL configuration with "views".
1. First you add each specific configuration as user column (make sure to have a default value):
ALTER TABLE ftpuser #
ADD PathDenyFilter VARCHAR( 255 ) NOT NULL DEFAULT '(\.ftp)|(\.hta)[a-z]+$';`
ALTER TABLE ftpuser
ADD PathAllowFilter VARCHAR( 255 ) NOT NULL DEFAULT '.*$';`
....
2. Create the conf
view:
- User's
id
and configuration column are concatenated to make an uniqueid
- User's configuration column is used as
type
- User's configuration value is used as
info
View is an union of selects (for every column an union is required)
CREATE VIEW ftpuser_conf AS SELECT concat(ftpuser.id,'-PathDenyFilter') AS id,'PathDenyFilter' AS type,ftpuser.PathDenyFilter AS info from ftpuser UNION SELECT concat(ftpuser.id,'-PathAllowFilter') AS id,'PathAllowFilter' AS type, ftpuser.PathAllowFilter AS info from ftpuser;
3. Create the ctxt
view
- This view is a concatenation of a "Default" row and user's rows ("Default" row has 1 as
id
and user's rows have user'sid
+ 1 asid
. - Concatenate "userconf-" and user's
id
asname
- "IfUser" as
type
User's username as
info
CREATE VIEW ftpuser_ctxt AS SELECT 1 AS id,NULL AS parent_id, 'default' AS name, 'default' AS type, NULL AS info UNION SELECT (ftpuser.id + 1) AS id,1 AS parent_id, concat('userconf-',ftpuser.userid) AS name, 'IfUser' AS type,ftpuser.userid AS info FRON ftpuser;
4. Create the map
view
- User's
id
and configuration column are concatenated forconf_id
- User's
id
+ 1 forctxt_id
View is an union of selects (for every column an union is required)
CREATE VIEW ftpuser_map AS SELECT concat(ftpuser.id,'-PathDenyFilter') AS conf_id,(ftpuser.id + 1) AS ctxt_id from ftpuser union select concat(ftpuser.id,'-PathAllowFilter') AS conf_id,(ftpuser.id + 1) AS ctxt_id from ftpuser;
5. Add these lines to your ProFTPd configuration
<IfModule mod_conf_sql.c>
Include sql://user:password@host/db:database/ctxt:ftpuser_ctxt:id,parent_id,type,info/conf:ftpuser_conf:id,type,info/map:ftpuser_map:conf_id,ctxt_id/base_id=1
</IfModule>
Where:
user
=> your MySQL usernamepassword
=> your MySQL passwordhost
=> your MySQL hostdatabase
=> your MySQL database
6. Restart your ProFTPd server
I hope this will help you. Good luck