allow richer email addresses in notify and registernotify FS#2689

This deprecates the "richemail" config class
This commit is contained in:
Andreas Gohr 2013-02-16 14:37:12 +01:00
parent 6a1f928ffc
commit a9b6a8b59a
2 changed files with 43 additions and 54 deletions

View File

@ -79,7 +79,7 @@ if (!class_exists('configuration')) {
array_shift($param);
} else {
$class = 'setting_undefined';
$param = NULL;
$param = null;
}
if (!in_array($class, $no_default_check) && !isset($default[$key])) {
@ -353,13 +353,13 @@ if (!class_exists('setting')) {
class setting {
var $_key = '';
var $_default = NULL;
var $_local = NULL;
var $_protected = NULL;
var $_default = null;
var $_local = null;
var $_protected = null;
var $_pattern = '';
var $_error = false; // only used by those classes which error check
var $_input = NULL; // only used by those classes which error check
var $_input = null; // only used by those classes which error check
var $_cautionList = array(
'basedir' => 'danger', 'baseurl' => 'danger', 'savedir' => 'danger', 'cookiedir' => 'danger', 'useacl' => 'danger', 'authtype' => 'danger', 'superuser' => 'danger', 'userewrite' => 'danger',
@ -367,7 +367,7 @@ if (!class_exists('setting')) {
'allowdebug' => 'security', 'htmlok' => 'security', 'phpok' => 'security', 'iexssprotect' => 'security', 'xmlrpc' => 'security', 'fullpath' => 'security'
);
function setting($key, $params=NULL) {
function setting($key, $params=null) {
$this->_key = $key;
if (is_array($params)) {
@ -656,6 +656,7 @@ if (!class_exists('setting_email')) {
class setting_email extends setting_string {
var $_pattern = SETTING_EMAIL_PATTERN; // no longer required, retained for backward compatibility - FIXME, may not be necessary
var $_multiple = false;
var $_placeholders = false;
/**
* update setting with user provided value $input
@ -669,15 +670,36 @@ if (!class_exists('setting_email')) {
$value = is_null($this->_local) ? $this->_default : $this->_local;
if ($value == $input) return false;
if($input === ''){
$this->_local = $input;
return true;
}
$mail = $input;
if ($this->_multiple) {
$mails = array_filter(array_map('trim', explode(',', $input)));
} else {
$mails = array($input);
if($this->_placeholders){
// replace variables with pseudo values
$mail = str_replace('@USER@','joe',$mail);
$mail = str_replace('@NAME@','Joe Schmoe',$mail);
$mail = str_replace('@MAIL@','joe@example.com',$mail);
}
// multiple mail addresses?
if ($this->_multiple) {
$mails = array_filter(array_map('trim', explode(',', $mail)));
} else {
$mails = array($mail);
}
// check them all
foreach ($mails as $mail) {
if (!mail_isvalid($mail)) {
// only check the address part
if(preg_match('#(.*?)<(.*?)>#', $mail, $matches)){
$addr = $matches[2];
}else{
$addr = $mail;
}
if (!mail_isvalid($addr)) {
$this->_error = true;
$this->_input = $input;
return false;
@ -690,46 +712,15 @@ if (!class_exists('setting_email')) {
}
}
/**
* @deprecated 2013-02-16
*/
if (!class_exists('setting_richemail')) {
class setting_richemail extends setting_email {
/**
* update setting with user provided value $input
* if value fails error check, save it
*
* @return boolean true if changed, false otherwise (incl. on error)
*/
function update($input) {
if (is_null($input)) return false;
if ($this->is_protected()) return false;
$value = is_null($this->_local) ? $this->_default : $this->_local;
if ($value == $input) return false;
// replace variables with pseudo values
$test = $input;
$test = str_replace('@USER@','joe',$test);
$test = str_replace('@NAME@','Joe Schmoe',$test);
$test = str_replace('@MAIL@','joe@example.com',$test);
// now only check the address part
if(preg_match('#(.*?)<(.*?)>#',$test,$matches)){
$text = trim($matches[1]);
$addr = $matches[2];
}else{
$addr = $test;
}
if ($test !== '' && !mail_isvalid($addr)) {
$this->_error = true;
$this->_input = $input;
return false;
}
$this->_local = $input;
return true;
}
function update($input) {
$this->_placeholders = true;
return parent::update($input);
}
}
}

View File

@ -20,9 +20,7 @@
* 'numericopt' - like above, but accepts empty values
* 'onoff' - checkbox input, setting output 0|1
* 'multichoice' - select input (single choice), setting output with quotes, required _choices parameter
* 'email' - text input, input must conform to email address format, setting output in quotes
* 'richemail' - text input, input must conform to email address format but accepts variables and
* emails with a real name prepended (when email address is given in <>)
* 'email' - text input, input must conform to email address format
* 'password' - password input, minimal input validation, setting output text in quotes, maybe encoded
* according to the _code parameter
* 'dirchoice' - as multichoice, selection choices based on folders found at location specified in _dir
@ -177,8 +175,8 @@ $meta['_notifications'] = array('fieldset');
$meta['subscribers'] = array('onoff');
$meta['subscribe_time'] = array('numeric');
$meta['notify'] = array('email', '_multiple' => true);
$meta['registernotify'] = array('email');
$meta['mailfrom'] = array('richemail');
$meta['registernotify'] = array('email', '_multiple' => true);
$meta['mailfrom'] = array('email', '_placeholders' => true);
$meta['mailprefix'] = array('string');
$meta['htmlmail'] = array('onoff');