Minimum Survial Readme
-1) select a uid and gid apache to run under
- or if this is already fixed take it into account
+VPOPMAIL SPECIFIC ISSUES
+-------------------------------------------------------------------------------
-2) install vpopmail with EXACTLY the same uid gid
- in case you already have installed vpopmail
- you have two choices - to change apache's
- uid/gid but be careful - this may break some
- existing scripts or worse your server's security
+assume
+ qmail is installed in /var/qmail
+ vpopmail in ~vpopmail
+ qmail-send runs as qmails
- changing existing vpopmail uid/gid is possible
- but not easy - take these into account:
- #1 - backup your setup!
+different parts of vpopmail require certain user id (uid) and
+group id (gid) in order to operate normally.
- stop qmail-send before doing any changes
- else your mail in process may get bounced or
- deleted or delivered to a default destination or...
+brief list with requirements:
- stop pop3/imap remote users - while changing uids
- users cannot check their mail
+adddomain
+deldomain
+addaliasdomain
+ read/write permissions on
+ /var/qmail/users/ assing, assign.lock, cdb
- you may leave smtp - qmail-inject will take care
- no matter vpopmail setup is broken (if and only
- if you have stopped qmail-send)
+ read/write permissions on
+ /var/qmail/control/*
- rc.d scrips tcpserver uid/gid may need to be changed
+ singnal qmail-send with SIGHUP (uid==qmails or root)
- remember to
- ./configure ....opts....
- make clean all install
- in vpopmail src tree
+ read/write permissions on
+ ~vpopmail/domains
- after these steps change the uid/gid in
- /var/qmail/users/assign
- compile the assign file. the dummies way is to
- vadddomain mydummy.domain aaaa
- vdeldomain mydummy.domain
+ optionally read/write to cdb vpopmail databases
- suid root vadddomain, vdeldomain and vaddaliasdomain
- cd ~vpopmail/bin
- chown 0.0 vadddomain vdeldomain vaddaliasdomain
- chmod +s vadddomain vdeldomain vaddaliasdomain
- beware these programs may be exploitable and if
- neccessary chmod 700 ~vpopmail/bin
+adduser
+deluser
+ read/write permissions on
+ ~vpopmail/domains/<givendomain> (or the default domain)
- run qmail-send (/bin/csh -cf '/var/qmail/rc &')
- run pop3 tcpserver or what you are using
+ optionally read/write to cdb vpopmail databases
- verify your setup
+passwd
+ optionally read/write on
+ ~vpopmail/domains/<givendomain>/<givenuser>
+ (only when sqwebmail is configured)
-3) check that vpopmail support is compiled into apache
- throug a simple phpinfo. there some more info helpful
- for debugging will appear
+setuserquota
+ optionally read/write to cdb vpopmail databases
-4) happy vpopmail-ing :-)
+auth_user
+ optionally read from cdb vpopmail databases
+
+POSSIBLE SCENARIOS
+-------------------------------------------------------------------------------
+
+php is in cgi mode
+
+ command line invocation
+
+ web server cgi invocation
+
+php is web server module
+
+
+in command line mode the php interpreter may be run from vpopmail uid to
+administer users, etc. or as root to add/del domains - this is the easiest case
+
+in cgi mode proper uid may be provided eighter by suid php interpreter or
+using cgi exec wrapper. the same restrictions as in command line mode apply
+
+the web server module mode is the most powerful and works much faster that cgi.
+in this mode more restrictions apply because web server's uid at least must
+be able to read/write the directories of the manages domains.
+
+first scenario only allows web scripts to manage certain domains. security
+may be compromised if there are user webs under the same web server
+with allowed script execution.
+
+second scenario is to setup web server and vpopmail under the same uid/gid.
+thus allowing only user management in all domains.
+
+third scenario extends second with the ability to manage domains. generally
+from security reasons it is not a good idea to run such a system on a server
+with shell users - vpopmail's domain admin tools must be suid root to work
+properly and most users will be able to add/delete domains.
+
+it is not considered a good idea to run web servers as root. hence the need
+to suid vpopmail domain management tools and exec them insted using native api.
+native api for domains is only suitable for cgi/command line mode, when php is
+run through suid root wrapper or suid itself.
+
+almost all scenarios lack secutiry in different ways - eighter powerful tools
+get suid root or parts of vpopmail setup become useable by any system user
+or web users with cgi/php access may utilize vpopmail api for mail management.
+
+perhapse the most secure solution is to run a separate apache server under
+the vpopmail user and chmod 700 ~vpopmail/bin.
+
+FREQUENTLY USED CONFIGURATION STEPS
+-------------------------------------------------------------------------------
+
+changing existing vpopmail uid/gid is possible but not easy -
+take these into account:
+
+#1 - backup your setup, mail and configuration!
+
+ stop qmail-send before doing any changes
+ else your mail in process may get bounced or
+ deleted or delivered to a default destination or...
+
+ stop pop3/imap remote/local users - while changing uids
+ users cannot check their mail
+
+ you may leave smtp - qmail-inject will take care
+ no matter vpopmail setup is broken (if and only
+ if you have stopped qmail-send)
+
+ in rc.d scripts tcpserver uid/gid may need to be changed
+
+ reconfiguring vpopmail:
+ ./configure ....your opts plus new uid/gid....
+
+ remember to
+ make clean all install
+ in vpopmail src tree; clean is needed if vpopmail has already been
+ configured with another uid/gid - vpopmail's dependencies are not
+ intact after reconfigure
+
+ after these steps change the uid/gid in
+ /var/qmail/users/assign
+ compile the assign file. the dummies way is to
+ vadddomain mydummy.domain aaaa
+ vdeldomain mydummy.domain
+
+ suid root vadddomain, vdeldomain and vaddaliasdomain
+ (this is only needed for domain management in web server module)
+ cd ~vpopmail/bin
+ chown 0.0 vadddomain vdeldomain vaddaliasdomain
+ chmod +s vadddomain vdeldomain vaddaliasdomain
+
+ optionally secure ~vpopmail/bin
+ (beware these programs may be exploitable or at least used)
+ chmod 700 ~vpopmail/bin
+
+ run qmail-send
+ /bin/csh -cf '/var/qmail/rc &'
+
+ run pop3 tcpserver or what you are using
+
+ verify your setup
+
+#2 verify php vpopmail module and configuration
+
+ for web server module and cgi setups create a phpinfo page:
+
+ <?php phpinfo() ?>
+
+ for command line mode run
+ php -i
+
+ check for vpopmail section in result
+
+ verify that php euid/egid match vpopmail's
+
+ in setups where only certain domain users will be administrated
+ verify that php euid/egid can access their respective directories
+
+CONTACT INFO
+-------------------------------------------------------------------------------
your comments, fixes and stuff are welcome
Boian Bonev <boian@bonev.com>
#include "php_ini.h"
#include "php_vpopmail.h"
+#if HAVE_VPOPMAIL
+
#include "vpopmail.h"
+#include "ext/standard/exec.h"
#include "ext/standard/php_string.h"
ZEND_DECLARE_MODULE_GLOBALS(vpopmail)
#undef PACKAGE
#include "vpopmail.h"
+/* vpopmail does not export this, argh! */
+#define MAX_BUFF 500
+
/* Function table */
function_entry vpopmail_functions[] = {
- /* domain management */
- PHP_FE(vpopmail_adddomain, NULL)
- PHP_FE(vpopmail_deldomain, NULL)
+ /* domain management - lib call */
+ PHP_FE(vpopmail_add_domain, NULL)
+ PHP_FE(vpopmail_del_domain, NULL)
+ PHP_FE(vpopmail_add_alias_domain, NULL)
+ /* domain management - exec */
+ PHP_FE(vpopmail_add_domain_ex, NULL)
+ PHP_FE(vpopmail_del_domain_ex, NULL)
+ PHP_FE(vpopmail_add_alias_domain_ex, NULL)
/* user management */
- PHP_FE(vpopmail_adduser, NULL)
- PHP_FE(vpopmail_deluser, NULL)
+ PHP_FE(vpopmail_add_user, NULL)
+ PHP_FE(vpopmail_del_user, NULL)
PHP_FE(vpopmail_passwd, NULL)
- PHP_FE(vpopmail_setuserquota, NULL)
+ PHP_FE(vpopmail_set_user_quota, NULL)
PHP_FE(vpopmail_auth_user, NULL)
+ /* error handling */
+ PHP_FE(vpopmail_error, NULL)
{NULL, NULL, NULL}
};
PHP_INI_BEGIN()
- /* STD_PHP_INI_ENTRY("vpopmail.directory", "", PHP_INI_ALL, OnUpdateString, directory, php_vpopmail_globals, vpopmail_globals) */
+ /*STD_PHP_INI_ENTRY("vpopmail.directory", "", PHP_INI_ALL, OnUpdateString, directory, php_vpopmail_globals, vpopmail_globals)*/
PHP_INI_END()
VPOPMAILLS_FETCH();
VPOPMAILG(vpopmail_open) = 0;
+ VPOPMAILG(vpopmail_errno) = 0;
return SUCCESS;
}
{
char ids[64];
- sprintf(ids, "%d/%d", VPOPMAILUID, VPOPMAILGID);
+ sprintf(ids, "%d/%d %d/%d/%d/%d", VPOPMAILUID, VPOPMAILGID, getuid(), getgid(), geteuid(), getegid());
php_info_print_table_start();
php_info_print_table_header(2, "vpopmail support", "enabled");
php_info_print_table_row(2, "vpopmail version", VERSION);
- php_info_print_table_row(2, "vpopmail uid/gid", ids);
+ php_info_print_table_row(2, "vpopmail uid/gid php uid/gid/euid/egid", ids);
php_info_print_table_row(2, "vpopmail dir", VPOPMAILDIR);
+ php_info_print_table_row(2, "vpopmail vadddomain", VPOPMAIL_BIN_DIR VPOPMAIL_ADDD);
+ php_info_print_table_row(2, "vpopmail vdeldomain", VPOPMAIL_BIN_DIR VPOPMAIL_DELD);
+ php_info_print_table_row(2, "vpopmail vaddaliasdomain", VPOPMAIL_BIN_DIR VPOPMAIL_ADAD);
php_info_print_table_end();
DISPLAY_INI_ENTRIES();
}
+/*
+ * Domain management functions - library call
+ */
-
-/* {{{ proto void vpopmail_adddomain(string domain, string dir, int uid, int gid)
+/* {{{ proto bool vpopmail_add_domain(string domain, string dir, int uid, int gid)
Add a new virtual domain */
-PHP_FUNCTION(vpopmail_adddomain)
+PHP_FUNCTION(vpopmail_add_domain)
{
zval **domain;
zval **dir;
Z_LVAL_PP(gid)
#endif
);
+ VPOPMAILG(vpopmail_errno)=retval;
if (retval == VA_SUCCESS) {
RETURN_TRUE;
}
else {
- php_error(E_WARNING, "vpopmail error: %s", verror(retval));
+ php_error(E_WARNING, "vpopmail error: %s", verror(retval));
RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto void vpopmail_deldomain(string domain)
+/* {{{ proto bool vpopmail_del_domain(string domain)
Delete a virtual domain */
-PHP_FUNCTION(vpopmail_deldomain)
+PHP_FUNCTION(vpopmail_del_domain)
{
zval **domain;
int retval;
VPOPMAILG(vpopmail_open) = 1;
retval = vdeldomain(Z_STRVAL_PP(domain));
+
+ VPOPMAILG(vpopmail_errno)=retval;
if (retval == VA_SUCCESS) {
RETURN_TRUE;
}
else {
- php_error(E_WARNING, "vpopmail error: %s", verror(retval));
+ php_error(E_WARNING, "vpopmail error: %s", verror(retval));
RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto void vpopmail_addaliasdomain(string domain, string aliasdomain)
+/* {{{ proto bool vpopmail_add_alias_domain(string domain, string aliasdomain)
Add an alias for a virtual domain */
-PHP_FUNCTION(vpopmail_addaliasdomain)
+PHP_FUNCTION(vpopmail_add_alias_domain)
{
zval **domain;
zval **aliasdomain;
tmpstr = vget_assign(Z_STRVAL_PP(domain), Dir, 156, &uid, &gid);
if (tmpstr == NULL) {
- php_error(E_WARNING, "existing domain %s was not found", Z_STRVAL_PP(domain));
+ php_error(E_WARNING, "vpopmail_add_alias_domain error: existing domain %s was not found", Z_STRVAL_PP(domain));
+ VPOPMAILG(vpopmail_errno) = 1;
RETURN_FALSE;
}
sprintf(TmpBuf2, "%s/domains/%s", Dir, Z_STRVAL_PP(domain));
if (symlink(TmpBuf2, TmpBuf1) != 0) {
- php_error(E_WARNING, "vpopmail_addaliasdomain could not symlink domains: %s", strerror(errno));
+ php_error(E_WARNING, "vpopmail_add_alias_domain error: could not symlink domains: %s", strerror(errno));
+ VPOPMAILG(vpopmail_errno) = 1;
RETURN_FALSE;
}
if (add_domain_assign(Z_STRVAL_PP(aliasdomain), Dir, uid, gid) != 0) {
php_error(E_WARNING, "vpopmail_addaliasdomain could not add domain to control files");
+ VPOPMAILG(vpopmail_errno) = 1;
RETURN_FALSE;
}
signal_process("qmail-send", SIGHUP);
+ VPOPMAILG(vpopmail_errno) = 0;
RETURN_TRUE;
}
/* }}} */
-/* {{{ proto void vpopmail_adduser(string user, string domain, string password[, string gecos[, bool apop]])
+/*
+ * Domain management functions - exec
+ */
+
+/* {{{ proto int vpopmail_add_domain_ex(string domain, string passwd [, string quota [, string bounce [, bool apop]]])
+ Add a new virtual domain */
+PHP_FUNCTION(vpopmail_add_domain_ex) {
+ zval **domain, **passwd, **quota, **bounce, **apop;
+ int retval,len=0,argc=ZEND_NUM_ARGS(),Uid=VPOPMAILUID,Gid=VPOPMAILGID,is_bounce_email;
+ int fr_bounce=0,fr_quota=0;
+ char *q,*bo,*cmd,*escdomain="",*escpasswd="",*escquota="",*escbounce="",*escapop="";
+
+ if (argc < 2 || argc > 5 || zend_get_parameters_ex(argc, &domain, &passwd, "a, &bounce, &apop) == FAILURE){
+ WRONG_PARAM_COUNT;
+ }
+
+ VPOPMAILLS_FETCH();
+
+ switch (argc) {
+ case 5:
+ convert_to_long_ex(apop);
+ escapop=Z_BVAL_PP(apop)?"1":"0";
+ /* Fall-through. */
+ case 4:
+ fr_bounce=1;
+ convert_to_string_ex(bounce);
+ escbounce=php_escape_shell_cmd(Z_STRVAL_PP(bounce));
+ if (!escbounce) {
+ php_error(E_WARNING,"vpopmail_adddomain error: cannot alloc");
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ }
+ /* Fall-through. */
+ case 3:
+ fr_quota=1;
+ convert_to_string_ex(quota);
+ escquota=php_escape_shell_cmd(Z_STRVAL_PP(quota));
+ if (!escquota) {
+ php_error(E_WARNING,"vpopmail_adddomain error: cannot alloc");
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ }
+ /* Fall-through. */
+ case 2:
+ convert_to_string_ex(passwd);
+ convert_to_string_ex(domain);
+ break;
+ }
+
+ escdomain=php_escape_shell_cmd(Z_STRVAL_PP(domain));
+ escpasswd=php_escape_shell_cmd(Z_STRVAL_PP(passwd));
+ if (!escdomain||!escpasswd) {
+ if (fr_quota)
+ efree(escquota);
+ if (fr_bounce)
+ efree(escbounce);
+ php_error(E_WARNING,"vpopmail_adddomain error: cannot alloc");
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ }
+ len+=strlen(VPOPMAIL_BIN_DIR);
+ len+=strlen(VPOPMAIL_ADDD);
+ if (*escquota)
+ len+=strlen("-q ")+strlen(escquota)+strlen(" ");
+ if (*escbounce) {
+ if (strchr(Z_STRVAL_PP(bounce),'@')) {
+ is_bounce_email=1;
+ len+=strlen("-e ")+strlen(escbounce)+strlen(" ");
+ } else {
+ is_bounce_email=0;
+ len+=strlen("-b ");
+ }
+ }
+ if (*escapop)
+ len+=strlen("-a ");
+ len+=strlen(escdomain)+strlen(" ");
+ len+=strlen(escpasswd)+strlen(" ");
+ len++;
+ cmd=emalloc(len);
+ if (!cmd) {
+ if (fr_quota)
+ efree(escquota);
+ if (fr_bounce)
+ efree(escbounce);
+ efree(escdomain);
+ efree(escpasswd);
+ php_error(E_WARNING,"vpopmail_adddomain error: cannot alloc");
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ }
+ strcpy(cmd,VPOPMAIL_BIN_DIR VPOPMAIL_ADDD);
+ if (*escquota) {
+ strcat(cmd,"-q ");
+ strcat(cmd,escquota);
+ strcat(cmd," ");
+ }
+ if (*escbounce) {
+ if (is_bounce_email) {
+ strcat(cmd,"-e ");
+ strcat(cmd,escbounce);
+ strcat(cmd," ");
+ } else {
+ strcat(cmd,"-b ");
+ }
+ }
+ if (*escapop)
+ strcat(cmd,"-a ");
+ strcat(cmd,escdomain);
+ strcat(cmd," ");
+ strcat(cmd,escpasswd);
+ retval=php_Exec(0,cmd,NULL,return_value);
+ efree(cmd);
+ efree(escdomain);
+ efree(escpasswd);
+ if (fr_quota)
+ efree(escquota);
+ if (fr_bounce)
+ efree(escbounce);
+
+ if (retval!=VA_SUCCESS) {
+ php_error(E_WARNING,"vpopmail_add_domain_ex error: %d", retval);
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ } else {
+ VPOPMAILG(vpopmail_errno)=0;
+ RETURN_TRUE;
+ }
+}
+/* }}} */
+
+/* {{{ proto int vpopmail_del_domain_ex(string domain)
+ Delete a virtual domain */
+PHP_FUNCTION(vpopmail_del_domain_ex) {
+ zval **domain;
+ int retval=-1;
+ char *cmd,*escdomain;
+
+ if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &domain) == FAILURE){
+ WRONG_PARAM_COUNT;
+ }
+
+ VPOPMAILLS_FETCH();
+
+ convert_to_string_ex(domain);
+
+ escdomain=php_escape_shell_cmd(Z_STRVAL_PP(domain));
+ if (!escdomain) {
+ php_error(E_WARNING,"vpopmail_del_domain_ex error: cannot alloc");
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ }
+ cmd=emalloc(strlen(VPOPMAIL_BIN_DIR)+strlen(VPOPMAIL_DELD)+strlen(escdomain)+1);
+ if (!cmd) {
+ efree(escdomain);
+ php_error(E_WARNING,"vpopmail_del_domain_ex error: cannot alloc");
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ }
+ sprintf(cmd,VPOPMAIL_BIN_DIR VPOPMAIL_DELD"%s",escdomain);
+ retval=php_Exec(0,cmd,NULL,return_value);
+ efree(escdomain);
+ efree(cmd);
+
+ if (retval!=VA_SUCCESS) {
+ php_error(E_WARNING,"vpopmail_del_domain_ex error: %d", retval);
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ } else {
+ VPOPMAILG(vpopmail_errno)=0;
+ RETURN_TRUE;
+ }
+}
+/* }}} */
+
+/* {{{ proto int vpopmail_add_alias_domain_ex(string olddomain, string newdomain)
+ Add alias to an existing virtual domain */
+PHP_FUNCTION(vpopmail_add_alias_domain_ex) {
+ zval **olddomain, **newdomain;
+ int retval;
+ char *cmd,*escolddomain,*escnewdomain;
+
+ if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &olddomain, &newdomain) == FAILURE){
+ WRONG_PARAM_COUNT;
+ }
+
+ VPOPMAILLS_FETCH();
+
+ convert_to_string_ex(olddomain);
+ convert_to_string_ex(newdomain);
+ escnewdomain=php_escape_shell_cmd(Z_STRVAL_PP(newdomain));
+ if (!escnewdomain) {
+ php_error(E_WARNING,"vpopmail_addaliasdomain error: cannot alloc");
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ }
+ escolddomain=php_escape_shell_cmd(Z_STRVAL_PP(olddomain));
+ if (!escolddomain) {
+ efree(escnewdomain);
+ php_error(E_WARNING,"vpopmail_addaliasdomain error: cannot alloc");
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ }
+
+ cmd=emalloc(strlen(VPOPMAIL_BIN_DIR VPOPMAIL_ADAD)+strlen(escolddomain)+strlen(" ")+strlen(escnewdomain)+1);
+ if (!cmd) {
+ efree(escnewdomain);
+ efree(escolddomain);
+ php_error(E_WARNING,"vpopmail_addaliasdomain error: cannot alloc");
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ }
+ sprintf(cmd,"%s%s %s",VPOPMAIL_BIN_DIR VPOPMAIL_ADAD,escolddomain,escnewdomain);
+ retval=php_Exec(0,cmd,NULL,return_value);
+ efree(cmd);
+ efree(escnewdomain);
+ efree(escolddomain);
+
+ if (retval!=VA_SUCCESS) {
+ php_error(E_WARNING,"vpopmail_addaliasdomain error: %d", retval);
+ VPOPMAILG(vpopmail_errno)=1;
+ RETURN_FALSE;
+ } else {
+ VPOPMAILG(vpopmail_errno)=0;
+ RETURN_TRUE;
+ }
+}
+/* }}} */
+
+/*
+ * User management functions
+ */
+
+/* {{{ proto bool vpopmail_add_user(string user, string domain, string password[, string gecos[, bool apop]])
Add a new user to the specified virtual domain */
-PHP_FUNCTION(vpopmail_adduser)
+PHP_FUNCTION(vpopmail_add_user)
{
zval **user;
zval **domain;
Z_STRVAL_PP(password),
the_gecos,
is_apop);
+
+ VPOPMAILG(vpopmail_errno)=retval;
if (retval == VA_SUCCESS) {
RETURN_TRUE;
}
else {
- php_error(E_WARNING, "vpopmail error: %s", verror(retval));
+ php_error(E_WARNING, "vpopmail error: %s", verror(retval));
RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto void vpopmail_deluser(string user, string domain)
+/* {{{ proto bool vpopmail_del_user(string user, string domain)
Delete a user from a virtual domain */
-PHP_FUNCTION(vpopmail_deluser)
+PHP_FUNCTION(vpopmail_del_user)
{
zval **user;
zval **domain;
retval = vdeluser(Z_STRVAL_PP(user),
Z_STRVAL_PP(domain));
+ VPOPMAILG(vpopmail_errno)=retval;
+
if (retval == VA_SUCCESS) {
RETURN_TRUE;
}
else {
- php_error(E_WARNING, "vpopmail error: %s", verror(retval));
+ php_error(E_WARNING, "vpopmail error: %s", verror(retval));
RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto void vpopmail_passwd(string user, string domain, string password)
+/* {{{ proto bool vpopmail_passwd(string user, string domain, string password)
Change a virtual user's password */
PHP_FUNCTION(vpopmail_passwd)
{
Z_STRVAL_PP(domain),
Z_STRVAL_PP(password),
is_apop);
+
+ VPOPMAILG(vpopmail_errno)=retval;
if (retval == VA_SUCCESS) {
RETURN_TRUE;
}
else {
- php_error(E_WARNING, "vpopmail error: %s", verror(retval));
+ php_error(E_WARNING, "vpopmail error: %s", verror(retval));
RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto void vpopmail_setuserquota(string user, string domain, string quota)
+/* {{{ proto bool vpopmail_set_user_quota(string user, string domain, string quota)
Sets a virtual user's quota */
-PHP_FUNCTION(vpopmail_setuserquota)
+PHP_FUNCTION(vpopmail_set_user_quota)
{
zval **user;
zval **domain;
retval = vsetuserquota(Z_STRVAL_PP(user),
Z_STRVAL_PP(domain),
Z_STRVAL_PP(quota));
+
+ VPOPMAILG(vpopmail_errno)=retval;
if (retval == VA_SUCCESS) {
RETURN_TRUE;
}
else {
- php_error(E_WARNING, "vpopmail error: %s", verror(retval));
+ php_error(E_WARNING, "vpopmail error: %s", verror(retval));
RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto void vpopmail_auth_user(string user, string domain, string password[, bool apop])
+/* {{{ proto bool vpopmail_auth_user(string user, string domain, string password[, string apop])
Attempt to validate a username/domain/password. Returns true/false */
PHP_FUNCTION(vpopmail_auth_user)
{
zval **domain;
zval **password;
zval **apop;
- int is_apop = 0;
struct passwd *retval;
if (ZEND_NUM_ARGS() < 3 || ZEND_NUM_ARGS() > 4
|| zend_get_parameters_ex(ZEND_NUM_ARGS(), &user, &domain, &password, &apop) == FAILURE)
WRONG_PARAM_COUNT;
- if (ZEND_NUM_ARGS() > 3) {
- convert_to_boolean_ex(apop);
- is_apop = (Z_BVAL_PP(apop) ? 1 : 0);
- }
+ if (ZEND_NUM_ARGS() > 3)
+ convert_to_string_ex(apop);
convert_to_string_ex(user);
convert_to_string_ex(domain);
VPOPMAILLS_FETCH();
VPOPMAILG(vpopmail_open) = 1;
+ VPOPMAILG(vpopmail_errno) = 0;
retval = vauth_user(Z_STRVAL_PP(user),
Z_STRVAL_PP(domain),
Z_STRVAL_PP(password),
- is_apop);
+ Z_STRVAL_PP(apop));
+
+ /*
+ * we do not set vpopmail_errno here - it is considered auth_user cannot fail; insted it does not auth
+ * this is a vpopmail's api limitation - there is no error return form vauth_user
+ */
if (retval == NULL) {
RETURN_FALSE;
}
/* }}} */
+/* {{{ proto string vpopmail_error(void)
+ Attempt to validate a username/domain/password. Returns true/false */
+PHP_FUNCTION(vpopmail_error)
+{
+ if (ZEND_NUM_ARGS() != 0)
+ WRONG_PARAM_COUNT;
+
+ VPOPMAILLS_FETCH();
+
+ RETURN_STRING(verror(VPOPMAILG(vpopmail_errno)),1);
+}
+/* }}} */
+
+#endif HAVE_VPOPMAIL
/*
* Local variables: