Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
slapos
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Tristan Cavelier
slapos
Commits
72e10a30
Commit
72e10a30
authored
Jul 17, 2013
by
Vivien Alger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
davstorage: Templates for french translation and sendmail
parent
45243101
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
4629 additions
and
9 deletions
+4629
-9
slapos/recipe/davstorage/__init__.py
slapos/recipe/davstorage/__init__.py
+0
-8
software/davstorage/common.cfg
software/davstorage/common.cfg
+20
-0
software/davstorage/instance-davstorage.cfg
software/davstorage/instance-davstorage.cfg
+96
-1
software/davstorage/templates/bootstrap_conf.php
software/davstorage/templates/bootstrap_conf.php
+59
-0
software/davstorage/templates/class.AJXP_Utils.php
software/davstorage/templates/class.AJXP_Utils.php
+1591
-0
software/davstorage/templates/class.phpmailer-lite.php
software/davstorage/templates/class.phpmailer-lite.php
+2075
-0
software/davstorage/templates/main.cf.in
software/davstorage/templates/main.cf.in
+657
-0
software/davstorage/templates/master.cf.in
software/davstorage/templates/master.cf.in
+127
-0
software/davstorage/templates/postfix.in
software/davstorage/templates/postfix.in
+2
-0
software/davstorage/templates/sendmail.in
software/davstorage/templates/sendmail.in
+2
-0
No files found.
slapos/recipe/davstorage/__init__.py
View file @
72e10a30
...
...
@@ -52,14 +52,6 @@ class Recipe(GenericBaseRecipe):
user
,
password
])
htdocs_location
=
self
.
options
[
'htdocs'
]
if
not
(
os
.
path
.
exists
(
htdocs_location
)
and
os
.
listdir
(
htdocs_location
)):
try
:
os
.
rmdir
(
htdocs_location
)
except
:
pass
shutil
.
copytree
(
self
.
options
[
'source'
],
htdocs_location
)
# Install php.ini
php_ini
=
self
.
createFile
(
os
.
path
.
join
(
self
.
options
[
'php-ini-dir'
],
'php.ini'
),
...
...
software/davstorage/common.cfg
View file @
72e10a30
...
...
@@ -13,6 +13,7 @@ extends =
../../component/lxml-python/buildout.cfg
../../component/python-2.7/buildout.cfg
../../component/gzip/buildout.cfg
../../component/postfix/buildout.cfg
find-links +=
http://www.nexedi.org/static/packages/source/slapos.buildout/
...
...
@@ -37,6 +38,7 @@ allow-hosts +=
www.owlfish.com
parts =
postfix
apache-php
application
template
...
...
@@ -80,5 +82,23 @@ md5sum = 699ecf4678386667f58a3391bab7af0f
output = ${buildout:directory}/template-davstorage.cfg
mode = 0644
[mailer-plugin]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/templates/${:filename}
filename = class.phpmailer-lite.php
sendmail-location = ${postfix:location}/usr/sbin/sendmail
output = ${application:location}/plugins/mailer.phpmailer-lite/lib/${:filename}
mode = 0644
#md5sum =
[bootstrap-conf]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/templates/${:filename}
filename = bootstrap_conf.php
translation = fr_FR.UTF-8
output = ${application:location}/conf/${:filename}
mode = 0644
#md5sum =
[lxml-python]
python = python2.7
software/davstorage/instance-davstorage.cfg
View file @
72e10a30
...
...
@@ -8,6 +8,13 @@ parts =
cron-entry-logrotate
logrotate
logrotate-entry-davstorage
copy-app
mailer-plugin
share-url-generation
postfix-conf
postfix-users
postfix-master-conf
postfix-service
request-frontend
eggs-directory = ${buildout:eggs-directory}
...
...
@@ -52,7 +59,6 @@ apache-binary = ${apache:location}/bin/httpd
apache-modules-dir = ${apache:location}/modules/
apache-mime-file = ${apache:location}/conf/mime.types
apache-htpasswd = ${apache:location}/bin/htpasswd
source = ${application:location}
[certificate-authority]
recipe = slapos.cookbook:certificate_authority
...
...
@@ -157,6 +163,23 @@ cronstamps = $${rootdirectory:etc}/cronstamps/
cronoutput = $${basedirectory:log}/cron/
php-ini-dir = $${rootdirectory:etc}/php
tmp-php = $${rootdirectory:tmp}/php
postfix-conf = $${rootdirectory:etc}/postfix
spool = $${rootdirectory:var}/spool/postfix
data = $${rootdirectory:var}/lib/postfix
maildrop = $${directory:spool}/maildrop
active = $${directory:spool}/active
bounce = $${directory:spool}/bounce
corrupt = $${directory:spool}/corrupt
defer = $${directory:spool}/defer
deferred = $${directory:spool}/deferred
flush = $${directory:spool}/flush
hold = $${directory:spool}/hold
incoming = $${directory:spool}/incoming
private = $${directory:spool}/private
public = $${directory:spool}/public
pid = $${directory:spool}/pid
saved = $${directory:spool}/saved
trace = $${directory:spool}/trace
# Request frontend
[request-frontend-ajaxupload]
...
...
@@ -183,6 +206,78 @@ config-https-only = true
config-url = https://$${davstorage:user}:$${davstorage:password}@[$${davstorage:ip}]:$${davstorage:port_webdav}/
return = domain
[copy-app]
recipe = plone.recipe.command
update-command = command
command = cp -R ${application:location}/* $${directory:htdocs}
[mailer-plugin]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/templates/$${:filename}
filename = class.phpmailer-lite.php
sendmail-script = $${sendmail-script:output}
output = $${directory:htdocs}/plugins/mailer.phpmailer-lite/lib/$${:filename}
mode = 0644
#md5sum =
[share-url-generation]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/templates/$${:filename}
filename = class.AJXP_Utils.php
output = $${directory:htdocs}/core/classes/$${:filename}
mode = 0644
#md5sum =
[postfix-service]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/templates/$${:filename}
filename = postfix.in
postfix-location = ${postfix:location}/usr/sbin/postfix
postfix-config-dir = $${directory:postfix-conf}
output = $${basedirectory:services}/postfix
mode = 0755
#md5sum =
[sendmail-script]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/templates/$${:filename}
filename = sendmail.in
sendmail-location = ${postfix:location}/usr/sbin/sendmail
postfix-config-dir = $${directory:postfix-conf}
output = $${rootdirectory:bin}/sendmail
mode = 0755
#md5sum =
[postfix-conf]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/templates/$${:filename}
filename = main.cf.in
queue-directory = $${directory:spool}
command-directory = ${postfix:location}/usr/sbin
bin-directory = ${postfix:location}/usr/bin
daemon-directory = ${postfix:location}/usr/libexec/postfix
data-directory = $${directory:data}
mail-owner = $${slap-connection:partition_id}
mail-group = $${slap-connection:partition_id}
ipv4 = $${slap-network-information:global-ipv6}
output = $${directory:postfix-conf}/main.cf
mode = 0644
#md5sum =
[postfix-users]
recipe = plone.recipe.command
update-command = command
command = sed 's/ slappart/ slapuser/g' $${postfix-conf:output} > main.tmp && mv main.tmp $${postfix-conf:output}
[postfix-master-conf]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/templates/$${:filename}
filename = master.cf.in
port = 2525
output = $${directory:postfix-conf}/master.cf
mode = 0644
#md5sum =
# XXX Vivien: promise not working for now
#[frontend-ajaxupload-promise]
#recipe = slapos.cookbook:check_url_available
...
...
software/davstorage/templates/bootstrap_conf.php
0 → 100644
View file @
72e10a30
<?php
/*
* Copyright 2007-2011 Charles du Jeu <contact (at) cdujeu.me>
* This file is part of AjaXplorer.
*
* AjaXplorer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AjaXplorer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with AjaXplorer. If not, see <http://www.gnu.org/licenses/>.
*
* The latest code can be found at <http://www.ajaxplorer.info/>.
*
* These configuration must be set at the very root loading of the framework
*/
/*
* If you have a charset warning, or problems displaying filenames with accented characters,
* check your system locale and set it in the form lang_country.charset
* Example : fr_FR.UTF-8, fr_FR.ISO-8859-1, fr_FR.CP1252 (windows), en_EN.UTF-8, etc.
*
* Windows users may define an empty string
* define("AJXP_LOCALE", "");
*/
define
(
"AJXP_LOCALE"
,
"${:translation}"
);
//define("AJXP_LOCALE", "");
/*
* If you encounter problems writing to the standard php tmp directory, you can
* define your own tmp dir here. Suggested value is ajxp_path/data/tmp/
* AJXP_DATA_PATH, AJXP_INSTALL_PATH are replaced automatically.
*
* See php.ini settings below for the session.save_path value as well.
*/
//define("AJXP_TMP_DIR", AJXP_DATA_PATH."/tmp");
/*
* Additionnal php.ini settings
* > Problems with tmp dir : set your own session tmp dir (create it and make it writeable!)
* > Concurrent versions of AjaXplorer : use session.cookie_path to differentiate them.
*/
$AJXP_INISET
=
array
();
//$AJXP_INISET["session.save_path"] = AJXP_DATA_PATH."/tmp/sessions";
//$AJXP_INISET["session.cookie_path"] = "/ajaxplorer";
/*
* If you want to force the https, uncomment the line below. This will automatically
* redirect all calls to ajaxplorer via http to the same URL with https
*/
//define("AJXP_FORCE_SSL_REDIRECT", true);
\ No newline at end of file
software/davstorage/templates/class.AJXP_Utils.php
0 → 100644
View file @
72e10a30
<?php
/*
* Copyright 2007-2011 Charles du Jeu <contact (at) cdujeu.me>
* This file is part of AjaXplorer.
*
* AjaXplorer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AjaXplorer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with AjaXplorer. If not, see <http://www.gnu.org/licenses/>.
*
* The latest code can be found at <http://www.ajaxplorer.info/>.
*/
defined
(
'AJXP_EXEC'
)
or
die
(
'Access not allowed'
);
define
(
'AJXP_SANITIZE_HTML'
,
1
);
define
(
'AJXP_SANITIZE_HTML_STRICT'
,
2
);
define
(
'AJXP_SANITIZE_ALPHANUM'
,
3
);
define
(
'AJXP_SANITIZE_EMAILCHARS'
,
4
);
/**
* Various functions used everywhere, static library
* @package AjaXplorer
* @subpackage Core
*/
class
AJXP_Utils
{
/**
* Performs a natural sort on the array keys.
* Behaves the same as ksort() with natural sorting added.
*
* @param Array $array The array to sort
* @return boolean
*/
static
function
natksort
(
&
$array
)
{
uksort
(
$array
,
'strnatcasecmp'
);
return
true
;
}
/**
* Performs a reverse natural sort on the array keys
* Behaves the same as krsort() with natural sorting added.
*
* @param Array $array The array to sort
* @return boolean
*/
static
function
natkrsort
(
&
$array
)
{
natksort
(
$array
);
$array
=
array_reverse
(
$array
,
TRUE
);
return
true
;
}
/**
* Remove all "../../" tentatives, replace double slashes
* @static
* @param string $path
* @return string
*/
static
function
securePath
(
$path
)
{
if
(
$path
==
null
)
$path
=
""
;
//
// REMOVE ALL "../" TENTATIVES
//
$dirs
=
explode
(
'/'
,
$path
);
for
(
$i
=
0
;
$i
<
count
(
$dirs
);
$i
++
)
{
if
(
$dirs
[
$i
]
==
'.'
or
$dirs
[
$i
]
==
'..'
)
{
$dirs
[
$i
]
=
''
;
}
}
// rebuild safe directory string
$path
=
implode
(
'/'
,
$dirs
);
//
// REPLACE DOUBLE SLASHES
//
while
(
preg_match
(
'/\/\//'
,
$path
))
{
$path
=
str_replace
(
'//'
,
'/'
,
$path
);
}
return
$path
;
}
/**
* Function to clean a string from specific characters
*
* @static
* @param string $s
* @param int $level Can be AJXP_SANITIZE_ALPHANUM, AJXP_SANITIZE_EMAILCHARS, AJXP_SANITIZE_HTML, AJXP_SANITIZE_HTML_STRICT
* @param string $expand
* @return mixed|string
*/
public
static
function
sanitize
(
$s
,
$level
=
AJXP_SANITIZE_HTML
,
$expand
=
'script|style|noframes|select|option'
)
{
/**/
//prep the string
$s
=
' '
.
$s
;
if
(
$level
==
AJXP_SANITIZE_ALPHANUM
)
{
return
preg_replace
(
"/[^a-zA-Z0-9_\-\.]/"
,
""
,
$s
);
}
else
if
(
$level
==
AJXP_SANITIZE_EMAILCHARS
)
{
return
preg_replace
(
"/[^a-zA-Z0-9_\-\.@!%\+=|~\?]/"
,
""
,
$s
);
}
//begin removal
/**/
//remove comment blocks
while
(
stripos
(
$s
,
'<!--'
)
>
0
)
{
$pos
[
1
]
=
stripos
(
$s
,
'<!--'
);
$pos
[
2
]
=
stripos
(
$s
,
'-->'
,
$pos
[
1
]);
$len
[
1
]
=
$pos
[
2
]
-
$pos
[
1
]
+
3
;
$x
=
substr
(
$s
,
$pos
[
1
],
$len
[
1
]);
$s
=
str_replace
(
$x
,
''
,
$s
);
}
/**/
//remove tags with content between them
if
(
strlen
(
$expand
)
>
0
)
{
$e
=
explode
(
'|'
,
$expand
);
for
(
$i
=
0
;
$i
<
count
(
$e
);
$i
++
)
{
while
(
stripos
(
$s
,
'<'
.
$e
[
$i
])
>
0
)
{
$len
[
1
]
=
strlen
(
'<'
.
$e
[
$i
]);
$pos
[
1
]
=
stripos
(
$s
,
'<'
.
$e
[
$i
]);
$pos
[
2
]
=
stripos
(
$s
,
$e
[
$i
]
.
'>'
,
$pos
[
1
]
+
$len
[
1
]);
$len
[
2
]
=
$pos
[
2
]
-
$pos
[
1
]
+
$len
[
1
];
$x
=
substr
(
$s
,
$pos
[
1
],
$len
[
2
]);
$s
=
str_replace
(
$x
,
''
,
$s
);
}
}
}
$s
=
strip_tags
(
$s
);
if
(
$level
==
AJXP_SANITIZE_HTML_STRICT
)
{
$s
=
preg_replace
(
"/[
\"
,;\/`<>:\*\|\?!\^
\\
\]/"
,
""
,
$s
);
}
else
{
$s
=
str_replace
(
array
(
"<"
,
">"
),
array
(
"<"
,
">"
),
$s
);
}
return
trim
(
$s
);
}
/**
* Perform standard urldecode, sanitization, securepath and magicDequote
* @static
* @param $data
* @param int $sanitizeLevel
* @return string
*/
public
static
function
decodeSecureMagic
(
$data
,
$sanitizeLevel
=
AJXP_SANITIZE_HTML
)
{
return
SystemTextEncoding
::
fromUTF8
(
AJXP_Utils
::
sanitize
(
AJXP_Utils
::
securePath
(
SystemTextEncoding
::
magicDequote
(
$data
)),
$sanitizeLevel
));
}
/**
* Try to load the tmp dir from the CoreConf AJXP_TMP_DIR, or the constant AJXP_TMP_DIR,
* or the sys_get_temp_dir
* @static
* @return mixed|null|string
*/
public
static
function
getAjxpTmpDir
()
{
if
(
ConfService
::
getCoreConf
(
"AJXP_TMP_DIR"
)
!=
null
)
{
return
ConfService
::
getCoreConf
(
"AJXP_TMP_DIR"
);
}
if
(
defined
(
"AJXP_TMP_DIR"
)
&&
AJXP_TMP_DIR
!=
""
)
{
return
AJXP_TMP_DIR
;
}
return
realpath
(
sys_get_temp_dir
());
}
public
static
function
detectApplicationFirstRun
(){
return
!
file_exists
(
AJXP_CACHE_DIR
.
"/first_run_passed"
);
}
public
static
function
setApplicationFirstRunPassed
(){
@
file_put_contents
(
AJXP_CACHE_DIR
.
"/first_run_passed"
,
"true"
);
}
/**
* Parse a Comma-Separated-Line value
* @static
* @param $string
* @param bool $hash
* @return array
*/
public
static
function
parseCSL
(
$string
,
$hash
=
false
)
{
$exp
=
array_map
(
"trim"
,
explode
(
","
,
$string
));
if
(
!
$hash
)
return
$exp
;
$assoc
=
array
();
foreach
(
$exp
as
$explVal
)
{
$reExp
=
explode
(
"|"
,
$explVal
);
if
(
count
(
$reExp
)
==
1
)
$assoc
[
$reExp
[
0
]]
=
$reExp
[
0
];
else
$assoc
[
$reExp
[
0
]]
=
$reExp
[
1
];
}
return
$assoc
;
}
/**
* Parse the $fileVars[] PHP errors
* @static
* @param $boxData
* @return array|null
*/
static
function
parseFileDataErrors
(
$boxData
)
{
$mess
=
ConfService
::
getMessages
();
$userfile_error
=
$boxData
[
"error"
];
$userfile_tmp_name
=
$boxData
[
"tmp_name"
];
$userfile_size
=
$boxData
[
"size"
];
if
(
$userfile_error
!=
UPLOAD_ERR_OK
)
{
$errorsArray
=
array
();
$errorsArray
[
UPLOAD_ERR_FORM_SIZE
]
=
$errorsArray
[
UPLOAD_ERR_INI_SIZE
]
=
array
(
409
,
"File is too big! Max is"
.
ini_get
(
"upload_max_filesize"
));
$errorsArray
[
UPLOAD_ERR_NO_FILE
]
=
array
(
410
,
"No file found on server!"
);
$errorsArray
[
UPLOAD_ERR_PARTIAL
]
=
array
(
410
,
"File is partial"
);
$errorsArray
[
UPLOAD_ERR_INI_SIZE
]
=
array
(
410
,
"No file found on server!"
);
if
(
$userfile_error
==
UPLOAD_ERR_NO_FILE
)
{
// OPERA HACK, do not display "no file found error"
if
(
!
ereg
(
'Opera'
,
$_SERVER
[
'HTTP_USER_AGENT'
]))
{
return
$errorsArray
[
$userfile_error
];
}
}
else
{
return
$errorsArray
[
$userfile_error
];
}
}
if
(
$userfile_tmp_name
==
"none"
||
$userfile_size
==
0
)
{
return
array
(
410
,
$mess
[
31
]);
}
return
null
;
}
/**
* Utilitary to pass some parameters directly at startup :
* + repository_id / folder
* + compile & skipDebug
* + update_i18n, extract, create
* + external_selector_type
* + skipIOS
* + gui
* @static
* @param $parameters
* @param $output
* @param $session
* @return void
*/
public
static
function
parseApplicationGetParameters
(
$parameters
,
&
$output
,
&
$session
)
{
$output
[
"EXT_REP"
]
=
"/"
;
if
(
isSet
(
$parameters
[
"repository_id"
])
&&
isSet
(
$parameters
[
"folder"
])
||
isSet
(
$parameters
[
"goto"
]))
{
if
(
isSet
(
$parameters
[
"goto"
])){
$repoId
=
array_shift
(
explode
(
"/"
,
ltrim
(
$parameters
[
"goto"
],
"/"
)));
$parameters
[
"folder"
]
=
str_replace
(
$repoId
,
""
,
ltrim
(
$parameters
[
"goto"
],
"/"
));
}
else
{
$repoId
=
$parameters
[
"repository_id"
];
}
$repository
=
ConfService
::
getRepositoryById
(
$repoId
);
if
(
$repository
==
null
)
{
$repository
=
ConfService
::
getRepositoryByAlias
(
$repoId
);
if
(
$repository
!=
null
)
{
$parameters
[
"repository_id"
]
=
$repository
->
getId
();
}
}
require_once
(
AJXP_BIN_FOLDER
.
"/class.SystemTextEncoding.php"
);
if
(
AuthService
::
usersEnabled
())
{
$loggedUser
=
AuthService
::
getLoggedUser
();
if
(
$loggedUser
!=
null
&&
$loggedUser
->
canSwitchTo
(
$parameters
[
"repository_id"
]))
{
$output
[
"EXT_REP"
]
=
SystemTextEncoding
::
toUTF8
(
urldecode
(
$parameters
[
"folder"
]));
$loggedUser
->
setArrayPref
(
"history"
,
"last_repository"
,
$parameters
[
"repository_id"
]);
$loggedUser
->
setPref
(
"pending_folder"
,
SystemTextEncoding
::
toUTF8
(
AJXP_Utils
::
decodeSecureMagic
(
$parameters
[
"folder"
])));
$loggedUser
->
save
(
"user"
);
AuthService
::
updateUser
(
$loggedUser
);
}
else
{
$session
[
"PENDING_REPOSITORY_ID"
]
=
$parameters
[
"repository_id"
];
$session
[
"PENDING_FOLDER"
]
=
SystemTextEncoding
::
toUTF8
(
AJXP_Utils
::
decodeSecureMagic
(
$parameters
[
"folder"
]));
}
}
else
{
ConfService
::
switchRootDir
(
$parameters
[
"repository_id"
]);
$output
[
"EXT_REP"
]
=
SystemTextEncoding
::
toUTF8
(
urldecode
(
$parameters
[
"folder"
]));
}
}
if
(
isSet
(
$parameters
[
"skipDebug"
]))
{
ConfService
::
setConf
(
"JS_DEBUG"
,
false
);
}
if
(
ConfService
::
getConf
(
"JS_DEBUG"
)
&&
isSet
(
$parameters
[
"compile"
]))
{
require_once
(
AJXP_BIN_FOLDER
.
"/class.AJXP_JSPacker.php"
);
AJXP_JSPacker
::
pack
();
}
if
(
ConfService
::
getConf
(
"JS_DEBUG"
)
&&
isSet
(
$parameters
[
"update_i18n"
]))
{
if
(
isSet
(
$parameters
[
"extract"
]))
{
self
::
extractConfStringsFromManifests
();
}
self
::
updateAllI18nLibraries
((
isSet
(
$parameters
[
"create"
])
?
$parameters
[
"create"
]
:
""
));
}
if
(
ConfService
::
getConf
(
"JS_DEBUG"
)
&&
isSet
(
$parameters
[
"clear_plugins_cache"
]))
{
@
unlink
(
AJXP_PLUGINS_CACHE_FILE
);
@
unlink
(
AJXP_PLUGINS_REQUIRES_FILE
);
}
if
(
AJXP_SERVER_DEBUG
&&
isSet
(
$parameters
[
"extract_application_hooks"
])){
self
::
extractHooksToDoc
();
}
if
(
isSet
(
$parameters
[
"external_selector_type"
]))
{
$output
[
"SELECTOR_DATA"
]
=
array
(
"type"
=>
$parameters
[
"external_selector_type"
],
"data"
=>
$parameters
);
}
if
(
isSet
(
$parameters
[
"skipIOS"
]))
{
setcookie
(
"SKIP_IOS"
,
"true"
);
}
if
(
isSet
(
$parameters
[
"skipANDROID"
]))
{
setcookie
(
"SKIP_ANDROID"
,
"true"
);
}
if
(
isSet
(
$parameters
[
"gui"
]))
{
setcookie
(
"AJXP_GUI"
,
$parameters
[
"gui"
]);
if
(
$parameters
[
"gui"
]
==
"light"
)
$session
[
"USE_EXISTING_TOKEN_IF_EXISTS"
]
=
true
;
}
else
{
if
(
isSet
(
$session
[
"USE_EXISTING_TOKEN_IF_EXISTS"
]))
{
unset
(
$session
[
"USE_EXISTING_TOKEN_IF_EXISTS"
]);
}
setcookie
(
"AJXP_GUI"
,
null
);
}
}
/**
* Remove windows carriage return
* @static
* @param $fileContent
* @return mixed
*/
static
function
removeWinReturn
(
$fileContent
)
{
$fileContent
=
str_replace
(
chr
(
10
),
""
,
$fileContent
);
$fileContent
=
str_replace
(
chr
(
13
),
""
,
$fileContent
);
return
$fileContent
;
}
/**
* Get the filename extensions using ConfService::getRegisteredExtensions()
* @static
* @param string $fileName
* @param string $mode "image" or "text"
* @param bool $isDir
* @return string Returns the icon name ("image") or the mime label ("text")
*/
static
function
mimetype
(
$fileName
,
$mode
,
$isDir
)
{
$mess
=
ConfService
::
getMessages
();
$fileName
=
strtolower
(
$fileName
);
$EXTENSIONS
=
ConfService
::
getRegisteredExtensions
();
if
(
$isDir
)
{
$mime
=
$EXTENSIONS
[
"ajxp_folder"
];
}
else
{
foreach
(
$EXTENSIONS
as
$ext
)
{
if
(
preg_match
(
"/\.
$ext[0]
$/"
,
$fileName
))
{
$mime
=
$ext
;
break
;
}
}
}
if
(
!
isSet
(
$mime
))
{
$mime
=
$EXTENSIONS
[
"ajxp_empty"
];
}
if
(
is_numeric
(
$mime
[
2
])
||
array_key_exists
(
$mime
[
2
],
$mess
))
{
$mime
[
2
]
=
$mess
[
$mime
[
2
]];
}
return
((
$mode
==
"image"
?
$mime
[
1
]
:
$mime
[
2
]));
}
static
$registeredExtensions
;
static
function
mimeData
(
$fileName
,
$isDir
){
$fileName
=
strtolower
(
$fileName
);
if
(
self
::
$registeredExtensions
==
null
){
self
::
$registeredExtensions
=
ConfService
::
getRegisteredExtensions
();
}
if
(
$isDir
)
{
$mime
=
self
::
$registeredExtensions
[
"ajxp_folder"
];
}
else
{
$pos
=
strrpos
(
$fileName
,
"."
);
if
(
$pos
!==
false
){
$fileExt
=
substr
(
$fileName
,
$pos
+
1
);
if
(
!
empty
(
$fileExt
)
&&
array_key_exists
(
$fileExt
,
self
::
$registeredExtensions
)
&&
$fileExt
!=
"ajxp_folder"
&&
$fileExt
!=
"ajxp_empty"
){
$mime
=
self
::
$registeredExtensions
[
$fileExt
];
}
}
}
if
(
!
isSet
(
$mime
))
{
$mime
=
self
::
$registeredExtensions
[
"ajxp_empty"
];
}
return
array
(
$mime
[
2
],
$mime
[
1
]);
}
/**
* Gather a list of mime that must be treated specially. Used for dynamic replacement in XML mainly.
* @static
* @param string $keyword "editable", "image", "audio", "zip"
* @return string
*/
static
function
getAjxpMimes
(
$keyword
)
{
if
(
$keyword
==
"editable"
)
{
// Gather editors!
$pServ
=
AJXP_PluginsService
::
getInstance
();
$plugs
=
$pServ
->
getPluginsByType
(
"editor"
);
//$plugin = new AJXP_Plugin();
$mimes
=
array
();
foreach
(
$plugs
as
$plugin
)
{
$node
=
$plugin
->
getManifestRawContent
(
"/editor/@mimes"
,
"node"
);
$openable
=
$plugin
->
getManifestRawContent
(
"/editor/@openable"
,
"node"
);
if
(
$openable
->
item
(
0
)
&&
$openable
->
item
(
0
)
->
value
==
"true"
&&
$node
->
item
(
0
))
{
$mimestring
=
$node
->
item
(
0
)
->
value
;
$mimesplit
=
explode
(
","
,
$mimestring
);
foreach
(
$mimesplit
as
$value
)
{
$mimes
[
$value
]
=
$value
;
}
}
}
return
implode
(
","
,
array_values
(
$mimes
));
}
else
if
(
$keyword
==
"image"
)
{
return
"png,bmp,jpg,jpeg,gif"
;
}
else
if
(
$keyword
==
"audio"
)
{
return
"mp3"
;
}
else
if
(
$keyword
==
"zip"
)
{
if
(
ConfService
::
zipEnabled
())
{
return
"zip,ajxp_browsable_archive"
;
}
else
{
return
"none_allowed"
;
}
}
return
""
;
}
/**
* Whether a file is to be considered as an image or not
* @static
* @param $fileName
* @return bool
*/
static
function
is_image
(
$fileName
)
{
if
(
preg_match
(
"/\.png$|\.bmp$|\.jpg$|\.jpeg$|\.gif$/i"
,
$fileName
))
{
return
1
;
}
return
0
;
}
/**
* Whether a file is to be considered as an mp3... Should be DEPRECATED
* @static
* @param string $fileName
* @return bool
* @deprecated
*/
static
function
is_mp3
(
$fileName
)
{
if
(
preg_match
(
"/\.mp3$/i"
,
$fileName
))
return
1
;
return
0
;
}
/**
* Static image mime type headers
* @static
* @param $fileName
* @return string
*/
static
function
getImageMimeType
(
$fileName
)
{
if
(
preg_match
(
"/\.jpg$|\.jpeg$/i"
,
$fileName
))
{
return
"image/jpeg"
;
}
else
if
(
preg_match
(
"/\.png$/i"
,
$fileName
))
{
return
"image/png"
;
}
else
if
(
preg_match
(
"/\.bmp$/i"
,
$fileName
))
{
return
"image/bmp"
;
}
else
if
(
preg_match
(
"/\.gif$/i"
,
$fileName
))
{
return
"image/gif"
;
}
}
/**
* Headers to send when streaming
* @static
* @param $fileName
* @return bool|string
*/
static
function
getStreamingMimeType
(
$fileName
)
{
if
(
preg_match
(
"/\.mp3$/i"
,
$fileName
))
{
return
"audio/mp3"
;
}
else
if
(
preg_match
(
"/\.wav$/i"
,
$fileName
))
{
return
"audio/wav"
;
}
else
if
(
preg_match
(
"/\.aac$/i"
,
$fileName
))
{
return
"audio/aac"
;
}
else
if
(
preg_match
(
"/\.m4a$/i"
,
$fileName
))
{
return
"audio/m4a"
;
}
else
if
(
preg_match
(
"/\.aiff$/i"
,
$fileName
))
{
return
"audio/aiff"
;
}
else
if
(
preg_match
(
"/\.mp4$/i"
,
$fileName
))
{
return
"video/mp4"
;
}
else
if
(
preg_match
(
"/\.mov$/i"
,
$fileName
))
{
return
"video/quicktime"
;
}
else
if
(
preg_match
(
"/\.m4v$/i"
,
$fileName
))
{
return
"video/x-m4v"
;
}
else
if
(
preg_match
(
"/\.3gp$/i"
,
$fileName
))
{
return
"video/3gpp"
;
}
else
if
(
preg_match
(
"/\.3g2$/i"
,
$fileName
))
{
return
"video/3gpp2"
;
}
else
return
false
;
}
static
$sizeUnit
;
/**
* Display a human readable string for a bytesize (1MB, 2,3Go, etc)
* @static
* @param $filesize
* @param bool $phpConfig
* @return string
*/
static
function
roundSize
(
$filesize
,
$phpConfig
=
false
)
{
if
(
self
::
$sizeUnit
==
null
){
$mess
=
ConfService
::
getMessages
();
self
::
$sizeUnit
=
$mess
[
"byte_unit_symbol"
];
}
if
(
$filesize
<
0
)
{
$filesize
=
sprintf
(
"%u"
,
$filesize
);
}
if
(
$filesize
>=
1073741824
)
{
$filesize
=
round
(
$filesize
/
1073741824
*
100
)
/
100
.
(
$phpConfig
?
"G"
:
" G"
.
self
::
$sizeUnit
);
}
elseif
(
$filesize
>=
1048576
)
{
$filesize
=
round
(
$filesize
/
1048576
*
100
)
/
100
.
(
$phpConfig
?
"M"
:
" M"
.
self
::
$sizeUnit
);
}
elseif
(
$filesize
>=
1024
)
{
$filesize
=
round
(
$filesize
/
1024
*
100
)
/
100
.
(
$phpConfig
?
"K"
:
" K"
.
self
::
$sizeUnit
);
}
else
{
$filesize
=
$filesize
.
" "
.
self
::
$sizeUnit
;
}
if
(
$filesize
==
0
)
{
$filesize
=
"-"
;
}
return
$filesize
;
}
/**
* Hidden files start with dot
* @static
* @param string $fileName
* @return bool
*/
static
function
isHidden
(
$fileName
)
{
return
(
substr
(
$fileName
,
0
,
1
)
==
"."
);
}
/**
* Whether a file is a browsable archive
* @static
* @param string $fileName
* @return int
*/
static
function
isBrowsableArchive
(
$fileName
)
{
return
preg_match
(
"/\.zip$/i"
,
$fileName
);
}
/**
* Convert a shorthand byte value from a PHP configuration directive to an integer value
* @param string $value
* @return int
*/
static
function
convertBytes
(
$value
)
{
if
(
is_numeric
(
$value
))
{
return
intval
(
$value
);
}
else
{
$value_length
=
strlen
(
$value
);
$qty
=
substr
(
$value
,
0
,
$value_length
-
1
);
$unit
=
strtolower
(
substr
(
$value
,
$value_length
-
1
));
switch
(
$unit
)
{
case
'k'
:
$qty
*=
1024
;
break
;
case
'm'
:
$qty
*=
1048576
;
break
;
case
'g'
:
$qty
*=
1073741824
;
break
;
}
return
$qty
;
}
}
//Relative Date Function
public
static
function
relativeDate
(
$time
,
$messages
)
{
$today
=
strtotime
(
date
(
'M j, Y'
));
$reldays
=
(
$time
-
$today
)
/
86400
;
$relTime
=
date
(
$messages
[
'date_relative_time_format'
],
$time
);
if
(
$reldays
>=
0
&&
$reldays
<
1
)
{
return
str_replace
(
"TIME"
,
$relTime
,
$messages
[
'date_relative_today'
]);
}
else
if
(
$reldays
>=
1
&&
$reldays
<
2
)
{
return
str_replace
(
"TIME"
,
$relTime
,
$messages
[
'date_relative_tomorrow'
]);
}
else
if
(
$reldays
>=
-
1
&&
$reldays
<
0
)
{
return
str_replace
(
"TIME"
,
$relTime
,
$messages
[
'date_relative_yesterday'
]);
}
if
(
abs
(
$reldays
)
<
7
)
{
if
(
$reldays
>
0
)
{
$reldays
=
floor
(
$reldays
);
return
str_replace
(
"%s"
,
$reldays
,
$messages
[
'date_relative_days_ahead'
]);
//return 'In ' . $reldays . ' day' . ($reldays != 1 ? 's' : '');
}
else
{
$reldays
=
abs
(
floor
(
$reldays
));
return
str_replace
(
"%s"
,
$reldays
,
$messages
[
'date_relative_days_ago'
]);
//return $reldays . ' day' . ($reldays != 1 ? 's' : '') . ' ago';
}
}
return
str_replace
(
"DATE"
,
date
(
$messages
[
"date_relative_date_format"
],
$time
?
$time
:
time
()),
$messages
[
"date_relative_date"
]);
}
/**
* Replace specific chars by their XML Entities, for use inside attributes value
* @static
* @param $string
* @param bool $toUtf8
* @return mixed|string
*/
static
function
xmlEntities
(
$string
,
$toUtf8
=
false
)
{
$xmlSafe
=
str_replace
(
array
(
"&"
,
"<"
,
">"
,
"
\"
"
,
"
\n
"
,
"
\r
"
),
array
(
"&"
,
"<"
,
">"
,
"""
,
" "
,
" "
),
$string
);
if
(
$toUtf8
&&
SystemTextEncoding
::
getEncoding
()
!=
"UTF-8"
)
{
return
SystemTextEncoding
::
toUTF8
(
$xmlSafe
);
}
else
{
return
$xmlSafe
;
}
}
/**
* Replace specific chars by their XML Entities, for use inside attributes value
* @static
* @param $string
* @param bool $toUtf8
* @return mixed|string
*/
static
function
xmlContentEntities
(
$string
,
$toUtf8
=
false
)
{
$xmlSafe
=
str_replace
(
array
(
"&"
,
"<"
,
">"
,
"
\"
"
),
array
(
"&"
,
"<"
,
">"
,
"""
),
$string
);
if
(
$toUtf8
)
{
return
SystemTextEncoding
::
toUTF8
(
$xmlSafe
);
}
else
{
return
$xmlSafe
;
}
}
/**
* Search include path for a given file
* @static
* @param string $file
* @return bool
*/
static
public
function
searchIncludePath
(
$file
)
{
$ps
=
explode
(
PATH_SEPARATOR
,
ini_get
(
'include_path'
));
foreach
(
$ps
as
$path
)
{
if
(
@
file_exists
(
$path
.
DIRECTORY_SEPARATOR
.
$file
))
return
true
;
}
if
(
@
file_exists
(
$file
))
return
true
;
return
false
;
}
/**
* @static
* @param $from
* @param $to
* @return string
*/
static
public
function
getTravelPath
(
$from
,
$to
)
{
$from
=
explode
(
'/'
,
$from
);
$to
=
explode
(
'/'
,
$to
);
$relPath
=
$to
;
foreach
(
$from
as
$depth
=>
$dir
)
{
// find first non-matching dir
if
(
$dir
===
$to
[
$depth
])
{
// ignore this directory
array_shift
(
$relPath
);
}
else
{
// get number of remaining dirs to $from
$remaining
=
count
(
$from
)
-
$depth
;
if
(
$remaining
>
1
)
{
// add traversals up to first matching dir
$padLength
=
(
count
(
$relPath
)
+
$remaining
-
1
)
*
-
1
;
$relPath
=
array_pad
(
$relPath
,
$padLength
,
'..'
);
break
;
}
else
{
$relPath
[
0
]
=
'./'
.
$relPath
[
0
];
}
}
}
return
implode
(
'/'
,
$relPath
);
}
/**
* Build the current server URL
* @param bool $withURI
* @internal param bool $witchURI
* @static
* @return string
*/
static
function
detectServerURL
(
$withURI
=
false
)
{
$setUrl
=
ConfService
::
getCoreConf
(
"SERVER_URL"
);
if
(
!
empty
(
$setUrl
)){
return
$setUrl
;
}
if
(
php_sapi_name
()
==
"cli"
){
AJXP_Logger
::
debug
(
"WARNING, THE SERVER_URL IS NOT SET, WE CANNOT BUILD THE MAIL ADRESS WHEN WORKING IN CLI"
);
}
$protocol
=
(
isset
(
$_SERVER
[
'HTTPS'
])
&&
$_SERVER
[
'HTTPS'
]
!==
'off'
?
'https'
:
'http'
);
$port
=
((
$protocol
===
'http'
&&
$_SERVER
[
'SERVER_PORT'
]
==
80
||
$protocol
===
'https'
&&
$_SERVER
[
'SERVER_PORT'
]
==
443
)
?
""
:
":"
.
$_SERVER
[
'SERVER_PORT'
]);
$name
=
$_SERVER
[
"SERVER_NAME"
];
// removed $port after $name because it interfered with apache frontend
if
(
!
$withURI
){
return
"
$protocol
://
$name
"
;
}
else
{
return
"
$protocol
://
$name
"
.
dirname
(
$_SERVER
[
"REQUEST_URI"
]);
}
}
/**
* Modifies a string to remove all non ASCII characters and spaces.
* @param string $text
* @return string
*/
static
public
function
slugify
(
$text
)
{
if
(
empty
(
$text
))
return
""
;
// replace non letter or digits by -
$text
=
preg_replace
(
'~[^\\pL\d]+~u'
,
'-'
,
$text
);
// trim
$text
=
trim
(
$text
,
'-'
);
// transliterate
if
(
function_exists
(
'iconv'
))
{
$text
=
iconv
(
'utf-8'
,
'us-ascii//TRANSLIT'
,
$text
);
}
// lowercase
$text
=
strtolower
(
$text
);
// remove unwanted characters
$text
=
preg_replace
(
'~[^-\w]+~'
,
''
,
$text
);
if
(
empty
(
$text
))
{
return
'n-a'
;
}
return
$text
;
}
static
function
getHooksFile
(){
return
AJXP_INSTALL_PATH
.
"/"
.
AJXP_DOCS_FOLDER
.
"/hooks.json"
;
}
static
function
extractHooksToDoc
(){
$docFile
=
self
::
getHooksFile
();
if
(
is_file
(
$docFile
)){
copy
(
$docFile
,
$docFile
.
".bak"
);
$existingHooks
=
json_decode
(
file_get_contents
(
$docFile
),
true
);
}
else
{
$existingHooks
=
array
();
}
$allPhpFiles
=
glob_recursive
(
AJXP_INSTALL_PATH
.
"/*.php"
);
$hooks
=
array
();
foreach
(
$allPhpFiles
as
$phpFile
){
$fileContent
=
file
(
$phpFile
);
foreach
(
$fileContent
as
$lineNumber
=>
$line
){
if
(
preg_match_all
(
'/AJXP_Controller::applyHook\("([^"]+)", (.*)\)/'
,
$line
,
$matches
)){
$names
=
$matches
[
1
];
$params
=
$matches
[
2
];
foreach
(
$names
as
$index
=>
$hookName
){
if
(
!
isSet
(
$hooks
[
$hookName
]))
$hooks
[
$hookName
]
=
array
(
"TRIGGERS"
=>
array
(),
"LISTENERS"
=>
array
());
$hooks
[
$hookName
][
"TRIGGERS"
][]
=
array
(
"FILE"
=>
substr
(
$phpFile
,
strlen
(
AJXP_INSTALL_PATH
)),
"LINE"
=>
$lineNumber
);
$hooks
[
$hookName
][
"PARAMETER_SAMPLE"
]
=
$params
[
$index
];
}
}
}
}
$registryHooks
=
AJXP_PluginsService
::
getInstance
()
->
searchAllManifests
(
"//hooks/serverCallback"
,
"xml"
,
false
,
false
,
true
);
$regHooks
=
array
();
foreach
(
$registryHooks
as
$xmlHook
){
$name
=
$xmlHook
->
getAttribute
(
"hookName"
);
$method
=
$xmlHook
->
getAttribute
(
"methodName"
);
$pluginId
=
$xmlHook
->
getAttribute
(
"pluginId"
);
if
(
$pluginId
==
""
)
$pluginId
=
$xmlHook
->
parentNode
->
parentNode
->
parentNode
->
getAttribute
(
"id"
);
if
(
!
isSet
(
$regHooks
[
$name
]))
$regHooks
[
$name
]
=
array
();
$regHooks
[
$name
][]
=
array
(
"PLUGIN_ID"
=>
$pluginId
,
"METHOD"
=>
$method
);
}
foreach
(
$hooks
as
$h
=>
$data
)
{
if
(
isSet
(
$regHooks
[
$h
])){
$data
[
"LISTENERS"
]
=
$regHooks
[
$h
];
}
if
(
isSet
(
$existingHooks
[
$h
])){
$existingHooks
[
$h
][
"TRIGGERS"
]
=
$data
[
"TRIGGERS"
];
$existingHooks
[
$h
][
"LISTENERS"
]
=
$data
[
"LISTENERS"
];
$existingHooks
[
$h
][
"PARAMETER_SAMPLE"
]
=
$data
[
"PARAMETER_SAMPLE"
];
}
else
{
$existingHooks
[
$h
]
=
$data
;
}
}
file_put_contents
(
$docFile
,
self
::
prettyPrintJSON
(
json_encode
(
$existingHooks
)));
}
/**
* Indents a flat JSON string to make it more human-readable.
*
* @param string $json The original JSON string to process.
*
* @return string Indented version of the original JSON string.
*/
function
prettyPrintJSON
(
$json
)
{
$result
=
''
;
$pos
=
0
;
$strLen
=
strlen
(
$json
);
$indentStr
=
' '
;
$newLine
=
"
\n
"
;
$prevChar
=
''
;
$outOfQuotes
=
true
;
for
(
$i
=
0
;
$i
<=
$strLen
;
$i
++
)
{
// Grab the next character in the string.
$char
=
substr
(
$json
,
$i
,
1
);
// Are we inside a quoted string?
if
(
$char
==
'"'
&&
$prevChar
!=
'\\'
)
{
$outOfQuotes
=
!
$outOfQuotes
;
// If this character is the end of an element,
// output a new line and indent the next line.
}
else
if
((
$char
==
'}'
||
$char
==
']'
)
&&
$outOfQuotes
)
{
$result
.=
$newLine
;
$pos
--
;
for
(
$j
=
0
;
$j
<
$pos
;
$j
++
)
{
$result
.=
$indentStr
;
}
}
// Add the character to the result string.
$result
.=
$char
;
// If the last character was the beginning of an element,
// output a new line and indent the next line.
if
((
$char
==
','
||
$char
==
'{'
||
$char
==
'['
)
&&
$outOfQuotes
)
{
$result
.=
$newLine
;
if
(
$char
==
'{'
||
$char
==
'['
)
{
$pos
++
;
}
for
(
$j
=
0
;
$j
<
$pos
;
$j
++
)
{
$result
.=
$indentStr
;
}
}
$prevChar
=
$char
;
}
return
$result
;
}
/**
* i18n utilitary for extracting the CONF_MESSAGE[] strings out of the XML files
* @static
* @return void
*/
static
function
extractConfStringsFromManifests
()
{
$plugins
=
AJXP_PluginsService
::
getInstance
()
->
getDetectedPlugins
();
$plug
=
new
AJXP_Plugin
(
""
,
""
);
foreach
(
$plugins
as
$pType
=>
$plugs
)
{
foreach
(
$plugs
as
$plug
)
{
$lib
=
$plug
->
getManifestRawContent
(
"//i18n"
,
"nodes"
);
if
(
!
$lib
->
length
)
continue
;
$library
=
$lib
->
item
(
0
);
$namespace
=
$library
->
getAttribute
(
"namespace"
);
$path
=
$library
->
getAttribute
(
"path"
);
$xml
=
$plug
->
getManifestRawContent
();
// for core, also load mixins
$refFile
=
AJXP_INSTALL_PATH
.
"/"
.
$path
.
"/conf/en.php"
;
$reference
=
array
();
if
(
preg_match_all
(
"/CONF_MESSAGE(\[.*?\])/"
,
$xml
,
$matches
,
PREG_SET_ORDER
))
{
foreach
(
$matches
as
$match
)
{
$match
[
1
]
=
str_replace
(
array
(
"["
,
"]"
),
""
,
$match
[
1
]);
$reference
[
$match
[
1
]]
=
$match
[
1
];
}
}
if
(
$namespace
==
""
)
{
$mixXml
=
file_get_contents
(
AJXP_INSTALL_PATH
.
"/"
.
AJXP_PLUGINS_FOLDER
.
"/core.ajaxplorer/ajxp_mixins.xml"
);
if
(
preg_match_all
(
"/MIXIN_MESSAGE(\[.*?\])/"
,
$mixXml
,
$matches
,
PREG_SET_ORDER
))
{
foreach
(
$matches
as
$match
)
{
$match
[
1
]
=
str_replace
(
array
(
"["
,
"]"
),
""
,
$match
[
1
]);
$reference
[
$match
[
1
]]
=
$match
[
1
];
}
}
}
if
(
count
(
$reference
))
{
self
::
updateI18nFromRef
(
$refFile
,
$reference
);
}
}
}
}
/**
* Browse the i18n libraries and update the languages with the strings missing
* @static
* @param string $createLanguage
* @return void
*/
static
function
updateAllI18nLibraries
(
$createLanguage
=
""
)
{
// UPDATE EN => OTHER LANGUAGES
$nodes
=
AJXP_PluginsService
::
getInstance
()
->
searchAllManifests
(
"//i18n"
,
"nodes"
);
foreach
(
$nodes
as
$node
)
{
$nameSpace
=
$node
->
getAttribute
(
"namespace"
);
$path
=
AJXP_INSTALL_PATH
.
"/"
.
$node
->
getAttribute
(
"path"
);
if
(
$nameSpace
==
""
)
{
self
::
updateI18nFiles
(
$path
,
false
,
$createLanguage
);
self
::
updateI18nFiles
(
$path
.
"/conf"
,
true
,
$createLanguage
);
}
else
{
self
::
updateI18nFiles
(
$path
,
true
,
$createLanguage
);
self
::
updateI18nFiles
(
$path
.
"/conf"
,
true
,
$createLanguage
);
}
}
}
/**
* Patch the languages files of an i18n library with the references strings from the "en" file.
* @static
* @param $baseDir
* @param bool $detectLanguages
* @param string $createLanguage
* @return
*/
static
function
updateI18nFiles
(
$baseDir
,
$detectLanguages
=
true
,
$createLanguage
=
""
)
{
if
(
!
is_dir
(
$baseDir
)
||
!
is_file
(
$baseDir
.
"/en.php"
))
return
;
if
(
$createLanguage
!=
""
&&
!
is_file
(
$baseDir
.
"/
$createLanguage
.php"
))
{
@
copy
(
AJXP_INSTALL_PATH
.
"/plugins/core.ajaxplorer/i18n-template.php"
,
$baseDir
.
"/
$createLanguage
.php"
);
}
if
(
!
$detectLanguages
)
{
$languages
=
ConfService
::
listAvailableLanguages
();
$filenames
=
array
();
foreach
(
$languages
as
$key
=>
$value
)
{
$filenames
[]
=
$baseDir
.
"/"
.
$key
.
".php"
;
}
}
else
{
$filenames
=
glob
(
$baseDir
.
"/*.php"
);
}
include
(
$baseDir
.
"/en.php"
);
$reference
=
$mess
;
foreach
(
$filenames
as
$filename
)
{
self
::
updateI18nFromRef
(
$filename
,
$reference
);
}
}
/**
* i18n Utilitary
* @static
* @param $filename
* @param $reference
* @return
*/
static
function
updateI18nFromRef
(
$filename
,
$reference
)
{
if
(
!
is_file
(
$filename
))
return
;
include
(
$filename
);
$missing
=
array
();
foreach
(
$reference
as
$messKey
=>
$message
)
{
if
(
!
array_key_exists
(
$messKey
,
$mess
))
{
$missing
[]
=
"
\"
$messKey
\"
=>
\"
$message
\"
,"
;
}
}
//print_r($missing);
if
(
count
(
$missing
))
{
$header
=
array
();
$currentMessages
=
array
();
$footer
=
array
();
$fileLines
=
file
(
$filename
);
$insideArray
=
false
;
foreach
(
$fileLines
as
$line
)
{
if
(
strstr
(
$line
,
"
\"
"
)
!==
false
)
{
$currentMessages
[]
=
trim
(
$line
);
$insideArray
=
true
;
}
else
{
if
(
!
$insideArray
&&
strstr
(
$line
,
");"
)
!==
false
)
$insideArray
=
true
;
if
(
!
$insideArray
)
{
$header
[]
=
trim
(
$line
);
}
else
{
$footer
[]
=
trim
(
$line
);
}
}
}
$currentMessages
=
array_merge
(
$header
,
$currentMessages
,
$missing
,
$footer
);
file_put_contents
(
$filename
,
join
(
"
\n
"
,
$currentMessages
));
}
}
/**
* Generate an HTML table for the tests results. We should use a template somewhere...
* @static
* @param $outputArray
* @param $testedParams
* @param bool $showSkipLink
* @return string
*/
static
function
testResultsToTable
(
$outputArray
,
$testedParams
,
$showSkipLink
=
true
)
{
$dumpRows
=
""
;
$passedRows
=
array
();
$warnRows
=
""
;
$errRows
=
""
;
$errs
=
$warns
=
0
;
$ALL_ROWS
=
array
(
"error"
=>
array
(),
"warning"
=>
array
(),
"dump"
=>
array
(),
"passed"
=>
array
(),
);
$TITLES
=
array
(
"error"
=>
"Failed Tests"
,
"warning"
=>
"Warnings"
,
"dump"
=>
"Server Information"
,
"passed"
=>
"Other tests passed"
,
);
foreach
(
$outputArray
as
$item
)
{
// A test is output only if it hasn't succeeded (doText returned FALSE)
$result
=
$item
[
"result"
]
?
"passed"
:
(
$item
[
"level"
]
==
"info"
?
"dump"
:
(
$item
[
"level"
]
==
"warning"
?
"warning"
:
"error"
));
$success
=
$result
==
"passed"
;
if
(
$result
==
"dump"
)
$result
=
"passed"
;
$ALL_ROWS
[
$result
][
$item
[
"name"
]]
=
$item
[
"info"
];
}
include
(
AJXP_INSTALL_PATH
.
"/core/tests/startup.phtml"
);
}
/**
* @static
* @param $outputArray
* @param $testedParams
* @return bool
*/
static
function
runTests
(
&
$outputArray
,
&
$testedParams
)
{
// At first, list folder in the tests subfolder
chdir
(
AJXP_TESTS_FOLDER
);
$files
=
glob
(
'*.php'
);
$outputArray
=
array
();
$testedParams
=
array
();
$passed
=
true
;
foreach
(
$files
as
$file
)
{
require_once
(
$file
);
// Then create the test class
$testName
=
str_replace
(
".php"
,
""
,
substr
(
$file
,
5
));
if
(
!
class_exists
(
$testName
))
continue
;
$class
=
new
$testName
();
$result
=
$class
->
doTest
();
if
(
!
$result
&&
$class
->
failedLevel
!=
"info"
)
$passed
=
false
;
$outputArray
[]
=
array
(
"name"
=>
$class
->
name
,
"result"
=>
$result
,
"level"
=>
$class
->
failedLevel
,
"info"
=>
$class
->
failedInfo
);
if
(
count
(
$class
->
testedParams
))
{
$testedParams
=
array_merge
(
$testedParams
,
$class
->
testedParams
);
}
}
// PREPARE REPOSITORY LISTS
$repoList
=
array
();
require_once
(
"../classes/class.ConfService.php"
);
require_once
(
"../classes/class.Repository.php"
);
include
(
AJXP_CONF_PATH
.
"/bootstrap_repositories.php"
);
foreach
(
$REPOSITORIES
as
$index
=>
$repo
)
{
$repoList
[]
=
ConfService
::
createRepositoryFromArray
(
$index
,
$repo
);
}
// Try with the serialized repositories
if
(
is_file
(
AJXP_DATA_PATH
.
"/plugins/conf.serial/repo.ser"
))
{
$fileLines
=
file
(
AJXP_DATA_PATH
.
"/plugins/conf.serial/repo.ser"
);
$repos
=
unserialize
(
$fileLines
[
0
]);
$repoList
=
array_merge
(
$repoList
,
$repos
);
}
// NOW TRY THE PLUGIN TESTS
chdir
(
AJXP_INSTALL_PATH
.
"/"
.
AJXP_PLUGINS_FOLDER
);
$files
=
glob
(
'access.*/test.*.php'
);
foreach
(
$files
as
$file
)
{
require_once
(
$file
);
// Then create the test class
list
(
$accessFolder
,
$testFileName
)
=
explode
(
"/"
,
$file
);
$testName
=
str_replace
(
".php"
,
""
,
substr
(
$testFileName
,
5
)
.
"Test"
);
$class
=
new
$testName
();
foreach
(
$repoList
as
$repository
)
{
if
(
$repository
->
isTemplate
||
$repository
->
getParentId
()
!=
null
)
continue
;
$result
=
$class
->
doRepositoryTest
(
$repository
);
if
(
$result
===
false
||
$result
===
true
)
{
if
(
!
$result
&&
$class
->
failedLevel
!=
"info"
)
{
$passed
=
false
;
}
$outputArray
[]
=
array
(
"name"
=>
$class
->
name
.
"
\n
Testing repository : "
.
$repository
->
getDisplay
(),
"result"
=>
$result
,
"level"
=>
$class
->
failedLevel
,
"info"
=>
$class
->
failedInfo
);
if
(
count
(
$class
->
testedParams
))
{
$testedParams
=
array_merge
(
$testedParams
,
$class
->
testedParams
);
}
}
}
}
return
$passed
;
}
/**
* @static
* @param $outputArray
* @param $testedParams
* @return void
*/
static
function
testResultsToFile
(
$outputArray
,
$testedParams
)
{
ob_start
();
echo
'$diagResults = '
;
var_export
(
$testedParams
);
echo
';'
;
echo
'$outputArray = '
;
var_export
(
$outputArray
);
echo
';'
;
$content
=
'<?php '
.
ob_get_contents
()
.
' ?>'
;
ob_end_clean
();
//print_r($content);
file_put_contents
(
TESTS_RESULT_FILE
,
$content
);
}
static
function
isStream
(
$path
){
$wrappers
=
stream_get_wrappers
();
$wrappers_re
=
'('
.
join
(
'|'
,
$wrappers
)
.
')'
;
return
preg_match
(
"!^
$wrappers_re
://!"
,
$path
)
===
1
;
}
/**
* Load an array stored serialized inside a file.
*
* @param String $filePath Full path to the file
* @param Boolean $skipCheck do not test for file existence before opening
* @return Array
*/
static
function
loadSerialFile
(
$filePath
,
$skipCheck
=
false
,
$format
=
"ser"
)
{
$filePath
=
AJXP_VarsFilter
::
filter
(
$filePath
);
$result
=
array
();
if
(
$skipCheck
){
$fileLines
=
@
file
(
$filePath
);
if
(
$fileLines
!==
false
)
{
if
(
$format
==
"ser"
)
$result
=
unserialize
(
implode
(
""
,
$fileLines
));
else
if
(
$format
==
"json"
)
$result
=
json_decode
(
implode
(
""
,
$fileLines
),
true
);
}
return
$result
;
}
if
(
is_file
(
$filePath
))
{
$fileLines
=
file
(
$filePath
);
if
(
$format
==
"ser"
)
$result
=
unserialize
(
implode
(
""
,
$fileLines
));
else
if
(
$format
==
"json"
)
$result
=
json_decode
(
implode
(
""
,
$fileLines
),
true
);
}
return
$result
;
}
/**
* Stores an Array as a serialized string inside a file.
*
* @param String $filePath Full path to the file
* @param Array|Object $value The value to store
* @param Boolean $createDir Whether to create the parent folder or not, if it does not exist.
* @param bool $silent Silently write the file, are throw an exception on problem.
* @param string $format
* @throws Exception
*/
static
function
saveSerialFile
(
$filePath
,
$value
,
$createDir
=
true
,
$silent
=
false
,
$format
=
"ser"
,
$jsonPrettyPrint
=
false
)
{
$filePath
=
AJXP_VarsFilter
::
filter
(
$filePath
);
if
(
$createDir
&&
!
is_dir
(
dirname
(
$filePath
))){
@
mkdir
(
dirname
(
$filePath
),
0755
,
true
);
if
(
!
is_dir
(
dirname
(
$filePath
))){
// Creation failed
if
(
$silent
)
return
;
else
throw
new
Exception
(
"[AJXP_Utils::saveSerialFile] Cannot write into "
.
dirname
(
dirname
(
$filePath
)));
}
}
try
{
$fp
=
fopen
(
$filePath
,
"w"
);
if
(
$format
==
"ser"
)
$content
=
serialize
(
$value
);
else
if
(
$format
==
"json"
)
{
$content
=
json_encode
(
$value
);
if
(
$jsonPrettyPrint
)
$content
=
self
::
prettyPrintJSON
(
$content
);
}
fwrite
(
$fp
,
$content
);
fclose
(
$fp
);
}
catch
(
Exception
$e
)
{
if
(
$silent
)
return
;
else
throw
$e
;
}
}
/**
* Detect mobile browsers
* @static
* @return bool
*/
public
static
function
userAgentIsMobile
()
{
$isMobile
=
false
;
$op
=
strtolower
(
$_SERVER
[
'HTTP_X_OPERAMINI_PHONE'
]
OR
""
);
$ua
=
strtolower
(
$_SERVER
[
'HTTP_USER_AGENT'
]);
$ac
=
strtolower
(
$_SERVER
[
'HTTP_ACCEPT'
]);
$isMobile
=
strpos
(
$ac
,
'application/vnd.wap.xhtml+xml'
)
!==
false
||
$op
!=
''
||
strpos
(
$ua
,
'sony'
)
!==
false
||
strpos
(
$ua
,
'symbian'
)
!==
false
||
strpos
(
$ua
,
'nokia'
)
!==
false
||
strpos
(
$ua
,
'samsung'
)
!==
false
||
strpos
(
$ua
,
'mobile'
)
!==
false
||
strpos
(
$ua
,
'android'
)
!==
false
||
strpos
(
$ua
,
'windows ce'
)
!==
false
||
strpos
(
$ua
,
'epoc'
)
!==
false
||
strpos
(
$ua
,
'opera mini'
)
!==
false
||
strpos
(
$ua
,
'nitro'
)
!==
false
||
strpos
(
$ua
,
'j2me'
)
!==
false
||
strpos
(
$ua
,
'midp-'
)
!==
false
||
strpos
(
$ua
,
'cldc-'
)
!==
false
||
strpos
(
$ua
,
'netfront'
)
!==
false
||
strpos
(
$ua
,
'mot'
)
!==
false
||
strpos
(
$ua
,
'up.browser'
)
!==
false
||
strpos
(
$ua
,
'up.link'
)
!==
false
||
strpos
(
$ua
,
'audiovox'
)
!==
false
||
strpos
(
$ua
,
'blackberry'
)
!==
false
||
strpos
(
$ua
,
'ericsson,'
)
!==
false
||
strpos
(
$ua
,
'panasonic'
)
!==
false
||
strpos
(
$ua
,
'philips'
)
!==
false
||
strpos
(
$ua
,
'sanyo'
)
!==
false
||
strpos
(
$ua
,
'sharp'
)
!==
false
||
strpos
(
$ua
,
'sie-'
)
!==
false
||
strpos
(
$ua
,
'portalmmm'
)
!==
false
||
strpos
(
$ua
,
'blazer'
)
!==
false
||
strpos
(
$ua
,
'avantgo'
)
!==
false
||
strpos
(
$ua
,
'danger'
)
!==
false
||
strpos
(
$ua
,
'palm'
)
!==
false
||
strpos
(
$ua
,
'series60'
)
!==
false
||
strpos
(
$ua
,
'palmsource'
)
!==
false
||
strpos
(
$ua
,
'pocketpc'
)
!==
false
||
strpos
(
$ua
,
'smartphone'
)
!==
false
||
strpos
(
$ua
,
'rover'
)
!==
false
||
strpos
(
$ua
,
'ipaq'
)
!==
false
||
strpos
(
$ua
,
'au-mic,'
)
!==
false
||
strpos
(
$ua
,
'alcatel'
)
!==
false
||
strpos
(
$ua
,
'ericy'
)
!==
false
||
strpos
(
$ua
,
'up.link'
)
!==
false
||
strpos
(
$ua
,
'vodafone/'
)
!==
false
||
strpos
(
$ua
,
'wap1.'
)
!==
false
||
strpos
(
$ua
,
'wap2.'
)
!==
false
;
/*
$isBot = false;
$ip = $_SERVER['REMOTE_ADDR'];
$isBot = $ip == '66.249.65.39'
|| strpos($ua, 'googlebot') !== false
|| strpos($ua, 'mediapartners') !== false
|| strpos($ua, 'yahooysmcm') !== false
|| strpos($ua, 'baiduspider') !== false
|| strpos($ua, 'msnbot') !== false
|| strpos($ua, 'slurp') !== false
|| strpos($ua, 'ask') !== false
|| strpos($ua, 'teoma') !== false
|| strpos($ua, 'spider') !== false
|| strpos($ua, 'heritrix') !== false
|| strpos($ua, 'attentio') !== false
|| strpos($ua, 'twiceler') !== false
|| strpos($ua, 'irlbot') !== false
|| strpos($ua, 'fast crawler') !== false
|| strpos($ua, 'fastmobilecrawl') !== false
|| strpos($ua, 'jumpbot') !== false
|| strpos($ua, 'googlebot-mobile') !== false
|| strpos($ua, 'yahooseeker') !== false
|| strpos($ua, 'motionbot') !== false
|| strpos($ua, 'mediobot') !== false
|| strpos($ua, 'chtml generic') !== false
|| strpos($ua, 'nokia6230i/. fast crawler') !== false;
*/
return
$isMobile
;
}
/**
* Detect iOS browser
* @static
* @return bool
*/
public
static
function
userAgentIsIOS
()
{
if
(
stripos
(
$_SERVER
[
"HTTP_USER_AGENT"
],
"iphone"
)
!==
false
)
return
true
;
if
(
stripos
(
$_SERVER
[
"HTTP_USER_AGENT"
],
"ipad"
)
!==
false
)
return
true
;
if
(
stripos
(
$_SERVER
[
"HTTP_USER_AGENT"
],
"ipod"
)
!==
false
)
return
true
;
return
false
;
}
/**
* Detect Android UA
* @static
* @return bool
*/
public
static
function
userAgentIsAndroid
()
{
return
(
stripos
(
$_SERVER
[
"HTTP_USER_AGENT"
],
"android"
)
!==
false
);
}
/**
* Try to remove a file without errors
* @static
* @param $file
* @return void
*/
public
static
function
silentUnlink
(
$file
)
{
@
unlink
(
$file
);
}
/**
* Try to set an ini config, without errors
* @static
* @param string $paramName
* @param string $paramValue
* @return void
*/
public
static
function
safeIniSet
(
$paramName
,
$paramValue
)
{
$current
=
ini_get
(
$paramName
);
if
(
$current
==
$paramValue
)
return
;
@
ini_set
(
$paramName
,
$paramValue
);
}
/**
* @static
* @param string $url
* @return bool|mixed|string
*/
public
static
function
getRemoteContent
(
$url
){
if
(
ini_get
(
"allow_url_fopen"
)){
return
file_get_contents
(
$url
);
}
else
if
(
function_exists
(
"curl_init"
)){
$ch
=
curl_init
();
$timeout
=
30
;
// set to zero for no timeout
curl_setopt
(
$ch
,
CURLOPT_URL
,
$url
);
curl_setopt
(
$ch
,
CURLOPT_RETURNTRANSFER
,
1
);
curl_setopt
(
$ch
,
CURLOPT_CONNECTTIMEOUT
,
$timeout
);
$return
=
curl_exec
(
$ch
);
curl_close
(
$ch
);
return
$return
;
}
else
{
$i
=
parse_url
(
$url
);
$httpClient
=
new
HttpClient
(
$i
[
"host"
]);
$httpClient
->
timeout
=
30
;
return
$httpClient
->
quickGet
(
$url
);
}
}
public
static
function
parseStandardFormParameters
(
&
$repDef
,
&
$options
,
$userId
=
null
,
$prefix
=
"DRIVER_OPTION_"
,
$binariesContext
=
null
){
if
(
$binariesContext
===
null
){
$binariesContext
=
array
(
"USER"
=>
(
AuthService
::
getLoggedUser
()
!=
null
)
?
AuthService
::
getLoggedUser
()
->
getId
()
:
"shared"
);
}
$replicationGroups
=
array
();
$switchesGroups
=
array
();
foreach
(
$repDef
as
$key
=>
$value
)
{
$value
=
SystemTextEncoding
::
magicDequote
(
$value
);
if
(
(
(
!
empty
(
$prefix
)
&&
strpos
(
$key
,
$prefix
)
!==
false
&&
strpos
(
$key
,
$prefix
)
==
0
)
||
empty
(
$prefix
)
)
&&
strpos
(
$key
,
"ajxptype"
)
===
false
&&
strpos
(
$key
,
"_original_binary"
)
===
false
&&
strpos
(
$key
,
"_replication"
)
===
false
&&
strpos
(
$key
,
"_checkbox"
)
===
false
){
if
(
isSet
(
$repDef
[
$key
.
"_ajxptype"
])){
$type
=
$repDef
[
$key
.
"_ajxptype"
];
if
(
$type
==
"boolean"
){
$value
=
(
$value
==
"true"
?
true
:
false
);
}
else
if
(
$type
==
"integer"
){
$value
=
intval
(
$value
);
}
else
if
(
$type
==
"array"
){
$value
=
explode
(
","
,
$value
);
}
else
if
(
$type
==
"password"
&&
$userId
!=
null
){
if
(
trim
(
$value
!=
""
)
&&
function_exists
(
'mcrypt_encrypt'
))
{
// The initialisation vector is only required to avoid a warning, as ECB ignore IV
$iv
=
mcrypt_create_iv
(
mcrypt_get_iv_size
(
MCRYPT_RIJNDAEL_256
,
MCRYPT_MODE_ECB
),
MCRYPT_RAND
);
// We encode as base64 so if we need to store the result in a database, it can be stored in text column
$value
=
base64_encode
(
mcrypt_encrypt
(
MCRYPT_RIJNDAEL_256
,
md5
(
$userId
.
"
\1
CDAFx¨op#"
),
$value
,
MCRYPT_MODE_ECB
,
$iv
));
}
}
else
if
(
$type
==
"binary"
&&
$binariesContext
!==
null
){
if
(
!
empty
(
$value
)){
if
(
$value
==
"ajxp-remove-original"
){
if
(
!
empty
(
$repDef
[
$key
.
"_original_binary"
])){
ConfService
::
getConfStorageImpl
()
->
deleteBinary
(
$binariesContext
,
$repDef
[
$key
.
"_original_binary"
]);
}
$value
=
""
;
}
else
{
$file
=
AJXP_Utils
::
getAjxpTmpDir
()
.
"/"
.
$value
;
if
(
file_exists
(
$file
)){
$id
=
!
empty
(
$repDef
[
$key
.
"_original_binary"
])
?
$repDef
[
$key
.
"_original_binary"
]
:
null
;
$id
=
ConfService
::
getConfStorageImpl
()
->
saveBinary
(
$binariesContext
,
$file
,
$id
);
$value
=
$id
;
}
}
}
else
if
(
!
empty
(
$repDef
[
$key
.
"_original_binary"
])){
$value
=
$repDef
[
$key
.
"_original_binary"
];
}
}
else
if
(
strpos
(
$type
,
"group_switch:"
)
===
0
){
$tmp
=
explode
(
":"
,
$type
);
$gSwitchName
=
$tmp
[
1
];
$switchesGroups
[
substr
(
$key
,
strlen
(
$prefix
))]
=
$gSwitchName
;
}
else
if
(
$type
==
"text/json"
){
$value
=
json_decode
(
$value
,
true
);
}
if
(
!
in_array
(
$type
,
array
(
"textarea"
,
"boolean"
,
"text/json"
))){
$value
=
AJXP_Utils
::
sanitize
(
$value
,
AJXP_SANITIZE_HTML
);
}
unset
(
$repDef
[
$key
.
"_ajxptype"
]);
}
if
(
isSet
(
$repDef
[
$key
.
"_checkbox"
])){
$checked
=
$repDef
[
$key
.
"_checkbox"
]
==
"checked"
;
unset
(
$repDef
[
$key
.
"_checkbox"
]);
if
(
!
$checked
)
continue
;
}
if
(
isSet
(
$repDef
[
$key
.
"_replication"
])){
$repKey
=
$repDef
[
$key
.
"_replication"
];
if
(
!
is_array
(
$replicationGroups
[
$repKey
]))
$replicationGroups
[
$repKey
]
=
array
();
$replicationGroups
[
$repKey
][]
=
$key
;
}
$options
[
substr
(
$key
,
strlen
(
$prefix
))]
=
$value
;
unset
(
$repDef
[
$key
]);
}
else
{
if
(
$key
==
"DISPLAY"
){
$value
=
SystemTextEncoding
::
fromUTF8
(
AJXP_Utils
::
securePath
(
$value
));
}
$repDef
[
$key
]
=
$value
;
}
}
// DO SOMETHING WITH REPLICATED PARAMETERS?
if
(
count
(
$switchesGroups
)){
foreach
(
$switchesGroups
as
$fieldName
=>
$groupName
){
if
(
isSet
(
$options
[
$fieldName
])){
$gValues
=
array
();
$radic
=
$groupName
.
"_"
.
$options
[
$fieldName
]
.
"_"
;
foreach
(
$options
as
$optN
=>
$optV
){
if
(
strpos
(
$optN
,
$radic
)
===
0
){
$newName
=
substr
(
$optN
,
strlen
(
$radic
));
$gValues
[
$newName
]
=
$optV
;
}
}
}
$options
[
$fieldName
.
"_group_switch"
]
=
$options
[
$fieldName
];
$options
[
$fieldName
]
=
$gValues
;
}
}
}
public
static
function
cleanDibiDriverParameters
(
$params
){
if
(
!
is_array
(
$params
))
return
$params
;
$value
=
$params
[
"group_switch_value"
];
if
(
isSet
(
$value
)){
if
(
$value
==
"core"
){
$bootStorage
=
ConfService
::
getBootConfStorageImpl
();
$configs
=
$bootStorage
->
loadPluginConfig
(
"core"
,
"conf"
);
$params
=
$configs
[
"DIBI_PRECONFIGURATION"
];
}
else
{
unset
(
$params
[
"group_switch_value"
]);
}
foreach
(
$params
as
$k
=>
$v
){
$params
[
array_pop
(
explode
(
"_"
,
$k
,
2
))]
=
AJXP_VarsFilter
::
filter
(
$v
);
unset
(
$params
[
$k
]);
}
}
return
$params
;
}
public
static
function
runCreateTablesQuery
(
$p
,
$file
){
require_once
(
AJXP_BIN_FOLDER
.
"/dibi.compact.php"
);
$result
=
array
();
if
(
$p
[
"driver"
]
==
"sqlite"
||
$p
[
"driver"
]
==
"sqlite3"
){
if
(
!
file_exists
(
dirname
(
$p
[
"database"
]))){
@
mkdir
(
dirname
(
$p
[
"database"
]),
0755
,
true
);
}
dibi
::
connect
(
$p
);
$file
=
dirname
(
$file
)
.
"/"
.
str_replace
(
".sql"
,
".sqlite"
,
basename
(
$file
)
);
$sql
=
file_get_contents
(
$file
);
dibi
::
begin
();
$parts
=
explode
(
"CREATE TABLE"
,
$sql
);
foreach
(
$parts
as
$createPart
){
if
(
empty
(
$createPart
))
continue
;
$sqlPart
=
trim
(
"CREATE TABLE"
.
$createPart
);
try
{
dibi
::
nativeQuery
(
$sqlPart
);
$resKey
=
str_replace
(
"
\n
"
,
""
,
substr
(
$sqlPart
,
0
,
50
))
.
"..."
;
$result
[]
=
"OK:
$resKey
executed successfully"
;
}
catch
(
DibiException
$e
){
$result
[]
=
"ERROR!
$sqlPart
failed"
;
}
}
$message
=
implode
(
"
\n
"
,
$result
);
dibi
::
commit
();
dibi
::
disconnect
();
}
else
{
dibi
::
connect
(
$p
);
$sql
=
file_get_contents
(
$file
);
$parts
=
explode
(
"CREATE TABLE"
,
$sql
);
foreach
(
$parts
as
$createPart
){
if
(
empty
(
$createPart
))
continue
;
$sqlPart
=
trim
(
"CREATE TABLE"
.
$createPart
);
try
{
dibi
::
nativeQuery
(
$sqlPart
);
$resKey
=
str_replace
(
"
\n
"
,
""
,
substr
(
$sqlPart
,
0
,
50
))
.
"..."
;
$result
[]
=
"OK:
$resKey
executed successfully"
;
}
catch
(
DibiException
$e
){
$result
[]
=
"ERROR!
$sqlPart
failed"
;
}
}
$message
=
implode
(
"
\n
"
,
$result
);
dibi
::
disconnect
();
}
if
(
strpos
(
$message
,
"ERROR!"
))
return
$message
;
else
return
"SUCCESS:"
.
$message
;
}
}
\ No newline at end of file
software/davstorage/templates/class.phpmailer-lite.php
0 → 100644
View file @
72e10a30
<?php
/*~ class.phpmailer-lite.php
.---------------------------------------------------------------------------.
| Software: PHPMailer Lite - PHP email class |
| Version: 5.1 |
| Contact: via sourceforge.net support pages (also www.codeworxtech.com) |
| Info: http://phpmailer.sourceforge.net |
| Support: http://sourceforge.net/projects/phpmailer/ |
| ------------------------------------------------------------------------- |
| Admin: Andy Prevost (project admininistrator) |
| Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
| : Marcus Bointon (coolbru) coolbru@users.sourceforge.net |
| Founder: Brent R. Matzelle (original founder) |
| Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. |
| Copyright (c) 2001-2003, Brent R. Matzelle |
| ------------------------------------------------------------------------- |
| License: Distributed under the Lesser General Public License (LGPL) |
| http://www.gnu.org/copyleft/lesser.html |
| This program is distributed in the hope that it will be useful - WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. |
| ------------------------------------------------------------------------- |
| We offer a number of paid services (www.codeworxtech.com): |
| - Web Hosting on highly optimized fast and secure servers |
| - Technology Consulting |
| - Oursourcing (highly qualified programmers and graphic designers) |
'---------------------------------------------------------------------------'
*/
/**
* PHPMailer Lite - PHP email transport class
* NOTE: Requires PHP version 5 or later
* @package PHPMailer Lite
* @author Andy Prevost
* @author Marcus Bointon
* @copyright 2004 - 2009 Andy Prevost
* @version $Id: class.phpmailer-lite.php 447 2009-09-12 13:21:38Z codeworxtech $
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
if
(
version_compare
(
PHP_VERSION
,
'5.0.0'
,
'<'
)
)
exit
(
"Sorry, this version of PHPMailer will only run on PHP version 5 or greater!
\n
"
);
class
PHPMailerLite
{
/////////////////////////////////////////////////
// PROPERTIES, PUBLIC
/////////////////////////////////////////////////
/**
* Email priority (1 = High, 3 = Normal, 5 = low).
* @var int
*/
public
$Priority
=
3
;
/**
* Sets the CharSet of the message.
* @var string
*/
public
$CharSet
=
'iso-8859-1'
;
/**
* Sets the Content-type of the message.
* @var string
*/
public
$ContentType
=
'text/plain'
;
/**
* Sets the Encoding of the message. Options for this are
* "8bit", "7bit", "binary", "base64", and "quoted-printable".
* @var string
*/
public
$Encoding
=
'8bit'
;
/**
* Holds the most recent mailer error message.
* @var string
*/
public
$ErrorInfo
=
''
;
/**
* Sets the From email address for the message.
* @var string
*/
public
$From
=
'root@localhost'
;
/**
* Sets the From name of the message.
* @var string
*/
public
$FromName
=
'Root User'
;
/**
* Sets the Sender email (Return-Path) of the message. If not empty,
* will be sent via -f to sendmail
* @var string
*/
public
$Sender
=
''
;
/**
* Sets the Subject of the message.
* @var string
*/
public
$Subject
=
''
;
/**
* Sets the Body of the message. This can be either an HTML or text body.
* If HTML then run IsHTML(true).
* @var string
*/
public
$Body
=
''
;
/**
* Sets the text-only body of the message. This automatically sets the
* email to multipart/alternative. This body can be read by mail
* clients that do not have HTML email capability such as mutt. Clients
* that can read HTML will view the normal Body.
* @var string
*/
public
$AltBody
=
''
;
/**
* Sets word wrapping on the body of the message to a given number of
* characters.
* @var int
*/
public
$WordWrap
=
0
;
/**
* Method to send mail: ("mail", or "sendmail").
* @var string
*/
public
$Mailer
=
'sendmail'
;
/**
* Sets the path of the sendmail program.
* @var string
*/
public
$Sendmail
=
'${:sendmail-script}'
;
/**
* Sets the email address that a reading confirmation will be sent.
* @var string
*/
public
$ConfirmReadingTo
=
''
;
/**
* Sets the hostname to use in Message-Id and Received headers
* and as default HELO string. If empty, the value returned
* by SERVER_NAME is used or 'localhost.localdomain'.
* @var string
*/
public
$Hostname
=
''
;
/**
* Sets the message ID to be used in the Message-Id header.
* If empty, a unique id will be generated.
* @var string
*/
public
$MessageID
=
''
;
/**
* Provides the ability to have the TO field process individual
* emails, instead of sending to entire TO addresses
* @var bool
*/
public
$SingleTo
=
true
;
/**
* If SingleTo is true, this provides the array to hold the email addresses
* @var bool
*/
public
$SingleToArray
=
array
();
/**
* Provides the ability to change the line ending
* @var string
*/
public
$LE
=
"
\n
"
;
/**
* Used with DKIM DNS Resource Record
* @var string
*/
public
$DKIM_selector
=
'phpmailer'
;
/**
* Used with DKIM DNS Resource Record
* optional, in format of email address 'you@yourdomain.com'
* @var string
*/
public
$DKIM_identity
=
''
;
/**
* Used with DKIM DNS Resource Record
* required, in format of base domain 'yourdomain.com'
* @var string
*/
public
$DKIM_domain
=
''
;
/**
* Used with DKIM Digital Signing process
* optional
* @var string
*/
public
$DKIM_passphrase
=
''
;
/**
* Used with DKIM DNS Resource Record
* required, private key (read from /.htprivkey)
* @var string
*/
public
$DKIM_private
=
''
;
/**
* Callback Action function name
* the function that handles the result of the send email action. Parameters:
* bool $result result of the send action
* string $to email address of the recipient
* string $cc cc email addresses
* string $bcc bcc email addresses
* string $subject the subject
* string $body the email body
* @var string
*/
public
$action_function
=
''
;
//'callbackAction';
/**
* Sets the PHPMailer Version number
* @var string
*/
public
$Version
=
'Lite 5.1'
;
/////////////////////////////////////////////////
// PROPERTIES, PRIVATE AND PROTECTED
/////////////////////////////////////////////////
private
$to
=
array
();
private
$cc
=
array
();
private
$bcc
=
array
();
private
$ReplyTo
=
array
();
private
$all_recipients
=
array
();
private
$attachment
=
array
();
private
$CustomHeader
=
array
();
private
$message_type
=
''
;
private
$boundary
=
array
();
protected
$language
=
array
();
private
$error_count
=
0
;
private
$sign_cert_file
=
""
;
private
$sign_key_file
=
""
;
private
$sign_key_pass
=
""
;
private
$exceptions
=
false
;
/////////////////////////////////////////////////
// CONSTANTS
/////////////////////////////////////////////////
const
STOP_MESSAGE
=
0
;
// message only, continue processing
const
STOP_CONTINUE
=
1
;
// message?, likely ok to continue processing
const
STOP_CRITICAL
=
2
;
// message, plus full stop, critical error reached
/////////////////////////////////////////////////
// METHODS, VARIABLES
/////////////////////////////////////////////////
/**
* Constructor
* @param boolean $exceptions Should we throw external exceptions?
*/
public
function
__construct
(
$exceptions
=
false
)
{
$this
->
exceptions
=
(
$exceptions
==
true
);
}
/**
* Sets message type to HTML.
* @param bool $ishtml
* @return void
*/
public
function
IsHTML
(
$ishtml
=
true
)
{
if
(
$ishtml
)
{
$this
->
ContentType
=
'text/html'
;
}
else
{
$this
->
ContentType
=
'text/plain'
;
}
}
/**
* Sets Mailer to send message using PHP mail() function.
* @return void
*/
public
function
IsMail
()
{
$this
->
Mailer
=
'mail'
;
}
/**
* Sets Mailer to send message using the $Sendmail program.
* @return void
*/
public
function
IsSendmail
()
{
if
(
!
stristr
(
ini_get
(
'sendmail_path'
),
'sendmail'
))
{
$this
->
Sendmail
=
'/var/qmail/bin/sendmail'
;
}
$this
->
Mailer
=
'sendmail'
;
}
/**
* Sets Mailer to send message using the qmail MTA.
* @return void
*/
public
function
IsQmail
()
{
if
(
stristr
(
ini_get
(
'sendmail_path'
),
'qmail'
))
{
$this
->
Sendmail
=
'/var/qmail/bin/sendmail'
;
}
$this
->
Mailer
=
'sendmail'
;
}
/////////////////////////////////////////////////
// METHODS, RECIPIENTS
/////////////////////////////////////////////////
/**
* Adds a "To" address.
* @param string $address
* @param string $name
* @return boolean true on success, false if address already used
*/
public
function
AddAddress
(
$address
,
$name
=
''
)
{
return
$this
->
AddAnAddress
(
'to'
,
$address
,
$name
);
}
/**
* Adds a "Cc" address.
* Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
* @param string $address
* @param string $name
* @return boolean true on success, false if address already used
*/
public
function
AddCC
(
$address
,
$name
=
''
)
{
return
$this
->
AddAnAddress
(
'cc'
,
$address
,
$name
);
}
/**
* Adds a "Bcc" address.
* Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
* @param string $address
* @param string $name
* @return boolean true on success, false if address already used
*/
public
function
AddBCC
(
$address
,
$name
=
''
)
{
return
$this
->
AddAnAddress
(
'bcc'
,
$address
,
$name
);
}
/**
* Adds a "Reply-to" address.
* @param string $address
* @param string $name
* @return boolean
*/
public
function
AddReplyTo
(
$address
,
$name
=
''
)
{
return
$this
->
AddAnAddress
(
'ReplyTo'
,
$address
,
$name
);
}
/**
* Adds an address to one of the recipient arrays
* Addresses that have been added already return false, but do not throw exceptions
* @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
* @param string $address The email address to send to
* @param string $name
* @return boolean true on success, false if address already used or invalid in some way
* @access private
*/
private
function
AddAnAddress
(
$kind
,
$address
,
$name
=
''
)
{
if
(
!
preg_match
(
'/^(to|cc|bcc|ReplyTo)$/'
,
$kind
))
{
echo
'Invalid recipient array: '
.
kind
;
return
false
;
}
$address
=
trim
(
$address
);
$name
=
trim
(
preg_replace
(
'/[\r\n]+/'
,
''
,
$name
));
//Strip breaks and trim
if
(
!
self
::
ValidateAddress
(
$address
))
{
$this
->
SetError
(
$this
->
Lang
(
'invalid_address'
)
.
': '
.
$address
);
if
(
$this
->
exceptions
)
{
throw
new
phpmailerException
(
$this
->
Lang
(
'invalid_address'
)
.
': '
.
$address
);
}
echo
$this
->
Lang
(
'invalid_address'
)
.
': '
.
$address
;
return
false
;
}
if
(
$kind
!=
'ReplyTo'
)
{
if
(
!
isset
(
$this
->
all_recipients
[
strtolower
(
$address
)]))
{
array_push
(
$this
->
$kind
,
array
(
$address
,
$name
));
$this
->
all_recipients
[
strtolower
(
$address
)]
=
true
;
return
true
;
}
}
else
{
if
(
!
array_key_exists
(
strtolower
(
$address
),
$this
->
ReplyTo
))
{
$this
->
ReplyTo
[
strtolower
(
$address
)]
=
array
(
$address
,
$name
);
return
true
;
}
}
return
false
;
}
/**
* Set the From and FromName properties
* @param string $address
* @param string $name
* @return boolean
*/
public
function
SetFrom
(
$address
,
$name
=
''
,
$auto
=
1
)
{
$address
=
trim
(
$address
);
$name
=
trim
(
preg_replace
(
'/[\r\n]+/'
,
''
,
$name
));
//Strip breaks and trim
if
(
!
self
::
ValidateAddress
(
$address
))
{
$this
->
SetError
(
$this
->
Lang
(
'invalid_address'
)
.
': '
.
$address
);
if
(
$this
->
exceptions
)
{
throw
new
phpmailerException
(
$this
->
Lang
(
'invalid_address'
)
.
': '
.
$address
);
}
echo
$this
->
Lang
(
'invalid_address'
)
.
': '
.
$address
;
return
false
;
}
$this
->
From
=
$address
;
$this
->
FromName
=
$name
;
if
(
$auto
)
{
if
(
empty
(
$this
->
ReplyTo
))
{
$this
->
AddAnAddress
(
'ReplyTo'
,
$address
,
$name
);
}
if
(
empty
(
$this
->
Sender
))
{
$this
->
Sender
=
$address
;
}
}
return
true
;
}
/**
* Check that a string looks roughly like an email address should
* Static so it can be used without instantiation
* Tries to use PHP built-in validator in the filter extension (from PHP 5.2), falls back to a reasonably competent regex validator
* Conforms approximately to RFC2822
* @link http://www.hexillion.com/samples/#Regex Original pattern found here
* @param string $address The email address to check
* @return boolean
* @static
* @access public
*/
public
static
function
ValidateAddress
(
$address
)
{
if
(
function_exists
(
'filter_var'
))
{
//Introduced in PHP 5.2
if
(
filter_var
(
$address
,
FILTER_VALIDATE_EMAIL
)
===
FALSE
)
{
return
false
;
}
else
{
return
true
;
}
}
else
{
return
preg_match
(
'/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/'
,
$address
);
}
}
/////////////////////////////////////////////////
// METHODS, MAIL SENDING
/////////////////////////////////////////////////
/**
* Creates message and assigns Mailer. If the message is
* not sent successfully then it returns false. Use the ErrorInfo
* variable to view description of the error.
* @return bool
*/
public
function
Send
()
{
try
{
if
((
count
(
$this
->
to
)
+
count
(
$this
->
cc
)
+
count
(
$this
->
bcc
))
<
1
)
{
throw
new
phpmailerException
(
$this
->
Lang
(
'provide_address'
),
self
::
STOP_CRITICAL
);
}
// Set whether the message is multipart/alternative
if
(
!
empty
(
$this
->
AltBody
))
{
$this
->
ContentType
=
'multipart/alternative'
;
}
$this
->
error_count
=
0
;
// reset errors
$this
->
SetMessageType
();
$header
=
$this
->
CreateHeader
();
$body
=
$this
->
CreateBody
();
if
(
empty
(
$this
->
Body
))
{
throw
new
phpmailerException
(
$this
->
Lang
(
'empty_message'
),
self
::
STOP_CRITICAL
);
}
// digitally sign with DKIM if enabled
if
(
$this
->
DKIM_domain
&&
$this
->
DKIM_private
)
{
$header_dkim
=
$this
->
DKIM_Add
(
$header
,
$this
->
Subject
,
$body
);
$header
=
str_replace
(
"
\r\n
"
,
"
\n
"
,
$header_dkim
)
.
$header
;
}
// Choose the mailer and send through it
switch
(
$this
->
Mailer
)
{
case
'sendmail'
:
$sendAction
=
$this
->
SendmailSend
(
$header
,
$body
);
return
$sendAction
;
default
:
$sendAction
=
$this
->
MailSend
(
$header
,
$body
);
return
$sendAction
;
}
}
catch
(
phpmailerException
$e
)
{
$this
->
SetError
(
$e
->
getMessage
());
if
(
$this
->
exceptions
)
{
throw
$e
;
}
echo
$e
->
getMessage
()
.
"
\n
"
;
return
false
;
}
}
/**
* Sends mail using the $Sendmail program.
* @param string $header The message headers
* @param string $body The message body
* @access protected
* @return bool
*/
protected
function
SendmailSend
(
$header
,
$body
)
{
if
(
$this
->
Sender
!=
''
)
{
$sendmail
=
sprintf
(
"%s -oi -f %s -t"
,
escapeshellcmd
(
$this
->
Sendmail
),
escapeshellarg
(
$this
->
Sender
));
}
else
{
$sendmail
=
sprintf
(
"%s -oi -t"
,
escapeshellcmd
(
$this
->
Sendmail
));
}
if
(
$this
->
SingleTo
===
true
)
{
foreach
(
$this
->
SingleToArray
as
$key
=>
$val
)
{
if
(
!@
$mail
=
popen
(
$sendmail
,
'w'
))
{
throw
new
phpmailerException
(
$this
->
Lang
(
'execute'
)
.
$this
->
Sendmail
,
self
::
STOP_CRITICAL
);
}
fputs
(
$mail
,
"To: "
.
$val
.
"
\n
"
);
fputs
(
$mail
,
$header
);
fputs
(
$mail
,
$body
);
$result
=
pclose
(
$mail
);
// implement call back function if it exists
$isSent
=
(
$result
==
0
)
?
1
:
0
;
$this
->
doCallback
(
$isSent
,
$val
,
$this
->
cc
,
$this
->
bcc
,
$this
->
Subject
,
$body
);
if
(
$result
!=
0
)
{
throw
new
phpmailerException
(
$this
->
Lang
(
'execute'
)
.
$this
->
Sendmail
,
self
::
STOP_CRITICAL
);
}
}
}
else
{
if
(
!@
$mail
=
popen
(
$sendmail
,
'w'
))
{
throw
new
phpmailerException
(
$this
->
Lang
(
'execute'
)
.
$this
->
Sendmail
,
self
::
STOP_CRITICAL
);
}
fputs
(
$mail
,
$header
);
fputs
(
$mail
,
$body
);
$result
=
pclose
(
$mail
);
// implement call back function if it exists
$isSent
=
(
$result
==
0
)
?
1
:
0
;
$this
->
doCallback
(
$isSent
,
$this
->
to
,
$this
->
cc
,
$this
->
bcc
,
$this
->
Subject
,
$body
);
if
(
$result
!=
0
)
{
throw
new
phpmailerException
(
$this
->
Lang
(
'execute'
)
.
$this
->
Sendmail
,
self
::
STOP_CRITICAL
);
}
}
return
true
;
}
/**
* Sends mail using the PHP mail() function.
* @param string $header The message headers
* @param string $body The message body
* @access protected
* @return bool
*/
protected
function
MailSend
(
$header
,
$body
)
{
$toArr
=
array
();
foreach
(
$this
->
to
as
$t
)
{
$toArr
[]
=
$this
->
AddrFormat
(
$t
);
}
$to
=
implode
(
', '
,
$toArr
);
$params
=
sprintf
(
"-oi -f %s"
,
$this
->
Sender
);
if
(
$this
->
Sender
!=
''
&&
strlen
(
ini_get
(
'safe_mode'
))
<
1
)
{
$old_from
=
ini_get
(
'sendmail_from'
);
ini_set
(
'sendmail_from'
,
$this
->
Sender
);
if
(
$this
->
SingleTo
===
true
&&
count
(
$toArr
)
>
1
)
{
foreach
(
$toArr
as
$key
=>
$val
)
{
$rt
=
@
mail
(
$val
,
$this
->
EncodeHeader
(
$this
->
SecureHeader
(
$this
->
Subject
)),
$body
,
$header
,
$params
);
// implement call back function if it exists
$isSent
=
(
$rt
==
1
)
?
1
:
0
;
$this
->
doCallback
(
$isSent
,
$val
,
$this
->
cc
,
$this
->
bcc
,
$this
->
Subject
,
$body
);
}
}
else
{
$rt
=
@
mail
(
$to
,
$this
->
EncodeHeader
(
$this
->
SecureHeader
(
$this
->
Subject
)),
$body
,
$header
,
$params
);
// implement call back function if it exists
$isSent
=
(
$rt
==
1
)
?
1
:
0
;
$this
->
doCallback
(
$isSent
,
$to
,
$this
->
cc
,
$this
->
bcc
,
$this
->
Subject
,
$body
);
}
}
else
{
if
(
$this
->
SingleTo
===
true
&&
count
(
$toArr
)
>
1
)
{
foreach
(
$toArr
as
$key
=>
$val
)
{
$rt
=
@
mail
(
$val
,
$this
->
EncodeHeader
(
$this
->
SecureHeader
(
$this
->
Subject
)),
$body
,
$header
,
$params
);
// implement call back function if it exists
$isSent
=
(
$rt
==
1
)
?
1
:
0
;
$this
->
doCallback
(
$isSent
,
$val
,
$this
->
cc
,
$this
->
bcc
,
$this
->
Subject
,
$body
);
}
}
else
{
$rt
=
@
mail
(
$to
,
$this
->
EncodeHeader
(
$this
->
SecureHeader
(
$this
->
Subject
)),
$body
,
$header
);
// implement call back function if it exists
$isSent
=
(
$rt
==
1
)
?
1
:
0
;
$this
->
doCallback
(
$isSent
,
$to
,
$this
->
cc
,
$this
->
bcc
,
$this
->
Subject
,
$body
);
}
}
if
(
isset
(
$old_from
))
{
ini_set
(
'sendmail_from'
,
$old_from
);
}
if
(
!
$rt
)
{
throw
new
phpmailerException
(
$this
->
Lang
(
'instantiate'
),
self
::
STOP_CRITICAL
);
}
return
true
;
}
/**
* Sets the language for all class error messages.
* Returns false if it cannot load the language file. The default language is English.
* @param string $langcode ISO 639-1 2-character language code (e.g. Portuguese: "br")
* @param string $lang_path Path to the language file directory
* @access public
*/
function
SetLanguage
(
$langcode
=
'en'
,
$lang_path
=
'language/'
)
{
//Define full set of translatable strings
$PHPMAILER_LANG
=
array
(
'provide_address'
=>
'You must provide at least one recipient email address.'
,
'mailer_not_supported'
=>
' mailer is not supported.'
,
'execute'
=>
'Could not execute: '
,
'instantiate'
=>
'Could not instantiate mail function.'
,
'from_failed'
=>
'The following From address failed: '
,
'file_access'
=>
'Could not access file: '
,
'file_open'
=>
'File Error: Could not open file: '
,
'encoding'
=>
'Unknown encoding: '
,
'signing'
=>
'Signing Error: '
,
'empty_message'
=>
'Message body empty'
,
'invalid_address'
=>
'Invalid address'
,
'variable_set'
=>
'Cannot set or reset variable: '
);
//Overwrite language-specific strings. This way we'll never have missing translations - no more "language string failed to load"!
$l
=
true
;
if
(
$langcode
!=
'en'
)
{
//There is no English translation file
$l
=
@
include
$lang_path
.
'phpmailer.lang-'
.
$langcode
.
'.php'
;
}
$this
->
language
=
$PHPMAILER_LANG
;
return
(
$l
==
true
);
//Returns false if language not found
}
/**
* Return the current array of language strings
* @return array
*/
public
function
GetTranslations
()
{
return
$this
->
language
;
}
/////////////////////////////////////////////////
// METHODS, MESSAGE CREATION
/////////////////////////////////////////////////
/**
* Creates recipient headers.
* @access public
* @return string
*/
public
function
AddrAppend
(
$type
,
$addr
)
{
$addr_str
=
$type
.
': '
;
$addresses
=
array
();
foreach
(
$addr
as
$a
)
{
$addresses
[]
=
$this
->
AddrFormat
(
$a
);
}
$addr_str
.=
implode
(
', '
,
$addresses
);
$addr_str
.=
$this
->
LE
;
return
$addr_str
;
}
/**
* Formats an address correctly.
* @access public
* @return string
*/
public
function
AddrFormat
(
$addr
)
{
if
(
empty
(
$addr
[
1
]))
{
return
$this
->
SecureHeader
(
$addr
[
0
]);
}
else
{
return
$this
->
EncodeHeader
(
$this
->
SecureHeader
(
$addr
[
1
]),
'phrase'
)
.
" <"
.
$this
->
SecureHeader
(
$addr
[
0
])
.
">"
;
}
}
/**
* Wraps message for use with mailers that do not
* automatically perform wrapping and for quoted-printable.
* Original written by philippe.
* @param string $message The message to wrap
* @param integer $length The line length to wrap to
* @param boolean $qp_mode Whether to run in Quoted-Printable mode
* @access public
* @return string
*/
public
function
WrapText
(
$message
,
$length
,
$qp_mode
=
false
)
{
$soft_break
=
(
$qp_mode
)
?
sprintf
(
" =%s"
,
$this
->
LE
)
:
$this
->
LE
;
// If utf-8 encoding is used, we will need to make sure we don't
// split multibyte characters when we wrap
$is_utf8
=
(
strtolower
(
$this
->
CharSet
)
==
"utf-8"
);
$message
=
$this
->
FixEOL
(
$message
);
if
(
substr
(
$message
,
-
1
)
==
$this
->
LE
)
{
$message
=
substr
(
$message
,
0
,
-
1
);
}
$line
=
explode
(
$this
->
LE
,
$message
);
$message
=
''
;
for
(
$i
=
0
;
$i
<
count
(
$line
);
$i
++
)
{
$line_part
=
explode
(
' '
,
$line
[
$i
]);
$buf
=
''
;
for
(
$e
=
0
;
$e
<
count
(
$line_part
);
$e
++
)
{
$word
=
$line_part
[
$e
];
if
(
$qp_mode
and
(
strlen
(
$word
)
>
$length
))
{
$space_left
=
$length
-
strlen
(
$buf
)
-
1
;
if
(
$e
!=
0
)
{
if
(
$space_left
>
20
)
{
$len
=
$space_left
;
if
(
$is_utf8
)
{
$len
=
$this
->
UTF8CharBoundary
(
$word
,
$len
);
}
elseif
(
substr
(
$word
,
$len
-
1
,
1
)
==
"="
)
{
$len
--
;
}
elseif
(
substr
(
$word
,
$len
-
2
,
1
)
==
"="
)
{
$len
-=
2
;
}
$part
=
substr
(
$word
,
0
,
$len
);
$word
=
substr
(
$word
,
$len
);
$buf
.=
' '
.
$part
;
$message
.=
$buf
.
sprintf
(
"=%s"
,
$this
->
LE
);
}
else
{
$message
.=
$buf
.
$soft_break
;
}
$buf
=
''
;
}
while
(
strlen
(
$word
)
>
0
)
{
$len
=
$length
;
if
(
$is_utf8
)
{
$len
=
$this
->
UTF8CharBoundary
(
$word
,
$len
);
}
elseif
(
substr
(
$word
,
$len
-
1
,
1
)
==
"="
)
{
$len
--
;
}
elseif
(
substr
(
$word
,
$len
-
2
,
1
)
==
"="
)
{
$len
-=
2
;
}
$part
=
substr
(
$word
,
0
,
$len
);
$word
=
substr
(
$word
,
$len
);
if
(
strlen
(
$word
)
>
0
)
{
$message
.=
$part
.
sprintf
(
"=%s"
,
$this
->
LE
);
}
else
{
$buf
=
$part
;
}
}
}
else
{
$buf_o
=
$buf
;
$buf
.=
(
$e
==
0
)
?
$word
:
(
' '
.
$word
);
if
(
strlen
(
$buf
)
>
$length
and
$buf_o
!=
''
)
{
$message
.=
$buf_o
.
$soft_break
;
$buf
=
$word
;
}
}
}
$message
.=
$buf
.
$this
->
LE
;
}
return
$message
;
}
/**
* Finds last character boundary prior to maxLength in a utf-8
* quoted (printable) encoded string.
* Original written by Colin Brown.
* @access public
* @param string $encodedText utf-8 QP text
* @param int $maxLength find last character boundary prior to this length
* @return int
*/
public
function
UTF8CharBoundary
(
$encodedText
,
$maxLength
)
{
$foundSplitPos
=
false
;
$lookBack
=
3
;
while
(
!
$foundSplitPos
)
{
$lastChunk
=
substr
(
$encodedText
,
$maxLength
-
$lookBack
,
$lookBack
);
$encodedCharPos
=
strpos
(
$lastChunk
,
"="
);
if
(
$encodedCharPos
!==
false
)
{
// Found start of encoded character byte within $lookBack block.
// Check the encoded byte value (the 2 chars after the '=')
$hex
=
substr
(
$encodedText
,
$maxLength
-
$lookBack
+
$encodedCharPos
+
1
,
2
);
$dec
=
hexdec
(
$hex
);
if
(
$dec
<
128
)
{
// Single byte character.
// If the encoded char was found at pos 0, it will fit
// otherwise reduce maxLength to start of the encoded char
$maxLength
=
(
$encodedCharPos
==
0
)
?
$maxLength
:
$maxLength
-
(
$lookBack
-
$encodedCharPos
);
$foundSplitPos
=
true
;
}
elseif
(
$dec
>=
192
)
{
// First byte of a multi byte character
// Reduce maxLength to split at start of character
$maxLength
=
$maxLength
-
(
$lookBack
-
$encodedCharPos
);
$foundSplitPos
=
true
;
}
elseif
(
$dec
<
192
)
{
// Middle byte of a multi byte character, look further back
$lookBack
+=
3
;
}
}
else
{
// No encoded character found
$foundSplitPos
=
true
;
}
}
return
$maxLength
;
}
/**
* Set the body wrapping.
* @access public
* @return void
*/
public
function
SetWordWrap
()
{
if
(
$this
->
WordWrap
<
1
)
{
return
;
}
switch
(
$this
->
message_type
)
{
case
'alt'
:
case
'alt_attachments'
:
$this
->
AltBody
=
$this
->
WrapText
(
$this
->
AltBody
,
$this
->
WordWrap
);
break
;
default
:
$this
->
Body
=
$this
->
WrapText
(
$this
->
Body
,
$this
->
WordWrap
);
break
;
}
}
/**
* Assembles message header.
* @access public
* @return string The assembled header
*/
public
function
CreateHeader
()
{
$result
=
''
;
// Set the boundaries
$uniq_id
=
md5
(
uniqid
(
time
()));
$this
->
boundary
[
1
]
=
'b1_'
.
$uniq_id
;
$this
->
boundary
[
2
]
=
'b2_'
.
$uniq_id
;
$result
.=
$this
->
HeaderLine
(
'Date'
,
self
::
RFCDate
());
if
(
$this
->
Sender
==
''
)
{
$result
.=
$this
->
HeaderLine
(
'Return-Path'
,
trim
(
$this
->
From
));
}
else
{
$result
.=
$this
->
HeaderLine
(
'Return-Path'
,
trim
(
$this
->
Sender
));
}
// To be created automatically by mail()
if
(
$this
->
Mailer
!=
'mail'
)
{
if
(
$this
->
SingleTo
===
true
)
{
foreach
(
$this
->
to
as
$t
)
{
$this
->
SingleToArray
[]
=
$this
->
AddrFormat
(
$t
);
}
}
else
{
if
(
count
(
$this
->
to
)
>
0
)
{
$result
.=
$this
->
AddrAppend
(
'To'
,
$this
->
to
);
}
elseif
(
count
(
$this
->
cc
)
==
0
)
{
$result
.=
$this
->
HeaderLine
(
'To'
,
'undisclosed-recipients:;'
);
}
}
}
$from
=
array
();
$from
[
0
][
0
]
=
trim
(
$this
->
From
);
$from
[
0
][
1
]
=
$this
->
FromName
;
$result
.=
$this
->
AddrAppend
(
'From'
,
$from
);
// sendmail and mail() extract Cc from the header before sending
if
(
count
(
$this
->
cc
)
>
0
)
{
$result
.=
$this
->
AddrAppend
(
'Cc'
,
$this
->
cc
);
}
// sendmail and mail() extract Bcc from the header before sending
if
(
count
(
$this
->
bcc
)
>
0
)
{
$result
.=
$this
->
AddrAppend
(
'Bcc'
,
$this
->
bcc
);
}
if
(
count
(
$this
->
ReplyTo
)
>
0
)
{
$result
.=
$this
->
AddrAppend
(
'Reply-to'
,
$this
->
ReplyTo
);
}
// mail() sets the subject itself
if
(
$this
->
Mailer
!=
'mail'
)
{
$result
.=
$this
->
HeaderLine
(
'Subject'
,
$this
->
EncodeHeader
(
$this
->
SecureHeader
(
$this
->
Subject
)));
}
if
(
$this
->
MessageID
!=
''
)
{
$result
.=
$this
->
HeaderLine
(
'Message-ID'
,
$this
->
MessageID
);
}
else
{
$result
.=
sprintf
(
"Message-ID: <%s@%s>%s"
,
$uniq_id
,
$this
->
ServerHostname
(),
$this
->
LE
);
}
$result
.=
$this
->
HeaderLine
(
'X-Priority'
,
$this
->
Priority
);
$result
.=
$this
->
HeaderLine
(
'X-Mailer'
,
'PHPMailer '
.
$this
->
Version
.
' (phpmailer.codeworxtech.com)'
);
if
(
$this
->
ConfirmReadingTo
!=
''
)
{
$result
.=
$this
->
HeaderLine
(
'Disposition-Notification-To'
,
'<'
.
trim
(
$this
->
ConfirmReadingTo
)
.
'>'
);
}
// Add custom headers
for
(
$index
=
0
;
$index
<
count
(
$this
->
CustomHeader
);
$index
++
)
{
$result
.=
$this
->
HeaderLine
(
trim
(
$this
->
CustomHeader
[
$index
][
0
]),
$this
->
EncodeHeader
(
trim
(
$this
->
CustomHeader
[
$index
][
1
])));
}
if
(
!
$this
->
sign_key_file
)
{
$result
.=
$this
->
HeaderLine
(
'MIME-Version'
,
'1.0'
);
$result
.=
$this
->
GetMailMIME
();
}
return
$result
;
}
/**
* Returns the message MIME.
* @access public
* @return string
*/
public
function
GetMailMIME
()
{
$result
=
''
;
switch
(
$this
->
message_type
)
{
case
'plain'
:
$result
.=
$this
->
HeaderLine
(
'Content-Transfer-Encoding'
,
$this
->
Encoding
);
$result
.=
sprintf
(
"Content-Type: %s; charset=
\"
%s
\"
"
,
$this
->
ContentType
,
$this
->
CharSet
);
break
;
case
'attachments'
:
case
'alt_attachments'
:
if
(
$this
->
InlineImageExists
()){
$result
.=
sprintf
(
"Content-Type: %s;%s
\t
type=
\"
text/html
\"
;%s
\t
boundary=
\"
%s
\"
%s"
,
'multipart/related'
,
$this
->
LE
,
$this
->
LE
,
$this
->
boundary
[
1
],
$this
->
LE
);
}
else
{
$result
.=
$this
->
HeaderLine
(
'Content-Type'
,
'multipart/mixed;'
);
$result
.=
$this
->
TextLine
(
"
\t
boundary=
\"
"
.
$this
->
boundary
[
1
]
.
'"'
);
}
break
;
case
'alt'
:
$result
.=
$this
->
HeaderLine
(
'Content-Type'
,
'multipart/alternative;'
);
$result
.=
$this
->
TextLine
(
"
\t
boundary=
\"
"
.
$this
->
boundary
[
1
]
.
'"'
);
break
;
}
if
(
$this
->
Mailer
!=
'mail'
)
{
$result
.=
$this
->
LE
.
$this
->
LE
;
}
return
$result
;
}
/**
* Assembles the message body. Returns an empty string on failure.
* @access public
* @return string The assembled message body
*/
public
function
CreateBody
()
{
$body
=
''
;
if
(
$this
->
sign_key_file
)
{
$body
.=
$this
->
GetMailMIME
();
}
$this
->
SetWordWrap
();
switch
(
$this
->
message_type
)
{
case
'alt'
:
$body
.=
$this
->
GetBoundary
(
$this
->
boundary
[
1
],
''
,
'text/plain'
,
''
);
$body
.=
$this
->
EncodeString
(
$this
->
AltBody
,
$this
->
Encoding
);
$body
.=
$this
->
LE
.
$this
->
LE
;
$body
.=
$this
->
GetBoundary
(
$this
->
boundary
[
1
],
''
,
'text/html'
,
''
);
$body
.=
$this
->
EncodeString
(
$this
->
Body
,
$this
->
Encoding
);
$body
.=
$this
->
LE
.
$this
->
LE
;
$body
.=
$this
->
EndBoundary
(
$this
->
boundary
[
1
]);
break
;
case
'plain'
:
$body
.=
$this
->
EncodeString
(
$this
->
Body
,
$this
->
Encoding
);
break
;
case
'attachments'
:
$body
.=
$this
->
GetBoundary
(
$this
->
boundary
[
1
],
''
,
''
,
''
);
$body
.=
$this
->
EncodeString
(
$this
->
Body
,
$this
->
Encoding
);
$body
.=
$this
->
LE
;
$body
.=
$this
->
AttachAll
();
break
;
case
'alt_attachments'
:
$body
.=
sprintf
(
"--%s%s"
,
$this
->
boundary
[
1
],
$this
->
LE
);
$body
.=
sprintf
(
"Content-Type: %s;%s"
.
"
\t
boundary=
\"
%s
\"
%s"
,
'multipart/alternative'
,
$this
->
LE
,
$this
->
boundary
[
2
],
$this
->
LE
.
$this
->
LE
);
$body
.=
$this
->
GetBoundary
(
$this
->
boundary
[
2
],
''
,
'text/plain'
,
''
)
.
$this
->
LE
;
// Create text body
$body
.=
$this
->
EncodeString
(
$this
->
AltBody
,
$this
->
Encoding
);
$body
.=
$this
->
LE
.
$this
->
LE
;
$body
.=
$this
->
GetBoundary
(
$this
->
boundary
[
2
],
''
,
'text/html'
,
''
)
.
$this
->
LE
;
// Create the HTML body
$body
.=
$this
->
EncodeString
(
$this
->
Body
,
$this
->
Encoding
);
$body
.=
$this
->
LE
.
$this
->
LE
;
$body
.=
$this
->
EndBoundary
(
$this
->
boundary
[
2
]);
$body
.=
$this
->
AttachAll
();
break
;
}
if
(
$this
->
IsError
())
{
$body
=
''
;
}
elseif
(
$this
->
sign_key_file
)
{
try
{
$file
=
tempnam
(
''
,
'mail'
);
file_put_contents
(
$file
,
$body
);
//TODO check this worked
$signed
=
tempnam
(
""
,
"signed"
);
if
(
@
openssl_pkcs7_sign
(
$file
,
$signed
,
"file://"
.
$this
->
sign_cert_file
,
array
(
"file://"
.
$this
->
sign_key_file
,
$this
->
sign_key_pass
),
NULL
))
{
@
unlink
(
$file
);
@
unlink
(
$signed
);
$body
=
file_get_contents
(
$signed
);
}
else
{
@
unlink
(
$file
);
@
unlink
(
$signed
);
throw
new
phpmailerException
(
$this
->
Lang
(
"signing"
)
.
openssl_error_string
());
}
}
catch
(
phpmailerException
$e
)
{
$body
=
''
;
if
(
$this
->
exceptions
)
{
throw
$e
;
}
}
}
return
$body
;
}
/**
* Returns the start of a message boundary.
* @access private
*/
private
function
GetBoundary
(
$boundary
,
$charSet
,
$contentType
,
$encoding
)
{
$result
=
''
;
if
(
$charSet
==
''
)
{
$charSet
=
$this
->
CharSet
;
}
if
(
$contentType
==
''
)
{
$contentType
=
$this
->
ContentType
;
}
if
(
$encoding
==
''
)
{
$encoding
=
$this
->
Encoding
;
}
$result
.=
$this
->
TextLine
(
'--'
.
$boundary
);
$result
.=
sprintf
(
"Content-Type: %s; charset =
\"
%s
\"
"
,
$contentType
,
$charSet
);
$result
.=
$this
->
LE
;
$result
.=
$this
->
HeaderLine
(
'Content-Transfer-Encoding'
,
$encoding
);
$result
.=
$this
->
LE
;
return
$result
;
}
/**
* Returns the end of a message boundary.
* @access private
*/
private
function
EndBoundary
(
$boundary
)
{
return
$this
->
LE
.
'--'
.
$boundary
.
'--'
.
$this
->
LE
;
}
/**
* Sets the message type.
* @access private
* @return void
*/
private
function
SetMessageType
()
{
if
(
count
(
$this
->
attachment
)
<
1
&&
strlen
(
$this
->
AltBody
)
<
1
)
{
$this
->
message_type
=
'plain'
;
}
else
{
if
(
count
(
$this
->
attachment
)
>
0
)
{
$this
->
message_type
=
'attachments'
;
}
if
(
strlen
(
$this
->
AltBody
)
>
0
&&
count
(
$this
->
attachment
)
<
1
)
{
$this
->
message_type
=
'alt'
;
}
if
(
strlen
(
$this
->
AltBody
)
>
0
&&
count
(
$this
->
attachment
)
>
0
)
{
$this
->
message_type
=
'alt_attachments'
;
}
}
}
/**
* Returns a formatted header line.
* @access public
* @return string
*/
public
function
HeaderLine
(
$name
,
$value
)
{
return
$name
.
': '
.
$value
.
$this
->
LE
;
}
/**
* Returns a formatted mail line.
* @access public
* @return string
*/
public
function
TextLine
(
$value
)
{
return
$value
.
$this
->
LE
;
}
/////////////////////////////////////////////////
// CLASS METHODS, ATTACHMENTS
/////////////////////////////////////////////////
/**
* Adds an attachment from a path on the filesystem.
* Returns false if the file could not be found
* or accessed.
* @param string $path Path to the attachment.
* @param string $name Overrides the attachment name.
* @param string $encoding File encoding (see $Encoding).
* @param string $type File extension (MIME) type.
* @return bool
*/
public
function
AddAttachment
(
$path
,
$name
=
''
,
$encoding
=
'base64'
,
$type
=
'application/octet-stream'
)
{
try
{
if
(
!@
is_file
(
$path
)
)
{
throw
new
phpmailerException
(
$this
->
Lang
(
'file_access'
)
.
$path
,
self
::
STOP_CONTINUE
);
}
$filename
=
basename
(
$path
);
if
(
$name
==
''
)
{
$name
=
$filename
;
}
$this
->
attachment
[]
=
array
(
0
=>
$path
,
1
=>
$filename
,
2
=>
$name
,
3
=>
$encoding
,
4
=>
$type
,
5
=>
false
,
// isStringAttachment
6
=>
'attachment'
,
7
=>
0
);
}
catch
(
phpmailerException
$e
)
{
$this
->
SetError
(
$e
->
getMessage
());
if
(
$this
->
exceptions
)
{
throw
$e
;
}
echo
$e
->
getMessage
()
.
"
\n
"
;
if
(
$e
->
getCode
()
==
self
::
STOP_CRITICAL
)
{
return
false
;
}
}
return
true
;
}
/**
* Return the current array of attachments
* @return array
*/
public
function
GetAttachments
()
{
return
$this
->
attachment
;
}
/**
* Attaches all fs, string, and binary attachments to the message.
* Returns an empty string on failure.
* @access private
* @return string
*/
private
function
AttachAll
()
{
// Return text of body
$mime
=
array
();
$cidUniq
=
array
();
$incl
=
array
();
// Add all attachments
foreach
(
$this
->
attachment
as
$attachment
)
{
// Check for string attachment
$bString
=
$attachment
[
5
];
if
(
$bString
)
{
$string
=
$attachment
[
0
];
}
else
{
$path
=
$attachment
[
0
];
}
if
(
in_array
(
$attachment
[
0
],
$incl
))
{
continue
;
}
$filename
=
$attachment
[
1
];
$name
=
$attachment
[
2
];
$encoding
=
$attachment
[
3
];
$type
=
$attachment
[
4
];
$disposition
=
$attachment
[
6
];
$cid
=
$attachment
[
7
];
$incl
[]
=
$attachment
[
0
];
if
(
$disposition
==
'inline'
&&
isset
(
$cidUniq
[
$cid
])
)
{
continue
;
}
$cidUniq
[
$cid
]
=
true
;
$mime
[]
=
sprintf
(
"--%s%s"
,
$this
->
boundary
[
1
],
$this
->
LE
);
$mime
[]
=
sprintf
(
"Content-Type: %s; name=
\"
%s
\"
%s"
,
$type
,
$this
->
EncodeHeader
(
$this
->
SecureHeader
(
$name
)),
$this
->
LE
);
$mime
[]
=
sprintf
(
"Content-Transfer-Encoding: %s%s"
,
$encoding
,
$this
->
LE
);
if
(
$disposition
==
'inline'
)
{
$mime
[]
=
sprintf
(
"Content-ID: <%s>%s"
,
$cid
,
$this
->
LE
);
}
$mime
[]
=
sprintf
(
"Content-Disposition: %s; filename=
\"
%s
\"
%s"
,
$disposition
,
$this
->
EncodeHeader
(
$this
->
SecureHeader
(
$name
)),
$this
->
LE
.
$this
->
LE
);
// Encode as string attachment
if
(
$bString
)
{
$mime
[]
=
$this
->
EncodeString
(
$string
,
$encoding
);
if
(
$this
->
IsError
())
{
return
''
;
}
$mime
[]
=
$this
->
LE
.
$this
->
LE
;
}
else
{
$mime
[]
=
$this
->
EncodeFile
(
$path
,
$encoding
);
if
(
$this
->
IsError
())
{
return
''
;
}
$mime
[]
=
$this
->
LE
.
$this
->
LE
;
}
}
$mime
[]
=
sprintf
(
"--%s--%s"
,
$this
->
boundary
[
1
],
$this
->
LE
);
return
join
(
''
,
$mime
);
}
/**
* Encodes attachment in requested format.
* Returns an empty string on failure.
* @param string $path The full path to the file
* @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
* @see EncodeFile()
* @access private
* @return string
*/
private
function
EncodeFile
(
$path
,
$encoding
=
'base64'
)
{
try
{
if
(
!
is_readable
(
$path
))
{
throw
new
phpmailerException
(
$this
->
Lang
(
'file_open'
)
.
$path
,
self
::
STOP_CONTINUE
);
}
if
(
function_exists
(
'get_magic_quotes'
))
{
function
get_magic_quotes
()
{
return
false
;
}
}
if
(
PHP_VERSION
<
6
)
{
$magic_quotes
=
get_magic_quotes_runtime
();
set_magic_quotes_runtime
(
0
);
}
$file_buffer
=
file_get_contents
(
$path
);
$file_buffer
=
$this
->
EncodeString
(
$file_buffer
,
$encoding
);
if
(
PHP_VERSION
<
6
)
{
set_magic_quotes_runtime
(
$magic_quotes
);
}
return
$file_buffer
;
}
catch
(
Exception
$e
)
{
$this
->
SetError
(
$e
->
getMessage
());
return
''
;
}
}
/**
* Encodes string to requested format.
* Returns an empty string on failure.
* @param string $str The text to encode
* @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
* @access public
* @return string
*/
public
function
EncodeString
(
$str
,
$encoding
=
'base64'
)
{
$encoded
=
''
;
switch
(
strtolower
(
$encoding
))
{
case
'base64'
:
$encoded
=
chunk_split
(
base64_encode
(
$str
),
76
,
$this
->
LE
);
break
;
case
'7bit'
:
case
'8bit'
:
$encoded
=
$this
->
FixEOL
(
$str
);
//Make sure it ends with a line break
if
(
substr
(
$encoded
,
-
(
strlen
(
$this
->
LE
)))
!=
$this
->
LE
)
$encoded
.=
$this
->
LE
;
break
;
case
'binary'
:
$encoded
=
$str
;
break
;
case
'quoted-printable'
:
$encoded
=
$this
->
EncodeQP
(
$str
);
break
;
default
:
$this
->
SetError
(
$this
->
Lang
(
'encoding'
)
.
$encoding
);
break
;
}
return
$encoded
;
}
/**
* Encode a header string to best (shortest) of Q, B, quoted or none.
* @access public
* @return string
*/
public
function
EncodeHeader
(
$str
,
$position
=
'text'
)
{
$x
=
0
;
switch
(
strtolower
(
$position
))
{
case
'phrase'
:
if
(
!
preg_match
(
'/[\200-\377]/'
,
$str
))
{
// Can't use addslashes as we don't know what value has magic_quotes_sybase
$encoded
=
addcslashes
(
$str
,
"
\0
..
\37\177\\\"
"
);
if
((
$str
==
$encoded
)
&&
!
preg_match
(
'/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/'
,
$str
))
{
return
(
$encoded
);
}
else
{
return
(
"
\"
$encoded
\"
"
);
}
}
$x
=
preg_match_all
(
'/[^\040\041\043-\133\135-\176]/'
,
$str
,
$matches
);
break
;
case
'comment'
:
$x
=
preg_match_all
(
'/[()"]/'
,
$str
,
$matches
);
// Fall-through
case
'text'
:
default
:
$x
+=
preg_match_all
(
'/[\000-\010\013\014\016-\037\177-\377]/'
,
$str
,
$matches
);
break
;
}
if
(
$x
==
0
)
{
return
(
$str
);
}
$maxlen
=
75
-
7
-
strlen
(
$this
->
CharSet
);
// Try to select the encoding which should produce the shortest output
if
(
strlen
(
$str
)
/
3
<
$x
)
{
$encoding
=
'B'
;
if
(
function_exists
(
'mb_strlen'
)
&&
$this
->
HasMultiBytes
(
$str
))
{
// Use a custom function which correctly encodes and wraps long
// multibyte strings without breaking lines within a character
$encoded
=
$this
->
Base64EncodeWrapMB
(
$str
);
}
else
{
$encoded
=
base64_encode
(
$str
);
$maxlen
-=
$maxlen
%
4
;
$encoded
=
trim
(
chunk_split
(
$encoded
,
$maxlen
,
"
\n
"
));
}
}
else
{
$encoding
=
'Q'
;
$encoded
=
$this
->
EncodeQ
(
$str
,
$position
);
$encoded
=
$this
->
WrapText
(
$encoded
,
$maxlen
,
true
);
$encoded
=
str_replace
(
'='
.
$this
->
LE
,
"
\n
"
,
trim
(
$encoded
));
}
$encoded
=
preg_replace
(
'/^(.*)$/m'
,
" =?"
.
$this
->
CharSet
.
"?
$encoding
?
\\
1?="
,
$encoded
);
$encoded
=
trim
(
str_replace
(
"
\n
"
,
$this
->
LE
,
$encoded
));
return
$encoded
;
}
/**
* Checks if a string contains multibyte characters.
* @access public
* @param string $str multi-byte text to wrap encode
* @return bool
*/
public
function
HasMultiBytes
(
$str
)
{
if
(
function_exists
(
'mb_strlen'
))
{
return
(
strlen
(
$str
)
>
mb_strlen
(
$str
,
$this
->
CharSet
));
}
else
{
// Assume no multibytes (we can't handle without mbstring functions anyway)
return
false
;
}
}
/**
* Correctly encodes and wraps long multibyte strings for mail headers
* without breaking lines within a character.
* Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php
* @access public
* @param string $str multi-byte text to wrap encode
* @return string
*/
public
function
Base64EncodeWrapMB
(
$str
)
{
$start
=
"=?"
.
$this
->
CharSet
.
"?B?"
;
$end
=
"?="
;
$encoded
=
""
;
$mb_length
=
mb_strlen
(
$str
,
$this
->
CharSet
);
// Each line must have length <= 75, including $start and $end
$length
=
75
-
strlen
(
$start
)
-
strlen
(
$end
);
// Average multi-byte ratio
$ratio
=
$mb_length
/
strlen
(
$str
);
// Base64 has a 4:3 ratio
$offset
=
$avgLength
=
floor
(
$length
*
$ratio
*
.
75
);
for
(
$i
=
0
;
$i
<
$mb_length
;
$i
+=
$offset
)
{
$lookBack
=
0
;
do
{
$offset
=
$avgLength
-
$lookBack
;
$chunk
=
mb_substr
(
$str
,
$i
,
$offset
,
$this
->
CharSet
);
$chunk
=
base64_encode
(
$chunk
);
$lookBack
++
;
}
while
(
strlen
(
$chunk
)
>
$length
);
$encoded
.=
$chunk
.
$this
->
LE
;
}
// Chomp the last linefeed
$encoded
=
substr
(
$encoded
,
0
,
-
strlen
(
$this
->
LE
));
return
$encoded
;
}
/**
* Encode string to quoted-printable.
* Only uses standard PHP, slow, but will always work
* @access public
* @param string $string the text to encode
* @param integer $line_max Number of chars allowed on a line before wrapping
* @return string
*/
public
function
EncodeQPphp
(
$input
=
''
,
$line_max
=
76
,
$space_conv
=
false
)
{
$hex
=
array
(
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
);
$lines
=
preg_split
(
'/(?:\r\n|\r|\n)/'
,
$input
);
$eol
=
"
\r\n
"
;
$escape
=
'='
;
$output
=
''
;
while
(
list
(,
$line
)
=
each
(
$lines
)
)
{
$linlen
=
strlen
(
$line
);
$newline
=
''
;
for
(
$i
=
0
;
$i
<
$linlen
;
$i
++
)
{
$c
=
substr
(
$line
,
$i
,
1
);
$dec
=
ord
(
$c
);
if
(
(
$i
==
0
)
&&
(
$dec
==
46
)
)
{
// convert first point in the line into =2E
$c
=
'=2E'
;
}
if
(
$dec
==
32
)
{
if
(
$i
==
(
$linlen
-
1
)
)
{
// convert space at eol only
$c
=
'=20'
;
}
else
if
(
$space_conv
)
{
$c
=
'=20'
;
}
}
elseif
(
(
$dec
==
61
)
||
(
$dec
<
32
)
||
(
$dec
>
126
)
)
{
// always encode "\t", which is *not* required
$h2
=
floor
(
$dec
/
16
);
$h1
=
floor
(
$dec
%
16
);
$c
=
$escape
.
$hex
[
$h2
]
.
$hex
[
$h1
];
}
if
(
(
strlen
(
$newline
)
+
strlen
(
$c
))
>=
$line_max
)
{
// CRLF is not counted
$output
.=
$newline
.
$escape
.
$eol
;
// soft line break; " =\r\n" is okay
$newline
=
''
;
// check if newline first character will be point or not
if
(
$dec
==
46
)
{
$c
=
'=2E'
;
}
}
$newline
.=
$c
;
}
// end of for
$output
.=
$newline
.
$eol
;
}
// end of while
return
$output
;
}
/**
* Encode string to RFC2045 (6.7) quoted-printable format
* Uses a PHP5 stream filter to do the encoding about 64x faster than the old version
* Also results in same content as you started with after decoding
* @see EncodeQPphp()
* @access public
* @param string $string the text to encode
* @param integer $line_max Number of chars allowed on a line before wrapping
* @param boolean $space_conv Dummy param for compatibility with existing EncodeQP function
* @return string
* @author Marcus Bointon
*/
public
function
EncodeQP
(
$string
,
$line_max
=
76
,
$space_conv
=
false
)
{
if
(
function_exists
(
'quoted_printable_encode'
))
{
//Use native function if it's available (>= PHP5.3)
return
quoted_printable_encode
(
$string
);
}
$filters
=
stream_get_filters
();
if
(
!
in_array
(
'convert.*'
,
$filters
))
{
//Got convert stream filter?
return
$this
->
EncodeQPphp
(
$string
,
$line_max
,
$space_conv
);
//Fall back to old implementation
}
$fp
=
fopen
(
'php://temp/'
,
'r+'
);
$string
=
preg_replace
(
'/\r\n?/'
,
$this
->
LE
,
$string
);
//Normalise line breaks
$params
=
array
(
'line-length'
=>
$line_max
,
'line-break-chars'
=>
$this
->
LE
);
$s
=
stream_filter_append
(
$fp
,
'convert.quoted-printable-encode'
,
STREAM_FILTER_READ
,
$params
);
fputs
(
$fp
,
$string
);
rewind
(
$fp
);
$out
=
stream_get_contents
(
$fp
);
stream_filter_remove
(
$s
);
$out
=
preg_replace
(
'/^\./m'
,
'=2E'
,
$out
);
//Encode . if it is first char on a line, workaround for bug in Exchange
fclose
(
$fp
);
return
$out
;
}
/**
* Encode string to q encoding.
* @link http://tools.ietf.org/html/rfc2047
* @param string $str the text to encode
* @param string $position Where the text is going to be used, see the RFC for what that means
* @access public
* @return string
*/
public
function
EncodeQ
(
$str
,
$position
=
'text'
)
{
// There should not be any EOL in the string
$encoded
=
preg_replace
(
'/[\r\n]*/'
,
''
,
$str
);
switch
(
strtolower
(
$position
))
{
case
'phrase'
:
$encoded
=
preg_replace
(
"/([^A-Za-z0-9!*+\/ -])/e"
,
"'='.sprintf('%02X', ord('
\\
1'))"
,
$encoded
);
break
;
case
'comment'
:
$encoded
=
preg_replace
(
"/([\(\)
\"
])/e"
,
"'='.sprintf('%02X', ord('
\\
1'))"
,
$encoded
);
case
'text'
:
default
:
// Replace every high ascii, control =, ? and _ characters
//TODO using /e (equivalent to eval()) is probably not a good idea
$encoded
=
preg_replace
(
'/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e'
,
"'='.sprintf('%02X', ord('
\\
1'))"
,
$encoded
);
break
;
}
// Replace every spaces to _ (more readable than =20)
$encoded
=
str_replace
(
' '
,
'_'
,
$encoded
);
return
$encoded
;
}
/**
* Adds a string or binary attachment (non-filesystem) to the list.
* This method can be used to attach ascii or binary data,
* such as a BLOB record from a database.
* @param string $string String attachment data.
* @param string $filename Name of the attachment.
* @param string $encoding File encoding (see $Encoding).
* @param string $type File extension (MIME) type.
* @return void
*/
public
function
AddStringAttachment
(
$string
,
$filename
,
$encoding
=
'base64'
,
$type
=
'application/octet-stream'
)
{
// Append to $attachment array
$this
->
attachment
[]
=
array
(
0
=>
$string
,
1
=>
$filename
,
2
=>
basename
(
$filename
),
3
=>
$encoding
,
4
=>
$type
,
5
=>
true
,
// isStringAttachment
6
=>
'attachment'
,
7
=>
0
);
}
/**
* Adds an embedded attachment. This can include images, sounds, and
* just about any other document. Make sure to set the $type to an
* image type. For JPEG images use "image/jpeg" and for GIF images
* use "image/gif".
* @param string $path Path to the attachment.
* @param string $cid Content ID of the attachment. Use this to identify
* the Id for accessing the image in an HTML form.
* @param string $name Overrides the attachment name.
* @param string $encoding File encoding (see $Encoding).
* @param string $type File extension (MIME) type.
* @return bool
*/
public
function
AddEmbeddedImage
(
$path
,
$cid
,
$name
=
''
,
$encoding
=
'base64'
,
$type
=
'application/octet-stream'
)
{
if
(
!@
is_file
(
$path
)
)
{
$this
->
SetError
(
$this
->
Lang
(
'file_access'
)
.
$path
);
return
false
;
}
$filename
=
basename
(
$path
);
if
(
$name
==
''
)
{
$name
=
$filename
;
}
// Append to $attachment array
$this
->
attachment
[]
=
array
(
0
=>
$path
,
1
=>
$filename
,
2
=>
$name
,
3
=>
$encoding
,
4
=>
$type
,
5
=>
false
,
// isStringAttachment
6
=>
'inline'
,
7
=>
$cid
);
return
true
;
}
/**
* Returns true if an inline attachment is present.
* @access public
* @return bool
*/
public
function
InlineImageExists
()
{
foreach
(
$this
->
attachment
as
$attachment
)
{
if
(
$attachment
[
6
]
==
'inline'
)
{
return
true
;
}
}
return
false
;
}
/////////////////////////////////////////////////
// CLASS METHODS, MESSAGE RESET
/////////////////////////////////////////////////
/**
* Clears all recipients assigned in the TO array. Returns void.
* @return void
*/
public
function
ClearAddresses
()
{
foreach
(
$this
->
to
as
$to
)
{
unset
(
$this
->
all_recipients
[
strtolower
(
$to
[
0
])]);
}
$this
->
to
=
array
();
}
/**
* Clears all recipients assigned in the CC array. Returns void.
* @return void
*/
public
function
ClearCCs
()
{
foreach
(
$this
->
cc
as
$cc
)
{
unset
(
$this
->
all_recipients
[
strtolower
(
$cc
[
0
])]);
}
$this
->
cc
=
array
();
}
/**
* Clears all recipients assigned in the BCC array. Returns void.
* @return void
*/
public
function
ClearBCCs
()
{
foreach
(
$this
->
bcc
as
$bcc
)
{
unset
(
$this
->
all_recipients
[
strtolower
(
$bcc
[
0
])]);
}
$this
->
bcc
=
array
();
}
/**
* Clears all recipients assigned in the ReplyTo array. Returns void.
* @return void
*/
public
function
ClearReplyTos
()
{
$this
->
ReplyTo
=
array
();
}
/**
* Clears all recipients assigned in the TO, CC and BCC
* array. Returns void.
* @return void
*/
public
function
ClearAllRecipients
()
{
$this
->
to
=
array
();
$this
->
cc
=
array
();
$this
->
bcc
=
array
();
$this
->
all_recipients
=
array
();
}
/**
* Clears all previously set filesystem, string, and binary
* attachments. Returns void.
* @return void
*/
public
function
ClearAttachments
()
{
$this
->
attachment
=
array
();
}
/**
* Clears all custom headers. Returns void.
* @return void
*/
public
function
ClearCustomHeaders
()
{
$this
->
CustomHeader
=
array
();
}
/////////////////////////////////////////////////
// CLASS METHODS, MISCELLANEOUS
/////////////////////////////////////////////////
/**
* Adds the error message to the error container.
* @access protected
* @return void
*/
protected
function
SetError
(
$msg
)
{
$this
->
error_count
++
;
$this
->
ErrorInfo
=
$msg
;
}
/**
* Returns the proper RFC 822 formatted date.
* @access public
* @return string
* @static
*/
public
static
function
RFCDate
()
{
$tz
=
date
(
'Z'
);
$tzs
=
(
$tz
<
0
)
?
'-'
:
'+'
;
$tz
=
abs
(
$tz
);
$tz
=
(
int
)(
$tz
/
3600
)
*
100
+
(
$tz
%
3600
)
/
60
;
$result
=
sprintf
(
"%s %s%04d"
,
date
(
'D, j M Y H:i:s'
),
$tzs
,
$tz
);
return
$result
;
}
/**
* Returns the server hostname or 'localhost.localdomain' if unknown.
* @access private
* @return string
*/
private
function
ServerHostname
()
{
if
(
!
empty
(
$this
->
Hostname
))
{
$result
=
$this
->
Hostname
;
}
elseif
(
isset
(
$_SERVER
[
'SERVER_NAME'
]))
{
$result
=
$_SERVER
[
'SERVER_NAME'
];
}
else
{
$result
=
'localhost.localdomain'
;
}
return
$result
;
}
/**
* Returns a message in the appropriate language.
* @access private
* @return string
*/
private
function
Lang
(
$key
)
{
if
(
count
(
$this
->
language
)
<
1
)
{
$this
->
SetLanguage
(
'en'
);
// set the default language
}
if
(
isset
(
$this
->
language
[
$key
]))
{
return
$this
->
language
[
$key
];
}
else
{
return
'Language string failed to load: '
.
$key
;
}
}
/**
* Returns true if an error occurred.
* @access public
* @return bool
*/
public
function
IsError
()
{
return
(
$this
->
error_count
>
0
);
}
/**
* Changes every end of line from CR or LF to CRLF.
* @access private
* @return string
*/
private
function
FixEOL
(
$str
)
{
$str
=
str_replace
(
"
\r\n
"
,
"
\n
"
,
$str
);
$str
=
str_replace
(
"
\r
"
,
"
\n
"
,
$str
);
$str
=
str_replace
(
"
\n
"
,
$this
->
LE
,
$str
);
return
$str
;
}
/**
* Adds a custom header.
* @access public
* @return void
*/
public
function
AddCustomHeader
(
$custom_header
)
{
$this
->
CustomHeader
[]
=
explode
(
':'
,
$custom_header
,
2
);
}
/**
* Evaluates the message and returns modifications for inline images and backgrounds
* @access public
* @return $message
*/
public
function
MsgHTML
(
$message
,
$basedir
=
''
)
{
preg_match_all
(
"/(src|background)=
\"
(.*)
\"
/Ui"
,
$message
,
$images
);
if
(
isset
(
$images
[
2
]))
{
foreach
(
$images
[
2
]
as
$i
=>
$url
)
{
// do not change urls for absolute images (thanks to corvuscorax)
if
(
!
preg_match
(
'#^[A-z]+://#'
,
$url
))
{
$filename
=
basename
(
$url
);
$directory
=
dirname
(
$url
);
(
$directory
==
'.'
)
?
$directory
=
''
:
''
;
$cid
=
'cid:'
.
md5
(
$filename
);
$ext
=
pathinfo
(
$filename
,
PATHINFO_EXTENSION
);
$mimeType
=
self
::
_mime_types
(
$ext
);
if
(
strlen
(
$basedir
)
>
1
&&
substr
(
$basedir
,
-
1
)
!=
'/'
)
{
$basedir
.=
'/'
;
}
if
(
strlen
(
$directory
)
>
1
&&
substr
(
$directory
,
-
1
)
!=
'/'
)
{
$directory
.=
'/'
;
}
if
(
$this
->
AddEmbeddedImage
(
$basedir
.
$directory
.
$filename
,
md5
(
$filename
),
$filename
,
'base64'
,
$mimeType
)
)
{
$message
=
preg_replace
(
"/"
.
$images
[
1
][
$i
]
.
"=
\"
"
.
preg_quote
(
$url
,
'/'
)
.
"
\"
/Ui"
,
$images
[
1
][
$i
]
.
"=
\"
"
.
$cid
.
"
\"
"
,
$message
);
}
}
}
}
$this
->
IsHTML
(
true
);
$this
->
Body
=
$message
;
$textMsg
=
trim
(
strip_tags
(
preg_replace
(
'/<(head|title|style|script)[^>]*>.*?<\/\\1>/s'
,
''
,
$message
)));
if
(
!
empty
(
$textMsg
)
&&
empty
(
$this
->
AltBody
))
{
$this
->
AltBody
=
html_entity_decode
(
$textMsg
);
}
if
(
empty
(
$this
->
AltBody
))
{
$this
->
AltBody
=
'To view this email message, open it in a program that understands HTML!'
.
"
\n\n
"
;
}
}
/**
* Gets the MIME type of the embedded or inline image
* @param string File extension
* @access public
* @return string MIME type of ext
* @static
*/
public
static
function
_mime_types
(
$ext
=
''
)
{
$mimes
=
array
(
'hqx'
=>
'application/mac-binhex40'
,
'cpt'
=>
'application/mac-compactpro'
,
'doc'
=>
'application/msword'
,
'bin'
=>
'application/macbinary'
,
'dms'
=>
'application/octet-stream'
,
'lha'
=>
'application/octet-stream'
,
'lzh'
=>
'application/octet-stream'
,
'exe'
=>
'application/octet-stream'
,
'class'
=>
'application/octet-stream'
,
'psd'
=>
'application/octet-stream'
,
'so'
=>
'application/octet-stream'
,
'sea'
=>
'application/octet-stream'
,
'dll'
=>
'application/octet-stream'
,
'oda'
=>
'application/oda'
,
'pdf'
=>
'application/pdf'
,
'ai'
=>
'application/postscript'
,
'eps'
=>
'application/postscript'
,
'ps'
=>
'application/postscript'
,
'smi'
=>
'application/smil'
,
'smil'
=>
'application/smil'
,
'mif'
=>
'application/vnd.mif'
,
'xls'
=>
'application/vnd.ms-excel'
,
'ppt'
=>
'application/vnd.ms-powerpoint'
,
'wbxml'
=>
'application/vnd.wap.wbxml'
,
'wmlc'
=>
'application/vnd.wap.wmlc'
,
'dcr'
=>
'application/x-director'
,
'dir'
=>
'application/x-director'
,
'dxr'
=>
'application/x-director'
,
'dvi'
=>
'application/x-dvi'
,
'gtar'
=>
'application/x-gtar'
,
'php'
=>
'application/x-httpd-php'
,
'php4'
=>
'application/x-httpd-php'
,
'php3'
=>
'application/x-httpd-php'
,
'phtml'
=>
'application/x-httpd-php'
,
'phps'
=>
'application/x-httpd-php-source'
,
'js'
=>
'application/x-javascript'
,
'swf'
=>
'application/x-shockwave-flash'
,
'sit'
=>
'application/x-stuffit'
,
'tar'
=>
'application/x-tar'
,
'tgz'
=>
'application/x-tar'
,
'xhtml'
=>
'application/xhtml+xml'
,
'xht'
=>
'application/xhtml+xml'
,
'zip'
=>
'application/zip'
,
'mid'
=>
'audio/midi'
,
'midi'
=>
'audio/midi'
,
'mpga'
=>
'audio/mpeg'
,
'mp2'
=>
'audio/mpeg'
,
'mp3'
=>
'audio/mpeg'
,
'aif'
=>
'audio/x-aiff'
,
'aiff'
=>
'audio/x-aiff'
,
'aifc'
=>
'audio/x-aiff'
,
'ram'
=>
'audio/x-pn-realaudio'
,
'rm'
=>
'audio/x-pn-realaudio'
,
'rpm'
=>
'audio/x-pn-realaudio-plugin'
,
'ra'
=>
'audio/x-realaudio'
,
'rv'
=>
'video/vnd.rn-realvideo'
,
'wav'
=>
'audio/x-wav'
,
'bmp'
=>
'image/bmp'
,
'gif'
=>
'image/gif'
,
'jpeg'
=>
'image/jpeg'
,
'jpg'
=>
'image/jpeg'
,
'jpe'
=>
'image/jpeg'
,
'png'
=>
'image/png'
,
'tiff'
=>
'image/tiff'
,
'tif'
=>
'image/tiff'
,
'css'
=>
'text/css'
,
'html'
=>
'text/html'
,
'htm'
=>
'text/html'
,
'shtml'
=>
'text/html'
,
'txt'
=>
'text/plain'
,
'text'
=>
'text/plain'
,
'log'
=>
'text/plain'
,
'rtx'
=>
'text/richtext'
,
'rtf'
=>
'text/rtf'
,
'xml'
=>
'text/xml'
,
'xsl'
=>
'text/xml'
,
'mpeg'
=>
'video/mpeg'
,
'mpg'
=>
'video/mpeg'
,
'mpe'
=>
'video/mpeg'
,
'qt'
=>
'video/quicktime'
,
'mov'
=>
'video/quicktime'
,
'avi'
=>
'video/x-msvideo'
,
'movie'
=>
'video/x-sgi-movie'
,
'doc'
=>
'application/msword'
,
'word'
=>
'application/msword'
,
'xl'
=>
'application/excel'
,
'eml'
=>
'message/rfc822'
);
return
(
!
isset
(
$mimes
[
strtolower
(
$ext
)]))
?
'application/octet-stream'
:
$mimes
[
strtolower
(
$ext
)];
}
/**
* Set (or reset) Class Objects (variables)
*
* Usage Example:
* $page->set('X-Priority', '3');
*
* @access public
* @param string $name Parameter Name
* @param mixed $value Parameter Value
* NOTE: will not work with arrays, there are no arrays to set/reset
* @todo Should this not be using __set() magic function?
*/
public
function
set
(
$name
,
$value
=
''
)
{
try
{
if
(
isset
(
$this
->
$name
)
)
{
$this
->
$name
=
$value
;
}
else
{
throw
new
phpmailerException
(
$this
->
Lang
(
'variable_set'
)
.
$name
,
self
::
STOP_CRITICAL
);
}
}
catch
(
Exception
$e
)
{
$this
->
SetError
(
$e
->
getMessage
());
if
(
$e
->
getCode
()
==
self
::
STOP_CRITICAL
)
{
return
false
;
}
}
return
true
;
}
/**
* Strips newlines to prevent header injection.
* @access public
* @param string $str String
* @return string
*/
public
function
SecureHeader
(
$str
)
{
$str
=
str_replace
(
"
\r
"
,
''
,
$str
);
$str
=
str_replace
(
"
\n
"
,
''
,
$str
);
return
trim
(
$str
);
}
/**
* Set the private key file and password to sign the message.
*
* @access public
* @param string $key_filename Parameter File Name
* @param string $key_pass Password for private key
*/
public
function
Sign
(
$cert_filename
,
$key_filename
,
$key_pass
)
{
$this
->
sign_cert_file
=
$cert_filename
;
$this
->
sign_key_file
=
$key_filename
;
$this
->
sign_key_pass
=
$key_pass
;
}
/**
* Set the private key file and password to sign the message.
*
* @access public
* @param string $key_filename Parameter File Name
* @param string $key_pass Password for private key
*/
public
function
DKIM_QP
(
$txt
)
{
$tmp
=
""
;
$line
=
""
;
for
(
$i
=
0
;
$i
<
strlen
(
$txt
);
$i
++
)
{
$ord
=
ord
(
$txt
[
$i
]);
if
(
((
0x21
<=
$ord
)
&&
(
$ord
<=
0x3A
))
||
$ord
==
0x3C
||
((
0x3E
<=
$ord
)
&&
(
$ord
<=
0x7E
))
)
{
$line
.=
$txt
[
$i
];
}
else
{
$line
.=
"="
.
sprintf
(
"%02X"
,
$ord
);
}
}
return
$line
;
}
/**
* Generate DKIM signature
*
* @access public
* @param string $s Header
*/
public
function
DKIM_Sign
(
$s
)
{
$privKeyStr
=
file_get_contents
(
$this
->
DKIM_private
);
if
(
$this
->
DKIM_passphrase
!=
''
)
{
$privKey
=
openssl_pkey_get_private
(
$privKeyStr
,
$this
->
DKIM_passphrase
);
}
else
{
$privKey
=
$privKeyStr
;
}
if
(
openssl_sign
(
$s
,
$signature
,
$privKey
))
{
return
base64_encode
(
$signature
);
}
}
/**
* Generate DKIM Canonicalization Header
*
* @access public
* @param string $s Header
*/
public
function
DKIM_HeaderC
(
$s
)
{
$s
=
preg_replace
(
"/
\r\n
\s+/"
,
" "
,
$s
);
$lines
=
explode
(
"
\r\n
"
,
$s
);
foreach
(
$lines
as
$key
=>
$line
)
{
list
(
$heading
,
$value
)
=
explode
(
":"
,
$line
,
2
);
$heading
=
strtolower
(
$heading
);
$value
=
preg_replace
(
"/\s+/"
,
" "
,
$value
)
;
// Compress useless spaces
$lines
[
$key
]
=
$heading
.
":"
.
trim
(
$value
)
;
// Don't forget to remove WSP around the value
}
$s
=
implode
(
"
\r\n
"
,
$lines
);
return
$s
;
}
/**
* Generate DKIM Canonicalization Body
*
* @access public
* @param string $body Message Body
*/
public
function
DKIM_BodyC
(
$body
)
{
if
(
$body
==
''
)
return
"
\r\n
"
;
// stabilize line endings
$body
=
str_replace
(
"
\r\n
"
,
"
\n
"
,
$body
);
$body
=
str_replace
(
"
\n
"
,
"
\r\n
"
,
$body
);
// END stabilize line endings
while
(
substr
(
$body
,
strlen
(
$body
)
-
4
,
4
)
==
"
\r\n\r\n
"
)
{
$body
=
substr
(
$body
,
0
,
strlen
(
$body
)
-
2
);
}
return
$body
;
}
/**
* Create the DKIM header, body, as new header
*
* @access public
* @param string $headers_line Header lines
* @param string $subject Subject
* @param string $body Body
*/
public
function
DKIM_Add
(
$headers_line
,
$subject
,
$body
)
{
$DKIMsignatureType
=
'rsa-sha1'
;
// Signature & hash algorithms
$DKIMcanonicalization
=
'relaxed/simple'
;
// Canonicalization of header/body
$DKIMquery
=
'dns/txt'
;
// Query method
$DKIMtime
=
time
()
;
// Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
$subject_header
=
"Subject:
$subject
"
;
$headers
=
explode
(
"
\r\n
"
,
$headers_line
);
foreach
(
$headers
as
$header
)
{
if
(
strpos
(
$header
,
'From:'
)
===
0
)
{
$from_header
=
$header
;
}
elseif
(
strpos
(
$header
,
'To:'
)
===
0
)
{
$to_header
=
$header
;
}
}
$from
=
str_replace
(
'|'
,
'=7C'
,
$this
->
DKIM_QP
(
$from_header
));
$to
=
str_replace
(
'|'
,
'=7C'
,
$this
->
DKIM_QP
(
$to_header
));
$subject
=
str_replace
(
'|'
,
'=7C'
,
$this
->
DKIM_QP
(
$subject_header
))
;
// Copied header fields (dkim-quoted-printable
$body
=
$this
->
DKIM_BodyC
(
$body
);
$DKIMlen
=
strlen
(
$body
)
;
// Length of body
$DKIMb64
=
base64_encode
(
pack
(
"H*"
,
sha1
(
$body
)))
;
// Base64 of packed binary SHA-1 hash of body
$ident
=
(
$this
->
DKIM_identity
==
''
)
?
''
:
" i="
.
$this
->
DKIM_identity
.
";"
;
$dkimhdrs
=
"DKIM-Signature: v=1; a="
.
$DKIMsignatureType
.
"; q="
.
$DKIMquery
.
"; l="
.
$DKIMlen
.
"; s="
.
$this
->
DKIM_selector
.
";
\r\n
"
.
"
\t
t="
.
$DKIMtime
.
"; c="
.
$DKIMcanonicalization
.
";
\r\n
"
.
"
\t
h=From:To:Subject;
\r\n
"
.
"
\t
d="
.
$this
->
DKIM_domain
.
";"
.
$ident
.
"
\r\n
"
.
"
\t
z=
$from
\r\n
"
.
"
\t
|
$to
\r\n
"
.
"
\t
|
$subject
;
\r\n
"
.
"
\t
bh="
.
$DKIMb64
.
";
\r\n
"
.
"
\t
b="
;
$toSign
=
$this
->
DKIM_HeaderC
(
$from_header
.
"
\r\n
"
.
$to_header
.
"
\r\n
"
.
$subject_header
.
"
\r\n
"
.
$dkimhdrs
);
$signed
=
$this
->
DKIM_Sign
(
$toSign
);
return
"X-PHPMAILER-DKIM: phpmailer.sourceforge.net
\r\n
"
.
$dkimhdrs
.
$signed
.
"
\r\n
"
;
}
protected
function
doCallback
(
$isSent
,
$to
,
$cc
,
$bcc
,
$subject
,
$body
)
{
if
(
!
empty
(
$this
->
action_function
)
&&
function_exists
(
$this
->
action_function
))
{
$params
=
array
(
$isSent
,
$to
,
$cc
,
$bcc
,
$subject
,
$body
);
call_user_func_array
(
$this
->
action_function
,
$params
);
}
}
}
class
phpmailerException
extends
Exception
{
public
function
errorMessage
()
{
$errorMsg
=
'<strong>'
.
$this
->
getMessage
()
.
"</strong><br />
\n
"
;
return
$errorMsg
;
}
}
?>
\ No newline at end of file
software/davstorage/templates/main.cf.in
0 → 100644
View file @
72e10a30
# Global Postfix configuration file. This file lists only a subset
# of all parameters. For the syntax, and for a complete parameter
# list, see the postconf(5) manual page (command: "man 5 postconf").
#
# For common configuration examples, see BASIC_CONFIGURATION_README
# and STANDARD_CONFIGURATION_README. To find these documents, use
# the command "postconf html_directory readme_directory", or go to
# http://www.postfix.org/.
#
# For best results, change no more than 2-3 parameters at a time,
# and test if Postfix still works after every change.
# SOFT BOUNCE
#
# The soft_bounce parameter provides a limited safety net for
# testing. When soft_bounce is enabled, mail will remain queued that
# would otherwise bounce. This parameter disables locally-generated
# bounces, and prevents the SMTP server from rejecting mail permanently
# (by changing 5xx replies into 4xx replies). However, soft_bounce
# is no cure for address rewriting mistakes or mail routing mistakes.
#
#soft_bounce = no
# LOCAL PATHNAME INFORMATION
#
# The queue_directory specifies the location of the Postfix queue.
# This is also the root directory of Postfix daemons that run chrooted.
# See the files in examples/chroot-setup for setting up Postfix chroot
# environments on different UNIX systems.
#
queue_directory = ${:queue-directory}
# The command_directory parameter specifies the location of all
# postXXX commands.
#
command_directory = ${:command-directory}
# The daemon_directory parameter specifies the location of all Postfix
# daemon programs (i.e. programs listed in the master.cf file). This
# directory must be owned by root.
#
daemon_directory = ${:daemon-directory}
# The data_directory parameter specifies the location of Postfix-writable
# data files (caches, random numbers). This directory must be owned
# by the mail_owner account (see below).
#
data_directory = ${:data-directory}
# QUEUE AND PROCESS OWNERSHIP
#
# The mail_owner parameter specifies the owner of the Postfix queue
# and of most Postfix daemon processes. Specify the name of a user
# account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS
# AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM. In
# particular, don't specify nobody or daemon. PLEASE USE A DEDICATED
# USER.
#
mail_owner = ${:mail-owner}
# The default_privs parameter specifies the default rights used by
# the local delivery agent for delivery to external file or command.
# These rights are used in the absence of a recipient user context.
# DO NOT SPECIFY A PRIVILEGED USER OR THE POSTFIX OWNER.
#
#default_privs = nobody
# INTERNET HOST AND DOMAIN NAMES
#
# The myhostname parameter specifies the internet hostname of this
# mail system. The default is to use the fully-qualified domain name
# from gethostname(). $myhostname is used as a default value for many
# other configuration parameters.
#
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
# $mydomain is used as a default value for many other configuration
# parameters.
#
#mydomain = domain.tld
# SENDING MAIL
#
# The myorigin parameter specifies the domain that locally-posted
# mail appears to come from. The default is to append $myhostname,
# which is fine for small sites. If you run a domain with multiple
# machines, you should (1) change this to $mydomain and (2) set up
# a domain-wide alias database that aliases each user to
# user@that.users.mailhost.
#
# For the sake of consistency between sender and recipient addresses,
# myorigin also specifies the default domain name that is appended
# to recipient addresses that have no @domain part.
#
#myorigin = $myhostname
#myorigin = $mydomain
# RECEIVING MAIL
# The inet_interfaces parameter specifies the network interface
# addresses that this mail system receives mail on. By default,
# the software claims all active interfaces on the machine. The
# parameter also controls delivery of mail to user@[ip.address].
#
# See also the proxy_interfaces parameter, for network addresses that
# are forwarded to us via a proxy or network address translator.
#
# Note: you need to stop/start Postfix when this parameter changes.
#
#inet_interfaces = all
inet_interfaces = ${:ipv4}
#inet_interfaces = $myhostname, localhost
# The proxy_interfaces parameter specifies the network interface
# addresses that this mail system receives mail on by way of a
# proxy or network address translation unit. This setting extends
# the address list specified with the inet_interfaces parameter.
#
# You must specify your proxy/NAT addresses when your system is a
# backup MX host for other domains, otherwise mail delivery loops
# will happen when the primary MX host is down.
#
#proxy_interfaces =
#proxy_interfaces = 1.2.3.4
# The mydestination parameter specifies the list of domains that this
# machine considers itself the final destination for.
#
# These domains are routed to the delivery agent specified with the
# local_transport parameter setting. By default, that is the UNIX
# compatible delivery agent that lookups all recipients in /etc/passwd
# and /etc/aliases or their equivalent.
#
# The default is $myhostname + localhost.$mydomain. On a mail domain
# gateway, you should also include $mydomain.
#
# Do not specify the names of virtual domains - those domains are
# specified elsewhere (see VIRTUAL_README).
#
# Do not specify the names of domains that this machine is backup MX
# host for. Specify those names via the relay_domains settings for
# the SMTP server, or use permit_mx_backup if you are lazy (see
# STANDARD_CONFIGURATION_README).
#
# The local machine is always the final destination for mail addressed
# to user@[the.net.work.address] of an interface that the mail system
# receives mail on (see the inet_interfaces parameter).
#
# Specify a list of host or domain names, /file/name or type:table
# patterns, separated by commas and/or whitespace. A /file/name
# pattern is replaced by its contents; a type:table is matched when
# a name matches a lookup key (the right-hand side is ignored).
# Continue long lines by starting the next line with whitespace.
#
# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
#
#mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
# mail.$mydomain, www.$mydomain, ftp.$mydomain
# REJECTING MAIL FOR UNKNOWN LOCAL USERS
#
# The local_recipient_maps parameter specifies optional lookup tables
# with all names or addresses of users that are local with respect
# to $mydestination, $inet_interfaces or $proxy_interfaces.
#
# If this parameter is defined, then the SMTP server will reject
# mail for unknown local users. This parameter is defined by default.
#
# To turn off local recipient checking in the SMTP server, specify
# local_recipient_maps = (i.e. empty).
#
# The default setting assumes that you use the default Postfix local
# delivery agent for local delivery. You need to update the
# local_recipient_maps setting if:
#
# - You define $mydestination domain recipients in files other than
# /etc/passwd, /etc/aliases, or the $virtual_alias_maps files.
# For example, you define $mydestination domain recipients in
# the $virtual_mailbox_maps files.
#
# - You redefine the local delivery agent in master.cf.
#
# - You redefine the "local_transport" setting in main.cf.
#
# - You use the "luser_relay", "mailbox_transport", or "fallback_transport"
# feature of the Postfix local delivery agent (see local(8)).
#
# Details are described in the LOCAL_RECIPIENT_README file.
#
# Beware: if the Postfix SMTP server runs chrooted, you probably have
# to access the passwd file via the proxymap service, in order to
# overcome chroot restrictions. The alternative, having a copy of
# the system passwd file in the chroot jail is just not practical.
#
# The right-hand side of the lookup tables is conveniently ignored.
# In the left-hand side, specify a bare username, an @domain.tld
# wild-card, or specify a user@domain.tld address.
#
#local_recipient_maps = unix:passwd.byname $alias_maps
#local_recipient_maps = proxy:unix:passwd.byname $alias_maps
#local_recipient_maps =
# The unknown_local_recipient_reject_code specifies the SMTP server
# response code when a recipient domain matches $mydestination or
# $proxy/$inet_interfaces, while $local_recipient_maps is non-empty
# and the recipient address or address local-part is not found.
#
# The default setting is 550 (reject mail) but it is safer to start
# with 450 (try again later) until you are certain that your
# local_recipient_maps settings are OK.
#
unknown_local_recipient_reject_code = 550
# TRUST AND RELAY CONTROL
# The mynetworks parameter specifies the list of "trusted" SMTP
# clients that have more privileges than "strangers".
#
# In particular, "trusted" SMTP clients are allowed to relay mail
# through Postfix. See the smtpd_recipient_restrictions parameter
# in postconf(5).
#
# You can specify the list of "trusted" network addresses by hand
# or you can let Postfix do it for you (which is the default).
#
# By default (mynetworks_style = subnet), Postfix "trusts" SMTP
# clients in the same IP subnetworks as the local machine.
# On Linux, this does works correctly only with interfaces specified
# with the "ifconfig" command.
#
# Specify "mynetworks_style = class" when Postfix should "trust" SMTP
# clients in the same IP class A/B/C networks as the local machine.
# Don't do this with a dialup site - it would cause Postfix to "trust"
# your entire provider's network. Instead, specify an explicit
# mynetworks list by hand, as described below.
#
# Specify "mynetworks_style = host" when Postfix should "trust"
# only the local machine.
#
#mynetworks_style = class
#mynetworks_style = subnet
#mynetworks_style = host
# Alternatively, you can specify the mynetworks list by hand, in
# which case Postfix ignores the mynetworks_style setting.
#
# Specify an explicit list of network/netmask patterns, where the
# mask specifies the number of bits in the network part of a host
# address.
#
# You can also specify the absolute pathname of a pattern file instead
# of listing the patterns here. Specify type:table for table-based lookups
# (the value on the table right-hand side is not used).
#
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
# The relay_domains parameter restricts what destinations this system will
# relay mail to. See the smtpd_recipient_restrictions description in
# postconf(5) for detailed information.
#
# By default, Postfix relays mail
# - from "trusted" clients (IP address matches $mynetworks) to any destination,
# - from "untrusted" clients to destinations that match $relay_domains or
# subdomains thereof, except addresses with sender-specified routing.
# The default relay_domains value is $mydestination.
#
# In addition to the above, the Postfix SMTP server by default accepts mail
# that Postfix is final destination for:
# - destinations that match $inet_interfaces or $proxy_interfaces,
# - destinations that match $mydestination
# - destinations that match $virtual_alias_domains,
# - destinations that match $virtual_mailbox_domains.
# These destinations do not need to be listed in $relay_domains.
#
# Specify a list of hosts or domains, /file/name patterns or type:name
# lookup tables, separated by commas and/or whitespace. Continue
# long lines by starting the next line with whitespace. A file name
# is replaced by its contents; a type:name table is matched when a
# (parent) domain appears as lookup key.
#
# NOTE: Postfix will not automatically forward mail for domains that
# list this system as their primary or backup MX host. See the
# permit_mx_backup restriction description in postconf(5).
#
#relay_domains = $mydestination
# INTERNET OR INTRANET
# The relayhost parameter specifies the default host to send mail to
# when no entry is matched in the optional transport(5) table. When
# no relayhost is given, mail is routed directly to the destination.
#
# On an intranet, specify the organizational domain name. If your
# internal DNS uses no MX records, specify the name of the intranet
# gateway host instead.
#
# In the case of SMTP, specify a domain, host, host:port, [host]:port,
# [address] or [address]:port; the form [host] turns off MX lookups.
#
# If you're connected via UUCP, see also the default_transport parameter.
#
#relayhost = $mydomain
#relayhost = [gateway.my.domain]
#relayhost = [mailserver.isp.tld]
#relayhost = uucphost
#relayhost = [an.ip.add.ress]
# REJECTING UNKNOWN RELAY USERS
#
# The relay_recipient_maps parameter specifies optional lookup tables
# with all addresses in the domains that match $relay_domains.
#
# If this parameter is defined, then the SMTP server will reject
# mail for unknown relay users. This feature is off by default.
#
# The right-hand side of the lookup tables is conveniently ignored.
# In the left-hand side, specify an @domain.tld wild-card, or specify
# a user@domain.tld address.
#
#relay_recipient_maps = hash:/etc/postfix/relay_recipients
# INPUT RATE CONTROL
#
# The in_flow_delay configuration parameter implements mail input
# flow control. This feature is turned on by default, although it
# still needs further development (it's disabled on SCO UNIX due
# to an SCO bug).
#
# A Postfix process will pause for $in_flow_delay seconds before
# accepting a new message, when the message arrival rate exceeds the
# message delivery rate. With the default 100 SMTP server process
# limit, this limits the mail inflow to 100 messages a second more
# than the number of messages delivered per second.
#
# Specify 0 to disable the feature. Valid delays are 0..10.
#
#in_flow_delay = 1s
# ADDRESS REWRITING
#
# The ADDRESS_REWRITING_README document gives information about
# address masquerading or other forms of address rewriting including
# username->Firstname.Lastname mapping.
# ADDRESS REDIRECTION (VIRTUAL DOMAIN)
#
# The VIRTUAL_README document gives information about the many forms
# of domain hosting that Postfix supports.
# "USER HAS MOVED" BOUNCE MESSAGES
#
# See the discussion in the ADDRESS_REWRITING_README document.
# TRANSPORT MAP
#
# See the discussion in the ADDRESS_REWRITING_README document.
# ALIAS DATABASE
#
# The alias_maps parameter specifies the list of alias databases used
# by the local delivery agent. The default list is system dependent.
#
# On systems with NIS, the default is to search the local alias
# database, then the NIS alias database. See aliases(5) for syntax
# details.
#
# If you change the alias database, run "postalias /etc/aliases" (or
# wherever your system stores the mail alias file), or simply run
# "newaliases" to build the necessary DBM or DB file.
#
# It will take a minute or so before changes become visible. Use
# "postfix reload" to eliminate the delay.
#
#alias_maps = dbm:/etc/aliases
#alias_maps = hash:/etc/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases
# The alias_database parameter specifies the alias database(s) that
# are built with "newaliases" or "sendmail -bi". This is a separate
# configuration parameter, because alias_maps (see above) may specify
# tables that are not necessarily all under control by Postfix.
#
#alias_database = dbm:/etc/aliases
#alias_database = dbm:/etc/mail/aliases
#alias_database = hash:/etc/aliases
#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases
# ADDRESS EXTENSIONS (e.g., user+foo)
#
# The recipient_delimiter parameter specifies the separator between
# user names and address extensions (user+foo). See canonical(5),
# local(8), relocated(5) and virtual(5) for the effects this has on
# aliases, canonical, virtual, relocated and .forward file lookups.
# Basically, the software tries user+foo and .forward+foo before
# trying user and .forward.
#
#recipient_delimiter = +
# DELIVERY TO MAILBOX
#
# The home_mailbox parameter specifies the optional pathname of a
# mailbox file relative to a user's home directory. The default
# mailbox file is /var/spool/mail/user or /var/mail/user. Specify
# "Maildir/" for qmail-style delivery (the / is required).
#
#home_mailbox = Mailbox
#home_mailbox = Maildir/
# The mail_spool_directory parameter specifies the directory where
# UNIX-style mailboxes are kept. The default setting depends on the
# system type.
#
#mail_spool_directory = /var/mail
#mail_spool_directory = /var/spool/mail
# The mailbox_command parameter specifies the optional external
# command to use instead of mailbox delivery. The command is run as
# the recipient with proper HOME, SHELL and LOGNAME environment settings.
# Exception: delivery for root is done as $default_user.
#
# Other environment variables of interest: USER (recipient username),
# EXTENSION (address extension), DOMAIN (domain part of address),
# and LOCAL (the address localpart).
#
# Unlike other Postfix configuration parameters, the mailbox_command
# parameter is not subjected to $parameter substitutions. This is to
# make it easier to specify shell syntax (see example below).
#
# Avoid shell meta characters because they will force Postfix to run
# an expensive shell process. Procmail alone is expensive enough.
#
# IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN
# ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER.
#
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
# The mailbox_transport specifies the optional transport in master.cf
# to use after processing aliases and .forward files. This parameter
# has precedence over the mailbox_command, fallback_transport and
# luser_relay parameters.
#
# Specify a string of the form transport:nexthop, where transport is
# the name of a mail delivery transport defined in master.cf. The
# :nexthop part is optional. For more details see the sample transport
# configuration file.
#
# NOTE: if you use this feature for accounts not in the UNIX password
# file, then you must update the "local_recipient_maps" setting in
# the main.cf file, otherwise the SMTP server will reject mail for
# non-UNIX accounts with "User unknown in local recipient table".
#
# Cyrus IMAP over LMTP. Specify ``lmtpunix cmd="lmtpd"
# listen="/var/imap/socket/lmtp" prefork=0'' in cyrus.conf.
#mailbox_transport = lmtp:unix:/var/imap/socket/lmtp
#
# Cyrus IMAP via command line. Uncomment the "cyrus...pipe" and
# subsequent line in master.cf.
#mailbox_transport = cyrus
# The fallback_transport specifies the optional transport in master.cf
# to use for recipients that are not found in the UNIX passwd database.
# This parameter has precedence over the luser_relay parameter.
#
# Specify a string of the form transport:nexthop, where transport is
# the name of a mail delivery transport defined in master.cf. The
# :nexthop part is optional. For more details see the sample transport
# configuration file.
#
# NOTE: if you use this feature for accounts not in the UNIX password
# file, then you must update the "local_recipient_maps" setting in
# the main.cf file, otherwise the SMTP server will reject mail for
# non-UNIX accounts with "User unknown in local recipient table".
#
#fallback_transport = lmtp:unix:/file/name
#fallback_transport = cyrus
#fallback_transport =
# The luser_relay parameter specifies an optional destination address
# for unknown recipients. By default, mail for unknown@$mydestination,
# unknown@[$inet_interfaces] or unknown@[$proxy_interfaces] is returned
# as undeliverable.
#
# The following expansions are done on luser_relay: $user (recipient
# username), $shell (recipient shell), $home (recipient home directory),
# $recipient (full recipient address), $extension (recipient address
# extension), $domain (recipient domain), $local (entire recipient
# localpart), $recipient_delimiter. Specify $name?value or
# $name:value to expand value only when $name does (does not) exist.
#
# luser_relay works only for the default Postfix local delivery agent.
#
# NOTE: if you use this feature for accounts not in the UNIX password
# file, then you must specify "local_recipient_maps =" (i.e. empty) in
# the main.cf file, otherwise the SMTP server will reject mail for
# non-UNIX accounts with "User unknown in local recipient table".
#
#luser_relay = $user@other.host
#luser_relay = $local@other.host
#luser_relay = admin+$local
# JUNK MAIL CONTROLS
#
# The controls listed here are only a very small subset. The file
# SMTPD_ACCESS_README provides an overview.
# The header_checks parameter specifies an optional table with patterns
# that each logical message header is matched against, including
# headers that span multiple physical lines.
#
# By default, these patterns also apply to MIME headers and to the
# headers of attached messages. With older Postfix versions, MIME and
# attached message headers were treated as body text.
#
# For details, see "man header_checks".
#
#header_checks = regexp:/etc/postfix/header_checks
# FAST ETRN SERVICE
#
# Postfix maintains per-destination logfiles with information about
# deferred mail, so that mail can be flushed quickly with the SMTP
# "ETRN domain.tld" command, or by executing "sendmail -qRdomain.tld".
# See the ETRN_README document for a detailed description.
#
# The fast_flush_domains parameter controls what destinations are
# eligible for this service. By default, they are all domains that
# this server is willing to relay mail to.
#
#fast_flush_domains = $relay_domains
# SHOW SOFTWARE VERSION OR NOT
#
# The smtpd_banner parameter specifies the text that follows the 220
# code in the SMTP server's greeting banner. Some people like to see
# the mail version advertised. By default, Postfix shows no version.
#
# You MUST specify $myhostname at the start of the text. That is an
# RFC requirement. Postfix itself does not care.
#
#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
# PARALLEL DELIVERY TO THE SAME DESTINATION
#
# How many parallel deliveries to the same user or domain? With local
# delivery, it does not make sense to do massively parallel delivery
# to the same user, because mailbox updates must happen sequentially,
# and expensive pipelines in .forward files can cause disasters when
# too many are run at the same time. With SMTP deliveries, 10
# simultaneous connections to the same domain could be sufficient to
# raise eyebrows.
#
# Each message delivery transport has its XXX_destination_concurrency_limit
# parameter. The default is $default_destination_concurrency_limit for
# most delivery transports. For the local delivery agent the default is 2.
#local_destination_concurrency_limit = 2
#default_destination_concurrency_limit = 20
# DEBUGGING CONTROL
#
# The debug_peer_level parameter specifies the increment in verbose
# logging level when an SMTP client or server host name or address
# matches a pattern in the debug_peer_list parameter.
#
debug_peer_level = 2
# The debug_peer_list parameter specifies an optional list of domain
# or network patterns, /file/name patterns or type:name tables. When
# an SMTP client or server host name or address matches a pattern,
# increase the verbose logging level by the amount specified in the
# debug_peer_level parameter.
#
#debug_peer_list = 127.0.0.1
#debug_peer_list = some.domain
# The debugger_command specifies the external command that is executed
# when a Postfix daemon program is run with the -D option.
#
# Use "command .. & sleep 5" so that the debugger can attach before
# the process marches on. If you use an X-based debugger, be sure to
# set up your XAUTHORITY environment variable before starting Postfix.
#
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
# If you can't use X, use this to capture the call stack when a
# daemon crashes. The result is in a file in the configuration
# directory, and is named after the process name and the process ID.
#
# debugger_command =
# PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont;
# echo where) | gdb $daemon_directory/$process_name $process_id 2>&1
# >$config_directory/$process_name.$process_id.log & sleep 5
#
# Another possibility is to run gdb under a detached screen session.
# To attach to the screen sesssion, su root and run "screen -r
# <id_string>" where <id_string> uniquely matches one of the detached
# sessions (from "screen -list").
#
# debugger_command =
# PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH; screen
# -dmS $process_name gdb $daemon_directory/$process_name
# $process_id & sleep 1
# INSTALL-TIME CONFIGURATION INFORMATION
#
# The following parameters are used when installing a new Postfix version.
#
# sendmail_path: The full pathname of the Postfix sendmail command.
# This is the Sendmail-compatible mail posting interface.
#
sendmail_path = ${:command-directory}/sendmail
# newaliases_path: The full pathname of the Postfix newaliases command.
# This is the Sendmail-compatible command to build alias databases.
#
newaliases_path = ${:bin-directory}/newaliases
# mailq_path: The full pathname of the Postfix mailq command. This
# is the Sendmail-compatible mail queue listing command.
#
mailq_path = ${:bin-directory}/mailq
# setgid_group: The group for mail submission and queue management
# commands. This must be a group name with a numerical group ID that
# is not shared with other accounts, not even with the Postfix account.
#
setgid_group = ${:mail-group}
# html_directory: The location of the Postfix HTML documentation.
#
html_directory = no
# manpage_directory: The location of the Postfix on-line manual pages.
#
manpage_directory = /usr/local/man
# sample_directory: The location of the Postfix sample configuration files.
# This parameter is obsolete as of Postfix 2.1.
#
sample_directory = /etc/postfix
# readme_directory: The location of the Postfix README files.
#
readme_directory = no
inet_protocols = all
software/davstorage/templates/master.cf.in
0 → 100644
View file @
72e10a30
#
# Postfix master process configuration file. For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
${:port} inet n - n - - smtpd
#smtp inet n - n - 1 postscreen
#smtpd pass - - n - - smtpd
#dnsblog unix - - n - 0 dnsblog
#tlsproxy unix - - n - 0 tlsproxy
#submission inet n - n - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
#smtps inet n - n - - smtpd
# -o syslog_name=postfix/smtps
# -o smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
#628 inet n - n - - qmqpd
pickup unix n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr unix n - n 300 1 qmgr
#qmgr unix n - n 300 1 oqmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
# -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent. See the pipe(8) man page for information about $recipient
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
#maildrop unix - n n - - pipe
# flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d $recipient
#
# ====================================================================
#
# Recent Cyrus versions can use the existing "lmtp" master.cf entry.
#
# Specify in cyrus.conf:
# lmtp cmd="lmtpd -a" listen="localhost:lmtp" proto=tcp4
#
# Specify in main.cf one or more of the following:
# mailbox_transport = lmtp:inet:localhost
# virtual_transport = lmtp:inet:localhost
#
# ====================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Also specify in main.cf: cyrus_destination_recipient_limit=1
#
#cyrus unix - n n - - pipe
# user=cyrus argv=/cyrus/bin/deliver -e -r $sender -m $extension $user
#
# ====================================================================
#
# Old example of delivery via Cyrus.
#
#old-cyrus unix - n n - - pipe
# flags=R user=cyrus argv=/cyrus/bin/deliver -e -m $extension $user
#
# ====================================================================
#
# See the Postfix UUCP_README file for configuration details.
#
#uucp unix - n n - - pipe
# flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# ====================================================================
#
# Other external delivery methods.
#
#ifmail unix - n n - - pipe
# flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
#
#bsmtp unix - n n - - pipe
# flags=Fq. user=bsmtp argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient
#
#scalemail-backend unix - n n - 2 pipe
# flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store
# $nexthop $user $extension
#
#mailman unix - n n - - pipe
# flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
# $nexthop $user
software/davstorage/templates/postfix.in
0 → 100644
View file @
72e10a30
#!/bin/sh
${
:postfix-location
}
-c
${
:postfix-config-dir
}
start
\ No newline at end of file
software/davstorage/templates/sendmail.in
0 → 100644
View file @
72e10a30
#!/bin/sh
${
:sendmail-location
}
-C
${
:postfix-config-dir
}
$*
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment