Index: configure =================================================================== --- configure (revision 144) +++ configure (working copy) @@ -1647,7 +1647,7 @@ QA_PACKAGE="qmailadmin" -QA_VERSION="1.2.9" +QA_VERSION="1.2.10" cat >>confdefs.h <<_ACEOF Index: qmailadmin.c =================================================================== --- qmailadmin.c (revision 144) +++ qmailadmin.c (working copy) @@ -1,5 +1,5 @@ /* - * $Id: qmailadmin.c,v 1.6.2.10 2005/08/10 17:42:49 tomcollins Exp $ + * $Id: qmailadmin.c,v 1.6.2.11 2006/02/05 17:03:44 tomcollins Exp $ * Copyright (C) 1999-2004 Inter7 Internet Technologies, Inc. * * This program is free software; you can redistribute it and/or modify @@ -129,7 +129,7 @@ pi=getenv("PATH_INFO"); if ( pi ) pi = strdup(pi); - if (pi) strcpy (TmpBuf2, pi+5); + if (pi) snprintf (TmpBuf2, sizeof(TmpBuf2), "%s", pi + 5); rm = getenv("REQUEST_METHOD"); rm = (rm == NULL ? "" : strdup(rm)); Index: util.c =================================================================== --- util.c (revision 144) +++ util.c (working copy) @@ -1,5 +1,5 @@ /* - * $Id: util.c,v 1.4.2.6 2005/07/11 06:08:46 tomcollins Exp $ + * $Id: util.c,v 1.4.2.7 2006/02/05 16:49:08 tomcollins Exp $ * Copyright (C) 1999-2004 Inter7 Internet Technologies, Inc. * * This program is free software; you can redistribute it and/or modify @@ -390,6 +390,43 @@ return 0; } +void print_user_index (char *action, int colspan, char *user, char *dom, time_t mytime) +{ +#ifdef USER_INDEX + int k; + + printf ("", get_color_text("000")); + printf ("", colspan); + printf ("
"); + printf ("%s   ", html_text[133]); + for (k = 0; k < 10; k++) { + printh ("%d\n", + CGIPATH, action, user, dom, mytime, k, k); + } + for (k = 'a'; k <= 'z'; k++) { + printh ("%c\n", + CGIPATH, action, user, dom, mytime, k, k); + } + printf (""); + printf ("\n"); + + printf ("", get_color_text("000")); + printf ("", colspan); + printf ("

"); + printf ("
", CGIPATH, action); + printh ("", user); + printh ("", dom); + printf ("", (unsigned int) mytime); + printh (" ", SearchUser); + printf ("", html_text[204]); + printf ("
"); + printf ("
"); + printf ("
"); + printf ("\n"); + +#endif +} + /* * Brian Kolaci * updated function that doesn't require fts_* Index: user.c =================================================================== --- user.c (revision 144) +++ user.c (working copy) @@ -1,5 +1,5 @@ /* - * $Id: user.c,v 1.11.2.11 2005/01/23 17:35:12 tomcollins Exp $ + * $Id: user.c,v 1.11.2.13 2006/02/09 05:09:53 tomcollins Exp $ * Copyright (C) 1999-2004 Inter7 Internet Technologies, Inc. * * This program is free software; you can redistribute it and/or modify @@ -29,6 +29,7 @@ #include #include #include +#include "vpopmail.h" /* undef some macros that get redefined in config.h below */ #undef PACKAGE_NAME #undef PACKAGE_STRING @@ -45,7 +46,6 @@ #include "template.h" #include "user.h" #include "util.h" -#include "vpopmail.h" #include "vauth.h" @@ -244,40 +244,9 @@ } if (AdminType == DOMAIN_ADMIN) { -#ifdef USER_INDEX - printf ("", get_color_text("000")); - printf ("", colspan); - printf ("
"); - printf ("%s", html_text[133]); - printf ("
"); - for (k = 'a'; k <= 'z'; k++) { - printh ("%c\n", - CGIPATH,user,dom,mytime,k,k); - } - printf ("
"); - for (k = 0; k < 10; k++) { - printh ("%d\n", - CGIPATH,user,dom,mytime,k,k); - } - printf (""); - printf ("\n"); + print_user_index ("showusers", colspan, user, dom, mytime); printf ("", get_color_text("000")); - printf ("", colspan); - printf ("

"); - printf ("
", CGIPATH); - printh ("", user); - printh ("", dom); - printf ("", (unsigned int) mytime); - printh (" ", SearchUser); - printf ("", html_text[204]); - printf ("
"); - printf ("
"); - printf ("
"); - printf ("\n"); -#endif - - printf ("", get_color_text("000")); printf ("", colspan); #ifdef USER_INDEX printf (""); Index: BUGS =================================================================== --- BUGS (revision 144) +++ BUGS (working copy) @@ -1,4 +1,4 @@ -* QmailAdmin rewrites a users .qmail file whenver changes are made on the +* QmailAdmin rewrites a user's .qmail file whenever changes are made on the modify user screen. The code currently doesn't handle .qmail files that - were hand modified or generated elsewhere (e.g., TMDA). + were hand-modified or generated elsewhere (e.g. by TMDA). Index: qmailadmin.h =================================================================== --- qmailadmin.h (revision 144) +++ qmailadmin.h (working copy) @@ -1,5 +1,5 @@ /* - * $Id: qmailadmin.h,v 1.1.1.1.2.5 2005/01/23 17:35:12 tomcollins Exp $ + * $Id: qmailadmin.h,v 1.1.1.1.2.6 2006/02/05 17:07:27 tomcollins Exp $ * Copyright (C) 1999-2004 Inter7 Internet Technologies, Inc. * * This program is free software; you can redistribute it and/or modify @@ -36,6 +36,9 @@ #define MAX_FILE_NAME 100 +#ifdef MAX_BUFF +#undef MAX_BUFF +#endif #define MAX_BUFF 500 #define MAX_BIG_BUFF 5000 Index: util.h =================================================================== --- util.h (revision 144) +++ util.h (working copy) @@ -1,5 +1,5 @@ /* - * $Id: util.h,v 1.1.2.1 2004/11/20 01:10:41 tomcollins Exp $ + * $Id: util.h,v 1.1.2.2 2006/02/05 16:49:08 tomcollins Exp $ */ int check_local_user( char *user ); @@ -27,3 +27,5 @@ int quota_to_bytes(char[], char*); //jhopper prototype int quota_to_megabytes(char[], char*); //jhopper prototype + +void print_user_index (char *action, int colspan, char *user, char *dom, time_t mytime); Index: TRANSLATORS =================================================================== --- TRANSLATORS (revision 144) +++ TRANSLATORS (working copy) @@ -3,6 +3,7 @@ Recent Translators: bg Bulgarian Julian Neytchev +bg Bulgarian Peter Pentchev cs Czech Martin Dimov da Danish Martin Dalum da Danish Jesper Have Index: lang/bg =================================================================== --- lang/bg (revision 144) +++ lang/bg (working copy) @@ -106,7 +106,7 @@ 138 Въведи парола 139 Паролата на този имейл акаунт беше променена успешно 140 Неуспешен опит да се смени паролата. -141 Потребителя беше изтрит успешно +141 Потребителят беше изтрит успешно 142 Липса на ауторизация 143 нарушение на правата за достъп до директорията 144 нарушение на правата за достъп до файла @@ -119,37 +119,37 @@ 151 Линията беше изтрита успешно 152 Препратката беше добавена успешно 153 Несъществуващо потребителско име -154 Псевдонима е добавен успешно +154 Псевдонимът е добавен успешно 155 Невалидно действие -156 Достигнат е максималния брой псевдоними -157 Достигнат е максималния брой препратки -158 Достигнат е максималния брой мейл роботи +156 Достигнат е максималният брой псевдоними +157 Достигнат е максималният брой препратки +158 Достигнат е максималният брой мейл роботи 159 Невалиден DotQmail Type: adddotqmail() 160 Невалиден псевдоним -161 Неуспешен опит за добавяне на препратка. имейл акаунта трябва да бъде съшествуващ +161 Неуспешен опит за добавяне на препратка. Имейл акаунтът трябва да съществува. 162 Невалидно име на имейл акаунта 163 Невалидно име на препратката 164 Невалиден псевдоним Type : adddotqmailnow() 165 Грешка при добавянето на псевдоним на имейл акаунта -166 Псевдонима на имейл акаунта беше добавен успешно +166 Псевдонимът на имейл акаунта беше добавен успешно 167 Грешка при опита за изтриване на псевдоним/препратка на имейл акаунт. -168 Псевдонима/препратката на имейл акаунта беше изтрита успешно. +168 Псевдонимът/препратката на имейл акаунта беше изтрит успешно. 169 Грешка при опита за изтриване на препратка за имейл акаунт 170 Препратката на имейл акаунта беше изтрита успешно 171 Грешка: невъзможно е да сменя директорията 172 Само един системен постмастер може да бъде логнат в даден момент. Някой друг е влязъл като системен постмастер в момента. -173 Моля влзете отново, логина Ви е изтекъл +173 Моля влезте отново, логинът Ви е изтекъл 174 Невалидно име на мейл робот 175 Името не е свободно 176 Моля въведете име за мейл робота 177 Невалиден имейл адрес на притежателя 178 Моля въведете Относно 179 Моля въведете нещо за изпращане -180 Мейл робота е добавен успешно +180 Мейл роботът е добавен успешно 181 Не мога да изтрия мейл робота -182 Мейл робота е изтрит успешно -183 Мейл робота е редактиран успешно -184 Достигнат е максималния брой мейлинг листи +182 Мейл роботът е изтрит успешно +183 Мейл роботът е редактиран успешно +184 Достигнат е максималният брой мейлинг листи 185 Не мога да изтрия файла 186 Мейлинг листа е изтрит успешно 187 Мейлинг листа е добавен успешно @@ -158,13 +158,13 @@ 190 Край на списъка 191 Списък на модераторски имейл адреси в мейлинг листа 192 Върни се в главното меню -193 добавен в мйлинг листа -194 Имейл адреса е добавен като модератор в мейлинг листа +193 добавен в мейлинг листа +194 Имейл адресът е добавен като модератор в мейлинг листа 195 Изтрий абонат от мейлинг листа 196 Изтрий модератор от мейлинг листа 197 Изтрит като модератор на мейлинг лист 198 Невалидно потребителско име -199 Достигнат е максималния брой имейл акаунти +199 Достигнат е максималният брой имейл акаунти 200 Паролите са различни, опитай отново 201 Паметта е изчерпана 202 Където параметрите са следните: @@ -188,10 +188,10 @@ 220 Адрес на модератора 221 Списък на абонатите 222 Адрес на абоната -223 Потребителя не е намерен +223 Потребителят не е намерен 224 (кликнете за редактиране) 225 Редактирай мейлинг лист -226 Мейлинг листа беше редактиран успешно +226 Мейлинг листът беше редактиран успешно 227 Обзор 228 Общо модератори: 229 неограничено @@ -200,12 +200,12 @@ 232 Няма псевдоними/препратки за показване 233 Няма мейл роботи за показване 234 Моля въведете парола -235 Установения за прихващач имейл изтрит +235 Установеният за прихващач имейл изтрит 236 Прихващач: изтрит 237 Добави
абонат на обзора 238 Изтрий
абонат на обзора 239 Покажи
абонатите на обзора -240 Имейл адреса е добавен към мейлинг листа като абонат на обзора +240 Имейл адресът е добавен към мейлинг листа като абонат на обзора 241 Добави абоната на обзора към мейлинг листа 242 Изтрит от обзорния мейлинг лист 243 Изтрий обзорния абонат от мейлинг листа @@ -233,13 +233,13 @@ 265 Само абонатите могат да публикуват съобщения директно, всички други ще бъдат препращани към модераторите за одобрение. 266 Само модераторите могат да публикуват съобщения, всички други ще бъдат връщани. 267 Само модераторите могат да публикуват съобщения директно, всички други ще бъдат препращани към модераторите за одобрение. -268 Лист опции +268 Настройки на листа 269 Добави следния префикс към заглавните хедъри [%s]. 270 Добави трейлър след всяко съобщение 271 Установи версията на обзорния списък. 272 Повикан %s-обзор. 273 Изпратена служебна заявка до %s-заявка. -274 Освен %s-абонирай се, %s-откажи се от абонамент и т.н. потребителите могат да изпращат команди и до %s-заявка. +274 Освен %s-subscribe (абонирай се), %s-unsubscribe (откажи се от абонамент) и т.н., потребителите могат да изпращат команди и до %s-request (заявка). 275 Дистанционна администрация 276 Разреши на модераторите да извършват дистанционна администрация 277 Промени този списък - направи го личен @@ -253,11 +253,11 @@ 285 Изисквай потвърждение чрез изпращане на отговор на всяко едно от получените на абонаментния адрес съобщения 286 Изисквай одобрение от модератор. 287 Заявки за прекратяване на абонамента за листа: -288 Внимание: има опасност някой да абонира потребители без тяхното съгласие ако не изисквате потвърждение от изпращача. +288 Внимание: има опасност някой да абонира потребители без тяхното съгласие, ако не изисквате потвърждение от изпращача. 289 Архивирани съобщения 290 Архивирани съобщения от листите 291 Уеб достъп до съдържанието на архива чрез ezmlm-cgi. -292 Достъпа до архива е +292 Достъпът до архива е 293 разрешен за всекиго 294 ограничен само за абонати 295 ограничен само за модератори @@ -273,11 +273,13 @@ 305 Направление 306 Препратки до 307 Невалиден лимит -308 Лимита е неограничен -309 Лимита е %s байта +308 Лимитът е неограничен +309 Лимитът е %s байта 310 Отговорите трябва да отиват при 311 оригиналния изпращач 312 целия лист 313 следния адрес 314 Получен е невалиден лимит 315 Потребителят е изтрит. Невъзможно е да назнача препратка до '%s'. +316 Смени парола +317 Не можете да изтриете акаунта postmaster. Index: auth.c =================================================================== --- auth.c (revision 144) +++ auth.c (working copy) @@ -1,5 +1,5 @@ /* - * $Id: auth.c,v 1.3.2.5 2005/01/23 17:35:11 tomcollins Exp $ + * $Id: auth.c,v 1.3.2.6 2006/02/09 05:09:53 tomcollins Exp $ * Copyright (C) 1999-2004 Inter7 Internet Technologies, Inc. * * This program is free software; you can redistribute it and/or modify @@ -26,9 +26,9 @@ #include #include #include "config.h" +#include #include "qmailadmin.h" #include "qmailadminx.h" -#include #include #include "cgi.h" #include "show.h" Index: configure.in =================================================================== --- configure.in (revision 144) +++ configure.in (working copy) @@ -6,7 +6,7 @@ AC_CANONICAL_HOST QA_PACKAGE="qmailadmin" -QA_VERSION="1.2.9" +QA_VERSION="1.2.10" AC_DEFINE_UNQUOTED(QA_PACKAGE,"$QA_PACKAGE","") AC_DEFINE_UNQUOTED(QA_VERSION,"$QA_VERSION","") Index: ChangeLog =================================================================== --- ChangeLog (revision 144) +++ ChangeLog (working copy) @@ -1,6 +1,24 @@ Numbers in square brackets ([]) indicate tracker item on SourceForge with patch or information related to the entry. +1.2.10 - unreleased + + Peter Pentchev + - Update Bulgarian translation. [1421770] + - qmailadmin.c: Fix potential buffer overflow. + - alias.c: missing semicolon when using VALIAS, eliminate unused + variable warnings when using VALIAS. + + Tom Collins + - mailinglist.c: Fix problem with enable/disable ezmlm-cgi access + to archives. + - alias.c: Add index and user search to the aliases page. When + deleting an alias, return to the page that alias would have been + on. This feature was sponsored by Marko Lerota. [894823, 877895] + - qmailadmin.h: undef MAX_BUFF if previously defined (too small) by + vpopmail.h. Include vpopmail.h before qmailadmin.h so we can + always redefine MAX_BUFF. + 1.2.9 - released 1-Sep-05 Luis Gonzalo Constantini Von Rickel Index: mailinglist.c =================================================================== --- mailinglist.c (revision 144) +++ mailinglist.c (working copy) @@ -1,5 +1,5 @@ /* - * $Id: mailinglist.c,v 1.5.2.7 2005/02/16 16:10:37 tomcollins Exp $ + * $Id: mailinglist.c,v 1.5.2.8 2005/10/23 18:52:34 tomcollins Exp $ * Copyright (C) 1999-2004 Inter7 Internet Technologies, Inc. * * This program is free software; you can redistribute it and/or modify @@ -1307,7 +1307,7 @@ printf ("
\n"); /* note that if user doesn't have ezmlm-cgi installed, it might be a good idea to default to having option i off. */ - build_option_str ("CHECKBOX", "opt15", "i", html_text[291]); + build_option_str ("CHECKBOX", "opt16", "i", html_text[291]); printf ("

\n"); /***********************/ Index: command.c =================================================================== --- command.c (revision 144) +++ command.c (working copy) @@ -1,5 +1,5 @@ /* - * $Id: command.c,v 1.2.2.6 2005/01/23 17:35:11 tomcollins Exp $ + * $Id: command.c,v 1.2.2.7 2006/02/05 16:49:08 tomcollins Exp $ * Copyright (C) 1999-2004 Inter7 Internet Technologies, Inc. * * This program is free software; you can redistribute it and/or modify @@ -83,6 +83,7 @@ } else if (strcmp(TmpBuf2, "showforwards") == 0) { GetValue(TmpCGI, Pagenumber, "page=", sizeof(Pagenumber)); + GetValue(TmpCGI, SearchUser, "searchuser=", sizeof(SearchUser)); show_forwards(Username, Domain, Mytime); } else if (strcmp(TmpBuf2, "showmailinglists") == 0) { Index: alias.c =================================================================== --- alias.c (revision 144) +++ alias.c (working copy) @@ -1,5 +1,5 @@ /* - * $Id: alias.c,v 1.4.2.12 2005/01/23 17:35:11 tomcollins Exp $ + * $Id: alias.c,v 1.4.2.14 2006/02/09 05:02:55 tomcollins Exp $ * Copyright (C) 1999-2004 Inter7 Internet Technologies, Inc. * * This program is free software; you can redistribute it and/or modify @@ -103,22 +103,23 @@ void show_dotqmail_lines(char *user, char *dom, time_t mytime) { int moreusers=0; - DIR *mydir; - struct dirent *mydirent; - FILE *fs; char alias_user[MAX_BUFF]; char alias_name[MAX_FILE_NAME]; char *alias_domain; char *alias_name_from_command; - int i,j,stop,k,startnumber; - int m,n; + int stop,k,startnumber; int page; - struct dirent **namelist; char this_alias[MAX_FILE_NAME]; #ifdef VALIAS char *alias_line; +#else + DIR *mydir; + struct dirent *mydirent; + FILE *fs; + int i,j,m,n; + struct dirent **namelist; + struct stat sbuf; #endif - struct stat sbuf; if ( AdminType!=DOMAIN_ADMIN ) { snprintf(StatusMessage, sizeof(StatusMessage), "%s", html_text[142]); @@ -130,9 +131,28 @@ if (page == 0) page = 1; startnumber = MAXALIASESPERPAGE * (page - 1); - k=0; + k = 0; + +#ifdef VALIAS + if (*SearchUser) { + startnumber = 0; + alias_line = valias_select_all(alias_name, Domain); + while (alias_line != NULL) { + strcpy (this_alias, alias_name); + alias_name_from_command = dotqmail_alias_command(alias_line); + if ( alias_name_from_command != NULL || *alias_line == '#') { + if (strcasecmp (SearchUser, alias_name) <= 0) break; + startnumber++; + } + /* burn through remaining lines for this alias, if necessary */ + while ((alias_line != NULL) && (strcmp (this_alias, alias_name) == 0)) { + alias_line = valias_select_all_next(alias_name); + } + } + page = startnumber / MAXALIASESPERPAGE + 1; + sprintf (Pagenumber, "%d", page); + } -#ifdef VALIAS alias_line = valias_select_all(alias_name, Domain); while (alias_line != NULL) { strcpy (this_alias, alias_name); @@ -174,6 +194,7 @@ } } #else + /* We can't use valias code here, because it doesn't return a sorted list of aliases. If we update vpopmail's vpalias.c to do that, then qmailadmin could use the single set of valias_ functions above. @@ -216,15 +237,32 @@ if ( alias_name_from_command != NULL || *TmpBuf2 == '#') { k++; - if ( k >MAXALIASESPERPAGE + startnumber) { - moreusers=1; - fclose(fs); - break; + if (*SearchUser) { + if (strcasecmp (SearchUser, alias_name) <= 0) { + if (startnumber == 0) { + startnumber = k; + page = (k/MAXALIASESPERPAGE)+1; + } + if (k >= MAXALIASESPERPAGE + startnumber) { + moreusers = 1; + fclose (fs); + break; + } + } else { + fclose (fs); + continue; + } + } else { + if ( k >MAXALIASESPERPAGE + startnumber) { + moreusers=1; + fclose(fs); + break; + } + if (k <= startnumber) { + fclose (fs); + continue; + } } - if (k <= startnumber) { - fclose (fs); - continue; - } if (*TmpBuf2 == '#') { if (fgets(TmpBuf2, sizeof(TmpBuf2), fs) == NULL) { @@ -252,6 +290,10 @@ /* free memory allocated by bkscandir */ for (m=0; m"); printf ("[ "); - if(page > 1 ) { + /* When searching for a user on systems using .qmail files, we make things + * easy by starting the page with the first matching address. As a result, + * the previous page will be 'page' and not 'page-1'. Refresh is accomplished + * by repeating the search. + */ + if (*SearchUser && ((startnumber % MAXALIASESPERPAGE) != 1)) { printh ("%s", - CGIPATH,user,dom,mytime,page - 1, html_text[135]); + CGIPATH, user, dom, mytime, page, html_text[135]); printf (" | "); + printh ("%s", + CGIPATH, user, dom, mytime, SearchUser, html_text[136]); + } else { + if (page > 1) { + printh ("%s", + CGIPATH, user, dom, mytime, page - 1, html_text[135]); + printf (" | "); + } + printh ("%s", + CGIPATH, user, dom, mytime, page, html_text[136]); } - printh ("%s", - CGIPATH,user,dom,mytime,page, html_text[136]); - printf (" | "); if (moreusers) { + printf (" | "); printh ("%s", - CGIPATH,user,dom,mytime,page+1, html_text[137]); - printf (" ]"); + CGIPATH, user, dom, mytime, page + 1, html_text[137]); } + printf (" ]"); printf (""); } } @@ -638,6 +696,7 @@ if(CurForwards == 0 && CurBlackholes == 0) { show_menu(Username, Domain, Mytime); } else { + snprintf (SearchUser, sizeof(SearchUser), "%s", ActionUser); show_forwards(Username,Domain,Mytime); } } Index: aclocal.m4 =================================================================== --- aclocal.m4 (revision 144) +++ aclocal.m4 (working copy) @@ -834,7 +834,16 @@ [AC_FOREACH([_AM_File], [$1], [_AM_CONFIG_HEADER(_AM_File, [$2], [$3])]) ])# AM_CONFIG_HEADER -#serial 1 +# isc-posix.m4 serial 2 (gettext-0.11.2) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# This file is not needed with autoconf-2.53 and newer. Remove it in 2005. + # This test replaces the one in autoconf. # Currently this macro should have the same name as the autoconf macro # because gettext's gettext.m4 (distributed in the automake package)