bbonev          Sun Jan 14 09:04:22 2001 EDT

  Modified files:              
    /php4/ext/vpopmail  php_vpopmail.c php_vpopmail.h 
  Log:
  merged my version with David Croft's
  removed unneccessary php.ini calls and defines
  removed module_init, shutdown, request_init declarations and references
  added request_shutdown to close mysql/other db connection
        (a must in apache module)
  added defines for external binaries from vpopmail
  changed functions to present more consistent api from user's point of view
        so that in one call more stuff is done
  added more comprehensive MINFO function helping users debug their case
  added static int vpopmail_exec(char *cmd) [will change to php_Exec soon]
  @ vpopmail extension updated to working alfa. give it a try but keep in 
  @ mind that it is not ready for production environments (Boian Bonev)
  
  
Index: php4/ext/vpopmail/php_vpopmail.c
diff -u php4/ext/vpopmail/php_vpopmail.c:1.2 php4/ext/vpopmail/php_vpopmail.c:1.3
--- php4/ext/vpopmail/php_vpopmail.c:1.2        Sun Jan 14 01:01:25 2001
+++ php4/ext/vpopmail/php_vpopmail.c    Sun Jan 14 09:04:21 2001
@@ -12,48 +12,71 @@
    | obtain it through the world-wide-web, please send a note to          |
    | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
    +----------------------------------------------------------------------+
-   | Author: David Croft <[EMAIL PROTECTED]>                           |
+   | Authors: David Croft <[EMAIL PROTECTED]>                          |
+   |          Boian Bonev <[EMAIL PROTECTED]>                               |
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_vpopmail.c,v 1.2 2001/01/14 09:01:25 david Exp $ */
+/* $Id: php_vpopmail.c,v 1.3 2001/01/14 17:04:21 bbonev Exp $ */
 
-#undef VPOPMAIL_IS_REALLY_OLD
+// TODO: move to config.m4 when support for old versions is ready or just don't 
+support rather old vpopmail
+// current version must bail out if incompat option is specified and work for minimal 
+params
+//#undef VPOPMAIL_IS_REALLY_OLD
 
 #include "php.h"
 #include "php_ini.h"
 #include "php_vpopmail.h"
 
+#if HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#if HAVE_VPOPMAIL
+
 #include "vpopmail.h"
 
+#include "ext/standard/exec.h"
 #include "ext/standard/php_string.h"
 
-#ifdef ZTS
-int vpopmail_globals_id;
-#else
-php_vpopmail_globals vpopmail_globals;
-#endif
+// keep this as the last include in order to destroy VERSION/PACKAGE only for the 
+rest of the code
+#undef VERSION
+#undef PACKAGE
+#include "vpopmail_config.h"
+#undef PACKAGE
+#include "vpopmail.h"
 
+// vpopmail does not export this, argh!
+#define MAX_BUFF 500
+
+#define VPOPSTR(x) #x
+
+/* removed by intent - will add when need to
+ZEND_DECLARE_MODULE_GLOBALS(vpop)
+*/
+
 /* Function table */
 
 function_entry vpopmail_functions[] = {
-       PHP_FE(vpopmail_auth_user, NULL)
+       // domain management
        PHP_FE(vpopmail_adddomain, NULL)
        PHP_FE(vpopmail_deldomain, NULL)
+       PHP_FE(vpopmail_addaliasdomain, NULL)
+       // user management
        PHP_FE(vpopmail_adduser, NULL)
        PHP_FE(vpopmail_deluser, NULL)
        PHP_FE(vpopmail_passwd, NULL)
        PHP_FE(vpopmail_setuserquota, NULL)
+       PHP_FE(vpopmail_auth_user, NULL)
        {NULL, NULL, NULL}
 };
 
 zend_module_entry vpopmail_module_entry = {
        "vpopmail",
        vpopmail_functions,
-       PHP_MINIT(vpopmail),
-       PHP_MSHUTDOWN(vpopmail),
-       NULL,
-       NULL,
+       NULL, //PHP_MINIT(vpopmail),            // do nothing upon
+       NULL, //PHP_MSHUTDOWN(vpopmail),        //      these
+       NULL, //PHP_RINIT(vpopmail),            //      events
+       PHP_RSHUTDOWN(vpopmail),                // close vpopmail lib upon request 
+shutdown
        PHP_MINFO(vpopmail),
        STANDARD_MODULE_PROPERTIES
 };
@@ -62,276 +85,429 @@
 ZEND_GET_MODULE(vpopmail)
 #endif
 
+// removed by intent - will add when needed
+//PHP_INI_BEGIN()
+/*     STD_PHP_INI_ENTRY("pfpro.proxypassword",                "",                    
+         PHP_INI_ALL, OnUpdateString,    proxypassword,                  
+php_pfpro_globals,      pfpro_globals) */
+//PHP_INI_END()
 
-PHP_INI_BEGIN()
-       /*      STD_PHP_INI_ENTRY("pfpro.proxypassword",                "",            
                 PHP_INI_ALL, OnUpdateString,    proxypassword,                  
php_pfpro_globals,      pfpro_globals) */
-PHP_INI_END()
 
-
-PHP_MINIT_FUNCTION(vpopmail)
-{
+// removed by intent - will add when needed
+/*PHP_MINIT_FUNCTION(vpopmail) {
        REGISTER_INI_ENTRIES();
        return SUCCESS;
-}
+}*/
 
-PHP_MSHUTDOWN_FUNCTION(vpopmail)
+// removed by intent - will add when needed
+/*PHP_MSHUTDOWN_FUNCTION(vpopmail)
 {
        UNREGISTER_INI_ENTRIES();
        return SUCCESS;
+}*/
+
+/* at request end we close the connection to any databases open by the lib */
+PHP_RSHUTDOWN_FUNCTION(vpopmail) {
+       vclose();
+       return SUCCESS;
 }
 
-PHP_MINFO_FUNCTION(vpopmail)
-{
+PHP_MINFO_FUNCTION(vpopmail) {
+       char g[64],u[64];
+
+       sprintf(g,"%d",VPOPMAILGID);
+       sprintf(u,"%d",VPOPMAILUID);
        php_info_print_table_start();
-       php_info_print_table_header(2, "vpopmail support", "enabled");
-       /*      php_info_print_table_row(2, "vpopmail version", "Who knows"); */
+       php_info_print_table_row(2, "vpopmail support", "enabled");
+       php_info_print_table_row(2, "vpopmail version", VERSION);
+       php_info_print_table_row(2, "vpopmail uid", u);
+       php_info_print_table_row(2, "vpopmail gid", g);
+       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();
+       // will add when needed
+       //DISPLAY_INI_ENTRIES();
 }
 
+/*
+ * shall not copy/paste this stuff but rather make _Exec from ext/standard/exec.c 
+public as php_exec or something
+ */
+static int vpopmail_exec(char *cmd) {
+       FILE *fp;
+       int t, l, ret, output=1;
+       PLS_FETCH();
+
+#ifdef PHP_WIN32
+       fp = V_POPEN(cmd, "rb");
+#else
+       fp = V_POPEN(cmd, "r");
+#endif
+       if (!fp) {
+               php_error(E_WARNING, "Unable to fork [%s]", cmd);
+               return -1;
+       }
+       ret = pclose(fp);
+#if HAVE_SYS_WAIT_H
+       if (WIFEXITED(ret)) {
+               ret = WEXITSTATUS(ret);
+       }
+#endif
+       return ret;
+}
 
+//////////////////////////////////////////////////////////////////////////
+// domain management functions (these are slow - implementation executes external 
+binary
 
-/* {{{ proto void vpopmail_adddomain($domain, $dir, $uid, $gid)
+/* {{{ proto int vpopmail_adddomain(string domain, string passwd [, string quota [, 
+string bounce [, bool apop]]])
    Add a new virtual domain */
-PHP_FUNCTION(vpopmail_adddomain)
-{
-       zval **domain;
-       zval **dir;
-       zval **uid;
-       zval **gid;
-       int retval;
+PHP_FUNCTION(vpopmail_adddomain) {     // this code cannot work if not suid/sgid
+       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 (ZEND_NUM_ARGS() != 4
-                       || zend_get_parameters_ex(4, &domain, &dir, &uid, &gid) == 
FAILURE)
+       if (argc < 2 || argc > 5 || zend_get_parameters_ex(argc, &domain, &passwd, 
+&quota, &bounce, &apop) == FAILURE){
                WRONG_PARAM_COUNT;
+       }
 
-       convert_to_string_ex(domain);
-       convert_to_string_ex(dir);
-       convert_to_long_ex(uid);
-       convert_to_long_ex(gid);
-
-       retval = vadddomain(Z_STRVAL_PP(domain),
-#ifdef VPOPMAIL_IS_REALLY_OLD
-                                               Z_STRVAL_PP(dir),
-                                               Z_LVAL_PP(uid),
-                                               Z_LVAL_PP(gid)
-#else
-                                               0
-#endif
-                                               );
+       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");
+                               RETURN_LONG(-1);
+                       }
+                       /* 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");
+                               RETURN_LONG(-1);
+                       }
+                       /* 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");
+               RETURN_LONG(-1);
+       }
+       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");
+               RETURN_LONG(-1);
+       }
+       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=vpopmail_exec(cmd);
+       efree(cmd);
+       efree(escdomain);
+       efree(escpasswd);
+       if (fr_quota)
+               efree(escquota);
+       if (fr_bounce)
+               efree(escbounce);
 
-       if (retval == VA_SUCCESS) {
-               RETURN_TRUE;
-       }
-       else {
-        php_error(E_WARNING, "vpopmail error: %s", verror(retval));
-               RETURN_FALSE;
-       }
+       if (retval!=VA_SUCCESS)
+               php_error(E_WARNING,"vpopmail_adddomain error: %d", retval);
+
+       RETURN_LONG(retval);
 }
 /* }}} */
 
-/* {{{ proto void vpopmail_deldomain($domain)
+/* {{{ proto int vpopmail_deldomain(string domain)
    Delete a virtual domain */
-PHP_FUNCTION(vpopmail_deldomain)
-{
+PHP_FUNCTION(vpopmail_deldomain) {
        zval **domain;
-       int retval;
+       int retval=-1;
+       char *cmd,*escdomain;
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &domain) == FAILURE)
+       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &domain) == FAILURE){
                WRONG_PARAM_COUNT;
+       }
 
        convert_to_string_ex(domain);
 
-       retval = vdeldomain(Z_STRVAL_PP(domain));
+       escdomain=php_escape_shell_cmd(Z_STRVAL_PP(domain));
+       if (!escdomain) {
+               php_error(E_WARNING,"vpopmail_deldomain error: cannot alloc");
+               RETURN_LONG(-1);
+       }
+       
+cmd=emalloc(strlen(VPOPMAIL_BIN_DIR)+strlen(VPOPMAIL_DELD)+strlen(escdomain)+1);
+       if (!cmd) {
+               efree(escdomain);
+               php_error(E_WARNING,"vpopmail_deldomain error: cannot alloc");
+               RETURN_LONG(-1);
+       }
+       sprintf(cmd,VPOPMAIL_BIN_DIR VPOPMAIL_DELD"%s",escdomain);
+       retval=vpopmail_exec(cmd);
+       efree(escdomain);
+       efree(cmd);
 
-       if (retval == VA_SUCCESS) {
-               RETURN_TRUE;
-       }
-       else {
-        php_error(E_WARNING, "vpopmail error: %s", verror(retval));
-               RETURN_FALSE;
-       }
+       if (retval!=VA_SUCCESS)
+               php_error(E_WARNING,"vpopmail_deldomain error: %d", retval);
+
+       RETURN_LONG(retval);
 }
 /* }}} */
 
-/* {{{ proto void vpopmail_adduser($user, $domain, $password[, $gecos[, $apop]])
-   Add a new user to the specified virtual domain */
-PHP_FUNCTION(vpopmail_adduser)
-{
-       zval **user;
-       zval **domain;
-       zval **password;
-       zval **gecos;
-       zval **apop;
-       int is_apop = 0;
-       char *the_gecos = "";
+/* {{{ proto int vpopmail_addaliasdomain(string olddomain, string newdomain)
+   Add alias to an existing virtual domain */
+PHP_FUNCTION(vpopmail_addaliasdomain) {
+       zval **olddomain, **newdomain;
        int retval;
+       char *cmd,*escolddomain,*escnewdomain;
 
-       if (ZEND_NUM_ARGS() < 3 || ZEND_NUM_ARGS() > 5
-                       || zend_get_parameters_ex(ZEND_NUM_ARGS(), &user, &domain, 
&password, &gecos, &apop) == FAILURE)
+       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &olddomain, &newdomain) 
+== FAILURE){
                WRONG_PARAM_COUNT;
+       }
 
-       switch (ZEND_NUM_ARGS()) {
-       case 5:
-               convert_to_boolean_ex(apop);
-               is_apop = (Z_BVAL_PP(apop) ? 1 : 0);
-               /* fall through */
-
-       case 4:
-               convert_to_string_ex(gecos);
-               the_gecos = Z_STRVAL_PP(gecos);
-               /* fall through */
-
-       default:
-               convert_to_string_ex(user);
-               convert_to_string_ex(domain);
-               convert_to_string_ex(password);
-       }
-
-       retval = vadduser(Z_STRVAL_PP(user),
-                                         Z_STRVAL_PP(domain),
-                                         Z_STRVAL_PP(password),
-                                         the_gecos,
-                                         is_apop);
+       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");
+               RETURN_LONG(-1);
+       }
+       escolddomain=php_escape_shell_cmd(Z_STRVAL_PP(olddomain));
+       if (!escolddomain) {
+               efree(escnewdomain);
+               php_error(E_WARNING,"vpopmail_addaliasdomain error: cannot alloc");
+               RETURN_LONG(-1);
+       }
+
+       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");
+               RETURN_LONG(-1);
+       }
+       sprintf(cmd,"%s%s %s",VPOPMAIL_BIN_DIR 
+VPOPMAIL_ADAD,escolddomain,escnewdomain);
+       retval=vpopmail_exec(cmd);
+       efree(cmd);
+       efree(escnewdomain);
+       efree(escolddomain);
 
-       if (retval == VA_SUCCESS) {
-               RETURN_TRUE;
-       }
-       else {
-        php_error(E_WARNING, "vpopmail error: %s", verror(retval));
-               RETURN_FALSE;
+       if (retval!=VA_SUCCESS)
+               php_error(E_WARNING,"vpopmail_addaliasdomain error: %d", retval);
+
+       RETURN_LONG(retval);
+}
+/* }}} */
+
+//////////////////////////////////////////////////////////////////////////
+// user management functions - native implementation - fast
+
+/* {{{ proto int vpopmail_adduser(string username, string domain, string password [, 
+string quota [, string gecos [, int apop]]])
+   Add a new user to the specified virtual domain */
+PHP_FUNCTION(vpopmail_adduser) {
+       zval **username, **domain, **password, **quota, **gecos, **apop;
+       int argc;
+       int retval,hv_apop=0,hv_gecos=0,hv_quota=0;
+
+       argc = ZEND_NUM_ARGS();
+       if (argc < 3 || argc > 6 || zend_get_parameters_ex(argc, &username, &domain, 
+&password, &quota, &gecos, &apop) == FAILURE){
+               WRONG_PARAM_COUNT;
        }
+
+       switch (argc) {
+               case 6:
+                       hv_apop=1;
+                       convert_to_long_ex(apop);
+                       /* Fall-through. */
+               case 5:
+                       hv_gecos=1;
+                       convert_to_string_ex(gecos);
+                       /* Fall-through. */
+               case 4:
+                       hv_quota=1;
+                       convert_to_string_ex(quota);
+                       /* Fall-through. */
+               case 3:
+                       convert_to_string_ex(password);
+                       convert_to_string_ex(domain);
+                       convert_to_string_ex(username);
+                       break;
+       }
+
+       
+retval=vadduser(Z_STRVAL_PP(username),Z_STRVAL_PP(domain),Z_STRVAL_PP(password),hv_gecos?Z_STRVAL_PP(gecos):Z_STRVAL_PP(username),hv_apop?Z_LVAL_PP(apop):0);
+       if (retval!=VA_SUCCESS) {
+               php_error(E_WARNING, "vpopmail_adduser error: %s", verror(retval));
+               RETURN_LONG(retval);
+       }
+       if (hv_quota)
+               
+retval=vsetuserquota(Z_STRVAL_PP(username),Z_STRVAL_PP(domain),Z_STRVAL_PP(quota));
+       if (retval != VA_SUCCESS)
+               php_error(E_WARNING, "vpopmail_adduser error: %s", verror(retval));
+       RETURN_LONG(VA_SUCCESS);
 }
 /* }}} */
 
-/* {{{ proto void vpopmail_deluser($user, $domain)
+/* {{{ proto int vpopmail_deluser(string username, string domain)
    Delete a user from a virtual domain */
-PHP_FUNCTION(vpopmail_deluser)
-{
+PHP_FUNCTION(vpopmail_deluser) {
        zval **user;
        zval **domain;
        int retval;
 
-       if (ZEND_NUM_ARGS() != 2
-                       || zend_get_parameters_ex(2, &user, &domain) == FAILURE)
+       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &user, &domain) == 
+FAILURE)
                WRONG_PARAM_COUNT;
 
        convert_to_string_ex(user);
        convert_to_string_ex(domain);
 
