Thread: SF.net SVN: postfixadmin:[1127] trunk/model/MailboxHandler.php
Brought to you by:
christian_boltz,
gingerdog
From: <chr...@us...> - 2011-07-25 22:38:17
|
Revision: 1127 http://postfixadmin.svn.sourceforge.net/postfixadmin/?rev=1127&view=rev Author: christian_boltz Date: 2011-07-25 22:38:11 +0000 (Mon, 25 Jul 2011) Log Message: ----------- MailboxHandler.php: - use smtp_get_admin_email() to get the sender for the welcome mail - add a check for empty (shouldn't happen in theory) or 'CLI' username and use the mailbox address as fallback This is based on Dale's patch, but completely rewritten (what a big word for two lines of code ;-) Dale had only added the line if(empty($fFrom)) $fFrom = $this->username; My version is tested with CLI with both $CONF[admin_email] set and empty. This commit is part of the huge cleanup patch by Dale Blount (lnxus@SF), https://sourceforge.net/tracker/?func=detail&atid=937966&aid=3370510&group_id=191583 Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2011-07-25 22:19:50 UTC (rev 1126) +++ trunk/model/MailboxHandler.php 2011-07-25 22:38:11 UTC (rev 1127) @@ -198,7 +198,8 @@ { # TODO: move "send the mail" to a function $fTo = $username; - $fFrom = Config::read('admin_email'); + $fFrom = smtp_get_admin_email(); + if(empty($fFrom) || $fFrom == 'CLI') $fFrom = $this->username; $fSubject = Lang::read('pSendmail_subject_text'); $fBody = Config::read('welcome_text'); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2011-10-10 22:15:22
|
Revision: 1200 http://postfixadmin.svn.sourceforge.net/postfixadmin/?rev=1200&view=rev Author: christian_boltz Date: 2011-10-10 22:15:16 +0000 (Mon, 10 Oct 2011) Log Message: ----------- MailboxHandler: - whitespace changes Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2011-10-07 22:58:38 UTC (rev 1199) +++ trunk/model/MailboxHandler.php 2011-10-10 22:15:16 UTC (rev 1200) @@ -7,7 +7,7 @@ class MailboxHandler { protected $username = null; - + public $errormsg = array(); public function __construct($username) { @@ -20,7 +20,7 @@ } /** - * @return boolean true on success; false on failure + * @return boolean true on success; false on failure * @param string $old_password * @param string $new_passwords * @param bool $match = true @@ -33,19 +33,19 @@ $E_username = escape_string($this->username); $table_mailbox = table_by_key('mailbox'); - + if ($match == true) { $active = db_get_boolean(True); $result = db_query("SELECT password FROM $table_mailbox WHERE username='$E_username' AND active='$active'"); $result = db_assoc($result['result']); - + if (pacrypt($old_password, $result['password']) != $result['password']) { db_log ($domain, 'edit_password', "MATCH FAILURE: " . $this->username); $this->errormsg[] = 'Passwords do not match'; # TODO: make translatable return false; } } - + $set = array( 'password' => pacrypt($new_password) , ); @@ -57,7 +57,7 @@ $this->errormsg[] = Lang::read('pEdit_mailbox_result_error'); return false; } - + db_log ($domain, 'edit_password', $this->username); return true; } @@ -76,8 +76,7 @@ $query = "SELECT password FROM $table_mailbox WHERE username='$username' AND active='$active'"; $result = db_query ($query); - if ($result['rows'] == 1) - { + if ($result['rows'] == 1) { $row = db_array ($result['result']); $crypt_password = pacrypt ($password, $row['password']); @@ -89,7 +88,7 @@ } /** * Add mailbox - * @param password string password of account + * @param password string password of account * @param gen boolean * @param name string * @@ -98,7 +97,7 @@ # FIXME: default value of $quota (-999) is intentionally invalid. Add fallback to default quota. # Solution: Invent an sub config class with additional informations about domain based configs like default qouta. # FIXME: Should the parameters be optional at all? -# TODO: check if parameters are valid/allowed (quota?). +# TODO: check if parameters are valid/allowed (quota?). # TODO: most code should live in a separate function that can be used by add and edit. # TODO: On the longer term, the web interface should also use this class. @@ -116,11 +115,11 @@ # check if an alias with this name already exists $result = db_query ("SELECT * FROM " . table_by_key('alias') . " WHERE address='" . escape_string($username) . "'"); - if ($result['rows'] == 1){ + if ($result['rows'] == 1) { $this->errormsg[] = Lang::read('pCreate_mailbox_username_text_error2'); return false; } - + $plain = $password; $password = pacrypt ($password); @@ -131,25 +130,18 @@ # $password = '{' . $method . '}' . $password; # } -#TODO: 2nd clause should be the first for self explaining code. +#TODO: 2nd clause should be the first for self explaining code. #TODO: When calling config::Read with parameter we sould be right that read return false if the parameter isn't in our config file. if(Config::read('maildir_name_hook') != 'NO' && function_exists(Config::read('maildir_name_hook')) ) { $hook_func = $CONF['maildir_name_hook']; $maildir = $hook_func ($fDomain, $fUsername); - } - elseif (Config::read('domain_path') == "YES") - { - if (Config::read('domain_in_mailbox') == "YES") - { + } elseif (Config::read('domain_path') == "YES") { + if (Config::read('domain_in_mailbox') == "YES") { $maildir = $domain . "/" . $username . "/"; - } - else - { + } else { $maildir = $domain . "/" . $local_part . "/"; } - } - else - { + } else { $maildir = $username . "/"; } @@ -157,18 +149,17 @@ $active = db_get_boolean($active); $quota = multiply_quota ($quota); - + $alias_data = array( 'address' => $username, 'goto' => $username, 'domain' => $domain, 'active' => $active, - ); - + ); + $result = db_insert('alias', $alias_data); #MARK: db_insert returns true/false?? - if ($result != 1) - { + if ($result != 1) { $this->errormsg[] = Lang::read('pAlias_result_error') . "\n($username -> $username)\n"; return false; } @@ -194,8 +185,7 @@ db_log ($domain, 'create_mailbox', $username); - if ($mail == true) - { + if ($mail == true) { # TODO: move "send the mail" to a function $fTo = $username; $fFrom = smtp_get_admin_email(); @@ -203,27 +193,25 @@ $fSubject = Lang::read('pSendmail_subject_text'); $fBody = Config::read('welcome_text'); - if (!smtp_mail ($fTo, $fFrom, $fSubject, $fBody)) - { + if (!smtp_mail ($fTo, $fFrom, $fSubject, $fBody)) { $this->errormsg[] = Lang::read('pSendmail_result_error'); return false; } } create_mailbox_subfolders($username,$plain); - } return true; } - - - - + + + + public function view() { $username = $this->username; $table_mailbox = table_by_key('mailbox'); - + # TODO: check if DATE_FORMAT works in MySQL and PostgreSQL # TODO: maybe a more fine-grained date format would be better for non-CLI usage $result = db_query("SELECT username, name, maildir, quota, local_part, domain, DATE_FORMAT(created, '%d.%m.%y') AS created, DATE_FORMAT(modified, '%d.%m.%y') AS modified, active FROM $table_mailbox WHERE username='$username'"); @@ -234,14 +222,14 @@ $this->errormsg = $result['error']; return false; } - + public function delete() { $username = $this->username; list(/*$local_part*/,$domain) = explode ('@', $username); $E_username = escape_string($username); $E_domain = escape_string($domain); - + #TODO: At this level of table by key calls we should think about a solution in our query function and drupal like {mailbox} {alias}. # Pseudocode for db_query etc. # if {} in query then @@ -254,8 +242,8 @@ $table_vacation_notification = table_by_key('vacation_notification'); db_begin(); - -#TODO: ture/false replacement! + +#TODO: true/false replacement! $error = 0; $result = db_query("SELECT * FROM $table_alias WHERE address = '$E_username' AND domain = '$domain'"); @@ -269,23 +257,19 @@ /* is there a mailbox? if do delete it from orbit; it's the only way to be sure */ $result = db_query ("SELECT * FROM $table_mailbox WHERE username='$E_username' AND domain='$domain'"); - if ($result['rows'] == 1) - { + if ($result['rows'] == 1) { $result = db_delete('mailbox', 'username', $username); $postdel_res=mailbox_postdeletion($username,$domain); - if ($result != 1 || !$postdel_res) - { + if ($result != 1 || !$postdel_res) { $tMessage = Lang::read('pDelete_delete_error') . "$username ("; - if ($result['rows']!=1) # TODO: invalid test, $result is from db_delete and only contains the number of deleted rows - { + if ($result['rows']!=1) { # TODO: invalid test, $result is from db_delete and only contains the number of deleted rows $tMessage.='mailbox'; if (!$postdel_res) $tMessage.=', '; $this->errormsg[] = "no mailbox $username"; # todo: better message, make translatable $error = 1; } - if (!$postdel_res) - { + if (!$postdel_res) { $tMessage.='post-deletion'; $this->errormsg[] = "post-deletion script failed"; # todo: better message, make translatable $error = 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2011-10-23 14:09:46
|
Revision: 1232 http://postfixadmin.svn.sourceforge.net/postfixadmin/?rev=1232&view=rev Author: christian_boltz Date: 2011-10-23 14:09:39 +0000 (Sun, 23 Oct 2011) Log Message: ----------- MailboxHandler.php: - add comment about forcing $CONF['domain_in_mailbox] = YES if $CONF['domain_path'] == NO. Without this comment, the code might look buggy - confirmed ;-) in https://sourceforge.net/tracker/?func=detail&atid=937964&aid=3427498&group_id=191583 Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2011-10-22 22:54:48 UTC (rev 1231) +++ trunk/model/MailboxHandler.php 2011-10-23 14:09:39 UTC (rev 1232) @@ -142,6 +142,8 @@ $maildir = $domain . "/" . $local_part . "/"; } } else { + # If $CONF['domain_path'] is set to NO, $CONF['domain_in_mailbox] is forced to YES. + # Otherwise us...@ex... and us...@fo...r would be mixed up in the same maildir "user/". $maildir = $username . "/"; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2011-10-29 22:29:22
|
Revision: 1247 http://postfixadmin.svn.sourceforge.net/postfixadmin/?rev=1247&view=rev Author: christian_boltz Date: 2011-10-29 22:29:16 +0000 (Sat, 29 Oct 2011) Log Message: ----------- MailboxHandler.php: - delete(): use escaped $E_domain instead of $domain in some queries Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2011-10-29 22:16:16 UTC (rev 1246) +++ trunk/model/MailboxHandler.php 2011-10-29 22:29:16 UTC (rev 1247) @@ -248,7 +248,7 @@ #TODO: true/false replacement! $error = 0; - $result = db_query("SELECT * FROM $table_alias WHERE address = '$E_username' AND domain = '$domain'"); + $result = db_query("SELECT * FROM $table_alias WHERE address = '$E_username' AND domain = '$E_domain'"); if($result['rows'] == 1) { $result = db_delete('alias', 'address', $username); db_log ($domain, 'delete_alias', $username); @@ -258,7 +258,7 @@ } /* is there a mailbox? if do delete it from orbit; it's the only way to be sure */ - $result = db_query ("SELECT * FROM $table_mailbox WHERE username='$E_username' AND domain='$domain'"); + $result = db_query ("SELECT * FROM $table_mailbox WHERE username='$E_username' AND domain='$E_domain'"); if ($result['rows'] == 1) { $result = db_delete('mailbox', 'username', $username); $postdel_res=mailbox_postdeletion($username,$domain); @@ -287,7 +287,7 @@ $this->errormsg[] = "no mailbox $username"; # TODO: better message, make translatable $error = 1; } - $result = db_query("SELECT * FROM $table_vacation WHERE email = '$E_username' AND domain = '$domain'"); + $result = db_query("SELECT * FROM $table_vacation WHERE email = '$E_username' AND domain = '$E_domain'"); if($result['rows'] == 1) { db_delete('vacation', 'email', $username); db_delete('vacation_notification', 'on_vacation', $username); # TODO: delete vacation_notification independent of vacation? (in case of "forgotten" vacation_notification entries) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2012-04-09 22:43:36
|
Revision: 1367 http://postfixadmin.svn.sourceforge.net/postfixadmin/?rev=1367&view=rev Author: christian_boltz Date: 2012-04-09 22:43:30 +0000 (Mon, 09 Apr 2012) Log Message: ----------- MailboxHandler.php: - initStruct() / $struct: - add various labels - make local_part and domain editable on $new - fill domain option list with allowed_domains - add 'welcome_mail' (bool, not in database) for $new - webformConfig(): - change $struct to display localpart + domain instead of username on $new - disable early_init (not needed for mailboxes) - add function mergeId() - add function _field_password2 (to compare password/password2) - drop deprecated function change_pass() Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2012-04-09 20:17:58 UTC (rev 1366) +++ trunk/model/MailboxHandler.php 2012-04-09 22:43:30 UTC (rev 1367) @@ -16,22 +16,26 @@ $this->struct=array( # field name allow display in... type $PALANG label $PALANG description default / options / ... # editing? form list - 'username' => pacol( $this->new, 1, 1, 'text', '' , '' , '' ), - 'local_part' => pacol( 0, 0, 0, 'text', '' , '' , '' ), - 'domain' => pacol( 0, 0, 0, 'enum', '' , '' , '' ), + 'username' => pacol( $this->new, 1, 1, 'text', 'pEdit_mailbox_username' , '' , '' ), + 'local_part' => pacol( $this->new, 0, 0, 'text', 'pEdit_mailbox_username' , '' , '' ), + 'domain' => pacol( $this->new, 0, 0, 'enum', '' , '' , '', + /*options*/ $this->allowed_domains ), 'maildir' => pacol( 0, 0, 0, 'text', '' , '' , '' ), - 'password' => pacol( 1, 1, 0, 'pass', '' , '' , '' ), - 'password2' => pacol( 1, 1, 0, 'pass', '' , '' , '', + 'password' => pacol( 1, 1, 0, 'pass', 'pCreate_mailbox_password' , 'pCreate_mailbox_password_text' , '' ), + 'password2' => pacol( 1, 1, 0, 'pass', 'pCreate_mailbox_password2' , '' , '', /*options*/ '', /*not_in_db*/ 0, /*dont_write_to_db*/ 1, /*select*/ 'password as password2' ), - 'name' => pacol( 1, 1, 1, 'text', '' , '' , '' ), - 'quota' => pacol( 1, 1, 1, 'int' , '' , '' , '' ), - 'active' => pacol( 1, 1, 1, 'bool', '' , '' , 1 ), - 'created' => pacol( 0, 0, 1, 'ts', '' , '' ), - 'modified' => pacol( 0, 0, 1, 'ts', '' , '' ), + 'name' => pacol( 1, 1, 1, 'text', 'pEdit_mailbox_name' , 'pCreate_mailbox_name_text' , '' ), + 'quota' => pacol( 1, 1, 1, 'int' , 'pEdit_mailbox_quota' , 'pEdit_mailbox_quota_text' , '' ), + 'active' => pacol( 1, 1, 1, 'bool', 'pCreate_mailbox_active' , '' , 1 ), + 'welcome_mail' => pacol( $this->new, $this->new, 0, 'bool', 'pCreate_mailbox_mail' , '' , 1, + /*options*/ '', + /*not_in_db*/ 1 ), + 'created' => pacol( 0, 0, 1, 'ts', 'created' , '' ), + 'modified' => pacol( 0, 0, 1, 'ts', 'pAdminList_domain_modified' , '' ), # TODO: add virtual 'notified' column and allow to display who received a vacation response? ); } @@ -55,7 +59,13 @@ * Configuration for the web interface */ public function webformConfig() { - return array( + if ($this->new) { # the webform will display a local_part field + domain dropdown on $new + $this->struct['username']['display_in_form'] = 0; + $this->struct['local_part']['display_in_form'] = 1; + $this->struct['domain']['display_in_form'] = 1; + } + + return array( # $PALANG labels 'formtitle_create' => 'pCreate_mailbox_welcome', 'formtitle_edit' => 'pEdit_mailbox_welcome', @@ -65,7 +75,7 @@ # various settings 'required_role' => 'admin', 'listview' => 'list-virtual.php', - 'early_init' => 1, # 0 for create-domain + 'early_init' => 0, ); } @@ -105,7 +115,22 @@ return true; } + /** + * merge local_part and domain to address + * called by edit.php (if id_field is editable and hidden in editform) _before_ ->init + */ + public function mergeId($values) { + if ($this->struct['local_part']['display_in_form'] == 1 && $this->struct['domain']['display_in_form']) { # webform mode - combine to 'address' field + if (empty($values['local_part']) || empty($values['domain']) ) { # local_part or domain not set + return ""; + } + return $values['local_part'] . '@' . $values['domain']; + } else { + return $values[$this->id_field]; + } + } + /* function already exists (see old code below public function delete() { $this->errormsg[] = '*** deletion not implemented yet ***'; @@ -113,18 +138,21 @@ } */ + /** + * compare password / password2 field + * error message will be displayed at the password2 field + */ + protected function _field_password2($field, $val) { + return $this->compare_password_fields('password', 'password2'); + } + /******************************************************************************************************************** old functions - we'll see what happens to them (at least they should use the *Handler functions instead of doing SQL) /********************************************************************************************************************/ - public function change_pass($old_password, $new_password) { - error_log('MailboxHandler->change_pass is deprecated. Please use MailboxHandler->change_pw!'); - return $this->change_pw($new_password, $old_password); - } - /** * @return boolean true on success; false on failure * @param string $old_password This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2012-12-28 23:48:41
|
Revision: 1415 http://postfixadmin.svn.sourceforge.net/postfixadmin/?rev=1415&view=rev Author: christian_boltz Date: 2012-12-28 23:48:33 +0000 (Fri, 28 Dec 2012) Log Message: ----------- MailboxHandler.php: add everything for editing a mailbox Details: - include 'maildir' in "display in list" for now (not really needed/wanted in listview, but needed for the postedit hook) - display max. allowed quota in quota field description (via init()) - add read_from_db_postprocess() - convert quota to MB and store the original value in 'quotabytes' - add setmore() - convert quota from MB to bytes - add storemore() - call mailbox_postedit() - add _field_quota() - quota validation Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2012-12-28 23:05:44 UTC (rev 1414) +++ trunk/model/MailboxHandler.php 2012-12-28 23:48:33 UTC (rev 1415) @@ -12,7 +12,7 @@ protected function initStruct() { $this->db_table = 'mailbox'; $this->id_field = 'username'; - + $this->struct=array( # field name allow display in... type $PALANG label $PALANG description default / options / ... # editing? form list @@ -20,7 +20,9 @@ 'local_part' => pacol( $this->new, 0, 0, 'text', 'pEdit_mailbox_username' , '' , '' ), 'domain' => pacol( $this->new, 0, 0, 'enum', '' , '' , '', /*options*/ $this->allowed_domains ), - 'maildir' => pacol( 0, 0, 0, 'text', '' , '' , '' ), + # TODO: maildir: display in list is needed to include maildir in SQL result (for post_edit hook) + # TODO: (not a perfect solution, but works for now - maybe we need a separate "include in SELECT query" field?) + 'maildir' => pacol( 0, 0, 1, 'text', '' , '' , '' ), 'password' => pacol( 1, 1, 0, 'pass', 'pCreate_mailbox_password' , 'pCreate_mailbox_password_text' , '' ), 'password2' => pacol( 1, 1, 0, 'pass', 'pCreate_mailbox_password2' , '' , '', /*options*/ '', @@ -29,7 +31,8 @@ /*select*/ 'password as password2' ), 'name' => pacol( 1, 1, 1, 'text', 'pEdit_mailbox_name' , 'pCreate_mailbox_name_text' , '' ), - 'quota' => pacol( 1, 1, 1, 'int' , 'pEdit_mailbox_quota' , 'pEdit_mailbox_quota_text' , '' ), + 'quota' => pacol( 1, 1, 1, 'int' , 'pEdit_mailbox_quota' , 'pEdit_mailbox_quota_text' , '' ), # in MB + # read_from_db_postprocess() also sets 'quotabytes' for use in init() 'active' => pacol( 1, 1, 1, 'bool', 'pCreate_mailbox_active' , '' , 1 ), 'welcome_mail' => pacol( $this->new, $this->new, 0, 'bool', 'pCreate_mailbox_mail' , '' , 1, /*options*/ '', @@ -40,6 +43,24 @@ ); } + public function init($id) { + $retval = parent::init($id); + + @list($local_part,$domain) = explode ('@', $id); # supress error message if $id doesn't contain '@' + + if ($this->new) { + # TODO + } else { + # show max allowed quota in quota field description + list(/*NULL*/,$domain) = explode('@', $this->id); + $currentquota = $this->return['quotabytes']; # parent::init called ->view() + $maxquota = allowed_quota($domain, $currentquota); + $this->struct['quota']['desc'] = sprintf(Lang::Read('mb_max'), $maxquota); + } + + return $retval; + } + protected function initMsg() { $this->msg['error_already_exists'] = 'pCreate_mailbox_username_text_error2'; $this->msg['error_does_not_exist'] = 'pCreate_mailbox_username_text_error1'; @@ -125,6 +146,54 @@ } + protected function read_from_db_postprocess($db_result) { + foreach ($db_result as $key => $row) { + $db_result[$key]['quotabytes'] = $row['quota']; + $db_result[$key]['quota'] = divide_quota($row['quota']); # convert quota to MB + } + return $db_result; + } + + + protected function setmore($values) { + $this->values['quota'] = multiply_quota($values['quota']); # convert quota from MB to bytes + } + + protected function storemore() { + if ($this->new) { +# TODO: postcreate hook +# TODO: send welcome mail +# TODO: create mailbox subfolders + } else { + # postedit hook +# TODO: implement a poststore() function? - would make handling of old and new values much easier... + list(/*NULL*/,$domain) = explode('@', $this->id); + + $old_mh = new MailboxHandler(); + + if (!$old_mh->init($this->id)) { + $this->errormsg[] = $old_mh->errormsg[0]; + } elseif (!$old_mh->view()) { + $this->errormsg[] = $old_mh->errormsg[0]; + } else { + $oldvalues = $old_mh->result(); + + $maildir = $oldvalues['maildir']; + if (isset($this->values['quota'])) { + $quota = $this->values['quota']; + } else { + $quota = $oldvalues['quota']; + } + + if ( !mailbox_postedit($this->id,$domain,$maildir, $quota)) { + $this->errormsg[] = $PALANG['pEdit_mailbox_result_error']; # TODO: more specific error message + } + } + } + return true; # even if a hook failed, mark the overall operation as OK + } + + /* function already exists (see old code below public function delete() { $this->errormsg[] = '*** deletion not implemented yet ***'; @@ -132,7 +201,20 @@ } */ + /** + * check if quota is allowed + */ + protected function _field_quota($field, $val) { + list(/*NULL*/,$domain) = explode('@', $this->id); + + if ( !check_quota ($val, $domain, $this->id) ) { + $this->errormsg[$field] = Lang::Read('pEdit_mailbox_quota_text_error'); + return false; + } + } + + /** * compare password / password2 field * error message will be displayed at the password2 field */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-02-04 23:18:04
|
Revision: 1425 http://sourceforge.net/p/postfixadmin/code/1425 Author: christian_boltz Date: 2013-02-04 23:18:01 +0000 (Mon, 04 Feb 2013) Log Message: ----------- MailboxHandler.php: add (nearly) everything for creating a mailbox (TODO: generating random passwords - when this is done, MailboxHandler can replace create-mailbox.php) - initStruct(): - make 'username' a 'mail' field (doesn't really change anything at the moment) - make 'maildir' editable on $new - init(): minor cleanup - validate_new_id(): error out early if check_email() fails - beforestore(): - convert quota from MB to bytes - previously in setmore() - on $new, create mailbox alias - storemore(): run mailbox_postcreation(), send_welcome_mail() and create_mailbox_subfolders() on $new - add send_welcome_mail() - _field_quota(): return true on success (otherwise it's interpreted as invalid value) - add _missing_local_part(), _missing_domain() and _missing_maildir() to fill those fields on $new - remove add() because all the code moved to the functions mentioned above. Known regression: this breaks CLI create mailbox for now Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-02-04 22:33:45 UTC (rev 1424) +++ trunk/model/MailboxHandler.php 2013-02-04 23:18:01 UTC (rev 1425) @@ -16,13 +16,13 @@ $this->struct=array( # field name allow display in... type $PALANG label $PALANG description default / options / ... # editing? form list - 'username' => pacol( $this->new, 1, 1, 'text', 'pEdit_mailbox_username' , '' , '' ), + 'username' => pacol( $this->new, 1, 1, 'mail', 'pEdit_mailbox_username' , '' , '' ), 'local_part' => pacol( $this->new, 0, 0, 'text', 'pEdit_mailbox_username' , '' , '' ), 'domain' => pacol( $this->new, 0, 0, 'enum', '' , '' , '', /*options*/ $this->allowed_domains ), # TODO: maildir: display in list is needed to include maildir in SQL result (for post_edit hook) # TODO: (not a perfect solution, but works for now - maybe we need a separate "include in SELECT query" field?) - 'maildir' => pacol( 0, 0, 1, 'text', '' , '' , '' ), + 'maildir' => pacol( $this->new, 0, 1, 'text', '' , '' , '' ), 'password' => pacol( 1, 1, 0, 'pass', 'pCreate_mailbox_password' , 'pCreate_mailbox_password_text' , '' ), 'password2' => pacol( 1, 1, 0, 'pass', 'pCreate_mailbox_password2' , '' , '', /*options*/ '', @@ -46,10 +46,8 @@ public function init($id) { $retval = parent::init($id); - @list($local_part,$domain) = explode ('@', $id); # supress error message if $id doesn't contain '@' - if ($this->new) { - # TODO + # handled in validate_new_id() } else { # show max allowed quota in quota field description list(/*NULL*/,$domain) = explode('@', $this->id); @@ -102,8 +100,12 @@ return false; } - list($local_part,$domain) = explode ('@', $this->id); + if ( !check_email($this->id) ) { # TODO: check_email should return error message instead of using flash_error itsself + return false; + } + list(/*NULL*/,$domain) = explode ('@', $this->id); + if(!$this->create_allowed($domain)) { $this->errormsg[] = Lang::read('pCreate_mailbox_username_text_error3'); return false; @@ -116,7 +118,7 @@ return false; } - return check_email($this->id); # TODO: check_email should return error message instead of using flash_error itsself + return true; # still here? good! } /** @@ -156,22 +158,72 @@ } - protected function setmore($values) { - $this->values['quota'] = multiply_quota($values['quota']); # convert quota from MB to bytes + protected function beforestore() { + + if ( isset($this->values['quota']) && $this->values['quota'] != -1 ) { + $this->values['quota'] = $this->values['quota'] * Config::read('quota_multiplier'); # convert quota from MB to bytes + } + + if ($this->new) { + $ah = new AliasHandler(1, $this->admin_username); + + $ah->MailboxAliasConfig(); + + if ( !$ah->init($this->id) ) { + $this->errormsg[] = $ah->errormsg[0]; + return false; + } + + $alias_data = array( + # 'goto_mailbox' = 1; # would be technically correct, but setting 'goto' is easier + 'goto' => array($this->id), + 'active' => $this->values['active'], + ); + + if (!$ah->set($alias_data)) { + $this->errormsg[] = $ah->errormsg[0]; + return false; + } + + if (!$ah->store()) { + $this->errormsg[] = $ah->errormsg[0]; + return false; + } + } + + return true; # still here? good! } - + protected function storemore() { if ($this->new) { -# TODO: create alias -# TODO: postcreate hook -# TODO: send welcome mail -# TODO: create mailbox subfolders -# TODO: --- most of this is probably already in $this->add() already --- - } else { -# TODO: update alias (active status) + list(/*NULL*/,$domain) = explode('@', $this->id); + + if ( !mailbox_postcreation($this->id,$domain,$this->values['maildir'], $this->values['quota']) ) { + $this->errormsg[] = Lang::read('pCreate_mailbox_result_error') . " ($this->id)"; + # return false; # TODO: should this be fatal? + } + + if ($this->values['welcome_mail'] == true) { + if ( !$this->send_welcome_mail() ) { + # return false; # TODO: should this be fatal? + } + } + + if ( !create_mailbox_subfolders($this->id,$this->values['password'])) { + # TODO: implement $tShowpass + flash_info(Lang::read('pCreate_mailbox_result_succes_nosubfolders') . " ($fUsername$tShowpass)"); # TODO: don't use flash_info + } else { # everything ok + # TODO: implement $tShowpass + # flash_info(Lang::read('pCreate_mailbox_result_success']) . " ($fUsername$tShowpass)*"); # TODO: don't use flash_info + # TODO: currently edit.php displays the default success message from webformConfig + } + + } else { # edit mode + # TODO: update alias (active status) + # postedit hook -# TODO: implement a poststore() function? - would make handling of old and new values much easier... + # TODO: implement a poststore() function? - would make handling of old and new values much easier... list(/*NULL*/,$domain) = explode('@', $this->id); $old_mh = new MailboxHandler(); @@ -217,6 +269,7 @@ $this->errormsg[$field] = Lang::Read('pEdit_mailbox_quota_text_error'); return false; } + return true; } /** @@ -228,7 +281,69 @@ } +# TODO: generate password if $new, no password specified and $CONF['generate_password'] is set + /** + * on $this->new, set localpart based on address + */ + protected function _missing_local_part ($field) { + list($local_part,$domain) = explode ('@', $this->id); + if (count($parts) == 2) $this->RAWvalues['localpart'] = $local_part; + } + + /** + * on $this->new, set domain based on address + */ + protected function _missing_domain ($field) { + list($local_part,$domain) = explode ('@', $this->id); + if (count($parts) == 2) $this->RAWvalues['domain'] = $domain; + } + + + /** + * calculate maildir path for the mailbox + */ + protected function _missing_maildir($field) { + list($local_part,$domain) = explode('@', $this->id); + + #TODO: 2nd clause should be the first for self explaining code. + #TODO: When calling config::Read with parameter we sould be right that read return false if the parameter isn't in our config file. + + if(Config::read('maildir_name_hook') != 'NO' && function_exists(Config::read('maildir_name_hook')) ) { + $hook_func = $CONF['maildir_name_hook']; + $maildir = $hook_func ($domain, $this->id); + } elseif (Config::read('domain_path') == "YES") { + if (Config::read('domain_in_mailbox') == "YES") { + $maildir = $domain . "/" . $this->id . "/"; + } else { + $maildir = $domain . "/" . $local_part . "/"; + } + } else { + # If $CONF['domain_path'] is set to NO, $CONF['domain_in_mailbox] is forced to YES. + # Otherwise us...@ex... and us...@fo...r would be mixed up in the same maildir "user/". + $maildir = $this->id . "/"; + } + $this->RAWvalues['maildir'] = $maildir; + } + + private function send_welcome_mail() { + $fTo = $this->id; + $fFrom = smtp_get_admin_email(); + if(empty($fFrom) || $fFrom == 'CLI') $fFrom = $this->id; + $fSubject = Lang::read('pSendmail_subject_text'); + $fBody = Config::read('welcome_text'); + + if (!smtp_mail ($fTo, $fFrom, $fSubject, $fBody)) { + $this->errormsg[] = Lang::read('pSendmail_result_error'); + return false; + } else { +# TODO flash_info($PALANG['pSendmail_result_success']); + } + + return true; + } + + /******************************************************************************************************************** old functions - we'll see what happens to them (at least they should use the *Handler functions instead of doing SQL) @@ -294,14 +409,8 @@ } return false; } -/** - * Add mailbox - * @param password string password of account - * @param gen boolean - * @param name string - * - */ - public function add($password, $name = '', $quota = -999, $active = true, $mail = true ) { + +# remaining comments from add(): # FIXME: default value of $quota (-999) is intentionally invalid. Add fallback to default quota. # Solution: Invent an sub config class with additional informations about domain based configs like default qouta. # FIXME: Should the parameters be optional at all? @@ -309,28 +418,9 @@ # TODO: most code should live in a separate function that can be used by add and edit. # TODO: On the longer term, the web interface should also use this class. -# TODO: copy/move all checks and validations from create-mailbox.php here - $username = $this->id; - list($local_part,$domain) = explode ('@', $username); - - #TODO: more self explaining language strings! - if(!check_mailbox ($domain)) { - $this->errormsg[] = Lang::read('pCreate_mailbox_username_text_error3'); - return false; - } - # check if an alias with this name already exists - $result = db_query ("SELECT * FROM " . table_by_key('alias') . " WHERE address='" . escape_string($username) . "'"); - if ($result['rows'] == 1) { - $this->errormsg[] = Lang::read('pCreate_mailbox_username_text_error2'); - return false; - } - - $plain = $password; - $password = pacrypt ($password); - # TODO: if we want to have the encryption method in the encrypted password string, it should be done in pacrypt(). No special handling here! # if ( preg_match("/^dovecot:/", Config::read('encrypt')) ) { # $split_method = preg_split ('/:/', Config::read('encrypt')); @@ -338,83 +428,6 @@ # $password = '{' . $method . '}' . $password; # } -#TODO: 2nd clause should be the first for self explaining code. -#TODO: When calling config::Read with parameter we sould be right that read return false if the parameter isn't in our config file. - if(Config::read('maildir_name_hook') != 'NO' && function_exists(Config::read('maildir_name_hook')) ) { - $hook_func = $CONF['maildir_name_hook']; - $maildir = $hook_func ($fDomain, $fUsername); - } elseif (Config::read('domain_path') == "YES") { - if (Config::read('domain_in_mailbox') == "YES") { - $maildir = $domain . "/" . $username . "/"; - } else { - $maildir = $domain . "/" . $local_part . "/"; - } - } else { - # If $CONF['domain_path'] is set to NO, $CONF['domain_in_mailbox] is forced to YES. - # Otherwise us...@ex... and us...@fo...r would be mixed up in the same maildir "user/". - $maildir = $username . "/"; - } - - db_begin(); - - $active = db_get_boolean($active); - $quota = multiply_quota ($quota); - - $alias_data = array( - 'address' => $username, - 'goto' => $username, - 'domain' => $domain, - 'active' => $active, - ); - - $result = db_insert('alias', $alias_data); -#MARK: db_insert returns true/false?? - if ($result != 1) { - $this->errormsg[] = Lang::read('pAlias_result_error') . "\n($username -> $username)\n"; - return false; - } - - $mailbox_data = array( - 'username' => $username, - 'password' => $password, - 'name' => $name, - 'maildir' => $maildir, - 'local_part' => $local_part, - 'quota' => $quota, - 'domain' => $domain, - 'active' => $active, - ); - $result = db_insert('mailbox', $mailbox_data); -#MARK: Same here! - if ($result != 1 || !mailbox_postcreation($username,$domain,$maildir, $quota)) { - $this->errormsg[] = Lang::read('pCreate_mailbox_result_error') . "\n($username)\n"; - db_rollback(); - return false; - } else { - db_commit(); - db_log ($domain, 'create_mailbox', $username); - - - if ($mail == true) { - # TODO: move "send the mail" to a function - $fTo = $username; - $fFrom = smtp_get_admin_email(); - if(empty($fFrom) || $fFrom == 'CLI') $fFrom = $this->id; - $fSubject = Lang::read('pSendmail_subject_text'); - $fBody = Config::read('welcome_text'); - - if (!smtp_mail ($fTo, $fFrom, $fSubject, $fBody)) { - $this->errormsg[] = Lang::read('pSendmail_result_error'); - return false; - } - } - - create_mailbox_subfolders($username,$plain); - } - return true; - } - - public function delete() { $username = $this->id; list(/*$local_part*/,$domain) = explode ('@', $username); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-02-19 22:48:05
|
Revision: 1432 http://sourceforge.net/p/postfixadmin/code/1432 Author: christian_boltz Date: 2013-02-19 22:48:02 +0000 (Tue, 19 Feb 2013) Log Message: ----------- MailboxHandler.php: - add _field_password(): - compare password / password2 field (error message will be displayed at password2 field) - autogenerate password if enabled in config and $new - display password on $new if enabled in config or autogenerated This means MailboxHandler now has all needed features to replace create-mailbox.php :-) Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-02-19 22:36:10 UTC (rev 1431) +++ trunk/model/MailboxHandler.php 2013-02-19 22:48:02 UTC (rev 1432) @@ -304,6 +304,27 @@ } /** + * - compare password / password2 field (error message will be displayed at password2 field) + * - autogenerate password if enabled in config and $new + * - display password on $new if enabled in config or autogenerated + */ + protected function _field_password($field, $val) { + if (!$this->_field_password2($field, $val)) return false; + + if ($this->new && Config::read('generate_password') == 'YES' && $val == '') { + # auto-generate new password + unset ($this->errormsg[$field]); # remove "password too short" error message + $val = generate_password(); + $this->values[$field] = $val; # we are doing this "behind the back" of set() + $this->infomsg[] = "Password: $val"; # TODO: make translateable + return false; # to avoid that set() overwrites $this->values[$field] + } elseif ($this->new && Config::read('show_password') == 'YES') { + $this->infomsg[] = "Password: $val"; # TODO: make translateable + } + + } + + /** * compare password / password2 field * error message will be displayed at the password2 field */ @@ -311,9 +332,6 @@ return $this->compare_password_fields('password', 'password2'); } - -# TODO: generate password if $new, no password specified and $CONF['generate_password'] is set - /** * on $this->new, set localpart based on address */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-02-25 20:23:03
|
Revision: 1436 http://sourceforge.net/p/postfixadmin/code/1436 Author: christian_boltz Date: 2013-02-25 20:23:00 +0000 (Mon, 25 Feb 2013) Log Message: ----------- MailboxHandler: - _missing_local_part(), _missing_domain(): remove broken if condition Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-02-22 23:00:55 UTC (rev 1435) +++ trunk/model/MailboxHandler.php 2013-02-25 20:23:00 UTC (rev 1436) @@ -337,7 +337,7 @@ */ protected function _missing_local_part ($field) { list($local_part,$domain) = explode ('@', $this->id); - if (count($parts) == 2) $this->RAWvalues['localpart'] = $local_part; + $this->RAWvalues['local_part'] = $local_part; } /** @@ -345,7 +345,7 @@ */ protected function _missing_domain ($field) { list($local_part,$domain) = explode ('@', $this->id); - if (count($parts) == 2) $this->RAWvalues['domain'] = $domain; + $this->RAWvalues['domain'] = $domain; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-02-26 00:07:37
|
Revision: 1438 http://sourceforge.net/p/postfixadmin/code/1438 Author: christian_boltz Date: 2013-02-26 00:07:34 +0000 (Tue, 26 Feb 2013) Log Message: ----------- MailboxHandler: - _field_password(): return true if checks are successful (without this, an empty password might have ended up in the database!) Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-02-25 23:43:08 UTC (rev 1437) +++ trunk/model/MailboxHandler.php 2013-02-26 00:07:34 UTC (rev 1438) @@ -322,6 +322,7 @@ $this->infomsg[] = "Password: $val"; # TODO: make translateable } + return true; # still here? good. } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-05-01 19:05:35
|
Revision: 1461 http://sourceforge.net/p/postfixadmin/code/1461 Author: christian_boltz Date: 2013-05-01 19:05:32 +0000 (Wed, 01 May 2013) Log Message: ----------- MailboxHandler.php: - validate_new_id(): store error message in $this->errormsg[$this->id_field] instead of $this->errormsg[] - beforestore(): use first array key instead of [0] to match the change in validate_new_id() Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-05-01 19:01:18 UTC (rev 1460) +++ trunk/model/MailboxHandler.php 2013-05-01 19:05:32 UTC (rev 1461) @@ -121,7 +121,7 @@ protected function validate_new_id() { if ($this->id == '') { - $this->errormsg[] = Lang::read('pCreate_mailbox_username_text_error1'); + $this->errormsg[$this->id_field] = Lang::read('pCreate_mailbox_username_text_error1'); return false; } @@ -196,7 +196,8 @@ $ah->calledBy('MailboxHandler'); if ( !$ah->init($this->id) ) { - $this->errormsg[] = $ah->errormsg[0]; + $arraykeys = array_keys($ah->errormsg); + $this->errormsg[] = $ah->errormsg[$arraykeys[0]]; # TODO: implement this as PFAHandler->firstErrormsg() return false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-06-05 22:48:31
|
Revision: 1469 http://sourceforge.net/p/postfixadmin/code/1469 Author: christian_boltz Date: 2013-06-05 22:48:29 +0000 (Wed, 05 Jun 2013) Log Message: ----------- MailboxHandler.php: some bugfixes: - init(): let $domain always base on $this->id (also on $new) - make mergeId dumber (by removing an error check). This can of course result in an invalid mail address, but this is handled more gracefully than an empty $this->id - updateMaxquota(): use Lang::read_f instead of sprintf Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-06-05 22:36:44 UTC (rev 1468) +++ trunk/model/MailboxHandler.php 2013-06-05 22:48:29 UTC (rev 1469) @@ -51,11 +51,11 @@ return false; } + list(/*NULL*/,$domain) = explode('@', $this->id); + if ($this->new) { - $domain = $this->struct['domain']['default']; $currentquota = 0; } else { - list(/*NULL*/,$domain) = explode('@', $this->id); $currentquota = $this->return['quotabytes']; # parent::init called ->view() } @@ -79,7 +79,7 @@ # } elseif ($maxquota < 0) { # TODO: show 'disabled' - at the moment, just shows '-1' } else { - $this->struct['quota']['desc'] = sprintf(Lang::Read('mb_max'), $maxquota); + $this->struct['quota']['desc'] = Lang::read_f('mb_max', $maxquota); } } @@ -166,9 +166,6 @@ */ public function mergeId($values) { if ($this->struct['local_part']['display_in_form'] == 1 && $this->struct['domain']['display_in_form']) { # webform mode - combine to 'address' field - if (empty($values['local_part']) || empty($values['domain']) ) { # local_part or domain not set - return ""; - } return $values['local_part'] . '@' . $values['domain']; } else { return $values[$this->id_field]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-06-10 22:18:55
|
Revision: 1476 http://sourceforge.net/p/postfixadmin/code/1476 Author: christian_boltz Date: 2013-06-10 22:18:53 +0000 (Mon, 10 Jun 2013) Log Message: ----------- MailboxHandler: - fix 'goto' handling https://sourceforge.net/p/postfixadmin/bugs/292/ Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-06-06 21:05:10 UTC (rev 1475) +++ trunk/model/MailboxHandler.php 2013-06-10 22:18:53 UTC (rev 1476) @@ -205,7 +205,7 @@ } if ($this->new) { - $alias_data['goto'] == array($this->id); # 'goto_mailbox' = 1; # would be technically correct, but setting 'goto' is easier + $alias_data['goto'] = array($this->id); # 'goto_mailbox' = 1; # would be technically correct, but setting 'goto' is easier } if (!$ah->set($alias_data)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-06-23 20:23:05
|
Revision: 1494 http://sourceforge.net/p/postfixadmin/code/1494 Author: christian_boltz Date: 2013-06-23 20:23:02 +0000 (Sun, 23 Jun 2013) Log Message: ----------- MailboxHandler.php: - remove a TODO in store_more() (tested, works already) Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-06-23 20:02:05 UTC (rev 1493) +++ trunk/model/MailboxHandler.php 2013-06-23 20:23:02 UTC (rev 1494) @@ -246,7 +246,7 @@ } } else { # edit mode - # TODO: update alias (active status) + # alias active status is updated in before_store() # postedit hook # TODO: implement a poststore() function? - would make handling of old and new values much easier... This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-08-07 20:39:40
|
Revision: 1516 http://sourceforge.net/p/postfixadmin/code/1516 Author: christian_boltz Date: 2013-08-07 20:39:37 +0000 (Wed, 07 Aug 2013) Log Message: ----------- MailboxHandler.php: - new function mailbox_post_script() - result of merging mailbox_postcreation() and mailbox_postedit(), replaces those two functions - drop all parameters, read them from class variables instead - store warn message in $this->errormsg[] instead of using print - changed function calls to use mailbox_post_script() Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-08-07 20:05:18 UTC (rev 1515) +++ trunk/model/MailboxHandler.php 2013-08-07 20:39:37 UTC (rev 1516) @@ -221,12 +221,10 @@ } protected function storemore() { + if ($this->new) { - list(/*NULL*/,$domain) = explode('@', $this->id); - - if ( !$this->mailbox_postcreation($this->id,$domain,$this->values['maildir'], $this->values['quota']) ) { - $this->errormsg[] = Lang::read('pCreate_mailbox_result_error') . " ($this->id)"; + if ( !$this->mailbox_post_script() ) { # return false; # TODO: should this be fatal? } @@ -250,7 +248,6 @@ # postedit hook # TODO: implement a poststore() function? - would make handling of old and new values much easier... - list(/*NULL*/,$domain) = explode('@', $this->id); $old_mh = new MailboxHandler(); @@ -268,8 +265,8 @@ $quota = $oldvalues['quota']; } - if ( !$this->mailbox_postedit($this->id,$domain,$maildir, $quota)) { - $this->errormsg[] = $PALANG['pEdit_mailbox_result_error']; # TODO: more specific error message + if ( !$this->mailbox_post_script() ) { + # TODO: should this be fatal? } } } @@ -491,87 +488,53 @@ /** - * Called after a mailbox has been created in the DBMS. + * Called after a mailbox has been created or edited in the DBMS. * - * @param String $username - * @param String $domain - * @param String $maildir - * @param Integer $quota * @return Boolean success/failure status */ # TODO: replace "print" with $this->errormsg (or infomsg?) - # TODO: merge with mailbox_postedit? - function mailbox_postcreation($username,$domain,$maildir,$quota) { - if (empty($username) || empty($domain) || empty($maildir)) { - trigger_error('In '.__FUNCTION__.': empty username, domain and/or maildir parameter',E_USER_ERROR); - return FALSE; + function mailbox_post_script() { + + if ($this->new) { + $cmd = Config::read('mailbox_postcreation_script'); + $warnmsg = 'WARNING: Problems running mailbox postcreation script!'; # TODO: make translateable + } else { + $cmd = Config::read('mailbox_postedit_script'); + $warnmsg = 'WARNING: Problems running mailbox postedit script!'; # TODO: make translateable } - $cmd = Config::read('mailbox_postcreation_script'); - if ( empty($cmd) ) return TRUE; + if ( empty($cmd) ) return TRUE; # nothing to do - $cmdarg1=escapeshellarg($username); - $cmdarg2=escapeshellarg($domain); - $cmdarg3=escapeshellarg($maildir); - if ($quota <= 0) $quota = 0; - $cmdarg4=escapeshellarg($quota); - $command= "$cmd $cmdarg1 $cmdarg2 $cmdarg3 $cmdarg4"; - $retval=0; - $output=array(); - $firstline=''; - $firstline=exec($command,$output,$retval); - if (0!=$retval) { - error_log("Running $command yielded return value=$retval, first line of output=$firstline"); - print '<p>WARNING: Problems running mailbox postcreation script!</p>'; - return FALSE; - } + list(/*NULL*/,$domain) = explode('@', $this->id); + $quota = $this->values['quota']; - return TRUE; - } - - /** - * Called after a mailbox has been altered in the DBMS. - * - * @param String $username - * @param String $domain - * @param String $maildir - * @param Integer $quota - * @return Boolean success/failure status - */ - # TODO: replace "print" with $this->errormsg (or infomsg?) - function mailbox_postedit($username,$domain,$maildir,$quota) { - if (empty($username) || empty($domain) || empty($maildir)) { + if ( empty($this->id) || empty($domain) || empty($this->values['maildir']) ) { trigger_error('In '.__FUNCTION__.': empty username, domain and/or maildir parameter',E_USER_ERROR); return FALSE; } - $cmd = Config::read('mailbox_postedit_script'); - - if ( empty($cmd) ) return TRUE; - - $cmdarg1=escapeshellarg($username); + $cmdarg1=escapeshellarg($this->id); $cmdarg2=escapeshellarg($domain); - $cmdarg3=escapeshellarg($maildir); - if ($quota <= 0) $quota = 0; + $cmdarg3=escapeshellarg($this->values['maildir']); + if ($quota <= 0) $quota = 0; # TODO: check if this is correct behaviour $cmdarg4=escapeshellarg($quota); - $command = "$cmd $cmdarg1 $cmdarg2 $cmdarg3 $cmdarg4"; + $command= "$cmd $cmdarg1 $cmdarg2 $cmdarg3 $cmdarg4"; $retval=0; $output=array(); $firstline=''; $firstline=exec($command,$output,$retval); if (0!=$retval) { error_log("Running $command yielded return value=$retval, first line of output=$firstline"); - print '<p>WARNING: Problems running mailbox postedit script!</p>'; + $this->errormsg[] = $warnmsg; return FALSE; } return TRUE; } - /** - * Called by mailbox_postcreation() after a mailbox has been - * created. Immediately returns, unless configuration indicates + * Called by storemore() after a mailbox has been created. + * Immediately returns, unless configuration indicates * that one or more sub-folders should be created. * * Triggers E_USER_ERROR if configuration error is detected. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-08-07 20:58:04
|
Revision: 1517 http://sourceforge.net/p/postfixadmin/code/1517 Author: christian_boltz Date: 2013-08-07 20:58:02 +0000 (Wed, 07 Aug 2013) Log Message: ----------- MailboxHandler.php: - create_mailbox_subfolders(), check_quota(): use class variables instead of parameters - create_mailbox_subfolders(): remove check for empty $this-id - this can never happen because it would fail much earlier in the class - check_quota(), allowed_quota(), mailbox_post_script(), create_mailbox_subfolders(): mark as protected Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-08-07 20:39:37 UTC (rev 1516) +++ trunk/model/MailboxHandler.php 2013-08-07 20:58:02 UTC (rev 1517) @@ -234,7 +234,7 @@ } } - if ( !$this->create_mailbox_subfolders($this->id,$this->values['password'])) { + if ( !$this->create_mailbox_subfolders() { # TODO: implement $tShowpass flash_info(Lang::read('pCreate_mailbox_result_succes_nosubfolders') . " ($fUsername$tShowpass)"); # TODO: don't use flash_info } else { # everything ok @@ -292,9 +292,7 @@ * check if quota is allowed */ protected function _field_quota($field, $val) { - list(/*NULL*/,$domain) = explode('@', $this->id); - - if ( !$this->check_quota ($val, $domain, $this->id) ) { + if ( !$this->check_quota ($val) ) { $this->errormsg[$field] = Lang::Read('pEdit_mailbox_quota_text_error'); return false; } @@ -396,18 +394,17 @@ * Check if the user is creating a mailbox within the quota limits of the domain * * @param Integer $quota - quota wanted for the mailbox - * @param String $domain - domain of the mailbox - * @param String $username - mailbox to ignore in quota calculation (used when editing a mailbox) * @return Boolean - true if requested quota is OK, otherwise false */ # TODO: merge with allowed_quota? - function check_quota ($quota, $domain, $username="") { + protected function check_quota ($quota) { $rval = false; if ( !Config::bool('quota') ) { return true; # enforcing quotas is disabled - just allow it } + list(/*NULL*/,$domain) = explode('@', $this->id); $limit = get_domain_properties ($domain); if ($limit['maxquota'] == 0) { @@ -440,9 +437,7 @@ } else { $table_mailbox = table_by_key('mailbox'); $query = "SELECT SUM(quota) FROM $table_mailbox WHERE domain = '" . escape_string($domain) . "'"; - if ($username != "") { - $query .= " AND username != '" . escape_string($username) . "'"; - } + $query .= " AND username != '" . escape_string($this->id) . "'"; $result = db_query ($query); $row = db_row ($result['result']); $cur_quota_total = divide_quota($row[0]); # convert to MB @@ -454,7 +449,7 @@ } return $rval; -} + } /** @@ -464,7 +459,7 @@ * @param Integer $current_user_quota (in bytes) * @return Integer allowed maximum quota (in MB) */ - function allowed_quota($domain, $current_user_quota) { + protected function allowed_quota($domain, $current_user_quota) { if ( !Config::bool('quota') ) { return 0; # quota disabled means no limits - no need for more checks } @@ -492,8 +487,7 @@ * * @return Boolean success/failure status */ - # TODO: replace "print" with $this->errormsg (or infomsg?) - function mailbox_post_script() { + protected function mailbox_post_script() { if ($this->new) { $cmd = Config::read('mailbox_postcreation_script'); @@ -546,16 +540,9 @@ * Doesn't clean up, if only some of the folders could be * created. * - * @param String $login - mailbox username - * @param String $cleartext_password * @return Boolean TRUE if everything succeeds, FALSE on all errors */ - function create_mailbox_subfolders($login,$cleartext_password) { - if (empty($login)) { - trigger_error('In '.__FUNCTION__.': empty $login',E_USER_ERROR); - return FALSE; - } - + protected function create_mailbox_subfolders() { $create_mailbox_subdirs = Config::read('create_mailbox_subdirs'); if ( empty($create_mailbox_subdirs) ) return TRUE; @@ -598,7 +585,7 @@ sleep(1); # give the mail triggering the mailbox creation a chance to do its job - $i=@imap_open($s,$login,$cleartext_password); + $i=@imap_open($s, $this->id, $this->values['password']); if (FALSE==$i) { error_log('Could not log into IMAP/POP server: '.imap_last_error()); return FALSE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-08-07 21:46:56
|
Revision: 1518 http://sourceforge.net/p/postfixadmin/code/1518 Author: christian_boltz Date: 2013-08-07 21:46:53 +0000 (Wed, 07 Aug 2013) Log Message: ----------- MailboxHandler: - fix syntax error :-/ Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-08-07 20:58:02 UTC (rev 1517) +++ trunk/model/MailboxHandler.php 2013-08-07 21:46:53 UTC (rev 1518) @@ -234,7 +234,7 @@ } } - if ( !$this->create_mailbox_subfolders() { + if ( !$this->create_mailbox_subfolders() ) { # TODO: implement $tShowpass flash_info(Lang::read('pCreate_mailbox_result_succes_nosubfolders') . " ($fUsername$tShowpass)"); # TODO: don't use flash_info } else { # everything ok This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2013-10-13 20:07:36
|
Revision: 1538 http://sourceforge.net/p/postfixadmin/code/1538 Author: christian_boltz Date: 2013-10-13 20:07:34 +0000 (Sun, 13 Oct 2013) Log Message: ----------- MailboxHandler.php: - _missing_maildir(): fix forgotten $CONF usage - cleanup outdated TODO notes Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2013-10-13 19:08:32 UTC (rev 1537) +++ trunk/model/MailboxHandler.php 2013-10-13 20:07:34 UTC (rev 1538) @@ -352,14 +352,12 @@ protected function _missing_maildir($field) { list($local_part,$domain) = explode('@', $this->id); - #TODO: 2nd clause should be the first for self explaining code. - #TODO: When calling config::Read with parameter we sould be right that read return false if the parameter isn't in our config file. + $maildir_name_hook = Config::read('maildir_name_hook'); - if(Config::read('maildir_name_hook') != 'NO' && function_exists(Config::read('maildir_name_hook')) ) { - $hook_func = $CONF['maildir_name_hook']; - $maildir = $hook_func ($domain, $this->id); - } elseif (Config::read('domain_path') == "YES") { - if (Config::read('domain_in_mailbox') == "YES") { + if($maildir_name_hook != 'NO' && function_exists($maildir_name_hook) ) { + $maildir = $maildir_name_hook ($domain, $this->id); + } elseif (Config::bool('domain_path')) { + if (Config::bool('domain_in_mailbox')) { $maildir = $domain . "/" . $this->id . "/"; } else { $maildir = $domain . "/" . $local_part . "/"; @@ -649,24 +647,9 @@ return true; } -# remaining comments from add(): -# FIXME: default value of $quota (-999) is intentionally invalid. Add fallback to default quota. -# Solution: Invent an sub config class with additional informations about domain based configs like default qouta. -# FIXME: Should the parameters be optional at all? -# TODO: check if parameters are valid/allowed (quota?). -# TODO: most code should live in a separate function that can be used by add and edit. -# TODO: On the longer term, the web interface should also use this class. - #TODO: more self explaining language strings! -# TODO: if we want to have the encryption method in the encrypted password string, it should be done in pacrypt(). No special handling here! -# if ( preg_match("/^dovecot:/", Config::read('encrypt')) ) { -# $split_method = preg_split ('/:/', Config::read('encrypt')); -# $method = strtoupper($split_method[1]); -# $password = '{' . $method . '}' . $password; -# } - public function delete() { $username = $this->id; list(/*$local_part*/,$domain) = explode ('@', $username); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2014-03-16 19:29:58
|
Revision: 1655 http://sourceforge.net/p/postfixadmin/code/1655 Author: christian_boltz Date: 2014-03-16 19:29:55 +0000 (Sun, 16 Mar 2014) Log Message: ----------- MailboxHandler: - read_from_db_postprocess(): avoid warning if quota is disabled in $struct Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2014-02-21 00:22:57 UTC (rev 1654) +++ trunk/model/MailboxHandler.php 2014-03-16 19:29:55 UTC (rev 1655) @@ -175,8 +175,13 @@ protected function read_from_db_postprocess($db_result) { foreach ($db_result as $key => $row) { - $db_result[$key]['quotabytes'] = $row['quota']; - $db_result[$key]['quota'] = divide_quota($row['quota']); # convert quota to MB + if (isset($row['quota'])) { # quota could be disabled in $struct + $db_result[$key]['quotabytes'] = $row['quota']; + $db_result[$key]['quota'] = divide_quota($row['quota']); # convert quota to MB + } else { + $db_result[$key]['quotabytes'] = -1; + $db_result[$key]['quota'] = -1; + } } return $db_result; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2014-04-28 20:42:41
|
Revision: 1663 http://sourceforge.net/p/postfixadmin/code/1663 Author: christian_boltz Date: 2014-04-28 20:42:38 +0000 (Mon, 28 Apr 2014) Log Message: ----------- MailboxHandler: - validate_new_id(): make sure mailbox creation still works if the alias limit for the domain is hit Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2014-04-27 19:18:14 UTC (rev 1662) +++ trunk/model/MailboxHandler.php 2014-04-28 20:42:38 UTC (rev 1663) @@ -140,7 +140,10 @@ # check if an alias with this name already exists - if yes, don't allow to create the mailbox $handler = new AliasHandler(1); + $handler->calledBy('MailboxHandler'); # make sure mailbox creation still works if the alias limit for the domain is hit + if (!$handler->init($this->id)) { + # TODO: keep original error message from AliasHandler $this->errormsg[] = Config::lang('email_address_already_exists'); return false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2014-10-05 22:09:51
|
Revision: 1693 http://sourceforge.net/p/postfixadmin/code/1693 Author: christian_boltz Date: 2014-10-05 22:09:42 +0000 (Sun, 05 Oct 2014) Log Message: ----------- MailboxHandler.php: - storemore(): - fix undefined variable if creating subfolders fails (bug#328) - remove some outdated TODO notes - create_mailbox_subfolders(): add $this->id to error_log Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2014-10-05 21:45:45 UTC (rev 1692) +++ trunk/model/MailboxHandler.php 2014-10-05 22:09:42 UTC (rev 1693) @@ -247,12 +247,7 @@ } if ( !$this->create_mailbox_subfolders() ) { - # TODO: implement $tShowpass - $this->infomsg[] = Config::lang_f('pCreate_mailbox_result_succes_nosubfolders', "$fUsername$tShowpass"); - } else { # everything ok - # TODO: implement $tShowpass - # $this->infomsg[] = Config::lang_f('pCreate_mailbox_result_success'], "$fUsername$tShowpass"); - # TODO: currently edit.php displays the default success message from webformConfig + $this->infomsg[] = Config::lang_f('pCreate_mailbox_result_succes_nosubfolders', $this->id); } } else { # edit mode @@ -659,7 +654,7 @@ $i=@imap_open($s, $this->id, $this->values['password']); if (FALSE==$i) { - error_log('Could not log into IMAP/POP server: '.imap_last_error()); + error_log('Could not log into IMAP/POP server: ' . $this->id . ': ' . imap_last_error()); return FALSE; } @@ -668,7 +663,7 @@ $f='{'.$s_host.'}'.$s_prefix.$f; $res=imap_createmailbox($i,$f); if (!$res) { - error_log('Could not create IMAP folder $f: '.imap_last_error()); + error_log('Could not create IMAP folder $f: ' . $this->id . ': ' . imap_last_error()); @imap_close($i); return FALSE; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2015-01-12 17:12:14
|
Revision: 1736 http://sourceforge.net/p/postfixadmin/code/1736 Author: christian_boltz Date: 2015-01-12 17:12:07 +0000 (Mon, 12 Jan 2015) Log Message: ----------- MailboxHandler: - check_quota(): deny creating an unlimited mailbox if domain quota is set (reported by idaho7 in IRC) Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2015-01-07 21:25:20 UTC (rev 1735) +++ trunk/model/MailboxHandler.php 2015-01-12 17:12:07 UTC (rev 1736) @@ -463,6 +463,8 @@ return true; # enforcing domain_quota is disabled - just allow it } elseif ($limit['quota'] <= 0) { # TODO: CHECK - 0 (unlimited) is fine, not sure about <= -1 (disabled)... $rval = true; + } elseif ($quota == 0) { # trying to create an unlimited mailbox, but domain quota is set + return false; } else { $table_mailbox = table_by_key('mailbox'); $query = "SELECT SUM(quota) FROM $table_mailbox WHERE domain = '" . escape_string($domain) . "'"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2015-01-24 14:00:44
|
Revision: 1737 http://sourceforge.net/p/postfixadmin/code/1737 Author: christian_boltz Date: 2015-01-24 14:00:35 +0000 (Sat, 24 Jan 2015) Log Message: ----------- MailboxHandler: - storemore(): store maildir in the correct variable to fix running mailbox_postedit script Fix by bit-jockey @SF, https://sourceforge.net/p/postfixadmin/bugs/342/ Modified Paths: -------------- trunk/model/MailboxHandler.php Modified: trunk/model/MailboxHandler.php =================================================================== --- trunk/model/MailboxHandler.php 2015-01-12 17:12:07 UTC (rev 1736) +++ trunk/model/MailboxHandler.php 2015-01-24 14:00:35 UTC (rev 1737) @@ -265,7 +265,8 @@ } else { $oldvalues = $old_mh->result(); - $maildir = $oldvalues['maildir']; + $this->values['maildir'] = $oldvalues['maildir']; + if (isset($this->values['quota'])) { $quota = $this->values['quota']; } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |