qmailadmin

September 1, 2020 Roberto Puzzanghera62 comments

qmailAdmin is a free software package that provides a web interface for managing a qmail system with virtual domains. It provides admin for adding/deleting users, Aliases, Forwards, Mailing lists and Autoresponders.

Combined patch details

  • qmailadmin-skin, a patch that I created during covid-19 spare time, provides a new responsive skin to the control panel. It modifies everything under the html dir and many .c files in order to adjust the html embedded into the source files. Added a stylesheet style.css in the images folder and a couple of png files for the qmail logo.
  • patch to call cracklib in order to check for the password strenght. This should avoid unsafe accounts created by domain administrators such as "test 123456".
  • A patch (thanks to Tony, original author unknown) which gets qmailadmin to have authentication failures logged. This makes possibile to ban malicious IPs via fail2ban. It is required to create the log file /var/log/qma-auth.log initially and assign write priviledges to apache.
  • ezmlm-idx 7 compatibility patch (author unknown), which restores the compatibility with ezmlm-idx-7 (thanks to J.D. Trolinger for the advice).
  • a fix to the catchall account (thanks to Luca Franceschini).
  • another fix to autorespond.c to correct the way .qmail files are modified

Changelog

  • 2020.09.02
    -mod_user.html: cleaned the html as it was printing unneeded strings
  • 2020.08.10
    - mod_user.html: added the "value" attribute to the name/gecos input tag
    - Makefile.in: added a line to install the css, as already done for Makefile.am
    (tx Pablo Murillo)
  • 2020.05.22
    - mod_user.html: removed the "required" attribute on password field, to allow modifications in case of no password change

 

Setting up cracklib

Cracklib is a library of functions providing a password complexity check against a word list. It compares the chosen password with the words contained in a database and if it is similar to one of them it outputs a negative response.

Before installing qmailadmin we have to set up cracklib and then apply the patch. This patch upgrades the one of Inter7, which enforced qmailadmin only in the case of user modification but not when creating the user or simply when the user navigates the "change password" page.

Installing the sources

It's likely that you have the cracklib package and words list available in your Linux distribution repository. In this case proceed to the next step. If not, go ahead as follows in the normal way:

wget https://ftp.osuosl.org/pub/blfs/conglomeration/cracklib/cracklib-2.9.7.tar.bz2
tar xjf cracklib-2.9.7.tar.bz2
cd cracklib-2.9.7
./configure --with-default-dict=/usr/share/cracklib/pw_dict
make
make install
ldconfig

Installing the dictionary

Create the dictionary folder (the same as used in the configure command)

mkdir /usr/share/cracklib
cd /usr/share/cracklib

Download the words list

wget https://ftp.osuosl.org/pub/blfs/conglomeration/cracklib/cracklib-words-2.9.7.bz2
bunzip2 cracklib-words-2.9.7.bz2

Format and pack the dictionary into pw_dict.* files

cracklib-format cracklib-words-2.9.7 | cracklib-packer pw_dict

Now check that the cracklibs-words database has been created:

ls
cracklib-words-2.9.7  pw_dict.hwm  pw_dict.pwd  pw_dict.pwi

The database is made up of those three pw_dict.* compiled files. You can always enrich the database adding lines to the plain-text file and using a combination of cracklib-format/cracklib-packer as shown above.Take also note of where the database has been installed because we'll have to pass its path to qmailadmin's configure.

Testing cracklib

Let's do some test to see how cracklib works:

# cracklib-check  
roberto 
roberto: it is based on a dictionary word 
123456 
123456: it is too simplistic/systematic 
roberto928 
roberto928: it is based on a dictionary word 
robe99 
robe99: it is based on a dictionary word 
99robe 
99robe: it is based on a dictionary word 
robe@99 
robe@99: it is based on a dictionary word
Qwerty123 
Qwerty123: it is based on a dictionary word 
Qwerty!123 
Qwerty!123: it is based on a dictionary word
Rob&02f 
Rob&02f: OK
Rob&rto 
Rob&rto: OK
^C

To enable cracklib compile qmailadmin as

--enable-cracklib=/usr/share/cracklib/pw_dict

When using cracklib as a standalone patch you have to  provide a combination of aclocal/automake/autoconf in order to rebuild the configure file. My combined patch already have the configure file rebuilt.

Installing qmailadmin

cd /usr/local/src
wget https://notes.sagredo.eu/files/qmail/tar/qmailadmin-1.2.16.tar.gz
wget https://notes.sagredo.eu/files/qmail/patches/qmailadmin/roberto-qmailadmin/roberto-qmailadmin-1.2.16_20200902.patch

touch /var/log/qma-auth.log
chgrp apache /var/log/qma-auth.log
chmod g+w /var/log/qma-auth.log

tar xzf qmailadmin-1.2.16.tar.gz
cd qmailadmin-1.2.16
patch -p1 < ../roberto-qmailadmin-1.2.16_20200902.patch
chown -R root.root .

QMAILROOT=/var/www/qmail
./configure \
  --enable-htmldir=${QMAILROOT} \
  --enable-cgibindir=${QMAILROOT}/cgi-bin \
  --enable-cgipath=/cgi-bin/qmailadmin \
  --enable-imagedir=${QMAILROOT}/qmailadmin/files \
  --enable-imageurl=/files \
  --enable-htmllibdir=${QMAILROOT}/qmailadmin \
  --enable-qmaildir=/var/qmail \
  --enable-domain-autofill \
  --enable-vpopuser=vpopmail \
  --enable-vpopgroup=vchkpw \
  --enable-autoresponder-path=/usr/local/bin \
  --enable-ezmlmdir=/usr/local/bin/ezmlm \
  --enable-modify-quota \
  --disable-ezmlm-mysql \
  --disable-trivial-password \
  --enable-cracklib=/usr/share/cracklib/pw_dict

Before compiling you may want to save the qmail logo png files into the "images" folder of your source directory:

cd images
wget https://notes.sagredo.eu/files/qmail//patches//qmailadmin//skin//img/favicon-16x16.png
wget https://notes.sagredo.eu/files/qmail//patches//qmailadmin//skin//img/favicon-32x32.png
wget https://notes.sagredo.eu/files/qmail//patches//qmailadmin//skin//img/logo.png
wget https://notes.sagredo.eu/files/qmail//patches//qmailadmin//skin//img/logo_big.png

Then compile and install as usual:

cd ..
make

If you get errors like this

/bin/bash: aclocal-1.15: command not found

try to provide (tx Gabriel Torres)

autoreconf -f -i

Install:

make install-strip

This installs qmailadmin in /var/www/qmail.

Apache virtual host

Define QMAILROOT /var/www/qmail
Define LOGDIR    /var/log/apache

<VirtualHost *:443>
        ServerName yourdomain.net
        DocumentRoot ${QMAILROOT}
        ScriptAlias /cgi-bin/ ${QMAILROOT}/cgi-bin/
        ErrorLog  ${LOGDIR}/qmailadmin_error.log
        CustomLog ${LOGDIR}/qmailadmin_access.log common
        <Directory ${QMAILROOT}>
            Require all granted
            AllowOverride None
        </Directory>
        <Directory ${QMAILROOT}/cgi-bin>
            AllowOverride None
            Options ExecCGI
            Require all granted
        </Directory>

        Alias /files/ ${QMAILROOT}/qmailadmin/files/
        <Directory ${QMAILROOT}/qmailadmin/files>
            Require all granted
        </Directory>
</VirtualHost>

Now browse to https://yourdomain.net/cgi-bin/qmailadmin and login as postmaster.

Comments

libcrack.so.2: cannot open shared object file: No such file or directory

Hello!

If you downloaded the cracklib dictionary, then runing the command:

cracklib-format cracklib-words-2.9.7 | cracklib-packer pw_dict

and you encounter the following error:

cracklib-packer: error while loading shared libraries: libcrack.so.2: cannot open shared object file: No such file or directory

You should run `ldconfig` command and run the command again.

Reply | Permalink

libcrack.so.2: cannot open shared object file: No such file or directory

thank you. Added the ldconfig command

Reply | Permalink

qmailadmin patch error

Hi Roberto

The following error occurred when applying the patch "roberto-qmailadmin-1.2.16_20200901.patch":

patch: **** malformed patch at line 7496: diff -ruN ../../qmailadmin-1.2.16-original/html/setremotecatchall.html qmailadmin-1.2.16/html/setremotecatchall.html

Please correct it.

Reply | Permalink

qmailadmin patch error

Thank you. Corrected

Reply | Permalink

User can still enter "password" as password

Cracklib patch works great and it can detect bad passwords, except if user uses password as password. It lets it through.

Reply | Permalink

User can still enter

It's rejecting "password" as password here...

Reply | Permalink

User can still enter

Hrm, that is strange then. It clearly is using cracklib to check, as I tried for example !7350r13r0 as password that's in cracklib-words-2.9.7 and got error "Bad password - it is based on a dictionary word." However if I use password, it creates the account with it successfully. Like as if it wasn't checking cracklib.

# cracklib-check
!7350r13r0
!7350r13r0: it is based on a dictionary word
password
password: it is based on a dictionary word

cracklib is correctly rejecting it.

Any ideas as to how I could trouble shoot this further?

Reply | Permalink

User can still enter

Unfortunately I've no idea at the moment

Reply | Permalink

Small fix to the tutorial

Should update this:

wget https://notes.sagredo.eu/files/qmail/patches/qmailadmin/roberto-qmailadmin/roberto-qmailadmin-1.2.16_20200522.patch

With this:

wget https://notes.sagredo.eu/files/qmail//patches//qmailadmin//roberto-qmailadmin//roberto-qmailadmin-1.2.16_20200810.patch

Reply | Permalink

Small fix to the tutorial

Thank you. Corrected

Reply | Permalink

Differences between full patch and skin patch

Hi Roberto

I find a little difference in mailinglist.c
Lines :

FULL: @@ -1253,93 +1254,93 @@
SKIN: @@ -1253,93 +1270,88 @@

Ful patch at the end of the last block

 sprintf (TmpBuf, html_text[272], listname);