-       retval = vdeluser(Z_STRVAL_PP(user),
-                                         Z_STRVAL_PP(domain));
+       retval = vdeluser(Z_STRVAL_PP(user), Z_STRVAL_PP(domain));
 
-       if (retval == VA_SUCCESS) {
-               RETURN_TRUE;
-       }
-       else {
-        php_error(E_WARNING, "vpopmail error: %s", verror(retval));
-               RETURN_FALSE;
-       }
+       if (retval != VA_SUCCESS)
+               php_error(E_WARNING, "vpopmail_deluser error: %s", verror(retval));
+       RETURN_LONG(retval);
 }
 /* }}} */
 
-/* {{{ proto void vpopmail_passwd($user, $domain, $password)
+/* {{{ proto int vpopmail_passwd(string username, string domain, string password[, 
+int apop])
    Change a virtual user's password */
-PHP_FUNCTION(vpopmail_passwd)
-{
-       zval **user;
-       zval **domain;
-       zval **password;
-       zval **apop;
-       int is_apop = 0;
-       int retval;
+PHP_FUNCTION(vpopmail_passwd) {
+       zval **username, **domain, **password, **apop;
+       int argc,retval,is_apop=0;
 
-       if (ZEND_NUM_ARGS() < 3 || ZEND_NUM_ARGS() > 4
-                       || zend_get_parameters_ex(ZEND_NUM_ARGS(), &user, &domain, 
&password, &apop) == FAILURE)
+       argc=ZEND_NUM_ARGS();
+       if (argc < 3 || argc > 4 || zend_get_parameters_ex(argc, &username, &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 (argc==4) {
+               convert_to_long_ex(apop);
+               is_apop=(Z_BVAL_PP(apop) ? 1 : 0);
        }
 
-       convert_to_string_ex(user);
+       convert_to_string_ex(username);
        convert_to_string_ex(domain);
        convert_to_string_ex(password);
-
-       retval = vpasswd(Z_STRVAL_PP(user),
-                                        Z_STRVAL_PP(domain),
-                                        Z_STRVAL_PP(password),
-                                        is_apop);
 
-       if (retval == VA_SUCCESS) {
-               RETURN_TRUE;
-       }
-       else {
-        php_error(E_WARNING, "vpopmail error: %s", verror(retval));
-               RETURN_FALSE;
-       }
+       
+retval=vpasswd(Z_STRVAL_PP(username),Z_STRVAL_PP(domain),Z_STRVAL_PP(password),is_apop);
+       if (retval != VA_SUCCESS)
+               php_error(E_WARNING, "vpopmail_passwd error: %s", verror(retval));
+       RETURN_LONG(retval);
 }
 /* }}} */
 
-/* {{{ proto void vpopmail_setuserquota($user, $domain, $quota)
+/* {{{ proto int vpopmail_setuserquota(string username, string domain, string quota)
    Sets a virtual user's quota */
-PHP_FUNCTION(vpopmail_setuserquota)
-{
+PHP_FUNCTION(vpopmail_setuserquota) {
        zval **user;
        zval **domain;
        zval **quota;
        int retval;
 
-       if (ZEND_NUM_ARGS() != 3
-                       || zend_get_parameters_ex(3, &user, &domain, &quota) == 
FAILURE)
+       if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &user, &domain, &quota) 
+== FAILURE)
                WRONG_PARAM_COUNT;
 
        convert_to_string_ex(user);
        convert_to_string_ex(domain);
        convert_to_string_ex(quota);
-
-       retval = vsetuserquota(Z_STRVAL_PP(user),
-                                                  Z_STRVAL_PP(domain),
-                                                  Z_STRVAL_PP(quota));
 
-       if (retval == VA_SUCCESS) {
-               RETURN_TRUE;
-       }
-       else {
-        php_error(E_WARNING, "vpopmail error: %s", verror(retval));
-               RETURN_FALSE;
-       }
+       retval = vsetuserquota(Z_STRVAL_PP(user), Z_STRVAL_PP(domain), 
+Z_STRVAL_PP(quota));
+       if (retval != VA_SUCCESS)
+               php_error(E_WARNING, "vpopmail_setuserquota error: %s", 
+verror(retval));
+       RETURN_LONG(retval);
 }
 /* }}} */
 
-/* {{{ proto void vpopmail_auth_user($user, $domain, $password)
+/* {{{ proto bool vpopmail_auth_user(string user, string domain, string password [, 
+int apop])
    Attempt to validate a username/domain/password. Returns true/false */
-PHP_FUNCTION(vpopmail_auth_user)
-{
+PHP_FUNCTION(vpopmail_auth_user) {
        zval **user;
        zval **domain;
        zval **password;
+       zval **apop;
        struct passwd *retval;
+       int argc=ZEND_NUM_ARGS();
+       int hv_apop=0;
 
-       if (ZEND_NUM_ARGS() != 3
-                       || zend_get_parameters_ex(3, &user, &domain, &password) == 
FAILURE)
+       if (argc < 3 || argc > 4 || zend_get_parameters_ex(argc, &user, &domain, 
+&password, &apop) == FAILURE)
                WRONG_PARAM_COUNT;
 
        convert_to_string_ex(user);
        convert_to_string_ex(domain);
        convert_to_string_ex(password);
 
-       retval = vauth_user(Z_STRVAL_PP(user),
-                                               Z_STRVAL_PP(domain),
-                                               Z_STRVAL_PP(password));
+       if (argc==4) {
+               convert_to_string_ex(apop);
+               hv_apop=1;
+       }
+
+       // warning: retval is a ref to a static member; this is safe - will not leak
+       retval = vauth_user(Z_STRVAL_PP(user), Z_STRVAL_PP(domain), 
+Z_STRVAL_PP(password), hv_apop?Z_STRVAL_PP(apop):"");
 
        if (retval == NULL) {
                RETURN_FALSE;
-       }
-       else {
+       } else {
                RETURN_TRUE;
        }
 }
 /* }}} */
+
+
+#endif /* HAVE_VPOPMAIL */
 
 
 /*
Index: php4/ext/vpopmail/php_vpopmail.h
diff -u php4/ext/vpopmail/php_vpopmail.h:1.1 php4/ext/vpopmail/php_vpopmail.h:1.2
--- php4/ext/vpopmail/php_vpopmail.h:1.1        Sun Jan 14 00:54:00 2001
+++ php4/ext/vpopmail/php_vpopmail.h    Sun Jan 14 09:04:21 2001
@@ -12,11 +12,12 @@
    | obtain it through the world-wide-web, please send a note to          |
    | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
    +----------------------------------------------------------------------+
-   | Author: David Croft <[EMAIL PROTECTED]>                           |
+   | Authors: David Croft <[EMAIL PROTECTED]>                          |
+   |          Boian Bonev <[EMAIL PROTECTED]>                               |
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_vpopmail.h,v 1.1 2001/01/14 08:54:00 david Exp $ */
+/* $Id: php_vpopmail.h,v 1.2 2001/01/14 17:04:21 bbonev Exp $ */
 
 #ifndef PHP_VPOPMAIL_H
 #define PHP_VPOPMAIL_H
@@ -32,29 +33,30 @@
 #define PHP_VPOPMAIL_API
 #endif
 
-PHP_MINIT_FUNCTION(vpopmail);
-PHP_MSHUTDOWN_FUNCTION(vpopmail);
+PHP_RSHUTDOWN_FUNCTION(vpopmail);
 PHP_MINFO_FUNCTION(vpopmail);
 
+// domain management
 PHP_FUNCTION(vpopmail_adddomain);
 PHP_FUNCTION(vpopmail_deldomain);
+PHP_FUNCTION(vpopmail_addaliasdomain);
+// user management
 PHP_FUNCTION(vpopmail_adduser);
 PHP_FUNCTION(vpopmail_deluser);
 PHP_FUNCTION(vpopmail_passwd);
 PHP_FUNCTION(vpopmail_setuserquota);
 PHP_FUNCTION(vpopmail_auth_user);
 
-typedef struct {
-       int le_vpopmail;
-       int initialised;
-       char *defaulthost;
-       int defaultport;
-       int defaulttimeout;
-       char *proxyaddress;
-       int proxyport;
-       char *proxylogon;
-       char *proxypassword;
-} php_vpopmail_globals;
+// defines for proper operation
+#define VPOPMAIL_ADDD "/vadddomain "
+#define VPOPMAIL_DELD "/vdeldomain "
+#define VPOPMAIL_ADAD "/vaddaliasdomain "
+
+/* removed by intent - will add upon need
+ZEND_BEGIN_MODULE_GLOBALS(vpopmail)
+       int global_variable;
+ZEND_END_MODULE_GLOBALS(vpopmail)
+*/
 
 #ifdef ZTS
 #define VPOPMAILG(v) (vpopmail_globals->v)

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to