From 6f4a176845914aff70ace06bfefa0a6893afa34e Mon Sep 17 00:00:00 2001 From: Ben Klang Date: Wed, 16 Sep 2009 12:16:37 -0400 Subject: [PATCH] Import Vilma from CVS --- vilma/LICENSE | 49 ++ vilma/README | 65 ++ vilma/config/.cvsignore | 2 + vilma/config/conf.xml | 179 ++++++ vilma/config/hooks.php.dist | 103 +++ vilma/config/prefs.php.dist | 20 + vilma/docs/CHANGES | 16 + vilma/docs/CREDITS | 26 + vilma/docs/INSTALL | 196 ++++++ vilma/docs/TODO | 17 + vilma/domains/delete.php | 57 ++ vilma/domains/edit.php | 53 ++ vilma/domains/index.php | 51 ++ vilma/index.php | 24 + vilma/lib/Driver.php | 423 +++++++++++++ vilma/lib/Driver/qmailldap.php | 1044 +++++++++++++++++++++++++++++++ vilma/lib/Driver/sql.php | 640 +++++++++++++++++++ vilma/lib/Forms/DeleteDomainForm.php | 31 + vilma/lib/Forms/EditDomainForm.php | 43 ++ vilma/lib/Forms/EditUserForm.php | 72 +++ vilma/lib/MailboxDriver.php | 110 ++++ vilma/lib/MailboxDriver/hooks.php | 49 ++ vilma/lib/MailboxDriver/imap.php | 81 +++ vilma/lib/MailboxDriver/maildrop.php | 77 +++ vilma/lib/MailboxDriver/null.php | 81 +++ vilma/lib/Vilma.php | 192 ++++++ vilma/lib/api.php | 68 ++ vilma/lib/base.php | 58 ++ vilma/lib/tests/driver.phpt | 155 +++++ vilma/lib/version.php | 1 + vilma/locale/de_DE/LC_MESSAGES/vilma.mo | Bin 0 -> 164726 bytes vilma/locale/es_ES/LC_MESSAGES/vilma.mo | Bin 0 -> 157725 bytes vilma/locale/it_IT/LC_MESSAGES/vilma.mo | Bin 0 -> 150038 bytes vilma/locale/lt_LT/LC_MESSAGES/vilma.mo | Bin 0 -> 146895 bytes vilma/po/.cvsignore | 1 + vilma/po/README | 1 + vilma/po/de_DE.po | 500 +++++++++++++++ vilma/po/es_ES.po | 501 +++++++++++++++ vilma/po/it_IT.po | 367 +++++++++++ vilma/po/lt_LT.po | 484 ++++++++++++++ vilma/po/vilma.pot | 476 ++++++++++++++ vilma/scripts/.htaccess | 1 + vilma/scripts/create_mailboxes.php | 53 ++ vilma/scripts/sql/vilma.sql | 41 ++ vilma/templates/common-header.inc | 29 + vilma/templates/domains/index.html | 37 ++ vilma/templates/main/main.html | 5 + vilma/templates/users/index.html | 62 ++ vilma/templates/virtuals/index.html | 38 ++ vilma/test.php | 50 ++ vilma/themes/graphics/display.png | Bin 0 -> 178 bytes vilma/themes/graphics/domain.png | Bin 0 -> 882 bytes vilma/themes/graphics/favicon.ico | Bin 0 -> 1150 bytes vilma/themes/graphics/sort.png | Bin 0 -> 168 bytes vilma/themes/graphics/vilma.png | Bin 0 -> 265 bytes vilma/users/delete.php | 165 +++++ vilma/users/edit.php | 113 ++++ vilma/users/index.php | 111 ++++ vilma/virtuals/delete.php | 69 ++ vilma/virtuals/edit.php | 96 +++ vilma/virtuals/index.php | 65 ++ 61 files changed, 7248 insertions(+) create mode 100644 vilma/LICENSE create mode 100644 vilma/README create mode 100644 vilma/config/.cvsignore create mode 100644 vilma/config/conf.xml create mode 100644 vilma/config/hooks.php.dist create mode 100644 vilma/config/prefs.php.dist create mode 100644 vilma/docs/CHANGES create mode 100644 vilma/docs/CREDITS create mode 100644 vilma/docs/INSTALL create mode 100644 vilma/docs/TODO create mode 100644 vilma/domains/delete.php create mode 100644 vilma/domains/edit.php create mode 100644 vilma/domains/index.php create mode 100644 vilma/index.php create mode 100644 vilma/lib/Driver.php create mode 100644 vilma/lib/Driver/qmailldap.php create mode 100644 vilma/lib/Driver/sql.php create mode 100644 vilma/lib/Forms/DeleteDomainForm.php create mode 100644 vilma/lib/Forms/EditDomainForm.php create mode 100644 vilma/lib/Forms/EditUserForm.php create mode 100644 vilma/lib/MailboxDriver.php create mode 100644 vilma/lib/MailboxDriver/hooks.php create mode 100644 vilma/lib/MailboxDriver/imap.php create mode 100644 vilma/lib/MailboxDriver/maildrop.php create mode 100644 vilma/lib/MailboxDriver/null.php create mode 100644 vilma/lib/Vilma.php create mode 100644 vilma/lib/api.php create mode 100644 vilma/lib/base.php create mode 100644 vilma/lib/tests/driver.phpt create mode 100644 vilma/lib/version.php create mode 100644 vilma/locale/de_DE/LC_MESSAGES/vilma.mo create mode 100644 vilma/locale/es_ES/LC_MESSAGES/vilma.mo create mode 100644 vilma/locale/it_IT/LC_MESSAGES/vilma.mo create mode 100644 vilma/locale/lt_LT/LC_MESSAGES/vilma.mo create mode 100644 vilma/po/.cvsignore create mode 100644 vilma/po/README create mode 100644 vilma/po/de_DE.po create mode 100644 vilma/po/es_ES.po create mode 100644 vilma/po/it_IT.po create mode 100644 vilma/po/lt_LT.po create mode 100644 vilma/po/vilma.pot create mode 100644 vilma/scripts/.htaccess create mode 100644 vilma/scripts/create_mailboxes.php create mode 100644 vilma/scripts/sql/vilma.sql create mode 100644 vilma/templates/common-header.inc create mode 100644 vilma/templates/domains/index.html create mode 100644 vilma/templates/main/main.html create mode 100644 vilma/templates/users/index.html create mode 100644 vilma/templates/virtuals/index.html create mode 100644 vilma/test.php create mode 100644 vilma/themes/graphics/display.png create mode 100644 vilma/themes/graphics/domain.png create mode 100644 vilma/themes/graphics/favicon.ico create mode 100644 vilma/themes/graphics/sort.png create mode 100644 vilma/themes/graphics/vilma.png create mode 100644 vilma/users/delete.php create mode 100644 vilma/users/edit.php create mode 100644 vilma/users/index.php create mode 100644 vilma/virtuals/delete.php create mode 100644 vilma/virtuals/edit.php create mode 100644 vilma/virtuals/index.php diff --git a/vilma/LICENSE b/vilma/LICENSE new file mode 100644 index 000000000..ae5539eb4 --- /dev/null +++ b/vilma/LICENSE @@ -0,0 +1,49 @@ +Version 1.0 + +Copyright 2001-2009 The Horde Project (http://www.horde.org/) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. The end-user documentation included with the redistribution, if +any, must include the following acknowledgment: + + "This product includes software developed by the Horde Project + (http://www.horde.org/)." + +Alternately, this acknowledgment may appear in the software itself, if +and wherever such third-party acknowledgments normally appear. + +4. The names "Horde", "The Horde Project", and "Vilma" must not be +used to endorse or promote products derived from this software without +prior written permission. For written permission, please contact +core@horde.org. + +5. Products derived from this software may not be called "Horde" or +"Vilma", nor may "Horde" or "Vilma" appear in their name, without +prior written permission of the Horde Project. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE HORDE PROJECT OR ITS CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This software consists of voluntary contributions made by many +individuals on behalf of the Horde Project. For more information on +the Horde Project, please see . diff --git a/vilma/README b/vilma/README new file mode 100644 index 000000000..d1b48826f --- /dev/null +++ b/vilma/README @@ -0,0 +1,65 @@ +What is Vilma? +-------------- + +Vilma is a tool for administrators who need to handle various aspects +of domain administration. + + +Obtaining Vilma +--------------- + +Further information on Vilma and the latest version can be obtained at: + + http://www.horde.org/vilma/ + + +Documentation +------------- + +The following documentation is available in the Vilma distribution: + +README - This file +LICENSE - Copyright and license information +docs/CHANGES - List of changes by release +docs/CREDITS - Who developed this +docs/INSTALL - Installation instructions + + +Installation +------------ + +Instructions for installing Vilma can be found in the file INSTALL in the +docs/ directory of the Vilma distribution. + + +Assistance +---------- + +If you encounter problems with Vilma, help is available! + +The Horde Frequently Asked Questions List (FAQ), available on the Web at: + + http://www.horde.org/faq/ + +The Horde Project runs a number of mailing lists, for individual applications +and for issues relating to the project as a whole. Information, archives, and +subscription information can be found at: + + http://www.horde.org/mail/ + +Lastly, Horde developers, contributors and users also make occasional +appearances on IRC, on the channel #horde on the Freenode Network +(irc.freenode.net). + + +Licensing +--------- + +For licensing and copyright information, please see the file LICENSE in the +Vilma distribution. + +Thanks, + +The Vilma team + +$Horde: vilma/README,v 1.3 2007/08/05 22:37:11 mp Exp $ diff --git a/vilma/config/.cvsignore b/vilma/config/.cvsignore new file mode 100644 index 000000000..de7b27844 --- /dev/null +++ b/vilma/config/.cvsignore @@ -0,0 +1,2 @@ +conf.php +conf.bak.php diff --git a/vilma/config/conf.xml b/vilma/config/conf.xml new file mode 100644 index 000000000..67674ddd5 --- /dev/null +++ b/vilma/config/conf.xml @@ -0,0 +1,179 @@ + + + + + + + These are the settings for storing all the Vilma data, such as domains, + users within those domains, virtual addresses for users, etc. + + + 0 + 0 + + sql + + + + + + default + + + + + + + + + + + + + + + + default + + + + + + + + + + + + + + + + + + + + default + + + + + + + + + + + + + + + + + + localhost + + + + 3 + 3 + 2 + 3 + + + + objectclass + + + + + + + + + + + + + + + + + + + + Mailbox settings + maildrop + + + 1003 + 1000 + /home/vmail + vmail + true + + + + + + + localhost + 143 + imap + user. + + + + + + + + + + + + + + + + + MTA Settings + maildrop + + + + + + + + + + + + + diff --git a/vilma/config/hooks.php.dist b/vilma/config/hooks.php.dist new file mode 100644 index 000000000..101d2535a --- /dev/null +++ b/vilma/config/hooks.php.dist @@ -0,0 +1,103 @@ + _("Display listings"), + 'label' => _("Display details"), + 'desc' => _("Set default display parameters."), + 'members' => array('addresses_perpage')); + +// listing +$_prefs['addresses_perpage'] = array( + 'value' => 20, + 'locked' => false, + 'shared' => false, + 'type' => 'number', + 'desc' => _("How many domain to display per page.")); diff --git a/vilma/docs/CHANGES b/vilma/docs/CHANGES new file mode 100644 index 000000000..7a56b6512 --- /dev/null +++ b/vilma/docs/CHANGES @@ -0,0 +1,16 @@ +-------- +v0.1-cvs +-------- + +[bkl] Restructure application to have Users, Aliases, Groups and Forwards. +[bkl] Add qmailldap backend support. +[ben] Better support for MS-SQL. +[jan] Allow to use custom table and column names (guilleva@gmail.com, + Request #3244). +[cjh] Use bind variables in SQL driver (selsky@columbia.edu, Request #1795). +[jmf] Downcase user and virtuals. +[jmf] Support for virtuals with external (non-local) e-mail destinations. +[jan] Add Spanish translation (Manuel Perez Ayala ). +[jmf] Add support for creating mailboxes via IMAP protocol. +[jan] Add Lithuanian translation (Vilius ¦umskas ). +[jan] Add German translation. diff --git a/vilma/docs/CREDITS b/vilma/docs/CREDITS new file mode 100644 index 000000000..334ec6fa7 --- /dev/null +++ b/vilma/docs/CREDITS @@ -0,0 +1,26 @@ +======================================= +|| Vilma Version 1.0 Development Team || +======================================== + +=============== +Core Developers +=============== + +Marko Djukic +- Initial authoring. + +Ben Klang +- Rewrite for Aliases and Groups/Forwards + + +============ +Localization +============ + +German Jan Schneider +Italian Marko Djukic +Lithuanian Vilius ¦umskas +Spanish Manuel Perez Ayala + + +$Horde: vilma/docs/CREDITS,v 1.7 2008/03/22 10:43:53 jan Exp $ diff --git a/vilma/docs/INSTALL b/vilma/docs/INSTALL new file mode 100644 index 000000000..3bf7b70a1 --- /dev/null +++ b/vilma/docs/INSTALL @@ -0,0 +1,196 @@ +============================== +|| INSTALLING Vilma 0.1 || +============================== + +* PLEASE SEE IMPORTANT NOTE in the README file about Vilma's status +before you try to install it and are disappointed. + +This document contains instructions for installing the Vilma virtual mail +domain management application. + +For information on the capabilities and features of Vilma, see the +file README in the top-level directory of the Vilma distribution. + + +OBTAINING VILMA +----------------- + +Vilma can be obtained from the Horde website and FTP server, at + + http://www.horde.org/vilma/ + ftp://ftp.horde.org/pub/vilma/ + +Bleeding-edge development versions of Vilma are available via CVS; see +the file docs/HACKING in the Horde distribution for information on +accessing the Horde CVS repository. + + +PREREQUISITES +------------- + +To function properly, Vilma requires the following: + + 1. A working Horde installation. + + Vilma runs within the Horde Application Framework, a set of + common tools for Web applications written in PHP. You must + install Horde before installing Vilma. + + The Horde Framework can be obtained from the Horde website and + FTP server, at + + http://www.horde.org/horde/ + ftp://ftp.horde.org/pub/horde/ + + Many of Vilma's prerequisites are also Horde prerequisites. + Be sure to have completed all of the steps in the INSTALL + file for the Horde Framework before installing Vilma. + + 2. SQL support in PHP. + + Vilma store its data in an SQL database. Build PHP with whichever + SQL driver you require; see the Horde INSTALL file for details. + + +INSTALLING VILMA +------------------ + +Vilma is written in PHP, and must be installed in a web-accessible +directory. The precise location of this directory will differ from +system to system. Conventionally, Vilma is installed directly underneath +Horde in the webserver's document tree. + +Since Vilma is written in PHP, there is no compilation necessary; +simply expand the distribution where you want it to reside and rename +the root directory of the distribution to whatever you wish to appear +in the URL. For example, with the Apache webserver's default document +root of '/usr/local/apache/htdocs', you would type: + + cd /usr/local/apache/htdocs/horde + tar zxvf /path/to/vilma-0.1.tar.gz + mv vilma-0.1 vilma + +and would then find Vilma at the URL + + http://your-server/horde/vilma/ + + +CONFIGURING VILMA +------------------- + +1. Configuring Horde for Vilma + + a. Register the application + + In horde/config/registry.php, find the applications['vilma'] stanza. + The default settings here should be okay, but you can change + them if desired. If you have changed the location of Vilma relative + to Horde, either in the URL, in the filesystem or both, you must + update the 'fileroot' and 'webroot' settings to their correct + values. + +2. Creating the database table + + The specific steps to create the Vilma database table depend + on which database you've chosen to use. + + First, look in scripts/drivers/ to see if a script already + exists for your database type. If so, you should be + able to simply execute that script as superuser in your + database. (Note that executing the script as the "horde" user will + probably fail when granting privileges.) + + If such a script does not exist, you'll need to build your own, using + the file vilma.sql as a starting point. If you need + assistance in creating databases, you may wish to let us know on + the Vilma mailing list. + +3. Configuring Vilma. + + To configure Vilma, change to the config/ directory of the + installed distribution, and make copies of all of the configuration + "dist" files without the "dist" suffix: + + cd config/ + for foo in *.dist; do cp $foo `basename $foo .dist`; done + + Documentation on the format of those files can be found in each + file. With the exception of the conf.* files (see below), + the other files in config/ need only be modified if you wish + to customize Vilma's appearance or behavior, as the defaults will + be correct for most sites. + + You must login to Horde as a Horde Administrator to finish the + configuring of Vilma. Use the Horde "Administration" menu item to get + to the Administration page, and then click on the "Configuration" + icon to get the Configuration page. Select "Tasks" from the selection + list of applications, and click on the "Configure" button. Fill in or + change any configuration values as needed. When done click on "Generate + Tasks Configuration" to generate the conf.php file. If your web server + doesn't have write permissions to the Vilma configuration directory or + file, it will not be able to write the file. In this case, cut and + paste the returned configuration information into the file + vilma/config/conf.php. + + Note for international users: Vilma uses GNU gettext to provide local + translations of text displayed by applications; the translations are + found in the po/ directory. If a translation is not yet available + for your locale (and you wish to create one), or if you're having + trouble using a provided translation, please see the horde/docs/TRANSLATIONS + file for instructions. + +4. Testing Vilma + + Use Vilma to create, modify, and delete forms. Test at + least the following: + + - Creating a form + - Modifying a form + - Viewing and submitting a form + - Deleting a form + + +SAMPLE USAGE +------------ + +Vilma can be embedded internally within Horde in any application which +supports the Horde Blocks API. + +Otherwise Vilma can be called from any web page with the following simple +php code: + + . '/display.php'; + ?> + + +OBTAINING SUPPORT +----------------- + +If you encounter problems with Vilma, help is available! + +The Horde Frequently Asked Questions List (FAQ), available on the Web +at + + http://www.horde.org/faq/ + +The Horde Project runs a number of mailing lists, for individual +applications and for issues relating to the project as a whole. +Information, archives, and subscription information can be found at + + http://www.horde.org/mail/ + +Lastly, Horde developers, contributors and users may also be found on IRC, +on the channel #horde on the Freenode Network (irc.freenode.net). + +Please keep in mind that Vilma is free software written by volunteers. +For information on reasonable support expectations, please read + + http://www.horde.org/support.php + +Thanks for using Vilma! + +The Vilma team + +$Horde: vilma/docs/INSTALL,v 1.6 2007/08/30 05:10:06 chuck Exp $ diff --git a/vilma/docs/TODO b/vilma/docs/TODO new file mode 100644 index 000000000..c36707385 --- /dev/null +++ b/vilma/docs/TODO @@ -0,0 +1,17 @@ +=========================== +Vilma Development TODO List +=========================== + +* Implement an audit trail so that we know when and by whom accounts were + created, deleted, modified, etc. + +* Integrate with Beatnik to allow DNS zone and MX records to be created upon + domain creation + +* Abstract domains driver from accounts driver + +* Create Beatnik-integrated domains driver + +* Throw proper error if MySQL module not installed in PHP + +$Horde: vilma/docs/TODO,v 1.7 2007/08/06 00:08:29 mp Exp $ diff --git a/vilma/domains/delete.php b/vilma/domains/delete.php new file mode 100644 index 000000000..b73bfe579 --- /dev/null +++ b/vilma/domains/delete.php @@ -0,0 +1,57 @@ + + */ + +@define('VILMA_BASE', dirname(__FILE__) . '/..'); +require_once VILMA_BASE . '/lib/base.php'; +require_once 'Horde/Form.php'; +require_once VILMA_BASE . '/lib/Forms/DeleteDomainForm.php'; + +/* Only admin should be using this. */ +if (!Vilma::hasPermission($domain)) { + Horde::authenticationFailureRedirect(); +} + +$vars = Horde_Variables::getDefaultVariables(); +$form = new DeleteDomainForm($vars); + +if ($vars->get('submitbutton') == _("Delete")) { + if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $delete = $vilma_driver->deleteDomain($info['domain_id']); + if (is_a($delete, 'PEAR_Error')) { + Horde::logMessage($delete, __FILE__, __LINE__, PEAR_LOG_ERR); + $notification->push(sprintf(_("Error deleting domain. %s."), $delete->getMessage()), 'horde.error'); + } else { + $notification->push(_("Domain deleted."), 'horde.success'); + $url = Horde::applicationUrl('domains/index.php', true); + header('Location: ' . $url); + exit; + } + } +} elseif ($vars->get('submitbutton') == _("Do not delete")) { + $notification->push(_("Domain not deleted."), 'horde.message'); + header('Location: ' . Horde::applicationUrl('domains/index.php')); + exit; +} + +/* Render the form. */ +require_once 'Horde/Form/Renderer.php'; +$renderer = new Horde_Form_Renderer(); +$main = Horde_Util::bufferOutput(array($form, 'renderActive'), $renderer, $vars, 'delete.php', 'post'); + +$template->set('main', $main); +$template->set('menu', Vilma::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require VILMA_TEMPLATES . '/common-header.inc'; +echo $template->fetch(VILMA_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/vilma/domains/edit.php b/vilma/domains/edit.php new file mode 100644 index 000000000..492430e8b --- /dev/null +++ b/vilma/domains/edit.php @@ -0,0 +1,53 @@ + + */ + +@define('VILMA_BASE', dirname(__FILE__) . '/..'); +require_once VILMA_BASE . '/lib/base.php'; +require_once 'Horde/Form.php'; +require_once VILMA_BASE . '/lib/Forms/EditDomainForm.php'; + +/* Only admin should be using this. */ +if (!Vilma::hasPermission($domain)) { + Horde::authenticationFailureRedirect(); +} + +//$domain_id = Horde_Util::getFormData('domain_id'); +$vars = Horde_Variables::getDefaultVariables(); +$form = new EditDomainForm($vars); + +if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $info['name'] = Horde_String::lower($info['name']); + $domain_id = $vilma_driver->saveDomain($info); + if (is_a($domain_id, 'PEAR_Error')) { + Horde::logMessage($domain_id, __FILE__, __LINE__, PEAR_LOG_ERR); + $notification->push(sprintf(_("Error saving domain: %s."), $domain_id->getMessage()), 'horde.error'); + } else { + $notification->push(_("Domain saved."), 'horde.success'); + $url = Horde::applicationUrl('domains/index.php', true); + header('Location: ' . $url); + exit; + } +} + +/* Render the form. */ +require_once 'Horde/Form/Renderer.php'; +$renderer = &new Horde_Form_Renderer(); +$main = Horde_Util::bufferOutput(array($form, 'renderActive'), $renderer, $vars, 'edit.php', 'post'); + +$template->set('main', $main); +$template->set('menu', Vilma::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require VILMA_TEMPLATES . '/common-header.inc'; +echo $template->fetch(VILMA_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/vilma/domains/index.php b/vilma/domains/index.php new file mode 100644 index 000000000..5564137c9 --- /dev/null +++ b/vilma/domains/index.php @@ -0,0 +1,51 @@ + + */ + +@define('VILMA_BASE', dirname(__FILE__) . '/..'); +require_once VILMA_BASE . '/lib/base.php'; + +/* Only admin should be using this. */ +if (!Vilma::hasPermission($domain)) { + Horde::authenticationFailureRedirect(); +} + +// Having a current domain doesn't make sense on this page +Vilma::setCurDomain(false); + +$domains = $vilma_driver->getDomains(); +if (is_a($domains, 'PEAR_Error')) { + $notification->push($domains, 'horde.error'); + $domains = array(); +} +foreach ($domains as $id => $domain) { + $url = Horde::applicationUrl('domains/edit.php'); + $domains[$id]['edit_url'] = Horde_Util::addParameter($url, 'domain_id', $domain['domain_id']); + $url = Horde::applicationUrl('domains/delete.php'); + $domains[$id]['del_url'] = Horde_Util::addParameter($url, 'domain_id', $domain['domain_id']); + $url = Horde::applicationUrl('users/index.php'); + $domains[$id]['view_url'] = Horde_Util::addParameter($url, 'domain_id', $domain['domain_id']); +} + +/* Set up the template fields. */ +$template->set('domains', $domains, true); +$template->set('menu', Vilma::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +/* Set up the field list. */ +$images = array('delete' => Horde::img('delete.png', _("Delete Domain"), '', $registry->getImageDir('horde')), + 'edit' => Horde::img('edit.png', _("Edit Domain"), '', $registry->getImageDir('horde'))); +$template->set('images', $images); + +/* Render the page. */ +require VILMA_TEMPLATES . '/common-header.inc'; +echo $template->fetch(VILMA_TEMPLATES . '/domains/index.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/vilma/index.php b/vilma/index.php new file mode 100644 index 000000000..d3e8a868f --- /dev/null +++ b/vilma/index.php @@ -0,0 +1,24 @@ + + */ + +@define('VILMA_BASE', dirname(__FILE__)); +require_once VILMA_BASE . '/lib/base.php'; + +$vilma_configured = (@is_readable(VILMA_BASE . '/config/conf.php') && + @is_readable(VILMA_BASE . '/config/prefs.php')); + +if (!$vilma_configured) { + require VILMA_BASE . '/../lib/Test.php'; + Horde_Test::configFilesMissing('Vilma', VILMA_BASE, array('conf.php', 'prefs.php')); +} + +require VILMA_BASE . '/domains/index.php'; diff --git a/vilma/lib/Driver.php b/vilma/lib/Driver.php new file mode 100644 index 000000000..8868336cf --- /dev/null +++ b/vilma/lib/Driver.php @@ -0,0 +1,423 @@ + + * @package Vilma + */ +class Vilma_Driver { + + /** + * A hash containing any parameters for the current driver. + * + * @var array + */ + var $_params = array(); + + /** + * Constructor + * + * @param array $params Any parameters needed for this driver. + */ + function Vilma_Driver($params) + { + $this->_params = $params; + } + + /** + * Returns all the users sorted by domain and as arrays of each domain. + * + * @return array An array of domains then users for each domain. + */ + function getAllUsers() + { + /* Get all users from backend. */ + $users = &$this->getUsers(); + + /* Determine the domain for each user and plug into array by domain. */ + $users_by_domain = array(); + foreach ($users as $user) { + $domain_name = Vilma::stripDomain($user['user_name']); + $users_by_domain[$domain_name][] = $user; + } + + /* Sort by domain. */ + ksort($users_by_domain); + /* Sort each domain's users by user name. */ + require_once 'Horde/Array.php'; + foreach ($users_by_domain as $key => $val) { + Horde_Array::arraySort($users_by_domain[$key], 'user_name'); + } + + return $users_by_domain; + } + + /** + * Checks if the given domain is below the maximum allowed users. + * + * @param string $domain The domain name to check. + * + * @return boolean True if the domain does not have a maximum limit (0) or + * current number of users is below the maximum number + * allowed. Otherwise false. + */ + function isBelowMaxUsers($domain) + { + /* Get the maximum number of users for this domain. */ + $max_users = $this->getDomainMaxUsers($domain); + if ($max_users == '0') { + /* No maximum. */ + return true; + } + + /* Get the current number of users. */ + $num_users = $this->getDomainNumUsers($domain); + + return ($num_users < $max_users); + } + + /** + * Gets an array of information related to the address passed in. + * This method may be overridden by the backend driver if there is a more + * efficient way to do this than a linear array search + * + * @param string $address Address for which information will be pulled + * @param string $type Address type to request + * One of 'user', 'alias', 'grpfwd' or 'any' + * Defaults to 'any' + * + * @return mixed Array of user information on success, empty array + * if the user does not exist, PEAR_Error on failure + */ + function getAddressInfo($address, $type = 'all') + { + $domain = Vilma::stripDomain($address); + $addresses = $this->getAddresses($domain, $type); + foreach($addresses as $addrinfo) { + if ($addrinfo['id'] == $address) { + return $addrinfo; + } else if ($addrinfo['address'] == $address) { + return $addrinfo; + } + } + return PEAR::raiseError(sprintf(_("No such address %s of type %s found."), $address, $type)); + } + + /** + * Does a series of checks for a given user to determine the status. + * + * @param array $user The user's details in an array as returned by the + * getUser() function. + * + * @return array Either an array of error messages found during the checks + * or an array with a single element stating that the user + * is ready. + */ + function getUserStatus($user) + { + /* Some needed vars. */ + $no_error = true; + $status = array(); + $domain_name = Vilma::stripDomain($user['user_name']); + $user_name = Vilma::stripUser($user['user_name']); + + /* Check if user enabled. */ + if ($user['user_enabled'] !== 'active') { + $no_error = false; + $err_msg = _("User disabled."); + $status[] = Horde::img('alerts/error.png', $err_msg, 'align="middle"', $GLOBALS['registry']->getImageDir('horde')) . ' ' . $err_msg; + } + + /* Check if mailbox exists. */ + $mailboxes = &Vilma::getMailboxDriver(); + if (is_a($mailboxes, 'PEAR_Error')) { + $no_error = false; + $err_msg = $mailboxes->getMessage(); + $status[] = Horde::img('alerts/warning.png', $err_msg, 'align="middle"', $GLOBALS['registry']->getImageDir('horde')) . ' ' . $err_msg; + } + $result = $mailboxes->checkMailbox($user_name, $domain_name); + if (is_a($result, 'PEAR_Error')) { + $no_error = false; + $err_msg = $result->getMessage(); + $status[] = Horde::img('alerts/warning.png', $err_msg, 'align="middle"', $GLOBALS['registry']->getImageDir('horde')) . ' ' . $err_msg; + } + + /* TODO: Quota checking would be nice too. */ + + /* If no errors have been found output a success message for this + * user's status. */ + if ($no_error) { + $msg = _("User ready."); + $status = array(Horde::img('alerts/success.png', $msg, 'align="middle"', $GLOBALS['registry']->getImageDir('horde')) . ' ' . $msg); + } + return $status; + } + + function saveUser(&$info) + { + $create = false; + if (empty($info['user_id'])) { + $create = true; + } + + $result = $this->_saveUser($info); + if (is_a($result, 'PEAR_Error')) { + return $result; + } + + if ($create) { + $mailboxes = &Vilma::getMailboxDriver(); + if (is_a($mailboxes, 'PEAR_Error')) { + $this->_deleteUser($result['user_id']); + return $mailboxes; + } + + $mailbox = $mailboxes->createMailbox(Vilma::stripUser($info['user_name']), Vilma::stripDomain($info['user_name'])); + if (is_a($mailbox, 'PEAR_Error')) { + //echo $mailbox->getMessage() . '
'; + //No 'system_user' parameter specified to maildrop driver. + //$this->_deleteUser($result['user_id']); + return $mailbox; + } + } + + if (isset($GLOBALS['conf']['mta']['auth_update_script']) && + !empty($info['password'])) { + $cmd = sprintf('%s set %s %s 2>&1', + $GLOBALS['conf']['mta']['auth_update_script'], + escapeshellarg($info['user_name']), + escapeshellarg($info['password'])); + $msg = system($cmd, $ec); + if ($msg === false) { + return PEAR::raiseError(_("Error running authentication update script.")); + } + if ($ec != 0) { + if (empty($msg)) { + $msg = _("Unknown error running authentication update script."); + } + return PEAR::raiseError($msg); + } + } + + return true; + } + + function deleteUser($user_id) + { + return PEAR::raiseError(_("Vilma_Driver::deleteUser(): Method Not Implemented.")); + } + + /** + * Saves a given domain with the provided information. + * + * @param array $info Array of details to save the domain + * + * @return mixed True on success, or PEAR_Error on failure. + */ + function saveDomain(&$info) + { + $domain_id = $this->_saveDomain($info); + if (is_a($domain_id, 'PEAR_Error')) { + return $domain_id; + } + + $ret = Horde::callHook('_vilma_hook_savedomain', array($info), 'vilma'); + if (!$ret) { + return PEAR::raiseError(_("Domain added but an error was encountered while calling the configured hook. Contact your administrator for futher assistance.")); + } + + return $domain_id; + } + + /** + * Saves the domain record. + * + * @abstract + * @param array $info Information to save the domain + * + * @return mixed True on success, or PEAR_Error on failure. + */ + function _saveDomain(&$info) + { + return PEAR::raiseError(_("Not implemented.")); + } + + /** + * Deletes a given domain and all the users and virtuals under it. + * + * @param integer $domain_id The id of the domain to delete. + * + * @return mixed True on success, or PEAR_Error on failure. + */ + function deleteDomain($domain_id) + { + $domain_record = $this->getDomain($domain_id); + if (is_a($domain_record, 'PEAR_Error')) { + return $domain_record; + } + + $users = $this->getUsers($domain_record['domain_name']); + if (is_a($users, 'PEAR_Error')) { + return $users; + } + + foreach ($users as $user) { + $this->_deleteUser($user['user_id']); + } + + $ret = $this->_deleteDomain($domain_id); + if (is_a($ret, 'PEAR_Error')) { + return $ret; + } + + $ret = Horde::callHook('_vilma_hook_deletedomain', + array($domain_record['domain_name']), + 'vilma'); + if (!$ret) { + return PEAR::raiseError(_("Error while calling hook to delete domain.")); + } + } + + /** + * Deletes the domain record. + * + * @abstract + * @param integer $domain_id The ID of the domain to delete. + * + * @return mixed True on success, or PEAR_Error on failure. + */ + function _deleteDomain($domain_id) + { + return PEAR::raiseError(_("Not implemented.")); + } + + /** + * Get the user who is the domain admin. + * + * @todo This should be replaced by moving all permissions into Horde + * permissions. + */ + function getDomainAdmin($domain_name) + { + $domain = $this->getDomainByName($domain_name); + if (is_a($domain, 'PEAR_Error')) { + return $domain; + } + return $domain['domain_admin']; + } + + /** + * Returns the configured quota for this domain. + * + * @param string $domain_name The name of the domain for which to + * return the quota. + * + * @return integer The domain's quota. + */ + function getDomainQuota($domain_name) + { + $domain = $this->getDomainByName($domain_name); + if (is_a($domain, 'PEAR_Error')) { + return $domain; + } + return $domain['domain_quota']; + } + + /** + * Returns the maximum number of users allowed for a given domain. + * + * @param string $domain_name The name of the domain for which to + * return the maximum users. + * + * @return integer The maximum number of allowed users or PEAR_Error on + * failure. + */ + function getDomainMaxUsers($domain_name) + { + $domain = $this->getDomainByName($domain_name); + if (is_a($domain, 'PEAR_Error')) { + return $domain; + } + return $domain['max_users']; + } + + /** + * Attempts to return a concrete Vilma_Driver instance based on $driver. + * + * @param string $driver The type of concrete Vilma_Driver subclass to + * return. + * @param array $params A hash containing any additional configuration or + * connection parameters a subclass might need. + * + * @return Vilma_Driver The newly created concrete Vilma_Driver instance, + * or false on error. + */ + function factory($driver = null, $params = null) + { + if (is_null($driver)) { + $driver = $GLOBALS['conf']['storage']['driver']; + } + $driver = basename($driver); + + if (is_null($params)) { + $params = Horde::getDriverConfig('storage', $driver); + } + + include_once dirname(__FILE__) . '/Driver/' . $driver . '.php'; + $class = 'Vilma_Driver_' . $driver; + if (class_exists($class)) { + return new $class($params); + } else { + Horde::fatal(PEAR::raiseError(sprintf(_("No such backend \"%s\" found"), $driver)), __FILE__, __LINE__); + } + } + + /** + * Attempts to return a reference to a concrete Vilma_Driver instance + * based on $driver. + * + * It will only create a new instance if no Vilma_Driver instance with the + * same parameters currently exists. + * + * This should be used if multiple storage sources are required. + * + * This method must be invoked as: $var = &Vilma_Driver::singleton() + * + * @param string $driver The type of concrete Vilma_Driver subclass to + * return. + * @param array $params A hash containing any additional configuration or + * connection parameters a subclass might need. + * + * @return mixed The created concrete Vilma_Driver instance, or false on + * error. + */ + function &singleton($driver = null, $params = null) + { + static $instances; + + if (is_null($driver)) { + $driver = $GLOBALS['conf']['storage']['driver']; + } + + if (is_null($params)) { + $params = Horde::getDriverConfig('storage', $driver); + } + + if (!isset($instances)) { + $instances = array(); + } + + $signature = serialize(array($driver, $params)); + if (!isset($instances[$signature])) { + $instances[$signature] = Vilma_Driver::factory($driver, $params); + } + + return $instances[$signature]; + } + +} diff --git a/vilma/lib/Driver/qmailldap.php b/vilma/lib/Driver/qmailldap.php new file mode 100644 index 000000000..d3486133c --- /dev/null +++ b/vilma/lib/Driver/qmailldap.php @@ -0,0 +1,1044 @@ + + * + * See the enclosed file LICENSE for license information (BSD). If you did + * did not receive this file, see http://cvs.horde.org/co.php/vilma/LICENSE. + * + * $Horde: vilma/lib/Driver/qmailldap.php,v 1.26 2009/07/08 20:16:22 bklang Exp $ + * + * @author Ben Klang + * @author David Cummings + * @package Vilma + */ + +require_once 'Horde/SQL.php'; + +class Vilma_Driver_qmailldap extends Vilma_Driver { + + /** + * @var _LDAP Reference to initialized LDAP driver + */ + var $_ldap; + + /** + * @var _dbparams Configuration parameters for the LDAP driver + */ + var $_ldapparams; + + /** + * @var _db Reference to the initialized database driver + */ + var $_db; + + /** + * @var _dbparams Configuration parameters for the database driver + */ + var $_dbparams; + + function Vilma_Driver_qmailldap($params) + { + parent::Vilma_Driver($params); + $this->_ldapparams = $this->_params['ldap']; + $this->_sqlparams = Horde::getDriverConfig('storage', 'sql'); + $res = $this->_connect(); + if (is_a($res, 'PEAR_Error')) { + return $res; + } + + /* Connect to the backend for tracking domains. */ + $this->_dbinit(); + } + + /** + * Gets the list of domains from the backend. + * + * @return array All the domains and their data in an array. + */ + function getDomains() + { + $sql = 'SELECT domain_id, domain_name, domain_transport, ' . + 'domain_max_users, domain_quota FROM vilma_domains ' . + 'ORDER BY domain_name'; + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getAll($sql, $values, DB_FETCHMODE_ASSOC); + } + + /** + * Gets the specified domain information from the backend. + * + * @param integer $domain_id The id of the domain to fetch. + * + * @return array The domain's information in an array. + */ + function getDomain($domain_id) + { + $sql = 'SELECT domain_id, domain_name, domain_transport, ' . + 'domain_max_users, domain_quota FROM vilma_domains ' . + 'WHERE domain_id=? ORDER BY domain_name'; + $values = array($domain_id); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getRow($sql, $values, DB_FETCHMODE_ASSOC); + } + + /** + * Given a domain name returns the information from the backend. + * + * @param string $name The name of the domain to fetch. + * + * @return array The domain's information in an array. + */ + function getDomainByName($domain_name) + { + $sql = 'SELECT domain_id, domain_name, domain_transport, ' . + 'domain_max_users, domain_quota FROM vilma_domains ' . + 'WHERE domain_name=?'; + $values = array($domain_name); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getRow($sql, $values, DB_FETCHMODE_ASSOC); + } + + /** + * Returns a list of all users, aliases, or groups and forwards for a + * domain. + * + * @param string $domain Domain on which to search. + * @param string $type Only return a specific type. One of 'all', + * 'user', 'alias','forward', or 'group'. + * @param string $key Sort list by this key. + * @param integer $direction Sort direction. + * + * @return array Account information for this domain + */ + function getAddresses($domain, $type = 'all', $key = 'user_name', + $direction = 0) + { + $addresses = array(); + if ($type == 'all' || $type == 'user') { + $users = $this->_getUsers($domain); + $addresses = array_merge($addresses, $users); + } + if ($type == 'all' || $type == 'alias') { + $aliases = $this->_getAliases($domain); + $addresses = array_merge($addresses, $aliases); + } + if (($type == 'all') || ($type == 'forward')) { + $forwards = $this->_getGroupsAndForwards('forward',$domain); + $addresses = array_merge($addresses, $forwards); + } + if (($type == 'all') || ($type == 'group')) { + $groups = $this->_getGroupsAndForwards('group',$domain); + $addresses = array_merge($addresses, $groups); + } + // Sort the results + require_once 'Horde/Array.php'; + Horde_Array::arraySort($addresses, $key, $direction, true); + return $addresses; + } + + function getUser($user_id) { + $user = $this->getUserStatus($user_id); + + if (is_a($user, 'PEAR_Error')) { + return PEAR::raiseError(sprintf(_("Unable to qualify address: %s"), $user->getMessage())); + } + if(isset($user) && is_array($user)) { + return $user; + } else { + return PEAR::raiseError(_("Unable to qualify address.")); + } + } + + /** + * Returns an array of all users, aliases, groups and forwards for this + * domain. + * + * @param string $domain Domain on which to search + * @param optional string $type Only return a specific type + * + * @return array Account information for this domain + */ + function _getUsers($domain = null) + { + //$domain = $domain['domain_name']; + // Cache for multiple calls + static $users = array(); + if (is_null($domain) && isset($users['_all'])) { + return $users['_all']; + } + + if (!is_null($domain) + && isset($users[$domain])) { + return $users[$domain]; + } + + $filter = '(&'; + if (!is_null($domain)) { + $filter .= '(mail=*@' . $domain . ')'; + } else { + $domain = '_all'; + } + + // Make sure we don't get any forwards + $filter .= '(!(mailForwardingAddress=*))'; + + // FIXME: Check/add configured filter instead of objectclasses + foreach ($this->_ldapparams['objectclass'] as $objectclass) { + $filter .= '(objectClass=' . $objectclass . ')'; + } + $filter .= ')'; + + Horde::logMessage($filter, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $res = ldap_search($this->_ldap, $this->_ldapparams['basedn'], $filter); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error in LDAP search: %s"), ldap_error($this->LDAP))); + } + + $res = ldap_get_entries($this->_ldap, $res); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error in LDAP search: %s"), ldap_error($this->LDAP))); + } + + $users[$domain] = array(); + $i = 0; + // Can't use foreach because of the array format returned by LDAP driver + while ($user = @$res[$i]) { + $users[$domain][$i]['id'] = $user['dn']; + $users[$domain][$i]['address'] = $user[$this->_getAttrByField('address')][0]; + $users[$domain][$i]['type'] = 'user'; + $users[$domain][$i]['user_name'] = + $user[$this->_getAttrByField('user_name')][0]; + // We likely don't have read permission on the crypted password so + // avoid any warnings/errors about missing array elements + if (isset($user[$this->_getAttrByField('user_crypt')])) { + $users[$domain][$i]['user_crypt'] = + $user[$this->_getAttrByField('user_crypt')][0]; + } else { + $users[$domain][$i]['user_crypt'] = ''; + } + $users[$domain][$i]['user_full_name'] = + $user[$this->_getAttrByField('user_full_name')][0]; + // Mute assignment errors on the following optional fields + // These may not be present if the mail is only forwarded + $users[$domain][$i]['user_uid'] = + @$user[$this->_getAttrByField('user_uid')][0]; + $users[$domain][$i]['user_gid'] = + @$user[$this->_getAttrByField('user_gid')][0]; + $users[$domain][$i]['user_home_dir'] = + @$user[$this->_getAttrByField('user_home_dir')][0]; + $users[$domain][$i]['user_mail_dir'] = + @$user[$this->_getAttrByField('user_mail_dir')][0]; + $users[$domain][$i]['user_mail_quota_bytes'] = + @$user[$this->_getAttrByField('user_mail_quota_bytes')][0]; + $users[$domain][$i]['user_mail_quota_count'] = + @$user[$this->_getAttrByField('user_mail_quota_count')][0]; + + // If accountStatus is blank it's the same as active + if (!isset($user[$this->_getAttrByField('user_enabled')][0]) || + ($user[$this->_getAttrByField('user_enabled')][0] == 'active')) { + $users[$domain][$i]['user_enabled'] = 'active'; + } else { + // accountStatus can also be: + // noaccess (receives but cannot pick up mail) + // disabled (bounce incoming and deny pickup) + // deleted (bounce incoming but allow pickup) + $users[$domain][$i]['user_enabled'] = + $user[$this->_getAttrByField('user_enabled')][0]; + } + + $i++; + } + + return $users[$domain]; + } + + function _getFields() + { + // LDAP attributes are always returned lower case! + static $fields = array( + 'address' => 'mail', + 'user_name' => 'uid', + 'user_crypt' => 'userpassword', + 'user_full_name' => 'cn', + 'user_uid' => 'qmailuid', + 'user_gid' => 'qmailgid', + 'user_home_dir' => 'homedirectory', + 'user_mail_dir' => 'mailmessagestore', + 'user_mail_quota_bytes' => 'mailquotasize', + 'user_mail_quota_count' => 'mailquotacount', + 'user_enabled' => 'accountstatus', + ); + + return $fields; + + } + + function _getAttrByField($field) { + $fields = $this->_getFields(); + return $fields[$field]; + } + + function _getFieldByAttr($attr) { + $attrs = array_flip($this->_getFields()); + return $attrs[$attr]; + } + + /** + * Returns available email address aliases. This method should not be + * called directly but rather by way of getAddresses(). + * + * @access private + * + * @param string $target If passed a domain then return all alias emails + * for the domain, otherwise if passed a user name + * return all virtual emails for that user. + * + * @return array The used email aliases + */ + function _getAliases($target = null) + { + // FIXME: Add static cache + + $filter = '(&'; // Begin filter (cumulative AND) + foreach ($this->_ldapparams['objectclass'] as $objectclass) { + // Add each objectClass from parameters + $filter .= '(objectClass=' . $objectclass . ')'; + } + // FIXME: Add preconfigured filter from $this->_ldapparams + + // Check if filtering only for domain. + if (($pos = strpos($target, '@')) === false && !empty($target)) { + $filter .= '(mailAlternateAddress=*@' . $target . ')'; + // Otherwise filter for all aliases + } else { + $filter .= '(mailAlternateAddress=*)'; + // Restrict the results to $target + if (!empty($target)) { + $filter .= '(mail=' . $target . ')'; // Add user's email + } + } + $filter .= ')'; // End filter + + Horde::logMessage($filter, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $res = @ldap_search($this->_ldap, $this->_ldapparams['basedn'], $filter); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error searching LDAP: %s"), + @ldap_error($this->_ldap))); + } + + $res = @ldap_get_entries($this->_ldap, $res); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error returning LDAP results: %s"), @ldap_error($this->_ldap))); + } + + $aliases = array(); + // Can't use foreach because of the array format returned by LDAP driver + $i = 0; // Virtual address index + $e = 0; // Entry counter + while ($entry = @$res[$e]) { + // If accountStatus is blank it's the same as active + if (!isset($entry[$this->_getAttrByField('user_enabled')][0]) || + ($entry[$this->_getAttrByField('user_enabled')][0] == 'active')) { + $curstatus = 'active'; + } else { + // accountStatus can also be: + // noaccess (receives but cannot pick up mail) + // disabled (bounce incoming and deny pickup) + // deleted (bounce incoming but allow pickup) + $curstatus = $entry[$this->_getAttrByField('user_enabled')][0]; + } + $a = 0; // Attribute counter + while ($mail = @$entry['mailalternateaddress'][$a]) { + $aliases[$i]['id'] = $mail; + $aliases[$i]['type'] = 'alias'; + $aliases[$i]['user_name'] = $mail; + $aliases[$i]['user_full_name'] = sprintf(_("Alias for %s"), $entry['mail'][0]); + $aliases[$i]['destination'] = $entry['mail'][0]; + $aliases[$i]['user_enabled'] = $curstatus; + $a++; + $i++; + } + $e++; + } + + return $aliases; + } + + /** + * Returns all available groups and forwards unless otherwise specified. + * If a domain name is passed then limit the results to groups or forwards + * in that domain. This method should not be called directly, but rather by + * way of getAddresses() + * + * @access private + * + * @param string $acquire The default behavior is to acquire both + * groups and forwards; a value of 'group' + * will return only groups and a value of + * 'forward' will return only forwards. + * @param string $domain The name of the domain from which to fetch + * + * @return array The available groups and forwards with details + */ + function _getGroupsAndForwards($acquire = null, $domain = null) + { + // Cache + static $grpfwds; + // TODO ? + /* + if (is_null($domain) && isset($grpfwds['_all'])) { + return $grpfwds['_all']; + } + if (!is_null($domain) && isset($grpfwds[$domain])) { + return $grpfwds[$domain]; + } + */ + $filter = '(&'; // Begin filter (cumulative AND) + foreach ($this->_ldapparams['objectclass'] as $objectclass) { + // Add each objectClass from parameters + $filter .= '(objectClass=' . $objectclass . ')'; + } + // FIXME: Add preconfigured filter from $this->_ldapparams + + // Only return results which have a forward configured + $filter .= '(mailForwardingAddress=*)'; + + if (!empty($domain)) { + $filter .= '(|'; // mail or mailAlternateAddress + $filter .= '(mail=*@' . $domain . ')'; + $filter .= '(mailAlternateAddress=*@' . $domain . ')'; + $filter .= ')'; // end mail or mailAlternateAddress + } else { + $domain = '_all'; + } + $filter .= ')'; // End filter + Horde::logMessage($filter, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $res = @ldap_search($this->_ldap, $this->_ldapparams['basedn'], $filter); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error searching LDAP: %s"), + @ldap_error($this->_ldap))); + } + + $res = @ldap_get_entries($this->_ldap, $res); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error returning LDAP results: %s"), @ldap_error($this->_ldap))); + } + + $grpfwds[$domain] = array(); + // Can't use foreach because of the array format returned by LDAP driver + $i = 0; // Address index + $e = 0; // Entry counter + + while ($entry = @$res[$e]) { + $targets = array(); + $a = 0; // Attribute counter + while ($attr = @$res[$e]['mailforwardingaddress'][$a]) { + $targets[] = $attr; + $a++; + } + $type = $entry['mailforwardingaddress']["count"]; + if($type > 1) { + $type = 'group'; + } else { + $type = 'forward'; + } + if(($acquire == 'all') || ($type == $acquire)) { + $grpfwds[$domain][$i] = array( + 'id' => $entry['dn'], + 'type' => $type, + 'address' => $entry[$this->_getAttrByField('address')][0], + 'targets' => $targets, + 'user_name' => $entry[$this->_getAttrByField('user_name')][0], + 'user_full_name' => @$entry[$this->_getAttrByField('user_name')][0], + ); + // If accountStatus is blank it's the same as active + if (!isset($entry[$this->_getAttrByField('user_enabled')][0]) || + ($entry[$this->_getAttrByField('user_enabled')][0] == 'active')) { + $grpfwds[$domain][$i]['user_enabled'] = 'active'; + } else { + // accountStatus can also be: + // noaccess (receives but cannot pick up mail) + // disabled (bounce incoming and deny pickup) + // deleted (bounce incoming but allow pickup) + $grpfwds[$domain][$i]['user_enabled'] = + $entry[$this->_getAttrByField('user_enabled')][0]; + } + } else { + $e++; + continue; + } + $e++; + $i++; + } + return $grpfwds[$domain]; + } + + /** + * Returns information for an email alias + * + * @param string $id The email alias id for which to return information. + * + * @return array The virtual email information. + */ + function getAddressInfo($address, $type = 'all') + { + if ($type != 'alias') { + return parent::getAddressInfo($address, $type); + } else { + // FIXME: Which is faster? A linear array search or an LDAP search? + // I think LDAP in this case because we can't assume the domain. + $filter = '(&'; // Begin filter (cumulative AND) + foreach ($this->_ldapparams['objectclass'] as $objectclass) { + // Add each objectClass from parameters + $filter .= '(objectClass=' . $objectclass . ')'; + } + $filter .= '(mailAlternateAddress= ' . $address . ')'; + $filter .= ')'; // End filter + Horde::logMessage($filter, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $res = @ldap_search($this->_ldap, $this->_ldapparams['basedn'], $filter); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error searching LDAP: %s"), + @ldap_error($this->_ldap))); + } + $res = @ldap_get_entries($this->_ldap, $res); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error returning LDAP results: %s"), @ldap_error($this->_ldap))); + } + + if ($res['count'] !== 1) { + return PEAR::raiseError(_("More than one DN returned for this alias. Please contact an administrator to resolve this error.")); + } + + return array( + 'id' => $res[0]['dn'], + 'address' => $address, + 'destination' => $res[0]['mail'][0], + ); + } + } + + /** + * Returns the current number of set up users for a domain. + * + * @param string $domain_name The name of the domain for which to + * get the current number of users. + * + * @return integer The current number of users. + */ + function getDomainNumUsers($domain_name) + { + return count($this->_getUsers($domain_name)); + } + + /** + * Saves a domain to the backend. + * + * @param array $info The domain information to save to the backend. + * + * @return mixed True on success or PEAR error otherwise. + */ + function _saveDomain(&$info) + { + // We store the records within Horde's configured SQL database for + // Vilma because LDAP has no mechanism for tracking domains + // that are valid for this system. + $values = array($info['name'], $info['transport'], + (int)$info['max_users'], (int)$info['quota']); + + if (empty($info['domain_id'])) { + $nextid = $this->_db->nextId('vilma_domains'); + $sql = 'INSERT INTO vilma_domains (domain_id, domain_name, ' . + 'domain_transport, domain_max_users, domain_quota) VALUES ' . + '(?, ?, ?, ?, ?)'; + array_unshift($values, $nextid); + } else { + $sql = 'UPDATE vilma_domains SET domain_name=?, ' . + 'domain_transport=?, domain_max_users=?, domain_quota=? ' . + 'WHERE domain_id=?'; + array_push($values, $info['domain_id']); + } + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->query($sql, $values); + } + + /** + * Deletes a given domain. + * + * @param string $domain_id The id of the domain to delete. + * + * @return mixed True on success or PEAR error otherwise. + */ + function _deleteDomain($domain_id) + { + $domain_record = $this->getDomain($domain_id); + if (is_a($domain_record, 'PEAR_Error')) { + return $domain_record; + } + + $domain_name = $domain_record['domain_name']; + + // FIXME: Add logic to remove all users, aliases, and grpfwds for this + // domain + + /* Finally delete the domain. */ + $sql = 'DELETE FROM vilma_domains WHERE domain_id=?'; + $values = array((int)$domain_id); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->query($sql, $values); + } + + /** + * Searchs for a given email account. + * + * @param string $email_id The id of the account to be searched for. + * + * @return Array of data for given email account on success or no + * information found; and for an error a PEAR::Error otherwise. + */ + function searchForAliases($email_id) { + // Get the user's DN + $filter = '(&'; // Begin filter (cumulative AND) + foreach ($this->_ldapparams['objectclass'] as $objectclass) { + // Add each objectClass from parameters + $filter .= '(objectClass=' . $objectclass . ')'; + } + /* + // Check if filtering only for domain. + if (($pos = strpos($target, '@')) === false && !empty($email_id)) { + $filter .= '(mailAlternateAddress=*@' . $email_id . ')'; + // Otherwise filter for all aliases + } else { + $filter .= '(mailAlternateAddress=*)'; + // Restrict the results to $target + if (!empty($email_id)) { + $filter .= '(mail=' . $email_id . ')'; // Add user's email + } + } + */ + $filter .= '(mailAlternateAddress=' . $email_id . ')'; + $filter .= ')'; // End filter + + //echo $filter; + Horde::logMessage($filter, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $res = @ldap_search($this->_ldap, $this->_ldapparams['basedn'], $filter); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error searching LDAP: %s"), + @ldap_error($this->_ldap))); + } + $res = @ldap_get_entries($this->_ldap, $res); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error retrieving LDAP results: %s"), @ldap_error($this->_ldap))); + } + + return $res; + } + + /** + * Searchs for a given email account. + * + * @param string $email_id The id of the account to be searched for. + * + * @return Array of data for given email account on success or no + * information found; and for an error a PEAR::Error otherwise. + */ + function searchForUser($email_id) + { + // Get the user's DN + $filter = '(&'; + foreach ($this->_ldapparams['objectclass'] as $objectclass) { + // Add each objectClass from parameters + $filter .= '(objectclass=' . $objectclass . ')'; + } + $filter .= '(mail=' . $email_id . '))'; + + Horde::logMessage($filter, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $res = @ldap_search($this->_ldap, $this->_ldapparams['basedn'], $filter); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error searching LDAP: %s"), + @ldap_error($this->_ldap))); + } + $res = @ldap_get_entries($this->_ldap, $res); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error retrieving LDAP results: %s"), @ldap_error($this->_ldap))); + } + + if ($res['count'] === 0) { + return PEAR::raiseError(_("Unable to acquire handle on DN. Aborting delete operation.")); + } else if($res['count'] !== 1) { + return PEAR::raiseError(_("More than one DN returned. Aborting delete operation.")); + } + return $res; + } + + /** + * Deletes a given email account. + * + * @param string $email_id The id of the account to delete (not an alias) + * + * @return mixed True on success or PEAR::Error otherwise. + */ + function deleteUser($email_id) + { + // Get the user's DN + $filter = '(&'; + foreach ($this->_ldapparams['objectclass'] as $objectclass) { + // Add each objectClass from parameters + $filter .= '(objectclass=' . $objectclass . ')'; + } + $filter .= '(mail=' . $email_id . ')'; + //echo $email_id . '
'; + $filter .= ')'; + Horde::logMessage($filter, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $res = @ldap_search($this->_ldap, $this->_ldapparams['basedn'], $filter); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error searching LDAP: %s"), + @ldap_error($this->_ldap))); + } + $res = @ldap_get_entries($this->_ldap, $res); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error retrieving LDAP results: %s"), @ldap_error($this->_ldap))); + } + + if ($res['count'] === 0) { + return PEAR::raiseError(_("Unable to acquire handle on DN. Aborting delete operation.")); + } else if($res['count'] !== 1) { + return PEAR::raiseError(_("More than one DN returned. Aborting delete operation.")); + } + // We now have one unique DN to delete. + $res = @ldap_delete($this->_ldap, $res[0]['dn']); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error deleting account from LDAP: %s"), @ldap_error($this->_ldap))); + } + + return true; + } + + /** + * Modifies alias data on the backend. + * + * @param mixed $info The alias, or an array containing the alias and supporting data. + * @param string $mode The operation requested: add, update, delete. + * + * @return mixed True on success or PEAR error otherwise. + */ + function _savealias($info,$mode = null) + { + if ($mode == 'delete') { + $address = $info; + + $user_info = $this->searchForAliases($address); + $aliasesList = $user_info[0]['mailalternateaddress']; + if (is_a($user_info, 'PEAR_Error') || ($res['count'] === 0) ) { + return PEAR::raiseError(_("Error reading address information from backend.")); + } + $addrinfo = $this->getAddressInfo($address); + if (is_a($addrinfo, 'PEAR_Error')) { + return $addrinfo; + } + $type = $addrinfo['type']; + $addrinfo = $this->getAddressInfo($address,$type); + if (is_a($addrinfo, 'PEAR_Error')) { + return $addrinfo; + } + $objectClassData = null; + if(isset($user_info[0]['objectclass'])) { + $objectClassData = $user_info[0]['objectclass']; + } + if ($this->_ldap) { + // bind with appropriate dn to give update access + $res = ldap_bind($this->_ldap, $this->_ldapparams['binddn'], + $this->_ldapparams['bindpw']); + if (!$res) { + return PEAR::raiseError(_("Unable to bind to the LDAP server. Check authentication credentials.")); + } + $tmp = array(); + $key = null; + foreach($aliasesList as $key => $val) { + if($val != $address) { + array_push($tmp,$val); + } + } + $entry["mailalternateaddress"] = $tmp; + + $rdn = 'mail=' . $addrinfo['destination']; + $dn = $rdn . ',' . $this->_ldapparams['basedn']; + $res = @ldap_modify($this->_ldap, $dn, $entry); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error modifying account: %s"), @ldap_error($this->_ldap))); + } else { + return TRUE; + } + } + } + + return PEAR::raiseError(_("Unable to save user information.")); + } + + function _saveUser(&$info) + { + if ($info['mode'] == 'edit') { + $address = $info['address']; + if(!isset($address) || empty($address)) { + $user_name = $info['user_name']; + $domain = $info['domain']; + if(!(!isset($user_name) || empty($user_name)) && !(!isset($user_name) || empty($user_name))) { + $address = $info['user_name'] . $info['domain']; + } else { + return PEAR::raiseError(_("Unable to acquire handle on address.")); + } + } + $addrinfo = $this->getAddressInfo($address); + if (is_a($addrinfo, 'PEAR_Error')) { + return $addrinfo; + } + $type = $addrinfo['type']; + if($type == 'user') { + //continue, this is a user. + } else { + //return PEAR::raiseError(_("Unable to save account of type " . $type)); + } + + $user_info = $this->searchForUser($address); + if (is_a($user_info, 'PEAR_Error') || ($res['count'] === 0) ) { + return PEAR::raiseError(_("Error reading address information from backend.")); + } + + $objectClassData = null; + if(isset($user_info[0]['objectclass'])) { + $objectClassData = $user_info[0]['objectclass']; + } + + unset($info['mode']); // Don't want to save this to LDAP + // Special case for the password: If it was provided, it needs + // to be crypted. Otherwise, ignore it. + if (isset($info['password'])) { + if (!empty($user['password'])) { + // FIXME: Allow choice of hash + $info['user_password'] = Horde_Auth::getCryptedPassowrd($info['password'], '', 'ssha', true); + } + unset($info['password']); + } + + $tmp['dn'] = $addrinfo['id']; + foreach ($info as $key => $val) { + $attr = $this->_getAttrByField($key); + $tmp[$attr] = $val; + } + + if ($this->_ldap) { + // bind with appropriate dn to give update access + $res = ldap_bind($this->_ldap, $this->_ldapparams['binddn'], + $this->_ldapparams['bindpw']); + if (!$res) { + return PEAR::raiseError(_("Unable to bind to the LDAP server. Check authentication credentials.")); + } + + // prepare data + $entry['cn'] = $info['user_full_name']; + // sn is not used operationally but we make an effort to be + // something sensical. No guarantees, though. + $entry['sn'] = array_pop(explode(' ', $info['user_full_name'])); +// The next two lines were reversed: which is right? + $entry['mail'] = $info['user_name'] . $info['domain']; + // $tmp['mail']; + $entry['uid'] = $entry['mail']; + $entry['homeDirectory'] = '/srv/vhost/mail/' . $info['domain'] .'/' . $info['user_name']; + if(($type != 'group') && ($type != 'forward')) { + $entry["qmailUID"] = 8; + $entry["qmailGID"] = 8; + } + $entry["accountstatus"] = $info["user_enabled"]; + if(isset($info['password']) && !empty($info['password'])) { + // FIXME: Allow choice of hash + $entry["userPassword"] = Horde_Auth::getCryptedPassword($info['password'], '', 'ssha', true); + } + if(isset($objectClassData)) { + array_shift($objectClassData); + $entry['objectclass'] = $objectClassData; + } else { + $entry['objectclass'] = array(); + $entry['objectclass'][] = 'top'; + $entry['objectclass'][] = 'person'; + $entry['objectclass'][] = 'organizationalPerson'; + $entry['objectclass'][] = 'inetOrgPerson'; + $entry['objectclass'][] = 'hordePerson'; + $entry['objectclass'][] = 'qmailUser'; + } + + // Stir in any site-local custom LDAP attributes + $entry = Horde::callHook('_vilma_hook_getldapattrs', + array($entry), 'vilma'); + + $rdn = 'mail=' . $entry['mail']; + $dn = $rdn . ',' . $this->_ldapparams['basedn']; + $res = @ldap_modify($this->_ldap, $dn, $entry); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error modifying account: %s"), @ldap_error($this->_ldap))); + } else { + return TRUE; + } + } + } else if($info['mode'] == 'new') { + if ($this->_ldap) { + // bind with appropriate dn to give update access + $res = ldap_bind($this->_ldap, $this->_ldapparams['binddn'], + $this->_ldapparams['bindpw']); + if (!$res) { + return PEAR::raiseError(_("Unable to bind to the LDAP server. Check authentication credentials.")); + } + + // prepare data + $entry['cn'] = $info['user_full_name']; + // sn is not used operationally but we make an effort to be + // something sensical. No guarantees, though. + $entry['sn'] = array_pop(explode(' ', $info['user_full_name'])); + $entry['mail'] = $info['user_name'] . '@' . $info['domain']; + // uid must match mail or SMTP auth fails + $entry['uid'] = $entry['mail']; + $entry['homeDirectory'] = '/srv/vhost/mail/' . $info['domain'] .'/' . $info['user_name']; + $entry['qmailUID'] = 8; + $entry['qmailGID'] = 8; + $entry['objectclass'] = array(); + $entry['objectclass'][] = 'top'; + $entry['objectclass'][] = 'person'; + $entry['objectclass'][] = 'organizationalPerson'; + $entry['objectclass'][] = 'inetOrgPerson'; + $entry['objectclass'][] = 'hordePerson'; + $entry['objectclass'][] = 'qmailUser'; + $entry["accountstatus"] = $info["user_enabled"]; + // FIXME: Allow choice of hash + $entry["userPassword"] = Horde_Auth::getCryptedPassword($info['password'], '', 'ssha', true); + + // Stir in any site-local custom LDAP attributes + $entry = Horde::callHook('_vilma_hook_getldapattrs', + array($entry), 'vilma'); + + $rdn = 'mail=' . $entry['mail']; + $dn = $rdn . ',' . $this->_ldapparams['basedn']; + $res = @ldap_add($this->_ldap, $dn, $entry); + if ($res === false) { + return PEAR::raiseError(sprintf(_("Error adding account to LDAP: %s"), @ldap_error($this->_ldap))); + } else { + return TRUE; + } + } else { + return PEAR::raiseError(_("Unable to connect to LDAP server")); + } + } + + return PEAR::raiseError(_("Unable to save user information.")); + } + + /** + * Deletes a virtual email. + * + * @param integer $virtual_id The id of the virtual email to delete. + */ + function deleteVirtual($virtual_id) + { + die("deleteVirtual()"); + } + + function getUserFormAttributes() + { + $attrs = array(); + $attrs[] = array( + 'label' => _("Account Status"), + 'name' => 'user_enabled', + 'type' => 'enum', + 'required' => true, + 'readonly' => false, + 'description' => null, + 'params' => array( + array( + 'active' => _("Account is active"), + 'noaccess' => _("Disable Delivery Only"), + 'disabled' => _("Bounce Incoming Only"), + 'deleted' => _("Account is disabled"), + ), + ), + 'default' => 'active', + ); + + return $attrs; + } + + function _connect() + { + if (!is_null($this->_ldap)) { + return true; + } + + Horde::assertDriverConfig($this->_ldapparams, 'storage', + array('ldaphost', 'basedn', 'binddn', 'dn')); + + if (!isset($this->_ldapparams['bindpw'])) { + $this->_ldapparams['bindpw'] = ''; + } + + $port = (isset($this->_ldapparams['port'])) ? + $this->_ldapparams['port'] : 389; + + $this->_ldap = ldap_connect($this->_ldapparams['ldaphost'], $port); + if (!$this->_ldap) { + Horde::fatal("Unable to connect to LDAP server $hostname on $port", + __FILE__, __LINE__); + } + $res = ldap_set_option($this->_ldap, LDAP_OPT_PROTOCOL_VERSION, + $this->_ldapparams['version']); + if (!$res) { + return PEAR::raiseError(_("Unable to set LDAP protocol version")); + } + $res = ldap_bind($this->_ldap, $this->_ldapparams['binddn'], + $this->_ldapparams['bindpw']); + if (!$res) { + return PEAR::raiseError(_("Unable to bind to the LDAP server. Check authentication credentials.")); + } + + } + + /** + * Initialise this backend, connect to the SQL database. + * + * @return mixed True on success or PEAR error otherwise. + */ + function _dbinit() + { + global $registry; + + Horde::assertDriverConfig($this->_sqlparams, 'storage', + array('phptype')); + + if (!isset($this->_sqlparams['database'])) { + $this->_sqlparams['database'] = ''; + } + if (!isset($this->_sqlparams['username'])) { + $this->_sqlparams['username'] = ''; + } + if (!isset($this->_sqlparams['hostspec'])) { + $this->_sqlparams['hostspec'] = ''; + } + + /* Connect to the SQL server using the supplied parameters. */ + require_once 'DB.php'; + $this->_db = &DB::connect($this->_sqlparams, + array('persistent' => !empty($this->_sqlparams['persistent']))); + if (is_a($this->_db, 'PEAR_Error')) { + return $this->_db; + } + + // Set DB portability options. + switch ($this->_db->phptype) { + case 'mssql': + $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS | DB_PORTABILITY_RTRIM); + break; + + default: + $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS); + } + } +} diff --git a/vilma/lib/Driver/sql.php b/vilma/lib/Driver/sql.php new file mode 100644 index 000000000..e4468d014 --- /dev/null +++ b/vilma/lib/Driver/sql.php @@ -0,0 +1,640 @@ + + * @package Vilma + */ +class Vilma_Driver_sql extends Vilma_Driver { + + /** + * @var DB + */ + var $_db; + + function Vilma_Driver_sql($params) + { + parent::Vilma_Driver($params); + $this->initialise(); + } + + /** + * Construct an SQL WHERE fragment to filter domains by domain key. + * + * @access private + * + * @param string $join Keyword to join expression to rest of SQL statement + * (e.g. 'WHERE' or 'AND'). Default: 'WHERE'. + * + * @return array An SQL fragment and a list of values suitable for + * binding. + */ + function _getDomainKeyFilter($join = 'WHERE') + { + if (empty($this->_params['tables']['domainkey'])) { + return array('', array()); + } + + return array(' ' . $join . ' domain_key = ?', + array($this->_params['tables']['domainkey'])); + } + + /** + * Construct an SQL WHERE fragment to filter users by domain key. + * + * @access private + * + * @param string $join Keyword to join expression to rest of SQL statement + * (e.g. 'WHERE' or 'AND'). Default: 'WHERE'. + * + * @return array An SQL fragment and a list of values suitable for + * binding. + */ + function _getUserKeyFilter($join = 'WHERE') + { + if (empty($this->_params['tables']['domainkey'])) { + return array('', array()); + } + $binds = $this->_getDomainKeyFilter('AND'); + + return array(' ' . $join . ' EXISTS (SELECT domain_name' . + ' FROM ' . $this->_params['tables']['domains'] . + ' WHERE ' . $this->_getTableField('users', 'user_name') . + ' LIKE ? || ' . $this->_getTableField('domains', 'domain_name') . + ' ' . $binds[0] . ' )', + array_unshift($binds[1], '%@')); + } + + /** + * Construct an SQL WHERE fragment to filter virtuals by domain key. + * + * @access private + * + * @param string $join Keyword to join expression to rest of SQL statement + * (e.g. 'WHERE' or 'AND'). Default: 'WHERE'. + * + * @return string An SQL fragment. + */ + function _getVirtualKeyFilter($join = 'WHERE') + { + if (empty($this->_params['tables']['domainkey'])) { + return array('', array()); + } + $binds = $this->_getDomainKeyFilter('AND'); + + return array(' ' . $join . ' EXISTS (SELECT domain_name' . + ' FROM ' . $this->_params['tables']['domains'] . + ' WHERE ' . $this->_getTableField('virtuals', 'virtual_email') . + ' LIKE ? || ' . $this->_getTableField('domains', 'domain_name') . + ' ' . $binds[0] . ' )', + array_unshift($binds[1], '%@')); + } + + /** + * Gets the list of fields from specific table for sql statement. + * + * @return string + */ + function _getTableFields($table) + { + if (empty($this->_params['tables'][$table . '_fields'])){ + return '*'; + } + + $domainsFields = $this->_params['tables'][$table . '_fields']; + foreach ($domainsFields as $defaultName => $customName) { + $fields[] = $customName . ' as ' . $defaultName; + } + return implode(', ', $fields); + } + + /** + * Gets the real name of the field from specific table for sql statement. + * + * @return string + */ + function _getTableField($table, $field) + { + if (empty($this->_params['tables'][$table . '_fields'])) { + return $field; + } else { + return $this->_params['tables'][$table . '_fields'][$field]; + } + } + + /** + * + * + * @return array + */ + function _prepareRecord($table, $record) + { + if (empty($this->_params['tables'][$table . '_fields'])){ + return $record; + } + + $domainsFields = $this->_params['tables'][$table . '_fields']; + $newRecord = array(); + foreach ($record as $defaultName => $value) { + $newRecord[$domainsFields[$defaultName]] = $record[$defaultName]; + } + return $newRecord; + } + + /** + * Gets the list of domains from the backend. + * + * @return array All the domains and their data in an array. + */ + function getDomains() + { + $binds = $this->_getDomainKeyFilter(); + $sql = 'SELECT '. $this->_getTableFields('domains') . ' FROM ' . $this->_params['tables']['domains'] . + $binds[0] . ' ORDER BY domain_name'; + $values = $binds[1]; + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getAll($sql, $values, DB_FETCHMODE_ASSOC); + } + + /** + * Gets the specified domain information from the backend. + * + * @param integer $domain_id The id of the domain to fetch. + * + * @return array The domain's information in an array. + */ + function getDomain($domain_id) + { + $binds = $this->_getDomainKeyFilter('AND'); + $sql = 'SELECT '. $this->_getTableFields('domains') . ' FROM ' . $this->_params['tables']['domains'] . + ' WHERE ' . $this->_getTableField('domains', 'domain_id') . ' = ?' . $binds[0]; + array_unshift($binds[1], (int)$domain_id); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getRow($sql, $binds[1], DB_FETCHMODE_ASSOC); + } + + /** + * Given a domain name returns the information from the backend. + * + * @param string $name The name of the domain to fetch. + * + * @return array The domain's information in an array. + */ + function getDomainByName($domain_name) + { + $binds = $this->_getDomainKeyFilter('AND'); + $sql = 'SELECT '. $this->_getTableFields('domains') . ' FROM ' . $this->_params['tables']['domains'] . + ' WHERE ' . $this->_getTableField('domains', 'domain_name') . ' = ?' . $binds[0]; + array_unshift($binds[1], $domain_name); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getRow($sql, $binds[1], DB_FETCHMODE_ASSOC); + } + + /** + * Returns all available users, if a domain name is passed then limit the + * list of users only to those users. + * + * @param string $domain The name of the domain for which to fetch the + * users. + * + * @return array The available users and their stored information. + */ + function getUsers($domain = null) + { + /* Put together the SQL statement. */ + if (is_null($domain)) { + /* Fetch all users. */ + $binds = $this->_getUserKeyFilter(); + $sql = 'SELECT '. $this->_getTableFields('users') . ' FROM ' . $this->_params['tables']['users'] . + $binds[0]; + $values = $binds[1]; + } else { + /* Fetch only users for a domain. */ + $binds = $this->_getUserKeyFilter('AND'); + $sql = 'SELECT '. $this->_getTableFields('users') . ' FROM ' . $this->_params['tables']['users'] . + ' WHERE ' . $this->_getTableField('users', 'user_name') . ' LIKE ?' . $binds[0] . + ' ORDER BY user_name'; + array_unshift($binds[1], '%@' . $domain); + $values = $binds[1]; + } + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getAll($sql, $values, DB_FETCHMODE_ASSOC); + } + + /** + * Returns the user information for a given user id. + * + * @param integer $user_id The id of the user for which to fetch + * information. + * + * @return array The user information. + */ + function getUser($user_id) + { + $binds = $this->_getUserKeyFilter('AND'); + $sql = 'SELECT '. $this->_getTableFields('users') . ' FROM ' . $this->_params['tables']['users'] . + ' WHERE ' . $this->_getTableField('users', 'user_id') . ' = ?' . $binds[0]; + array_unshift($binds[1], (int)$user_id); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getRow($sql, $binds[1], DB_FETCHMODE_ASSOC); + } + + /** + * Returns available virtual emails. + * + * @param string $filter If passed a domain then return all virtual emails + * for the domain, otherwise if passed a user name + * return all virtual emails for that user. + * + * @return array The available virtual emails. + */ + function getVirtuals($filter) + { + /* Check if filtering only for domain. */ + if (($pos = strpos($filter, '@')) === false) { + $where = $this->_getTableField('virtuals', 'virtual_email') . ' LIKE ?'; + $values = array('%@' . $filter); + } else { + $where = $this->_getTableField('virtuals', 'virtual_destination') . ' = ?'; + $values = array($filter); + } + + $binds = $this->_getVirtualKeyFilter('AND'); + $sql = 'SELECT '. $this->_getTableFields('virtuals') . ' FROM ' . $this->_params['tables']['virtuals'] . + ' WHERE ' . $where . $binds[0] . + ' ORDER BY virtual_destination, virtual_email'; + $values = array_merge($values, $binds[1]); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getAll($sql, $values, DB_FETCHMODE_ASSOC); + } + + /** + * Returns information for a virtual id. + * + * @param integer $virtual_id The virtual id for which to return + * information. + * + * @return array The virtual email information. + */ + function getVirtual($virtual_id) + { + $binds = $this->_getVirtualKeyFilter('AND'); + $sql = 'SELECT '. $this->_getTableFields('virtuals') . ' FROM ' . $this->_params['tables']['virtuals'] . + ' WHERE ' . $this->_getTableField('virtuals', 'virtual_id') . ' = ?' . $binds[0]; + array_unshift($binds[1], (int)$virtual_id); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $virtual = $this->_db->getRow($sql, $binds[1], DB_FETCHMODE_ASSOC); + $virtual['stripped_email'] = Vilma::stripUser($virtual['virtual_email']); + + return $virtual; + } + + /** + * Returns the current number of set up users for a domain. + * + * @param string $domain_name The name of the domain for which to + * get the current number of users. + * + * @return integer The current number of users. + */ + function getDomainNumUsers($domain_name) + { + $binds = $this->_getUserKeyFilter('AND'); + $sql = 'SELECT count(' . $this->_getTableField('users', 'user_name') . ')' . + ' FROM ' . $this->_params['tables']['users'] . + ' WHERE ' . $this->_getTableField('users', 'user_name') . ' LIKE ?' . $binds[0]; + array_unshift($binds[1], '%@' . $domain_name); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->getOne($sql, $binds[1]); + } + + /** + * Saves a domain to the backend. + * + * @param array $info The domain information to save to the backend. + * + * @return mixed True on success or PEAR error otherwise. + */ + function _saveDomain($info) + { + require_once 'Horde/SQL.php'; + + $record = array('domain_name' => $info['name'], + 'domain_transport' => $info['transport'], + 'domain_max_users' => (int)$info['max_users'], + 'domain_quota' => (int)$info['quota']); + + if (empty($info['domain_id'])) { + $record['domain_id'] = $this->_db->nextId($this->_params['tables']['domains']); + if (!empty($this->_params['tables']['domainkey'])) { + $record['domain_key'] = $this->_params['tables']['domainkey']; + } + + $sql = 'INSERT INTO ' . $this->_params['tables']['domains'] . + ' ' . Horde_SQL::insertValues($this->_db, $this->_prepareRecord('domains', $record)); + $values = array(); + } else { + $binds = $this->_getDomainKeyFilter('AND'); + $sql = 'UPDATE ' . $this->_params['tables']['domains'] . + ' SET ' . Horde_SQL::updateValues($this->_db, $this->_prepareRecord('domains', $record)) . + ' WHERE ' . $this->_getTableField('domains', 'domain_id') . ' = ?' . $binds[0]; + array_unshift($binds[1], $info['domain_id']); + $values = $binds[1]; + } + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->query($sql, $values); + } + + /** + * Deletes a given domain. + * + * @param integer $domain_id The id of the domain to delete. + * + * @return mixed True on success or PEAR error otherwise. + */ + function _deleteDomain($domain_id) + { + $domain_record = $this->getDomain($domain_id); + if (is_a($domain_record, 'PEAR_Error')) { + return $domain_record; + } + + $domain_name = $domain_record['domain_name']; + + /* Delete all virtual emails for this domain. */ + $sql = 'DELETE FROM ' . $this->_params['tables']['virtuals'] . + ' WHERE ' . $this->_getTableField('virtuals', 'virtual_email') . ' LIKE ?'; + $values = array('%@' . $domain_name); + $delete = $this->_db->query($sql, $values); + if (is_a($delete, 'PEAR_Error')) { + return $delete; + } + + /* Delete all users for this domain. */ + $sql = 'DELETE FROM ' . $this->_params['tables']['users'] . + ' WHERE ' . $this->_getTableField('users', 'user_name') . ' LIKE ?'; + $values = array('%@' . $domain_name); + $delete = $this->_db->query($sql, $values); + if (is_a($delete, 'PEAR_Error')) { + return $delete; + } + + /* Finally delete the domain. */ + $sql = 'DELETE FROM ' . $this->_params['tables']['domains'] . + ' WHERE ' . $this->_getTableField('domains', 'domain_id') . ' = ?'; + $values = array((int)$domain_id); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->query($sql, $values); + } + + /** + * Saves a user to the backend. + * + * @param array $info The user information to save. + * + * @return array The user information. + */ + function _saveUser($info) + { + global $conf; + + require_once 'Horde/SQL.php'; + + /* Access check (for domainkey). */ + $res = $this->getDomainByName(Vilma::stripDomain($info['user_name'])); + if (is_a($res, 'PEAR_Error')) { + return $res; + } + + $mailboxes = &Vilma::getMailboxDriver(); + if (is_a($mailboxes, 'PEAR_Error')) { + return $mailboxes; + } + + if (empty($info['user_id'])) { + $info['user_id'] = $this->_db->nextId($this->_params['tables']['users']); + $create = true; + } else { + $create = false; + } + + // Slightly hackish. + $mail_dir_base = isset($mailboxes->_params['mail_dir_base']) ? + $mailboxes->_params['mail_dir_base'] : '?'; + + $tuple = array('user_id' => (int)$info['user_id'], + 'user_name' => $info['user_name'], + 'user_full_name' => $info['user_full_name'], + 'user_home_dir' => $mail_dir_base, + 'user_mail_dir' => Vilma::stripDomain($info['user_name']) . '/' . Vilma::stripUser($info['user_name']) . '/', + 'user_mail_quota' => $this->getDomainQuota(Vilma::stripDomain($info['user_name'])) * 1024 * 1024, + 'user_enabled' => (int)$info['user_enabled']); + + // UID and GID are slightly hackish (specific to maildrop driver), too + if (!isset($mailboxes->_params['uid'])) { + $tuple['user_uid'] = -1; + } else { + $tuple['user_uid'] = $mailboxes->_params['uid']; + } + if (!isset($mailboxes->_params['gid'])) { + $tuple['user_gid'] = -1; + } else { + $tuple['user_gid'] = $mailboxes->_params['gid']; + } + + if (!empty($info['password'])) { + $tuple['user_clear'] = $info['password']; + $tuple['user_crypt'] = crypt($info['password'], + substr($info['password'], 0, 2)); + } elseif ($create) { + return PEAR::raiseError(_("Password must be supplied when creating a new user.")); + } + + if ($create) { + $sql = 'INSERT INTO ' . + $this->_params['tables']['users'] . ' ' . + Horde_SQL::insertValues($this->_db, $this->_prepareRecord('users', $tuple)); + } else { + $sql = sprintf('UPDATE %s SET %s WHERE ' . $this->_getTableField('users', 'user_id') . ' = %d', + $this->_params['tables']['users'], + Horde_SQL::updateValues($this->_db, $this->_prepareRecord('users', $tuple)), + (int)$info['user_id']); + } + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql); + if (is_a($result, 'PEAR_Error')) { + Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); + return $result; + } + + return $info; + } + + /** + * Deletes a requested user. + * + * @param integer $user_id The id of the user to delete. + * + * @return mixed True, or PEAR_Error on failure. + */ + function _deleteUser($user_id) + { + $user = $this->getUser($user_id); + if (is_a($user, 'PEAR_Error')) { + return $user; + } + + /* Delete all virtual emails for this user. */ + $sql = 'DELETE FROM ' . $this->_params['tables']['virtuals'] . + ' WHERE ' . $this->_getTableField('virtuals', 'virtual_destination') . ' = ?'; + $values = array($user['user_name']); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $delete = $this->_db->query($sql, $values); + if (is_a($delete, 'PEAR_Error')) { + return $delete; + } + + /* Delete the actual user. */ + $sql = 'DELETE FROM ' . $this->_params['tables']['users'] . + ' WHERE ' . $this->_getTableField('users', 'user_id') . ' = ?'; + $values = array((int)$user_id); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + $result = $this->_db->query($sql, $values); + if (is_a($result, 'PEAR_Error')) { + return $result; + } + + $mailboxes = &Vilma::getMailboxDriver(); + if (is_a($mailboxes, 'PEAR_Error')) { + return $mailboxes; + } + + return $mailboxes->deleteMailbox(Vilma::stripUser($user['user_name']), + Vilma::stripDomain($user['user_name'])); + } + + /** + * Saves virtual email address to the backend. + * + * @param array $info The virtual email data. + * @param string $domain The name of the domain for this virtual email. + * + * @return mixed True on success or PEAR error otherwise. + */ + function saveVirtual(&$info, $domain) + { + /* Access check (for domainkey) */ + $res = $this->getDomainByName($domain); + if (is_a($res, 'PEAR_Error')) { + return $res; + } + + if (empty($info['virtual_id'])) { + $info['virtual_id'] = $this->_db->nextId($this->_params['tables']['virtuals']); + $sql = 'INSERT INTO ' . $this->_params['tables']['virtuals'] . + ' (' . $this->_getTableField('virtuals', 'virtual_email') . ', ' . + $this->_getTableField('virtuals', 'virtual_destination') . ', ' . + $this->_getTableField('virtuals', 'virtual_id') . ') VALUES (?, ?, ?)'; + } else { + $sql = 'UPDATE ' . $this->_params['tables']['virtuals'] . + ' SET ' . $this->_getTableField('virtuals', 'virtual_email') . ' = ?, '. + $this->_getTableField('virtuals', 'virtual_destination') . ' = ?' . + ' WHERE ' . $this->_getTableField('virtuals', 'virtual_id') . ' = ?'; + } + $values = array($info['stripped_email'] . '@' . $domain, + $info['virtual_destination'], + $info['virtual_id']); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->query($sql, $values); + } + + /** + * Deletes a virtual email. + * + * @param integer $virtual_id The id of the virtual email to delete. + */ + function deleteVirtual($virtual_id) + { + $binds = $this->_getVirtualKeyFilter('AND'); + $sql = 'DELETE FROM ' . $this->_params['tables']['virtuals'] . + ' WHERE ' . $this->_getTableField('virtuals', 'virtual_id') . ' = ?' . $binds[0]; + array_unshift($binds[1], $virtual_id); + + Horde::logMessage($sql, __FILE__, __LINE__, PEAR_LOG_DEBUG); + return $this->_db->query($sql, $binds[1]); + } + + /** + * Initialise this backend, connect to the SQL database. + * + * @return mixed True on success or PEAR error otherwise. + */ + function initialise() + { + global $registry; + + Horde::assertDriverConfig($this->_params, 'storage', + array('phptype')); + + if (!isset($this->_params['database'])) { + $this->_params['database'] = ''; + } + if (!isset($this->_params['username'])) { + $this->_params['username'] = ''; + } + if (!isset($this->_params['hostspec'])) { + $this->_params['hostspec'] = ''; + } + + /* Use default table names if these are not set. */ + if (!isset($this->_params['tables']['domains'])) { + $this->_params['tables']['domains'] = 'vilma_domains'; + } + if (!isset($this->_params['tables']['users'])) { + $this->_params['tables']['users'] = 'vilma_users'; + } + if (!isset($this->_params['tables']['virtuals'])) { + $this->_params['tables']['virtuals'] = 'vilma_virtuals'; + } + + /* Connect to the SQL server using the supplied parameters. */ + require_once 'DB.php'; + $this->_db = &DB::connect($this->_params, + array('persistent' => !empty($this->_params['persistent']))); + if (is_a($this->_db, 'PEAR_Error')) { + return $this->_db; + } + + // Set DB portability options. + switch ($this->_db->phptype) { + case 'mssql': + $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS | DB_PORTABILITY_RTRIM); + break; + + default: + $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS); + } + + return true; + } + +} diff --git a/vilma/lib/Forms/DeleteDomainForm.php b/vilma/lib/Forms/DeleteDomainForm.php new file mode 100644 index 000000000..4601cceab --- /dev/null +++ b/vilma/lib/Forms/DeleteDomainForm.php @@ -0,0 +1,31 @@ + + * + * See the enclosed file LICENSE for license information (BSD). If you did + * did not receive this file, see http://cvs.horde.org/co.php/vilma/LICENSE. + * + * $Horde: vilma/lib/Forms/DeleteDomainForm.php,v 1.1 2008/03/12 02:52:34 bklang Exp $ + * + * @author Ben Klang + * @package Vilma + */ +class DeleteDomainForm extends Horde_Form { + + function DeleteDomainForm(&$vars) + { + parent::Horde_Form($vars, _("Delete Domain")); + + $domain_record = $GLOBALS['vilma_driver']->getDomain($vars->get('domain_id')); + if (is_a($domain_record, 'PEAR_Error')) { + return $domain_record; + } + + $domain = $domain_record['domain_name']; + + /* Set up the form. */ + $this->setButtons(array(_("Delete"), _("Do not delete"))); + $this->addHidden('', 'domain_id', 'text', false); + $this->addVariable(sprintf(_("Delete domain \"%s\" and all associated email addresses?"), $domain), 'description', 'description', false); + } +} diff --git a/vilma/lib/Forms/EditDomainForm.php b/vilma/lib/Forms/EditDomainForm.php new file mode 100644 index 000000000..79fccba32 --- /dev/null +++ b/vilma/lib/Forms/EditDomainForm.php @@ -0,0 +1,43 @@ + + * + * See the enclosed file LICENSE for license information (BSD). If you did + * did not receive this file, see http://cvs.horde.org/co.php/vilma/LICENSE. + * + * $Horde: vilma/lib/Forms/EditDomainForm.php,v 1.10 2009/07/14 18:43:46 selsky Exp $ + * + * @author Ben Klang + * @package Vilma + */ + +class EditDomainForm extends Horde_Form { + + function EditDomainForm(&$vars) + { + /* Check if a form is being edited. */ + $editing = $vars->exists('domain_id'); + $domain = $_SESSION['vilma']['domain']; + parent::Horde_Form($vars, $editing ? _("Edit Domain") : _("New Domain")); + if ($editing && !$this->isSubmitted()) { + $domain = $GLOBALS['vilma_driver']->getDomain($vars->get('domain_id')); + if (is_a($domain, 'PEAR_Error')) { + return $domain; + } + $vars = new Horde_Variables($domain); + } + $vars->add('name', $domain['domain_name']); + $vars->add('transport', $domain['domain_transport']); + $vars->add('max_users', $domain['domain_max_users']); + $vars->add('quota', $domain['domain_quota']); + /* Set up the form. */ + $this->setButtons(true, true); + $this->addHidden('', 'domain_id', 'text', false); + $this->addVariable(_("Domain"), 'name', 'text', true); + require_once 'Horde/Array.php'; + $this->addVariable(_("Transport"), 'transport', 'enum', false, false, null, array(Horde_Array::valuesToKeys($GLOBALS['conf']['mta']['transports']))); + $this->addVariable(_("Max users"), 'max_users', 'int', false); + $this->addVariable(_("Quota"), 'quota', 'int', false, false, _("Value in MB")); + } + +} diff --git a/vilma/lib/Forms/EditUserForm.php b/vilma/lib/Forms/EditUserForm.php new file mode 100644 index 000000000..65792528f --- /dev/null +++ b/vilma/lib/Forms/EditUserForm.php @@ -0,0 +1,72 @@ + + * + * See the enclosed file LICENSE for license information (BSD). If you did + * did not receive this file, see http://cvs.horde.org/co.php/vilma/LICENSE. + * + * $Horde: vilma/lib/Forms/EditUserForm.php,v 1.6 2009/05/27 23:57:32 bklang Exp $ + * + * @author Ben Klang + * @package Vilma + */ + +class EditUserForm extends Horde_Form { + + function EditUserForm(&$vars) + { + global $vilma_driver; + + $type = $vars->get('type'); + $editing = ($vars->get('mode') == 'edit'); + if ($editing) { + if($type == 'group') { + $title = sprintf(_("Edit Group for \"%s\""), $vars->get('domain')); + } else if($type == 'forward') { + $title = sprintf(_("Edit Forward for \"%s\""), $vars->get('domain')); + } else { + $title = sprintf(_("Edit User for \"%s\""), $vars->get('domain')); + } + } else { + $title = sprintf(_("New User @%s"), $vars->get('domain')); + } + parent::Horde_Form($vars, $title); + + /* Set up the form. */ + $this->setButtons(true, true); + $this->addHidden('', 'address', 'text', false); + $this->addHidden('', 'mode', 'text', false); + $this->addHidden('', 'domain', 'text', false); + $this->addHidden('', 'id', 'text', false); + if ($editing) { + $this->addHidden('', 'user_name', 'text', false); + } + $name = "User Name"; + $type = $vars->get('type'); + if($type == 'group') { + $name = "Group Name"; + } else if($type == 'forward') { + $name = "Forward Name"; + } + $this->addVariable(_($name), 'user_name', 'text', true, $editing, _("Name must begin with an alphanumeric character, must contain only alphanumeric and '._-' characters, and must end with an alphanumeric character."), array('~^[a-zA-Z0-9]{1,1}[a-zA-Z0-9._-]*[a-zA-Z0-9]$~')); + if ($editing) { + $this->addVariable(_("Password"), 'password', 'passwordconfirm', false, false, _("Only enter a password if you wish to change this user's password")); + } else { + $this->addVariable(_("Password"), 'password', 'passwordconfirm', true); + } + $this->addVariable(_("Full Name"), 'user_full_name', 'text', true); + $attrs = $vilma_driver->getUserFormAttributes(); + foreach ($attrs as $attr) { + $v = &$this->addVariable($attr['label'], $attr['name'], + $attr['type'], $attr['required'], + $attr['readonly'], $attr['description'], + $attr['params']); + + if (!isset($attr['default'])) { + $v->setDefault($attr['default']); + } + } + //$this->addVariable(_("Target(s)"), 'target', 'text', false); + } + +} diff --git a/vilma/lib/MailboxDriver.php b/vilma/lib/MailboxDriver.php new file mode 100644 index 000000000..dff110ea3 --- /dev/null +++ b/vilma/lib/MailboxDriver.php @@ -0,0 +1,110 @@ + + * @package Vilma + */ +class Vilma_MailboxDriver { + + var $_params; + + /** + * Constructor. + * + * @access private + */ + function Vilma_MailboxDriver($params = array()) + { + $this->_params = $params; + } + + /** + * Creates a new mailbox driver instance. + * + * @param string $driver The name of the driver to create an instance of. + * @param array $params Driver-specific parameters. + * + * @return Vilma_MailboxDriver The new driver instance or a PEAR_Error. + */ + function &factory($driver, $params = array()) + { + require_once VILMA_BASE . '/lib/MailboxDriver/' . $driver . '.php'; + $class = 'Vilma_MailboxDriver_' . $driver; + $mailbox = &new $class($params); + return $mailbox; + } + + /** + * Returns a mailbox driver instance with the specified params, creating + * it if necessary. + * + * @param string $driver The name of the driver to create an instance of. + * @param array $params Driver-specific parameters. + * + * @return Vilma_MailboxDriver The new driver instance or a PEAR_Error. + */ + function &singleton($driver, $params = array()) + { + static $cache; + $key = serialize(array($driver, $params)); + if (!isset($cache[$key])) { + $ret = &Vilma_MailboxDriver::factory($driver, $params); + if (is_a($ret, 'PEAR_Error')) { + return $ret; + } + $cache[$key] = &$ret; + } + return $cache[$key]; + } + + /** + * Creates a new mailbox. + * + * This default implementation only returns an error. + * + * @param string $user The name of the mailbox to create + * @param string $domain The name of the domain in which to create the + * mailbox + * @return mixed True or PEAR_Error:: instance. + */ + function createMailbox($user, $domain) + { + return PEAR::raiseError(_("This driver cannot create mailboxes.")); + } + + /** + * Deletes an existing mailbox. + * + * This default implementation only returns an error. + * + * @param string $user The name of the mailbox to delete + * @param string $domain The name of the domain in which to delete the + * mailbox + * + * @return mixed True or PEAR_Error:: instance. + */ + function deleteMailbox($user, $domain) + { + return PEAR::raiseError(_("This driver cannot delete mailboxes.")); + } + + /** + * Checks whether a mailbox exists and is set up properly. + * + * @param string $user The name of the mailbox to check + * @param string $domain The mailbox's domain + * + * @return mixed True or PEAR_Error:: instance. + */ + function checkMailbox($user, $domain) + { + return true; + } + +} diff --git a/vilma/lib/MailboxDriver/hooks.php b/vilma/lib/MailboxDriver/hooks.php new file mode 100644 index 000000000..253fe8c99 --- /dev/null +++ b/vilma/lib/MailboxDriver/hooks.php @@ -0,0 +1,49 @@ + + * + * See the enclosed file LICENSE for license information (BSD). If you did not + * did not receive this file, see http://cvs.horde.org/co.php/vilma/LICENSE. + * + * $Horde: vilma/lib/MailboxDriver/hooks.php,v 1.7 2007/09/10 22:28:57 jan Exp $ + * + * @author Ben Klang + * @package Vilma + */ + +class Vilma_MailboxDriver_hooks extends Vilma_MailboxDriver { + + function Vilma_MailboxDriver_hooks($params) + { + Horde::loadConfiguration('hooks.php', null, 'vilma'); + } + + + function checkMailbox($user, $domain) + { + if (function_exists('_vilma_hook_checkMailbox')) { + return call_user_func('_vilma_hook_checkMailbox', $user, $domain); + } else { + return true; + } + } + + function createMailbox($user, $domain) + { + if (function_exists('_vilma_hook_createMailbox')) { + return call_user_func('_vilma_hook_createMailbox', $user, $domain); + } else { + return true; + } + } + + function deleteMailbox($user, $domain) + { + if (function_exists('_vilma_hook_deleteMailbox')) { + return call_user_func('_vilma_hook_deleteMailbox', $user, $domain); + } else { + return true; + } + } + +} diff --git a/vilma/lib/MailboxDriver/imap.php b/vilma/lib/MailboxDriver/imap.php new file mode 100644 index 000000000..e7ada119d --- /dev/null +++ b/vilma/lib/MailboxDriver/imap.php @@ -0,0 +1,81 @@ + + * @package Vilma + */ +class Vilma_MailboxDriver_imap extends Vilma_MailboxDriver { + + var $_imapAdmin = null; + + function _connect() + { + if (!is_null($this->_imapAdmin)) { + return false; + } + + // Catch c-client errors. + register_shutdown_function('imap_errors'); + register_shutdown_function('imap_alerts'); + + require_once 'Horde/IMAP/Admin.php'; + $admin = &new IMAP_Admin($this->_params); + if (is_a($admin, 'PEAR_Error')) { + return $admin; + } + + $this->_imapAdmin = $admin; + return true; + } + + function checkMailbox($user, $domain) + { + $res = $this->_connect(); + if (is_a($res, 'PEAR_Error')) { + return $res; + } + + if (!$this->_imapAdmin->mailboxExists($user . '@' . $domain)) { + return PEAR::raiseError(sprintf(_("Mailbox '%s@%s' does not exist."), $user, $domain)); + } + } + + function createMailbox($user, $domain) + { + $res = $this->_connect(); + if (is_a($res, 'PEAR_Error')) { + return $res; + } + + $mbox = $user . '@' . $domain; + + $res = $this->_imapAdmin->addMailbox($mbox); + if (is_a($res, 'PEAR_Error')) { + return $res; + } + + return true; + } + + function deleteMailbox($user, $domain) + { + $res = $this->_connect(); + if (is_a($res, 'PEAR_Error')) { + return $res; + } + + $res = $this->_imapAdmin->removeMailbox($user . '@' . $domain); + if (is_a($res, 'PEAR_Error')) { + return $res; + } + + return true; + } + +} diff --git a/vilma/lib/MailboxDriver/maildrop.php b/vilma/lib/MailboxDriver/maildrop.php new file mode 100644 index 000000000..b9e557c2e --- /dev/null +++ b/vilma/lib/MailboxDriver/maildrop.php @@ -0,0 +1,77 @@ + + * @package Vilma + */ +class Vilma_MailboxDriver_maildrop extends Vilma_MailboxDriver { + + function _getMailboxDir($user, $domain) + { + if (empty($this->_params['mail_dir_base'])) { + require_once 'PEAR.php'; + return PEAR::raiseError(_("No 'mail_dir_base' parameter specified to maildrop driver.")); + } + $dir = $this->_params['mail_dir_base']; + $usedomain = isset($this->_params['usedomain']) ? $this->_params['usedomain'] : false; + if ($usedomain) { + $dir .= '/' . $domain; + } + + return $dir . '/' . $user; + } + + function checkMailbox($user, $domain) + { + static $exists; + + $dir = $this->_getMailboxDir($user, $domain); + if (is_a($dir, 'PEAR_Error')) { + return $dir; + } + + if (!isset($exists[$dir])) { + $exists[$dir] = is_dir($dir); + } + + if (!$exists[$dir]) { + require_once 'PEAR.php'; + return PEAR::raiseError(sprintf(_("Maildrop directory \"%s\" does not exist."), $dir)); + } + + return true; + } + + function createMailbox($user, $domain) + { + $dir = $this->_getMailboxDir($user, $domain); + if (is_a($dir, 'PEAR_Error')) { + return $dir; + } + if (empty($this->_params['system_user'])) { + require_once 'PEAR.php'; + return PEAR::raiseError(_("No 'system_user' parameter specified to maildrop driver.")); + } + + $create_function = sprintf('sudo -u %s maildirmake %s', + escapeshellarg($this->_params['system_user']), + escapeshellarg($dir)); + exec($create_function); + return true; + } + + /** + * @TODO: Implement + */ + function deleteMailbox($user, $domain) + { + return true; + } + +} diff --git a/vilma/lib/MailboxDriver/null.php b/vilma/lib/MailboxDriver/null.php new file mode 100644 index 000000000..32557dab5 --- /dev/null +++ b/vilma/lib/MailboxDriver/null.php @@ -0,0 +1,81 @@ + + * @package Vilma + */ +class Vilma_MailboxDriver_null extends Vilma_MailboxDriver { + + function _getMailboxDir($user, $domain) + { + /* + if (empty($this->_params['mail_dir_base'])) { + require_once 'PEAR.php'; + return PEAR::raiseError(_("No 'mail_dir_base' parameter specified to maildrop driver.")); + } + $dir = $this->_params['mail_dir_base']; + $usedomain = isset($this->_params['usedomain']) ? $this->_params['usedomain'] : false; + if ($usedomain) { + $dir .= '/' . $domain; + } + + return $dir . '/' . $user; + */ + } + + function checkMailbox($user, $domain) + { + /* + static $exists; + + $dir = $this->_getMailboxDir($user, $domain); + if (is_a($dir, 'PEAR_Error')) { + return $dir; + } + + if (!isset($exists[$dir])) { + $exists[$dir] = is_dir($dir); + } + + if (!$exists[$dir]) { + require_once 'PEAR.php'; + return PEAR::raiseError(sprintf(_("Maildrop directory \"%s\" does not exist."), $dir)); + } + */ + + return true; + } + + function createMailbox($user, $domain) + { + $dir = $this->_getMailboxDir($user, $domain); + if (is_a($dir, 'PEAR_Error')) { + return $dir; + } + if (empty($this->_params['system_user'])) { + require_once 'PEAR.php'; + return PEAR::raiseError(_("No 'system_user' parameter specified to maildrop driver.")); + } + + $create_function = sprintf('sudo -u %s maildirmake %s', + escapeshellarg($this->_params['system_user']), + escapeshellarg($dir)); + exec($create_function); + return true; + } + + /** + * @TODO: Implement + */ + function deleteMailbox($user, $domain) + { + return true; + } + +} diff --git a/vilma/lib/Vilma.php b/vilma/lib/Vilma.php new file mode 100644 index 000000000..442b5ceba --- /dev/null +++ b/vilma/lib/Vilma.php @@ -0,0 +1,192 @@ + + * @author David Cummings + * @package Vilma + */ +class Vilma { + + /** + * Check whether the current user has administrative permissions over + * the requested domain at the given permissions level. + * Also checks to see if the user is a Vilma superadmin. + * If the user is a Horde admin they automatically have permission. + * + * @param string $domain Domain for which to check permissions + * @param int $permmask Permissions that must be set for the user + * + * @return boolean True if the user has the requested permission + */ + function hasPermission($domain, $permmask = null) + { + // FIXME Should this really be the case? Superadmin is more granular + if (Horde_Auth::isAdmin()) { + return true; + } + + if ($permmask === null) { + $permmask = PERMS_SHOW|PERMS_READ; + } + + # Default deny all permissions + $user = 0; + $superadmin = 0; + + $superadmin = $GLOBALS['perms']->hasPermission('vilma:domains', + Horde_Auth::getAuth(), $permmask); + + $user = $GLOBALS['perms']->hasPermission($permname, Horde_Auth::getAuth(), + $permmask); + + return ($superadmin | $user); + } + + function getUserMgrTypes() + { + return array( + 'all' => array( + 'singular' => _("All"), + 'plural' => _("All") ), + 'user' => array( + 'singular' => _("User"), + 'plural' => _("Users"), ), + 'alias' => array( + 'singular' => _("Alias"), + 'plural' => _("Aliases"), ), + //'grpfwd' => array( + // 'singular' => _("Group/Forward"), + // 'plural' => _("Groups and Forwards"), ), ); + 'group' => array( + 'singular' => _("Group"), + 'plural' => _("Groups"), ), + 'forward' => array( + 'singular' => _("Forward"), + 'plural' => _("Forwards"),), ); + } + + /** + * Create tabs to navigate the user manager area + * + * return object Horde_UI_Tabs object + */ + function getUserMgrTabs(&$vars) + { + $url = Horde::applicationUrl('users/index.php'); + $tabs = &new Horde_UI_Tabs('section', $vars); + foreach (Vilma::getUserMgrTypes() as $section => $desc) { + $tabs->addTab($desc['plural'], $url, $section); + } + return $tabs; + } + + /** + * Attempt to determine the current domain name based on current user or + * a domain_id passed in by form. + * + * @return mixed string domain on success, false on failure, PEAR::Error on error + */ + function getCurDomain() + { + // Domain is passed in by ID, which may or may not be the + // the same as the actual DNS domain name + $domain_id = Horde_Util::getFormData('domain_id'); + + if (!empty($domain_id)) { + // FIXME: Make sure this only runs once per page-load + $domain = $GLOBALS['vilma_driver']->getDomain($domain_id); + if (is_a($domain, 'PEAR_Error')) { + return $domain; + } + if (empty($domain['domain_name'])) { + $domain = false; + } + Vilma::setCurDomain($domain); + } elseif (isset($_SESSION['vilma']['domain'])) { + $domain = $_SESSION['vilma']['domain']; + } + + return $domain; + } + + /** + * Set the current domain + */ + function setCurDomain($domain) + { + $_SESSION['vilma']['domain'] = $domain; + } + + /** + * Strip the domain from an email address (leaving the Username) + * + * @param string $email Email address to strip (leaving the Username) + * + * @return string Username portion of supplied email address + */ + function stripUser($email) + { + list($user, $domain) = explode('@', $email); + return $user; + } + + /** + * Strip the username from an email address (leaving the domain) + * + * @param string $email Email address to strip (leaving the domain) + * + * @return string Domain portion of supplied email address + */ + function stripDomain($email) + { + $parts = explode('@', $email); + if (count($parts) == 2) { + $parts = explode(',', $parts[1]); + return $parts[0]; + } + return null; + } + + function &getMailboxDriver() + { + global $conf; + + require_once VILMA_BASE . '/lib/MailboxDriver.php'; + $driver = &Vilma_MailboxDriver::singleton($conf['mailboxes']['driver'], + $conf['mailboxes']['params']); + return $driver; + } + + /** + * Build Vilma's list of menu items. + */ + function getMenu($returnType = 'object') + { + $menu = new Horde_Menu(); + + $menu->add(Horde::applicationUrl('domains/index.php'), _("_Domains"), 'domain.png'); + + if (Vilma::getCurDomain()) { + $domain = $_SESSION['vilma']['domain']; + $url = Horde::applicationUrl('users/index.php'); + $tmp = Horde_Util::addParameter($url, 'domain_id', $domain['domain_id']); + $menu->add(Horde::applicationUrl($tmp), _($domain['domain_name']), 'domain.png'); + $menu->add(Horde::applicationUrl('users/edit.php'), _("New _Address"), 'user.png', $GLOBALS['registry']->getImageDir('horde')); + } else { + $menu->add(Horde::applicationUrl('domains/edit.php'), _("_New Domain"), 'domain.png'); + } + + if ($returnType == 'object') { + return $menu; + } else { + return $menu->render(); + } + } + +} diff --git a/vilma/lib/api.php b/vilma/lib/api.php new file mode 100644 index 000000000..e03c30f01 --- /dev/null +++ b/vilma/lib/api.php @@ -0,0 +1,68 @@ + + * + * See the enclosed file LICENSE for license information (BSD). If you did not + * did not receive this file, see http://cvs.horde.org/co.php/vilma/LICENSE. + * + * $Horde: vilma/lib/api.php,v 1.10 2007/06/27 17:24:16 jan Exp $ + * + * See the enclosed file COPYING for license information (GPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/gpl.html. + * + * @author Ben Klang + * @package Vilma + */ +@define('VILMA_BASE', dirname(__FILE__) . '/..'); + +$_services['perms'] = array( + 'args' => array(), + 'type' => '{urn:horde}stringArray'); + + +$_services['listDomains'] = array( + 'args' => array(), + 'type' => '{urn:horde}stringArray'); + +function _vilma_perms() +{ + static $perms = array(); + if (!empty($perms)) { + return $perms; + } + + require_once VILMA_BASE . '/lib/base.php'; + global $vilma_driver; + + $perms['tree']['vilma']['superadmin'] = false; + $perms['title']['vilma:superadmin'] = _("Super Administrator"); + + $domains = $vilma_driver->getDomains(); + + // Run through every domain + foreach ($domains as $domain) { + $d = $domain['domain_id']; + $perms['tree']['vilma']['domains'][$d] = false; + $perms['title']['vilma:domains:' . $d] = $domain['name']; + } + + return $perms; +} + +function _vilma_listDomains() +{ + require_once VILMA_BASE . '/lib/base.php'; + global $vilma_driver; + + return $vilma_driver->getDomains(); + $domains = array(); + foreach ($vilma_driver->getDomains() as $domain) { + $domains[] = $domain['domain_name']; + } + return $domains; +} \ No newline at end of file diff --git a/vilma/lib/base.php b/vilma/lib/base.php new file mode 100644 index 000000000..ca709481d --- /dev/null +++ b/vilma/lib/base.php @@ -0,0 +1,58 @@ + + * @author Ben Klang + * @package Vilma + */ + +/* Check for a prior definition of HORDE_BASE (perhaps by an auto_prepend_file + * definition for site customization). */ +if (!defined('HORDE_BASE')) { + @define('HORDE_BASE', dirname(__FILE__) . '/../..'); +} + +/* Load the Horde Framework core, and set up inclusion paths. */ +require_once HORDE_BASE . '/lib/core.php'; + +/* Registry. */ +$registry = Horde_Registry::singleton(); +try { + $registry->pushApp('vilma', !defined('AUTH_HANDLER')); +} catch (Horde_Exception $e) { + if ($e->getCode() == 'permission_denied') { + Horde::authenticationFailureRedirect(); + } + Horde::fatal($e, __FILE__, __LINE__, false); +} +$conf = &$GLOBALS['conf']; +@define('VILMA_TEMPLATES', $registry->get('templates')); + +/* Find the base file path of Vilma */ +@define('VILMA_BASE', dirname(__FILE__) . '/..'); + +/* Vilma base library */ +require_once VILMA_BASE . '/lib/Vilma.php'; +require_once VILMA_BASE . '/lib/Driver.php'; + +/* Templates */ +$template = &new Horde_Template(); + +/* Notification system. */ +$notification = &Horde_Notification::singleton(); +$notification->attach('status'); + +/* Navigation Tabs */ +require_once 'Horde/UI/Tabs.php'; + +/* Vilma driver. */ +$GLOBALS['vilma_driver'] = &Vilma_Driver::singleton(); + +// Get the currently active domain, possibly storing a change into the session +$curdomain = Vilma::getCurDomain(); diff --git a/vilma/lib/tests/driver.phpt b/vilma/lib/tests/driver.phpt new file mode 100644 index 000000000..7b830a994 --- /dev/null +++ b/vilma/lib/tests/driver.phpt @@ -0,0 +1,155 @@ +--TEST-- +Vilma_Driver_sql:: +--FILE-- +getMessage()); + return; + } + + $filtered_params = $conf['storage']['params']; + $filtered_params['tables']['domainkey'] = '__FOO'; + + $GLOBALS['filtered'] = &Vilma_Driver::singleton('sql', $filtered_params); + if (is_a($GLOBALS['filtered'], 'PEAR_Error')) { + printf(_("ERROR(2): %s\n"), $GLOBALS['filtered']->getMessage()); + return; + } + + echo "ok\n"; +} + +function checkSaveDomain() +{ + global $filtered, $unfiltered; + + echo "Checking saveDomain()... "; + + $domain = array('domain_name' => 'filtered.example.com', + 'domain_transport' => 'cyrus', + 'domain_admin' => 'test@filtered.example.com', + 'domain_max_users' => 15, + 'domain_quota' => 0); + + $res = $filtered->saveDomain($domain); + if (is_a($res, 'PEAR_Error')) { + var_dump($res); + printf(_("ERROR(1): %s\n"), $res->getMessage()); + return; + } + + $res = $filtered->getDomainByName('filtered.example.com'); + if (is_a($res, 'PEAR_Error')) { + printf(_("ERROR(2): %s\n"), $res->getMessage()); + return; + } + + if ($res['domain_name'] != 'filtered.example.com') { + echo _("ERROR(3): got wrong domain.\n"); + return; + } + if ($res['domain_transport'] != $domain['domain_transport'] || + $res['domain_admin'] != $domain['domain_admin'] || + $res['domain_max_users'] != $domain['domain_max_users'] || + $res['domain_quota'] != $domain['domain_quota']) { + echo _("ERROR(4): got some wrong info.\n"); + return; + } + + $domain['domain_name'] = 'unfiltered.example.com'; + $res = $unfiltered->saveDomain($domain); + if (is_a($res, 'PEAR_Error')) { + printf(_("ERROR(5): %s\n"), $res->getMessage()); + return; + } + + $res = $unfiltered->getDomainByName('unfiltered.example.com'); + if (is_a($res, 'PEAR_Error')) { + printf(_("ERROR(6): %s\n"), $res->getMessage()); + return; + } + + if ($res['domain_name'] != 'unfiltered.example.com') { + echo _("ERROR(7): got wrong domain.\n"); + return; + } + if ($res['domain_transport'] != $domain['domain_transport'] || + $res['domain_admin'] != $domain['domain_admin'] || + $res['domain_max_users'] != $domain['domain_max_users'] || + $res['domain_quota'] != $domain['domain_quota']) { + echo _("ERROR(8): got some wrong info.\n"); + return; + } + + echo "ok\n"; +} + +function checkDeleteDomain() +{ + global $filtered, $unfiltered; + + echo "Checking deleteDomain()... "; + + $domain = $filtered->getDomainByName('filtered.example.com'); + if (is_a($domain, 'PEAR_Error')) { + printf(_("ERROR(1): %s\n"), $domain->getMessage()); + return; + } + + $res = $filtered->deleteDomain($domain['domain_id']); + if (is_a($res, 'PEAR_Error')) { + printf(_("ERROR(2): %s\n"), $res->getMessage()); + return; + } + + $domain = $unfiltered->getDomainByName('unfiltered.example.com'); + if (is_a($domain, 'PEAR_Error')) { + printf(_("ERROR(3): %s\n"), $domain->getMessage()); + return; + } + + $res = $unfiltered->deleteDomain($domain['domain_id']); + if (is_a($res, 'PEAR_Error')) { + printf(_("ERROR(4): %s\n"), $res->getMessage()); + return; + } + + echo "ok\n"; +} + +--EXPECT-- +Load... ok +Checking construction... ok +Checking saveDomain()... ok +Checking deleteDomain()... ok diff --git a/vilma/lib/version.php b/vilma/lib/version.php new file mode 100644 index 000000000..9749581fa --- /dev/null +++ b/vilma/lib/version.php @@ -0,0 +1 @@ + diff --git a/vilma/locale/de_DE/LC_MESSAGES/vilma.mo b/vilma/locale/de_DE/LC_MESSAGES/vilma.mo new file mode 100644 index 0000000000000000000000000000000000000000..f74eec6360e6b71fbdb38a485281a828a6c819dd GIT binary patch literal 164726 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 a@Ih6iGJsoWMHb*fbC4h_%^H=gRR15}O(rV< literal 0 HcmV?d00001 diff --git a/vilma/locale/es_ES/LC_MESSAGES/vilma.mo b/vilma/locale/es_ES/LC_MESSAGES/vilma.mo new file mode 100644 index 0000000000000000000000000000000000000000..0b2a99869051ee8f2c9b673a42bbcc15245fe30a GIT binary patch literal 157725 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 Kl8pdC<^LDgEm2wk literal 0 HcmV?d00001 diff --git a/vilma/locale/lt_LT/LC_MESSAGES/vilma.mo b/vilma/locale/lt_LT/LC_MESSAGES/vilma.mo new file mode 100644 index 0000000000000000000000000000000000000000..fe6e86987a8e36177a63255d10bf0a6724fea317 GIT binary patch literal 146895 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�n{Ht-XhvuC9fsc;yy(C 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 N7u6UclO$o+{|{8-QxpII literal 0 HcmV?d00001 diff --git a/vilma/po/.cvsignore b/vilma/po/.cvsignore new file mode 100644 index 000000000..fd8854c89 --- /dev/null +++ b/vilma/po/.cvsignore @@ -0,0 +1 @@ +messages.po diff --git a/vilma/po/README b/vilma/po/README new file mode 100644 index 000000000..a985e94aa --- /dev/null +++ b/vilma/po/README @@ -0,0 +1 @@ +see horde/po/README diff --git a/vilma/po/de_DE.po b/vilma/po/de_DE.po new file mode 100644 index 000000000..15b3d98fe --- /dev/null +++ b/vilma/po/de_DE.po @@ -0,0 +1,500 @@ +# German translations for Vilma. +# Copyright 2004-2009 The Horde Project +# This file is distributed under the same license as the Vilma package. +# Jan Schneider , 2004-2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Vilma 0.1-cvs\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2008-04-01 14:58+0200\n" +"PO-Revision-Date: 2008-04-01 15:15+0200\n" +"Last-Translator: Jan Schneider \n" +"Language-Team: i18n@lists.horde.org\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: users/edit.php:53 +#, php-format +msgid "\"%s\" already has the maximum number of users allowed." +msgstr "\"%s\" hat bereits die maximale Benutzerzahl erreicht." + +#: lib/Driver/qmailldap.php:647 +msgid "Account Status" +msgstr "Kontostatus" + +#: lib/Driver/qmailldap.php:655 +msgid "Account is active" +msgstr "Konto ist aktiviert" + +#: lib/Driver/qmailldap.php:658 +msgid "Account is disabled" +msgstr "Konto ist deaktiviert" + +#: templates/users/index.html:13 +msgid "Address" +msgstr "Adresse" + +#: lib/Vilma.php:60 +msgid "Alias" +msgstr "Spitzname" + +#: lib/Driver/qmailldap.php:332 +#, php-format +msgid "Alias for %s" +msgstr "Alias für %s" + +#: lib/Vilma.php:61 +msgid "Aliases" +msgstr "Aliase" + +#: lib/Vilma.php:54 lib/Vilma.php:55 +msgid "All" +msgstr "Alle" + +#: lib/Driver/qmailldap.php:657 +msgid "Bounce Incoming Only" +msgstr "Nur Eingehendes abweisen" + +#: domains/delete.php:27 users/delete.php:34 users/delete.php:38 +#: virtuals/delete.php:34 virtuals/delete.php:38 +#: lib/Forms/DeleteDomainForm.php:27 +msgid "Delete" +msgstr "Löschen" + +#: domains/index.php:44 lib/Forms/DeleteDomainForm.php:17 +msgid "Delete Domain" +msgstr "Domain löschen" + +#: users/index.php:83 users/delete.php:31 virtuals/index.php:55 +msgid "Delete User" +msgstr "Benutzer löschen" + +#: virtuals/delete.php:31 +msgid "Delete Virtual Email Address" +msgstr "Virtuelle E-Mail-Adresse löschen" + +#: lib/Forms/DeleteDomainForm.php:29 +#, php-format +msgid "Delete domain \"%s\" and all associated email addresses?" +msgstr "Domain \"%s\" und alle dazugehörigen E-Mail-Adressen löschen?" + +#: virtuals/delete.php:36 +#, php-format +msgid "Delete the virtual email address \"%s\" => \"%s\"?" +msgstr "Virtuelle E-Mail-Adresse \"%s\" => \"%s\" löschen?" + +#: users/delete.php:36 +#, php-format +msgid "Delete user \"%s\" and all associated virtual email addresses?" +msgstr "" +"Benutzer \"%s\" und alle dazugehörigen virtuellen E-Mail-Adressen löschen?" + +#: virtuals/edit.php:64 templates/virtuals/index.html:20 +msgid "Destination" +msgstr "Ziel" + +#: virtuals/edit.php:54 +msgid "Destination type" +msgstr "Zieltyp" + +#: lib/Driver/qmailldap.php:656 +msgid "Disable Delivery Only" +msgstr "Nur Ausgehendes abweisen" + +#: config/prefs.php.dist:10 +msgid "Display details" +msgstr "Anzeigedetails" + +#: config/prefs.php.dist:9 +msgid "Display listings" +msgstr "Anzeigelisten" + +#: domains/delete.php:41 users/delete.php:34 users/delete.php:52 +#: virtuals/delete.php:34 virtuals/delete.php:52 +#: lib/Forms/DeleteDomainForm.php:27 +msgid "Do not delete" +msgstr "Nicht löschen" + +#: lib/Forms/EditDomainForm.php:32 templates/domains/index.html:16 +msgid "Domain" +msgstr "Domain" + +#: lib/Driver.php:229 +msgid "" +"Domain added but an error was encountered while calling the configured " +"hook. Contact your administrator for futher assistance." +msgstr "" +"Die Domain wurde hinzugefügt, aber beim Aufruf des konfigurierten Hooks ist " +"ein Fehler aufgetreten. Bitte wenden Sie sich an Ihren Systemadministrator " +"für weitere Hilfe." + +#: domains/delete.php:35 +msgid "Domain deleted." +msgstr "Domain gelöscht." + +#: domains/delete.php:42 +msgid "Domain not deleted." +msgstr "Domain nicht gelöscht." + +#: domains/edit.php:35 +msgid "Domain saved." +msgstr "Domain gespeichert." + +#: domains/index.php:45 lib/Forms/EditDomainForm.php:20 +msgid "Edit Domain" +msgstr "Domain bearbeiten" + +#: users/index.php:84 virtuals/index.php:56 +msgid "Edit User" +msgstr "Benutzer bearbeiten" + +#: lib/Forms/EditUserForm.php:22 +#, php-format +msgid "Edit User for \"%s\"" +msgstr "Benutzer von \"%s\" bearbeiten" + +#: virtuals/edit.php:47 +msgid "Edit Virtual Email Address" +msgstr "Virtuelle E-Mail-Adresse bearbeiten" + +#: virtuals/edit.php:53 +#, php-format +msgid "" +"Enter a virtual email address @%s and then indicate below where mail sent to " +"that address is to be delivered. The address must begin with an " +"alphanumerical character, it must contain only alphanumerical and '._-' " +"characters, and must end with an alphanumerical character." +msgstr "" +"Geben Sie eine virtuelle E-Mail-Adresse für die \"@%s\" Domain an und tragen " +"Sie unten ein, wohin Nachrichten, die an diese Adresse geschickt werden, " +"ausgeliefert werden sollen. E-Mail-Adressen müssen mit einem " +"alphanumerischen Zeichen beginnen und enden und dürfen nur alphanumerische " +"und die Zeichen \"._-\" enthalten." + +#: lib/Driver/qmailldap.php:593 +#, php-format +msgid "Error deleting account from LDAP: %s" +msgstr "Fehler beim Löschen des Kontos in LDAP: %s" + +#: domains/delete.php:33 +#, php-format +msgid "Error deleting domain. %s." +msgstr "Fehler beim Löschen der Domain. %s." + +#: users/delete.php:44 +#, php-format +msgid "Error deleting user. %s." +msgstr "Fehler beim Löschen des Benutzers. %s." + +#: virtuals/delete.php:44 +#, php-format +msgid "Error deleting virtual email. %s." +msgstr "Fehler beim Löschen der virtuellen E-Mail-Adresse. %s." + +#: lib/Driver/qmailldap.php:170 lib/Driver/qmailldap.php:175 +#, php-format +msgid "Error in LDAP search: %s" +msgstr "Fehler bei LDAP-Suche: %s" + +#: users/edit.php:35 +#, php-format +msgid "Error reading address information from backend: %s" +msgstr "Fehler beim Lesen der der Adressinformationen vom Backend: %s" + +#: lib/Driver/qmailldap.php:583 +#, php-format +msgid "Error retrieving LDAP results: %s" +msgstr "Fehler beim Lesen LDAP-Ergebnisse: %s" + +#: lib/Driver/qmailldap.php:308 lib/Driver/qmailldap.php:396 +#: lib/Driver/qmailldap.php:468 +#, php-format +msgid "Error returning LDAP results: %s" +msgstr "Fehler bei der Rückgabe der LDAP-Ergebnisse: %s" + +#: lib/Driver.php:195 +msgid "Error running authentication update script." +msgstr "Fehler beim Ausführen des Update-Skripts." + +#: domains/edit.php:33 +#, php-format +msgid "Error saving domain: %s." +msgstr "Fehler beim Speichern der Domain: %s." + +#: users/edit.php:64 +#, php-format +msgid "Error saving user. %s" +msgstr "Fehler beim Speichern des Benutzers. %s" + +#: virtuals/edit.php:77 +#, php-format +msgid "Error saving virtual email. %s." +msgstr "Fehler beim Speichern der virtuellen E-Mail-Adresse. %s." + +#: lib/Driver/qmailldap.php:302 lib/Driver/qmailldap.php:390 +#: lib/Driver/qmailldap.php:462 lib/Driver/qmailldap.php:577 +#, php-format +msgid "Error searching LDAP: %s" +msgstr "Fehler bei der LDAP-Suche: %s" + +#: lib/Driver.php:280 +msgid "Error while calling hook to delete domain." +msgstr "Fehler beim Aufruf des Hooks zum Löschen der Domain." + +#: lib/Forms/EditUserForm.php:41 templates/users/index.html:16 +msgid "Full Name" +msgstr "Vollständiger Name" + +#: lib/Vilma.php:63 +msgid "Group/Forward" +msgstr "Gruppe/Weiterleitung" + +#: lib/Vilma.php:64 +msgid "Groups and Forwards" +msgstr "Gruppen und Weiterleitungen" + +#: config/prefs.php.dist:20 +msgid "How many domain to display per page." +msgstr "Anzahl der Domains pro Seite." + +#: virtuals/edit.php:56 +msgid "Local user" +msgstr "Lokaler Benutzer" + +#: lib/MailboxDriver/imap.php:45 +#, php-format +msgid "Mailbox '%s@%s' does not exist." +msgstr "Die Mailbox '%s@%s' existiert nicht." + +#: lib/MailboxDriver/maildrop.php:45 +#, php-format +msgid "Maildrop directory \"%s\" does not exist." +msgstr "Das Maildrop-Verzeichnis \"%s\" existiert nicht." + +#: templates/domains/index.html:19 +msgid "Max Users" +msgstr "Maximale Benutzerzahl" + +#: lib/Forms/EditDomainForm.php:35 +msgid "Max users" +msgstr "Maximale Benutzerzahl" + +#: users/index.php:70 +msgid "Maximum Users" +msgstr "Maximale Benutzerzahl" + +#: lib/Driver/qmailldap.php:472 +msgid "" +"More than one DN returned for this alias. Please contact an administrator " +"to resolve this error." +msgstr "" +"Mehr als eine DN für diesen Alias gefunden. Bitte wenden Sie sich an einen " +"Administrator, um diesen Fehler zu beheben." + +#: lib/Driver/qmailldap.php:587 +msgid "More than one DN returned. Aborting delete operation." +msgstr "Mehr als eine DN zurückgeliefert. Löschvorgang abgebrochen." + +#: lib/Forms/EditUserForm.php:35 +msgid "" +"Name must begin with an alphanumeric character, must contain only " +"alphanumeric and '._-' characters, and must end with an alphanumeric " +"character." +msgstr "" +"Der Name muss mit einem alphanumerischen Zeichen beginnen und enden und darf " +"nur alphanumerische und die Zeichen \"._-\" enthalten." + +#: lib/Forms/EditDomainForm.php:20 +msgid "New Domain" +msgstr "Neue Domain" + +#: lib/Forms/EditUserForm.php:24 +#, php-format +msgid "New User @%s" +msgstr "Neuer Benutzer für Domain @%s" + +#: virtuals/index.php:48 +msgid "New Virtual Email" +msgstr "Neue virtuelle E-Mail-Adresse" + +#: virtuals/edit.php:47 +msgid "New Virtual Email Address" +msgstr "Neue virtuelle E-Mail-Adresse" + +#: lib/Vilma.php:169 +msgid "New _Address" +msgstr "Neue _Adresse" + +#: lib/MailboxDriver/maildrop.php:19 +msgid "No 'mail_dir_base' parameter specified to maildrop driver." +msgstr "" +"Kein 'mail_dir_base' Parameter in der Maildrop-Treiber-Konfiguration " +"angegeben." + +#: lib/MailboxDriver/maildrop.php:60 +msgid "No 'system_user' parameter specified to maildrop driver." +msgstr "" +"Kein 'system_user' Parameter in der Maildrop-Treiber-Konfiguration angegeben." +"<" + +#: lib/Driver.php:108 +#, php-format +msgid "No such address %s of type %s found." +msgstr "Adresse %s vom Typ %s nicht gefunden." + +#: lib/Driver.php:374 +#, php-format +msgid "No such backend \"%s\" found" +msgstr "Ein Backend namens \"%s\" konnte nicht gefunden werden" + +#: users/edit.php:74 +msgid "" +"No virtual email address set up for this user. You should set up at least " +"one virtual email address if this user is to receive any emails." +msgstr "" +"Für diesen Benutzer wurden keine virtuellen E-Mail-Adressen eingerichtet. " +"Sie sollten mindestens eine E-Mail-Adresse einrichten, wenn dieser Benutzer " +"E-Mails empfangen können soll." + +#: lib/Driver.php:245 lib/Driver.php:294 +msgid "Not implemented." +msgstr "Nicht implementiert." + +#: lib/Forms/EditUserForm.php:37 +msgid "Only enter a password if you wish to change this user's password" +msgstr "" +"Geben Sie nur ein Passwort ein, wenn Sie das Passwort dieses Benutzers " +"ändern möchten" + +#: lib/Forms/EditUserForm.php:37 lib/Forms/EditUserForm.php:39 +msgid "Password" +msgstr "Passwort" + +#: lib/Driver/sql.php:465 +msgid "Password must be supplied when creating a new user." +msgstr "Passwort muss beim Erstellen eines neuen Benutzers angegeben werden." + +#: lib/Forms/EditDomainForm.php:36 +msgid "Quota" +msgstr "Speicherplatz-Kontingent" + +#: virtuals/edit.php:57 +msgid "Remote address" +msgstr "Externe Adresse" + +#: virtuals/edit.php:61 +msgid "Remote e-mail address" +msgstr "Externe E-Mail-Adresse" + +#: config/prefs.php.dist:11 +msgid "Set default display parameters." +msgstr "Legen Sie Ihre Standard-Anzeigeeinstellungen fest." + +#: templates/users/index.html:22 +msgid "Status" +msgstr "Status" + +#: lib/api.php:43 +msgid "Super Administrator" +msgstr "Super-Administrator" + +#: lib/MailboxDriver.php:78 +msgid "This driver cannot create mailboxes." +msgstr "Dieses Treiber kann keine Mailboxen anlegen." + +#: lib/MailboxDriver.php:94 +msgid "This driver cannot delete mailboxes." +msgstr "Dieser Treiber kann keine Mailboxen löschen." + +#: lib/Forms/EditDomainForm.php:34 +msgid "Transport" +msgstr "Transport" + +#: templates/users/index.html:19 +msgid "Type" +msgstr "Typ" + +#: lib/Driver/qmailldap.php:696 +msgid "Unable to bind to the LDAP server. Check authentication credentials." +msgstr "" +"Anbindung an LDAP-Server fehlgeschlagen. Überprüfen Sie die " +"Authentifizierungsdaten." + +#: lib/Driver/qmailldap.php:691 +msgid "Unable to set LDAP protocol version" +msgstr "Die LDAP-Protokollversion konnte nicht gesetzt werden" + +#: lib/Driver.php:199 +msgid "Unknown error running authentication update script." +msgstr "Unbekannter Fehler beim Ausführen des Update-Skripts." + +#: lib/Vilma.php:57 +msgid "User" +msgstr "Benutzer" + +#: lib/Forms/EditUserForm.php:35 +msgid "User Name" +msgstr "Benutzername" + +#: users/delete.php:46 +msgid "User deleted." +msgstr "Benutzer gelöscht." + +#: users/edit.php:66 +msgid "User details saved." +msgstr "Benutzerdetails gespeichert." + +#: lib/Driver.php:132 +msgid "User disabled." +msgstr "Benutzer deaktiviert." + +#: users/delete.php:53 +msgid "User not deleted." +msgstr "Benutzer wurde nicht gelöscht." + +#: lib/Driver.php:155 +msgid "User ready." +msgstr "Benutzer bereit." + +#: virtuals/index.php:51 lib/Vilma.php:58 +msgid "Users" +msgstr "Benutzer" + +#: lib/Forms/EditDomainForm.php:36 +msgid "Value in MB" +msgstr "Wert in MB" + +#: lib/Driver.php:210 +msgid "Vilma_Driver::deleteUser(): Method Not Implemented." +msgstr "Vilma_Driver::deleteUser(): Methode nicht implementiert." + +#: virtuals/edit.php:53 +msgid "Virtual Email" +msgstr "Virtuelle E-Mail-Adresse" + +#: templates/virtuals/index.html:17 +msgid "Virtual Email Address" +msgstr "Virtuelle E-Mail-Adresse" + +#: virtuals/delete.php:46 +msgid "Virtual email deleted." +msgstr "Virtuelle E-Mail-Adresse gelöscht." + +#: virtuals/delete.php:53 +msgid "Virtual email not deleted." +msgstr "Virtuelle E-Mail-Adresse nicht gelöscht." + +#: virtuals/edit.php:79 +msgid "Virtual email saved." +msgstr "Virtuelle E-Mail-Adresse gespeichert." + +#: lib/Vilma.php:166 +msgid "_Domains" +msgstr "_Domains" + +#: lib/Vilma.php:171 +msgid "_New Domain" +msgstr "_Neue Domain" diff --git a/vilma/po/es_ES.po b/vilma/po/es_ES.po new file mode 100644 index 000000000..5fea8dfae --- /dev/null +++ b/vilma/po/es_ES.po @@ -0,0 +1,501 @@ +# Spanish translations for vilma package +# Traducciones al español para el paquete vilma. +# Copyright 2008-2009 The Horde Project +# This file is distributed under the same license as the vilma package. +# Automatically generated, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Vilma 0.2-cvs\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2008-03-20 09:49+0100\n" +"PO-Revision-Date: 2008-03-20 09:49+0100\n" +"Last-Translator: Manuel P. Ayala \n" +"Language-Team: i18n@lists.horde.org\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: users/edit.php:53 +#, php-format +msgid "\"%s\" already has the maximum number of users allowed." +msgstr "\"%s\" ha alcanzado ya el número máximo de usuarios permitidos." + +#: lib/Driver/qmailldap.php:647 +msgid "Account Status" +msgstr "Estado de la cuenta" + +#: lib/Driver/qmailldap.php:655 +msgid "Account is active" +msgstr "La cuenta está activa" + +#: lib/Driver/qmailldap.php:658 +msgid "Account is disabled" +msgstr "La cuenta está deshabilitada" + +#: templates/users/index.html:13 +msgid "Address" +msgstr "Dirección" + +#: lib/Vilma.php:60 +msgid "Alias" +msgstr "Apodo" + +#: lib/Driver/qmailldap.php:332 +#, php-format +msgid "Alias for %s" +msgstr "Apodo de %s" + +#: lib/Vilma.php:61 +msgid "Aliases" +msgstr "Apodos" + +#: lib/Vilma.php:54 lib/Vilma.php:55 +msgid "All" +msgstr "Todos" + +#: lib/Driver/qmailldap.php:657 +msgid "Bounce Incoming Only" +msgstr "Rebotar sólo entrantes" + +#: virtuals/delete.php:34 virtuals/delete.php:38 users/delete.php:34 +#: users/delete.php:38 domains/delete.php:27 lib/Forms/DeleteDomainForm.php:27 +msgid "Delete" +msgstr "Eliminar" + +#: domains/index.php:44 lib/Forms/DeleteDomainForm.php:17 +msgid "Delete Domain" +msgstr "Eliminar dominio" + +#: virtuals/index.php:55 users/index.php:83 users/delete.php:31 +msgid "Delete User" +msgstr "Eliminar usuario" + +#: virtuals/delete.php:31 +msgid "Delete Virtual Email Address" +msgstr "Eliminar dirección electrónica virtual" + +#: lib/Forms/DeleteDomainForm.php:29 +#, php-format +msgid "Delete domain \"%s\" and all associated email addresses?" +msgstr "" +"¿Eliminar el dominio \"%s\" y todas las direcciones electrónicas asociadas?" + +#: virtuals/delete.php:36 +#, php-format +msgid "Delete the virtual email address \"%s\" => \"%s\"?" +msgstr "¿Eliminar la dirección electrónica virtual \"%s\" => \"%s\"?" + +#: users/delete.php:36 +#, php-format +msgid "Delete user \"%s\" and all associated virtual email addresses?" +msgstr "" +"¿Eliminar el usuario \"%s\" y todas sus direcciones electrónicas virtuales " +"asociadas?" + +#: virtuals/edit.php:64 templates/virtuals/index.html:20 +msgid "Destination" +msgstr "Destinatario" + +#: virtuals/edit.php:54 +msgid "Destination type" +msgstr "Tipo de destinatario" + +#: lib/Driver/qmailldap.php:656 +msgid "Disable Delivery Only" +msgstr "Desactivar sólo la distribución" + +#: config/.bak/prefs.php.dist:10 +msgid "Display details" +msgstr "Mostrar detalles" + +#: config/.bak/prefs.php.dist:9 +msgid "Display listings" +msgstr "Mostrar listados" + +#: virtuals/delete.php:34 virtuals/delete.php:52 users/delete.php:34 +#: users/delete.php:52 domains/delete.php:41 lib/Forms/DeleteDomainForm.php:27 +msgid "Do not delete" +msgstr "No eliminar" + +#: lib/Forms/EditDomainForm.php:32 templates/domains/index.html:16 +msgid "Domain" +msgstr "Dominio" + +#: lib/Driver.php:229 +msgid "" +"Domain added but an error was encountered while calling the configured " +"hook. Contact your administrator for futher assistance." +msgstr "" +"Se añadió el dominio pero se produjo un error al llamar al gancho " +"configurado. Para más información póngase en contacto con el administrador." + +#: domains/delete.php:35 +msgid "Domain deleted." +msgstr "Se ha eliminado el dominio." + +#: domains/delete.php:42 +msgid "Domain not deleted." +msgstr "No se ha eliminado el dominio." + +#: domains/edit.php:35 +msgid "Domain saved." +msgstr "Se ha guardado el dominio." + +#: domains/index.php:45 lib/Forms/EditDomainForm.php:20 +msgid "Edit Domain" +msgstr "Modificar dominio" + +#: virtuals/index.php:56 users/index.php:84 +msgid "Edit User" +msgstr "Modificar usuario" + +#: lib/Forms/EditUserForm.php:22 +#, php-format +msgid "Edit User for \"%s\"" +msgstr "Modificar usuario de \"%s\"" + +#: virtuals/edit.php:47 +msgid "Edit Virtual Email Address" +msgstr "Modificar dirección electrónica virtual" + +#: virtuals/edit.php:53 +#, php-format +msgid "" +"Enter a virtual email address @%s and then indicate below where mail sent to " +"that address is to be delivered. The address must begin with an " +"alphanumerical character, it must contain only alphanumerical and '._-' " +"characters, and must end with an alphanumerical character." +msgstr "" +"Introduzca una dirección de correo virtual @%s e indique a continuación a " +"dónde enviar el correo de esa dirección. Las direcciones tienen que empezar " +"por un carácter alfanumérico, sólo pueden contener caracteres alfanuméricos " +"y '._-' , y tienen que acabar por un carácter alfanumérico." + +#: lib/Driver/qmailldap.php:593 +#, php-format +msgid "Error deleting account from LDAP: %s" +msgstr "Error al eliminar la cuenta de LDAP: %s" + +#: domains/delete.php:33 +#, php-format +msgid "Error deleting domain. %s." +msgstr "Error al eliminar el dominio. %s." + +#: users/delete.php:44 +#, php-format +msgid "Error deleting user. %s." +msgstr "Error al eliminar el usuario. %s." + +#: virtuals/delete.php:44 +#, php-format +msgid "Error deleting virtual email. %s." +msgstr "Error al eliminar la dirección de correo virtual. %s." + +#: lib/Driver/qmailldap.php:170 lib/Driver/qmailldap.php:175 +#, php-format +msgid "Error in LDAP search: %s" +msgstr "Error en la búsqueda LDAP: %s" + +#: users/edit.php:35 +#, php-format +msgid "Error reading address information from backend: %s" +msgstr "Error leyendo la información de la dirección desde el motor: %s" + +#: lib/Driver/qmailldap.php:583 +#, php-format +msgid "Error retrieving LDAP results: %s" +msgstr "Error recuperando los resultados LDAP: %s" + +#: lib/Driver/qmailldap.php:308 lib/Driver/qmailldap.php:396 +#: lib/Driver/qmailldap.php:468 +#, php-format +msgid "Error returning LDAP results: %s" +msgstr "Error en la devolución de los resultados LDAP: %s" + +#: lib/Driver.php:195 +msgid "Error running authentication update script." +msgstr "Error al ejecutar el guión de actualización de autentificación." + +#: domains/edit.php:33 +#, php-format +msgid "Error saving domain: %s." +msgstr "Error al guardar el dominio: %s." + +#: users/edit.php:64 +#, php-format +msgid "Error saving user. %s" +msgstr "Error al guardar el usuario. %s" + +#: virtuals/edit.php:77 +#, php-format +msgid "Error saving virtual email. %s." +msgstr "Error al guardar la dirección electrónica virtual. %s." + +#: lib/Driver/qmailldap.php:302 lib/Driver/qmailldap.php:390 +#: lib/Driver/qmailldap.php:462 lib/Driver/qmailldap.php:577 +#, php-format +msgid "Error searching LDAP: %s" +msgstr "Error buscando en LDAP: %s" + +#: lib/Driver.php:280 +msgid "Error while calling hook to delete domain." +msgstr "Error al llamar al gancho de eliminación del dominio." + +#: lib/Forms/EditUserForm.php:41 templates/users/index.html:16 +msgid "Full Name" +msgstr "Nombre completo" + +#: lib/Vilma.php:63 +msgid "Group/Forward" +msgstr "Grupo/Reenvío" + +#: lib/Vilma.php:64 +msgid "Groups and Forwards" +msgstr "Grupos y reenvíos" + +#: config/.bak/prefs.php.dist:20 +msgid "How many domain to display per page." +msgstr "Cuántos dominios mostrar por página." + +#: virtuals/edit.php:56 +msgid "Local user" +msgstr "Usuario local" + +#: lib/MailboxDriver/imap.php:45 +#, php-format +msgid "Mailbox '%s@%s' does not exist." +msgstr "No existe el buzón '%s@%s'." + +#: lib/MailboxDriver/maildrop.php:45 +#, php-format +msgid "Maildrop directory \"%s\" does not exist." +msgstr "No existe el directorio maildrop \"%s\"." + +#: templates/domains/index.html:19 +msgid "Max Users" +msgstr "Número máximo de usuarios" + +#: lib/Forms/EditDomainForm.php:35 +msgid "Max users" +msgstr "Número máximo de usuarios" + +#: users/index.php:70 +msgid "Maximum Users" +msgstr "Número máximo de usuarios" + +#: lib/Driver/qmailldap.php:472 +msgid "" +"More than one DN returned for this alias. Please contact an administrator " +"to resolve this error." +msgstr "" +"Este apodo devolvió más de un DN. Póngase en contacto con el administrador " +"para resolver este error." + +#: lib/Driver/qmailldap.php:587 +msgid "More than one DN returned. Aborting delete operation." +msgstr "Se ha devuelto más de un DN. Anulando la operación de eliminación." + +#: lib/Forms/EditUserForm.php:35 +msgid "" +"Name must begin with an alphanumeric character, must contain only " +"alphanumeric and '._-' characters, and must end with an alphanumeric " +"character." +msgstr "" +"El nombre tiene que empezar por un carácter alfanumérico, tiene que contener " +"sólo caracteres alfanuméricos o '._-' y tiene que terminar por un carácter " +"alfanumérico." + +#: lib/Forms/EditDomainForm.php:20 +msgid "New Domain" +msgstr "Añadir dominio" + +#: lib/Forms/EditUserForm.php:24 +#, php-format +msgid "New User @%s" +msgstr "Añadir usuario @%s" + +#: virtuals/index.php:48 +msgid "New Virtual Email" +msgstr "Añadir correo virtual" + +#: virtuals/edit.php:47 +msgid "New Virtual Email Address" +msgstr "Añadir dirección de correo virtual" + +#: lib/Vilma.php:169 +msgid "New _Address" +msgstr "Añadir _dirección" + +#: lib/MailboxDriver/maildrop.php:19 +msgid "No 'mail_dir_base' parameter specified to maildrop driver." +msgstr "" +"No se ha especificado el parámetro 'mail_dir_base' en el controlador de " +"descarga de correo." + +#: lib/MailboxDriver/maildrop.php:60 +msgid "No 'system_user' parameter specified to maildrop driver." +msgstr "" +"No se ha especificado el parámetro 'system_user' en el controlador de " +"descarga de correo." + +#: lib/Driver.php:108 +#, php-format +msgid "No such address %s of type %s found." +msgstr "No se encontró una dirección %s de tipo %s." + +#: lib/Driver.php:374 +#, php-format +msgid "No such backend \"%s\" found" +msgstr "No se encontró el motor \"%s\"" + +#: users/edit.php:74 +msgid "" +"No virtual email address set up for this user. You should set up at least " +"one virtual email address if this user is to receive any emails." +msgstr "" +"A este usuario no se le ha configurado una dirección de correo vitual. Tiene " +"que configurar al menos una si este usuario va a recibir correo." + +#: lib/Driver.php:245 lib/Driver.php:294 +msgid "Not implemented." +msgstr "Sin desarrollar." + +#: lib/Forms/EditUserForm.php:37 +msgid "Only enter a password if you wish to change this user's password" +msgstr "" +"Introduzca un a contraseña sólo si desea cambiar la contraseña de este " +"usuario" + +#: lib/Forms/EditUserForm.php:37 lib/Forms/EditUserForm.php:39 +msgid "Password" +msgstr "Contraseña" + +#: lib/Driver/sql.php:465 +msgid "Password must be supplied when creating a new user." +msgstr "Al crear un usuario hay que introducir una contraseña." + +#: lib/Forms/EditDomainForm.php:36 +msgid "Quota" +msgstr "Espacio asignado" + +#: virtuals/edit.php:57 +msgid "Remote address" +msgstr "Dirección remota" + +#: virtuals/edit.php:61 +msgid "Remote e-mail address" +msgstr "Dirección electrónica remota" + +#: config/.bak/prefs.php.dist:11 +msgid "Set default display parameters." +msgstr "Define parámetros de visualización por omisión." + +#: templates/users/index.html:22 +msgid "Status" +msgstr "Estado" + +#: lib/api.php:43 +msgid "Super Administrator" +msgstr "Super administrador" + +#: lib/MailboxDriver.php:78 +msgid "This driver cannot create mailboxes." +msgstr "Este controlador no puede crear buzones." + +#: lib/MailboxDriver.php:94 +msgid "This driver cannot delete mailboxes." +msgstr "Este controlador no puede eliminar buzones." + +#: lib/Forms/EditDomainForm.php:34 +msgid "Transport" +msgstr "Transporte" + +#: templates/users/index.html:19 +msgid "Type" +msgstr "Tipo" + +#: lib/Driver/qmailldap.php:696 +msgid "Unable to bind to the LDAP server. Check authentication credentials." +msgstr "" +"No se pudo vincular al servidor LDAP. Compruebe las credenciales de " +"autentificación." + +#: lib/Driver/qmailldap.php:691 +msgid "Unable to set LDAP protocol version" +msgstr "No se puede establecer la versión del protocolo LDAP" + +#: lib/Driver.php:199 +msgid "Unknown error running authentication update script." +msgstr "" +"Se ha producido un error desconocido al ejecutar el guión de actualización " +"de autentificación." + +#: lib/Vilma.php:57 +msgid "User" +msgstr "Usuario" + +#: lib/Forms/EditUserForm.php:35 +msgid "User Name" +msgstr "Nombre del usuario" + +#: users/delete.php:46 +msgid "User deleted." +msgstr "Se ha eliminado el usuario." + +#: users/edit.php:66 +msgid "User details saved." +msgstr "Se han guardado los detalles del usuario." + +#: lib/Driver.php:132 +msgid "User disabled." +msgstr "Usuario deshabilitado." + +#: users/delete.php:53 +msgid "User not deleted." +msgstr "No se ha eliminado el usuario" + +#: lib/Driver.php:155 +msgid "User ready." +msgstr "El usuario está listo." + +#: virtuals/index.php:51 lib/Vilma.php:58 +msgid "Users" +msgstr "Usuarios" + +#: lib/Forms/EditDomainForm.php:36 +msgid "Value in MB" +msgstr "Valor en MB" + +#: lib/Driver.php:210 +msgid "Vilma_Driver::deleteUser(): Method Not Implemented." +msgstr "Vilma_Driver::deleteUser(): Método no desarrollado." + +#: virtuals/edit.php:53 +msgid "Virtual Email" +msgstr "Correo virtual" + +#: templates/virtuals/index.html:17 +msgid "Virtual Email Address" +msgstr "Dirección de correo virtual" + +#: virtuals/delete.php:46 +msgid "Virtual email deleted." +msgstr "Dirección virtual eliminada." + +#: virtuals/delete.php:53 +msgid "Virtual email not deleted." +msgstr "No se ha eliminado la dirección virtual." + +#: virtuals/edit.php:79 +msgid "Virtual email saved." +msgstr "Se ha guardado la dirección virtual." + +#: lib/Vilma.php:166 +msgid "_Domains" +msgstr "_Dominios" + +#: lib/Vilma.php:171 +msgid "_New Domain" +msgstr "_Añadir dominio" diff --git a/vilma/po/it_IT.po b/vilma/po/it_IT.po new file mode 100644 index 000000000..05482885f --- /dev/null +++ b/vilma/po/it_IT.po @@ -0,0 +1,367 @@ +# Italian translations for Mailadmin package. +# Copyright 2003-2009 The Horde Project +# This file is distributed under the same license as the Mailadmin package. +# Automatically generated, 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: Mailadmin 0.1-cvs\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2004-08-30 14:11+0200\n" +"PO-Revision-Date: 2004-02-11 18:15-0100\n" +"Last-Translator: Marko Djukic \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: users/edit.php:47 +#, php-format +msgid "'%s' already has the maximum number of users allowed." +msgstr "'%s' gia' ha il numero massimo di utenti permessi." + +#: templates/domains/index.html:35 +msgid "Admin" +msgstr "Admin" + +#: users/index.php:53 +msgid "All Virtual Emails" +msgstr "Tutti gli Indirizzi Email Virtuali" + +#: virtuals/delete.php:37 virtuals/delete.php:41 users/delete.php:33 +#: users/delete.php:37 domains/delete.php:28 domains/delete.php:32 +msgid "Delete" +msgstr "Elimina" + +#: domains/delete.php:25 domains/index.php:48 +msgid "Delete Domain" +msgstr "Elimina Dominio" + +#: virtuals/index.php:52 users/delete.php:30 users/index.php:63 +msgid "Delete User" +msgstr "Elimina Utente" + +#: virtuals/delete.php:34 +msgid "Delete Virtual Email Address" +msgstr "Elimina Indirizzo Email Virtuale" + +#: domains/delete.php:30 +#, php-format +msgid "Delete domain '%s', all the users and virtual email addresses?" +msgstr "Elimina dominio '%s', tutti gli utenti e gli indirizzi email virtuali?" + +#: virtuals/delete.php:39 +#, php-format +msgid "Delete the virtual email address '%s' => '%s'?" +msgstr "Elimina l'indirizzo email virtuale '%s' => '%s'?" + +#: users/delete.php:35 +#, php-format +msgid "Delete user '%s' and all associated virtual email addresses?" +msgstr "Elimina l'utente '%s' e tutti i relativi indirizzi email virtuali?" + +#: templates/virtuals/index.html:37 +msgid "Destination" +msgstr "Destinazione" + +#: virtuals/edit.php:55 +msgid "Destination user" +msgstr "Utente di destinazione" + +#: virtuals/delete.php:37 virtuals/delete.php:55 users/delete.php:33 +#: users/delete.php:51 domains/delete.php:28 domains/delete.php:46 +msgid "Do not delete" +msgstr "Non eliminare" + +#: domains/edit.php:40 templates/domains/index.html:33 +msgid "Domain" +msgstr "Dominio" + +#: domains/edit.php:43 +msgid "Domain admin" +msgstr "Amministratore dominio" + +#: domains/delete.php:40 +msgid "Domain deleted." +msgstr "Dominio eliminato." + +#: domains/delete.php:47 +msgid "Domain not deleted." +msgstr "Dominio non eliminato." + +#: domains/edit.php:54 +msgid "Domain saved." +msgstr "Dominio salvato." + +#: domains/edit.php:34 domains/index.php:49 +msgid "Edit Domain" +msgstr "Modifica Dominio" + +#: virtuals/index.php:53 users/index.php:64 +msgid "Edit User" +msgstr "Modifica Utente" + +#: users/edit.php:52 +#, php-format +msgid "Edit User for '%s'" +msgstr "Modifica Utente per '%s'" + +#: virtuals/edit.php:48 +msgid "Edit Virtual Email Address" +msgstr "Modifica Indirizzo Email Virtuale" + +#: virtuals/edit.php:54 templates/virtuals/index.html:35 +msgid "Email" +msgstr "Email" + +#: users/edit.php:66 +msgid "Enabled?" +msgstr "Attivato?" + +#: virtuals/edit.php:54 +#, php-format +msgid "" +"Enter a virtual email address for the '@%s' domain. Address must begin with " +"an alphanumerical character, it must contain only alphanumerical and '._-' " +"characters, and must end with an alphanumerical character." +msgstr "" +"Inserisci un indirizzo email virtuale per il '@%s' dominio. L'indirizzo deve " +"iniziare con un carattere alfanumerico, deve avere solo caratteri " +"alfanumerici e '._-' caratteri, e deve finire con un carattere alfanumerico." + +#: domains/delete.php:38 +#, php-format +msgid "Error deleting domain. %s." +msgstr "Errore durante l'eliminazione del dominio. %s." + +#: users/delete.php:43 +#, php-format +msgid "Error deleting user. %s." +msgstr "Errore durante l'eliminazione dell'utente. %s." + +#: virtuals/delete.php:47 +#, php-format +msgid "Error deleting virtual email. %s." +msgstr "Errore durante l'eliminazione del indirizzo email virtuale. %s." + +#: lib/Driver.php:254 lib/Driver.php:288 +msgid "Error running authentication update script." +msgstr "" + +#: domains/edit.php:52 +#, php-format +msgid "Error saving domain. %s." +msgstr "Errore durante il salvataggio del dominio. %s." + +#: users/edit.php:76 +#, fuzzy, php-format +msgid "Error saving user. %s" +msgstr "Errore durante il salvataggio dell'utente. %s." + +#: virtuals/edit.php:62 +#, php-format +msgid "Error saving virtual email. %s." +msgstr "Errore durante il salvataggio indirizzo email virtuale. %s." + +#: templates/users/index.html:39 +msgid "Full Name" +msgstr "Nome Completo" + +#: lib/MailboxDriver/imap.php:42 +#, fuzzy, php-format +msgid "Mailbox '%s@%s' does not exist." +msgstr "Messaggio inesistente." + +#: lib/MailboxDriver/maildrop.php:49 +#, fuzzy, php-format +msgid "Maildrop directory '%s' does not exist." +msgstr "Cartella VFS non esiste." + +#: templates/domains/index.html:37 +#, fuzzy +msgid "Max Users" +msgstr "Utenti max" + +#: domains/edit.php:44 +msgid "Max users" +msgstr "Utenti max" + +#: users/index.php:46 +msgid "Maximum Users" +msgstr "Utenti massimi" + +#: users/edit.php:65 +msgid "Name" +msgstr "Nome" + +#: users/edit.php:59 +msgid "" +"Name must begin with an alphanumerical character, it must contain only " +"alphanumerical and '._-' characters, and must end with an alphanumerical " +"character." +msgstr "" +"Il nome deve iniziare con un carattere alfanumerico, deve avere solo " +"caratteri alfanumerici e '._-' caratteri, e deve finire con un carattere " +"alfanumerico." + +#: domains/edit.php:34 domains/index.php:44 +msgid "New Domain" +msgstr "Nuovo Dominio" + +#: users/index.php:43 +msgid "New User" +msgstr "Nuovo Utente" + +#: users/edit.php:52 +#, php-format +msgid "New User for '%s'" +msgstr "Nuovo Utente per '%s'" + +#: virtuals/index.php:45 users/index.php:50 +msgid "New Virtual Email" +msgstr "Dettagli Email Virtuale" + +#: virtuals/edit.php:48 +msgid "New Virtual Email Address" +msgstr "Nuovo Indirizzo Email Virtuale" + +#: lib/MailboxDriver/maildrop.php:20 +msgid "No 'mail_dir_base' parameter specified to maildrop driver." +msgstr "" + +#: lib/MailboxDriver/maildrop.php:64 +msgid "No 'system_user' parameter specified to maildrop driver." +msgstr "" + +#: lib/Driver.php:172 +#, php-format +msgid "No such backend '%s' found" +msgstr "Nessun backend '%s' trovato" + +#: users/edit.php:86 +msgid "" +"No virtual email address set up for this user. You should set up at least " +"one virtual email address if this user is to receive any emails." +msgstr "" +"Nessun indirizzo email virtuale impostato per questo utente. Dovresti " +"impostare al meno un indirizzo email virtuale se questo utente e' da " +"ricevere gli email." + +#: lib/Driver.php:114 +msgid "No virtual emails set." +msgstr "Nessun indirizzo email virtuale inserito." + +#: users/edit.php:61 +msgid "Only enter a password if you wish to change this user's password" +msgstr "" +"Inserisci una password solo nel caso in cui vuoi cambiare la password di " +"questo utente." + +#: users/edit.php:61 users/edit.php:63 +msgid "Password" +msgstr "Password" + +#: lib/Driver/sql.php:337 +msgid "Password must be supplied when creating a new user." +msgstr "" + +#: domains/edit.php:45 templates/users/index.html:41 +msgid "Quota" +msgstr "Quota" + +#: templates/index/notconfigured.inc:39 +#, fuzzy +msgid "Some of Vilma's configuration files are missing:" +msgstr "Mancano alcuni file di configurazione di Nag:" + +#: templates/users/index.html:43 +msgid "Status" +msgstr "Statis" + +#: lib/MailboxDriver.php:77 +msgid "This driver cannot create mailboxes." +msgstr "" + +#: lib/MailboxDriver.php:93 +#, fuzzy +msgid "This driver cannot delete mailboxes." +msgstr "Non era possibile eliminare il file:" + +#: templates/index/notconfigured.inc:44 +#, fuzzy +msgid "" +"This is the main Vilma configuration file. It contains options for all Vilma " +"scripts." +msgstr "" +"Questo è il file principale di configurazione di Nag. Contiene le opzioni " +"per tutti gli scripts di Nag." + +#: domains/edit.php:42 +msgid "Transport" +msgstr "Trasporto" + +#: lib/Driver.php:258 lib/Driver.php:292 +msgid "Unknown error running authentication update script." +msgstr "" + +#: users/edit.php:59 +msgid "User" +msgstr "Utente" + +#: templates/users/index.html:37 +#, fuzzy +msgid "User Name" +msgstr "Nome Utente" + +#: users/delete.php:45 +msgid "User deleted." +msgstr "Utente eliminato." + +#: users/edit.php:78 +msgid "User details saved." +msgstr "Dettagli utente salvati." + +#: lib/Driver.php:107 +msgid "User disabled." +msgstr "Utente disattivato." + +#: users/edit.php:67 +msgid "User is disabled" +msgstr "L'utente e' disattivato." + +#: users/edit.php:66 +msgid "User is enabled" +msgstr "L'utente e' attivato." + +#: users/delete.php:52 +msgid "User not deleted." +msgstr "Utente non eliminato." + +#: lib/Driver.php:137 +msgid "User ready." +msgstr "Utente pronto." + +#: virtuals/index.php:48 +msgid "Users" +msgstr "Utenti" + +#: domains/edit.php:45 +msgid "Value in MB" +msgstr "Valore in MB" + +#: templates/index/notconfigured.inc:4 +#, fuzzy +msgid "Vilma is not properly configured" +msgstr "Nag non è configurato correttamente." + +#: virtuals/delete.php:49 +msgid "Virtual email deleted." +msgstr "Indirizzo email virtuale eliminato." + +#: virtuals/delete.php:56 +msgid "Virtual email not deleted." +msgstr "Indirizzo email virtuale non eliminato." + +#: virtuals/edit.php:64 +msgid "Virtual email saved." +msgstr "Indirizzo email virtuale salvato." diff --git a/vilma/po/lt_LT.po b/vilma/po/lt_LT.po new file mode 100644 index 000000000..6eb3034a3 --- /dev/null +++ b/vilma/po/lt_LT.po @@ -0,0 +1,484 @@ +# Lithuanian translations for Vilma package. +# Copyright 2007-2009 The Horde Project +# This file is distributed under the same license as the Vilma package. +# Vilius Sumskas , 2004, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: Vilma 0.2-cvs\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2007-11-02 15:40+0200\n" +"PO-Revision-Date: 2007-11-11 20:02+0200\n" +"Last-Translator: Vilius Sumskas \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-13\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%" +"100<10 || n%100>=20) ? 1 : 2);\n" + +#: users/edit.php:53 +#, php-format +msgid "\"%s\" already has the maximum number of users allowed." +msgstr "\"%s\" jau pasiekë maksimalø vartotojø skaièiø." + +#: lib/Driver/qmailldap.php:670 +msgid "Account Status" +msgstr "Paðto dëþutës bûsena" + +#: lib/Driver/qmailldap.php:678 +msgid "Account is active" +msgstr "Paðto dëþutë ájungta" + +#: lib/Driver/qmailldap.php:681 +msgid "Account is disabled" +msgstr "Paðto dëþutë iðjungta" + +#: templates/users/index.html:13 +msgid "Address" +msgstr "Adresas" + +#: lib/Vilma.php:60 +msgid "Alias" +msgstr "Pravardë" + +#: lib/Driver/qmailldap.php:371 +#, php-format +msgid "Alias for %s" +msgstr "Su %s susieti adresai" + +#: lib/Vilma.php:61 +msgid "Aliases" +msgstr "Susieti adresai" + +#: lib/Vilma.php:54 lib/Vilma.php:55 +msgid "All" +msgstr "Viskà" + +#: lib/Driver/qmailldap.php:680 +msgid "Bounce Incoming Only" +msgstr "Tik persiøsti gaunamus" + +#: domains/delete.php:29 domains/delete.php:33 users/delete.php:34 +#: users/delete.php:38 virtuals/delete.php:34 virtuals/delete.php:38 +msgid "Delete" +msgstr "Iðtrinti" + +#: domains/index.php:44 domains/delete.php:26 +msgid "Delete Domain" +msgstr "Iðtrinti domenà" + +#: users/index.php:82 users/delete.php:31 virtuals/index.php:55 +msgid "Delete User" +msgstr "Iðtrinti vartotojà" + +#: virtuals/delete.php:31 +msgid "Delete Virtual Email Address" +msgstr "Iðtrinti virtualø el. paðto adresà" + +#: domains/delete.php:31 +#, php-format +msgid "Delete domain \"%s\", all the users and virtual email addresses?" +msgstr "" +"Iðtrinti domenà \"%s\", visus vartotojus ir virtualius el. paðto adresus?" + +#: virtuals/delete.php:36 +#, php-format +msgid "Delete the virtual email address \"%s\" => \"%s\"?" +msgstr "Iðtrinti virtualø el. paðto adresà \"%s\" => \"%s\"?" + +#: users/delete.php:36 +#, php-format +msgid "Delete user \"%s\" and all associated virtual email addresses?" +msgstr "" +"Iðtrinti vartotojà \"%s\" ir visus susijusius virtualius el. paðto adresus?" + +#: virtuals/edit.php:64 templates/virtuals/index.html:20 +msgid "Destination" +msgstr "Gavëjas" + +#: virtuals/edit.php:54 +msgid "Destination type" +msgstr "Gavëjo tipas" + +#: lib/Driver/qmailldap.php:679 +msgid "Disable Delivery Only" +msgstr "Tik iðjungti pristatymà" + +#: config/prefs.php.dist:10 +msgid "Display details" +msgstr "Vaizdavimo nustatymai" + +#: config/prefs.php.dist:9 +msgid "Display listings" +msgstr "Sàraðo rodymas" + +#: domains/delete.php:29 domains/delete.php:47 users/delete.php:34 +#: users/delete.php:52 virtuals/delete.php:34 virtuals/delete.php:52 +msgid "Do not delete" +msgstr "Netrinti" + +#: lib/Forms/EditDomainForm.php:32 templates/domains/index.html:16 +msgid "Domain" +msgstr "Domenas" + +#: domains/delete.php:41 +msgid "Domain deleted." +msgstr "Domenas iðtrintas." + +#: domains/delete.php:48 +msgid "Domain not deleted." +msgstr "Domenas neiðtrintas." + +#: domains/edit.php:35 +msgid "Domain saved." +msgstr "Domenas iðsaugotas." + +#: domains/index.php:45 lib/Forms/EditDomainForm.php:20 +msgid "Edit Domain" +msgstr "Redaguoti domenà" + +#: users/index.php:83 virtuals/index.php:56 +msgid "Edit User" +msgstr "Redaguoti vartotojà" + +#: lib/Forms/EditUserForm.php:22 +#, php-format +msgid "Edit User for \"%s\"" +msgstr "Redaguoti \"%s\" vartotojà" + +#: virtuals/edit.php:47 +msgid "Edit Virtual Email Address" +msgstr "Redaguoti virtualius el. paðto adresus" + +#: virtuals/edit.php:53 +#, php-format +msgid "" +"Enter a virtual email address @%s and then indicate below where mail sent to " +"that address is to be delivered. The address must begin with an " +"alphanumerical character, it must contain only alphanumerical and '._-' " +"characters, and must end with an alphanumerical character." +msgstr "" +"Áraðykite virtualø el. paðto adresà domenui @%s. Adresas turi prasidëti " +"skaièiais arba raidëm, viduje gali turëti skaièius, raides arba '._-' " +"simbolius, ir turi baigtis skaièiais arba raidëmis." + +#: lib/Driver/qmailldap.php:616 +#, php-format +msgid "Error deleting account from LDAP: %s" +msgstr "Klaida trinant vartotojo vardà ið LDAP: %s" + +#: domains/delete.php:39 +#, php-format +msgid "Error deleting domain. %s." +msgstr "Klaida trinant domenà. %s." + +#: users/delete.php:44 +#, php-format +msgid "Error deleting user. %s." +msgstr "Klaida trinant vartotojà. %s." + +#: virtuals/delete.php:44 +#, php-format +msgid "Error deleting virtual email. %s." +msgstr "Klaida trinant virtualø el. paðto adresà. %s." + +#: lib/Driver/qmailldap.php:210 lib/Driver/qmailldap.php:215 +#, php-format +msgid "Error in LDAP search: %s" +msgstr "Klaida atliekant LDAP paieðkà: %s" + +#: users/edit.php:35 +#, php-format +msgid "Error reading address information from backend: %s" +msgstr "Klaida ið posistemës skaitant adresø informacijà: %s" + +#: lib/Driver/qmailldap.php:606 +#, php-format +msgid "Error retrieving LDAP results: %s" +msgstr "Klaida gaunant LDAP rezultatus: %s" + +#: lib/Driver/qmailldap.php:347 lib/Driver/qmailldap.php:435 +#: lib/Driver/qmailldap.php:507 +#, php-format +msgid "Error returning LDAP results: %s" +msgstr "Klaida graþinant LDAP rezultatus: %s" + +#: lib/Driver.php:195 +msgid "Error running authentication update script." +msgstr "Klaida leidþiant autentifikacijos atnaujinimo skriptà." + +#: domains/edit.php:33 +#, php-format +msgid "Error saving domain: %s." +msgstr "Klaida iðsaugant domenà: %s." + +#: users/edit.php:64 +#, php-format +msgid "Error saving user. %s" +msgstr "Klaida iðsaugant vartotojà. %s" + +#: virtuals/edit.php:77 +#, php-format +msgid "Error saving virtual email. %s." +msgstr "Klaida iðsaugant virtualø el. paðto adresà. %s." + +#: lib/Driver/qmailldap.php:341 lib/Driver/qmailldap.php:429 +#: lib/Driver/qmailldap.php:501 lib/Driver/qmailldap.php:600 +#, php-format +msgid "Error searching LDAP: %s" +msgstr "Klaida atliekant LDAP paieðkà: %s" + +#: lib/Forms/EditUserForm.php:41 templates/users/index.html:16 +msgid "Full Name" +msgstr "Pilnas vardas" + +#: lib/Vilma.php:63 +msgid "Group/Forward" +msgstr "Grupë/Persiuntimas" + +#: lib/Vilma.php:64 +msgid "Groups and Forwards" +msgstr "Grupës ir persiuntimai" + +#: config/prefs.php.dist:20 +msgid "How many domain to display per page." +msgstr "Kiek domenø rodyti viename puslapyje." + +#: virtuals/edit.php:56 +msgid "Local user" +msgstr "Vietinis vartotojas" + +#: lib/MailboxDriver/imap.php:45 +#, php-format +msgid "Mailbox '%s@%s' does not exist." +msgstr "Paðto dëþutë '%s@%s' neegzistuoja." + +#: lib/MailboxDriver/maildrop.php:45 +#, php-format +msgid "Maildrop directory \"%s\" does not exist." +msgstr "Maildrop katalogas \"%s\" neegzistuoja." + +#: templates/domains/index.html:19 +msgid "Max Users" +msgstr "Maks. vartotojø skaièius" + +#: lib/Forms/EditDomainForm.php:35 +msgid "Max users" +msgstr "Maks. vartotojø skaièius" + +#: users/index.php:69 +msgid "Maximum Users" +msgstr "Maks. vartotojø skaièius" + +#: lib/Driver/qmailldap.php:511 +msgid "" +"More than one DN returned for this alias. Please contact an administrator " +"to resolve this error." +msgstr "" +"Rastas daugiau nei vienas DN atitinkantis ðá vartotojà. Susisiekite su " +"administratoriumi." + +#: lib/Driver/qmailldap.php:610 +msgid "More than one DN returned. Aborting delete operation." +msgstr "Rastas daugiau nei vienas DN. Trynimo operacija nutraukiama." + +#: lib/Forms/EditUserForm.php:35 +msgid "" +"Name must begin with an alphanumeric character, must contain only " +"alphanumeric and '._-' characters, and must end with an alphanumeric " +"character." +msgstr "" +"Vardas turi prasidëti skaièiais arba raidëm, viduje gali turëti skaièius, " +"raides arba simbolius '._-', ir turi baigtis skaièiais arba raidëmis." + +#: lib/Forms/EditDomainForm.php:20 +msgid "New Domain" +msgstr "Naujas domenas" + +#: lib/Forms/EditUserForm.php:24 +#, php-format +msgid "New User @%s" +msgstr "Naujas @%s vartotojas" + +#: virtuals/index.php:48 +msgid "New Virtual Email" +msgstr "Naujas virtualus el. paðtas" + +#: virtuals/edit.php:47 +msgid "New Virtual Email Address" +msgstr "Naujas virtualus el. paðto adresas" + +#: lib/Vilma.php:169 +msgid "New _Address" +msgstr "Naujas adresas" + +#: lib/MailboxDriver/maildrop.php:19 +msgid "No 'mail_dir_base' parameter specified to maildrop driver." +msgstr "Maildrop tvarkyklëje neáraðytas 'mail_dir_base' parametras." + +#: lib/MailboxDriver/maildrop.php:60 +msgid "No 'system_user' parameter specified to maildrop driver." +msgstr "Maildrop tvarkyklëje neáraðytas 'system_user' parametras." + +#: lib/Driver.php:108 +#, php-format +msgid "No such address %s of type %s found." +msgstr "Adresas %s, kurio tipas %s, nerastas." + +#: lib/Driver.php:329 +#, php-format +msgid "No such backend \"%s\" found" +msgstr "Posistemë \"%s\" nerasta" + +#: users/edit.php:74 +msgid "" +"No virtual email address set up for this user. You should set up at least " +"one virtual email address if this user is to receive any emails." +msgstr "" +"Ðis vartotojas neturi virtualiø el. paðto adresø. Jeigu ðis vartotojas gauna " +"el. laiðkus, turëtumëte nurodyti bent vienà virtualø el. paðto adresà." + +#: lib/Driver.php:249 +msgid "Not implemented." +msgstr "Nerealizuota." + +#: lib/Forms/EditUserForm.php:37 +msgid "Only enter a password if you wish to change this user's password" +msgstr "Slaptaþodá áraðykite tik tada, jeigu já keièiate" + +#: lib/Forms/EditUserForm.php:37 lib/Forms/EditUserForm.php:39 +msgid "Password" +msgstr "Slaptaþodis" + +#: lib/Driver/sql.php:465 +msgid "Password must be supplied when creating a new user." +msgstr "Kurdami naujà vartotojà, privalote áraðyti slaptaþodá." + +#: lib/Forms/EditDomainForm.php:36 +msgid "Quota" +msgstr "Vieta serveryje" + +#: virtuals/edit.php:57 +msgid "Remote address" +msgstr "Iðoriniai adresai" + +#: virtuals/edit.php:61 +msgid "Remote e-mail address" +msgstr "Iðorinis el. paðto adresas" + +#: config/prefs.php.dist:11 +msgid "Set default display parameters." +msgstr "Standartinio vaizdavimo parametrø nustatymas." + +#: templates/users/index.html:22 +msgid "Status" +msgstr "Bûsena" + +#: lib/api.php:43 +msgid "Super Administrator" +msgstr "Super administratorius" + +#: lib/MailboxDriver.php:78 +msgid "This driver cannot create mailboxes." +msgstr "Ði tvarkyklë negali kurti paðto dëþuèiø." + +#: lib/MailboxDriver.php:94 +msgid "This driver cannot delete mailboxes." +msgstr "Ði tvarkyklë negali trinti paðto dëþuèiø." + +#: lib/Forms/EditDomainForm.php:34 +msgid "Transport" +msgstr "Transportas" + +#: templates/users/index.html:19 +msgid "Type" +msgstr "Tipas" + +#: lib/Driver/qmailldap.php:715 +msgid "Unable to bind to the LDAP server. Check authentication credentials." +msgstr "" +"Nepavyko autentifikuotis á LDAP serverá. Patikrinkite vartotojo vardà bei " +"slaptaþodá." + +#: lib/Driver/qmailldap.php:710 +msgid "Unable to set LDAP protocol version" +msgstr "Klaida keièiant LDAP protokolo versijà" + +#: lib/Driver.php:199 +msgid "Unknown error running authentication update script." +msgstr "Bevykdant autentifikacijos atnaujinimo skriptà ávyko neþinoma klaida." + +#: lib/Vilma.php:57 +msgid "User" +msgstr "Vartotojas" + +#: lib/Forms/EditUserForm.php:35 +msgid "User Name" +msgstr "Vartotojo vardas" + +#: users/delete.php:46 +msgid "User deleted." +msgstr "Vartotojas iðtrintas." + +#: users/edit.php:66 +msgid "User details saved." +msgstr "Vartotojo apraðymas iðsaugotas." + +#: lib/Driver.php:132 +msgid "User disabled." +msgstr "Vartotojas iðjungtas" + +#: users/delete.php:53 +msgid "User not deleted." +msgstr "Vartotojas neiðtrintas." + +#: lib/Driver.php:155 +msgid "User ready." +msgstr "Vartotojas paruoðtas." + +#: lib/Vilma.php:58 virtuals/index.php:51 +msgid "Users" +msgstr "Vartotojai" + +#: lib/Forms/EditDomainForm.php:36 +msgid "Value in MB" +msgstr "Reikðmë MB" + +#: lib/Driver.php:210 +msgid "Vilma_Driver::deleteUser(): Method Not Implemented." +msgstr "Vilma_Driver::deleteUser(): metodas nerealizuotas." + +#: virtuals/edit.php:53 +msgid "Virtual Email" +msgstr "Virtualus el. paðtas" + +#: templates/virtuals/index.html:17 +msgid "Virtual Email Address" +msgstr "Virtualus el. paðto adresas" + +#: virtuals/delete.php:46 +msgid "Virtual email deleted." +msgstr "Virtualus el. paðto adresas iðtrintas." + +#: virtuals/delete.php:53 +msgid "Virtual email not deleted." +msgstr "Virtualus el. paðto adresas neiðtrintas." + +#: virtuals/edit.php:79 +msgid "Virtual email saved." +msgstr "Virtualus el. paðto adresas iðsaugotas." + +#: lib/Driver/qmailldap.php:35 +msgid "You must configure a Horde DataTree backend to use Vilma." +msgstr "" +"Norëdami naugotis paðto valdymo sistema, turite sukonfigûruoti duomenø " +"medþio posistemæ." + +#: lib/Vilma.php:166 +msgid "_Domains" +msgstr "Domenai" + +#: lib/Vilma.php:171 +msgid "_New Domain" +msgstr "Naujas domenas" diff --git a/vilma/po/vilma.pot b/vilma/po/vilma.pot new file mode 100644 index 000000000..be999fd0e --- /dev/null +++ b/vilma/po/vilma.pot @@ -0,0 +1,476 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright YEAR Horde Project +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: dev@lists.horde.org\n" +"POT-Creation-Date: 2008-04-01 14:58+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: users/edit.php:53 +#, php-format +msgid "\"%s\" already has the maximum number of users allowed." +msgstr "" + +#: lib/Driver/qmailldap.php:647 +msgid "Account Status" +msgstr "" + +#: lib/Driver/qmailldap.php:655 +msgid "Account is active" +msgstr "" + +#: lib/Driver/qmailldap.php:658 +msgid "Account is disabled" +msgstr "" + +#: templates/users/index.html:13 +msgid "Address" +msgstr "" + +#: lib/Vilma.php:60 +msgid "Alias" +msgstr "" + +#: lib/Driver/qmailldap.php:332 +#, php-format +msgid "Alias for %s" +msgstr "" + +#: lib/Vilma.php:61 +msgid "Aliases" +msgstr "" + +#: lib/Vilma.php:54 lib/Vilma.php:55 +msgid "All" +msgstr "" + +#: lib/Driver/qmailldap.php:657 +msgid "Bounce Incoming Only" +msgstr "" + +#: domains/delete.php:27 users/delete.php:34 users/delete.php:38 +#: virtuals/delete.php:34 virtuals/delete.php:38 +#: lib/Forms/DeleteDomainForm.php:27 +msgid "Delete" +msgstr "" + +#: domains/index.php:44 lib/Forms/DeleteDomainForm.php:17 +msgid "Delete Domain" +msgstr "" + +#: users/index.php:83 users/delete.php:31 virtuals/index.php:55 +msgid "Delete User" +msgstr "" + +#: virtuals/delete.php:31 +msgid "Delete Virtual Email Address" +msgstr "" + +#: lib/Forms/DeleteDomainForm.php:29 +#, php-format +msgid "Delete domain \"%s\" and all associated email addresses?" +msgstr "" + +#: virtuals/delete.php:36 +#, php-format +msgid "Delete the virtual email address \"%s\" => \"%s\"?" +msgstr "" + +#: users/delete.php:36 +#, php-format +msgid "Delete user \"%s\" and all associated virtual email addresses?" +msgstr "" + +#: virtuals/edit.php:64 templates/virtuals/index.html:20 +msgid "Destination" +msgstr "" + +#: virtuals/edit.php:54 +msgid "Destination type" +msgstr "" + +#: lib/Driver/qmailldap.php:656 +msgid "Disable Delivery Only" +msgstr "" + +#: config/prefs.php.dist:10 +msgid "Display details" +msgstr "" + +#: config/prefs.php.dist:9 +msgid "Display listings" +msgstr "" + +#: domains/delete.php:41 users/delete.php:34 users/delete.php:52 +#: virtuals/delete.php:34 virtuals/delete.php:52 +#: lib/Forms/DeleteDomainForm.php:27 +msgid "Do not delete" +msgstr "" + +#: lib/Forms/EditDomainForm.php:32 templates/domains/index.html:16 +msgid "Domain" +msgstr "" + +#: lib/Driver.php:229 +msgid "" +"Domain added but an error was encountered while calling the configured " +"hook. Contact your administrator for futher assistance." +msgstr "" + +#: domains/delete.php:35 +msgid "Domain deleted." +msgstr "" + +#: domains/delete.php:42 +msgid "Domain not deleted." +msgstr "" + +#: domains/edit.php:35 +msgid "Domain saved." +msgstr "" + +#: domains/index.php:45 lib/Forms/EditDomainForm.php:20 +msgid "Edit Domain" +msgstr "" + +#: users/index.php:84 virtuals/index.php:56 +msgid "Edit User" +msgstr "" + +#: lib/Forms/EditUserForm.php:22 +#, php-format +msgid "Edit User for \"%s\"" +msgstr "" + +#: virtuals/edit.php:47 +msgid "Edit Virtual Email Address" +msgstr "" + +#: virtuals/edit.php:53 +#, php-format +msgid "" +"Enter a virtual email address @%s and then indicate below where mail sent to " +"that address is to be delivered. The address must begin with an " +"alphanumerical character, it must contain only alphanumerical and '._-' " +"characters, and must end with an alphanumerical character." +msgstr "" + +#: lib/Driver/qmailldap.php:593 +#, php-format +msgid "Error deleting account from LDAP: %s" +msgstr "" + +#: domains/delete.php:33 +#, php-format +msgid "Error deleting domain. %s." +msgstr "" + +#: users/delete.php:44 +#, php-format +msgid "Error deleting user. %s." +msgstr "" + +#: virtuals/delete.php:44 +#, php-format +msgid "Error deleting virtual email. %s." +msgstr "" + +#: lib/Driver/qmailldap.php:170 lib/Driver/qmailldap.php:175 +#, php-format +msgid "Error in LDAP search: %s" +msgstr "" + +#: users/edit.php:35 +#, php-format +msgid "Error reading address information from backend: %s" +msgstr "" + +#: lib/Driver/qmailldap.php:583 +#, php-format +msgid "Error retrieving LDAP results: %s" +msgstr "" + +#: lib/Driver/qmailldap.php:308 lib/Driver/qmailldap.php:396 +#: lib/Driver/qmailldap.php:468 +#, php-format +msgid "Error returning LDAP results: %s" +msgstr "" + +#: lib/Driver.php:195 +msgid "Error running authentication update script." +msgstr "" + +#: domains/edit.php:33 +#, php-format +msgid "Error saving domain: %s." +msgstr "" + +#: users/edit.php:64 +#, php-format +msgid "Error saving user. %s" +msgstr "" + +#: virtuals/edit.php:77 +#, php-format +msgid "Error saving virtual email. %s." +msgstr "" + +#: lib/Driver/qmailldap.php:302 lib/Driver/qmailldap.php:390 +#: lib/Driver/qmailldap.php:462 lib/Driver/qmailldap.php:577 +#, php-format +msgid "Error searching LDAP: %s" +msgstr "" + +#: lib/Driver.php:280 +msgid "Error while calling hook to delete domain." +msgstr "" + +#: lib/Forms/EditUserForm.php:41 templates/users/index.html:16 +msgid "Full Name" +msgstr "" + +#: lib/Vilma.php:63 +msgid "Group/Forward" +msgstr "" + +#: lib/Vilma.php:64 +msgid "Groups and Forwards" +msgstr "" + +#: config/prefs.php.dist:20 +msgid "How many domain to display per page." +msgstr "" + +#: virtuals/edit.php:56 +msgid "Local user" +msgstr "" + +#: lib/MailboxDriver/imap.php:45 +#, php-format +msgid "Mailbox '%s@%s' does not exist." +msgstr "" + +#: lib/MailboxDriver/maildrop.php:45 +#, php-format +msgid "Maildrop directory \"%s\" does not exist." +msgstr "" + +#: templates/domains/index.html:19 +msgid "Max Users" +msgstr "" + +#: lib/Forms/EditDomainForm.php:35 +msgid "Max users" +msgstr "" + +#: users/index.php:70 +msgid "Maximum Users" +msgstr "" + +#: lib/Driver/qmailldap.php:472 +msgid "" +"More than one DN returned for this alias. Please contact an administrator " +"to resolve this error." +msgstr "" + +#: lib/Driver/qmailldap.php:587 +msgid "More than one DN returned. Aborting delete operation." +msgstr "" + +#: lib/Forms/EditUserForm.php:35 +msgid "" +"Name must begin with an alphanumeric character, must contain only " +"alphanumeric and '._-' characters, and must end with an alphanumeric " +"character." +msgstr "" + +#: lib/Forms/EditDomainForm.php:20 +msgid "New Domain" +msgstr "" + +#: lib/Forms/EditUserForm.php:24 +#, php-format +msgid "New User @%s" +msgstr "" + +#: virtuals/index.php:48 +msgid "New Virtual Email" +msgstr "" + +#: virtuals/edit.php:47 +msgid "New Virtual Email Address" +msgstr "" + +#: lib/Vilma.php:169 +msgid "New _Address" +msgstr "" + +#: lib/MailboxDriver/maildrop.php:19 +msgid "No 'mail_dir_base' parameter specified to maildrop driver." +msgstr "" + +#: lib/MailboxDriver/maildrop.php:60 +msgid "No 'system_user' parameter specified to maildrop driver." +msgstr "" + +#: lib/Driver.php:108 +#, php-format +msgid "No such address %s of type %s found." +msgstr "" + +#: lib/Driver.php:374 +#, php-format +msgid "No such backend \"%s\" found" +msgstr "" + +#: users/edit.php:74 +msgid "" +"No virtual email address set up for this user. You should set up at least " +"one virtual email address if this user is to receive any emails." +msgstr "" + +#: lib/Driver.php:245 lib/Driver.php:294 +msgid "Not implemented." +msgstr "" + +#: lib/Forms/EditUserForm.php:37 +msgid "Only enter a password if you wish to change this user's password" +msgstr "" + +#: lib/Forms/EditUserForm.php:37 lib/Forms/EditUserForm.php:39 +msgid "Password" +msgstr "" + +#: lib/Driver/sql.php:465 +msgid "Password must be supplied when creating a new user." +msgstr "" + +#: lib/Forms/EditDomainForm.php:36 +msgid "Quota" +msgstr "" + +#: virtuals/edit.php:57 +msgid "Remote address" +msgstr "" + +#: virtuals/edit.php:61 +msgid "Remote e-mail address" +msgstr "" + +#: config/prefs.php.dist:11 +msgid "Set default display parameters." +msgstr "" + +#: templates/users/index.html:22 +msgid "Status" +msgstr "" + +#: lib/api.php:43 +msgid "Super Administrator" +msgstr "" + +#: lib/MailboxDriver.php:78 +msgid "This driver cannot create mailboxes." +msgstr "" + +#: lib/MailboxDriver.php:94 +msgid "This driver cannot delete mailboxes." +msgstr "" + +#: lib/Forms/EditDomainForm.php:34 +msgid "Transport" +msgstr "" + +#: templates/users/index.html:19 +msgid "Type" +msgstr "" + +#: lib/Driver/qmailldap.php:696 +msgid "Unable to bind to the LDAP server. Check authentication credentials." +msgstr "" + +#: lib/Driver/qmailldap.php:691 +msgid "Unable to set LDAP protocol version" +msgstr "" + +#: lib/Driver.php:199 +msgid "Unknown error running authentication update script." +msgstr "" + +#: lib/Vilma.php:57 +msgid "User" +msgstr "" + +#: lib/Forms/EditUserForm.php:35 +msgid "User Name" +msgstr "" + +#: users/delete.php:46 +msgid "User deleted." +msgstr "" + +#: users/edit.php:66 +msgid "User details saved." +msgstr "" + +#: lib/Driver.php:132 +msgid "User disabled." +msgstr "" + +#: users/delete.php:53 +msgid "User not deleted." +msgstr "" + +#: lib/Driver.php:155 +msgid "User ready." +msgstr "" + +#: virtuals/index.php:51 lib/Vilma.php:58 +msgid "Users" +msgstr "" + +#: lib/Forms/EditDomainForm.php:36 +msgid "Value in MB" +msgstr "" + +#: lib/Driver.php:210 +msgid "Vilma_Driver::deleteUser(): Method Not Implemented." +msgstr "" + +#: virtuals/edit.php:53 +msgid "Virtual Email" +msgstr "" + +#: templates/virtuals/index.html:17 +msgid "Virtual Email Address" +msgstr "" + +#: virtuals/delete.php:46 +msgid "Virtual email deleted." +msgstr "" + +#: virtuals/delete.php:53 +msgid "Virtual email not deleted." +msgstr "" + +#: virtuals/edit.php:79 +msgid "Virtual email saved." +msgstr "" + +#: lib/Vilma.php:166 +msgid "_Domains" +msgstr "" + +#: lib/Vilma.php:171 +msgid "_New Domain" +msgstr "" diff --git a/vilma/scripts/.htaccess b/vilma/scripts/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/vilma/scripts/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/vilma/scripts/create_mailboxes.php b/vilma/scripts/create_mailboxes.php new file mode 100644 index 000000000..03ce19b4e --- /dev/null +++ b/vilma/scripts/create_mailboxes.php @@ -0,0 +1,53 @@ +#!/usr/bin/php +getAllUsers(); + +foreach ($users_by_domain as $domain => $users) { + foreach ($users as $user) { + /* Check for user's home dir. */ + if (!file_exists($user['user_home_dir'])) { + /* Try to make the user_home_dir, if false skip. */ + if (!mkdir($user['user_home_dir'])) { + continue; + } + } + /* Check for the domain's dir. */ + $domain_dir = $user['user_home_dir'] . '/' . $domain; + if (!file_exists($domain_dir)) { + /* Try to make the user_home_dir, if false skip. */ + if (!mkdir($domain_dir)) { + continue; + } + } + /* Check for user's mailbox directory and if missing create it. */ + $mailbox_dir = $user['user_home_dir'] . '/' . $user['user_mail_dir']; + if (!file_exists($mailbox_dir)) { + system('maildirmake ' . $mailbox_dir); + } + } +} diff --git a/vilma/scripts/sql/vilma.sql b/vilma/scripts/sql/vilma.sql new file mode 100644 index 000000000..c41ad9db9 --- /dev/null +++ b/vilma/scripts/sql/vilma.sql @@ -0,0 +1,41 @@ +--$Horde: vilma/scripts/sql/vilma.sql,v 1.8 2007/04/17 12:44:06 jan Exp $ +-- SQL scripts. + +CREATE TABLE vilma_domains ( + domain_id INT DEFAULT 0 NOT NULL, + domain_name VARCHAR(128) DEFAULT '' NOT NULL, + domain_transport VARCHAR(128) DEFAULT '' NOT NULL, + domain_max_users INT DEFAULT 0 NOT NULL, + domain_quota INT DEFAULT 0 NOT NULL, + domain_key VARCHAR(64), +-- + PRIMARY KEY (domain_id), + UNIQUE (domain_name) +); + +CREATE TABLE vilma_users ( + user_id INT DEFAULT 0 NOT NULL, + user_name VARCHAR(255) DEFAULT '' NOT NULL, + user_clear VARCHAR(255) DEFAULT '' NOT NULL, + user_crypt VARCHAR(255) DEFAULT '' NOT NULL, + user_full_name VARCHAR(255) DEFAULT '' NOT NULL, + user_uid INT NOT NULL, + user_gid INT NOT NULL, + user_home_dir VARCHAR(255) DEFAULT '' NOT NULL, + user_mail_dir VARCHAR(255) DEFAULT '' NOT NULL, + user_mail_quota INT DEFAULT 0 NOT NULL, + user_ftp_dir VARCHAR(255) DEFAULT NULL, + user_ftp_quota INT DEFAULT NULL, + user_enabled SMALLINT DEFAULT 1 NOT NULL, +-- + PRIMARY KEY (user_id), + UNIQUE (user_name) +); + +CREATE TABLE vilma_virtuals ( + virtual_id INT DEFAULT 0 NOT NULL, + virtual_email VARCHAR(128) DEFAULT '' NOT NULL, + virtual_destination VARCHAR(128) DEFAULT '' NOT NULL, +-- + PRIMARY KEY (virtual_id) +); diff --git a/vilma/templates/common-header.inc b/vilma/templates/common-header.inc new file mode 100644 index 000000000..55130fc97 --- /dev/null +++ b/vilma/templates/common-header.inc @@ -0,0 +1,29 @@ + + + + + +' : '' ?> + +get('name'); +if (!empty($title)) $page_title .= ' :: ' . $title; +if (!empty($refresh_time) && ($refresh_time > 0) && !empty($refresh_url)) { + echo "\n"; +} + +Horde::includeScriptFiles(); + +?> +<?php echo htmlspecialchars($page_title) ?> + + + + +> diff --git a/vilma/templates/domains/index.html b/vilma/templates/domains/index.html new file mode 100644 index 000000000..6bef877c3 --- /dev/null +++ b/vilma/templates/domains/index.html @@ -0,0 +1,37 @@ +

+ + + +

+ +

+ + + + + + + + + + + + + + + +
  + Domain + + Max Users +
+ + + + + + +
+
diff --git a/vilma/templates/main/main.html b/vilma/templates/main/main.html new file mode 100644 index 000000000..5c3c6ce57 --- /dev/null +++ b/vilma/templates/main/main.html @@ -0,0 +1,5 @@ + + + diff --git a/vilma/templates/users/index.html b/vilma/templates/users/index.html new file mode 100644 index 000000000..f4dad378d --- /dev/null +++ b/vilma/templates/users/index.html @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + +
  + Address + + Full Name + + Type + + Status +
+ + + + + + + + + +   + + + <> + + + + + + + + + + +
+
+
+
+ diff --git a/vilma/templates/virtuals/index.html b/vilma/templates/virtuals/index.html new file mode 100644 index 000000000..88294f7ab --- /dev/null +++ b/vilma/templates/virtuals/index.html @@ -0,0 +1,38 @@ + + + + +

+   | +   +

+ + + + + + + + + + + + + + + +
  + Virtual Email Address + + Destination +
+ + + + + + +
+
diff --git a/vilma/test.php b/vilma/test.php new file mode 100644 index 000000000..9da22200b --- /dev/null +++ b/vilma/test.php @@ -0,0 +1,50 @@ + + * @package Vilma + */ + +require_once './lib/version.php'; +@define('CONFIG_DIR', dirname(__FILE__) . '/config/'); + +$setup_ok = true; + +$config_files = array('conf.php', 'prefs.php'); + +?> + + + + +Vilma: System Capabilities Test + + + + +

Vilma Version

+
    +
  • Vilma:
  • +
+ +

Vilma Configuration Files

+
    +
  • - Yes
  • - No +
+ + diff --git a/vilma/themes/graphics/display.png b/vilma/themes/graphics/display.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd0567e2c77c893c2346e509c38cd8604dd1858 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!T!2rAD}yD&|Nm$H|4;ir^UTFV zP5&9rJioWa#l;0E|Njhw&m)&FKo(<3kY6x^!?PP{K#r5Ai(^Q|t=is$yayBn4llTH z?9G0IAi3U#RsSOU-koC9e%gIM?^2@n+KoC|=3dL=m|wmvn{u!4eCzV$^RF%3z6so& Yd3qnSuhw^m1fXdQp00i_>zopr02L`kX8-^I literal 0 HcmV?d00001 diff --git a/vilma/themes/graphics/domain.png b/vilma/themes/graphics/domain.png new file mode 100644 index 0000000000000000000000000000000000000000..7020eb9906160df3a436b04cee62596d8e99d508 GIT binary patch literal 882 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4821PGgt!7}c3u%Kc~dq)838R9 z35y6Z<3K6fcwRYu3A0c(UJ+Tl1O=xQRkt(=EgSv7B3V^kdslC3JIBnNd}Wtp4WC>Y zQy)#w4E@k@UU3DZurlM&V!PxvyVy#ff{C6v-7ZP>e))ZJ>iV_Q*BM7t==!AFrL@>3 zH+vOKh-h3CT{ShXc6#lct+L7*6ISi-TfWD^JLK4EyoFD~41YW+q+`-!o3$~Z#(JiAHL?)Jri5!wMVb5J$iN3p-U?dUfgr_ z`I4O{)*rpP=hDMN*PrdaaL>xY<-o-?4Ao z{-f6(JP!yC&1{>w`o!%`=N~QFb9U*zbNg?;TzB;H?n@8$U4C%<&dVb=o}9S-{Me1h zCvHADcmLI$mmhauym#r|)4JA9b6bbmE7o6q^2XWKEj%ufjT02J|NsAAG{tulkTta= z$S)Yk9dv-fEJfM^=)kj{E{-7*;mI?a*d!cUP9HhN>D1&^&=~V@)1-5M4ixGD;vLmD|*77IdMw4zxP(tixWN; zUVX;GDbYQ%@=DgqmEK3(P8&6|EHmiZ{nC52M`u)|v0;O(+04~mjqTwr(Npt3rF2|Y tXD{Bcaq}jL#vcObeP{Bpaoks8X4of|ZmU}Mw;1R#22WQ%mvv4FO#q@-?)Crx literal 0 HcmV?d00001 diff --git a/vilma/themes/graphics/favicon.ico b/vilma/themes/graphics/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..66d7b86efc1d1dcdb34714b135568d7c72fc4275 GIT binary patch literal 1150 zcma)4yKTcj41EFuq>QTosgg47ZIE5mWDFG=A*ELE4z5&chHRh>!n{X`ch32sSO$GO zitj_(K*!JN1b;psfM;g!43*v(oqsdoyW8i5rK5lW$b2`Ulu`U0vUC+*$F`{*T1`*ZSc-^mT5#sX4A@mD4+ zrF)P67LRJu7e{%2pNG<4`)lE&R`=HT=qsna0zXf{<&laVL(c~=Tv%f|sKy?!$Im?< Ic>iYp3w+R81ONa4 literal 0 HcmV?d00001 diff --git a/vilma/themes/graphics/sort.png b/vilma/themes/graphics/sort.png new file mode 100644 index 0000000000000000000000000000000000000000..a935190050e97c0c5a47375ae414dd5411a3f045 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!P=HT}YjSR)v9WPlTH2X2XJ*cv z$-=^7wp2rk!L3V|9{djE$PubQ7AZd z_cEq^cK1527B0>eoY0;#-*?5*fJlXa^DYnGRowmGv|w$^kCR46>lpSsFsAF?+2sT@ OkHOQ`&t;ucLK6VjbUM-i literal 0 HcmV?d00001 diff --git a/vilma/themes/graphics/vilma.png b/vilma/themes/graphics/vilma.png new file mode 100644 index 0000000000000000000000000000000000000000..3c419166cb530afbf317098e2e10cc0b1f954472 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eSlAht0V)%+O<>8%`yCcF8SE8 zV=XN$@87>SG-Q~Q%#fVS@c;ju|Nj|U7#RKo)z1ME|IeKRN-~_A1LOmR8E!WnyaA*b zOM?7@862M7NCR>zJY5_^DsF}LMe{K$@*LsVpek@Gx%^%IH6e$kU+3%gnxr-KMn3rP zJf*(*^M*YCY1RV!4z4~tX>Xatzao*6BCdl%7ES3N!^|H{VX^r;OFpSfKq5ip$saSF zLsDL?lN1+nE^^cjA44$rjF6*2U FngEkYWNH8a literal 0 HcmV?d00001 diff --git a/vilma/users/delete.php b/vilma/users/delete.php new file mode 100644 index 000000000..aaab597d8 --- /dev/null +++ b/vilma/users/delete.php @@ -0,0 +1,165 @@ + + */ + +@define('VILMA_BASE', dirname(__FILE__) . '/..'); +require_once VILMA_BASE . '/lib/base.php'; +require_once 'Horde/Form.php'; + +/* Only admin should be using this. */ +if (!Vilma::hasPermission($domain)) { + Horde::authenticationFailureRedirect(); +} + +$vars = Horde_Variables::getDefaultVariables(); +$address = $vars->get('address'); +$section = Horde_Util::getFormData('section','all'); + +//$addrInfo = $vilma_driver->getAddressInfo($address, 'all'); +/* +$user_id = $vars->get('address'); +$formname = $vars->get('formname'); +$user = $vilma_driver->getUser($user_id); +print_r($vars) . '
'; +echo $user_id . '
'; +echo $fromname . '
'; +print_r($user) . '
'; +$domain = Vilma::stripDomain($user['name']); +$domain = $vilma_driver->getDomainByName($domain); +*/ +$address = $vilma_driver->getAddressInfo($address); +$type = $address['type']; +if(($section == 'all') && ($type == 'alias')) { + $address = $vilma_driver->getAddressInfo($vars->get('address'),$type); +} +$user_id = $vars->get('address'); +$user = $vilma_driver->getUser($user_id); +$aliases = $vilma_driver->_getAliases($user_id); +$aliasesCount = 0; +if(is_array($aliases)) { + $aliasesCount = sizeof($aliases); +} +$domain = Vilma::stripDomain($user_id); +$forwards = $vilma_driver->_getGroupsAndForwards('forwards',$domain); +$forwardsCount = 0; +foreach($forwards as $entry) { + foreach($entry['targets'] as $target) { + if($user_id === $target) { + $forwardsCount++; + } + } +} +$groups = $vilma_driver->_getGroupsAndForwards('groups',$domain); +$groupsCount = 0; +foreach($groups as $entry) { + foreach($entry['targets'] as $target) { + if($user_id === $target) { + $groupsCount++; + } + } +} +if (is_a($address, 'PEAR_Error')) { + $notification->push(sprintf(_("Error reading address information from backend: %s"), $address->getMessage()), 'horde.error'); + $url = '/users/index.php'; + require VILMA_BASE . $url; + exit; +} +$user_name = $address['user_name']; +if(!isset($user_name) || empty($user_name)) { + $user_name = $address['address']; +} +$vars->set('user_name', Vilma::stripUser($user_name)); +$domain = Vilma::stripDomain($address); +$domain = $vilma_driver->getDomainByName($domain); +$vars->set('domain', $domain); +$vars->set('mode', 'edit'); + +$form = new Horde_Form($vars, _("Delete User")); +/* Set up the form. */ +$form->setButtons(array(_("Delete"), _("Do not delete"))); +//$form->addHidden($user_id, 'user_id', 'text', false); +$form->addHidden($address['address'], 'address', 'text', false); +$form->addHidden($section, 'section', 'text', false); + +$desc = "Delete user \"%s\""; +$sub = " and all dependencies?"; +$tot = $aliasesCount + $groupsCount + $forwardsCount; +if($tot > 0) { + $desc .= $sub; +} else { + $desc .= "?"; +} +if($aliasesCount > 0) { + $desc .= " Account has " . $aliasesCount . " aliases."; +} +if($forwardsCount > 0) { + $desc .= " Account is the target of " . $forwardsCount . " forward(s)."; +} +if($groupsCount > 0) { + $desc .= " Account belongs to " . $groupsCount . " group(s)."; +} +$form->addVariable(sprintf(_($desc), $user_name), 'description', 'description', false); +if ($vars->get('submitbutton') == _("Delete")) { + if($type == 'alias') { + if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $delete = $vilma_driver->_savealias($address['address'],'delete'); + if (is_a($delete, 'PEAR_Error')) { + Horde::logMessage($delete, __FILE__, __LINE__, PEAR_LOG_ERR); + $notification->push(sprintf(_("Error deleting user. %s."), $delete->getMessage()), 'horde.error'); + $url = Horde_Util::addParameter(Horde::applicationUrl('users/index.php'), 'domain_id', $domain['id'], false); + header('Location: ' . $url); + exit; + } else { + $notification->push(_("User deleted."), 'horde.success'); + $url = Horde_Util::addParameter(Horde::applicationUrl('users/index.php'), 'domain_id', $domain['id'], false); + header('Location: ' . $url); + exit; + } + } + } else { + if ($form->validate($vars)) { + $form->getInfo($vars, $info); + //$delete = $vilma_driver->deleteUser($info['user_id']); + $delete = $vilma_driver->deleteUser($address['address']); + if (is_a($delete, 'PEAR_Error')) { + Horde::logMessage($delete, __FILE__, __LINE__, PEAR_LOG_ERR); + $notification->push(sprintf(_("Error deleting user. %s."), $delete->getMessage()), 'horde.error'); + $url = Horde_Util::addParameter(Horde::applicationUrl('users/index.php'), 'domain_id', $domain['id'], false); + header('Location: ' . $url); + exit; + } else { + $notification->push(_("User deleted."), 'horde.success'); + $url = Horde_Util::addParameter(Horde::applicationUrl('users/index.php'), 'domain_id', $domain['id'], false); + header('Location: ' . $url); + exit; + } + } + } +} elseif ($vars->get('submitbutton') == _("Do not delete")) { + $notification->push(_("User not deleted."), 'horde.message'); + $url = Horde_Util::addParameter(Horde::applicationUrl('users/index.php'), 'domain_id', $domain['domain_id'], false); + header('Location: ' . $url); + exit; +} + +/* Render the form. */ +require_once 'Horde/Form/Renderer.php'; +$renderer = &new Horde_Form_Renderer(); +$main = Horde_Util::bufferOutput(array($form, 'renderActive'), $renderer, $vars, 'delete.php', 'post'); + +$template->set('main', $main); +$template->set('menu', Vilma::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require VILMA_TEMPLATES . '/common-header.inc'; +echo $template->fetch(VILMA_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/vilma/users/edit.php b/vilma/users/edit.php new file mode 100644 index 000000000..16d56dd14 --- /dev/null +++ b/vilma/users/edit.php @@ -0,0 +1,113 @@ + + * @author David Cummings + */ + +@define('VILMA_BASE', dirname(__FILE__) . '/..'); +require_once VILMA_BASE . '/lib/base.php'; +require_once 'Horde/Form.php'; + +require_once VILMA_BASE . '/lib/Forms/EditUserForm.php'; + +/* Only admin should be using this. */ +if (!Vilma::hasPermission($domain)) { + Horde::authenticationFailureRedirect(); +} +$vars = Horde_Variables::getDefaultVariables(); +$address = $vars->get('address'); +$section = Horde_Util::getFormData('section','all'); + +//$addrInfo = $vilma_driver->getAddressInfo($address, 'all'); +$domain = Vilma::stripDomain($address); + +/* Check if a form is being edited. */ +if (!$vars->exists('mode')) { + if ($address) { + $address = $vilma_driver->getAddressInfo($address,$section); + if (is_a($address, 'PEAR_Error')) { + $notification->push(sprintf(_("Error reading address information from backend: %s"), $address->getMessage()), 'horde.error'); + $url = '/users/index.php'; + require VILMA_BASE . $url; + exit; + } + $vars = new Horde_Variables($address); + $user_name = //$vars->get('address'); + $vars->get('user_name'); + $vars->set('user_name', Vilma::stripUser($user_name)); + $domain = Vilma::stripDomain($user_name); + $vars->set('domain', $domain); + $vars->set('type', $address['type']); + $vars->set('target', 'test'); //$address['target']); + $vars->set('mode', 'edit'); + } else { + $vars->set('mode', 'new'); + $domain_info = $_SESSION['vilma']['domain']; + $domain = $domain_info['domain_name']; + $domain_id = $domain_info['domain_id']; + $vars->set('domain', $domain); + $vars->set('id', $domain_id); + $vars->add('user_name', Horde_Util::getFormData('user_name','')); + } +} + +$domain = Vilma::stripDomain($address['address']); +$tmp = $vars->get('domain'); +if(!isset($tmp)) { + $vars->set('domain', $domain); +} +$form = &new EditUserForm($vars); +if (!$vars->exists('id') && !$vilma_driver->isBelowMaxUsers($domain)) { + $notification->push(sprintf(_("\"%s\" already has the maximum number of users allowed."), $domain), 'horde.error'); + require VILMA_BASE . '/users/index.php'; + exit; +} +if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $info['user_name'] = Horde_String::lower($info['user_name']) . '@' . $domain; + $user_id = $vilma_driver->saveUser($info); + if (is_a($user_id, 'PEAR_Error')) { + Horde::logMessage($user_id, __FILE__, __LINE__, PEAR_LOG_ERR); + $notification->push(sprintf(_("Error saving user. %s"), $user_id->getMessage()), 'horde.error'); + } else { + $notification->push(_("User details saved."), 'horde.success'); + /* + $virtuals = $vilma_driver->getVirtuals($info['name']); + if (count($virtuals)) { + //User has virtual email addresses set up. + $url = Horde::applicationUrl('users/index.php', true); + header('Location: ' . (Vilma::hasPermission($domain) ? $url : Horde_Util::addParameter($url, 'domain', $domain, false))); + } else { + //User does not have any virtual email addresses set up. + $notification->push(_("No virtual email address set up for this user. You should set up at least one virtual email address if this user is to receive any emails."), 'horde.warning'); + $url = Horde::applicationUrl('virtuals/edit.php', true); + $url = Horde_Util::addParameter($url, array('domain' => $domain, 'stripped_email' => Vilma::stripUser($info['name']), 'virtual_destination' => $info['name']), null, false); + header('Location: ' . (Vilma::hasPermission($domain) ? $url : Horde_Util::addParameter($url, 'domain', $domain, false))); + } + */ + //exit; + } +} + +/* Render the form. */ +require_once 'Horde/Form/Renderer.php'; +$renderer = &new Horde_Form_Renderer(); + +$main = Horde_Util::bufferOutput(array($form, 'renderActive'), $renderer, $vars, 'edit.php', 'post'); + +$template->set('main', $main); +$template->set('menu', Vilma::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require VILMA_TEMPLATES . '/common-header.inc'; +echo $template->fetch(VILMA_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/vilma/users/index.php b/vilma/users/index.php new file mode 100644 index 000000000..ac90734e7 --- /dev/null +++ b/vilma/users/index.php @@ -0,0 +1,111 @@ + + * @author Ben Klang + * @author David Cummings + */ + +@define('VILMA_BASE', dirname(__FILE__) . '/..'); +require_once VILMA_BASE . '/lib/base.php'; +require_once 'Horde/Prefs/CategoryManager.php'; + +/* Only admin should be using this. */ +if (!Vilma::hasPermission($curdomain)) { + Horde::authenticationFailureRedirect(); +} + +// Input validation: make sure we have a valid section +$vars = Horde_Variables::getDefaultVariables(); +$section = $vars->get('section'); +$tmp = Vilma::getUserMgrTypes(); +if (!array_key_exists($section, Vilma::getUserMgrTypes())) { + $section = 'all'; + $vars->set('section', $section); +} +$tabs = Vilma::getUserMgrTabs($vars); + +$addresses = $vilma_driver->getAddresses($curdomain['domain_name'], $section); +if (is_a($addresses, 'PEAR_Error')) { + $notification->push($addresses); + header('Location: ' . Horde::applicationUrl('index.php')); +} + +// Page results +$page = Horde_Util::getGet('page', 0); +$perpage = $prefs->getValue('addresses_perpage'); +$url = 'users/index.php'; +$url = Horde_Util::addParameter($url, 'section', $section); +$pager = new Horde_UI_Pager('page', + Horde_Variables::getDefaultVariables(), + array('num' => count($addresses), + 'url' => $url, + 'page_count' => 10, + 'perpage' => $perpage)); +$addresses = array_slice($addresses, $page*$perpage, $perpage); + +$types = Vilma::getUserMgrTypes(); +foreach ($addresses as $i => $address) { + $type = $address['type']; + $id = $address['id']; + $url = Horde::applicationUrl('users/edit.php'); + $url = Horde_Util::addParameter($url, 'address', $id); + if($type === 'alias') { + $addresses[$i]['edit_url'] = ''; + } else { + $addresses[$i]['edit_url'] = Horde_Util::addParameter($url, 'section', $section); + } + $url = Horde::applicationUrl('users/delete.php'); + $currentAddress = $address['address']; + if(!isset($currentAddress) || empty($currentAddress)) { + $currentAddress = $address['user_name'] . $address['domain']; + } + $url = Horde_Util::addParameter($url, 'address', $currentAddress); + //$addresses[$i]['del_url'] = Horde_Util::addParameter($url, 'address', $id); + $addresses[$i]['del_url'] = Horde_Util::addParameter($url, 'section', $section); + //$url = Horde::applicationUrl('users/edit.php'); + //$addresses[$i]['view_url'] = Horde_Util::addParameter($url, 'address', $address['user_name']); + $url = Horde::applicationUrl('users/edit.php'); + $url = Horde_Util::addParameter($url, 'address', $id); + if($type === 'alias') { + $addresses[$i]['view_url'] = ''; + } else { + $addresses[$i]['view_url'] = Horde_Util::addParameter($url, 'section', $section); + } + $addresses[$i]['type'] = $types[$address['type']]['singular']; + $addresses[$i]['status'] = $vilma_driver->getUserStatus($address); +} + +/* Set up the template action links. */ +if ($vilma_driver->isBelowMaxUsers($curdomain['domain_name'])) { + $url = Horde::applicationUrl('users/edit.php'); + $maxusers = ''; +} else { + $maxusers = _("Maximum Users"); +} + +$url = Horde::applicationUrl('virtuals/edit.php'); + +/* Set up the template fields. */ +$template->set('addresses', $addresses, true); +$template->set('maxusers', $maxusers, true); +$template->set('menu', Vilma::getMenu('string')); +$template->set('tabs', $tabs->render()); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); +$template->set('pager', $pager->render()); + +/* Set up the field list. */ +$images = array('delete' => Horde::img('delete.png', _("Delete User"), '', $registry->getImageDir('horde')), + 'edit' => Horde::img('edit.png', _("Edit User"), '', $registry->getImageDir('horde'))); +$template->set('images', $images); + +/* Render the page. */ +require VILMA_TEMPLATES . '/common-header.inc'; +echo $template->fetch(VILMA_TEMPLATES . '/users/index.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/vilma/virtuals/delete.php b/vilma/virtuals/delete.php new file mode 100644 index 000000000..e222a1df1 --- /dev/null +++ b/vilma/virtuals/delete.php @@ -0,0 +1,69 @@ + + */ + +@define('VILMA_BASE', dirname(__FILE__) . '/..'); +require_once VILMA_BASE . '/lib/base.php'; +require_once 'Horde/Form.php'; + +/* Only admin should be using this. */ +if (!Horde_Auth::isAdmin()) { + Horde::authenticationFailureRedirect(); +} + +$vars = Horde_Variables::getDefaultVariables(); +$virtual_id = $vars->get('virtual_id'); +$formname = $vars->get('formname'); + +$virtual = $vilma_driver->getVirtual($virtual_id); +$domain = Vilma::stripDomain($virtual['virtual_email']); +$domain = $vilma_driver->getDomainByName($domain); + +$form = new Horde_Form($vars, _("Delete Virtual Email Address")); + +/* Set up the form. */ +$form->setButtons(array(_("Delete"), _("Do not delete"))); +$form->addHidden('', 'virtual_id', 'text', false); +$form->addVariable(sprintf(_("Delete the virtual email address \"%s\" => \"%s\"?"), $virtual['virtual_email'], $virtual['virtual_destination']), 'description', 'description', false); + +if ($vars->get('submitbutton') == _("Delete")) { + if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $delete = $vilma_driver->deleteVirtual($info['virtual_id']); + if (is_a($delete, 'PEAR_Error')) { + Horde::logMessage($delete, __FILE__, __LINE__, PEAR_LOG_ERR); + $notification->push(sprintf(_("Error deleting virtual email. %s."), $delete->getMessage()), 'horde.error'); + } else { + $notification->push(_("Virtual email deleted."), 'horde.success'); + $url = Horde_Util::addParameter(Horde::applicationUrl('virtuals/index.php'), 'domain_id', $domain['domain_id'], false); + header('Location: ' . $url); + exit; + } + } +} elseif ($vars->get('submitbutton') == _("Do not delete")) { + $notification->push(_("Virtual email not deleted."), 'horde.message'); + $url = Horde_Util::addParameter(Horde::applicationUrl('virtuals/index.php'), 'domain_id', $domain['domain_id'], false); + header('Location: ' . $url); + exit; +} + +/* Render the form. */ +require_once 'Horde/Form/Renderer.php'; +$renderer = &new Horde_Form_Renderer(); +$main = Horde_Util::bufferOutput(array($form, 'renderActive'), $renderer, $vars, 'delete.php', 'post'); + +$template->set('main', $main); +$template->set('menu', Vilma::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require VILMA_TEMPLATES . '/common-header.inc'; +echo $template->fetch(VILMA_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/vilma/virtuals/edit.php b/vilma/virtuals/edit.php new file mode 100644 index 000000000..c961da77b --- /dev/null +++ b/vilma/virtuals/edit.php @@ -0,0 +1,96 @@ + + */ + +@define('VILMA_BASE', dirname(__FILE__) . '/..'); +require_once VILMA_BASE . '/lib/base.php'; +require_once 'Horde/Form.php'; +require_once 'Horde/Form/Action.php'; + +/* Only admin should be using this. */ +if (!Horde_Auth::isAdmin() && !Vilma::isDomainAdmin()) { + Horde::authenticationFailureRedirect(); +} + +$domain = Vilma::getDomain(); +$vars = Horde_Variables::getDefaultVariables(); +$virtual_id = $vars->get('virtual_id'); +$user = $vars->get('user'); +$formname = $vars->get('formname'); + +/* Check if a form is being edited. */ +$editing = false; +if ($virtual_id && !$formname) { + $vars = new Horde_Variables($vilma_driver->getVirtual($virtual_id)); + $editing = true; +} + +if (empty($domain)) { + $domain = Vilma::stripDomain($vars->get('virtual_destination')); +} +$users = $vilma_driver->getUsers($domain); +$user_list = array(); +foreach ($users as $user) { + $virtual_destination = substr($user['user_name'], 0, strpos($user['user_name'], '@')); + $user_list[$user['user_name']] = $virtual_destination; +} + +$form = new Horde_Form($vars, ($editing) ? _("Edit Virtual Email Address") : _("New Virtual Email Address")); + +/* Set up the form. */ +$form->setButtons(true, true); +$form->addHidden('', 'virtual_id', 'int', false); +$form->addHidden('', 'domain', 'text', false); +$form->addVariable(_("Virtual Email"), 'stripped_email', 'text', true, false, sprintf(_("Enter a virtual email address @%s and then indicate below where mail sent to that address is to be delivered. The address must begin with an alphanumerical character, it must contain only alphanumerical and '._-' characters, and must end with an alphanumerical character."), $domain), array('~^[a-zA-Z0-9]{1,1}[a-zA-Z0-9._-]*[a-zA-Z0-9]$~')); +$var = &$form->addVariable(_("Destination type"), 'destination_type', 'enum', + true, false, null, + array(array('local' => _("Local user"), + 'remote' => _("Remote address")))); +$action = Horde_Form_Action::factory('reload'); +$var->setAction($action); +if ($vars->get('destination_type') == 'remote') { + $form->addVariable(_("Remote e-mail address"), 'virtual_destination', + 'email', true, false); +} else { + $form->addVariable(_("Destination"), 'virtual_destination', 'enum', + true, false, null, array($user_list, true)); +} + +if ($form->validate($vars)) { + $form->getInfo($vars, $info); + $info['stripped_email'] = Horde_String::lower($info['stripped_email']); + if ($info['destination_type'] == 'remote') { + $info['virtual_destination'] = Horde_String::lower($info['virtual_destination']); + } + $virtual_id = $vilma_driver->saveVirtual($info, $domain); + if (is_a($virtual_id, 'PEAR_Error')) { + Horde::logMessage($virtual_id, __FILE__, __LINE__, PEAR_LOG_ERR); + $notification->push(sprintf(_("Error saving virtual email. %s."), $virtual_id->getMessage()), 'horde.error'); + } else { + $notification->push(_("Virtual email saved."), 'horde.success'); + $url = Horde::applicationUrl('virtuals/index.php', true); + header('Location: ' . Horde_Util::addParameter($url, 'user', $info['virtual_destination'], false)); + exit; + } +} + +/* Render the form. */ +require_once 'Horde/Form/Renderer.php'; +$renderer = new Horde_Form_Renderer(); +$main = Horde_Util::bufferOutput(array($form, 'renderActive'), $renderer, $vars, 'edit.php', 'post'); + +$template->set('main', $main); +$template->set('menu', Vilma::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +require VILMA_TEMPLATES . '/common-header.inc'; +echo $template->fetch(VILMA_TEMPLATES . '/main/main.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/vilma/virtuals/index.php b/vilma/virtuals/index.php new file mode 100644 index 000000000..901e0ccfe --- /dev/null +++ b/vilma/virtuals/index.php @@ -0,0 +1,65 @@ + + */ + +@define('VILMA_BASE', dirname(__FILE__) . '/..'); +require_once VILMA_BASE . '/lib/base.php'; + +/* Only admin should be using this. */ +if (!Horde_Auth::isAdmin() && !Vilma::isDomainAdmin()) { + Horde::authenticationFailureRedirect(); +} + +$user = Horde_Util::getFormData('user'); +if (!empty($user)) { + $virtuals = $vilma_driver->getVirtuals($user); + $domain = Vilma::stripDomain($user); +} else { + $domain = Vilma::getDomain(); + $virtuals = $vilma_driver->getVirtuals($domain); +} + +if (is_a($virtuals, 'PEAR_Error')) { + $notification->push($virtuals); + header('Location: ' . Horde::applicationUrl('index.php')); +} + +foreach ($virtuals as $id => $virtual) { + $url = Horde::applicationUrl('virtuals/edit.php'); + $virtuals[$id]['edit_url'] = Horde_Util::addParameter($url, 'virtual_id', $virtual['virtual_id']); + $url = Horde::applicationUrl('virtuals/delete.php'); + $virtuals[$id]['del_url'] = Horde_Util::addParameter($url, 'virtual_id', $virtual['virtual_id']); +} + +$template->set('virtuals', $virtuals, true); + +/* Set up the template action links. */ +$actions = array(); +$url = Horde::applicationUrl('virtuals/edit.php'); +$actions['new_url'] = (Vilma::isDomainAdmin() ? $url : Horde_Util::addParameter($url, 'domain', $domain)); +$actions['new_text'] = _("New Virtual Email"); +$url = Horde::applicationUrl('users/index.php'); +$actions['users_url'] = (Vilma::isDomainAdmin() ? $url : Horde_Util::addParameter($url, 'domain', $domain)); +$actions['users_text'] = _("Users"); +$template->set('actions', $actions); + +/* Set up the field list. */ +$images = array('delete' => Horde::img('delete.png', _("Delete User"), '', $registry->getImageDir('horde')), + 'edit' => Horde::img('edit.png', _("Edit User"), '', $registry->getImageDir('horde'))); +$template->set('images', $images); + +$template->set('menu', Vilma::getMenu('string')); +$template->set('notify', Horde_Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status'))); + +/* Render the page. */ +require VILMA_TEMPLATES . '/common-header.inc'; +echo $template->fetch(VILMA_TEMPLATES . '/virtuals/index.html'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; -- 2.11.0