- printf ("(%s)", TmpBuf);
- printf ("
\n");
+ printf ("(%s)", TmpBuf);
+ printf ("
\n");
sprintf (TmpBuf, html_text[273], listname);
- build_option_str ("CHECKBOX", "opt6", "q", TmpBuf);
- printf ("
\n");
+ build_option_str ("checkbox", "opt6", "q", TmpBuf);
+ printf ("
\n");
sprintf (TmpBuf, html_text[274], listname, listname, listname);
- printf ("    (%s)", TmpBuf);
+ printf ("    (%s)", TmpBuf);

Skin patch same place

 sprintf (TmpBuf, html_text[272], listname);
- printf ("(%s)", TmpBuf);
- printf ("
\n");
- sprintf (TmpBuf, html_text[273], listname);
- build_option_str ("CHECKBOX", "opt6", "q", TmpBuf);
- printf ("
\n");
- sprintf (TmpBuf, html_text[274], listname, listname, listname);
- printf ("    (%s)", TmpBuf);
+ printf ("(%s)", TmpBuf);
+ printf ("", TmpBuf);

You can see that there are a lot of deleted lines (5)

Which is ok? Full or Skin?

Reply | Permalink

Differences between full patch and skin patch

Hi Pablo, the skin patch is intended for vanilla qmailadmin. The full embeds a patch to make it ezmlm-idx-7 compliant, which is important, as you know. Therefore, it depends if you want to apply that patch by yourself or you want to use the full one.

In any case the full patch code is correct because already includes that fix

Reply | Permalink

Little correction to skin patch

HI !

Very nice work
You forgot the value for Rela Name in mod_user.html

Line 2425 add : value="##i7"

I don't know why I don't see the page just like your examples, something may be missing

Reply | Permalink

Little correction to skin patch

Thank you, Pablo. Patch updated.

Concerning your problem, do you get any error in your browser inspector's console? Maybe a missing apache setting which prevents some element to be displayed?

Reply | Permalink

Little correction to skin patch

I solved the problem with the different look

I forget to tell you that I'm using FreeBSD with ports
For every patch you made, I have a lot of ours to "translate" to "ports"
Ajajajajaja

I reallized that you are using a differente version of qmailadmin, the problem was in the CSS and I only used the style patch, not the full patch, and I found that in style patch there is a missing patch for Makefile.in to copy CSS

Reply | Permalink

Little correction to skin patch

Sorry, I can't get what you mean concerning the translation problem. Can you clarify so that I can improve the documentation and avoid that others will have the same issue?

As far as the patch is concerned, I'm going to add a modification for Makefile.in in my patch as well. Thanks for the advice. Please provide any hint as you can to improve this guide for FreeBSD users.

Reply | Permalink

Little correction to skin patch

Sorry, my english is not so good :D

For "translate" to "ports" I mean, convert your patch to a new one that works with FreeBSD ports collection

I can do everything "by hand", but I have to maintain a lot of server and it is more easy mainain everything with ports

For example :
qmailadmin in FreeBSD ports is on version 1.2.15 and include all the patchs you combined in your patch, so, I only used the style patch, but it don't work as is, I had to make some changes to make it work

And also, I have make a change (by hand) on the Makefile in the port

Reply | Permalink

Little correction to skin patch

it would be great if you can share your FreeBSD patches once converted them. I could publish them together with my linux patches... I remember that other people here complained of not been able to compile and I can only guess that the more people will be using qmail for FreeBSD the more hints and material will come back to them, just like it happens for linux :)

Reply | Permalink

Little correction to skin patch

I make patches and "manually" update the files needed in the port tree (Makefile and other files sometimes), is something not "easy"

Your patches work on FreeBSD when instaling every manually, but, using external patches on ports is not posible, the port must be modified to use it

Every time a port is update by the maintener, all the files in the port are overwriting

What I really need to do is to update the port "officially" , but I do some things, only for the way we build servers, so, what I make is not for everyone, I should do other patches to share, and really, I don't have the time :(

Reply | Permalink

/bin/bash: aclocal-1.15: command not found

In order to solve:

/bin/bash: aclocal-1.15: command not found

I had to run:

autoreconf -f -i

Before running the ./configure line.

Reply | Permalink

malformed patch?

I got this output:

root@avcs7-ks12:/usr/local/src/qmailadmin-1.2.16# patch -p1 < ../qmailadmin-1.2.16-pwd-strenght.2019.09.13.patch
patching file Makefile.am
patching file Makefile.in
patching file html/add_user.html
patching file html/change_password.html
patching file html/header.html
patching file html/mod_user.html
patching file html/pwd_strenght_chk.js
patch: **** malformed patch at line 170:

This is on a centos 7.7 host. Can you confirm if the patch file is corrupted or not?

Thanks

Richard

Reply | Permalink

malformed patch?

thanks for the advise. Corrected

Reply | Permalink

Autoresponder not working with patch for the password strenght

With patch for password strenght applied autoresponse can't be set the error is: "The password must be at least 8 caracthers long!"

The password box is indeed empty because i don't want to change password I want to sent vacation auto response.

Reply | Permalink

Autoresponder not working with patch for the password strenght

Yes you are right, I will improve that patch when I'll find the time.

I created that patch to solve the big problem of the pwd strenght and didn't pay attention to autoresponder because I use sieve for the purpose and don't let users manage the account via qmailadmin.

In the meantime you can reverse the patch or type the pwd when setting autoresponse

Reply | Permalink

Autoresponder not working with patch for the password strenght

To bypas I added a new line to check if password is 0 lenght. 

var key = (change==0) ? 'password1' : 'newpass1';
if (eval(key).value.length=0) return true;}
if (eval(key).value.length<8) {alert(alertTooShort); eval(key).focus(); return false;}

And thank you very much for your site.
Very helpful !

Reply | Permalink

Autoresponder not working with patch for the password strenght

you missed a double == here

if (eval(key).value.length=0) return true;}

btw I think that in this way you could set a blank pwd if you submit the form without setting the vacation.

Take a look at this new version of the patch

This what I changed with respect to the previous

+ // disable check if setting the autoresponder provided that the pwd remains intact
+ if (
+ (document.getElementById("cforward").checked==false || document.getElementById("vacation").checked==true)
+ && eval(key).value.length==0
+ ) return true;

There is a modification in mod_user.html as well

Reply | Permalink

compiler error 1.2.16

I get compiler errors if I try to compile 1.2.16 with or without your patches - 

user.c:173:11: error: unknown type name ‘storage_t’; did you mean ‘stack_t’?

Is there a working version of 1.2.16?   I can manually fix this by copying over missing files from 1.12.15, but surely 1.2.16 should compile without errors out the box?

Reply | Permalink

compiler error 1.2.16

the compilation is ok with gcc-8.2 as well here

(the problem is qmail-tls, which is not compatible with openssl-1.1 :-(

Reply | Permalink

compiler error 1.2.16

which version of gcc? both versions work here (gcc-5.5)

Reply | Permalink

Blank screen after login to Qmailadmin

I have followed your guide and I am at the point of logging into Qmailadmin.

The page comes up perfectly but after entering postmaster, domain and password, it gives a blank screen.

I checked all the error logs and there are no entries pointing to a reason for this behaviour.

Using the following versions:

qmailadmin 1.2.16
vpopmail 5.4.33

Reply | Permalink

Blank screen after login to Qmailadmin

When there is a blank screen after you put password on qmailadmin page, check permision for qm-auth.log file
It should be the permission of webserver. On debian/ubuntu usualy  is www-data (not apache as in Roberto guide)

Reply | Permalink

did you check the syslog to

did you check the syslog to look for a segfault? Anyway.. I would try to recompile qmailadmin

Reply | Permalink

Ezmlm-idx patch for qmailadmin

The qmailadmin-1.2.16 with ezmlm-idx-7.2.2  needs a patch in order to manage the mailing lists.  I had had to add this patch to my src directory then re-compile.  

patch < ../mailinglist.c.ezmlm7.patch

I also use your qmailadmin-1.2.16-pwd-strenght.patch-2015.04.25 and qmailadmin-1.2.16-log.patch with this patch.

I am not sure if this is in your patch list Roberto.  There are a few sources and I am not sure which one to post. 

Thanks,

John D. Trolinger

Reply | Permalink

Thanks for the advise, John.

Thanks for the advise, John. I was not aware of this patch, but I found it in the qmailrocks site. Tomorrow I'm going to study the idea behind it and eventually I'll add it to my qmailadmin. 

Can you report what kind of error you get when the patch is not applyed?

Reply | Permalink

Ezmlm-idx patch for qmailadmin

Before the patch I had to use the command line to add moderators.  Also I could not change settings for the various mailing lists.  

This may not be typical; I had migrated from another server  running older versions of qmailadmin and ezmlm.

Best Regards

Reply | Permalink

I added mailinglist.c.ezmlm7

I added mailinglist.c.ezmlm7.patch to the patch list

Reply | Permalink

Password patch

Hi,

The password qmailadmin-1.2.16-pwd-strenght.patch-2015.04.25 patch does not work for me. I am able to use simple password like 1234.

Anyone also encounter this?

thanks

nic

Reply | Permalink

and you can open the js file

and you can open the js file with your browser?

Reply | Permalink

Hi Roberto,

Hi Roberto,

Sadly to say, i dont know the path to it even.
 

Sorry and thanks

nic

Reply | Permalink

Probably you installed the

Probably you installed the pwd_strenght_chk.js file in the wrong path. Just navigate to the "add new user" page, right click to look at the html code and click over the javascript file. The file must be accessible by your web server.

Reply | Permalink

Hello,

Hello,

The absolute path of add user

/usr/local/share/qmailadmin/html/add_user.html

The path of the javascript

/usr/local/share/qmailadmin/html/pwd_strenght_chk.js

Cgi-bin path

/var/www/cgi-bin/qmailadmin

Configuration

./configure --enable-help \
--enable-domain-autofill \
--enable-htmldir=/var/www/html \
--enable-imagedir=/var/www/html/images/qmailadmin \
--enable-imageurl=http://domain.com/images/qmailadmin \
--enable-cgibindir=/var/www/cgi-bin \
--disable-ezmlm-mysql \
--enable-modify-quota \
--disable-trivial-password

Can you help me to spot any mistake.

Many thanks again

nic

Reply | Permalink

It depends on your web server

It depends on your web server configuration as well. Try to check if the webserver can access that file as suggested in my previous post

Reply | Permalink

Hi,

Hi,

I can see the source.

<script language="Javascript" type="text/javascript" src="/qmailadmin/html/pwd_strenght_chk.js"></script>
        </head>
        <body bgcolor="#ffffff" onload="init();">

But if i goto http://domain.com/cgi-bin/qmailadmin/html/pwd_strenght_chk.js i will just be directed to http://domain.com/cgi-bin/qmailadmin/

regards

nic

Reply | Permalink

Nic, your web server looks

Nic, your web server looks for the script in this path http://domain.com/qmailadmin/html/pwd_strenght_chk.js. Note that the dir is different. Try again and if it fails double check your web server config as far the qmailadmin virtual domain is concerned and also that apache can actually access that file

Reply | Permalink

Thanks Roberto.

Thanks Roberto.

All the functions in /html folder are working. I even edited the footer.html and it is also reflected in qmailadmin pages. I just don't know why the js file is not called.

sigh

nic

Reply | Permalink

perhaps you have javascript

perhaps you have javascript disabled in your browser?

Reply | Permalink

Hello,

Hello,

I had checked. javascript.enabled is true and i did a "Do i have java" on Java.com

Thanks for leading me this far. I think its up to myself to look for the broken link.

regards

nic

 

Reply | Permalink

Hi,

Hi,

I cannot find where is the broken link, or how it is broken. But i copy the js file into a public folder and edit the path of add_user.html, change_password.html and mod_user.html to URL of the new js file location.

All working now.

Thanks

nic

 

Reply | Permalink

I guess you have

I guess you have some apache permissions problems.. try to browse to that js file with your browser and look at the error you get

Reply | Permalink

qmailadmin auth log

Hi,

Thanks for your great works on this guide.  I would like to share the patch for qmailadmin (1.2.16) in order to have auth logging.  The patch shall log the failed login in qmailadmin login page.  The patch as underneath:

--- qmailadmin.c 2011-02-22 22:45:48.000000000 +0800
+++ qmailadmin.c.new 2015-05-11 12:06:58.984316573 +0800
@@ -22,6 +22,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 #include <unistd.h>
 #include <pwd.h>
 #include <dirent.h>
@@ -109,6 +110,33 @@
 char RealDir[156];
 char Lang[40];
 
+static void
+log_auth(char *msg)
+{
+    FILE *fp = NULL;
+    if ((fp = fopen("/var/log/qma-auth.log", "a")) == NULL) {
+ exit(-1);
+    }
+
+    const char *ip_addr = getenv("REMOTE_ADDR");
+    if (!ip_addr)
+        ip_addr = "127.0.0.1";
+
+    time_t tv;
+    struct tm tm;
+    char time_buf[64];
+
+    time(&tv);
+    localtime_r(&tv, &tm);
+    strftime(time_buf, sizeof(time_buf) - 2, "%Y/%m/%d %H:%M:%S", &tm);
+
+    fprintf(fp, "%s user:%s@%s ip:%s auth:%s\n", time_buf, Username, Domain, ip_addr, msg);
+
+    if (fclose(fp) != 0) {
+        exit(-1);
+    }
+}
+
 void qmailadmin_suid (gid_t Gid, uid_t Uid)
 {
   if ( geteuid() == 0 ) {
@@ -195,6 +223,11 @@
     if (*Username && (*Password == '\0') && (*Password1 || *Password2)) {
       /* username entered, but no password */
       snprintf (StatusMessage, sizeof(StatusMessage), "%s", html_text[198]);
+
+      char log_buf[3 * MAX_BUFF];
+      memset(log_buf, 0x0, sizeof(log_buf));
+      snprintf(log_buf, sizeof(log_buf) - 2, "failed [%s@%s]", Newu, Domain);
+      log_auth(log_buf);
     } else if (*Username && *Password) {
       /* attempt to authenticate user */
       vget_assign (Domain, RealDir, sizeof(RealDir), &Uid, &Gid);
@@ -208,6 +241,11 @@
 
       if ( *Domain == '\0' ) {
         snprintf (StatusMessage, sizeof(StatusMessage), "%s", html_text[198]);
+
+        char log_buf[3 * MAX_BUFF];
+        memset(log_buf, 0x0, sizeof(log_buf));
+        snprintf(log_buf, sizeof(log_buf) - 2, "failed [%s@%s]", Newu, Domain);
+        log_auth(log_buf);
       } else {
         chdir(RealDir);
         load_limits();
@@ -215,6 +253,11 @@
         pw = vauth_user( User, Domain, Password, "" );
         if ( pw == NULL ) {
           snprintf (StatusMessage, sizeof(StatusMessage), "%s", html_text[198]);
+
+          char log_buf[3 * MAX_BUFF];
+          memset(log_buf, 0x0, sizeof(log_buf));
+          snprintf(log_buf, sizeof(log_buf) - 2, "failed [%s@%s]", Newu, Domain);
+          log_auth(log_buf);
         } else if (pw->pw_flags & NO_PASSWD_CHNG) {
           strcpy (StatusMessage, "You don't have permission to change your password.");
         } else if (strcmp (Password1, Password2) != 0) {
@@ -264,6 +307,12 @@
          pw = vauth_user( Username, Domain, Password, "" );
          if ( pw == NULL ) {
            snprintf (StatusMessage, sizeof(StatusMessage), "%s\n", html_text[198]);
+
+           char log_buf[3 * MAX_BUFF];
+           memset(log_buf, 0x0, sizeof(log_buf));
+           snprintf(log_buf, sizeof(log_buf) - 2, "failed [%s@%s]", Newu, Domain);
+           log_auth(log_buf);
+
            show_login();
            vclose();
            exit(0);

It is required to created the log file /var/log/qma-auth.log initially.  Then we can use the log in fail2ban with the underneath filter:

[Definition]
failregex = ip:<HOST> auth:failed

ignoreregex =

Hope the patch is helpful.

Tony

Reply | Permalink

Tony, I added your patch to

Tony, I added your patch to the present guide. Thanks a lot

Reply | Permalink

verrry much apreciated, as

verrry much appreciated, as this is one thing I was looking for. At the moment I have an apache authentication before the web page is displayed, just to record the failures in the apache log.

Reply | Permalink

Warning of using the login picture from qmailadmin

Hello Roberto,

i want to warn you about the risks of using the login picture from qmailadmin. Seriously this is no joke and i couldn't believe it the first time but using qmailadmin with this picture (middleleft1.png ) had cost me a fine of several hundreds Euro. This has happened: A few weeks ago i've got a letter from the company Getty Images, that i'm using illegal the picture provided in the login form from qmailadmin. Getty Images says that they has the legal rights of this image an i didn't have a license to use the picture and i have to pay this amount of money as an compensation for violating the copy right of this picture and of course i have to remove the picture immediatelly. I googled this thing and found out that this is true and even the guys from inter7 are aware of this thing, that happend to other qmailadmin users too (see the full thread of this post: http://article.gmane.org/gmane.mail.qmail.admin/4804). I contacted a lawyer and he said that under german and EU copyright laws this is true and i violated the copy right because i have to make sure that when i publish on a website a picture i'm responsible to make sure that i don't violate any copyright rules, even when the picture is part of an open source software. Another lawyer told me that i can try to go against it but the uncertain of succes and the costs of an lawyer for this put me to the decision to pay the fine.

So be warned when using the picture and check the copyright laws of your country.

Cheers

Reply | Permalink

Thanks for the hint Mark. I'm

Thanks for the hint Mark. I'm going to write a note asap

I suppose that this is the reason why that image is not shown anymore in the latest version. I thought that it was a bug, but I think this is an explanation.

Reply | Permalink

qmailadmin set catchall blank screen

Hi Roberto,

I'm trying to setup email server based on your blog on Centos 6.5 x64

I manage to get everything to work until Qmailadmin part, when i test the menu "Set catchall email deleted" "Set catchall bounced" and "Set remote catch all account" , the page just show blank screen, even when i refresh (F5) , other menu seems ok.

Do you have any hint about this problem ?

Thanks.

Reply | Permalink

qmailadmin-catchall fix

this issue is fixed (thanks to Luca Franceschini). Patch

Reply | Permalink

downgrading vpopmail solved qmailadmin's catch-all account break

Dear all,

after some testing I found out that it works when downgrading vpopmail to v. 5.4.32 and qmailadmin to 1.2.15.

I also noticed that the compilation of qmailadmin breaks when compiling 1.2.16 over vpopmail 5.4.32, or 1.2.15 over vpopmail 5.4.33.

Summarizing:

  • qmailadmin 1.2.16 goes with vpopmail-5.4.33, but this option seems to have the catch-all accounts functionality broken
  • qmailadmin 1.2.15 only goes with vpopmail-5.4.32

Reply | Permalink

Hi George, I have the same

Hi George,

I have the same issue here. It worked in the past. I think it could be a bug... let me know if you solve

Reply | Permalink

same issue: qmailadmin set catchall blank screen

it was working before, must be some upgrade to apache, php, bash(?), or who knows what broke this.

Reply | Permalink

surely it does not depend on

surely it does not depend on php because it's not written in php. 

I would try to downgrade qmailadmin to see if it's broken only in the latest version

Reply | Permalink

Qmailadmin logging Invalid attempts

Hi Roberto,

I cannot find where qmailadmin logs failed login attempts or failed change password attempts. I'd like to work with fail2ban to ban those who attempt too many logins.

Thank you,

Boatner

Reply | Permalink

Hi Boatner, I know. This is a

Hi Boatner, I know. This is a problem. It doesn't log anything nor to /var/log/maillog nor to mysql

Reply | Permalink