From cb22798fe0aceeb0c102338ec692a0d69cc32ae6 Mon Sep 17 00:00:00 2001 From: JoshyPHP Date: Tue, 17 Oct 2017 01:58:27 +0200 Subject: [PATCH 001/148] [ticket/15410] Remove obsolete code from BBCodes ACP PHPBB3-15410 --- phpBB/includes/acp/acp_bbcodes.php | 159 +---------------------------- 1 file changed, 5 insertions(+), 154 deletions(-) diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php index 7153a8ec70..81b48c50bd 100644 --- a/phpBB/includes/acp/acp_bbcodes.php +++ b/phpBB/includes/acp/acp_bbcodes.php @@ -417,144 +417,7 @@ class acp_bbcodes function build_regexp(&$bbcode_match, &$bbcode_tpl) { $bbcode_match = trim($bbcode_match); - $bbcode_tpl = trim($bbcode_tpl); - - // Allow unicode characters for URL|LOCAL_URL|RELATIVE_URL|INTTEXT tokens - $utf8 = preg_match('/(URL|LOCAL_URL|RELATIVE_URL|INTTEXT)/', $bbcode_match); - - $fp_match = preg_quote($bbcode_match, '!'); - $fp_replace = preg_replace('#^\[(.*?)\]#', '[$1:$uid]', $bbcode_match); - $fp_replace = preg_replace('#\[/(.*?)\]$#', '[/$1:$uid]', $fp_replace); - - $sp_match = preg_quote($bbcode_match, '!'); - $sp_match = preg_replace('#^\\\\\[(.*?)\\\\\]#', '\[$1:$uid\]', $sp_match); - $sp_match = preg_replace('#\\\\\[/(.*?)\\\\\]$#', '\[/$1:$uid\]', $sp_match); - $sp_replace = $bbcode_tpl; - - // @todo Make sure to change this too if something changed in message parsing - $tokens = array( - 'URL' => array( - '!(?:(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('url')) . ')|(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('www_url')) . '))!ie' => "\$this->bbcode_specialchars(('\$1') ? '\$1' : 'http://\$2')" - ), - 'LOCAL_URL' => array( - '!(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')!e' => "\$this->bbcode_specialchars('$1')" - ), - 'RELATIVE_URL' => array( - '!(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')!e' => "\$this->bbcode_specialchars('$1')" - ), - 'EMAIL' => array( - '!(' . get_preg_expression('email') . ')!ie' => "\$this->bbcode_specialchars('$1')" - ), - 'TEXT' => array( - '!(.*?)!es' => "str_replace(array(\"\\r\\n\", '\\\"', '\\'', '(', ')'), array(\"\\n\", '\"', ''', '(', ')'), trim('\$1'))" - ), - 'SIMPLETEXT' => array( - '!([a-zA-Z0-9-+.,_ ]+)!' => "$1" - ), - 'INTTEXT' => array( - '!([\p{L}\p{N}\-+,_. ]+)!u' => "$1" - ), - 'IDENTIFIER' => array( - '!([a-zA-Z0-9-_]+)!' => "$1" - ), - 'COLOR' => array( - '!([a-z]+|#[0-9abcdef]+)!i' => '$1' - ), - 'NUMBER' => array( - '!([0-9]+)!' => '$1' - ) - ); - - $sp_tokens = array( - 'URL' => '(?i)((?:' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('url')) . ')|(?:' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('www_url')) . '))(?-i)', - 'LOCAL_URL' => '(?i)(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')(?-i)', - 'RELATIVE_URL' => '(?i)(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')(?-i)', - 'EMAIL' => '(' . get_preg_expression('email') . ')', - 'TEXT' => '(.*?)', - 'SIMPLETEXT' => '([a-zA-Z0-9-+.,_ ]+)', - 'INTTEXT' => '([\p{L}\p{N}\-+,_. ]+)', - 'IDENTIFIER' => '([a-zA-Z0-9-_]+)', - 'COLOR' => '([a-zA-Z]+|#[0-9abcdefABCDEF]+)', - 'NUMBER' => '([0-9]+)', - ); - - $pad = 0; - $modifiers = 'i'; - $modifiers .= ($utf8) ? 'u' : ''; - - if (preg_match_all('/\{(' . implode('|', array_keys($tokens)) . ')[0-9]*\}/i', $bbcode_match, $m)) - { - foreach ($m[0] as $n => $token) - { - $token_type = $m[1][$n]; - - reset($tokens[strtoupper($token_type)]); - list($match, $replace) = each($tokens[strtoupper($token_type)]); - - // Pad backreference numbers from tokens - if (preg_match_all('/(?lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); } - $fp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) { - return strtolower($match[0]); - }, $fp_match); - $fp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) { - return strtolower($match[0]); - }, $fp_replace); - $sp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) { - return strtolower($match[0]); - }, $sp_match); - $sp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) { - return strtolower($match[0]); - }, $sp_replace); - return array( 'bbcode_tag' => $bbcode_tag, - 'first_pass_match' => $fp_match, - 'first_pass_replace' => $fp_replace, - 'second_pass_match' => $sp_match, - 'second_pass_replace' => $sp_replace + 'first_pass_match' => '/(?!)/', + 'first_pass_replace' => '', + // Use a non-matching, valid regexp to effectively disable this BBCode + 'second_pass_match' => '/(?!)/', + 'second_pass_replace' => '' ); } } From 02600626ccd56da24216dab816f55d592a3b73d8 Mon Sep 17 00:00:00 2001 From: kasimi Date: Fri, 16 Mar 2018 12:45:28 +0100 Subject: [PATCH 002/148] [ticket/15590] Add events core.acp_bbcodes_(modify_create|delete)_after PHPBB3-15590 --- phpBB/includes/acp/acp_bbcodes.php | 36 +++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php index 2634ae1874..de91c24b52 100644 --- a/phpBB/includes/acp/acp_bbcodes.php +++ b/phpBB/includes/acp/acp_bbcodes.php @@ -295,6 +295,22 @@ class acp_bbcodes $phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_action, false, array($data['bbcode_tag'])); + /** + * Event after a BBCode has been added or updated + * + * @event core.acp_bbcodes_modify_create_after + * @var string action Type of the action: modify|create + * @var int bbcode_id The id of the added or updated bbcode + * @var array sql_ary Array with bbcode data (read only) + * @since 3.2.3-RC1 + */ + $vars = array( + 'action', + 'bbcode_id', + 'sql_ary', + ); + extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_modify_create_after', compact($vars))); + trigger_error($user->lang[$lang] . adm_back_link($this->u_action)); } else @@ -325,10 +341,28 @@ class acp_bbcodes { if (confirm_box(true)) { + $bbcode_tag = $row['bbcode_tag']; + $db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id"); $cache->destroy('sql', BBCODES_TABLE); $phpbb_container->get('text_formatter.cache')->invalidate(); - $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BBCODE_DELETE', false, array($row['bbcode_tag'])); + $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BBCODE_DELETE', false, array($bbcode_tag)); + + /** + * Event after a BBCode has been deleted + * + * @event core.acp_bbcodes_delete_after + * @var string action Type of the action: delete + * @var int bbcode_id The id of the deleted bbcode + * @var string bbcode_tag The tag of the deleted bbcode + * @since 3.2.3-RC1 + */ + $vars = array( + 'action', + 'bbcode_id', + 'bbcode_tag', + ); + extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_delete_after', compact($vars))); if ($request->is_ajax()) { From 1f00f48e717d1a9e82ef627c16353595ddb8ae61 Mon Sep 17 00:00:00 2001 From: Zoddo Date: Mon, 23 Apr 2018 10:49:53 +0200 Subject: [PATCH 003/148] [ticket/13128] Remove deprecated Sphinx options These configuration options are deprecated: * sql_query_info (since sphinx 2.2.2; used only by the "search" command which was removed; wiki need to be updated accordingly) * max_matches (since sphinx 2.2.3; should be set in the sphinx query) * charset_type (since sphinx 2.2.2; sphinx now supports only utf-8) * compat_sphinxql_magics (since sphinx 2.2.1) PHPBB3-13128 --- phpBB/docs/sphinx.sample.conf | 4 ---- phpBB/phpbb/search/fulltext_sphinx.php | 4 ---- 2 files changed, 8 deletions(-) diff --git a/phpBB/docs/sphinx.sample.conf b/phpBB/docs/sphinx.sample.conf index 0a210ecd1a..85cba190d7 100644 --- a/phpBB/docs/sphinx.sample.conf +++ b/phpBB/docs/sphinx.sample.conf @@ -29,7 +29,6 @@ source source_phpbb_{SPHINX_ID}_main AND p.post_id >= $start AND p.post_id <= $end sql_query_post = sql_query_post_index = UPDATE phpbb_sphinx SET max_doc_id = $maxid WHERE counter_id = 1 - sql_query_info = SELECT * FROM phpbb_posts WHERE post_id = $id sql_attr_uint = forum_id sql_attr_uint = topic_id sql_attr_uint = poster_id @@ -72,7 +71,6 @@ index index_phpbb_{SPHINX_ID}_main morphology = none stopwords = min_word_len = 2 - charset_type = utf-8 charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF min_prefix_len = 0 min_infix_len = 0 @@ -88,13 +86,11 @@ indexer } searchd { - compat_sphinxql_magics = 0 listen = localhost:9312 log = {DATA_PATH}/log/searchd.log query_log = {DATA_PATH}/log/sphinx-query.log read_timeout = 5 max_children = 30 pid_file = {DATA_PATH}/searchd.pid - max_matches = 20000 binlog_path = {DATA_PATH} } diff --git a/phpBB/phpbb/search/fulltext_sphinx.php b/phpBB/phpbb/search/fulltext_sphinx.php index e2eeb5f7f3..d780442f89 100644 --- a/phpBB/phpbb/search/fulltext_sphinx.php +++ b/phpBB/phpbb/search/fulltext_sphinx.php @@ -292,7 +292,6 @@ class fulltext_sphinx AND p.post_id >= $start AND p.post_id <= $end'), array('sql_query_post', ''), array('sql_query_post_index', 'UPDATE ' . SPHINX_TABLE . ' SET max_doc_id = $maxid WHERE counter_id = 1'), - array('sql_query_info', 'SELECT * FROM ' . POSTS_TABLE . ' WHERE post_id = $id'), array('sql_attr_uint', 'forum_id'), array('sql_attr_uint', 'topic_id'), array('sql_attr_uint', 'poster_id'), @@ -333,7 +332,6 @@ class fulltext_sphinx array('morphology', 'none'), array('stopwords', ''), array('min_word_len', '2'), - array('charset_type', 'utf-8'), array('charset_table', 'U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF'), array('min_prefix_len', '0'), array('min_infix_len', '0'), @@ -346,14 +344,12 @@ class fulltext_sphinx array('mem_limit', $this->config['fulltext_sphinx_indexer_mem_limit'] . 'M'), ), 'searchd' => array( - array('compat_sphinxql_magics' , '0'), array('listen' , ($this->config['fulltext_sphinx_host'] ? $this->config['fulltext_sphinx_host'] : 'localhost') . ':' . ($this->config['fulltext_sphinx_port'] ? $this->config['fulltext_sphinx_port'] : '9312')), array('log', $this->config['fulltext_sphinx_data_path'] . 'log/searchd.log'), array('query_log', $this->config['fulltext_sphinx_data_path'] . 'log/sphinx-query.log'), array('read_timeout', '5'), array('max_children', '30'), array('pid_file', $this->config['fulltext_sphinx_data_path'] . 'searchd.pid'), - array('max_matches', (string) SPHINX_MAX_MATCHES), array('binlog_path', $this->config['fulltext_sphinx_data_path']), ), ); From 5e70c9b831d7f316132b98ee90b301a8b358b32e Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Mon, 18 Jun 2018 11:58:20 +0200 Subject: [PATCH 004/148] [ticket/15668] Replace .load() with .on('load') PHPBB3-15668 --- phpBB/assets/javascript/core.js | 2 +- phpBB/styles/prosilver/template/forum_fn.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js index bd1925baf6..60021f1ecf 100644 --- a/phpBB/assets/javascript/core.js +++ b/phpBB/assets/javascript/core.js @@ -1644,7 +1644,7 @@ phpbb.lazyLoadAvatars = function loadAvatars() { }); }; -$(window).load(phpbb.lazyLoadAvatars); +$(window).on('load', phpbb.lazyLoadAvatars); /** * Apply code editor to all textarea elements with data-bbcode attribute diff --git a/phpBB/styles/prosilver/template/forum_fn.js b/phpBB/styles/prosilver/template/forum_fn.js index 3f59709ac6..474570e84e 100644 --- a/phpBB/styles/prosilver/template/forum_fn.js +++ b/phpBB/styles/prosilver/template/forum_fn.js @@ -612,7 +612,7 @@ function parseDocument($container) { // If there are any images in the links list, run the check again after they have loaded $linksAll.find('img').each(function() { - $(this).load(function() { + $(this).on('load', function() { check(); }); }); From 5f3898fc5fb61e4d59dbbc30e8cc369073744d08 Mon Sep 17 00:00:00 2001 From: Tristan Darricau Date: Sat, 30 Dec 2017 11:21:57 +0100 Subject: [PATCH 005/148] [ticket/15536] Catalog: adds satis.phpbb.com to repositories Also always installs composer/installers in vendor-ext too. PHPBB3-15536 --- phpBB/phpbb/composer/installer.php | 7 +++- .../data/v330/extensions_composer_2.php | 33 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 phpBB/phpbb/db/migration/data/v330/extensions_composer_2.php diff --git a/phpBB/phpbb/composer/installer.php b/phpBB/phpbb/composer/installer.php index 3a03e29ef5..1bc2c8e6b4 100644 --- a/phpBB/phpbb/composer/installer.php +++ b/phpBB/phpbb/composer/installer.php @@ -471,13 +471,18 @@ class installer $composer = Factory::create($io, null, false); $core_packages = $this->get_core_packages($composer); + + // The composer/installers package must be installed on his own and not provided by the existing autoloader + $core_replace = $core_packages; + unset($core_replace['composer/installers']); + $ext_json_data = [ 'require' => array_merge( ['php' => $this->get_core_php_requirement($composer)], $core_packages, $this->get_extra_dependencies(), $packages), - 'replace' => $core_packages, + 'replace' => $core_replace, 'repositories' => $this->get_composer_repositories(), 'config' => [ 'vendor-dir'=> $this->packages_vendor_dir, diff --git a/phpBB/phpbb/db/migration/data/v330/extensions_composer_2.php b/phpBB/phpbb/db/migration/data/v330/extensions_composer_2.php new file mode 100644 index 0000000000..c6ea7f4c13 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v330/extensions_composer_2.php @@ -0,0 +1,33 @@ + +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v330; + +class extensions_composer_2 extends \phpbb\db\migration\migration +{ + public function update_data() + { + $repositories = json_decode($this->config('exts_composer_repositories'), true); + $repositories[] = 'https://satis.phpbb.com'; + $repositories = array_unique($repositories); + + return array( + array('config.update', array('exts_composer_repositories', json_encode($repositories, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES))), + ); + } + + static public function depends_on() + { + return array('\phpbb\db\migration\data\v330\extensions_composer'); + } +} From 1785b9eb47395abd24be64bacddcf28a5c7ff52b Mon Sep 17 00:00:00 2001 From: kasimi Date: Sun, 8 Jul 2018 20:04:26 +0200 Subject: [PATCH 006/148] [ticket/15590] Add events core.acp_bbcodes_(modify_create|delete)_after PHPBB3-15590 --- phpBB/includes/acp/acp_bbcodes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php index de91c24b52..1f7374a07f 100644 --- a/phpBB/includes/acp/acp_bbcodes.php +++ b/phpBB/includes/acp/acp_bbcodes.php @@ -302,7 +302,7 @@ class acp_bbcodes * @var string action Type of the action: modify|create * @var int bbcode_id The id of the added or updated bbcode * @var array sql_ary Array with bbcode data (read only) - * @since 3.2.3-RC1 + * @since 3.2.4-RC1 */ $vars = array( 'action', @@ -355,7 +355,7 @@ class acp_bbcodes * @var string action Type of the action: delete * @var int bbcode_id The id of the deleted bbcode * @var string bbcode_tag The tag of the deleted bbcode - * @since 3.2.3-RC1 + * @since 3.2.4-RC1 */ $vars = array( 'action', From 5fbd4584be49e416642ca1593084bca15fc60d30 Mon Sep 17 00:00:00 2001 From: Toxyy Date: Mon, 9 Jul 2018 16:54:11 -0400 Subject: [PATCH 007/148] [ticket/15719] Add core events to viewtopic to edit the post_list sql query Event added in viewtopic.php so you can modify post_list sql The query, sql limit, sql start, sort keys and days are editable PHPBB3-15719 --- phpBB/viewtopic.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 3c25c3b037..20316afb32 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -1148,6 +1148,29 @@ $sql = 'SELECT p.post_id " . (($join_user_sql[$sort_key]) ? 'AND u.user_id = p.poster_id': '') . " $limit_posts_time ORDER BY $sql_sort_order"; + +/** +* Event to modify the SQL query that gets post_list +* +* @event core.viewtopic_modify_post_list_sql +* @var string sql The SQL query to generate the post_list +* @var int sql_limit The number of posts the query fetches +* @var int sql_start The index the query starts to fetch from +* @var string sort_key Key the posts are sorted by +* @var string sort_days Display posts of previous x days +* @var int forum_id Forum ID +* @since 3.2.4-RC1 +*/ +$vars = array( + 'sql', + 'sql_limit', + 'sql_start', + 'sort_key', + 'sort_days', + 'forum_id', +); +extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_post_list_sql', compact($vars))); + $result = $db->sql_query_limit($sql, $sql_limit, $sql_start); $i = ($store_reverse) ? $sql_limit - 1 : 0; From ffcfec044b73bfa1b5522499b82b074ee99b3869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Sat, 14 Jul 2018 11:42:32 +0200 Subject: [PATCH 008/148] [ticket/15723] Rewrite gen_rand_string() and gen_rand_string_friendly() PHPBB3-15723 --- phpBB/includes/functions.php | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index cbea7afe6e..51f5bc0fd5 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -73,8 +73,17 @@ function set_var(&$result, $var, $type, $multibyte = false) */ function gen_rand_string($num_chars = 8) { - // [a, z] + [0, 9] = 36 - return substr(strtoupper(base_convert(bin2hex(random_bytes($num_chars + 1)), 16, 36)), 0, $num_chars); + $range = array_merge(range('A', 'Z'), range(0, 9)); + $size = count($range); + + $output = ''; + for ($i = 0; $i < $num_chars; $i++) + { + $rand = random_int(0, $size-1); + $output .= $range[$rand]; + } + + return $output; } /** @@ -88,13 +97,17 @@ function gen_rand_string($num_chars = 8) */ function gen_rand_string_friendly($num_chars = 8) { - $rand_str = bin2hex(random_bytes($num_chars + 1)); + $range = array_merge(range('A', 'N'), range('P', 'Z'), range(1, 9)); + $size = count($range); - // Remove Z and Y from the base_convert(), replace 0 with Z and O with Y - // [a, z] + [0, 9] - {z, y} = [a, z] + [0, 9] - {0, o} = 34 - $rand_str = str_replace(array('0', 'O'), array('Z', 'Y'), strtoupper(base_convert($rand_str, 16, 34))); + $output = ''; + for ($i = 0; $i < $num_chars; $i++) + { + $rand = random_int(0, $size-1); + $output .= $range[$rand]; + } - return substr($rand_str, 0, $num_chars); + return $output; } /** From 12fdfe145af65b26b42a6a9a18134f748264e04d Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Sun, 22 Jul 2018 17:08:35 +0200 Subject: [PATCH 009/148] [ticket/15622] Fix quoting in PMs when BBCodes are disabled Before parsing the private message to be loaded a simple BBCode status check is done to verify that BBCodes are enabled. Depending on that option the quote will be formated as BBCode or as plain text, similarly to what is done in posting.php. PHPBB3-15622 --- phpBB/includes/ucp/ucp_pm_compose.php | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index bf18e76568..e108356584 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -978,7 +978,26 @@ function compose_pm($id, $mode, $action, $user_folders = array()) censor_text($message_parser->message), $quote_attributes ); - $message_parser->message = $message_link . $quote_text . "\n\n"; + if ($bbcode_status) + { + $message_parser->message = $message_link . $quote_text . "\n\n"; + } + else + { + $offset = 0; + $quote_string = "> "; + $message = censor_text(trim($message_parser->message)); + // see if we are nesting. It's easily tricked but should work for one level of nesting + if (strpos($message, ">") !== false) + { + $offset = 10; + } + $message = utf8_wordwrap($message, 75 + $offset, "\n"); + + $message = $quote_string . $message; + $message = str_replace("\n", "\n" . $quote_string, $message); + $message_parser->message = $quote_username . " " . $user->lang['WROTE'] . ":\n" . $message . "\n"; + } } if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !$preview && !$refresh) From 210c5f5a59a9885b2680432e1d9f4fd915548b27 Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Mon, 23 Jul 2018 17:45:48 +0200 Subject: [PATCH 010/148] [ticket/15697] Remove hard coded time check when sending PMs PHPBB3-15697 --- phpBB/includes/ucp/ucp_pm_compose.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index bf18e76568..a8d5b8b402 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -80,7 +80,7 @@ function compose_pm($id, $mode, $action, $user_folders = array()) $group_helper = $phpbb_container->get('group_helper'); // Was cancel pressed? If so then redirect to the appropriate page - if ($cancel || ($current_time - $lastclick < 2 && $submit)) + if ($cancel) { if ($msg_id) { From 7ccecf6f77e363bdb37b4d1e93a8de46743c8069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 10 Jul 2018 08:28:11 +0200 Subject: [PATCH 011/148] [ticket/15413] Login redirect to previous page PHPBB3-15413 --- phpBB/includes/functions.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 7a978553bd..08567a99e7 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4210,7 +4210,8 @@ function page_header($page_title = '', $display_online_list = false, $item_id = } else { - $u_login_logout = append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login'); + $redirect = $request->variable('redirect', rawurlencode($user->page['page'])); + $u_login_logout = append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login&redirect=' . $redirect); $l_login_logout = $user->lang['LOGIN']; } From f0b70512c03a02681c7adccc8a912cfeb75582c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 10 Jul 2018 13:17:04 +0200 Subject: [PATCH 012/148] [ticket/15720] Don't escape ampersands on redirections PHPBB3-15720 --- phpBB/cron.php | 2 +- phpBB/feed.php | 6 +++--- phpBB/report.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/phpBB/cron.php b/phpBB/cron.php index 58261429a2..c99b772487 100644 --- a/phpBB/cron.php +++ b/phpBB/cron.php @@ -31,7 +31,7 @@ $get_params_array = $request->get_super_global(\phpbb\request\request_interface: /** @var \phpbb\controller\helper $controller_helper */ $controller_helper = $phpbb_container->get('controller.helper'); $response = new RedirectResponse( - $controller_helper->route('phpbb_cron_run', $get_params_array), + $controller_helper->route('phpbb_cron_run', $get_params_array, false), 301 ); $response->send(); diff --git a/phpBB/feed.php b/phpBB/feed.php index 1480867d6c..e384489ee9 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -36,17 +36,17 @@ $mode = $request->variable('mode', ''); if ($forum_id !== 0) { - $url = $controller_helper->route('phpbb_feed_forum', array('forum_id' => $forum_id)); + $url = $controller_helper->route('phpbb_feed_forum', array('forum_id' => $forum_id), false); } else if ($topic_id !== 0) { - $url = $controller_helper->route('phpbb_feed_topic', array('topic_id' => $topic_id)); + $url = $controller_helper->route('phpbb_feed_topic', array('topic_id' => $topic_id), false); } else { try { - $url = $controller_helper->route('phpbb_feed_overall', array('mode' => $mode)); + $url = $controller_helper->route('phpbb_feed_overall', array('mode' => $mode), false); } catch (InvalidParameterException $e) { diff --git a/phpBB/report.php b/phpBB/report.php index bb26b972aa..d0d7b3776a 100644 --- a/phpBB/report.php +++ b/phpBB/report.php @@ -35,7 +35,7 @@ $controller_helper = $phpbb_container->get('controller.helper'); $response = new RedirectResponse( $controller_helper->route($redirect_route_name, array( 'id' => ($pm_id === 0) ? $post_id : $pm_id, - )), + ), false), 301 ); $response->send(); From 4ebd582947d44b4fa34e0fd81602a171b744b677 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 26 Jul 2018 15:54:35 +0200 Subject: [PATCH 013/148] [ticket/11500] Remove unnamed input PHPBB3-11500 --- phpBB/adm/style/acp_profile.html | 2 +- tests/functional/acp_profile_field_test.php | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/phpBB/adm/style/acp_profile.html b/phpBB/adm/style/acp_profile.html index bd3935b464..25bf97efd5 100644 --- a/phpBB/adm/style/acp_profile.html +++ b/phpBB/adm/style/acp_profile.html @@ -238,7 +238,7 @@
- + {S_FORM_TOKEN} diff --git a/tests/functional/acp_profile_field_test.php b/tests/functional/acp_profile_field_test.php index 88df782faa..7a0a6ca941 100644 --- a/tests/functional/acp_profile_field_test.php +++ b/tests/functional/acp_profile_field_test.php @@ -28,18 +28,20 @@ class phpbb_functional_acp_profile_field_test extends phpbb_functional_test_case public function data_add_profile_field() { return array( - array('bool', 'profilefields.type.bool', + array('profilefields.type.bool', array( + 'field_ident' => 'bool', + 'lang_name' => 'bool', 'lang_options[0]' => 'foo', 'lang_options[1]' => 'bar', ), - array(), ), - array('dropdown', 'profilefields.type.dropdown', + array('profilefields.type.dropdown', array( + 'field_ident' => 'dropdown', + 'lang_name' => 'dropdown', 'lang_options' => "foo\nbar\nbar\nfoo", ), - array(), ), ); } @@ -47,13 +49,12 @@ class phpbb_functional_acp_profile_field_test extends phpbb_functional_test_case /** * @dataProvider data_add_profile_field */ - public function test_add_profile_field($name, $type, $page1_settings, $page2_settings) + public function test_add_profile_field($type, $page1_settings) { // Custom profile fields page $crawler = self::request('GET', 'adm/index.php?i=acp_profile&mode=profile&sid=' . $this->sid); // these language strings are html $form = $crawler->selectButton('Create new field')->form(array( - 'field_ident' => $name, 'field_type' => $type, )); $crawler = self::submit($form); @@ -63,7 +64,7 @@ class phpbb_functional_acp_profile_field_test extends phpbb_functional_test_case $crawler = self::submit($form); // Fill form for profile field specific options - $form = $crawler->selectButton('Save')->form($page2_settings); + $form = $crawler->selectButton('Save')->form(); $crawler= self::submit($form); $this->assertContainsLang('ADDED_PROFILE_FIELD', $crawler->text()); From 76982b430f8417c5930905f96ea42cd4c34ca6d7 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 26 Jul 2018 15:42:44 +0200 Subject: [PATCH 014/148] [ticket/11453] Improve performance of notification.method.messenger_base PHPBB3-11453 --- phpBB/phpbb/notification/method/messenger_base.php | 4 ++-- phpBB/phpbb/user_loader.php | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/phpBB/phpbb/notification/method/messenger_base.php b/phpBB/phpbb/notification/method/messenger_base.php index 32e79aa936..f82017b70e 100644 --- a/phpBB/phpbb/notification/method/messenger_base.php +++ b/phpBB/phpbb/notification/method/messenger_base.php @@ -87,7 +87,7 @@ abstract class messenger_base extends \phpbb\notification\method\base $banned_users = phpbb_get_banned_user_ids($user_ids); // Load all the users we need - $this->user_loader->load_users($user_ids); + $this->user_loader->load_users(array_diff($user_ids, $banned_users), array(USER_IGNORE)); // Load the messenger if (!class_exists('messenger')) @@ -107,7 +107,7 @@ abstract class messenger_base extends \phpbb\notification\method\base $user = $this->user_loader->get_user($notification->user_id); - if ($user['user_type'] == USER_IGNORE || ($user['user_type'] == USER_INACTIVE && $user['user_inactive_reason'] == INACTIVE_MANUAL) || in_array($notification->user_id, $banned_users)) + if ($user['user_type'] == USER_INACTIVE && $user['user_inactive_reason'] == INACTIVE_MANUAL) { continue; } diff --git a/phpBB/phpbb/user_loader.php b/phpBB/phpbb/user_loader.php index 294f5208d5..9297450f3e 100644 --- a/phpBB/phpbb/user_loader.php +++ b/phpBB/phpbb/user_loader.php @@ -64,8 +64,9 @@ class user_loader * Load user helper * * @param array $user_ids + * @param array $ignore_types user types to ignore */ - public function load_users(array $user_ids) + public function load_users(array $user_ids, array $ignore_types = array()) { $user_ids[] = ANONYMOUS; @@ -79,7 +80,8 @@ class user_loader { $sql = 'SELECT * FROM ' . $this->users_table . ' - WHERE ' . $this->db->sql_in_set('user_id', $user_ids); + WHERE ' . $this->db->sql_in_set('user_id', $user_ids) . ' + AND ' . $this->db->sql_in_set('user_type', $ignore_types, true, true); $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) From e398008624eb68802024357cc9f42476a35a61c4 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 26 Jul 2018 16:34:11 +0200 Subject: [PATCH 015/148] [ticket/11838] OAuth registration from ucp_register PHPBB3-11838 --- phpBB/includes/ucp/ucp_register.php | 25 +++++++++++++++++++ phpBB/language/en/ucp.php | 1 + phpBB/phpbb/auth/provider/oauth/oauth.php | 2 +- .../prosilver/template/ucp_register.html | 11 ++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php index 3c5f4e2826..c6992c2d67 100644 --- a/phpBB/includes/ucp/ucp_register.php +++ b/phpBB/includes/ucp/ucp_register.php @@ -549,6 +549,31 @@ class ucp_register break; } + /* @var $provider_collection \phpbb\auth\provider_collection */ + $provider_collection = $phpbb_container->get('auth.provider_collection'); + $auth_provider = $provider_collection->get_provider(); + + $auth_provider_data = $auth_provider->get_login_data(); + if ($auth_provider_data) + { + if (isset($auth_provider_data['VARS'])) + { + $template->assign_vars($auth_provider_data['VARS']); + } + + if (isset($auth_provider_data['BLOCK_VAR_NAME'])) + { + foreach ($auth_provider_data['BLOCK_VARS'] as $block_vars) + { + $template->assign_block_vars($auth_provider_data['BLOCK_VAR_NAME'], $block_vars); + } + } + + $template->assign_vars(array( + 'PROVIDER_TEMPLATE_FILE' => $auth_provider_data['TEMPLATE_FILE'], + )); + } + // Assign template vars for timezone select phpbb_timezone_select($template, $user, $data['tz'], true); diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 5056e23d24..e8e7791f58 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -446,6 +446,7 @@ $lang = array_merge($lang, array( 'RECIPIENT' => 'Recipient', 'RECIPIENTS' => 'Recipients', 'REGISTRATION' => 'Registration', + 'OAUTH_REGISTRATION' => 'Registration using external services', 'RELEASE_MESSAGES' => '%sRelease all on-hold messages%s… they will be re-sorted into the appropriate folder if enough space is made available.', 'REMOVE_ADDRESS' => 'Remove address', 'REMOVE_SELECTED_BOOKMARKS' => 'Remove selected bookmarks', diff --git a/phpBB/phpbb/auth/provider/oauth/oauth.php b/phpBB/phpbb/auth/provider/oauth/oauth.php index 8809a0c6b4..10c1744b98 100644 --- a/phpBB/phpbb/auth/provider/oauth/oauth.php +++ b/phpBB/phpbb/auth/provider/oauth/oauth.php @@ -392,7 +392,7 @@ class oauth extends \phpbb\auth\provider\base if ($credentials['key'] && $credentials['secret']) { $actual_name = str_replace('auth.provider.oauth.service.', '', $service_name); - $redirect_url = build_url(false) . '&login=external&oauth_service=' . $actual_name; + $redirect_url = generate_board_url() . '/ucp.' . $this->php_ext . '?mode=login&login=external&oauth_service=' . $actual_name; $login_data['BLOCK_VARS'][$service_name] = array( 'REDIRECT_URL' => redirect($redirect_url, true), 'SERVICE_NAME' => $this->user->lang['AUTH_PROVIDER_OAUTH_SERVICE_' . strtoupper($actual_name)], diff --git a/phpBB/styles/prosilver/template/ucp_register.html b/phpBB/styles/prosilver/template/ucp_register.html index bf39990c35..ee8aa319bc 100644 --- a/phpBB/styles/prosilver/template/ucp_register.html +++ b/phpBB/styles/prosilver/template/ucp_register.html @@ -12,6 +12,17 @@ } +
+
+ +

{{ SITENAME }} - {{ lang('OAUTH_REGISTRATION') }}

+ + {% if PROVIDER_TEMPLATE_FILE %} + {% include PROVIDER_TEMPLATE_FILE %} + {% endif %} +
+
+
From 740006ba60a2f5dce6e0aee072f5683f3f47b69a Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Sat, 28 Jul 2018 13:15:31 +0200 Subject: [PATCH 016/148] [ticket/15697] Remove unused variable and corresponding input field PHPBB3-15697 --- phpBB/includes/ucp/ucp_pm_compose.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index a8d5b8b402..2b8468590e 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -48,7 +48,6 @@ function compose_pm($id, $mode, $action, $user_folders = array()) $to_group_id = $request->variable('g', 0); $msg_id = $request->variable('p', 0); $draft_id = $request->variable('d', 0); - $lastclick = $request->variable('lastclick', 0); // Reply to all triggered (quote/reply) $reply_to_all = $request->variable('reply_to_all', 0); @@ -1174,7 +1173,6 @@ function compose_pm($id, $mode, $action, $user_folders = array()) break; } - $s_hidden_fields = ''; $s_hidden_fields .= (isset($check_value)) ? '' : ''; $s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '' : ''; From b2277e7bf688168acfa3097730f556b7218858ac Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Sat, 28 Jul 2018 14:29:37 +0200 Subject: [PATCH 017/148] [ticket/15733] Remove unused code related to deprecated flood control PHPBB3-15733 --- phpBB/posting.php | 6 ------ phpBB/viewtopic.php | 1 - tests/test_framework/phpbb_functional_test_case.php | 4 ---- 3 files changed, 11 deletions(-) diff --git a/phpBB/posting.php b/phpBB/posting.php index 3530bb5048..bf0dfb9c6c 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -33,7 +33,6 @@ $post_id = $request->variable('p', 0); $topic_id = $request->variable('t', 0); $forum_id = $request->variable('f', 0); $draft_id = $request->variable('d', 0); -$lastclick = $request->variable('lastclick', 0); $preview = (isset($_POST['preview'])) ? true : false; $save = (isset($_POST['save'])) ? true : false; @@ -68,7 +67,6 @@ $current_time = time(); * @var int topic_id ID of the topic * @var int forum_id ID of the forum * @var int draft_id ID of the draft -* @var int lastclick Timestamp of when the form was last loaded * @var bool submit Whether or not the form has been submitted * @var bool preview Whether or not the post is being previewed * @var bool save Whether or not a draft is being saved @@ -91,7 +89,6 @@ $vars = array( 'topic_id', 'forum_id', 'draft_id', - 'lastclick', 'submit', 'preview', 'save', @@ -354,7 +351,6 @@ switch ($mode) * @var int topic_id ID of the topic * @var int forum_id ID of the forum * @var int draft_id ID of the draft -* @var int lastclick Timestamp of when the form was last loaded * @var bool submit Whether or not the form has been submitted * @var bool preview Whether or not the post is being previewed * @var bool save Whether or not a draft is being saved @@ -376,7 +372,6 @@ $vars = array( 'topic_id', 'forum_id', 'draft_id', - 'lastclick', 'submit', 'preview', 'save', @@ -1762,7 +1757,6 @@ if ($config['enable_post_confirm'] && !$user->data['is_registered'] && (isset($c } $s_hidden_fields = ($mode == 'reply' || $mode == 'quote') ? '' : ''; -$s_hidden_fields .= ''; $s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '' : ''; if ($mode == 'edit') diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 3c25c3b037..79852330d9 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -2249,7 +2249,6 @@ if ($s_can_vote || $s_quick_reply) $qr_hidden_fields = array( 'topic_cur_post_id' => (int) $topic_data['topic_last_post_id'], - 'lastclick' => (int) time(), 'topic_id' => (int) $topic_data['topic_id'], 'forum_id' => (int) $forum_id, ); diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php index e1daa4558a..12a296a4bf 100644 --- a/tests/test_framework/phpbb_functional_test_case.php +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -1176,10 +1176,6 @@ class phpbb_functional_test_case extends phpbb_test_case } } - // Bypass time restriction that said that if the lastclick time (i.e. time when the form was opened) - // is not at least 2 seconds before submission, cancel the form - $form_data['lastclick'] = 0; - // I use a request because the form submission method does not allow you to send data that is not // contained in one of the actual form fields that the browser sees (i.e. it ignores "hidden" inputs) // Instead, I send it as a request with the submit button "post" set to true. From a7d7dfee9ce8ca070b8fda0df3069aa05fe12ceb Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Sat, 28 Jul 2018 22:22:38 +0200 Subject: [PATCH 018/148] [ticket/15733] Add "changed" tag to the corresponding comment blocks PHPBB3-15733 --- phpBB/posting.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/phpBB/posting.php b/phpBB/posting.php index bf0dfb9c6c..d867c6d67e 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -83,6 +83,7 @@ $current_time = time(); * language keys. * @since 3.1.0-a1 * @changed 3.1.2-RC1 Removed 'delete' var as it does not exist +* @changed 3.2.4 Remove unused 'lastclick' var */ $vars = array( 'post_id', @@ -366,6 +367,7 @@ switch ($mode) * @var array post_data All post data from database * @since 3.1.3-RC1 * @changed 3.1.10-RC1 Added post_data +* @changed 3.2.4 Remove unused 'lastclick' var */ $vars = array( 'post_id', From e710304ef5cd4fb06d83ccb3213c8df7f8b04b36 Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Sun, 29 Jul 2018 11:59:46 +0200 Subject: [PATCH 019/148] [ticket/15733] Correct "changed" tag version to 3.2.4-RC1 PHPBB3-15733 --- phpBB/posting.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/posting.php b/phpBB/posting.php index d867c6d67e..d97a22209f 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -83,7 +83,7 @@ $current_time = time(); * language keys. * @since 3.1.0-a1 * @changed 3.1.2-RC1 Removed 'delete' var as it does not exist -* @changed 3.2.4 Remove unused 'lastclick' var +* @changed 3.2.4-RC1 Remove unused 'lastclick' var */ $vars = array( 'post_id', @@ -367,7 +367,7 @@ switch ($mode) * @var array post_data All post data from database * @since 3.1.3-RC1 * @changed 3.1.10-RC1 Added post_data -* @changed 3.2.4 Remove unused 'lastclick' var +* @changed 3.2.4-RC1 Remove unused 'lastclick' var */ $vars = array( 'post_id', From 5be990e9599f41a87d2c9d847a351b4b03e8debd Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Sun, 29 Jul 2018 13:32:19 +0200 Subject: [PATCH 020/148] [ticket/15733] Fix undeclared variable concatenation PHPBB3-15733 --- phpBB/includes/ucp/ucp_pm_compose.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index 2b8468590e..f35812b90a 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -1173,7 +1173,7 @@ function compose_pm($id, $mode, $action, $user_folders = array()) break; } - $s_hidden_fields .= (isset($check_value)) ? '' : ''; + $s_hidden_fields = (isset($check_value)) ? '' : ''; $s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '' : ''; $form_enctype = (@ini_get('file_uploads') == '0' || strtolower(@ini_get('file_uploads')) == 'off' || !$config['allow_pm_attach'] || !$auth->acl_get('u_pm_attach')) ? '' : ' enctype="multipart/form-data"'; From a4e2d89e037dbbcb349777113f4a6f6142d5ddb6 Mon Sep 17 00:00:00 2001 From: Zoddo Date: Sun, 29 Jul 2018 22:30:15 +0200 Subject: [PATCH 021/148] [ticket/15735] Add posting_preview_content_after template event Needed for extensions who adds information at the end of the message (such as moderator messages). PHPBB3-15735 --- phpBB/docs/events.md | 7 +++++++ phpBB/styles/prosilver/template/posting_preview.html | 2 ++ 2 files changed, 9 insertions(+) diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index f2b87ce7f1..42dea6b360 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -1707,6 +1707,13 @@ posting_poll_body_options_after * Since: 3.1.4-RC1 * Purpose: Add content after the poll options on creating a poll +posting_preview_content_after +=== +* Locations: + + styles/prosilver/template/posting_preview.html +* Since: 3.2.4-RC1 +* Purpose: Add content after the message content preview + posting_preview_poll_after === * Locations: diff --git a/phpBB/styles/prosilver/template/posting_preview.html b/phpBB/styles/prosilver/template/posting_preview.html index aac117c090..781d0de06b 100644 --- a/phpBB/styles/prosilver/template/posting_preview.html +++ b/phpBB/styles/prosilver/template/posting_preview.html @@ -31,6 +31,8 @@
{PREVIEW_MESSAGE}
+ +
{L_ATTACHMENTS}
From 614e10888cb77cfb03cf18cbe8fdfeaa25485499 Mon Sep 17 00:00:00 2001 From: Zoddo Date: Sun, 29 Jul 2018 23:22:05 +0200 Subject: [PATCH 022/148] [ticket/15735] Add posting_topic_review_row_content_after template event Needed for extensions who adds information at the end of the message (such as moderator messages). PHPBB3-15735 --- phpBB/docs/events.md | 7 +++++++ phpBB/styles/prosilver/template/posting_topic_review.html | 2 ++ 2 files changed, 9 insertions(+) diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index 42dea6b360..469af2759f 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -1721,6 +1721,13 @@ posting_preview_poll_after * Since: 3.1.7-RC1 * Purpose: Add content after the poll preview block +posting_topic_review_row_content_after +=== +* Locations: + + styles/prosilver/template/posting_topic_review.html +* Since: 3.2.4-RC1 +* Purpose: Add content after the message content in topic review + posting_topic_review_row_post_details_after === * Locations: diff --git a/phpBB/styles/prosilver/template/posting_topic_review.html b/phpBB/styles/prosilver/template/posting_topic_review.html index 55739070ae..93c4484ff8 100644 --- a/phpBB/styles/prosilver/template/posting_topic_review.html +++ b/phpBB/styles/prosilver/template/posting_topic_review.html @@ -60,6 +60,8 @@
{topic_review_row.MESSAGE}
+ +
{L_ATTACHMENTS}
From 5304b7d0b31caa3913fbdfae0957b1493e56753e Mon Sep 17 00:00:00 2001 From: Zoddo Date: Sun, 29 Jul 2018 23:57:57 +0200 Subject: [PATCH 023/148] [ticket/15735] Add search_results_content_after template event Needed for extensions who adds information at the end of the message (such as moderator messages). PHPBB3-15735 --- phpBB/docs/events.md | 7 +++++++ phpBB/styles/prosilver/template/search_results.html | 1 + 2 files changed, 8 insertions(+) diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index 469af2759f..2f4c47e6d8 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -1889,6 +1889,13 @@ search_body_search_query_prepend * Since: 3.1.7-RC1 * Purpose: Put content at the top of the search query fields set +search_results_content_after +=== +* Locations: + + styles/prosilver/template/search_results.html +* Since: 3.2.4-RC1 +* Purpose: Add content after the message content in search results + search_results_header_after === * Locations: diff --git a/phpBB/styles/prosilver/template/search_results.html b/phpBB/styles/prosilver/template/search_results.html index 6bc5c72a87..b6755e3d4a 100644 --- a/phpBB/styles/prosilver/template/search_results.html +++ b/phpBB/styles/prosilver/template/search_results.html @@ -194,6 +194,7 @@

{searchresults.POST_SUBJECT}

{searchresults.MESSAGE}
+
From 6cce62c0ca0fdbe73ec203e9590b4eebebb2a4ed Mon Sep 17 00:00:00 2001 From: Zoddo Date: Mon, 30 Jul 2018 00:24:56 +0200 Subject: [PATCH 024/148] [ticket/15735] Add viewtopic_body_postrow_content_after template event Needed for extensions who adds information at the end of the message (such as moderator messages). PHPBB3-15735 --- phpBB/docs/events.md | 7 +++++++ phpBB/styles/prosilver/template/viewtopic_body.html | 2 ++ 2 files changed, 9 insertions(+) diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index 2f4c47e6d8..6672353296 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -2674,6 +2674,13 @@ viewtopic_body_postrow_back2top_prepend * Since: 3.1.8-RC1 * Purpose: Add content to the post's bottom directly before the back to top link +viewtopic_body_postrow_content_after +=== +* Locations: + + styles/prosilver/template/viewtopic_body.html +* Since: 3.2.4-RC1 +* Purpose: Add content after the message content in topics views + viewtopic_body_postrow_custom_fields_after === * Locations: diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html index a9136e1810..8d7e26f099 100644 --- a/phpBB/styles/prosilver/template/viewtopic_body.html +++ b/phpBB/styles/prosilver/template/viewtopic_body.html @@ -326,6 +326,8 @@
{postrow.MESSAGE}
+ +
From 70c28aace5398b2358f9bc157caf8e41f82293ca Mon Sep 17 00:00:00 2001 From: Zoddo Date: Mon, 30 Jul 2018 13:02:06 +0200 Subject: [PATCH 025/148] [ticket/15737] Add $user_rows to core.delete_user_before It was added to core.delete_user_after in GH-4905 PHPBB3-15737 --- phpBB/includes/functions_user.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index 245d263720..f7be2d2760 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -461,9 +461,11 @@ function user_delete($mode, $user_ids, $retain_username = true) * @var array user_ids IDs of the deleted user * @var mixed retain_username True if username should be retained * or false if not + * @var array user_rows Array containing data of the deleted users * @since 3.1.0-a1 + * @changed 3.2.4-RC1 Added user_rows */ - $vars = array('mode', 'user_ids', 'retain_username'); + $vars = array('mode', 'user_ids', 'retain_username', 'user_rows'); extract($phpbb_dispatcher->trigger_event('core.delete_user_before', compact($vars))); // Before we begin, we will remove the reports the user issued. From 184d24bb166b754b571bd7ef49b7cfacf1c8381d Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Tue, 31 Jul 2018 16:06:49 +0200 Subject: [PATCH 026/148] [ticket/15622] Extract duplicated code PHPBB3-15622 --- phpBB/includes/functions_content.php | 52 +++++++++++++++++++++++++++ phpBB/includes/ucp/ucp_pm_compose.php | 24 +------------ phpBB/posting.php | 35 ++++-------------- 3 files changed, 60 insertions(+), 51 deletions(-) diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index 40d44cfe7b..aee90aab99 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -1758,3 +1758,55 @@ class bitfield $this->data = $this->data | $bitfield->get_blob(); } } + +/** + * Formats the quote according to the given BBCode status setting + * + * @param bool $bbcode_status The status of the BBCode setting + * @param array $quote_attributes The attributes of the quoted post + * @param phpbb\textformatter\utils $text_formatter_utils Text formatter utilities + * @param parse_message $message_parser Message parser class + * @param string $message_link Link of the original quoted post + * @since 3.2.4-RC1 + */ +function format_quote($bbcode_status, $quote_attributes, $text_formatter_utils, $message_parser, $message_link = '') +{ + if ($bbcode_status) + { + $quote_text = $text_formatter_utils->generate_quote( + censor_text($message_parser->message), + $quote_attributes + ); + + if($message_link) + { + $message_parser->message = $message_link . $quote_text . "\n\n"; + } + else + { + $message_parser->message = $quote_text . "\n\n"; + } + } + else + { + $offset = 0; + $quote_string = "> "; + $message = censor_text(trim($message_parser->message)); + // see if we are nesting. It's easily tricked but should work for one level of nesting + if (strpos($message, ">") !== false) + { + $offset = 10; + } + $message = utf8_wordwrap($message, 75 + $offset, "\n"); + + $message = $quote_string . $message; + $message = str_replace("\n", "\n" . $quote_string, $message); + + $message_parser->message = $quote_attributes['author'] . " " . $user->lang['WROTE'] . ":\n" . $message . "\n"; + + if($message_link) + { + $message_parser->message = $message_link . $message_parser->message; + } + } +} diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index e108356584..48bb9bf21f 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -974,30 +974,8 @@ function compose_pm($id, $mode, $action, $user_folders = array()) { $quote_attributes['post_id'] = $post['msg_id']; } - $quote_text = $phpbb_container->get('text_formatter.utils')->generate_quote( - censor_text($message_parser->message), - $quote_attributes - ); - if ($bbcode_status) - { - $message_parser->message = $message_link . $quote_text . "\n\n"; - } - else - { - $offset = 0; - $quote_string = "> "; - $message = censor_text(trim($message_parser->message)); - // see if we are nesting. It's easily tricked but should work for one level of nesting - if (strpos($message, ">") !== false) - { - $offset = 10; - } - $message = utf8_wordwrap($message, 75 + $offset, "\n"); - $message = $quote_string . $message; - $message = str_replace("\n", "\n" . $quote_string, $message); - $message_parser->message = $quote_username . " " . $user->lang['WROTE'] . ":\n" . $message . "\n"; - } + format_quote($bbcode_status, $quote_attributes, $phpbb_container->get('text_formatter.utils'), $message_parser, $message_link); } if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !$preview && !$refresh) diff --git a/phpBB/posting.php b/phpBB/posting.php index 3530bb5048..de399068bc 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -1630,35 +1630,14 @@ if ($generate_quote) // Remove attachment bbcode tags from the quoted message to avoid mixing with the new post attachments if any $message_parser->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#uis', '\\2', $message_parser->message); - if ($config['allow_bbcode']) - { - $message_parser->message = $bbcode_utils->generate_quote( - censor_text($message_parser->message), - array( - 'author' => $post_data['quote_username'], - 'post_id' => $post_data['post_id'], - 'time' => $post_data['post_time'], - 'user_id' => $post_data['poster_id'], - ) - ); - $message_parser->message .= "\n\n"; - } - else - { - $offset = 0; - $quote_string = "> "; - $message = censor_text(trim($message_parser->message)); - // see if we are nesting. It's easily tricked but should work for one level of nesting - if (strpos($message, ">") !== false) - { - $offset = 10; - } - $message = utf8_wordwrap($message, 75 + $offset, "\n"); + $quote_attributes = array( + 'author' => $post_data['quote_username'], + 'post_id' => $post_data['post_id'], + 'time' => $post_data['post_time'], + 'user_id' => $post_data['poster_id'], + ); - $message = $quote_string . $message; - $message = str_replace("\n", "\n" . $quote_string, $message); - $message_parser->message = $post_data['quote_username'] . " " . $user->lang['WROTE'] . ":\n" . $message . "\n"; - } + format_quote($config['allow_bbcode'], $quote_attributes, $bbcode_utils, $message_parser); } if (($mode == 'reply' || $mode == 'quote') && !$submit && !$preview && !$refresh) From 800fbdfed2aa4cf42ad0e3023bb9f32cac9beee4 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Wed, 1 Aug 2018 14:31:19 +0200 Subject: [PATCH 027/148] [ticket/15541] Explicitly explain how to add lang files in core.user_setup PHPBB3-15541 --- phpBB/phpbb/user.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phpBB/phpbb/user.php b/phpBB/phpbb/user.php index 5899dff2f5..ca0e5872e4 100644 --- a/phpBB/phpbb/user.php +++ b/phpBB/phpbb/user.php @@ -189,6 +189,9 @@ class user extends \phpbb\session /** * Event to load language files and modify user data on every page * + * Note: To load language file with this event, see description + * of lang_set_ext variable. + * * @event core.user_setup * @var array user_data Array with user's data row * @var string user_lang_name Basename of the user's langauge From ce2196517bec7dd05f85e7253cb124c0f6d92581 Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Wed, 1 Aug 2018 15:26:14 +0200 Subject: [PATCH 028/148] [ticket/15622] Fix message link generation Now the message link is generated in different formats depending on whether BBCodes are allowed or not in the site. PHPBB3-15622 --- phpBB/includes/ucp/ucp_pm_compose.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index 48bb9bf21f..d201c5fe73 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -954,7 +954,16 @@ function compose_pm($id, $mode, $action, $user_folders = array()) $post_id = $request->variable('p', 0); if ($config['allow_post_links']) { - $message_link = "[url=" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}]{$user->lang['SUBJECT']}{$user->lang['COLON']} {$message_subject}[/url]\n\n"; + $message_link = generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}"; + $message_link_subject = "{$user->lang['SUBJECT']}{$user->lang['COLON']} {$message_subject}"; + if ($bbcode_status) + { + $message_link = "[url=" . $message_link . "]" . $message_link_subject . "[/url]\n\n"; + } + else + { + $message_link = $message_link . " - " . $message_link_subject . "\n\n"; + } } else { From 521aec5923874f8757592a07e09357b323460b00 Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Wed, 1 Aug 2018 17:37:21 +0200 Subject: [PATCH 029/148] [ticket/15622] Correct code style PHPBB3-15622 --- phpBB/includes/functions_content.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index aee90aab99..1bc217b694 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -1778,7 +1778,7 @@ function format_quote($bbcode_status, $quote_attributes, $text_formatter_utils, $quote_attributes ); - if($message_link) + if ($message_link) { $message_parser->message = $message_link . $quote_text . "\n\n"; } @@ -1804,7 +1804,7 @@ function format_quote($bbcode_status, $quote_attributes, $text_formatter_utils, $message_parser->message = $quote_attributes['author'] . " " . $user->lang['WROTE'] . ":\n" . $message . "\n"; - if($message_link) + if ($message_link) { $message_parser->message = $message_link . $message_parser->message; } From ada8bc9da2790eeb600d61222b23ffdb5f025bf6 Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Wed, 1 Aug 2018 18:01:37 +0200 Subject: [PATCH 030/148] [ticket/15622] Refactor message link concatenation PHPBB3-15622 --- phpBB/includes/functions_content.php | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index 1bc217b694..1e80da98d3 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -1778,14 +1778,7 @@ function format_quote($bbcode_status, $quote_attributes, $text_formatter_utils, $quote_attributes ); - if ($message_link) - { - $message_parser->message = $message_link . $quote_text . "\n\n"; - } - else - { - $message_parser->message = $quote_text . "\n\n"; - } + $message_parser->message = $quote_text . "\n\n"; } else { @@ -1803,10 +1796,10 @@ function format_quote($bbcode_status, $quote_attributes, $text_formatter_utils, $message = str_replace("\n", "\n" . $quote_string, $message); $message_parser->message = $quote_attributes['author'] . " " . $user->lang['WROTE'] . ":\n" . $message . "\n"; + } - if ($message_link) - { - $message_parser->message = $message_link . $message_parser->message; - } + if ($message_link) + { + $message_parser->message = $message_link . $message_parser->message; } } From 204f798f763a257895ddeae815c2a8d9e64c4c72 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Wed, 1 Aug 2018 15:05:10 +0200 Subject: [PATCH 031/148] [ticket/12628] Introduce debug.memory Also fix one debug.sql_explain missing from the previous PR PHPBB3-12628 --- phpBB/config/development/config.yml | 1 + phpBB/includes/functions.php | 19 ++++++++++++------- phpBB/install/convert/convertor.php | 7 ++++--- .../di/extension/container_configuration.php | 1 + 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/phpBB/config/development/config.yml b/phpBB/config/development/config.yml index 67c0e5a871..b51637f5cc 100644 --- a/phpBB/config/development/config.yml +++ b/phpBB/config/development/config.yml @@ -8,6 +8,7 @@ core: exceptions: true load_time: true sql_explain: true + memory: true twig: debug: true diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 7a978553bd..dd0a88e01a 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4540,7 +4540,9 @@ function page_header($page_title = '', $display_online_list = false, $item_id = */ function phpbb_check_and_display_sql_report(\phpbb\request\request_interface $request, \phpbb\auth\auth $auth, \phpbb\db\driver\driver_interface $db) { - if ($request->variable('explain', false) && $auth->acl_get('a_') && defined('DEBUG')) + global $phpbb_container; + + if ($phpbb_container->getParameter('debug.sql_explain') && $request->variable('explain', false) && $auth->acl_get('a_')) { $db->sql_report('display'); } @@ -4570,9 +4572,10 @@ function phpbb_generate_debug_output(\phpbb\db\driver\driver_interface $db, \php $totaltime = microtime(true) - $GLOBALS['starttime']; $debug_info[] = sprintf('Time: %.3fs', $db->get_sql_time(), ($totaltime - $db->get_sql_time()), $totaltime); } + } - $debug_info[] = sprintf('Queries: %d', $db->sql_num_queries(true), $db->sql_num_queries()); - + if ($phpbb_container->getParameter('debug.memory')) + { $memory_usage = memory_get_peak_usage(); if ($memory_usage) { @@ -4580,18 +4583,20 @@ function phpbb_generate_debug_output(\phpbb\db\driver\driver_interface $db, \php $debug_info[] = 'Peak Memory Usage: ' . $memory_usage; } - } - if (defined('DEBUG')) - { $debug_info[] = 'GZIP: ' . (($config['gzip_compress'] && @extension_loaded('zlib')) ? 'On' : 'Off'); if ($user->load) { $debug_info[] = 'Load: ' . $user->load; } + } - if ($auth->acl_get('a_') && $phpbb_container->getParameter('debug.sql_explain')) + if ($phpbb_container->getParameter('debug.sql_explain')) + { + $debug_info[] = sprintf('Queries: %d', $db->sql_num_queries(true), $db->sql_num_queries()); + + if ($auth->acl_get('a_')) { $debug_info[] = 'SQL Explain'; } diff --git a/phpBB/install/convert/convertor.php b/phpBB/install/convert/convertor.php index 619fc73275..b87a84607d 100644 --- a/phpBB/install/convert/convertor.php +++ b/phpBB/install/convert/convertor.php @@ -63,7 +63,7 @@ class convertor { global $user, $phpbb_root_path, $phpEx, $db, $lang, $config, $cache, $auth; global $convert, $convert_row, $message_parser, $skip_rows, $language; - global $request, $phpbb_dispatcher; + global $request, $phpbb_dispatcher, $phpbb_container; $phpbb_config_php_file = new \phpbb\config_php_file($phpbb_root_path, $phpEx); extract($phpbb_config_php_file->get_all()); @@ -687,7 +687,7 @@ class convertor $this->template->assign_block_vars('checks', array( 'TITLE' => "skip_rows = $skip_rows", - 'RESULT' => $rows . ((defined('DEBUG') && function_exists('memory_get_usage')) ? ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] : ''), + 'RESULT' => $rows . (($phpbb_container->getParameter('debug.memory') && function_exists('memory_get_usage')) ? ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] : ''), )); $mtime = explode(' ', microtime()); @@ -920,6 +920,7 @@ class convertor { global $user, $db, $phpbb_root_path, $phpEx, $config, $cache; global $convert; + global $phpbb_container; include_once ($phpbb_root_path . 'includes/functions_admin.' . $phpEx); @@ -959,7 +960,7 @@ class convertor sync('topic', 'range', 'topic_id BETWEEN ' . $sync_batch . ' AND ' . $end, true, true); $this->template->assign_block_vars('checks', array( - 'TITLE' => sprintf($user->lang['SYNC_TOPIC_ID'], $sync_batch, ($sync_batch + $batch_size)) . ((defined('DEBUG') && function_exists('memory_get_usage')) ? ' [' . ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] . ']' : ''), + 'TITLE' => sprintf($user->lang['SYNC_TOPIC_ID'], $sync_batch, ($sync_batch + $batch_size)) . (($phpbb_container->getParameter('debug.memory') && function_exists('memory_get_usage')) ? ' [' . ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] . ']' : ''), 'RESULT' => $user->lang['DONE'], )); diff --git a/phpBB/phpbb/di/extension/container_configuration.php b/phpBB/phpbb/di/extension/container_configuration.php index 3a6502a4b3..f8cb5bcd58 100644 --- a/phpBB/phpbb/di/extension/container_configuration.php +++ b/phpBB/phpbb/di/extension/container_configuration.php @@ -37,6 +37,7 @@ class container_configuration implements ConfigurationInterface ->booleanNode('exceptions')->defaultValue(false)->end() ->booleanNode('load_time')->defaultValue(false)->end() ->booleanNode('sql_explain')->defaultValue(false)->end() + ->booleanNode('memory')->defaultValue(false)->end() ->end() ->end() ->arrayNode('twig') From c3d664bbfe115b69ad6719dec872aad8dbe86463 Mon Sep 17 00:00:00 2001 From: Zoddo Date: Fri, 3 Aug 2018 18:25:27 +0200 Subject: [PATCH 032/148] [ticket/15740] Fix hardcoded Terms/Privacy PHPBB3-15740 --- phpBB/styles/prosilver/template/overall_footer.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html index 2c2094cba8..083d974d13 100644 --- a/phpBB/styles/prosilver/template/overall_footer.html +++ b/phpBB/styles/prosilver/template/overall_footer.html @@ -19,11 +19,11 @@ From 8858c86c97844c80568701f88ae065a3130f0090 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Tue, 7 Aug 2018 11:49:00 +0200 Subject: [PATCH 033/148] [ticket/15746] Update symfony to 2.8.44 & others to latest PHPBB3-15746 --- phpBB/composer.lock | 276 ++++++++++++++++++++++---------------------- 1 file changed, 140 insertions(+), 136 deletions(-) diff --git a/phpBB/composer.lock b/phpBB/composer.lock index 444736506a..ad0cc45ea0 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -84,16 +84,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "5.3.2", + "version": "5.3.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f9acb4761844317e626a32259205bec1f1bc60d2" + "reference": "93bbdb30d59be6cd9839495306c65f2907370eb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f9acb4761844317e626a32259205bec1f1bc60d2", - "reference": "f9acb4761844317e626a32259205bec1f1bc60d2", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/93bbdb30d59be6cd9839495306c65f2907370eb9", + "reference": "93bbdb30d59be6cd9839495306c65f2907370eb9", "shasum": "" }, "require": { @@ -133,20 +133,20 @@ "rest", "web service" ], - "time": "2018-01-15 07:18:01" + "time": "2018-07-31 13:33:10" }, { "name": "guzzlehttp/ringphp", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/guzzle/RingPHP.git", - "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b" + "reference": "5e2a174052995663dd68e6b5ad838afd47dd615b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/dbbb91d7f6c191e5e405e900e3102ac7f261bc0b", - "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b", + "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/5e2a174052995663dd68e6b5ad838afd47dd615b", + "reference": "5e2a174052995663dd68e6b5ad838afd47dd615b", "shasum": "" }, "require": { @@ -184,7 +184,7 @@ } ], "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.", - "time": "2015-05-20 03:37:09" + "time": "2018-07-31 13:22:33" }, { "name": "guzzlehttp/streams", @@ -343,7 +343,7 @@ "oauth", "security" ], - "time": "2018-02-14 22:37:14" + "time": "2016-07-12 22:15:00" }, { "name": "marc1706/fast-image-size", @@ -506,7 +506,7 @@ "pseudorandom", "random" ], - "time": "2018-04-04 21:48:54" + "time": "2017-03-13 16:22:52" }, { "name": "patchwork/utf8", @@ -727,16 +727,16 @@ }, { "name": "symfony/config", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "93bdf96d0e3c9b29740bf9050e7a996b443c8436" + "reference": "06c0be4cdd8363f3ec8d592c9a4d1b981d5052af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/93bdf96d0e3c9b29740bf9050e7a996b443c8436", - "reference": "93bdf96d0e3c9b29740bf9050e7a996b443c8436", + "url": "https://api.github.com/repos/symfony/config/zipball/06c0be4cdd8363f3ec8d592c9a4d1b981d5052af", + "reference": "06c0be4cdd8363f3ec8d592c9a4d1b981d5052af", "shasum": "" }, "require": { @@ -780,20 +780,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-05-01 22:52:40" + "time": "2018-07-26 11:13:39" }, { "name": "symfony/console", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e8e59b74ad1274714dad2748349b55e3e6e630c7" + "reference": "0c1fcbb9afb5cff992c982ff99c0434f0146dcfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e8e59b74ad1274714dad2748349b55e3e6e630c7", - "reference": "e8e59b74ad1274714dad2748349b55e3e6e630c7", + "url": "https://api.github.com/repos/symfony/console/zipball/0c1fcbb9afb5cff992c982ff99c0434f0146dcfc", + "reference": "0c1fcbb9afb5cff992c982ff99c0434f0146dcfc", "shasum": "" }, "require": { @@ -841,20 +841,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-05-15 21:17:45" + "time": "2018-07-26 11:13:39" }, { "name": "symfony/debug", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "a26ddce7fe4e884097d72435653bc7e703411f26" + "reference": "d985c8546da49c4727e27dae82bcf783ee2c5af0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/a26ddce7fe4e884097d72435653bc7e703411f26", - "reference": "a26ddce7fe4e884097d72435653bc7e703411f26", + "url": "https://api.github.com/repos/symfony/debug/zipball/d985c8546da49c4727e27dae82bcf783ee2c5af0", + "reference": "d985c8546da49c4727e27dae82bcf783ee2c5af0", "shasum": "" }, "require": { @@ -898,20 +898,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-06-22 15:01:26" + "time": "2018-07-26 11:13:39" }, { "name": "symfony/dependency-injection", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "0f42a0827d99a867ffd279ae083e7daf1fe42cb7" + "reference": "ad2446d39d11c3daaa7f147d957941a187e47357" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0f42a0827d99a867ffd279ae083e7daf1fe42cb7", - "reference": "0f42a0827d99a867ffd279ae083e7daf1fe42cb7", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/ad2446d39d11c3daaa7f147d957941a187e47357", + "reference": "ad2446d39d11c3daaa7f147d957941a187e47357", "shasum": "" }, "require": { @@ -961,20 +961,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2018-05-25 13:50:34" + "time": "2018-07-26 11:13:39" }, { "name": "symfony/event-dispatcher", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9b69aad7d4c086dc94ebade2d5eb9145da5dac8c" + "reference": "84ae343f39947aa084426ed1138bb96bf94d1f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9b69aad7d4c086dc94ebade2d5eb9145da5dac8c", - "reference": "9b69aad7d4c086dc94ebade2d5eb9145da5dac8c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/84ae343f39947aa084426ed1138bb96bf94d1f12", + "reference": "84ae343f39947aa084426ed1138bb96bf94d1f12", "shasum": "" }, "require": { @@ -1021,20 +1021,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-04-06 07:35:03" + "time": "2018-07-26 09:03:18" }, { "name": "symfony/filesystem", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "0f685c099aca7ba86bcc31850186dbfe84a4a8a1" + "reference": "2d6a4deccdfa2e4e9f113138b93457b2d0886c15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/0f685c099aca7ba86bcc31850186dbfe84a4a8a1", - "reference": "0f685c099aca7ba86bcc31850186dbfe84a4a8a1", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/2d6a4deccdfa2e4e9f113138b93457b2d0886c15", + "reference": "2d6a4deccdfa2e4e9f113138b93457b2d0886c15", "shasum": "" }, "require": { @@ -1071,20 +1071,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-06-21 09:24:14" + "time": "2018-07-26 11:13:39" }, { "name": "symfony/finder", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "995cd7c28a0778cece02e2133b4d813dc509dfc3" + "reference": "f0de0b51913eb2caab7dfed6413b87e14fca780e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/995cd7c28a0778cece02e2133b4d813dc509dfc3", - "reference": "995cd7c28a0778cece02e2133b4d813dc509dfc3", + "url": "https://api.github.com/repos/symfony/finder/zipball/f0de0b51913eb2caab7dfed6413b87e14fca780e", + "reference": "f0de0b51913eb2caab7dfed6413b87e14fca780e", "shasum": "" }, "require": { @@ -1120,20 +1120,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-06-19 11:07:17" + "time": "2018-07-26 11:13:39" }, { "name": "symfony/http-foundation", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f0332229bfecb3c3d3c983f2139f39dd73d2723a" + "reference": "10f660d43087b2198c3789bebbd587d20ec6e956" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f0332229bfecb3c3d3c983f2139f39dd73d2723a", - "reference": "f0332229bfecb3c3d3c983f2139f39dd73d2723a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/10f660d43087b2198c3789bebbd587d20ec6e956", + "reference": "10f660d43087b2198c3789bebbd587d20ec6e956", "shasum": "" }, "require": { @@ -1175,20 +1175,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-06-19 14:38:49" + "time": "2018-08-01 13:47:49" }, { "name": "symfony/http-kernel", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "5f01e7b4a82458906e81231993abe1fbb7b25fbc" + "reference": "3ee21e3eb52327514d1fc754d1e0c9c85bceeb3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5f01e7b4a82458906e81231993abe1fbb7b25fbc", - "reference": "5f01e7b4a82458906e81231993abe1fbb7b25fbc", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3ee21e3eb52327514d1fc754d1e0c9c85bceeb3a", + "reference": "3ee21e3eb52327514d1fc754d1e0c9c85bceeb3a", "shasum": "" }, "require": { @@ -1259,29 +1259,32 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-06-25 12:01:56" + "time": "2018-08-01 14:12:31" }, { "name": "symfony/polyfill-ctype", - "version": "v1.8.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "suggest": { + "ext-ctype": "For best performance" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -1314,20 +1317,20 @@ "polyfill", "portable" ], - "time": "2018-04-30 19:57:29" + "time": "2018-08-06 14:22:27" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.8.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "3296adf6a6454a050679cde90f95350ad604b171" + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", - "reference": "3296adf6a6454a050679cde90f95350ad604b171", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", "shasum": "" }, "require": { @@ -1339,7 +1342,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -1373,20 +1376,20 @@ "portable", "shim" ], - "time": "2018-04-26 10:06:28" + "time": "2018-08-06 14:22:27" }, { "name": "symfony/polyfill-php54", - "version": "v1.8.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php54.git", - "reference": "6c3a2b84c6025e4ea3f6a19feac35408c64b22e1" + "reference": "412977e090c6a8472dc39d50d1beb7d59495a965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/6c3a2b84c6025e4ea3f6a19feac35408c64b22e1", - "reference": "6c3a2b84c6025e4ea3f6a19feac35408c64b22e1", + "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/412977e090c6a8472dc39d50d1beb7d59495a965", + "reference": "412977e090c6a8472dc39d50d1beb7d59495a965", "shasum": "" }, "require": { @@ -1395,7 +1398,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -1431,20 +1434,20 @@ "portable", "shim" ], - "time": "2018-04-26 10:06:28" + "time": "2018-08-06 14:22:27" }, { "name": "symfony/polyfill-php55", - "version": "v1.8.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php55.git", - "reference": "a39456128377a85f2c5707fcae458678560cba46" + "reference": "578b8528da843de0fc65ec395900fa3181f2ead7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/a39456128377a85f2c5707fcae458678560cba46", - "reference": "a39456128377a85f2c5707fcae458678560cba46", + "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/578b8528da843de0fc65ec395900fa3181f2ead7", + "reference": "578b8528da843de0fc65ec395900fa3181f2ead7", "shasum": "" }, "require": { @@ -1454,7 +1457,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -1487,20 +1490,20 @@ "portable", "shim" ], - "time": "2018-04-26 10:06:28" + "time": "2018-08-06 14:22:27" }, { "name": "symfony/proxy-manager-bridge", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "d73283cfe025d73c70551c45d22c54bd43c2c53b" + "reference": "0fd7ab039e26a33c5e3d1e00642bc83412c0896a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/d73283cfe025d73c70551c45d22c54bd43c2c53b", - "reference": "d73283cfe025d73c70551c45d22c54bd43c2c53b", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/0fd7ab039e26a33c5e3d1e00642bc83412c0896a", + "reference": "0fd7ab039e26a33c5e3d1e00642bc83412c0896a", "shasum": "" }, "require": { @@ -1541,20 +1544,20 @@ ], "description": "Symfony ProxyManager Bridge", "homepage": "https://symfony.com", - "time": "2018-01-03 07:36:31" + "time": "2018-07-26 09:03:18" }, { "name": "symfony/routing", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "39064bae264907e48fe4e8ad5141f6dc6a3932fb" + "reference": "e26f791e8669603e9dc0a601e75a50f914eaa144" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/39064bae264907e48fe4e8ad5141f6dc6a3932fb", - "reference": "39064bae264907e48fe4e8ad5141f6dc6a3932fb", + "url": "https://api.github.com/repos/symfony/routing/zipball/e26f791e8669603e9dc0a601e75a50f914eaa144", + "reference": "e26f791e8669603e9dc0a601e75a50f914eaa144", "shasum": "" }, "require": { @@ -1615,20 +1618,20 @@ "uri", "url" ], - "time": "2018-06-19 09:52:17" + "time": "2018-07-26 11:13:39" }, { "name": "symfony/twig-bridge", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "f56824eed503d9bb65600a262fdb46571672c257" + "reference": "2bb814a4554a7188275be36503dc27c0dd12cd2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/f56824eed503d9bb65600a262fdb46571672c257", - "reference": "f56824eed503d9bb65600a262fdb46571672c257", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/2bb814a4554a7188275be36503dc27c0dd12cd2f", + "reference": "2bb814a4554a7188275be36503dc27c0dd12cd2f", "shasum": "" }, "require": { @@ -1700,20 +1703,20 @@ ], "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "time": "2018-05-17 10:20:34" + "time": "2018-07-26 11:13:39" }, { "name": "symfony/yaml", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "51356b7a2ff7c9fd06b2f1681cc463bb62b5c1ff" + "reference": "fbf876678e29dc634430dcf0096e216eb0004467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/51356b7a2ff7c9fd06b2f1681cc463bb62b5c1ff", - "reference": "51356b7a2ff7c9fd06b2f1681cc463bb62b5c1ff", + "url": "https://api.github.com/repos/symfony/yaml/zipball/fbf876678e29dc634430dcf0096e216eb0004467", + "reference": "fbf876678e29dc634430dcf0096e216eb0004467", "shasum": "" }, "require": { @@ -1750,24 +1753,25 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-05-01 22:52:40" + "time": "2018-07-26 09:03:18" }, { "name": "twig/twig", - "version": "v1.35.3", + "version": "v1.35.4", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "b48680b6eb7d16b5025b9bfc4108d86f6b8af86f" + "reference": "7e081e98378a1e78c29cc9eba4aefa5d78a05d2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/b48680b6eb7d16b5025b9bfc4108d86f6b8af86f", - "reference": "b48680b6eb7d16b5025b9bfc4108d86f6b8af86f", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/7e081e98378a1e78c29cc9eba4aefa5d78a05d2a", + "reference": "7e081e98378a1e78c29cc9eba4aefa5d78a05d2a", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.3", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { "psr/container": "^1.0", @@ -1806,16 +1810,16 @@ }, { "name": "Twig Team", - "homepage": "http://twig.sensiolabs.org/contributors", + "homepage": "https://twig.symfony.com/contributors", "role": "Contributors" } ], "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org", + "homepage": "https://twig.symfony.com", "keywords": [ "templating" ], - "time": "2018-03-20 04:25:58" + "time": "2018-07-13 07:12:17" }, { "name": "zendframework/zend-code", @@ -2357,16 +2361,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.7.6", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", "shasum": "" }, "require": { @@ -2378,12 +2382,12 @@ }, "require-dev": { "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -2416,7 +2420,7 @@ "spy", "stub" ], - "time": "2018-04-18 13:57:24" + "time": "2018-08-05 17:53:17" }, { "name": "phpunit/dbunit", @@ -3410,16 +3414,16 @@ }, { "name": "symfony/browser-kit", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "11ccc2ebefba78c1bb0a2d2d2dd4b4e09a5fba02" + "reference": "fe44362c97307e7935996cb09d320fcc22619656" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/11ccc2ebefba78c1bb0a2d2d2dd4b4e09a5fba02", - "reference": "11ccc2ebefba78c1bb0a2d2d2dd4b4e09a5fba02", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/fe44362c97307e7935996cb09d320fcc22619656", + "reference": "fe44362c97307e7935996cb09d320fcc22619656", "shasum": "" }, "require": { @@ -3463,20 +3467,20 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2018-03-19 21:11:56" + "time": "2018-07-26 09:03:18" }, { "name": "symfony/css-selector", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "3cdc270724e4666006118283c700a4d7f9cbe264" + "reference": "294611f3a0d265bcf049e2da62cb4f712e3ed927" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/3cdc270724e4666006118283c700a4d7f9cbe264", - "reference": "3cdc270724e4666006118283c700a4d7f9cbe264", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/294611f3a0d265bcf049e2da62cb4f712e3ed927", + "reference": "294611f3a0d265bcf049e2da62cb4f712e3ed927", "shasum": "" }, "require": { @@ -3516,20 +3520,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-03-10 18:19:36" + "time": "2018-07-26 09:03:18" }, { "name": "symfony/dom-crawler", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "a01b1fa5322847d1d51aa61f74c86b438c2f34e8" + "reference": "2fd6513f2dd3b08446da420070084db376c0134c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/a01b1fa5322847d1d51aa61f74c86b438c2f34e8", - "reference": "a01b1fa5322847d1d51aa61f74c86b438c2f34e8", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2fd6513f2dd3b08446da420070084db376c0134c", + "reference": "2fd6513f2dd3b08446da420070084db376c0134c", "shasum": "" }, "require": { @@ -3573,20 +3577,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2018-05-01 22:52:40" + "time": "2018-07-24 10:05:38" }, { "name": "symfony/process", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "542d88b350c42750fdc14e73860ee96dd423e95d" + "reference": "cc83afdb5ac99147806b3bb65a3ff1227664f596" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/542d88b350c42750fdc14e73860ee96dd423e95d", - "reference": "542d88b350c42750fdc14e73860ee96dd423e95d", + "url": "https://api.github.com/repos/symfony/process/zipball/cc83afdb5ac99147806b3bb65a3ff1227664f596", + "reference": "cc83afdb5ac99147806b3bb65a3ff1227664f596", "shasum": "" }, "require": { @@ -3622,7 +3626,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-05-27 07:40:52" + "time": "2018-07-26 11:13:39" } ], "aliases": [], From c24b801746d3d20a9664ad05b586bd3c5f83d579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Wed, 8 Aug 2018 19:23:10 +0200 Subject: [PATCH 034/148] [ticket/15747] Change parameter depth to boolean PHPBB3-15747 --- phpBB/install/schemas/schema_data.sql | 6 +-- phpBB/language/en/acp/storage.php | 7 +-- .../storage_adapter_local_depth_rename.php | 45 +++++++++++++++++++ phpBB/phpbb/storage/adapter/local.php | 39 +++++++++------- phpBB/phpbb/storage/provider/local.php | 10 ++++- tests/storage/adapter/local_test.php | 2 +- 6 files changed, 85 insertions(+), 24 deletions(-) create mode 100644 phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth_rename.php diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index e5eebae36d..2c888bac75 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -289,13 +289,13 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('exts_composer_enab INSERT INTO phpbb_config (config_name, config_value) VALUES ('exts_composer_purge_on_remove', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\attachment\provider', 'phpbb\storage\provider\local'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\attachment\config\path', 'files'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\attachment\config\depth', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\attachment\config\subfolders', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\avatar\provider', 'phpbb\storage\provider\local'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\avatar\config\path', 'images/avatars/upload'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\avatar\config\depth', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\avatar\config\subfolders', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\backup\provider', 'phpbb\storage\provider\local'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\backup\config\path', 'store'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\backup\config\depth', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('storage\backup\config\subfolders', '0'); INSERT INTO phpbb_config (config_name, config_value, is_dynamic) VALUES ('cache_last_gc', '0', 1); INSERT INTO phpbb_config (config_name, config_value, is_dynamic) VALUES ('cron_lock', '0', 1); diff --git a/phpBB/language/en/acp/storage.php b/phpBB/language/en/acp/storage.php index 5e171ac6f0..69faa58030 100644 --- a/phpBB/language/en/acp/storage.php +++ b/phpBB/language/en/acp/storage.php @@ -55,9 +55,10 @@ $lang = array_merge($lang, array( 'STORAGE_BACKUP_TITLE' => 'Backup storage', // Local adapter - 'STORAGE_ADAPTER_LOCAL_NAME' => 'Local', - 'STORAGE_ADAPTER_LOCAL_OPTION_PATH' => 'Path', - 'STORAGE_ADAPTER_LOCAL_OPTION_DEPTH' => 'Depth', + 'STORAGE_ADAPTER_LOCAL_NAME' => 'Local', + 'STORAGE_ADAPTER_LOCAL_OPTION_PATH' => 'Path', + 'STORAGE_ADAPTER_LOCAL_OPTION_SUBFOLDERS' => 'Organize in subfolders', + 'STORAGE_ADAPTER_LOCAL_OPTION_SUBFOLDERS_EXPLAIN' => 'Some web servers may have problems storing large number of files in a single directory. Enable this option to distribute files in different directories.', // Form validation 'STORAGE_UPDATE_SUCCESSFUL' => 'All storage types were successfully updated.', diff --git a/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth_rename.php b/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth_rename.php new file mode 100644 index 0000000000..295fae5584 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth_rename.php @@ -0,0 +1,45 @@ + +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v330; + +class storage_adapter_local_depth_rename extends \phpbb\db\migration\migration +{ + static public function depends_on() + { + return array( + '\phpbb\db\migration\data\v330\storage_adapter_local_depth', + ); + } + + public function update_data() + { + return array( + array('if', array( + ($this->config['storage\\attachment\\provider'] == \phpbb\storage\provider\local::class), + array('config.delete', array('storage\\attachment\\config\\depth')), + array('config.add', array('storage\\attachment\\config\\subfolders', '0')), + )), + array('if', array( + ($this->config['storage\\avatar\\provider'] == \phpbb\storage\provider\local::class), + array('config.delete', array('storage\\avatar\\config\\depth')), + array('config.add', array('storage\\avatar\\config\\subfolders', '0')), + )), + array('if', array( + ($this->config['storage\\backup\\provider'] == \phpbb\storage\provider\local::class), + array('config.delete', array('storage\\backup\\config\\depth')), + array('config.add', array('storage\\backup\\config\\subfolders', '0')), + )), + ); + } +} diff --git a/phpBB/phpbb/storage/adapter/local.php b/phpBB/phpbb/storage/adapter/local.php index c4a95da25b..8e491b0240 100644 --- a/phpBB/phpbb/storage/adapter/local.php +++ b/phpBB/phpbb/storage/adapter/local.php @@ -73,10 +73,17 @@ class local implements adapter_interface, stream_interface * This is for those who have problems storing a large number of files in * a single directory. * More info: https://tracker.phpbb.com/browse/PHPBB3-15371 - * + */ + + /* + * @var bool subfolders + */ + protected $subfolders; + + /* * @var int dir_depth */ - protected $dir_depth; + protected $dir_depth = 2; /** * Constructor @@ -101,7 +108,7 @@ class local implements adapter_interface, stream_interface $this->path = $options['path']; $this->root_path = $this->phpbb_root_path . $options['path']; - $this->dir_depth = (int) $options['depth']; + $this->subfolders = (bool) $options['subfolders']; } /** @@ -270,19 +277,21 @@ class local implements adapter_interface, stream_interface */ protected function get_path($path) { - $dirname = dirname($path); - - $hash = md5(basename($path)); - - $parts = str_split($hash, 2); - $parts = array_slice($parts, 0, $this->dir_depth); - - // Create path - $path = $dirname . DIRECTORY_SEPARATOR; - - if (!empty($parts)) + if ($this->subfolders) { - $path .= implode(DIRECTORY_SEPARATOR, $parts) . DIRECTORY_SEPARATOR; + $hash = md5(basename($path)); + + $parts = str_split($hash, 2); + $parts = array_slice($parts, 0, $this->dir_depth); + + // Create path + $dirname = dirname($path); + $path = $dirname . DIRECTORY_SEPARATOR; + + if (!empty($parts)) + { + $path .= implode(DIRECTORY_SEPARATOR, $parts) . DIRECTORY_SEPARATOR; + } } return $path; diff --git a/phpBB/phpbb/storage/provider/local.php b/phpBB/phpbb/storage/provider/local.php index 09e5bf9ac4..8e0de2b6fd 100644 --- a/phpBB/phpbb/storage/provider/local.php +++ b/phpBB/phpbb/storage/provider/local.php @@ -37,8 +37,14 @@ class local implements provider_interface public function get_options() { return [ - 'path' => array('type' => 'text'), - 'depth' => array('type' => 'text'), + 'path' => ['type' => 'text'], + 'subfolders' => [ + 'type' => 'radio', + 'options' => [ + 'ENABLE' => '1', + 'DISABLE' => '0', + ], + ], ]; } diff --git a/tests/storage/adapter/local_test.php b/tests/storage/adapter/local_test.php index a4092e303b..d24759b8d3 100644 --- a/tests/storage/adapter/local_test.php +++ b/tests/storage/adapter/local_test.php @@ -27,7 +27,7 @@ $phpbb_root_path = getcwd() . DIRECTORY_SEPARATOR; $this->adapter = new \phpbb\storage\adapter\local($this->filesystem, new \FastImageSize\FastImageSize(), new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser)), $phpbb_root_path); - $this->adapter->configure(['path' => 'test_path', 'depth' => 2]); + $this->adapter->configure(['path' => 'test_path', 'subfolders' => true]); $this->path = $phpbb_root_path . 'test_path/'; mkdir($this->path); From ced8599e306fdbc5e496b3119ef46c4c27e3e335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Wed, 8 Aug 2018 20:36:16 +0200 Subject: [PATCH 035/148] [ticket/15723] Rewrite unique_id too PHPBB3-15723 --- phpBB/includes/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 51f5bc0fd5..1457888c9f 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -115,7 +115,7 @@ function gen_rand_string_friendly($num_chars = 8) */ function unique_id() { - return bin2hex(random_bytes(8)); + return gen_rand_string(32); } /** From c912e6feaabfb0b39956cde70354106334da0172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Thu, 9 Aug 2018 21:25:59 +0200 Subject: [PATCH 036/148] [ticket/15751] Fix warning when update with CLI PHPBB3-15751 --- .../install/module/requirements/task/check_update.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/phpBB/phpbb/install/module/requirements/task/check_update.php b/phpBB/phpbb/install/module/requirements/task/check_update.php index cd66ffc8f9..4eb2c6d75e 100644 --- a/phpBB/phpbb/install/module/requirements/task/check_update.php +++ b/phpBB/phpbb/install/module/requirements/task/check_update.php @@ -122,8 +122,11 @@ class check_update extends task_base // Check for a valid update directory if (!$this->filesystem->exists($update_files) || !$this->filesystem->is_readable($update_files)) { - $this->iohandler->add_warning_message('UPDATE_FILES_NOT_FOUND'); - $this->set_test_passed(false); + if ($this->iohandler->get_input('update_type', 'all') === 'all') + { + $this->iohandler->add_warning_message('UPDATE_FILES_NOT_FOUND'); + $this->set_test_passed(false); + } // If there are no update files, we can't check the version etc // However, we can let the users run migrations if they really want to... From fc674873c7ad0acaf7773003534fd2279a4dd1bf Mon Sep 17 00:00:00 2001 From: rxu Date: Sun, 12 Aug 2018 21:54:13 +0700 Subject: [PATCH 037/148] [ticket/15755] Fix event vars in /phpbb/attachment/delete.php PHPBB3-15755 --- phpBB/phpbb/attachment/delete.php | 56 ++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/phpBB/phpbb/attachment/delete.php b/phpBB/phpbb/attachment/delete.php index 922f24b5dc..3c98e21587 100644 --- a/phpBB/phpbb/attachment/delete.php +++ b/phpBB/phpbb/attachment/delete.php @@ -104,6 +104,8 @@ class delete $this->set_sql_constraints($mode); + $sql_id = $this->sql_id; + /** * Perform additional actions before collecting data for attachment(s) deletion * @@ -122,11 +124,21 @@ class delete ); extract($this->dispatcher->trigger_event('core.delete_attachments_collect_data_before', compact($vars))); + $this->sql_id = $sql_id; + unset($sql_id); + // Collect post and topic ids for later use if we need to touch remaining entries (if resync is enabled) $this->collect_attachment_info($resync); // Delete attachments from database - $this->delete_attachments_from_db(); + $this->delete_attachments_from_db($mode, $ids, $resync); + + $sql_id = $this->sql_id; + $post_ids = $this->post_ids; + $topic_ids = $this->topic_ids; + $message_ids = $this->message_ids; + $physical = $this->physical; + $num_deleted = $this->num_deleted; /** * Perform additional actions after attachment(s) deletion from the database @@ -156,13 +168,21 @@ class delete ); extract($this->dispatcher->trigger_event('core.delete_attachments_from_database_after', compact($vars))); + $this->sql_id = $sql_id; + $this->post_ids = $post_ids; + $this->topic_ids = $topic_ids; + $this->message_ids = $message_ids; + $this->physical = $physical; + $this->num_deleted = $num_deleted; + unset($sql_id, $post_ids, $topic_ids, $message_ids, $physical, $num_deleted); + if (!$this->num_deleted) { return 0; } // Delete attachments from filesystem - $this->remove_from_filesystem(); + $this->remove_from_filesystem($mode, $ids, $resync); // If we do not resync, we do not need to adjust any message, post, topic or user entries if (!$resync) @@ -288,8 +308,14 @@ class delete /** * Delete attachments from database table */ - protected function delete_attachments_from_db() + protected function delete_attachments_from_db($mode, $ids, $resync) { + $sql_id = $this->sql_id; + $post_ids = $this->post_ids; + $topic_ids = $this->topic_ids; + $message_ids = $this->message_ids; + $physical = $this->physical; + /** * Perform additional actions before attachment(s) deletion * @@ -316,6 +342,13 @@ class delete ); extract($this->dispatcher->trigger_event('core.delete_attachments_before', compact($vars))); + $this->sql_id = $sql_id; + $this->post_ids = $post_ids; + $this->topic_ids = $topic_ids; + $this->message_ids = $message_ids; + $this->physical = $physical; + unset($sql_id, $post_ids, $topic_ids, $message_ids, $physical); + // Delete attachments $sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . ' WHERE ' . $this->db->sql_in_set($this->sql_id, $this->ids); @@ -329,7 +362,7 @@ class delete /** * Delete attachments from filesystem */ - protected function remove_from_filesystem() + protected function remove_from_filesystem($mode, $ids, $resync) { $space_removed = $files_removed = 0; @@ -348,6 +381,13 @@ class delete } } + $sql_id = $this->sql_id; + $post_ids = $this->post_ids; + $topic_ids = $this->topic_ids; + $message_ids = $this->message_ids; + $physical = $this->physical; + $num_deleted = $this->num_deleted; + /** * Perform additional actions after attachment(s) deletion from the filesystem * @@ -380,6 +420,14 @@ class delete ); extract($this->dispatcher->trigger_event('core.delete_attachments_from_filesystem_after', compact($vars))); + $this->sql_id = $sql_id; + $this->post_ids = $post_ids; + $this->topic_ids = $topic_ids; + $this->message_ids = $message_ids; + $this->physical = $physical; + $this->num_deleted = $num_deleted; + unset($sql_id, $post_ids, $topic_ids, $message_ids, $physical, $num_deleted); + if ($space_removed || $files_removed) { $this->config->increment('upload_dir_size', $space_removed * (-1), false); From 225a6e2cbeeb9e851b43b069ee34cd5dee91649c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Mon, 13 Aug 2018 15:55:14 +0200 Subject: [PATCH 038/148] [ticket/15747] Replace migration PHPBB3-15747 --- .../storage_adapter_local_depth_rename.php | 45 ------------------- ...p => storage_adapter_local_subfolders.php} | 8 ++-- 2 files changed, 4 insertions(+), 49 deletions(-) delete mode 100644 phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth_rename.php rename phpBB/phpbb/db/migration/data/v330/{storage_adapter_local_depth.php => storage_adapter_local_subfolders.php} (75%) diff --git a/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth_rename.php b/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth_rename.php deleted file mode 100644 index 295fae5584..0000000000 --- a/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth_rename.php +++ /dev/null @@ -1,45 +0,0 @@ - -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -namespace phpbb\db\migration\data\v330; - -class storage_adapter_local_depth_rename extends \phpbb\db\migration\migration -{ - static public function depends_on() - { - return array( - '\phpbb\db\migration\data\v330\storage_adapter_local_depth', - ); - } - - public function update_data() - { - return array( - array('if', array( - ($this->config['storage\\attachment\\provider'] == \phpbb\storage\provider\local::class), - array('config.delete', array('storage\\attachment\\config\\depth')), - array('config.add', array('storage\\attachment\\config\\subfolders', '0')), - )), - array('if', array( - ($this->config['storage\\avatar\\provider'] == \phpbb\storage\provider\local::class), - array('config.delete', array('storage\\avatar\\config\\depth')), - array('config.add', array('storage\\avatar\\config\\subfolders', '0')), - )), - array('if', array( - ($this->config['storage\\backup\\provider'] == \phpbb\storage\provider\local::class), - array('config.delete', array('storage\\backup\\config\\depth')), - array('config.add', array('storage\\backup\\config\\subfolders', '0')), - )), - ); - } -} diff --git a/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth.php b/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_subfolders.php similarity index 75% rename from phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth.php rename to phpBB/phpbb/db/migration/data/v330/storage_adapter_local_subfolders.php index 2da4c1954a..491388054c 100644 --- a/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_depth.php +++ b/phpBB/phpbb/db/migration/data/v330/storage_adapter_local_subfolders.php @@ -13,7 +13,7 @@ namespace phpbb\db\migration\data\v330; -class storage_adapter_local_depth extends \phpbb\db\migration\migration +class storage_adapter_local_subfolders extends \phpbb\db\migration\migration { static public function depends_on() { @@ -29,15 +29,15 @@ class storage_adapter_local_depth extends \phpbb\db\migration\migration return array( array('if', array( ($this->config['storage\\attachment\\provider'] == \phpbb\storage\provider\local::class), - array('config.add', array('storage\\attachment\\config\\depth', '0')), + array('config.add', array('storage\\attachment\\config\\subfolders', '0')), )), array('if', array( ($this->config['storage\\avatar\\provider'] == \phpbb\storage\provider\local::class), - array('config.add', array('storage\\avatar\\config\\depth', '0')), + array('config.add', array('storage\\avatar\\config\\subfolders', '0')), )), array('if', array( ($this->config['storage\\backup\\provider'] == \phpbb\storage\provider\local::class), - array('config.add', array('storage\\backup\\config\\depth', '0')), + array('config.add', array('storage\\backup\\config\\subfolders', '0')), )), ); } From b2d74063811ac1eea57a5a80c8cd67befbe30aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Wed, 15 Aug 2018 01:01:43 +0200 Subject: [PATCH 039/148] [ticket/15747] Add test PHPBB3-15747 --- phpBB/phpbb/storage/adapter/local.php | 32 +++-- .../storage/adapter/local_subfolders_test.php | 136 ++++++++++++++++++ tests/storage/adapter/local_test.php | 75 ++++------ 3 files changed, 179 insertions(+), 64 deletions(-) create mode 100644 tests/storage/adapter/local_subfolders_test.php diff --git a/phpBB/phpbb/storage/adapter/local.php b/phpBB/phpbb/storage/adapter/local.php index 8e491b0240..c7fbe544e9 100644 --- a/phpBB/phpbb/storage/adapter/local.php +++ b/phpBB/phpbb/storage/adapter/local.php @@ -256,17 +256,20 @@ class local implements adapter_interface, stream_interface */ protected function remove_empty_dirs($path) { - $dirpath = dirname($this->root_path . $path); - $filepath = dirname($this->root_path . $this->get_path($path) . $this->get_filename($path)); - $path = filesystem_helper::make_path_relative($filepath, $dirpath); - - do + if ($this->subfolders) { - $parts = explode('/', $path); - $parts = array_slice($parts, 0, -1); - $path = implode('/', $parts); + $dirpath = dirname($this->root_path . $path); + $filepath = dirname($this->root_path . $this->get_path($path) . $this->get_filename($path)); + $path = filesystem_helper::make_path_relative($filepath, $dirpath); + + do + { + $parts = explode('/', $path); + $parts = array_slice($parts, 0, -1); + $path = implode('/', $parts); + } + while ($path && @rmdir($dirpath . '/' . $path)); } - while ($path && @rmdir($dirpath . '/' . $path)); } /** @@ -277,6 +280,9 @@ class local implements adapter_interface, stream_interface */ protected function get_path($path) { + $dirname = dirname($path); + $dirname = ($dirname != '.') ? $dirname . DIRECTORY_SEPARATOR : ''; + if ($this->subfolders) { $hash = md5(basename($path)); @@ -284,17 +290,13 @@ class local implements adapter_interface, stream_interface $parts = str_split($hash, 2); $parts = array_slice($parts, 0, $this->dir_depth); - // Create path - $dirname = dirname($path); - $path = $dirname . DIRECTORY_SEPARATOR; - if (!empty($parts)) { - $path .= implode(DIRECTORY_SEPARATOR, $parts) . DIRECTORY_SEPARATOR; + $dirname .= implode(DIRECTORY_SEPARATOR, $parts) . DIRECTORY_SEPARATOR; } } - return $path; + return $dirname; } /** diff --git a/tests/storage/adapter/local_subfolders_test.php b/tests/storage/adapter/local_subfolders_test.php new file mode 100644 index 0000000000..250e1973c7 --- /dev/null +++ b/tests/storage/adapter/local_subfolders_test.php @@ -0,0 +1,136 @@ + + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + + class phpbb_storage_adapter_local_subfolders_test extends phpbb_test_case + { + protected $adapter; + + protected $path; + + protected $filesystem; + + public function setUp() + { + parent::setUp(); + + $this->filesystem = new \phpbb\filesystem\filesystem(); + $phpbb_root_path = getcwd() . DIRECTORY_SEPARATOR; + + $this->adapter = new \phpbb\storage\adapter\local($this->filesystem, new \FastImageSize\FastImageSize(), new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser)), $phpbb_root_path); + $this->adapter->configure(['path' => 'test_path', 'subfolders' => true]); + + $this->path = $phpbb_root_path . 'test_path/'; + mkdir($this->path); + } + + public function tearDown() + { + $this->adapter = null; + rmdir($this->path); + } + + public function test_put_contents() + { + $this->adapter->put_contents('file.txt', 'abc'); + $this->assertTrue(file_exists($this->path . '3d/8e/file.txt')); + $this->assertEquals(file_get_contents($this->path . '3d/8e/file.txt'), 'abc'); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + } + + public function test_get_contents() + { + mkdir($this->path . '3d/8e', 0777, true); + file_put_contents($this->path . '3d/8e/file.txt', 'abc'); + $this->assertEquals($this->adapter->get_contents('file.txt'), 'abc'); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + } + + public function test_exists() + { + mkdir($this->path . '3d/8e', 0777, true); + touch($this->path . '3d/8e/file.txt'); + $this->assertTrue($this->adapter->exists('file.txt')); + $this->assertFalse($this->adapter->exists('3d/8e/file.txt')); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + } + + public function test_delete_file() + { + mkdir($this->path . '3d/8e', 0777, true); + touch($this->path . '3d/8e/file.txt'); + $this->assertTrue(file_exists($this->path . '3d/8e/file.txt')); + $this->adapter->delete('file.txt'); + $this->assertFalse(file_exists($this->path . '3d/8e/file.txt')); + $this->assertFalse(file_exists($this->path . '3d')); + } + + public function test_rename() + { + mkdir($this->path . '3d/8e', 0777, true); + touch($this->path . '3d/8e/file.txt'); + $this->adapter->rename('file.txt', 'file2.txt'); + $this->assertFalse(file_exists($this->path . '3d/8e/file.txt')); + $this->assertTrue(file_exists($this->path . '27/36/file2.txt')); + $this->assertFalse(file_exists($this->path . '3d')); + unlink($this->path . '27/36/file2.txt'); + rmdir($this->path . '27/36'); + rmdir($this->path . '27'); + } + + public function test_copy() + { + mkdir($this->path . '3d/8e', 0777, true); + file_put_contents($this->path . '3d/8e/file.txt', 'abc'); + $this->adapter->copy('file.txt', 'file2.txt'); + $this->assertEquals(file_get_contents($this->path . '3d/8e/file.txt'), 'abc'); + $this->assertEquals(file_get_contents($this->path . '27/36/file2.txt'), 'abc'); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + unlink($this->path . '27/36/file2.txt'); + rmdir($this->path . '27/36'); + rmdir($this->path . '27'); + } + + public function test_read_stream() + { + mkdir($this->path . '3d/8e', 0777, true); + touch($this->path . '3d/8e/file.txt'); + $stream = $this->adapter->read_stream('file.txt'); + $this->assertTrue(is_resource($stream)); + fclose($stream); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + } + + public function test_write_stream() + { + file_put_contents($this->path . 'file.txt', 'abc'); + $stream = fopen($this->path . 'file.txt', 'rb'); + $this->adapter->write_stream('file2.txt', $stream); + fclose($stream); + $this->assertEquals(file_get_contents($this->path . '27/36/file2.txt'), 'abc'); + unlink($this->path . 'file.txt'); + unlink($this->path . '27/36/file2.txt'); + rmdir($this->path . '27/36'); + rmdir($this->path . '27'); + } + + } diff --git a/tests/storage/adapter/local_test.php b/tests/storage/adapter/local_test.php index d24759b8d3..eb4b5e0dcf 100644 --- a/tests/storage/adapter/local_test.php +++ b/tests/storage/adapter/local_test.php @@ -27,7 +27,7 @@ $phpbb_root_path = getcwd() . DIRECTORY_SEPARATOR; $this->adapter = new \phpbb\storage\adapter\local($this->filesystem, new \FastImageSize\FastImageSize(), new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser)), $phpbb_root_path); - $this->adapter->configure(['path' => 'test_path', 'subfolders' => true]); + $this->adapter->configure(['path' => 'test_path', 'subfolders' => false]); $this->path = $phpbb_root_path . 'test_path/'; mkdir($this->path); @@ -42,82 +42,61 @@ public function test_put_contents() { $this->adapter->put_contents('file.txt', 'abc'); - $this->assertTrue(file_exists($this->path . '3d/8e/file.txt')); - $this->assertEquals(file_get_contents($this->path . '3d/8e/file.txt'), 'abc'); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); + $this->assertTrue(file_exists($this->path . 'file.txt')); + $this->assertEquals(file_get_contents($this->path . 'file.txt'), 'abc'); + unlink($this->path . 'file.txt'); } public function test_get_contents() { - mkdir($this->path . '3d/8e', 0777, true); - file_put_contents($this->path . '3d/8e/file.txt', 'abc'); + file_put_contents($this->path . 'file.txt', 'abc'); $this->assertEquals($this->adapter->get_contents('file.txt'), 'abc'); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); + unlink($this->path . 'file.txt'); } public function test_exists() { - mkdir($this->path . '3d/8e', 0777, true); - touch($this->path . '3d/8e/file.txt'); + touch($this->path . 'file.txt'); $this->assertTrue($this->adapter->exists('file.txt')); - $this->assertFalse($this->adapter->exists('3d/8e/file.txt')); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); + $this->assertFalse($this->adapter->exists('noexist.txt')); + unlink($this->path . 'file.txt'); } public function test_delete_file() { - mkdir($this->path . '3d/8e', 0777, true); - touch($this->path . '3d/8e/file.txt'); - $this->assertTrue(file_exists($this->path . '3d/8e/file.txt')); + touch($this->path . 'file.txt'); + $this->assertTrue(file_exists($this->path . 'file.txt')); $this->adapter->delete('file.txt'); - $this->assertFalse(file_exists($this->path . '3d/8e/file.txt')); - $this->assertFalse(file_exists($this->path . '3d')); + $this->assertFalse(file_exists($this->path . 'file.txt')); } public function test_rename() { - mkdir($this->path . '3d/8e', 0777, true); - touch($this->path . '3d/8e/file.txt'); + touch($this->path . 'file.txt'); $this->adapter->rename('file.txt', 'file2.txt'); - $this->assertFalse(file_exists($this->path . '3d/8e/file.txt')); - $this->assertTrue(file_exists($this->path . '27/36/file2.txt')); - $this->assertFalse(file_exists($this->path . '3d')); - unlink($this->path . '27/36/file2.txt'); - rmdir($this->path . '27/36'); - rmdir($this->path . '27'); + $this->assertFalse(file_exists($this->path . 'file.txt')); + $this->assertTrue(file_exists($this->path . 'file2.txt')); + $this->assertFalse(file_exists($this->path . 'file.txt')); + unlink($this->path . 'file2.txt'); } public function test_copy() { - mkdir($this->path . '3d/8e', 0777, true); - file_put_contents($this->path . '3d/8e/file.txt', 'abc'); + file_put_contents($this->path . 'file.txt', 'abc'); $this->adapter->copy('file.txt', 'file2.txt'); - $this->assertEquals(file_get_contents($this->path . '3d/8e/file.txt'), 'abc'); - $this->assertEquals(file_get_contents($this->path . '27/36/file2.txt'), 'abc'); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); - unlink($this->path . '27/36/file2.txt'); - rmdir($this->path . '27/36'); - rmdir($this->path . '27'); + $this->assertEquals(file_get_contents($this->path . 'file.txt'), 'abc'); + $this->assertEquals(file_get_contents($this->path . 'file2.txt'), 'abc'); + unlink($this->path . 'file.txt'); + unlink($this->path . 'file2.txt'); } public function test_read_stream() { - mkdir($this->path . '3d/8e', 0777, true); - touch($this->path . '3d/8e/file.txt'); + touch($this->path . 'file.txt'); $stream = $this->adapter->read_stream('file.txt'); $this->assertTrue(is_resource($stream)); fclose($stream); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); + unlink($this->path . 'file.txt'); } public function test_write_stream() @@ -126,11 +105,9 @@ $stream = fopen($this->path . 'file.txt', 'rb'); $this->adapter->write_stream('file2.txt', $stream); fclose($stream); - $this->assertEquals(file_get_contents($this->path . '27/36/file2.txt'), 'abc'); + $this->assertEquals(file_get_contents($this->path . 'file2.txt'), 'abc'); unlink($this->path . 'file.txt'); - unlink($this->path . '27/36/file2.txt'); - rmdir($this->path . '27/36'); - rmdir($this->path . '27'); + unlink($this->path . 'file2.txt'); } } From 1d43e15c6064bae3f7caf1c72fb4e3d110a61d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Fri, 15 Jun 2018 15:54:16 +0200 Subject: [PATCH 040/148] [ticket/15692] Move checks if file exist from adapter to storage PHPBB3-15692 --- .../storage/adapter/adapter_interface.php | 12 +- phpBB/phpbb/storage/adapter/local.php | 5 - phpBB/phpbb/storage/storage.php | 103 ++++++++++++++++-- 3 files changed, 96 insertions(+), 24 deletions(-) diff --git a/phpBB/phpbb/storage/adapter/adapter_interface.php b/phpBB/phpbb/storage/adapter/adapter_interface.php index 6d8b561c25..9c97f34a11 100644 --- a/phpBB/phpbb/storage/adapter/adapter_interface.php +++ b/phpBB/phpbb/storage/adapter/adapter_interface.php @@ -28,8 +28,7 @@ interface adapter_interface * @param string path The file to be written to. * @param string content The data to write into the file. * - * @throws \phpbb\storage\exception\exception When the file already exists - * When the file cannot be written + * @throws \phpbb\storage\exception\exception When the file cannot be written */ public function put_contents($path, $content); @@ -38,8 +37,7 @@ interface adapter_interface * * @param string $path The file to read * - * @throws \phpbb\storage\exception\exception When the file doesn't exist - * When cannot read file contents + * @throws \phpbb\storage\exception\exception When cannot read file contents * * @return string Returns file contents * @@ -70,8 +68,7 @@ interface adapter_interface * @param string $path_orig The original file/direcotry * @param string $path_dest The target file/directory * - * @throws \phpbb\storage\exception\exception When target exists - * When file/directory cannot be renamed + * @throws \phpbb\storage\exception\exception When file/directory cannot be renamed */ public function rename($path_orig, $path_dest); @@ -81,8 +78,7 @@ interface adapter_interface * @param string $path_orig The original filename * @param string $path_dest The target filename * - * @throws \phpbb\storage\exception\exception When target exists - * When the file cannot be copied + * @throws \phpbb\storage\exception\exception When the file cannot be copied */ public function copy($path_orig, $path_dest); diff --git a/phpBB/phpbb/storage/adapter/local.php b/phpBB/phpbb/storage/adapter/local.php index c7fbe544e9..7f55590fd8 100644 --- a/phpBB/phpbb/storage/adapter/local.php +++ b/phpBB/phpbb/storage/adapter/local.php @@ -118,11 +118,6 @@ class local implements adapter_interface, stream_interface { $this->ensure_directory_exists($path); - if ($this->exists($path)) - { - throw new exception('STORAGE_FILE_EXISTS', $path); - } - try { $this->filesystem->dump_file($this->root_path . $this->get_path($path) . $this->get_filename($path), $content); diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 97d71048ee..b9c20ed7cf 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -106,8 +106,22 @@ class storage */ public function put_contents($path, $content) { - $this->get_adapter()->put_contents($path, $content); - $this->track_file($path); + if ($this->exists($path)) + { + throw new exception('STORAGE_FILE_EXISTS', $path); + } + + try + { + $this->get_adapter()->put_contents($path, $content); + $this->track_file($path); + } + catch (\Exception $e) + { + $this->get_adapter()->delete($path); + $this->untrack_file($path); + throw $e; + } } /** @@ -123,6 +137,11 @@ class storage */ public function get_contents($path) { + if (!$this->exists($path)) + { + throw new exception('STORAGE_FILE_NO_EXIST', $path); + } + return $this->get_adapter()->get_contents($path); } @@ -147,6 +166,11 @@ class storage */ public function delete($path) { + if (!$this->exists($path)) + { + throw new exception('STORAGE_FILE_NO_EXIST', $path); + } + $this->get_adapter()->delete($path); $this->untrack_file($path); } @@ -157,13 +181,31 @@ class storage * @param string $path_orig The original file/direcotry * @param string $path_dest The target file/directory * - * @throws \phpbb\storage\exception\exception When target exists + * @throws \phpbb\storage\exception\exception When the file doesn't exist + * When target exists * When file/directory cannot be renamed */ public function rename($path_orig, $path_dest) { - $this->get_adapter()->rename($path_orig, $path_dest); - $this->track_rename($path_orig, $path_dest); + if (!$this->exists($path_orig)) + { + throw new exception('STORAGE_FILE_NO_EXIST', $path_orig); + } + + if ($this->exists($path_dest)) + { + throw new exception('STORAGE_FILE_EXISTS', $path_dest); + } + + try { + $this->get_adapter()->rename($path_orig, $path_dest); + $this->track_rename($path_orig, $path_dest); + } + catch (\Exception $e) + { + $this->untrack_file($path_dest); + throw $e; + } } /** @@ -172,13 +214,32 @@ class storage * @param string $path_orig The original filename * @param string $path_dest The target filename * - * @throws \phpbb\storage\exception\exception When target exists + * @throws \phpbb\storage\exception\exception When the file doesn't exist + * When target exists * When the file cannot be copied */ public function copy($path_orig, $path_dest) { - $this->get_adapter()->copy($path_orig, $path_dest); - $this->track_file($path_dest); + if (!$this->exists($path_orig)) + { + throw new exception('STORAGE_FILE_NO_EXIST', $path_orig); + } + + if ($this->exists($path_dest)) + { + throw new exception('STORAGE_FILE_EXISTS', $path_dest); + } + + try + { + $this->get_adapter()->copy($path_orig, $path_dest); + $this->track_file($path_dest); + } + catch (\Exception $e) + { + $this->untrack_file($path_dest); + throw $e; + } } /** @@ -186,12 +247,18 @@ class storage * * @param string $path File to read * - * @throws \phpbb\storage\exception\exception When unable to open file + * @throws \phpbb\storage\exception\exception When the file doesn't exist + * When unable to open file * * @return resource Returns a file pointer */ public function read_stream($path) { + if (!$this->exists($path)) + { + throw new exception('STORAGE_FILE_NO_EXIST', $path); + } + $stream = null; $adapter = $this->get_adapter(); @@ -217,15 +284,29 @@ class storage * @param string $path The target file * @param resource $resource The resource * - * @throws \phpbb\storage\exception\exception When target file cannot be created + * @throws \phpbb\storage\exception\exception When the file exist + * When target file cannot be created */ public function write_stream($path, $resource) { + if ($this->exists($path)) + { + throw new exception('STORAGE_FILE_EXISTS', $path); + } + $adapter = $this->get_adapter(); if ($adapter instanceof stream_interface) { - $adapter->write_stream($path, $resource); + try + { + $adapter->write_stream($path, $resource); + } + catch (\Exception $e) + { + $this->get_adapter()->delete($path); + $this->untrack_file($path); + } } else { From 4fed28577902a363749dc3f63df1c02f06d6d051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Fri, 15 Jun 2018 15:58:16 +0200 Subject: [PATCH 041/148] [ticket/15692] Reduce storage api calls PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index b9c20ed7cf..f2fabdcb94 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -154,7 +154,7 @@ class storage */ public function exists($path) { - return $this->get_adapter()->exists($path); + return $this->is_tracked($path); } /** @@ -376,6 +376,23 @@ class storage $this->cache->destroy('_storage_' . $this->get_name() . '_numfiles'); } + public function is_tracked($path) + { + $sql_ary = array( + 'file_path' => $path, + 'storage' => $this->get_name(), + ); + + // Get file, if exist update filesize, if not add new record + $sql = 'SELECT file_id FROM ' . $this->storage_table . ' + WHERE ' . $this->db->sql_build_array('SELECT', $sql_ary); + $result = $this->db->sql_query($sql); + $row = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + return ($row) ? true : false; + } + /** * Rename tracked file * From 3ebbb8b837bbf98d1965fb0e7e52bc432957e8a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Fri, 15 Jun 2018 18:29:27 +0200 Subject: [PATCH 042/148] [ticket/15692] Add missing import PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 1 + 1 file changed, 1 insertion(+) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index f2fabdcb94..4097d7ac82 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -15,6 +15,7 @@ namespace phpbb\storage; use phpbb\cache\driver\driver_interface as cache; use phpbb\db\driver\driver_interface as db; +use phpbb\storage\exception\exception; /** * @internal Experimental From 5934bdaaf108b59129be5ffbf7260267742790ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Sat, 16 Jun 2018 17:42:58 +0200 Subject: [PATCH 043/148] [ticket/15692] Close db connection after use storage PHPBB3-15692 --- phpBB/includes/functions_download.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/functions_download.php b/phpBB/includes/functions_download.php index 6e25c0fbdb..b599e78a39 100644 --- a/phpBB/includes/functions_download.php +++ b/phpBB/includes/functions_download.php @@ -223,9 +223,6 @@ function send_file_to_browser($attachment, $category) } } - // Close the db connection before sending the file etc. - file_gc(false); - if (!set_modified_headers($attachment['filetime'], $user->browser)) { if ($size) @@ -238,6 +235,9 @@ function send_file_to_browser($attachment, $category) $fp = $storage->read_stream($filename); + // Close the db connection before sending the file etc. + file_gc(false); + if ($fp !== false) { $output = fopen('php://output', 'w+b'); From 9650763a19d0fd653e1b323d86973cafa2dc3b4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Sat, 16 Jun 2018 17:46:19 +0200 Subject: [PATCH 044/148] [ticket/15692] Allow to check if file exists using adapter too PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 4097d7ac82..d3e2024a50 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -153,9 +153,9 @@ class storage * * @return bool Returns true if the file/directory exist, false otherwise. */ - public function exists($path) + public function exists($path, $full_check = false) { - return $this->is_tracked($path); + return ($this->is_tracked($path) && $full_check && $this->get_adapter()->exists($path)); } /** From d65e60d1a6afe6f13313e16de14c62fdd6b78f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Thu, 21 Jun 2018 04:56:25 +0200 Subject: [PATCH 045/148] [ticket/15692] Fix exists condition and add more checks if file exists PHPBB3-15692 --- phpBB/phpbb/storage/adapter/local.php | 2 +- phpBB/phpbb/storage/storage.php | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/phpBB/phpbb/storage/adapter/local.php b/phpBB/phpbb/storage/adapter/local.php index 7f55590fd8..da3950186e 100644 --- a/phpBB/phpbb/storage/adapter/local.php +++ b/phpBB/phpbb/storage/adapter/local.php @@ -356,7 +356,7 @@ class local implements adapter_interface, stream_interface */ public function file_size($path) { - $size = filesize($this->root_path . $this->get_path($path) . $this->get_filename($path)); + $size = @filesize($this->root_path . $this->get_path($path) . $this->get_filename($path)); if ($size === null) { diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index d3e2024a50..4a31f87e82 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -155,7 +155,7 @@ class storage */ public function exists($path, $full_check = false) { - return ($this->is_tracked($path) && $full_check && $this->get_adapter()->exists($path)); + return ($this->is_tracked($path) && ($full_check ? $this->get_adapter()->exists($path) : true)); } /** @@ -324,6 +324,11 @@ class storage */ public function track_file($path, $update = false) { + if (!$this->get_adapter()->exists($path)) + { + throw new exception('STORAGE_FILE_NO_EXIST', $path); + } + $sql_ary = array( 'file_path' => $path, 'storage' => $this->get_name(), @@ -338,7 +343,7 @@ class storage if (!$row) { - $file = $this->file_info($path); + $file = new file_info($this->get_adapter(), $path); $sql_ary['filesize'] = $file->size; $sql = 'INSERT INTO ' . $this->storage_table . $this->db->sql_build_array('INSERT', $sql_ary); @@ -420,6 +425,11 @@ class storage */ public function file_info($path) { + if (!$this->exists($path)) + { + throw new exception('STORAGE_FILE_NO_EXIST', $path); + } + return new file_info($this->get_adapter(), $path); } From d40bda0e08ee3e63dd97ec1aa50bf6e15246c575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Thu, 21 Jun 2018 05:11:31 +0200 Subject: [PATCH 046/148] [ticket/15692] Modify condition PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 4a31f87e82..deab3b708a 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -155,7 +155,7 @@ class storage */ public function exists($path, $full_check = false) { - return ($this->is_tracked($path) && ($full_check ? $this->get_adapter()->exists($path) : true)); + return ($this->is_tracked($path) && !$full_check || $this->get_adapter()->exists($path)); } /** From 69c1f5713cb72cc98bd0304c6e73d1b6b84a05fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Thu, 21 Jun 2018 05:29:26 +0200 Subject: [PATCH 047/148] [ticket/15692] Modify variable PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index deab3b708a..fab84891f9 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -305,7 +305,7 @@ class storage } catch (\Exception $e) { - $this->get_adapter()->delete($path); + $adapter->delete($path); $this->untrack_file($path); } } From 071d5fe9971b33a57b52852743415435b02a44ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 7 Aug 2018 00:16:37 +0200 Subject: [PATCH 048/148] [ticket/15692] Remove useless code PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 46 +++++---------------------------- 1 file changed, 7 insertions(+), 39 deletions(-) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index fab84891f9..545f342e82 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -112,17 +112,8 @@ class storage throw new exception('STORAGE_FILE_EXISTS', $path); } - try - { - $this->get_adapter()->put_contents($path, $content); - $this->track_file($path); - } - catch (\Exception $e) - { - $this->get_adapter()->delete($path); - $this->untrack_file($path); - throw $e; - } + $this->get_adapter()->put_contents($path, $content); + $this->track_file($path); } /** @@ -198,15 +189,8 @@ class storage throw new exception('STORAGE_FILE_EXISTS', $path_dest); } - try { - $this->get_adapter()->rename($path_orig, $path_dest); - $this->track_rename($path_orig, $path_dest); - } - catch (\Exception $e) - { - $this->untrack_file($path_dest); - throw $e; - } + $this->get_adapter()->rename($path_orig, $path_dest); + $this->track_rename($path_orig, $path_dest); } /** @@ -231,16 +215,8 @@ class storage throw new exception('STORAGE_FILE_EXISTS', $path_dest); } - try - { - $this->get_adapter()->copy($path_orig, $path_dest); - $this->track_file($path_dest); - } - catch (\Exception $e) - { - $this->untrack_file($path_dest); - throw $e; - } + $this->get_adapter()->copy($path_orig, $path_dest); + $this->track_file($path_dest); } /** @@ -299,15 +275,7 @@ class storage if ($adapter instanceof stream_interface) { - try - { - $adapter->write_stream($path, $resource); - } - catch (\Exception $e) - { - $adapter->delete($path); - $this->untrack_file($path); - } + $adapter->write_stream($path, $resource); } else { From 5fbe929a1d5b4c8354406245db743c597f052a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 7 Aug 2018 00:18:25 +0200 Subject: [PATCH 049/148] [ticket/15692] Check if argument is a valid resource PHPBB3-15692 --- phpBB/language/en/common.php | 1 + phpBB/phpbb/storage/storage.php | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index c7325043b2..1bd8ac1e44 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -745,6 +745,7 @@ $lang = array_merge($lang, array( 'STORAGE_CANNOT_CREATE_DIR' => 'Can not create directory.', 'STORAGE_CANNOT_OPEN_FILE' => 'Can not open file.', 'STORAGE_CANNOT_CREATE_FILE' => 'Can not create file.', + 'STORAGE_INVALID_RESOURCE' => 'Resource is invalid.', 'TB' => 'TB', 'TERMS_LINK' => 'Terms', diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 545f342e82..25c81075c4 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -271,6 +271,11 @@ class storage throw new exception('STORAGE_FILE_EXISTS', $path); } + if (!is_resource($resource)) + { + throw new exception('STORAGE_INVALID_RESOURCE'); + } + $adapter = $this->get_adapter(); if ($adapter instanceof stream_interface) From d0b7875b1881b84cd23f323a6b88318e70c159e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 7 Aug 2018 00:23:47 +0200 Subject: [PATCH 050/148] [ticket/15692] Update tests PHPBB3-15692 --- tests/attachment/delete_test.php | 18 ++---------------- tests/attachment/upload_test.php | 13 ++++--------- tests/avatar/manager_test.php | 13 ++----------- tests/notification/submit_post_base.php | 1 - tests/privmsgs/delete_user_pms_test.php | 11 +---------- 5 files changed, 9 insertions(+), 47 deletions(-) diff --git a/tests/attachment/delete_test.php b/tests/attachment/delete_test.php index 35dbf5d47d..67adc50edf 100644 --- a/tests/attachment/delete_test.php +++ b/tests/attachment/delete_test.php @@ -21,9 +21,6 @@ class phpbb_attachment_delete_test extends \phpbb_database_test_case /** @var \phpbb\db\driver\driver_interface */ protected $db; - /** @var \phpbb\filesystem\filesystem */ - protected $filesystem; - /** @var \phpbb\attachment\resync */ protected $resync; @@ -47,22 +44,11 @@ class phpbb_attachment_delete_test extends \phpbb_database_test_case $cache = $this->createMock('\phpbb\cache\driver\driver_interface'); $this->config = new \phpbb\config\config(array()); $this->db = $this->new_dbal(); - $db_mock = $this->createMock('\phpbb\db\driver\driver_interface'); $this->resync = new \phpbb\attachment\resync($this->db); - $this->filesystem = $this->createMock('\phpbb\filesystem\filesystem', array('remove', 'exists')); - $this->filesystem->expects($this->any()) - ->method('remove') - ->willReturn(false); - $this->filesystem->expects($this->any()) + $this->storage = $this->createMock('\phpbb\storage\storage'); + $this->storage->expects($this->any()) ->method('exists') ->willReturn(true); - $adapter = new \phpbb\storage\adapter\local($this->filesystem, new \FastImageSize\FastImageSize(), new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser)), $phpbb_root_path); - $adapter->configure(['path' => 'files']); - $adapter_factory_mock = $this->createMock('\phpbb\storage\adapter_factory'); - $adapter_factory_mock->expects($this->any()) - ->method('get') - ->willReturn($adapter); - $this->storage = new \phpbb\storage\storage($db_mock, $cache, $adapter_factory_mock, '', ''); $this->dispatcher = new \phpbb_mock_event_dispatcher(); $this->attachment_delete = new \phpbb\attachment\delete($this->config, $this->db, $this->dispatcher, $this->resync, $this->storage); } diff --git a/tests/attachment/upload_test.php b/tests/attachment/upload_test.php index f1df81bc8a..2a0bf0fa40 100644 --- a/tests/attachment/upload_test.php +++ b/tests/attachment/upload_test.php @@ -86,9 +86,7 @@ class phpbb_attachment_upload_test extends \phpbb_database_test_case )); $config = $this->config; $this->db = $this->new_dbal(); - $db_mock = $this->createMock('\phpbb\db\driver\driver_interface'); $this->cache = new \phpbb\cache\service(new \phpbb\cache\driver\dummy(), $this->config, $this->db, $phpbb_root_path, $phpEx); - $cache_mock = $this->createMock('\phpbb\cache\driver\driver_interface'); $this->request = $this->createMock('\phpbb\request\request'); $this->filesystem = new \phpbb\filesystem\filesystem(); @@ -105,13 +103,10 @@ class phpbb_attachment_upload_test extends \phpbb_database_test_case $this->mimetype_guesser = new \phpbb\mimetype\guesser($guessers); $this->plupload = new \phpbb\plupload\plupload($phpbb_root_path, $this->config, $this->request, new \phpbb\user($this->language, '\phpbb\datetime'), $this->php_ini, $this->mimetype_guesser); - $adapter = new \phpbb\storage\adapter\local($this->filesystem, new \FastImageSize\FastImageSize(), new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser)), $phpbb_root_path); - $adapter->configure(['path' => 'files']); - $adapter_factory_mock = $this->createMock('\phpbb\storage\adapter_factory'); - $adapter_factory_mock->expects($this->any()) - ->method('get') - ->willReturn($adapter); - $this->storage = new \phpbb\storage\storage($db_mock, $cache_mock, $adapter_factory_mock, '', ''); + $this->storage = $this->createMock('\phpbb\storage\storage'); + $this->storage->expects($this->any()) + ->method('free_space') + ->willReturn(1024*1024); // 1gb $factory_mock = $this->getMockBuilder('\phpbb\files\factory') ->disableOriginalConstructor() diff --git a/tests/avatar/manager_test.php b/tests/avatar/manager_test.php index c390eac883..8248223390 100644 --- a/tests/avatar/manager_test.php +++ b/tests/avatar/manager_test.php @@ -30,25 +30,16 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case global $phpbb_root_path, $phpEx; // Mock phpbb_container - - $cache = $this->createMock('\phpbb\cache\driver\driver_interface'); $phpbb_container = $this->createMock('Symfony\Component\DependencyInjection\ContainerInterface'); $phpbb_container->expects($this->any()) ->method('get') ->will($this->returnArgument(0)); - $filesystem = new \phpbb\filesystem\filesystem(); - $adapter = new \phpbb\storage\adapter\local($filesystem, new \FastImageSize\FastImageSize(), new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser)), $phpbb_root_path); - $adapter->configure(['path' => 'images/avatars/upload']); - $db = $this->createMock('\phpbb\db\driver\driver_interface'); - $adapter_factory_mock = $this->createMock('\phpbb\storage\adapter_factory'); - $adapter_factory_mock->expects($this->any()) - ->method('get') - ->willReturn($adapter); - $storage = new \phpbb\storage\storage($db, $cache, $adapter_factory_mock, '', ''); + $storage = $this->createMock('\phpbb\storage\storage'); // Prepare dependencies for avatar manager and driver $this->config = new \phpbb\config\config(array()); + $cache = $this->createMock('\phpbb\cache\driver\driver_interface'); $path_helper = new \phpbb\path_helper( new \phpbb\symfony_request( new phpbb_mock_request() diff --git a/tests/notification/submit_post_base.php b/tests/notification/submit_post_base.php index 255d52bde0..c011011ba7 100644 --- a/tests/notification/submit_post_base.php +++ b/tests/notification/submit_post_base.php @@ -56,7 +56,6 @@ abstract class phpbb_notification_submit_post_base extends phpbb_database_test_c // Database $this->db = $this->new_dbal(); $db = $this->db; - $db_mock = $this->createMock('\phpbb\db\driver\driver_interface'); // Auth $auth = $this->createMock('\phpbb\auth\auth'); diff --git a/tests/privmsgs/delete_user_pms_test.php b/tests/privmsgs/delete_user_pms_test.php index 50761d72ca..f1d717f03c 100644 --- a/tests/privmsgs/delete_user_pms_test.php +++ b/tests/privmsgs/delete_user_pms_test.php @@ -87,21 +87,12 @@ class phpbb_privmsgs_delete_user_pms_test extends phpbb_database_test_case { global $db, $phpbb_container, $phpbb_root_path; - $cache = $this->createMock('\phpbb\cache\driver\driver_interface'); - $db = $this->new_dbal(); - $db_mock = $this->createMock('\phpbb\db\driver\driver_interface'); $phpbb_container = new phpbb_mock_container_builder(); $phpbb_container->set('notification_manager', new phpbb_mock_notification_manager()); - $adapter = new \phpbb\storage\adapter\local(new \phpbb\filesystem\filesystem(), new \FastImageSize\FastImageSize(), new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser)), $phpbb_root_path); - $adapter->configure(['path' => 'files']); - $adapter_factory_mock = $this->createMock('\phpbb\storage\adapter_factory'); - $adapter_factory_mock->expects($this->any()) - ->method('get') - ->willReturn($adapter); - $storage = new \phpbb\storage\storage($db_mock, $cache, $adapter_factory_mock, '', ''); + $storage = $this->createMock('\phpbb\storage\storage'); // Works as a workaround for tests $phpbb_container->set('attachment.manager', new \phpbb\attachment\delete(new \phpbb\config\config(array()), $db, new \phpbb_mock_event_dispatcher(), new \phpbb\attachment\resync($db), $storage)); From 115749a9ecc74c2ade96e7cf8c6d23c341a29374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 7 Aug 2018 00:35:58 +0200 Subject: [PATCH 051/148] [ticket/15692] Update docblock PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 25c81075c4..98cecb5936 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -142,7 +142,7 @@ class storage * * @param string $path file/directory to check * - * @return bool Returns true if the file/directory exist, false otherwise. + * @return bool Returns true if the file/directory exist, false otherwise */ public function exists($path, $full_check = false) { @@ -154,7 +154,8 @@ class storage * * @param string $path file/directory to remove * - * @throws \phpbb\storage\exception\exception When removal fails. + * @throws \phpbb\storage\exception\exception When removal fails + * When the file doesn't exist */ public function delete($path) { @@ -355,6 +356,13 @@ class storage $this->cache->destroy('_storage_' . $this->get_name() . '_numfiles'); } + /** + * Check if a file is tracked + * + * @param string $path The file + * + * @return bool True if file is tracked + */ public function is_tracked($path) { $sql_ary = array( @@ -393,6 +401,7 @@ class storage * @param string $path The file * * @throws \phpbb\storage\exception\not_implemented When the adapter doesnt implement the method + * When the file doesn't exist * * @return \phpbb\storage\file_info Returns file_info object */ From d5df62597b31aca30381deb1a1768c395f588769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 7 Aug 2018 01:42:29 +0200 Subject: [PATCH 052/148] [ticket/15692] Remove duplicated checks PHPBB3-15692 --- phpBB/phpbb/storage/adapter/local.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/phpBB/phpbb/storage/adapter/local.php b/phpBB/phpbb/storage/adapter/local.php index da3950186e..2ea8b8b03e 100644 --- a/phpBB/phpbb/storage/adapter/local.php +++ b/phpBB/phpbb/storage/adapter/local.php @@ -133,11 +133,6 @@ class local implements adapter_interface, stream_interface */ public function get_contents($path) { - if (!$this->exists($path)) - { - throw new exception('STORAGE_FILE_NO_EXIST', $path); - } - $content = @file_get_contents($this->root_path . $this->get_path($path) . $this->get_filename($path)); if ($content === false) @@ -326,11 +321,6 @@ class local implements adapter_interface, stream_interface { $this->ensure_directory_exists($path); - if ($this->exists($path)) - { - throw new exception('STORAGE_FILE_EXISTS', $path); - } - $stream = @fopen($this->root_path . $this->get_path($path) . $this->get_filename($path), 'w+b'); if (!$stream) From 0c1bf3c561beb7892a7fe008e27742784e420d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Thu, 9 Aug 2018 02:28:58 +0200 Subject: [PATCH 053/148] [ticket/15692] Fix full_check in exist method PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 98cecb5936..1f22090745 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -146,7 +146,7 @@ class storage */ public function exists($path, $full_check = false) { - return ($this->is_tracked($path) && !$full_check || $this->get_adapter()->exists($path)); + return ($this->is_tracked($path) && (!$full_check || $this->get_adapter()->exists($path))); } /** From 252bb7704c7b05860b50c27df97f6b46b3b0ef2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Mon, 20 Aug 2018 23:58:24 +0200 Subject: [PATCH 054/148] [ticket/15692] Add comment PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 1f22090745..1bd693b6fa 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -317,6 +317,9 @@ class storage if (!$row) { + // Don't call the method, because it check's if the file is tracked + // and is not (for now). This method check if the file exists using the adapter + // at the beginning. $file = new file_info($this->get_adapter(), $path); $sql_ary['filesize'] = $file->size; From 00938c25898303dde7f40b1315afbcbb4859d49f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 21 Aug 2018 00:22:47 +0200 Subject: [PATCH 055/148] [ticket/15760] Fix write_stream PHPBB3-15760 --- phpBB/includes/acp/acp_database.php | 2 -- phpBB/phpbb/attachment/upload.php | 2 -- phpBB/phpbb/files/filespec_storage.php | 2 -- phpBB/phpbb/storage/adapter/local.php | 2 ++ phpBB/phpbb/storage/storage.php | 1 + 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php index cb40ac547e..bd9f767d39 100644 --- a/phpBB/includes/acp/acp_database.php +++ b/phpBB/includes/acp/acp_database.php @@ -192,8 +192,6 @@ class acp_database fclose($fp); } - $storage->track_file($file); - // Remove file from tmp @unlink($temp_dir . '/' . $file); diff --git a/phpBB/phpbb/attachment/upload.php b/phpBB/phpbb/attachment/upload.php index 6202798e05..37978944aa 100644 --- a/phpBB/phpbb/attachment/upload.php +++ b/phpBB/phpbb/attachment/upload.php @@ -254,8 +254,6 @@ class upload { fclose($fp); } - - $this->storage->track_file($destination_name); } else { diff --git a/phpBB/phpbb/files/filespec_storage.php b/phpBB/phpbb/files/filespec_storage.php index 5f3b895a05..adf4135193 100644 --- a/phpBB/phpbb/files/filespec_storage.php +++ b/phpBB/phpbb/files/filespec_storage.php @@ -456,8 +456,6 @@ class filespec_storage { fclose($fp); } - - $storage->track_file($this->destination_file); } catch (\phpbb\storage\exception\exception $e) { diff --git a/phpBB/phpbb/storage/adapter/local.php b/phpBB/phpbb/storage/adapter/local.php index c7fbe544e9..70df8043c8 100644 --- a/phpBB/phpbb/storage/adapter/local.php +++ b/phpBB/phpbb/storage/adapter/local.php @@ -348,6 +348,8 @@ class local implements adapter_interface, stream_interface fclose($stream); throw new exception('STORAGE_CANNOT_COPY_RESOURCE'); } + + fclose($stream); } /** diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 97d71048ee..869c84b3eb 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -226,6 +226,7 @@ class storage if ($adapter instanceof stream_interface) { $adapter->write_stream($path, $resource); + $this->track_file($path); } else { From f225d85acf17f4a76489d31a1fa9792a6616d63d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 21 Aug 2018 03:50:09 +0200 Subject: [PATCH 056/148] [ticket/15760] Remove comment PHPBB3-15760 --- phpBB/phpbb/storage/storage.php | 1 - 1 file changed, 1 deletion(-) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 869c84b3eb..7f9a7fdbb0 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -212,7 +212,6 @@ class storage /** * Writes a new file using a stream - * The file needs to be tracked after using this method * * @param string $path The target file * @param resource $resource The resource From c20d84ce1702b1ea69bcc2ffbb2435225021c7a1 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Tue, 21 Aug 2018 21:25:33 +0200 Subject: [PATCH 057/148] [ticket/15746] Adjust tests after twig update PHPBB3-15746 --- tests/template/template_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/template/template_test.php b/tests/template/template_test.php index 0f761abc76..727f35e9d2 100644 --- a/tests/template/template_test.php +++ b/tests/template/template_test.php @@ -364,7 +364,7 @@ class phpbb_template_template_test extends phpbb_template_template_test_case array(), array(), array(), - "Value'\n1 O'Clock\nValue\\x27\n1\\x20O\\x27Clock", + "Value'\n1 O'Clock\nValue\\u0027\n1\\u0020O\\u0027Clock", array('VARIABLE' => "Value'", '1_VARIABLE' => "1 O'Clock"), ), array( From b0b70589a25594a32ad072315e9f78b197e1bea6 Mon Sep 17 00:00:00 2001 From: hubaishan Date: Sat, 25 Aug 2018 16:17:55 +0300 Subject: [PATCH 058/148] [ticket/15612] Fix PHP7.2 count() bug in MSSQL driver sqlsrv_fetch_array() function returns an array when data found, null when no data or false on error. So we need to change null to false only. PHPBB3-15612 --- phpBB/phpbb/db/driver/mssqlnative.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/db/driver/mssqlnative.php b/phpBB/phpbb/db/driver/mssqlnative.php index de81a6a0c8..a4dcac5966 100644 --- a/phpBB/phpbb/db/driver/mssqlnative.php +++ b/phpBB/phpbb/db/driver/mssqlnative.php @@ -268,7 +268,7 @@ class mssqlnative extends \phpbb\db\driver\mssql_base unset($row['line2'], $row['line3']); } } - return (count($row)) ? $row : false; + return ($row !== null) ? $row : false; } /** From 35bfec5ebed0e745e33d7aedec6a845179c54239 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sun, 26 Aug 2018 10:00:15 +0200 Subject: [PATCH 059/148] [ticket/15746] Add missing symfony/polyfill-ctype to lock file PHPBB3-15746 --- phpBB/composer.lock | 66 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/phpBB/composer.lock b/phpBB/composer.lock index 1ddd55a56c..36e0e59631 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -1,7 +1,7 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], "content-hash": "d4049e58bd7f34c266088eb78b8eb847", @@ -1906,6 +1906,64 @@ "homepage": "https://symfony.com", "time": "2018-01-05T08:33:00+00:00" }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06T14:22:27+00:00" + }, { "name": "symfony/polyfill-mbstring", "version": "v1.9.0", @@ -1963,7 +2021,7 @@ "portable", "shim" ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/polyfill-php70", @@ -2416,7 +2474,7 @@ "keywords": [ "templating" ], - "time": "2017-09-27T18:06:46+00:00" + "time": "2018-07-13T07:12:17+00:00" }, { "name": "zendframework/zend-code", @@ -3044,7 +3102,7 @@ "spy", "stub" ], - "time": "2017-11-24T13:59:53+00:00" + "time": "2018-08-05T17:53:17+00:00" }, { "name": "phpunit/dbunit", From 4d7b16f439229800836caf04dc7599aceb9137ef Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sun, 26 Aug 2018 14:45:59 +0200 Subject: [PATCH 060/148] [prep-release-3.2.3] Update version numbers for 3.2.3 release --- build/build.xml | 6 +++--- phpBB/includes/constants.php | 2 +- phpBB/install/phpbbcli.php | 2 +- phpBB/install/schemas/schema_data.sql | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build/build.xml b/build/build.xml index 1434b4b619..890ebb67ce 100644 --- a/build/build.xml +++ b/build/build.xml @@ -2,9 +2,9 @@ - - - + + + diff --git a/phpBB/includes/constants.php b/phpBB/includes/constants.php index 576035805a..27574698c0 100644 --- a/phpBB/includes/constants.php +++ b/phpBB/includes/constants.php @@ -28,7 +28,7 @@ if (!defined('IN_PHPBB')) */ // phpBB Version -@define('PHPBB_VERSION', '3.2.3-RC2'); +@define('PHPBB_VERSION', '3.2.3'); // QA-related // define('PHPBB_QA', 1); diff --git a/phpBB/install/phpbbcli.php b/phpBB/install/phpbbcli.php index e0e746d569..7d8311ca0b 100755 --- a/phpBB/install/phpbbcli.php +++ b/phpBB/install/phpbbcli.php @@ -23,7 +23,7 @@ if (php_sapi_name() !== 'cli') define('IN_PHPBB', true); define('IN_INSTALL', true); define('PHPBB_ENVIRONMENT', 'production'); -define('PHPBB_VERSION', '3.2.3-RC2'); +define('PHPBB_VERSION', '3.2.3'); $phpbb_root_path = __DIR__ . '/../'; $phpEx = substr(strrchr(__FILE__, '.'), 1); diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index 31957b4742..ed811fab81 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -280,7 +280,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('tpl_allow_php', '0 INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_icons_path', 'images/upload_icons'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_path', 'files'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('use_system_cron', '0'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.2.3-RC2'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.2.3'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_expire_days', '90'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_gc', '14400'); From ecfd067f37bbcf3ce86c85f75ca0442c18be0531 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sun, 26 Aug 2018 14:47:24 +0200 Subject: [PATCH 061/148] [prep-release-3.2.3] Add 3.2.3 migration --- phpBB/phpbb/db/migration/data/v32x/v323.php | 37 +++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 phpBB/phpbb/db/migration/data/v32x/v323.php diff --git a/phpBB/phpbb/db/migration/data/v32x/v323.php b/phpBB/phpbb/db/migration/data/v32x/v323.php new file mode 100644 index 0000000000..1ec28ceb37 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v32x/v323.php @@ -0,0 +1,37 @@ + +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v32x; + +class v323 extends \phpbb\db\migration\migration +{ + public function effectively_installed() + { + return phpbb_version_compare($this->config['version'], '3.2.3', '>='); + } + + static public function depends_on() + { + return array( + '\phpbb\db\migration\data\v32x\v323rc2', + ); + + } + + public function update_data() + { + return array( + array('config.update', array('version', '3.2.3')), + ); + } +} From 8d89f20b81167520ee36aa78925b1dfe7eeffbbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Tue, 28 Aug 2018 00:32:06 +0200 Subject: [PATCH 062/148] [ticket/15692] Append / to board url PHPBB3-15692 --- phpBB/phpbb/storage/adapter/local.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/storage/adapter/local.php b/phpBB/phpbb/storage/adapter/local.php index 2ea8b8b03e..2b4b550aff 100644 --- a/phpBB/phpbb/storage/adapter/local.php +++ b/phpBB/phpbb/storage/adapter/local.php @@ -418,7 +418,7 @@ class local implements adapter_interface, stream_interface */ public function get_link($path) { - return generate_board_url() . $this->path . $path; + return generate_board_url() . '/' . $this->path . $path; } /** From b79aa3e147506f6e861bc777d40d758ee83d33c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Thu, 30 Aug 2018 07:06:18 +0200 Subject: [PATCH 063/148] [ticket/15762] Update type for forum_topics_per_page PHPBB3-15762 --- .../data/v32x/forum_topics_per_page_type.php | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php diff --git a/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php b/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php new file mode 100644 index 0000000000..b9b88bac29 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php @@ -0,0 +1,37 @@ + +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v32x; + +class forum_topics_per_page_type extends \phpbb\db\migration\migration +{ + + static public function depends_on() + { + return array( + '\phpbb\db\migration\data\v32x\v323rc2', + ); + } + + public function update_schema() + { + return array( + 'change_columns' => array( + $this->table_prefix . 'forums' => array( + 'forum_topics_per_page' => array('USINT', 0), + ), + ), + ); + } + +} From 9719d5a3d523723b2d471f5b2160171cd7291a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Thu, 30 Aug 2018 19:05:12 +0200 Subject: [PATCH 064/148] [ticket/15762] Update type for forum_topics_per_page in acp_forums PHPBB3-15762 --- phpBB/includes/acp/acp_forums.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php index 6b841560c9..13d74f0811 100644 --- a/phpBB/includes/acp/acp_forums.php +++ b/phpBB/includes/acp/acp_forums.php @@ -1012,7 +1012,7 @@ class acp_forums } $range_test_ary = array( - array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data_ary['forum_topics_per_page'], 'column_type' => 'TINT:0'), + array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data_ary['forum_topics_per_page'], 'column_type' => 'USINT:0'), ); if (!empty($forum_data_ary['forum_image']) && !file_exists($phpbb_root_path . $forum_data_ary['forum_image'])) From da77d04dd9ee8a4da22e0190ea31df38d9cdf233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Thu, 30 Aug 2018 21:15:56 +0200 Subject: [PATCH 065/148] [ticket/15255] Move language strings from acp/common to common PHPBB3-15255 --- phpBB/language/en/acp/common.php | 10 ---------- phpBB/language/en/common.php | 12 +++++++++++- phpBB/phpbb/filesystem/filesystem.php | 24 ++++++++++++------------ 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php index c6f62869de..5c0f9a3eed 100644 --- a/phpBB/language/en/acp/common.php +++ b/phpBB/language/en/acp/common.php @@ -234,16 +234,6 @@ $lang = array_merge($lang, array( 'BACK' => 'Back', - 'CANNOT_CHANGE_FILE_GROUP' => 'Unable to change file group', - 'CANNOT_CHANGE_FILE_PERMISSIONS' => 'Unable to change file permissions', - 'CANNOT_COPY_FILES' => 'Unable to copy files', - 'CANNOT_CREATE_SYMLINK' => 'Unable to create a symlink', - 'CANNOT_DELETE_FILES' => 'Unable to delete files from the system', - 'CANNOT_DUMP_FILE' => 'Unable to dump file', - 'CANNOT_MIRROR_DIRECTORY' => 'Unable to mirror directory', - 'CANNOT_RENAME_FILE' => 'Unable to rename a file from the system', - 'CANNOT_TOUCH_FILES' => 'Unable to determine if the file exists', - 'CONTAINER_EXCEPTION' => 'phpBB encountered an error building the container due to an installed extension. For this reason, all extensions have been temporarily disabled. Please try purging your forum cache. All extensions will automatically be re-enabled once the container error is resolved. If this error continues, please visit phpBB.com for support.', 'EXCEPTION' => 'Exception', diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index c7325043b2..98f3dda2c1 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -157,7 +157,6 @@ $lang = array_merge($lang, array( 'BYTES_SHORT' => 'B', 'CANCEL' => 'Cancel', - 'CANNOT_RENAME_FILE' => 'Cannot rename %s', 'CHANGE' => 'Change', 'CHANGE_FONT_SIZE' => 'Change font size', 'CHANGING_PREFERENCES' => 'Changing board preferences', @@ -268,6 +267,17 @@ $lang = array_merge($lang, array( 'FSOCK_DISABLED' => 'The operation could not be completed because the fsockopen function has been disabled or the server being queried could not be found.', 'FSOCK_TIMEOUT' => 'A timeout occurred while reading from the network stream.', + 'FILESYSTEM_CANNOT_CHANGE_FILE_GROUP' => 'Unable to change file group', + 'FILESYSTEM_CANNOT_CHANGE_FILE_PERMISSIONS' => 'Unable to change file permissions', + 'FILESYSTEM_CANNOT_COPY_FILES' => 'Unable to copy files', + 'FILESYSTEM_CANNOT_CREATE_SYMLINK' => 'Unable to create a symlink', + 'FILESYSTEM_CANNOT_CREATE_DIRECTORY' => 'Unable to create directory', + 'FILESYSTEM_CANNOT_DELETE_FILES' => 'Unable to delete files from the system', + 'FILESYSTEM_CANNOT_DUMP_FILE' => 'Unable to dump file', + 'FILESYSTEM_CANNOT_MIRROR_DIRECTORY' => 'Unable to mirror directory', + 'FILESYSTEM_CANNOT_RENAME_FILE' => 'Unable to rename a file from the system', + 'FILESYSTEM_CANNOT_TOUCH_FILES' => 'Unable to determine if the file exists', + 'FTP_FSOCK_HOST' => 'FTP host', 'FTP_FSOCK_HOST_EXPLAIN' => 'FTP server used to connect your site.', 'FTP_FSOCK_PASSWORD' => 'FTP password', diff --git a/phpBB/phpbb/filesystem/filesystem.php b/phpBB/phpbb/filesystem/filesystem.php index d168d6c90a..145def7f42 100644 --- a/phpBB/phpbb/filesystem/filesystem.php +++ b/phpBB/phpbb/filesystem/filesystem.php @@ -68,7 +68,7 @@ class filesystem implements filesystem_interface $error = trim($e->getMessage()); $file = substr($error, strrpos($error, ' ')); - throw new filesystem_exception('CANNOT_CHANGE_FILE_GROUP', $file, array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_CHANGE_FILE_GROUP', $file, array(), $e); } } @@ -125,14 +125,14 @@ class filesystem implements filesystem_interface { if (true !== @chmod($file, $dir_perm)) { - throw new filesystem_exception('CANNOT_CHANGE_FILE_PERMISSIONS', $file, array()); + throw new filesystem_exception('FILESYSTEM_CANNOT_CHANGE_FILE_PERMISSIONS', $file, array()); } } else if (is_file($file)) { if (true !== @chmod($file, $file_perm)) { - throw new filesystem_exception('CANNOT_CHANGE_FILE_PERMISSIONS', $file, array()); + throw new filesystem_exception('FILESYSTEM_CANNOT_CHANGE_FILE_PERMISSIONS', $file, array()); } } } @@ -154,7 +154,7 @@ class filesystem implements filesystem_interface $error = trim($e->getMessage()); $file = substr($error, strrpos($error, ' ')); - throw new filesystem_exception('CANNOT_CHANGE_FILE_GROUP', $file, array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_CHANGE_FILE_GROUP', $file, array(), $e); } } @@ -177,7 +177,7 @@ class filesystem implements filesystem_interface } catch (IOException $e) { - throw new filesystem_exception('CANNOT_COPY_FILES', '', array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_COPY_FILES', '', array(), $e); } } @@ -192,7 +192,7 @@ class filesystem implements filesystem_interface } catch (IOException $e) { - throw new filesystem_exception('CANNOT_DUMP_FILE', $filename, array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_DUMP_FILE', $filename, array(), $e); } } @@ -304,7 +304,7 @@ class filesystem implements filesystem_interface $msg = $e->getMessage(); $filename = substr($msg, strpos($msg, '"'), strrpos($msg, '"')); - throw new filesystem_exception('CANNOT_MIRROR_DIRECTORY', $filename, array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_MIRROR_DIRECTORY', $filename, array(), $e); } } @@ -322,7 +322,7 @@ class filesystem implements filesystem_interface $msg = $e->getMessage(); $filename = substr($msg, strpos($msg, '"'), strrpos($msg, '"')); - throw new filesystem_exception('CANNOT_CREATE_DIRECTORY', $filename, array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_CREATE_DIRECTORY', $filename, array(), $e); } } @@ -487,7 +487,7 @@ class filesystem implements filesystem_interface $error = trim($e->getMessage()); $file = substr($error, strrpos($error, ' ')); - throw new filesystem_exception('CANNOT_DELETE_FILES', $file, array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_DELETE_FILES', $file, array(), $e); } } @@ -505,7 +505,7 @@ class filesystem implements filesystem_interface $msg = $e->getMessage(); $filename = substr($msg, strpos($msg, '"'), strrpos($msg, '"')); - throw new filesystem_exception('CANNOT_RENAME_FILE', $filename, array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_RENAME_FILE', $filename, array(), $e); } } @@ -520,7 +520,7 @@ class filesystem implements filesystem_interface } catch (IOException $e) { - throw new filesystem_exception('CANNOT_CREATE_SYMLINK', $origin_dir, array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_CREATE_SYMLINK', $origin_dir, array(), $e); } } @@ -540,7 +540,7 @@ class filesystem implements filesystem_interface $error = trim($e->getMessage()); $file = substr($error, strrpos($error, ' ')); - throw new filesystem_exception('CANNOT_TOUCH_FILES', $file, array(), $e); + throw new filesystem_exception('FILESYSTEM_CANNOT_TOUCH_FILES', $file, array(), $e); } } From 5dd9c251e7f832abe74b16b1b169446392cf27ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Sat, 1 Sep 2018 01:09:22 +0200 Subject: [PATCH 066/148] [ticket/12623] Add allow_install_dir PHPBB3-12623 --- phpBB/config/development/config.yml | 1 + phpBB/phpbb/di/extension/container_configuration.php | 1 + phpBB/phpbb/di/extension/core.php | 2 ++ phpBB/phpbb/user.php | 4 ++-- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/phpBB/config/development/config.yml b/phpBB/config/development/config.yml index 67c0e5a871..6f4be70a4f 100644 --- a/phpBB/config/development/config.yml +++ b/phpBB/config/development/config.yml @@ -3,6 +3,7 @@ imports: core: require_dev_dependencies: true + allow_install_dir: true debug: exceptions: true diff --git a/phpBB/phpbb/di/extension/container_configuration.php b/phpBB/phpbb/di/extension/container_configuration.php index 3a6502a4b3..67e12ed77b 100644 --- a/phpBB/phpbb/di/extension/container_configuration.php +++ b/phpBB/phpbb/di/extension/container_configuration.php @@ -31,6 +31,7 @@ class container_configuration implements ConfigurationInterface $rootNode ->children() ->booleanNode('require_dev_dependencies')->defaultValue(false)->end() + ->booleanNode('allow_install_dir')->defaultValue(false)->end() ->arrayNode('debug') ->addDefaultsIfNotSet() ->children() diff --git a/phpBB/phpbb/di/extension/core.php b/phpBB/phpbb/di/extension/core.php index 75a037871f..cdba25f13b 100644 --- a/phpBB/phpbb/di/extension/core.php +++ b/phpBB/phpbb/di/extension/core.php @@ -72,6 +72,8 @@ class core extends Extension } } + $container->setParameter('allow_install_dir', $config['allow_install_dir']); + // Set the Twig options if defined in the environment $definition = $container->getDefinition('template.twig.environment'); $twig_environment_options = $definition->getArgument(static::TWIG_OPTIONS_POSITION); diff --git a/phpBB/phpbb/user.php b/phpBB/phpbb/user.php index 7afe31dcb8..7b6c768db8 100644 --- a/phpBB/phpbb/user.php +++ b/phpBB/phpbb/user.php @@ -110,7 +110,7 @@ class user extends \phpbb\session function setup($lang_set = false, $style_id = false) { global $db, $request, $template, $config, $auth, $phpEx, $phpbb_root_path, $cache; - global $phpbb_dispatcher; + global $phpbb_dispatcher, $phpbb_container; $this->language->set_default_language($config['default_lang']); @@ -325,7 +325,7 @@ class user extends \phpbb\session // Disable board if the install/ directory is still present // For the brave development army we do not care about this, else we need to comment out this every time we develop locally - if (!defined('DEBUG') && !defined('ADMIN_START') && !defined('IN_INSTALL') && !defined('IN_LOGIN') && file_exists($phpbb_root_path . 'install') && !is_file($phpbb_root_path . 'install')) + if (!$phpbb_container->getParameter('allow_install_dir') && !defined('ADMIN_START') && !defined('IN_INSTALL') && !defined('IN_LOGIN') && file_exists($phpbb_root_path . 'install') && !is_file($phpbb_root_path . 'install')) { // Adjust the message slightly according to the permissions if ($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')) From f93ddcb3827b91bb648a7d1cdfaa71c45b242f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Sat, 1 Sep 2018 01:16:57 +0200 Subject: [PATCH 067/148] [ticket/12636] Add log.session_errors PHPBB3-12636 --- phpBB/config/development/config.yml | 3 +++ phpBB/phpbb/di/extension/container_configuration.php | 6 ++++++ phpBB/phpbb/di/extension/core.php | 6 ++++++ phpBB/phpbb/session.php | 2 +- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/phpBB/config/development/config.yml b/phpBB/config/development/config.yml index 67c0e5a871..3709b100f0 100644 --- a/phpBB/config/development/config.yml +++ b/phpBB/config/development/config.yml @@ -17,3 +17,6 @@ core: extensions: composer_debug: true composer_verbose: true + + log: + session_errors: true diff --git a/phpBB/phpbb/di/extension/container_configuration.php b/phpBB/phpbb/di/extension/container_configuration.php index 3a6502a4b3..5df1ebb59e 100644 --- a/phpBB/phpbb/di/extension/container_configuration.php +++ b/phpBB/phpbb/di/extension/container_configuration.php @@ -54,6 +54,12 @@ class container_configuration implements ConfigurationInterface ->booleanNode('composer_verbose')->defaultValue(false)->end() ->end() ->end() + ->arrayNode('log') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('session_errors')->defaultValue(false)->end() + ->end() + ->end() ->end() ; return $treeBuilder; diff --git a/phpBB/phpbb/di/extension/core.php b/phpBB/phpbb/di/extension/core.php index 75a037871f..2f57c2854c 100644 --- a/phpBB/phpbb/di/extension/core.php +++ b/phpBB/phpbb/di/extension/core.php @@ -110,6 +110,12 @@ class core extends Extension { $container->setParameter('debug.' . $name, $value); } + + // Set the log options + foreach ($config['log'] as $name => $value) + { + $container->setParameter('log.' . $name, $value); + } } /** diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php index 1b1bc3a428..73f40b4e33 100644 --- a/phpBB/phpbb/session.php +++ b/phpBB/phpbb/session.php @@ -481,7 +481,7 @@ class session else { // Added logging temporarily to help debug bugs... - if (defined('DEBUG') && $this->data['user_id'] != ANONYMOUS) + if ($phpbb_container->getParameter('log.session_errors') && $this->data['user_id'] != ANONYMOUS) { if ($referer_valid) { From ade145dc566ae16d9a6339853bf77c7d3e51aaf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Sat, 1 Sep 2018 01:57:01 +0200 Subject: [PATCH 068/148] [ticket/12636] Add log.session_errors to mock container_builder PHPBB3-12636 --- tests/mock/container_builder.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/mock/container_builder.php b/tests/mock/container_builder.php index 05083c3a3c..b27b0e64cb 100644 --- a/tests/mock/container_builder.php +++ b/tests/mock/container_builder.php @@ -21,6 +21,7 @@ class phpbb_mock_container_builder implements ContainerInterface public function __construct() { $this->setParameter('debug.load_time', false); + $this->setParameter('log.session_errors', false); } /** From 0268f9a0d643230c72aa0e35cda0152cb1b7f4e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Sat, 1 Sep 2018 01:54:13 +0200 Subject: [PATCH 069/148] [ticket/12623] Add install dir during tests PHPBB3-12623 --- phpBB/config/test/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/phpBB/config/test/config.yml b/phpBB/config/test/config.yml index 1c17b08931..a603f59dec 100644 --- a/phpBB/config/test/config.yml +++ b/phpBB/config/test/config.yml @@ -3,3 +3,4 @@ imports: core: require_dev_dependencies: true + allow_install_dir: true From a72a6514e79686ac14c504831317c321d667bdb2 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sat, 1 Sep 2018 09:22:36 +0100 Subject: [PATCH 070/148] [prep-release-3.2.3] Fix improper version number --- build/build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build.xml b/build/build.xml index 890ebb67ce..9da74c9ba0 100644 --- a/build/build.xml +++ b/build/build.xml @@ -4,7 +4,7 @@ - + From 4a30818e1240d2389bc924045769bb5dab30fe34 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 4 Sep 2018 14:30:19 +0200 Subject: [PATCH 071/148] [ticket/15420] Only update quote notification with original author PHPBB3-15420 --- phpBB/includes/functions_posting.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index 78c66ac6b8..73a2e0be0c 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -2309,8 +2309,14 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data case 'edit_first_post': case 'edit': case 'edit_last_post': + if ($user->data['user_id'] == $poster_id) + { + $phpbb_notifications->update_notifications(array( + 'notification.type.quote', + ), $notification_data); + } + $phpbb_notifications->update_notifications(array( - 'notification.type.quote', 'notification.type.bookmark', 'notification.type.topic', 'notification.type.post', From 367f884d01b54a2d9cbe8d5d47b1947bb52bf8df Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 4 Sep 2018 14:41:00 +0200 Subject: [PATCH 072/148] [ticket/15748] Fix toggle alt text PHPBB3-15748 --- phpBB/assets/javascript/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js index 752dfa4ab2..0c528dba5e 100644 --- a/phpBB/assets/javascript/core.js +++ b/phpBB/assets/javascript/core.js @@ -937,7 +937,7 @@ phpbb.addAjaxCallback('alt_text', function() { altText = $this.attr('data-alt-text'); $this.attr('data-alt-text', $this.text()); $this.attr('title', $.trim(altText)); - $this.text(altText); + $this.children('span').text(altText); }); }); From bae561be2282eaef76e7d77940aa499cebd44716 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 6 Sep 2018 14:11:51 +0200 Subject: [PATCH 073/148] [ticket/15744] Remove useless sql_freeresults PHPBB3-15744 --- .../phpbb/db/migration/data/v320/remove_outdated_media.php | 6 ++---- .../db/migration/data/v330/remove_attachment_flash.php | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php b/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php index 98b1c2d039..88fe59ccc9 100644 --- a/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php +++ b/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php @@ -85,13 +85,11 @@ class remove_outdated_media extends \phpbb\db\migration\migration WHERE ' . $this->db->sql_in_set('group_id', $group_ids); } - $result = $this->db->sql_query($sql); - $this->db->sql_freeresult($result); + $this->db->sql_query($sql); // delete the now empty, outdated media extension groups $sql = 'DELETE FROM ' . EXTENSION_GROUPS_TABLE . ' WHERE ' . $this->db->sql_in_set('group_id', $group_ids); - $result = $this->db->sql_query($sql); - $this->db->sql_freeresult($result); + $this->db->sql_query($sql); } } diff --git a/phpBB/phpbb/db/migration/data/v330/remove_attachment_flash.php b/phpBB/phpbb/db/migration/data/v330/remove_attachment_flash.php index 90c2fe7400..11dc43483b 100644 --- a/phpBB/phpbb/db/migration/data/v330/remove_attachment_flash.php +++ b/phpBB/phpbb/db/migration/data/v330/remove_attachment_flash.php @@ -74,13 +74,11 @@ class remove_attachment_flash extends \phpbb\db\migration\migration WHERE ' . $this->db->sql_in_set('group_id', $group_ids); } - $result = $this->db->sql_query($sql); - $this->db->sql_freeresult($result); + $this->db->sql_query($sql); // delete the now empty, outdated media extension groups $sql = 'DELETE FROM ' . EXTENSION_GROUPS_TABLE . ' WHERE ' . $this->db->sql_in_set('group_id', $group_ids); - $result = $this->db->sql_query($sql); - $this->db->sql_freeresult($result); + $this->db->sql_query($sql); } } From f2c53bfffd70b9d0f53058a254fab4630120f74a Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 6 Sep 2018 14:26:06 +0200 Subject: [PATCH 074/148] [ticket/15721] Make plupload more versatile PHPBB3-15721 --- phpBB/assets/javascript/plupload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/assets/javascript/plupload.js b/phpBB/assets/javascript/plupload.js index 8b3543880f..495d756c79 100644 --- a/phpBB/assets/javascript/plupload.js +++ b/phpBB/assets/javascript/plupload.js @@ -211,7 +211,7 @@ phpbb.plupload.updateHiddenData = function(row, attach, index) { .attr('type', 'hidden') .attr('name', 'attachment_data[' + index + '][' + key + ']') .attr('value', attach[key]); - $('textarea', row).after(input); + $(row).append(input); } }; From 8eb48e281287646bb186f831e4f076f4557a14a9 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 6 Sep 2018 14:15:08 +0200 Subject: [PATCH 075/148] [ticket/15742] Remove get_magic_quotes_gpc() call PHPBB3-15742 --- phpBB/phpbb/request/request.php | 2 - phpBB/phpbb/request/type_cast_helper.php | 37 ------------------- .../request/type_cast_helper_interface.php | 7 ---- 3 files changed, 46 deletions(-) diff --git a/phpBB/phpbb/request/request.php b/phpBB/phpbb/request/request.php index 00be8fd381..a0267d1370 100644 --- a/phpBB/phpbb/request/request.php +++ b/phpBB/phpbb/request/request.php @@ -150,8 +150,6 @@ class request implements \phpbb\request\request_interface return; } - $this->type_cast_helper->add_magic_quotes($value); - // setting to null means unsetting if ($value === null) { diff --git a/phpBB/phpbb/request/type_cast_helper.php b/phpBB/phpbb/request/type_cast_helper.php index 96e66950ca..1a53206c74 100644 --- a/phpBB/phpbb/request/type_cast_helper.php +++ b/phpBB/phpbb/request/type_cast_helper.php @@ -18,28 +18,6 @@ namespace phpbb\request; */ class type_cast_helper implements \phpbb\request\type_cast_helper_interface { - - /** - * @var string Whether slashes need to be stripped from input - */ - protected $strip; - - /** - * Initialises the type cast helper class. - * All it does is find out whether magic quotes are turned on. - */ - public function __construct() - { - if (version_compare(PHP_VERSION, '5.4.0-dev', '>=')) - { - $this->strip = false; - } - else - { - $this->strip = (@get_magic_quotes_gpc()) ? true : false; - } - } - /** * Recursively applies addslashes to a variable. * @@ -68,19 +46,6 @@ class type_cast_helper implements \phpbb\request\type_cast_helper_interface } } - /** - * Recursively applies addslashes to a variable if magic quotes are turned on. - * - * @param mixed &$var Variable passed by reference to which slashes will be added. - */ - public function add_magic_quotes(&$var) - { - if ($this->strip) - { - $this->addslashes_recursively($var); - } - } - /** * Set variable $result to a particular type. * @@ -129,8 +94,6 @@ class type_cast_helper implements \phpbb\request\type_cast_helper_interface $result = preg_replace('/[\x80-\xFF]/', '?', $result); } } - - $result = ($this->strip) ? stripslashes($result) : $result; } } diff --git a/phpBB/phpbb/request/type_cast_helper_interface.php b/phpBB/phpbb/request/type_cast_helper_interface.php index 2cb28d021f..e22712dc0c 100644 --- a/phpBB/phpbb/request/type_cast_helper_interface.php +++ b/phpBB/phpbb/request/type_cast_helper_interface.php @@ -25,13 +25,6 @@ interface type_cast_helper_interface */ public function addslashes_recursively(&$var); - /** - * Recursively applies addslashes to a variable if magic quotes are turned on. - * - * @param mixed &$var Variable passed by reference to which slashes will be added. - */ - public function add_magic_quotes(&$var); - /** * Set variable $result to a particular type. * From 0f10c6ff6f0537c9cb00f6007b6bee9944e6587a Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 6 Sep 2018 14:31:57 +0200 Subject: [PATCH 076/148] [ticket/15716] Remove OAuth data upon user deletion PHPBB3-15716 --- phpBB/includes/functions_user.php | 2 +- tests/console/user/base.php | 3 +++ tests/functions/user_delete_test.php | 4 ++++ tests/functions_user/delete_user_test.php | 3 +++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index 245d263720..0e57795eea 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -664,7 +664,7 @@ function user_delete($mode, $user_ids, $retain_username = true) delete_posts('poster_id', $user_ids); } - $table_ary = array(USERS_TABLE, USER_GROUP_TABLE, TOPICS_WATCH_TABLE, FORUMS_WATCH_TABLE, ACL_USERS_TABLE, TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, FORUMS_TRACK_TABLE, PROFILE_FIELDS_DATA_TABLE, MODERATOR_CACHE_TABLE, DRAFTS_TABLE, BOOKMARKS_TABLE, SESSIONS_KEYS_TABLE, PRIVMSGS_FOLDER_TABLE, PRIVMSGS_RULES_TABLE); + $table_ary = array(USERS_TABLE, USER_GROUP_TABLE, TOPICS_WATCH_TABLE, FORUMS_WATCH_TABLE, ACL_USERS_TABLE, TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, FORUMS_TRACK_TABLE, PROFILE_FIELDS_DATA_TABLE, MODERATOR_CACHE_TABLE, DRAFTS_TABLE, BOOKMARKS_TABLE, SESSIONS_KEYS_TABLE, PRIVMSGS_FOLDER_TABLE, PRIVMSGS_RULES_TABLE, $phpbb_container->getParameter('tables.auth_provider_oauth_token_storage'), $phpbb_container->getParameter('tables.auth_provider_oauth_states'), $phpbb_container->getParameter('tables.auth_provider_oauth_account_assoc')); // Delete the miscellaneous (non-post) data for the user foreach ($table_ary as $table) diff --git a/tests/console/user/base.php b/tests/console/user/base.php index b84c0bb267..2fb7ee0394 100644 --- a/tests/console/user/base.php +++ b/tests/console/user/base.php @@ -94,6 +94,9 @@ abstract class phpbb_console_user_base extends phpbb_database_test_case 'auth.provider_collection', $provider_collection ); + $phpbb_container->setParameter('tables.auth_provider_oauth_token_storage', 'phpbb_oauth_tokens'); + $phpbb_container->setParameter('tables.auth_provider_oauth_states', 'phpbb_oauth_states'); + $phpbb_container->setParameter('tables.auth_provider_oauth_account_assoc', 'phpbb_oauth_accounts'); parent::setUp(); } diff --git a/tests/functions/user_delete_test.php b/tests/functions/user_delete_test.php index db9b6e0c90..88680d5719 100644 --- a/tests/functions/user_delete_test.php +++ b/tests/functions/user_delete_test.php @@ -82,6 +82,10 @@ class phpbb_functions_user_delete_test extends phpbb_database_test_case $phpbb_container->set('auth.provider.oauth.service.google', $oauth_provider_google); $phpbb_container->set('auth.provider_collection', $provider_collection); $phpbb_container->set('notification_manager', $notification_manager); + + $phpbb_container->setParameter('tables.auth_provider_oauth_token_storage', 'phpbb_oauth_tokens'); + $phpbb_container->setParameter('tables.auth_provider_oauth_states', 'phpbb_oauth_states'); + $phpbb_container->setParameter('tables.auth_provider_oauth_account_assoc', 'phpbb_oauth_accounts'); } public function test_user_delete() diff --git a/tests/functions_user/delete_user_test.php b/tests/functions_user/delete_user_test.php index 25042d9f1b..30253ccc2f 100644 --- a/tests/functions_user/delete_user_test.php +++ b/tests/functions_user/delete_user_test.php @@ -46,6 +46,9 @@ class phpbb_functions_user_delete_user_test extends phpbb_database_test_case 'auth.provider_collection', $provider_collection ); + $phpbb_container->setParameter('tables.auth_provider_oauth_token_storage', 'phpbb_oauth_tokens'); + $phpbb_container->setParameter('tables.auth_provider_oauth_states', 'phpbb_oauth_states'); + $phpbb_container->setParameter('tables.auth_provider_oauth_account_assoc', 'phpbb_oauth_accounts'); } public function first_last_post_data() From ab17c854cdf1a70b262faff434e32ebcd0483118 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sun, 9 Sep 2018 11:03:58 +0100 Subject: [PATCH 077/148] [prep-release-3.2.3] Update changelog with changes after 3.2.3-RC2 --- phpBB/docs/CHANGELOG.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/phpBB/docs/CHANGELOG.html b/phpBB/docs/CHANGELOG.html index f620f3a862..b5c9790a45 100644 --- a/phpBB/docs/CHANGELOG.html +++ b/phpBB/docs/CHANGELOG.html @@ -50,6 +50,7 @@
  1. Changelog
      +
    • Changes since 3.2.3-RC2
    • Changes since 3.2.3-RC1
    • Changes since 3.2.2
    • Changes since 3.2.1
    • @@ -130,6 +131,16 @@
      +

      Changes since 3.2.3-RC2

      +

      Bug

      + +

      Improvement

      + +

      Changes since 3.2.3-RC1

      Bug

        From d64b9e70382e2aaf6e4931960baa20e3783ca67b Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sun, 9 Sep 2018 23:16:43 +0100 Subject: [PATCH 078/148] [ticket/15746] Update to Symfony 2.8.45 PHPBB3-15746 --- phpBB/composer.lock | 74 ++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/phpBB/composer.lock b/phpBB/composer.lock index ad0cc45ea0..c83ff7aa51 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -727,7 +727,7 @@ }, { "name": "symfony/config", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/config.git", @@ -784,7 +784,7 @@ }, { "name": "symfony/console", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/console.git", @@ -845,16 +845,16 @@ }, { "name": "symfony/debug", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "d985c8546da49c4727e27dae82bcf783ee2c5af0" + "reference": "cbb8a5f212148964efbc414838c527229f9951b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/d985c8546da49c4727e27dae82bcf783ee2c5af0", - "reference": "d985c8546da49c4727e27dae82bcf783ee2c5af0", + "url": "https://api.github.com/repos/symfony/debug/zipball/cbb8a5f212148964efbc414838c527229f9951b7", + "reference": "cbb8a5f212148964efbc414838c527229f9951b7", "shasum": "" }, "require": { @@ -898,11 +898,11 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-07-26 11:13:39" + "time": "2018-08-03 09:45:57" }, { "name": "symfony/dependency-injection", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", @@ -965,7 +965,7 @@ }, { "name": "symfony/event-dispatcher", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", @@ -1025,16 +1025,16 @@ }, { "name": "symfony/filesystem", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "2d6a4deccdfa2e4e9f113138b93457b2d0886c15" + "reference": "0b252f4e25b7da17abb5a98eb60755b71d082c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/2d6a4deccdfa2e4e9f113138b93457b2d0886c15", - "reference": "2d6a4deccdfa2e4e9f113138b93457b2d0886c15", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/0b252f4e25b7da17abb5a98eb60755b71d082c9c", + "reference": "0b252f4e25b7da17abb5a98eb60755b71d082c9c", "shasum": "" }, "require": { @@ -1071,11 +1071,11 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-07-26 11:13:39" + "time": "2018-08-07 09:12:42" }, { "name": "symfony/finder", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", @@ -1124,16 +1124,16 @@ }, { "name": "symfony/http-foundation", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "10f660d43087b2198c3789bebbd587d20ec6e956" + "reference": "dc02e684171d0696edb6d4266e9d93af5e3f44d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/10f660d43087b2198c3789bebbd587d20ec6e956", - "reference": "10f660d43087b2198c3789bebbd587d20ec6e956", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/dc02e684171d0696edb6d4266e9d93af5e3f44d3", + "reference": "dc02e684171d0696edb6d4266e9d93af5e3f44d3", "shasum": "" }, "require": { @@ -1175,20 +1175,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-08-01 13:47:49" + "time": "2018-08-27 15:52:41" }, { "name": "symfony/http-kernel", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "3ee21e3eb52327514d1fc754d1e0c9c85bceeb3a" + "reference": "5424d38f10dc62752e655740224681a478d9f5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3ee21e3eb52327514d1fc754d1e0c9c85bceeb3a", - "reference": "3ee21e3eb52327514d1fc754d1e0c9c85bceeb3a", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5424d38f10dc62752e655740224681a478d9f5bb", + "reference": "5424d38f10dc62752e655740224681a478d9f5bb", "shasum": "" }, "require": { @@ -1259,7 +1259,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-08-01 14:12:31" + "time": "2018-08-27 17:33:38" }, { "name": "symfony/polyfill-ctype", @@ -1494,7 +1494,7 @@ }, { "name": "symfony/proxy-manager-bridge", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", @@ -1548,7 +1548,7 @@ }, { "name": "symfony/routing", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", @@ -1622,7 +1622,7 @@ }, { "name": "symfony/twig-bridge", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", @@ -1707,7 +1707,7 @@ }, { "name": "symfony/yaml", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", @@ -3414,7 +3414,7 @@ }, { "name": "symfony/browser-kit", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", @@ -3471,7 +3471,7 @@ }, { "name": "symfony/css-selector", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -3524,7 +3524,7 @@ }, { "name": "symfony/dom-crawler", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", @@ -3581,16 +3581,16 @@ }, { "name": "symfony/process", - "version": "v2.8.44", + "version": "v2.8.45", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "cc83afdb5ac99147806b3bb65a3ff1227664f596" + "reference": "4be278e19064c3492095de50c9e375caae569ae1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/cc83afdb5ac99147806b3bb65a3ff1227664f596", - "reference": "cc83afdb5ac99147806b3bb65a3ff1227664f596", + "url": "https://api.github.com/repos/symfony/process/zipball/4be278e19064c3492095de50c9e375caae569ae1", + "reference": "4be278e19064c3492095de50c9e375caae569ae1", "shasum": "" }, "require": { @@ -3626,7 +3626,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-07-26 11:13:39" + "time": "2018-08-03 09:45:57" } ], "aliases": [], From 6fc311f2e172c45ca77f0126a690380196361f0c Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Wed, 12 Sep 2018 13:57:34 +0200 Subject: [PATCH 079/148] [ticket/15746] Update symfony to latest on master Also fixed incorrect creation of dumped container (Container instead of ContainerBuilder). PHPBB3-15746 --- phpBB/composer.lock | 475 ++++++++++++++------------- phpBB/phpbb/di/container_builder.php | 2 +- 2 files changed, 245 insertions(+), 232 deletions(-) diff --git a/phpBB/composer.lock b/phpBB/composer.lock index 36e0e59631..3458c0d7e5 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -38,16 +38,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.1.0", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288" + "reference": "46afded9720f40b9dc63542af4e3e43a1177acb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288", - "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/46afded9720f40b9dc63542af4e3e43a1177acb0", + "reference": "46afded9720f40b9dc63542af4e3e43a1177acb0", "shasum": "" }, "require": { @@ -56,7 +56,7 @@ "php": "^5.3.2 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5", "psr/log": "^1.0", "symfony/process": "^2.5 || ^3.0 || ^4.0" }, @@ -90,30 +90,30 @@ "ssl", "tls" ], - "time": "2017-11-29T09:37:33+00:00" + "time": "2018-08-08T08:57:40+00:00" }, { "name": "composer/composer", - "version": "1.6.2", + "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "db191abd24b0be110c98ba2271ca992e1c70962f" + "reference": "576aab9b5abb2ed11a1c52353a759363216a4ad2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/db191abd24b0be110c98ba2271ca992e1c70962f", - "reference": "db191abd24b0be110c98ba2271ca992e1c70962f", + "url": "https://api.github.com/repos/composer/composer/zipball/576aab9b5abb2ed11a1c52353a759363216a4ad2", + "reference": "576aab9b5abb2ed11a1c52353a759363216a4ad2", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", "composer/semver": "^1.0", "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^1.1", "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", "php": "^5.3.2 || ^7.0", "psr/log": "^1.0", - "seld/cli-prompt": "^1.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.0", "symfony/console": "^2.7 || ^3.0 || ^4.0", @@ -121,6 +121,9 @@ "symfony/finder": "^2.7 || ^3.0 || ^4.0", "symfony/process": "^2.7 || ^3.0 || ^4.0" }, + "conflict": { + "symfony/console": "2.8.38" + }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7", "phpunit/phpunit-mock-objects": "^2.3 || ^3.0" @@ -136,7 +139,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.7-dev" } }, "autoload": { @@ -167,7 +170,7 @@ "dependency", "package" ], - "time": "2018-01-05T14:28:42+00:00" + "time": "2018-08-16T14:57:12+00:00" }, { "name": "composer/installers", @@ -353,16 +356,16 @@ }, { "name": "composer/spdx-licenses", - "version": "1.2.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "2d899e9b33023c631854f36c39ef9f8317a7ab33" + "reference": "cb17687e9f936acd7e7245ad3890f953770dec1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/2d899e9b33023c631854f36c39ef9f8317a7ab33", - "reference": "2d899e9b33023c631854f36c39ef9f8317a7ab33", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/cb17687e9f936acd7e7245ad3890f953770dec1b", + "reference": "cb17687e9f936acd7e7245ad3890f953770dec1b", "shasum": "" }, "require": { @@ -410,32 +413,78 @@ "spdx", "validator" ], - "time": "2018-01-03T16:37:06+00:00" + "time": "2018-04-30T10:33:04+00:00" }, { - "name": "google/recaptcha", - "version": "1.1.3", + "name": "composer/xdebug-handler", + "version": "1.3.0", "source": { "type": "git", - "url": "https://github.com/google/recaptcha.git", - "reference": "5a56d15ca10a7b75158178752b2ad8f755eb4f78" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "b8e9745fb9b06ea6664d8872c4505fb16df4611c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/google/recaptcha/zipball/5a56d15ca10a7b75158178752b2ad8f755eb4f78", - "reference": "5a56d15ca10a7b75158178752b2ad8f755eb4f78", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/b8e9745fb9b06ea6664d8872c4505fb16df4611c", + "reference": "b8e9745fb9b06ea6664d8872c4505fb16df4611c", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "time": "2018-08-31T19:07:57+00:00" + }, + { + "name": "google/recaptcha", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/google/recaptcha.git", + "reference": "e7add3be59211482ecdb942288f52da64a35f61a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/google/recaptcha/zipball/e7add3be59211482ecdb942288f52da64a35f61a", + "reference": "e7add3be59211482ecdb942288f52da64a35f61a", "shasum": "" }, "require": { "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "friendsofphp/php-cs-fixer": "^2.2.20|^2.12", + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^4.8.36|^5.7.27|^6.59|^7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -447,28 +496,28 @@ "license": [ "BSD-3-Clause" ], - "description": "Client library for reCAPTCHA, a free service that protect websites from spam and abuse.", - "homepage": "http://www.google.com/recaptcha/", + "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.", + "homepage": "https://www.google.com/recaptcha/", "keywords": [ "Abuse", "captcha", "recaptcha", "spam" ], - "time": "2017-03-09T18:44:34+00:00" + "time": "2018-08-05T09:31:53+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.3.0", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", "shasum": "" }, "require": { @@ -478,7 +527,7 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.0" }, "suggest": { @@ -487,7 +536,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.2-dev" + "dev-master": "6.3-dev" } }, "autoload": { @@ -520,7 +569,7 @@ "rest", "web service" ], - "time": "2017-06-22T18:50:49+00:00" + "time": "2018-04-22T15:46:56+00:00" }, { "name": "guzzlehttp/promises", @@ -640,16 +689,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.6", + "version": "5.2.7", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "d283e11b6e14c6f4664cf080415c4341293e5bbd" + "reference": "8560d4314577199ba51bf2032f02cd1315587c23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/d283e11b6e14c6f4664cf080415c4341293e5bbd", - "reference": "d283e11b6e14c6f4664cf080415c4341293e5bbd", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/8560d4314577199ba51bf2032f02cd1315587c23", + "reference": "8560d4314577199ba51bf2032f02cd1315587c23", "shasum": "" }, "require": { @@ -658,7 +707,7 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^2.1", "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.22" + "phpunit/phpunit": "^4.8.35" }, "bin": [ "bin/validate-json" @@ -702,7 +751,7 @@ "json", "schema" ], - "time": "2017-10-21T13:15:38+00:00" + "time": "2018-02-14T22:26:30+00:00" }, { "name": "lusitanian/oauth", @@ -1204,66 +1253,18 @@ ], "time": "2017-12-10T00:55:53+00:00" }, - { - "name": "seld/cli-prompt", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/cli-prompt.git", - "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/cli-prompt/zipball/a19a7376a4689d4d94cab66ab4f3c816019ba8dd", - "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\CliPrompt\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Allows you to prompt for user input on the command line, and optionally hide the characters they type", - "keywords": [ - "cli", - "console", - "hidden", - "input", - "prompt" - ], - "time": "2017-03-18T11:32:45+00:00" - }, { "name": "seld/jsonlint", - "version": "1.7.0", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9b355654ea99460397b89c132b5c1087b6bf4473" + "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9b355654ea99460397b89c132b5c1087b6bf4473", - "reference": "9b355654ea99460397b89c132b5c1087b6bf4473", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/d15f59a67ff805a44c50ea0516d2341740f81a38", + "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38", "shasum": "" }, "require": { @@ -1299,7 +1300,7 @@ "parser", "validator" ], - "time": "2018-01-03T12:13:57+00:00" + "time": "2018-01-24T12:46:19+00:00" }, { "name": "seld/phar-utils", @@ -1347,21 +1348,22 @@ }, { "name": "symfony/config", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "cfd5c972f7b4992a5df41673d25d980ab077aa5b" + "reference": "7b08223b7f6abd859651c56bcabf900d1627d085" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/cfd5c972f7b4992a5df41673d25d980ab077aa5b", - "reference": "cfd5c972f7b4992a5df41673d25d980ab077aa5b", + "url": "https://api.github.com/repos/symfony/config/zipball/7b08223b7f6abd859651c56bcabf900d1627d085", + "reference": "7b08223b7f6abd859651c56bcabf900d1627d085", "shasum": "" }, "require": { "php": "^5.5.9|>=7.0.8", - "symfony/filesystem": "~2.8|~3.0|~4.0" + "symfony/filesystem": "~2.8|~3.0|~4.0", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/dependency-injection": "<3.3", @@ -1369,6 +1371,7 @@ }, "require-dev": { "symfony/dependency-injection": "~3.3|~4.0", + "symfony/event-dispatcher": "~3.3|~4.0", "symfony/finder": "~3.3|~4.0", "symfony/yaml": "~3.0|~4.0" }, @@ -1405,20 +1408,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-07-26T11:19:56+00:00" }, { "name": "symfony/console", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8394c8ef121949e8f858f13bc1e34f05169e4e7d" + "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8394c8ef121949e8f858f13bc1e34f05169e4e7d", - "reference": "8394c8ef121949e8f858f13bc1e34f05169e4e7d", + "url": "https://api.github.com/repos/symfony/console/zipball/6b217594552b9323bcdcfc14f8a0ce126e84cd73", + "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73", "shasum": "" }, "require": { @@ -1474,20 +1477,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-07-26T11:19:56+00:00" }, { "name": "symfony/debug", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "603b95dda8b00020e4e6e60dc906e7b715b1c245" + "reference": "c4625e75341e4fb309ce0c049cbf7fb84b8897cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/603b95dda8b00020e4e6e60dc906e7b715b1c245", - "reference": "603b95dda8b00020e4e6e60dc906e7b715b1c245", + "url": "https://api.github.com/repos/symfony/debug/zipball/c4625e75341e4fb309ce0c049cbf7fb84b8897cd", + "reference": "c4625e75341e4fb309ce0c049cbf7fb84b8897cd", "shasum": "" }, "require": { @@ -1530,20 +1533,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-01-03T17:14:19+00:00" + "time": "2018-08-03T10:42:44+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "35f957ca171a431710966bec6e2f8636d3b019c4" + "reference": "09d7df7bf06c1393b6afc85875993cbdbdf897a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/35f957ca171a431710966bec6e2f8636d3b019c4", - "reference": "35f957ca171a431710966bec6e2f8636d3b019c4", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/09d7df7bf06c1393b6afc85875993cbdbdf897a0", + "reference": "09d7df7bf06c1393b6afc85875993cbdbdf897a0", "shasum": "" }, "require": { @@ -1601,20 +1604,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2018-01-04T15:56:45+00:00" + "time": "2018-08-08T11:42:34+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "26b87b6bca8f8f797331a30b76fdae5342dc26ca" + "reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/26b87b6bca8f8f797331a30b76fdae5342dc26ca", - "reference": "26b87b6bca8f8f797331a30b76fdae5342dc26ca", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb", + "reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb", "shasum": "" }, "require": { @@ -1664,24 +1667,25 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-07-26T09:06:28+00:00" }, { "name": "symfony/filesystem", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "e078773ad6354af38169faf31c21df0f18ace03d" + "reference": "285ce5005cb01a0aeaa5b0cf590bd0cc40bb631c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e078773ad6354af38169faf31c21df0f18ace03d", - "reference": "e078773ad6354af38169faf31c21df0f18ace03d", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/285ce5005cb01a0aeaa5b0cf590bd0cc40bb631c", + "reference": "285ce5005cb01a0aeaa5b0cf590bd0cc40bb631c", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { @@ -1713,20 +1717,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-08-10T07:29:05+00:00" }, { "name": "symfony/finder", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "613e26310776f49a1773b6737c6bd554b8bc8c6f" + "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/613e26310776f49a1773b6737c6bd554b8bc8c6f", - "reference": "613e26310776f49a1773b6737c6bd554b8bc8c6f", + "url": "https://api.github.com/repos/symfony/finder/zipball/8a84fcb207451df0013b2c74cbbf1b62d47b999a", + "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a", "shasum": "" }, "require": { @@ -1762,20 +1766,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-07-26T11:19:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "4a213be1cc8598089b8c7451529a2927b49b5d26" + "reference": "2fb33cb6eefe6e790e4023f7c534a9e4214252fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4a213be1cc8598089b8c7451529a2927b49b5d26", - "reference": "4a213be1cc8598089b8c7451529a2927b49b5d26", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2fb33cb6eefe6e790e4023f7c534a9e4214252fc", + "reference": "2fb33cb6eefe6e790e4023f7c534a9e4214252fc", "shasum": "" }, "require": { @@ -1816,20 +1820,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-01-03T17:14:19+00:00" + "time": "2018-08-27T17:45:33+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "1c2a82d6a8ec9b354fe4ef48ad1ad3f1a4f7db0e" + "reference": "2819693b25f480966cbfa13b651abccfed4871ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1c2a82d6a8ec9b354fe4ef48ad1ad3f1a4f7db0e", - "reference": "1c2a82d6a8ec9b354fe4ef48ad1ad3f1a4f7db0e", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2819693b25f480966cbfa13b651abccfed4871ca", + "reference": "2819693b25f480966cbfa13b651abccfed4871ca", "shasum": "" }, "require": { @@ -1837,11 +1841,12 @@ "psr/log": "~1.0", "symfony/debug": "~2.8|~3.0|~4.0", "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "^3.3.11|~4.0" + "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.4", + "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4", "symfony/var-dumper": "<3.3", "twig/twig": "<1.34|<2.4,>=2" }, @@ -1855,7 +1860,7 @@ "symfony/config": "~2.8|~3.0|~4.0", "symfony/console": "~2.8|~3.0|~4.0", "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", + "symfony/dependency-injection": "^3.4.10|^4.0.10", "symfony/dom-crawler": "~2.8|~3.0|~4.0", "symfony/expression-language": "~2.8|~3.0|~4.0", "symfony/finder": "~2.8|~3.0|~4.0", @@ -1904,7 +1909,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-01-05T08:33:00+00:00" + "time": "2018-08-28T06:06:12+00:00" }, { "name": "symfony/polyfill-ctype", @@ -2025,20 +2030,20 @@ }, { "name": "symfony/polyfill-php70", - "version": "v1.6.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff" + "reference": "1e24b0c4a56d55aaf368763a06c6d1c7d3194934" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", - "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/1e24b0c4a56d55aaf368763a06c6d1c7d3194934", + "reference": "1e24b0c4a56d55aaf368763a06c6d1c7d3194934", "shasum": "" }, "require": { - "paragonie/random_compat": "~1.0|~2.0", + "paragonie/random_compat": "~1.0|~2.0|~9.99", "php": ">=5.3.3" }, "type": "library", @@ -2080,20 +2085,20 @@ "portable", "shim" ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/process", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "ff69f110c6b33fd33cd2089ba97d6112f44ef0ba" + "reference": "4d6b125d5293cbceedc2aa10f2c71617e76262e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/ff69f110c6b33fd33cd2089ba97d6112f44ef0ba", - "reference": "ff69f110c6b33fd33cd2089ba97d6112f44ef0ba", + "url": "https://api.github.com/repos/symfony/process/zipball/4d6b125d5293cbceedc2aa10f2c71617e76262e7", + "reference": "4d6b125d5293cbceedc2aa10f2c71617e76262e7", "shasum": "" }, "require": { @@ -2129,20 +2134,20 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-08-03T10:42:44+00:00" }, { "name": "symfony/proxy-manager-bridge", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "ffb375b65cf112364b5374ed99059975ca84a6bd" + "reference": "d33eafe0ba17a9df6bfd92812631cfc4df85e688" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/ffb375b65cf112364b5374ed99059975ca84a6bd", - "reference": "ffb375b65cf112364b5374ed99059975ca84a6bd", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/d33eafe0ba17a9df6bfd92812631cfc4df85e688", + "reference": "d33eafe0ba17a9df6bfd92812631cfc4df85e688", "shasum": "" }, "require": { @@ -2183,34 +2188,34 @@ ], "description": "Symfony ProxyManager Bridge", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-07-26T09:06:28+00:00" }, { "name": "symfony/routing", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e2b6d6fe7b090c7af720b75c7722c6dfa7a52658" + "reference": "e20f4bb79502c3c0db86d572f7683a30d4143911" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e2b6d6fe7b090c7af720b75c7722c6dfa7a52658", - "reference": "e2b6d6fe7b090c7af720b75c7722c6dfa7a52658", + "url": "https://api.github.com/repos/symfony/routing/zipball/e20f4bb79502c3c0db86d572f7683a30d4143911", + "reference": "e20f4bb79502c3c0db86d572f7683a30d4143911", "shasum": "" }, "require": { "php": "^5.5.9|>=7.0.8" }, "conflict": { - "symfony/config": "<2.8", + "symfony/config": "<3.3.1", "symfony/dependency-injection": "<3.3", "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", + "symfony/config": "^3.3.1|~4.0", "symfony/dependency-injection": "~3.3|~4.0", "symfony/expression-language": "~2.8|~3.0|~4.0", "symfony/http-foundation": "~2.8|~3.0|~4.0", @@ -2260,20 +2265,20 @@ "uri", "url" ], - "time": "2018-01-04T15:09:34+00:00" + "time": "2018-07-26T11:19:56+00:00" }, { "name": "symfony/twig-bridge", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "d5c5d63b89800ead1b1cd9908b77211a22d2f3cd" + "reference": "5d9401bc36c5a8006901e990b6884f5990c87920" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d5c5d63b89800ead1b1cd9908b77211a22d2f3cd", - "reference": "d5c5d63b89800ead1b1cd9908b77211a22d2f3cd", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/5d9401bc36c5a8006901e990b6884f5990c87920", + "reference": "5d9401bc36c5a8006901e990b6884f5990c87920", "shasum": "" }, "require": { @@ -2282,7 +2287,7 @@ }, "conflict": { "symfony/console": "<3.4", - "symfony/form": "<3.4" + "symfony/form": "<3.4.13|>=4.0,<4.0.13|>=4.1,<4.1.2" }, "require-dev": { "symfony/asset": "~2.8|~3.0|~4.0", @@ -2290,12 +2295,12 @@ "symfony/dependency-injection": "~2.8|~3.0|~4.0", "symfony/expression-language": "~2.8|~3.0|~4.0", "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/form": "~3.4|~4.0", + "symfony/form": "^3.4.13|~4.0.13|^4.1.2", "symfony/http-foundation": "^3.3.11|~4.0", "symfony/http-kernel": "~3.2|~4.0", "symfony/polyfill-intl-icu": "~1.0", "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/security": "~2.8|~3.0|~4.0", + "symfony/security": "^2.8.31|^3.3.13|~4.0", "symfony/security-acl": "~2.8|~3.0", "symfony/stopwatch": "~2.8|~3.0|~4.0", "symfony/templating": "~2.8|~3.0|~4.0", @@ -2350,24 +2355,25 @@ ], "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "time": "2018-01-03T17:14:19+00:00" + "time": "2018-07-26T11:19:56+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "25c192f25721a74084272671f658797d9e0e0146" + "reference": "c2f4812ead9f847cb69e90917ca7502e6892d6b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/25c192f25721a74084272671f658797d9e0e0146", - "reference": "25c192f25721a74084272671f658797d9e0e0146", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c2f4812ead9f847cb69e90917ca7502e6892d6b8", + "reference": "c2f4812ead9f847cb69e90917ca7502e6892d6b8", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/console": "<3.4" @@ -2408,7 +2414,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-08-10T07:34:36+00:00" }, { "name": "twig/twig", @@ -2530,16 +2536,16 @@ }, { "name": "zendframework/zend-eventmanager", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "9d72db10ceb6e42fb92350c0cb54460da61bd79c" + "reference": "a5e2583a211f73604691586b8406ff7296a946dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/9d72db10ceb6e42fb92350c0cb54460da61bd79c", - "reference": "9d72db10ceb6e42fb92350c0cb54460da61bd79c", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", + "reference": "a5e2583a211f73604691586b8406ff7296a946dd", "shasum": "" }, "require": { @@ -2548,7 +2554,7 @@ "require-dev": { "athletic/athletic": "^0.1", "container-interop/container-interop": "^1.1.0", - "phpunit/phpunit": "^6.0.7 || ^5.7.14", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", "zendframework/zend-coding-standard": "~1.0.0", "zendframework/zend-stdlib": "^2.7.3 || ^3.0" }, @@ -2580,7 +2586,7 @@ "events", "zf2" ], - "time": "2017-07-11T19:17:22+00:00" + "time": "2018-04-25T15:33:34+00:00" } ], "packages-dev": [ @@ -2640,16 +2646,16 @@ }, { "name": "fabpot/goutte", - "version": "v3.2.2", + "version": "v3.2.3", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/Goutte.git", - "reference": "395f61d7c2e15a813839769553a4de16fa3b3c96" + "reference": "3f0eaf0a40181359470651f1565b3e07e3dd31b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/395f61d7c2e15a813839769553a4de16fa3b3c96", - "reference": "395f61d7c2e15a813839769553a4de16fa3b3c96", + "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/3f0eaf0a40181359470651f1565b3e07e3dd31b8", + "reference": "3f0eaf0a40181359470651f1565b3e07e3dd31b8", "shasum": "" }, "require": { @@ -2691,38 +2697,43 @@ "keywords": [ "scraper" ], - "time": "2017-11-19T08:45:40+00:00" + "time": "2018-06-29T15:13:57+00:00" }, { "name": "facebook/webdriver", - "version": "1.5.0", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/facebook/php-webdriver.git", - "reference": "86b5ca2f67173c9d34340845dd690149c886a605" + "reference": "bd8c740097eb9f2fc3735250fc1912bc811a954e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/86b5ca2f67173c9d34340845dd690149c886a605", - "reference": "86b5ca2f67173c9d34340845dd690149c886a605", + "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/bd8c740097eb9f2fc3735250fc1912bc811a954e", + "reference": "bd8c740097eb9f2fc3735250fc1912bc811a954e", "shasum": "" }, "require": { "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", "ext-zip": "*", "php": "^5.6 || ~7.0", "symfony/process": "^2.8 || ^3.1 || ^4.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.0", - "guzzle/guzzle": "^3.4.1", - "php-coveralls/php-coveralls": "^1.0.2", + "jakub-onderka/php-parallel-lint": "^0.9.2", + "php-coveralls/php-coveralls": "^2.0", "php-mock/php-mock-phpunit": "^1.1", "phpunit/phpunit": "^5.7", "sebastian/environment": "^1.3.4 || ^2.0 || ^3.0", "squizlabs/php_codesniffer": "^2.6", "symfony/var-dumper": "^3.3 || ^4.0" }, + "suggest": { + "ext-SimpleXML": "For Firefox profile creation" + }, "type": "library", "extra": { "branch-alias": { @@ -2746,20 +2757,20 @@ "selenium", "webdriver" ], - "time": "2017-11-15T11:08:09+00:00" + "time": "2018-05-16T17:37:13+00:00" }, { "name": "laravel/homestead", - "version": "v7.7.0", + "version": "v7.17.0", "source": { "type": "git", "url": "https://github.com/laravel/homestead.git", - "reference": "4895d028e1214c9df34ed0104775e6ae1eb23d77" + "reference": "0a29bebaf0c5dae1502c5169dc5ec02ee7847736" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/homestead/zipball/4895d028e1214c9df34ed0104775e6ae1eb23d77", - "reference": "4895d028e1214c9df34ed0104775e6ae1eb23d77", + "url": "https://api.github.com/repos/laravel/homestead/zipball/0a29bebaf0c5dae1502c5169dc5ec02ee7847736", + "reference": "0a29bebaf0c5dae1502c5169dc5ec02ee7847736", "shasum": "" }, "require": { @@ -2769,6 +2780,7 @@ "symfony/yaml": "~3.3|~4.0" }, "require-dev": { + "phly/changelog-generator": "^2.2", "phpunit/phpunit": "^5.7 || ^6.0" }, "bin": [ @@ -2796,7 +2808,7 @@ } ], "description": "A virtual machine for web artisans.", - "time": "2018-06-03T21:17:32+00:00" + "time": "2018-09-09T15:17:06+00:00" }, { "name": "myclabs/deep-copy", @@ -3410,16 +3422,16 @@ }, { "name": "phpunit/phpunit", - "version": "5.7.26", + "version": "5.7.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "7fbc25c13309de0c4c9bb48b7361f1eca34c7fbd" + "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7fbc25c13309de0c4c9bb48b7361f1eca34c7fbd", - "reference": "7fbc25c13309de0c4c9bb48b7361f1eca34c7fbd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", + "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", "shasum": "" }, "require": { @@ -3443,7 +3455,7 @@ "sebastian/global-state": "^1.1", "sebastian/object-enumerator": "~2.0", "sebastian/resource-operations": "~1.0", - "sebastian/version": "~1.0.3|~2.0", + "sebastian/version": "^1.0.6|^2.0.1", "symfony/yaml": "~2.1|~3.0|~4.0" }, "conflict": { @@ -3488,7 +3500,7 @@ "testing", "xunit" ], - "time": "2017-12-17T06:14:38+00:00" + "time": "2018-02-01T05:50:59+00:00" }, { "name": "phpunit/phpunit-mock-objects", @@ -4142,16 +4154,16 @@ }, { "name": "symfony/browser-kit", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "490f27762705c8489bd042fe3e9377a191dba9b4" + "reference": "f6668d1a6182d5a8dec65a1c863a4c1d963816c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/490f27762705c8489bd042fe3e9377a191dba9b4", - "reference": "490f27762705c8489bd042fe3e9377a191dba9b4", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/f6668d1a6182d5a8dec65a1c863a4c1d963816c0", + "reference": "f6668d1a6182d5a8dec65a1c863a4c1d963816c0", "shasum": "" }, "require": { @@ -4195,20 +4207,20 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-07-26T09:06:28+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "e66394bc7610e69279bfdb3ab11b4fe65403f556" + "reference": "edda5a6155000ff8c3a3f85ee5c421af93cca416" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/e66394bc7610e69279bfdb3ab11b4fe65403f556", - "reference": "e66394bc7610e69279bfdb3ab11b4fe65403f556", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/edda5a6155000ff8c3a3f85ee5c421af93cca416", + "reference": "edda5a6155000ff8c3a3f85ee5c421af93cca416", "shasum": "" }, "require": { @@ -4248,24 +4260,25 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-07-26T09:06:28+00:00" }, { "name": "symfony/dom-crawler", - "version": "v3.4.3", + "version": "v3.4.15", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "09bd97b844b3151fab82f2fdd62db9c464b3910a" + "reference": "452bfc854b60134438e3824b159b0d24a5892331" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/09bd97b844b3151fab82f2fdd62db9c464b3910a", - "reference": "09bd97b844b3151fab82f2fdd62db9c464b3910a", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/452bfc854b60134438e3824b159b0d24a5892331", + "reference": "452bfc854b60134438e3824b159b0d24a5892331", "shasum": "" }, "require": { "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { @@ -4304,20 +4317,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-07-26T10:03:52+00:00" }, { "name": "webmozart/assert", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + "reference": "0df1908962e7a3071564e857d86874dad1ef204a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a", "shasum": "" }, "require": { @@ -4354,7 +4367,7 @@ "check", "validate" ], - "time": "2016-11-23T20:04:58+00:00" + "time": "2018-01-29T19:49:41+00:00" } ], "aliases": [], diff --git a/phpBB/phpbb/di/container_builder.php b/phpBB/phpbb/di/container_builder.php index 3c8a2155d6..145c3e79d4 100644 --- a/phpBB/phpbb/di/container_builder.php +++ b/phpBB/phpbb/di/container_builder.php @@ -486,7 +486,7 @@ class container_builder $cached_container_dump = $dumper->dump(array( 'class' => 'phpbb_cache_container', - 'base_class' => 'Symfony\\Component\\DependencyInjection\\ContainerBuilder', + 'base_class' => 'Symfony\\Component\\DependencyInjection\\Container', )); $cache->write($cached_container_dump, $this->container->getResources()); From 0898c4c1ccad955059ae13de9211b3e611f15a7e Mon Sep 17 00:00:00 2001 From: rubencm Date: Thu, 13 Sep 2018 11:55:05 +0000 Subject: [PATCH 080/148] [ticket/15566] Set category to none if extension don't exist PHPBB3-15566 --- phpBB/includes/acp/acp_attachments.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/acp/acp_attachments.php b/phpBB/includes/acp/acp_attachments.php index 3cfe5de293..4d8bccb456 100644 --- a/phpBB/includes/acp/acp_attachments.php +++ b/phpBB/includes/acp/acp_attachments.php @@ -1237,7 +1237,7 @@ class acp_attachments $row['extension'] = strtolower(trim((string) $row['extension'])); $comment = ($row['attach_comment'] && !$row['in_message']) ? str_replace(array("\n", "\r"), array('
        ', "\n"), $row['attach_comment']) : ''; - $display_cat = $extensions[$row['extension']]['display_cat']; + $display_cat = isset($extensions[$row['extension']]['display_cat']) ? extensions[$row['extension']]['display_cat'] : ATTACHMENT_CATEGORY_NONE; $l_downloaded_viewed = ($display_cat == ATTACHMENT_CATEGORY_NONE) ? 'DOWNLOAD_COUNTS' : 'VIEWED_COUNTS'; $template->assign_block_vars('attachments', array( From 4734e56b5bfd66a5778365b5ec023b1fb7a88fe5 Mon Sep 17 00:00:00 2001 From: rubencm Date: Thu, 13 Sep 2018 12:39:16 +0000 Subject: [PATCH 081/148] [ticket/15692] Update comments PHPBB3-15692 --- phpBB/phpbb/storage/storage.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/phpbb/storage/storage.php b/phpBB/phpbb/storage/storage.php index 1bd693b6fa..c8fcdacbf7 100644 --- a/phpBB/phpbb/storage/storage.php +++ b/phpBB/phpbb/storage/storage.php @@ -140,7 +140,8 @@ class storage /** * Checks the existence of files or directories * - * @param string $path file/directory to check + * @param string $path file/directory to check + * @param bool $full_check check in the filesystem too * * @return bool Returns true if the file/directory exist, false otherwise */ @@ -317,7 +318,7 @@ class storage if (!$row) { - // Don't call the method, because it check's if the file is tracked + // Don't call the file_info method, because it check's if the file is tracked // and is not (for now). This method check if the file exists using the adapter // at the beginning. $file = new file_info($this->get_adapter(), $path); @@ -373,7 +374,6 @@ class storage 'storage' => $this->get_name(), ); - // Get file, if exist update filesize, if not add new record $sql = 'SELECT file_id FROM ' . $this->storage_table . ' WHERE ' . $this->db->sql_build_array('SELECT', $sql_ary); $result = $this->db->sql_query($sql); From 9090ddcfb6dc4c50a2e7b0cc6a7d387a3fa17143 Mon Sep 17 00:00:00 2001 From: Oliver Schramm Date: Thu, 13 Sep 2018 15:18:29 +0200 Subject: [PATCH 082/148] [ticket/15767] Fix effictively_installed condition for oauth_tokens PHPBB3-15767 --- phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php b/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php index d41041af49..1e2024a071 100644 --- a/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php +++ b/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php @@ -17,7 +17,7 @@ class auth_provider_oauth extends \phpbb\db\migration\migration { public function effectively_installed() { - return $this->db_tools->sql_table_exists($this->table_prefix . 'auth_provider_oauth'); + return $this->db_tools->sql_table_exists($this->table_prefix . 'oauth_tokens'); } static public function depends_on() From 03ea042d576a2c1213be9a86c1cd62bdf5eb7545 Mon Sep 17 00:00:00 2001 From: rubencm Date: Thu, 13 Sep 2018 14:53:01 +0000 Subject: [PATCH 083/148] [ticket/12636] Rename log.session_errors to session.log_errors PHPBB3-12636 --- phpBB/config/development/config.yml | 4 ++-- phpBB/phpbb/di/extension/container_configuration.php | 4 ++-- phpBB/phpbb/di/extension/core.php | 4 ++-- phpBB/phpbb/session.php | 2 +- tests/mock/container_builder.php | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/phpBB/config/development/config.yml b/phpBB/config/development/config.yml index 3709b100f0..20cb8451d0 100644 --- a/phpBB/config/development/config.yml +++ b/phpBB/config/development/config.yml @@ -18,5 +18,5 @@ core: composer_debug: true composer_verbose: true - log: - session_errors: true + session: + log_errors: true diff --git a/phpBB/phpbb/di/extension/container_configuration.php b/phpBB/phpbb/di/extension/container_configuration.php index 5df1ebb59e..909a47c53e 100644 --- a/phpBB/phpbb/di/extension/container_configuration.php +++ b/phpBB/phpbb/di/extension/container_configuration.php @@ -54,10 +54,10 @@ class container_configuration implements ConfigurationInterface ->booleanNode('composer_verbose')->defaultValue(false)->end() ->end() ->end() - ->arrayNode('log') + ->arrayNode('session') ->addDefaultsIfNotSet() ->children() - ->booleanNode('session_errors')->defaultValue(false)->end() + ->booleanNode('log_errors')->defaultValue(false)->end() ->end() ->end() ->end() diff --git a/phpBB/phpbb/di/extension/core.php b/phpBB/phpbb/di/extension/core.php index 2f57c2854c..db40feb4cf 100644 --- a/phpBB/phpbb/di/extension/core.php +++ b/phpBB/phpbb/di/extension/core.php @@ -112,9 +112,9 @@ class core extends Extension } // Set the log options - foreach ($config['log'] as $name => $value) + foreach ($config['session'] as $name => $value) { - $container->setParameter('log.' . $name, $value); + $container->setParameter('session.' . $name, $value); } } diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php index 73f40b4e33..7d40d4ef87 100644 --- a/phpBB/phpbb/session.php +++ b/phpBB/phpbb/session.php @@ -481,7 +481,7 @@ class session else { // Added logging temporarily to help debug bugs... - if ($phpbb_container->getParameter('log.session_errors') && $this->data['user_id'] != ANONYMOUS) + if ($phpbb_container->getParameter('session.log_errors') && $this->data['user_id'] != ANONYMOUS) { if ($referer_valid) { diff --git a/tests/mock/container_builder.php b/tests/mock/container_builder.php index b27b0e64cb..17c4ae22dd 100644 --- a/tests/mock/container_builder.php +++ b/tests/mock/container_builder.php @@ -21,7 +21,7 @@ class phpbb_mock_container_builder implements ContainerInterface public function __construct() { $this->setParameter('debug.load_time', false); - $this->setParameter('log.session_errors', false); + $this->setParameter('session.log_errors', false); } /** From af5a2c4a20871685aca32c0e8ee3bfe3a340e8cb Mon Sep 17 00:00:00 2001 From: rubencm Date: Thu, 13 Sep 2018 15:26:17 +0000 Subject: [PATCH 084/148] [ticket/15566] Add missing variable sign PHPBB3-15566 --- phpBB/includes/acp/acp_attachments.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/acp/acp_attachments.php b/phpBB/includes/acp/acp_attachments.php index 4d8bccb456..7c8e4db7be 100644 --- a/phpBB/includes/acp/acp_attachments.php +++ b/phpBB/includes/acp/acp_attachments.php @@ -1237,7 +1237,7 @@ class acp_attachments $row['extension'] = strtolower(trim((string) $row['extension'])); $comment = ($row['attach_comment'] && !$row['in_message']) ? str_replace(array("\n", "\r"), array('
        ', "\n"), $row['attach_comment']) : ''; - $display_cat = isset($extensions[$row['extension']]['display_cat']) ? extensions[$row['extension']]['display_cat'] : ATTACHMENT_CATEGORY_NONE; + $display_cat = isset($extensions[$row['extension']]['display_cat']) ? $extensions[$row['extension']]['display_cat'] : ATTACHMENT_CATEGORY_NONE; $l_downloaded_viewed = ($display_cat == ATTACHMENT_CATEGORY_NONE) ? 'DOWNLOAD_COUNTS' : 'VIEWED_COUNTS'; $template->assign_block_vars('attachments', array( From 271c9d34dc8a2556bb0fa164258d2264fb512aca Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 13 Sep 2018 17:49:24 +0200 Subject: [PATCH 085/148] [ticket/15744] Remove useless sql_freeresults PHPBB3-15744 --- .../phpbb/db/migration/data/v320/remove_outdated_media.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php b/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php index 98b1c2d039..88fe59ccc9 100644 --- a/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php +++ b/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php @@ -85,13 +85,11 @@ class remove_outdated_media extends \phpbb\db\migration\migration WHERE ' . $this->db->sql_in_set('group_id', $group_ids); } - $result = $this->db->sql_query($sql); - $this->db->sql_freeresult($result); + $this->db->sql_query($sql); // delete the now empty, outdated media extension groups $sql = 'DELETE FROM ' . EXTENSION_GROUPS_TABLE . ' WHERE ' . $this->db->sql_in_set('group_id', $group_ids); - $result = $this->db->sql_query($sql); - $this->db->sql_freeresult($result); + $this->db->sql_query($sql); } } From 89d1401a77f7a2f9ee067b90efa975e21363e914 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 13 Sep 2018 18:47:14 +0200 Subject: [PATCH 086/148] [ticket/15742] Remove addslashes_recursively() PHPBB3-15742 --- phpBB/phpbb/request/type_cast_helper.php | 28 ------------------- .../request/type_cast_helper_interface.php | 7 ----- tests/request/type_cast_helper_test.php | 10 ------- 3 files changed, 45 deletions(-) diff --git a/phpBB/phpbb/request/type_cast_helper.php b/phpBB/phpbb/request/type_cast_helper.php index 1a53206c74..912494998d 100644 --- a/phpBB/phpbb/request/type_cast_helper.php +++ b/phpBB/phpbb/request/type_cast_helper.php @@ -18,34 +18,6 @@ namespace phpbb\request; */ class type_cast_helper implements \phpbb\request\type_cast_helper_interface { - /** - * Recursively applies addslashes to a variable. - * - * @param mixed &$var Variable passed by reference to which slashes will be added. - */ - public function addslashes_recursively(&$var) - { - if (is_string($var)) - { - $var = addslashes($var); - } - else if (is_array($var)) - { - $var_copy = $var; - $var = array(); - foreach ($var_copy as $key => $value) - { - if (is_string($key)) - { - $key = addslashes($key); - } - $var[$key] = $value; - - $this->addslashes_recursively($var[$key]); - } - } - } - /** * Set variable $result to a particular type. * diff --git a/phpBB/phpbb/request/type_cast_helper_interface.php b/phpBB/phpbb/request/type_cast_helper_interface.php index e22712dc0c..9671573bf1 100644 --- a/phpBB/phpbb/request/type_cast_helper_interface.php +++ b/phpBB/phpbb/request/type_cast_helper_interface.php @@ -18,13 +18,6 @@ namespace phpbb\request; */ interface type_cast_helper_interface { - /** - * Recursively applies addslashes to a variable. - * - * @param mixed &$var Variable passed by reference to which slashes will be added. - */ - public function addslashes_recursively(&$var); - /** * Set variable $result to a particular type. * diff --git a/tests/request/type_cast_helper_test.php b/tests/request/type_cast_helper_test.php index 143c05aa9c..6407dca894 100644 --- a/tests/request/type_cast_helper_test.php +++ b/tests/request/type_cast_helper_test.php @@ -20,16 +20,6 @@ class phpbb_type_cast_helper_test extends phpbb_test_case $this->type_cast_helper = new \phpbb\request\type_cast_helper(); } - public function test_addslashes_recursively() - { - $data = array('some"string' => array('that"' => 'really"', 'needs"' => '"escaping')); - $expected = array('some\\"string' => array('that\\"' => 'really\\"', 'needs\\"' => '\\"escaping')); - - $this->type_cast_helper->addslashes_recursively($data); - - $this->assertEquals($expected, $data); - } - public function test_simple_recursive_set_var() { $data = 'eviL<3'; From 204b18dd593a85374927e313e1af19c86f78055b Mon Sep 17 00:00:00 2001 From: Oliver Schramm Date: Fri, 14 Sep 2018 11:21:55 +0200 Subject: [PATCH 087/148] [ticket/15607] Skip ban and disabled checks when deleting cookies PHPBB3-15607 --- phpBB/ucp.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/phpBB/ucp.php b/phpBB/ucp.php index 7eca5ede62..b72006b37f 100644 --- a/phpBB/ucp.php +++ b/phpBB/ucp.php @@ -30,6 +30,12 @@ if (in_array($mode, array('login', 'login_link', 'logout', 'confirm', 'sendpassw define('IN_LOGIN', true); } +if ($mode === 'delete_cookies') +{ + define('SKIP_CHECK_BAN', true); + define('SKIP_CHECK_DISABLED', true); +} + // Start session management $user->session_begin(); $auth->acl($user->data); From 4d5258b5a3e9595af83ca9192e845fbc22dd7457 Mon Sep 17 00:00:00 2001 From: Derky Date: Fri, 14 Sep 2018 11:34:14 +0200 Subject: [PATCH 088/148] [ticket/15748] Trim whitespace before storing in data attribute PHPBB3-15748 --- phpBB/assets/javascript/core.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js index 0c528dba5e..32be1cf6ed 100644 --- a/phpBB/assets/javascript/core.js +++ b/phpBB/assets/javascript/core.js @@ -935,8 +935,8 @@ phpbb.addAjaxCallback('alt_text', function() { $anchor.each(function() { var $this = $(this); altText = $this.attr('data-alt-text'); - $this.attr('data-alt-text', $this.text()); - $this.attr('title', $.trim(altText)); + $this.attr('data-alt-text', $.trim($this.text())); + $this.attr('title', altText); $this.children('span').text(altText); }); }); From 0d7c33c1afd2595ca4f5569af69d1514bec29b35 Mon Sep 17 00:00:00 2001 From: Oliver Schramm Date: Fri, 14 Sep 2018 14:54:20 +0200 Subject: [PATCH 089/148] [ticket/15329] Parse drafts before saving them (and decode) PHPBB3-15329 --- phpBB/includes/ucp/ucp_main.php | 24 ++++++++++++++++++++++-- phpBB/includes/ucp/ucp_pm_compose.php | 5 ++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php index 71a615e75c..cd75eead1e 100644 --- a/phpBB/includes/ucp/ucp_main.php +++ b/phpBB/includes/ucp/ucp_main.php @@ -502,6 +502,9 @@ class ucp_main $draft_subject = $draft_message = ''; add_form_key('ucp_draft'); + include_once($phpbb_root_path . 'includes/message_parser.' . $phpEx); + $message_parser = new parse_message(); + if ($delete) { if (check_form_key('ucp_draft')) @@ -535,9 +538,19 @@ class ucp_main { if ($draft_message && $draft_subject) { + // $auth->acl_gets can't be used here because it will check for global forum permissions in this case + // In general we don't need too harsh checking here for permissions, as this will be handled later when submitting + $bbcode_status = $auth->acl_get('u_pm_bbcode') || $auth->acl_getf_global('f_bbcode'); + $smilies_status = $auth->acl_get('u_pm_smilies') || $auth->acl_getf_global('f_smilies'); + $img_status = $auth->acl_get('u_pm_img') || $auth->acl_getf_global('f_img'); + $flash_status = $auth->acl_get('u_pm_flash') || $auth->acl_getf_global('f_flash'); + + $message_parser->message = $draft_message; + $message_parser->parse($bbcode_status, $config['allow_post_links'], $smilies_status, $img_status, $flash_status, true, $config['allow_post_links']); + $draft_row = array( 'draft_subject' => $draft_subject, - 'draft_message' => $draft_message + 'draft_message' => $message_parser->message, ); $sql = 'UPDATE ' . DRAFTS_TABLE . ' @@ -639,9 +652,16 @@ class ucp_main $insert_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=$id&mode=compose&d=" . $draft['draft_id']); } + if (!$submit) + { + $message_parser->message = $draft['draft_message']; + $message_parser->decode_message(); + $draft_message = $message_parser->message; + } + $template_row = array( 'DATE' => $user->format_date($draft['save_time']), - 'DRAFT_MESSAGE' => ($submit) ? $draft_message : $draft['draft_message'], + 'DRAFT_MESSAGE' => $draft_message, 'DRAFT_SUBJECT' => ($submit) ? $draft_subject : $draft['draft_subject'], 'TITLE' => $title, diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index bf18e76568..bc43b5d1fe 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -659,13 +659,16 @@ function compose_pm($id, $mode, $action, $user_folders = array()) { if (confirm_box(true)) { + $message_parser->message = $message; + $message_parser->parse($bbcode_status, $url_status, $smilies_status, $img_status, $flash_status, true, $url_status); + $sql = 'INSERT INTO ' . DRAFTS_TABLE . ' ' . $db->sql_build_array('INSERT', array( 'user_id' => $user->data['user_id'], 'topic_id' => 0, 'forum_id' => 0, 'save_time' => $current_time, 'draft_subject' => $subject, - 'draft_message' => $message + 'draft_message' => $message_parser->message, ) ); $db->sql_query($sql); From 4ac3c545e1b95fb2abfdd6f4343865e7646c978e Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Fri, 14 Sep 2018 15:02:07 +0200 Subject: [PATCH 090/148] [ticket/15770] Make sure sphinx limits are cast to int PHPBB3-15770 --- phpBB/phpbb/search/fulltext_sphinx.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/search/fulltext_sphinx.php b/phpBB/phpbb/search/fulltext_sphinx.php index e2eeb5f7f3..878c98bf72 100644 --- a/phpBB/phpbb/search/fulltext_sphinx.php +++ b/phpBB/phpbb/search/fulltext_sphinx.php @@ -648,7 +648,7 @@ class fulltext_sphinx $this->sphinx->SetFilter('deleted', array(0)); - $this->sphinx->SetLimits($start, (int) $per_page, SPHINX_MAX_MATCHES); + $this->sphinx->SetLimits((int) $start, (int) $per_page, SPHINX_MAX_MATCHES); $result = $this->sphinx->Query($search_query_prefix . $this->sphinx->EscapeString(str_replace('"', '"', $this->search_query)), $this->indexes); // Could be connection to localhost:9312 failed (errno=111, From c38075d2c27d5a727ad9bf31e2a2443563bf3eec Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Mon, 10 Sep 2018 20:14:36 +0200 Subject: [PATCH 091/148] [ticket/15768] Add a license to a repository PHPBB3-15768 --- LICENSE | 281 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..ce992b2ce7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,281 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + From c7631635fa738f4c7df45f6f671d2eb47f2f72a3 Mon Sep 17 00:00:00 2001 From: hubaishan Date: Sun, 16 Sep 2018 06:38:58 +0300 Subject: [PATCH 092/148] [ticket/15791] php 7.2 count() bug in memory cache driver function `_read` in classes inherted from `memory` may returns `false` but `$vars` must be an array PHPBB3-15791 --- phpBB/phpbb/cache/driver/memory.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/phpBB/phpbb/cache/driver/memory.php b/phpBB/phpbb/cache/driver/memory.php index 052f40c243..eba9549877 100644 --- a/phpBB/phpbb/cache/driver/memory.php +++ b/phpBB/phpbb/cache/driver/memory.php @@ -51,10 +51,11 @@ abstract class memory extends \phpbb\cache\driver\base function load() { // grab the global cache - $this->vars = $this->_read('global'); + $data = $this->_read('global'); - if ($this->vars !== false) + if ($data !== false) { + $this->vars = $data; return true; } From 212882fe70f7ea3fb740038d66b5db741af54588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Sun, 16 Sep 2018 08:57:01 +0000 Subject: [PATCH 093/148] [ticket/15692] Don't try to track files that don't exist PHPBB3-15692 --- .../db/migration/data/v330/storage_track.php | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/phpBB/phpbb/db/migration/data/v330/storage_track.php b/phpBB/phpbb/db/migration/data/v330/storage_track.php index 7463e4641b..5abd875ae9 100644 --- a/phpBB/phpbb/db/migration/data/v330/storage_track.php +++ b/phpBB/phpbb/db/migration/data/v330/storage_track.php @@ -86,7 +86,14 @@ class storage_track extends \phpbb\db\migration\container_aware_migration $ext = substr(strrchr($filename, '.'), 1); $filename = (int) $filename; - $storage->track_file($this->config['avatar_salt'] . '_' . ($avatar_group ? 'g' : '') . $filename . '.' . $ext); + try + { + $storage->track_file($this->config['avatar_salt'] . '_' . ($avatar_group ? 'g' : '') . $filename . '.' . $ext); + } + catch (\phpbb\storage\exception\exception $e) + { + // If file don't exist, don't track it + } } $this->db->sql_freeresult($result); } @@ -103,11 +110,25 @@ class storage_track extends \phpbb\db\migration\container_aware_migration while ($row = $this->db->sql_fetchrow($result)) { - $storage->track_file($row['physical_filename']); + try + { + $storage->track_file($row['physical_filename']); + } + catch (\phpbb\storage\exception\exception $e) + { + // If file don't exist, don't track it + } if ($row['thumbnail'] == 1) { - $storage->track_file('thumb_' . $row['physical_filename']); + try + { + $storage->track_file('thumb_' . $row['physical_filename']); + } + catch (\phpbb\storage\exception\exception $e) + { + // If file don't exist, don't track it + } } } $this->db->sql_freeresult($result); @@ -125,8 +146,16 @@ class storage_track extends \phpbb\db\migration\container_aware_migration while ($row = $this->db->sql_fetchrow($result)) { - $storage->track_file($row['filename']); + try + { + $storage->track_file($row['filename']); + } + catch (\phpbb\storage\exception\exception $e) + { + // If file don't exist, don't track it + } } + $this->db->sql_freeresult($result); } } From 072572381353b4c4a25acae306122ef43914fd72 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Mon, 7 May 2018 22:01:23 +0200 Subject: [PATCH 094/148] [ticket/15662] Add template PHPBB3-15662 --- phpBB/includes/functions_messenger.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index a85a3b67c5..fdd1dc6e32 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -327,6 +327,7 @@ class messenger $subject = $this->subject; $message = $this->msg; + $template = $this->template; /** * Event to modify notification message text before parsing * @@ -336,13 +337,16 @@ class messenger * and the message without sending it * @var string subject The message subject * @var string message The message text + * @var \phpbb\template\template template Template object * @since 3.1.11-RC1 + * @changed 3.2.4-RC1 Added template */ $vars = array( 'method', 'break', 'subject', 'message', + 'template', ); extract($phpbb_dispatcher->trigger_event('core.modify_notification_message', compact($vars))); $this->subject = $subject; From fbd1741107c2eda9d009efcc794b53d3b703bd92 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Mon, 7 May 2018 18:36:51 +0200 Subject: [PATCH 095/148] [ticket/15661] Add core.viewtopic_modify_poll_ajax_data PHPBB3-15661 --- phpBB/viewtopic.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 3c25c3b037..a9f419b9aa 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -998,6 +998,29 @@ if (!empty($topic_data['poll_start'])) 'total_votes' => array_sum($vote_counts), 'can_vote' => !count($valid_user_votes) || ($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change']), ); + + /** + * Event to manipulate the poll data sent by AJAX response + * + * @event core.viewtopic_modify_poll_ajax_data + * @var array data JSON response data + * @var array valid_user_votes Valid user votes + * @var array vote_counts Vote counts + * @var int forum_id Forum ID + * @var array topic_data Topic data + * @var array poll_info Array with the poll information + * @since 3.2.4-RC1 + */ + $vars = array( + 'data', + 'valid_user_votes', + 'vote_counts', + 'forum_id', + 'topic_data', + 'poll_info', + ); + extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_poll_ajax_data', compact($vars))); + $json_response = new \phpbb\json_response(); $json_response->send($data); } From 1a284ebe8dc3cb7559cb374e17bec5a99168ed49 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 6 Mar 2018 18:28:14 +0100 Subject: [PATCH 096/148] [ticket/15579] Add ucp_front events PHPBB3-15579 --- phpBB/includes/ucp/ucp_main.php | 42 +++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php index 8584a9a0fd..4fe0c38afb 100644 --- a/phpBB/includes/ucp/ucp_main.php +++ b/phpBB/includes/ucp/ucp_main.php @@ -77,6 +77,22 @@ class ucp_main // If the user can't see any forums, he can't read any posts because fid of 0 is invalid if (!empty($forum_ary)) { + /** + * Modify sql variables before query is processed + * + * @event core.ucp_main_front_modify_sql + * @var string sql_select SQL select + * @var string sql_from SQL from + * @var array forum_ary Forum array + * @since 3.2.4-RC1 + */ + $vars = array( + 'sql_select', + 'sql_from', + 'forum_ary', + ); + extract($phpbb_dispatcher->trigger_event('core.ucp_main_front_modify_sql', compact($vars))); + $sql = "SELECT t.* $sql_select FROM $sql_from WHERE t.topic_type = " . POST_GLOBAL . ' @@ -144,7 +160,7 @@ class ucp_main $folder_img .= '_mine'; } - $template->assign_block_vars('topicrow', array( + $topicrow = array( 'FORUM_ID' => $forum_id, 'TOPIC_ID' => $topic_id, 'TOPIC_AUTHOR' => get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']), @@ -171,8 +187,30 @@ class ucp_main 'U_LAST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&p=" . $row['topic_last_post_id']) . '#p' . $row['topic_last_post_id'], 'U_LAST_POST_AUTHOR' => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']), 'U_NEWEST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=unread") . '#unread', - 'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id")) + 'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id"), ); + + /** + * Add template variables to a front topics row. + * + * @event core.ucp_main_front_modify_template_vars + * @var array topicrow Array containing the template variables for the row + * @var array row Array containing the subscribed forum row data + * @var int forum_id Forum ID + * @var string folder_img Folder image + * @var string folder_alt Alt text for the folder image + * @since 3.2.4-RC1 + */ + $vars = array( + 'topicrow', + 'row', + 'forum_id', + 'folder_img', + 'folder_alt', + ); + extract($phpbb_dispatcher->trigger_event('core.ucp_main_front_modify_template_vars', compact($vars))); + + $template->assign_block_vars('topicrow', $topicrow); } if ($config['load_user_activity']) From 02234783c6f0fd9b15faf7a17d3bb8b1d39da557 Mon Sep 17 00:00:00 2001 From: v12mike Date: Sun, 15 Jul 2018 21:50:18 +0100 Subject: [PATCH 097/148] [ticket/15726] Implement selective purge in APCu cache driver The current APCu cache driver implements a global clearing of the APCu when the phpBB cache is purged. This is inappropriate if there are other phpBB boards, or other php applications sharing the APCu cache. This patch changes the behviour so that only cache entries matching the key_prefix of this board are cleared by a phpBB cache purge. The APCu unit test script has been updated to test this behaviour. It has also been updated so that the test case can be run individually previously it relied on initialisations made in other test scripts. PHPBB3-15726 --- phpBB/phpbb/cache/driver/apcu.php | 6 +++++- tests/cache/apcu_driver_test.php | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) mode change 100644 => 100755 phpBB/phpbb/cache/driver/apcu.php mode change 100644 => 100755 tests/cache/apcu_driver_test.php diff --git a/phpBB/phpbb/cache/driver/apcu.php b/phpBB/phpbb/cache/driver/apcu.php old mode 100644 new mode 100755 index 40192e4026..6a65e7155a --- a/phpBB/phpbb/cache/driver/apcu.php +++ b/phpBB/phpbb/cache/driver/apcu.php @@ -25,7 +25,11 @@ class apcu extends \phpbb\cache\driver\memory */ function purge() { - apcu_clear_cache(); + /* use an iterator to selectively clear our cache entries without + disturbing any other cache users + (e.g. other phpBB boards hosted on this server) */ + apcu_delete(new \APCUIterator('#^' . $this->key_prefix . '#')); + parent::purge(); } diff --git a/tests/cache/apcu_driver_test.php b/tests/cache/apcu_driver_test.php old mode 100644 new mode 100755 index 9de1d82a15..2002fb66d8 --- a/tests/cache/apcu_driver_test.php +++ b/tests/cache/apcu_driver_test.php @@ -49,10 +49,27 @@ class phpbb_cache_apcu_driver_test extends phpbb_cache_common_test_case protected function setUp() { + global $phpbb_container, $phpbb_root_path; + parent::setUp(); + $phpbb_container = new phpbb_mock_container_builder(); + $phpbb_container->setParameter('core.cache_dir', $phpbb_root_path . 'cache/' . PHPBB_ENVIRONMENT . '/'); + $this->driver = new \phpbb\cache\driver\apcu; $this->driver->purge(); } + + public function test_purge() + { + /* add a cache entry which does not match our key */ + $foreign_key = 'test_' . $this->driver->key_prefix . 'test'; + $this->assertSame(true, apcu_store($foreign_key, 0, 600)); + $this->assertSame(true, apcu_exists($foreign_key)); + + parent::test_purge(); + + $this->assertSame(true, apcu_exists($foreign_key)); + } } From 63a3033f15428b1af9a121708eb4a2bd4bef43c0 Mon Sep 17 00:00:00 2001 From: v12mike Date: Mon, 16 Jul 2018 06:36:38 +0200 Subject: [PATCH 098/148] [ticket/15726] Implement selective purge in APCu cache driver Fix whitespace PHPBB3-15726 --- phpBB/phpbb/cache/driver/apcu.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/phpBB/phpbb/cache/driver/apcu.php b/phpBB/phpbb/cache/driver/apcu.php index 6a65e7155a..754fb1fce2 100755 --- a/phpBB/phpbb/cache/driver/apcu.php +++ b/phpBB/phpbb/cache/driver/apcu.php @@ -25,11 +25,10 @@ class apcu extends \phpbb\cache\driver\memory */ function purge() { - /* use an iterator to selectively clear our cache entries without - disturbing any other cache users - (e.g. other phpBB boards hosted on this server) */ - apcu_delete(new \APCUIterator('#^' . $this->key_prefix . '#')); - + /* use an iterator to selectively clear our cache entries without + disturbing any other cache users + (e.g. other phpBB boards hosted on this server) */ + apcu_delete(new \APCUIterator('#^' . $this->key_prefix . '#')); parent::purge(); } From 7d4d9770cfc38d613c3cf2b8495d2f8e63623ebd Mon Sep 17 00:00:00 2001 From: v12mike Date: Mon, 16 Jul 2018 07:26:14 +0100 Subject: [PATCH 099/148] [ticket/15726] Implement selective purge in APCu cache driver fix file permissions PHPBB3-15726 --- phpBB/phpbb/cache/driver/apcu.php | 0 tests/cache/apcu_driver_test.php | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 phpBB/phpbb/cache/driver/apcu.php mode change 100755 => 100644 tests/cache/apcu_driver_test.php diff --git a/phpBB/phpbb/cache/driver/apcu.php b/phpBB/phpbb/cache/driver/apcu.php old mode 100755 new mode 100644 diff --git a/tests/cache/apcu_driver_test.php b/tests/cache/apcu_driver_test.php old mode 100755 new mode 100644 From bf9af922208ad93c2afbe4fa9462f8914c8d4363 Mon Sep 17 00:00:00 2001 From: v12mike Date: Wed, 25 Jul 2018 19:36:25 +0100 Subject: [PATCH 100/148] [ticket/15726] Implement selective purge in APCu cache driver Correcting code formatting and whitespace PHPBB3-15726 --- phpBB/phpbb/cache/driver/apcu.php | 7 ++++--- tests/cache/apcu_driver_test.php | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/phpBB/phpbb/cache/driver/apcu.php b/phpBB/phpbb/cache/driver/apcu.php index 754fb1fce2..e40d5a376c 100644 --- a/phpBB/phpbb/cache/driver/apcu.php +++ b/phpBB/phpbb/cache/driver/apcu.php @@ -25,9 +25,10 @@ class apcu extends \phpbb\cache\driver\memory */ function purge() { - /* use an iterator to selectively clear our cache entries without - disturbing any other cache users - (e.g. other phpBB boards hosted on this server) */ + /* + Use an iterator to selectively clear our cache entries without disturbing + any other cache users (e.g. other phpBB boards hosted on this server) + */ apcu_delete(new \APCUIterator('#^' . $this->key_prefix . '#')); parent::purge(); diff --git a/tests/cache/apcu_driver_test.php b/tests/cache/apcu_driver_test.php index 2002fb66d8..57f640c313 100644 --- a/tests/cache/apcu_driver_test.php +++ b/tests/cache/apcu_driver_test.php @@ -61,7 +61,7 @@ class phpbb_cache_apcu_driver_test extends phpbb_cache_common_test_case $this->driver->purge(); } - public function test_purge() + public function test_purge() { /* add a cache entry which does not match our key */ $foreign_key = 'test_' . $this->driver->key_prefix . 'test'; From 7f1f64b1dcebb28ab575e1905676471b473d08ed Mon Sep 17 00:00:00 2001 From: v12mike Date: Thu, 26 Jul 2018 06:09:02 +0100 Subject: [PATCH 101/148] [ticket/15726] Implement selective purge in APCu cache driver Fix whitespace PHPBB3-15726 --- phpBB/phpbb/cache/driver/apcu.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/phpbb/cache/driver/apcu.php b/phpBB/phpbb/cache/driver/apcu.php index e40d5a376c..3a63a97e4e 100644 --- a/phpBB/phpbb/cache/driver/apcu.php +++ b/phpBB/phpbb/cache/driver/apcu.php @@ -25,9 +25,9 @@ class apcu extends \phpbb\cache\driver\memory */ function purge() { - /* - Use an iterator to selectively clear our cache entries without disturbing - any other cache users (e.g. other phpBB boards hosted on this server) + /* + * Use an iterator to selectively clear our cache entries without disturbing + * any other cache users (e.g. other phpBB boards hosted on this server) */ apcu_delete(new \APCUIterator('#^' . $this->key_prefix . '#')); From 33268e5a72b3858c09d97bb696a21911ec139815 Mon Sep 17 00:00:00 2001 From: v12mike Date: Thu, 26 Jul 2018 17:24:42 +0200 Subject: [PATCH 102/148] [ticket/15726] Implement selective purge in APCu cache driver Edit comment PHPBB3-15726 --- phpBB/phpbb/cache/driver/apcu.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/cache/driver/apcu.php b/phpBB/phpbb/cache/driver/apcu.php index 3a63a97e4e..4b06fdb002 100644 --- a/phpBB/phpbb/cache/driver/apcu.php +++ b/phpBB/phpbb/cache/driver/apcu.php @@ -26,7 +26,7 @@ class apcu extends \phpbb\cache\driver\memory function purge() { /* - * Use an iterator to selectively clear our cache entries without disturbing + * Use an iterator to selectively delete our cache entries without disturbing * any other cache users (e.g. other phpBB boards hosted on this server) */ apcu_delete(new \APCUIterator('#^' . $this->key_prefix . '#')); From 5edb33036654fad4df63507f00934b0d078e2756 Mon Sep 17 00:00:00 2001 From: v12mike Date: Sun, 29 Jul 2018 09:15:12 +0100 Subject: [PATCH 103/148] [ticket/15726] Implement selective purge in APCu fix indentation of comment PHPBB3-15726 --- phpBB/phpbb/cache/driver/apcu.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/phpBB/phpbb/cache/driver/apcu.php b/phpBB/phpbb/cache/driver/apcu.php index 4b06fdb002..c96cf0de57 100644 --- a/phpBB/phpbb/cache/driver/apcu.php +++ b/phpBB/phpbb/cache/driver/apcu.php @@ -25,10 +25,10 @@ class apcu extends \phpbb\cache\driver\memory */ function purge() { - /* - * Use an iterator to selectively delete our cache entries without disturbing - * any other cache users (e.g. other phpBB boards hosted on this server) - */ + /* + * Use an iterator to selectively delete our cache entries without disturbing + * any other cache users (e.g. other phpBB boards hosted on this server) + */ apcu_delete(new \APCUIterator('#^' . $this->key_prefix . '#')); parent::purge(); From e17f00fb6b482c71f3ed42786b6f413373a61b9b Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Sun, 16 Sep 2018 18:59:35 +0200 Subject: [PATCH 104/148] [ticket/15622] Remove "since" tag as it belongs to events PHPBB3-15622 --- phpBB/includes/functions_content.php | 1 - 1 file changed, 1 deletion(-) diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index 1e80da98d3..ed35f5213f 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -1767,7 +1767,6 @@ class bitfield * @param phpbb\textformatter\utils $text_formatter_utils Text formatter utilities * @param parse_message $message_parser Message parser class * @param string $message_link Link of the original quoted post - * @since 3.2.4-RC1 */ function format_quote($bbcode_status, $quote_attributes, $text_formatter_utils, $message_parser, $message_link = '') { From 4396bfba65b0c69023b47b564f789700f892e05a Mon Sep 17 00:00:00 2001 From: MikelAlejoBR Date: Sun, 16 Sep 2018 19:00:51 +0200 Subject: [PATCH 105/148] [ticket/15622] Rename function to avoid potential future conflicts PHPBB3-15622 --- phpBB/includes/functions_content.php | 2 +- phpBB/includes/ucp/ucp_pm_compose.php | 2 +- phpBB/posting.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index ed35f5213f..e124bd46e6 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -1768,7 +1768,7 @@ class bitfield * @param parse_message $message_parser Message parser class * @param string $message_link Link of the original quoted post */ -function format_quote($bbcode_status, $quote_attributes, $text_formatter_utils, $message_parser, $message_link = '') +function phpbb_format_quote($bbcode_status, $quote_attributes, $text_formatter_utils, $message_parser, $message_link = '') { if ($bbcode_status) { diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index d201c5fe73..ca2d3257e6 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -984,7 +984,7 @@ function compose_pm($id, $mode, $action, $user_folders = array()) $quote_attributes['post_id'] = $post['msg_id']; } - format_quote($bbcode_status, $quote_attributes, $phpbb_container->get('text_formatter.utils'), $message_parser, $message_link); + phpbb_format_quote($bbcode_status, $quote_attributes, $phpbb_container->get('text_formatter.utils'), $message_parser, $message_link); } if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !$preview && !$refresh) diff --git a/phpBB/posting.php b/phpBB/posting.php index de399068bc..1fd1444eab 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -1637,7 +1637,7 @@ if ($generate_quote) 'user_id' => $post_data['poster_id'], ); - format_quote($config['allow_bbcode'], $quote_attributes, $bbcode_utils, $message_parser); + phpbb_format_quote($config['allow_bbcode'], $quote_attributes, $bbcode_utils, $message_parser); } if (($mode == 'reply' || $mode == 'quote') && !$submit && !$preview && !$refresh) From f644cc4ba05479f838debc84c22f0b8c163f742e Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Tue, 18 Sep 2018 09:18:58 -0700 Subject: [PATCH 106/148] [ticket/15795] Fix broken migration, $config is not a method PHPBB3-15795 --- phpBB/phpbb/db/migration/data/v330/extensions_composer_2.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/db/migration/data/v330/extensions_composer_2.php b/phpBB/phpbb/db/migration/data/v330/extensions_composer_2.php index c6ea7f4c13..8199dc807e 100644 --- a/phpBB/phpbb/db/migration/data/v330/extensions_composer_2.php +++ b/phpBB/phpbb/db/migration/data/v330/extensions_composer_2.php @@ -17,7 +17,7 @@ class extensions_composer_2 extends \phpbb\db\migration\migration { public function update_data() { - $repositories = json_decode($this->config('exts_composer_repositories'), true); + $repositories = json_decode($this->config['exts_composer_repositories'], true); $repositories[] = 'https://satis.phpbb.com'; $repositories = array_unique($repositories); From 71ae82fbef90cfa009fa5f2835dbf0f19f8aa33e Mon Sep 17 00:00:00 2001 From: kasimi Date: Fri, 21 Sep 2018 17:50:55 +0200 Subject: [PATCH 107/148] [ticket/15799] Find correct poll for voting animation PHPBB3-15799 --- phpBB/styles/prosilver/template/ajax.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/styles/prosilver/template/ajax.js b/phpBB/styles/prosilver/template/ajax.js index 6903ad2261..5e66e5cda1 100644 --- a/phpBB/styles/prosilver/template/ajax.js +++ b/phpBB/styles/prosilver/template/ajax.js @@ -199,7 +199,7 @@ phpbb.addAjaxCallback('zebra', function(res) { */ phpbb.addAjaxCallback('vote_poll', function(res) { if (typeof res.success !== 'undefined') { - var poll = $('.topic_poll'); + var poll = $(this).closest('.topic_poll'); var panel = poll.find('.panel'); var resultsVisible = poll.find('dl:first-child .resultbar').is(':visible'); var mostVotes = 0; From f3a2c99a14fd9bf017a84377559a2ad4239c9e63 Mon Sep 17 00:00:00 2001 From: rubencm Date: Sat, 15 Sep 2018 09:13:01 +0000 Subject: [PATCH 108/148] [ticket/15772] Hide warning in acp when allow_install_dir is true PHPBB3-15772 --- phpBB/includes/acp/acp_main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php index 4ab2c409ab..ca3b885e11 100644 --- a/phpBB/includes/acp/acp_main.php +++ b/phpBB/includes/acp/acp_main.php @@ -639,7 +639,7 @@ class acp_main } // Warn if install is still present - if (file_exists($phpbb_root_path . 'install') && !is_file($phpbb_root_path . 'install')) + if (!defined('IN_INSTALL') && !$phpbb_container->getParameter('allow_install_dir') && file_exists($phpbb_root_path . 'install') && !is_file($phpbb_root_path . 'install')) { $template->assign_var('S_REMOVE_INSTALL', true); } From 1fd304b56450225d9741ce6392a53ac41f2c7add Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sat, 22 Sep 2018 11:59:32 +0200 Subject: [PATCH 109/148] [ticket/15772] Make sure to not run install extensions in ui test case PHPBB3-15772 --- tests/test_framework/phpbb_ui_test_case.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_framework/phpbb_ui_test_case.php b/tests/test_framework/phpbb_ui_test_case.php index a64e89d3b9..c17be6453b 100644 --- a/tests/test_framework/phpbb_ui_test_case.php +++ b/tests/test_framework/phpbb_ui_test_case.php @@ -210,6 +210,8 @@ class phpbb_ui_test_case extends phpbb_test_case $container->register('installer.install_finish.notify_user')->setSynthetic(true); $container->set('installer.install_finish.notify_user', new phpbb_mock_null_installer_task()); + $container->register('installer.install_finish.install_extensions')->setSynthetic(true); + $container->set('installer.install_finish.install_extensions', new phpbb_mock_null_installer_task()); $container->compile(); $language = $container->get('language'); From 9929ff1fefa9972bf98c837279b55aa3f6a8f315 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sat, 22 Sep 2018 22:20:30 +0200 Subject: [PATCH 110/148] [ticket/15772] Remove not needed check for IN_INSTALL PHPBB3-15772 --- phpBB/includes/acp/acp_main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php index ca3b885e11..6e44d931d2 100644 --- a/phpBB/includes/acp/acp_main.php +++ b/phpBB/includes/acp/acp_main.php @@ -639,7 +639,7 @@ class acp_main } // Warn if install is still present - if (!defined('IN_INSTALL') && !$phpbb_container->getParameter('allow_install_dir') && file_exists($phpbb_root_path . 'install') && !is_file($phpbb_root_path . 'install')) + if (!$phpbb_container->getParameter('allow_install_dir') && file_exists($phpbb_root_path . 'install') && !is_file($phpbb_root_path . 'install')) { $template->assign_var('S_REMOVE_INSTALL', true); } From 78732fd7c25513a30d460710a3a5919aef75bfdf Mon Sep 17 00:00:00 2001 From: kinerity Date: Sat, 22 Sep 2018 21:16:53 -0400 Subject: [PATCH 111/148] [ticket/15803] Add events on ucp_pm_compose for additional message list actions Event added for the handle_message_list_actions() function in ucp_pm_compose so that extensions can perform additional actions. PHPBB3-15803 --- phpBB/includes/ucp/ucp_pm_compose.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index f35812b90a..bb3eed5596 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -1437,6 +1437,21 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove $error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION']; } } + + /** + * Event for additional message list actions + * + * @event core.message_list_actions + * @var array address_list The assoc array with the recipient user/group ids + * @var array error The array containing error data + * @var object remove_u The variable for removing a user + * @var object remove_g The variable for removing a group + * @var object add_to The variable for adding a user to the [TO] field + * @var object add_bcc The variable for adding a user to the [BCC] field + * @since 3.1.7-RC1 + */ + $vars = array('address_list', 'error', 'remove_u', 'remove_g', 'add_to', 'add_bcc'); + extract($phpbb_dispatcher->trigger_event('core.message_list_actions', compact($vars))); } /** From 8ed759545e6f272ce7236b25e7cd34301455fdeb Mon Sep 17 00:00:00 2001 From: kinerity Date: Sat, 22 Sep 2018 21:30:55 -0400 Subject: [PATCH 112/148] [ticket/15803] Fix since version PHPBB3-15803 --- phpBB/includes/ucp/ucp_pm_compose.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index bb3eed5596..0dfe6e813c 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -1448,7 +1448,7 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove * @var object remove_g The variable for removing a group * @var object add_to The variable for adding a user to the [TO] field * @var object add_bcc The variable for adding a user to the [BCC] field - * @since 3.1.7-RC1 + * @since 3.2.4-RC1 */ $vars = array('address_list', 'error', 'remove_u', 'remove_g', 'add_to', 'add_bcc'); extract($phpbb_dispatcher->trigger_event('core.message_list_actions', compact($vars))); From eb867fc62311970118d9c340c16073dbc01805b0 Mon Sep 17 00:00:00 2001 From: kinerity Date: Sat, 22 Sep 2018 23:04:18 -0400 Subject: [PATCH 113/148] [ticket/15803] Global $phpbb_dispatcher PHPBB3-15803 --- phpBB/includes/ucp/ucp_pm_compose.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index 0dfe6e813c..eeb77c3973 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -1260,7 +1260,7 @@ function compose_pm($id, $mode, $action, $user_folders = array()) function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove_g, $add_to, $add_bcc) { global $auth, $db, $user; - global $request; + global $request, $phpbb_dispatcher; // Delete User [TO/BCC] if ($remove_u && $request->variable('remove_u', array(0 => ''))) From 3d2c1b8f9766bf914755904d685aba1a4665cc26 Mon Sep 17 00:00:00 2001 From: Oliver Schramm Date: Mon, 24 Sep 2018 02:54:50 +0200 Subject: [PATCH 114/148] [ticket/15544] Delete cache through module manager This might fix issues with migrations since the sql cache will be purged as well. In general, this puts all the logic in one place, so that's good. PHPBB3-15544 --- phpBB/phpbb/db/migration/tool/module.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/phpbb/db/migration/tool/module.php b/phpBB/phpbb/db/migration/tool/module.php index 3893935723..e5133c8152 100644 --- a/phpBB/phpbb/db/migration/tool/module.php +++ b/phpBB/phpbb/db/migration/tool/module.php @@ -341,7 +341,7 @@ class module implements \phpbb\db\migration\tool\tool_interface } // Clear the Modules Cache - $this->cache->destroy("_modules_$class"); + $this->module_manager->remove_cache_file($class); } /** @@ -425,7 +425,7 @@ class module implements \phpbb\db\migration\tool\tool_interface $this->module_manager->delete_module($module_id, $class); } - $this->cache->destroy("_modules_$class"); + $this->module_manager->remove_cache_file($class); } } From 1d0fdc446f4642584a58eb23d8510ec73caa475a Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Mon, 24 Sep 2018 16:09:28 +0200 Subject: [PATCH 115/148] [ticket/15805] Add result to core.login_box_redirect PHPBB3-15805 --- phpBB/includes/functions.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index cbea7afe6e..5caa144801 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -2350,10 +2350,12 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa * @event core.login_box_redirect * @var string redirect Redirect string * @var bool admin Is admin? + * @var array result Result from auth provider * @since 3.1.0-RC5 * @changed 3.1.9-RC1 Removed undefined return variable + * @changed 3.2.4-RC1 Added result */ - $vars = array('redirect', 'admin'); + $vars = array('redirect', 'admin', 'result'); extract($phpbb_dispatcher->trigger_event('core.login_box_redirect', compact($vars))); // append/replace SID (may change during the session for AOL users) From 62c9996b2f5848ba9cc7b3211e62d6001e13d061 Mon Sep 17 00:00:00 2001 From: Kailey Truscott Date: Tue, 25 Sep 2018 07:42:55 -0400 Subject: [PATCH 116/148] [ticket/15803] Change 'object' to 'bool' PHPBB3-15803 --- phpBB/includes/ucp/ucp_pm_compose.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index eeb77c3973..e168b643ef 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -1444,10 +1444,10 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove * @event core.message_list_actions * @var array address_list The assoc array with the recipient user/group ids * @var array error The array containing error data - * @var object remove_u The variable for removing a user - * @var object remove_g The variable for removing a group - * @var object add_to The variable for adding a user to the [TO] field - * @var object add_bcc The variable for adding a user to the [BCC] field + * @var bool remove_u The variable for removing a user + * @var bool remove_g The variable for removing a group + * @var bool add_to The variable for adding a user to the [TO] field + * @var bool add_bcc The variable for adding a user to the [BCC] field * @since 3.2.4-RC1 */ $vars = array('address_list', 'error', 'remove_u', 'remove_g', 'add_to', 'add_bcc'); From d8ecb00f3dd5f771e01546faa7b62259cca33570 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 14:25:51 +0200 Subject: [PATCH 117/148] [ticket/15771] Improve Q&A instructions PHPBB3-15771 --- phpBB/language/en/captcha_qa.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/language/en/captcha_qa.php b/phpBB/language/en/captcha_qa.php index 28011eb636..637c4e035e 100644 --- a/phpBB/language/en/captcha_qa.php +++ b/phpBB/language/en/captcha_qa.php @@ -49,7 +49,7 @@ $lang = array_merge($lang, array( 'ANSWER' => 'Answer', 'EDIT_QUESTION' => 'Edit Question', 'QUESTIONS' => 'Questions', - 'QUESTIONS_EXPLAIN' => 'For every form submission where you have enabled the Q&A plugin, users will be asked one of the questions specified here. To use this plugin at least one question must be set in the default language. These questions should be easy for your target audience to answer but beyond the ability of a bot capable of running a Google™ search. Using a large and regularly changed set of questions will yield the best results. Enable the strict setting if your question relies on mixed case, punctuation or whitespace.', + 'QUESTIONS_EXPLAIN' => 'For every form submission where you have enabled the Q&A plugin, users will be asked one of the questions specified here. To use this plugin at least one question must be set in the default language. These questions should be easy for your target audience to answer but beyond the ability of a bot capable of running a Google™ search. Only a single proper question is necessary. If you start receiving spam registrations, the question should be changed. Enable the strict setting if your question relies on mixed case, punctuation or whitespace.', 'QUESTION_DELETED' => 'Question deleted', 'QUESTION_LANG' => 'Language', 'QUESTION_LANG_EXPLAIN' => 'The language this question and its answers are written in.', From f251c26fe639a15f729e54c7c15cc5daff29b732 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 15:22:14 +0200 Subject: [PATCH 118/148] [ticket/15701] Display signature in MCP PHPBB3-15701 --- phpBB/includes/mcp/mcp_post.php | 5 +++++ phpBB/includes/mcp/mcp_reports.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/phpBB/includes/mcp/mcp_post.php b/phpBB/includes/mcp/mcp_post.php index d6d0369e48..8d278079fb 100644 --- a/phpBB/includes/mcp/mcp_post.php +++ b/phpBB/includes/mcp/mcp_post.php @@ -213,6 +213,10 @@ function mcp_post_details($id, $mode, $action) $l_deleted_by = ''; } + // parse signature + $parse_flags = ($post_info['user_sig_bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES; + $post_info['user_sig'] = generate_text_for_display($post_info['user_sig'], $post_info['user_sig_bbcode_uid'], $post_info['user_sig_bbcode_bitfield'], $parse_flags, true); + $mcp_post_template_data = array( 'U_MCP_ACTION' => "$url&i=main&quickmod=1&mode=post_details", // Use this for mode paramaters 'U_POST_ACTION' => "$url&i=$id&mode=post_details", // Use this for action parameters @@ -262,6 +266,7 @@ function mcp_post_details($id, $mode, $action) 'POST_IP' => $post_info['poster_ip'], 'POST_IPADDR' => ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '', 'POST_ID' => $post_info['post_id'], + 'SIGNATURE' => $post_info['user_sig'], 'U_LOOKUP_IP' => ($auth->acl_get('m_info', $post_info['forum_id'])) ? "$url&i=$id&mode=$mode&lookup={$post_info['poster_ip']}#ip" : '', 'U_WHOIS' => ($auth->acl_get('m_info', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&mode=$mode&action=whois&p=$post_id&ip={$post_info['poster_ip']}") : '', diff --git a/phpBB/includes/mcp/mcp_reports.php b/phpBB/includes/mcp/mcp_reports.php index f5147deb49..78f497c275 100644 --- a/phpBB/includes/mcp/mcp_reports.php +++ b/phpBB/includes/mcp/mcp_reports.php @@ -242,6 +242,10 @@ class mcp_reports } } + // parse signature + $parse_flags = ($post_info['user_sig_bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES; + $post_info['user_sig'] = generate_text_for_display($post_info['user_sig'], $post_info['user_sig_bbcode_uid'], $post_info['user_sig_bbcode_bitfield'], $parse_flags, true); + $template->assign_vars(array( 'S_MCP_REPORT' => true, 'S_CLOSE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&mode=report_details&f=' . $post_info['forum_id'] . '&p=' . $post_id), @@ -291,6 +295,7 @@ class mcp_reports 'POST_IP' => $post_info['poster_ip'], 'POST_IPADDR' => ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '', 'POST_ID' => $post_info['post_id'], + 'SIGNATURE' => $post_info['user_sig'], 'U_LOOKUP_IP' => ($auth->acl_get('m_info', $post_info['forum_id'])) ? $this->u_action . '&r=' . $report_id . '&p=' . $post_id . '&f=' . $forum_id . '&lookup=' . $post_info['poster_ip'] . '#ip' : '', )); From dab4c10c2fe0a2e283ecf5227ef9a253127a1381 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 15:24:34 +0200 Subject: [PATCH 119/148] [ticket/15700] Use correct T_THEME_LANG_NAME PHPBB3-15700 --- phpBB/includes/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 1457888c9f..3b0ac17806 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4506,7 +4506,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id = 'S_COOKIE_NOTICE' => !empty($config['cookie_notice']), 'T_THEME_NAME' => rawurlencode($user->style['style_path']), - 'T_THEME_LANG_NAME' => $user->data['user_lang'], + 'T_THEME_LANG_NAME' => $user->lang_name, 'T_TEMPLATE_NAME' => $user->style['style_path'], 'T_SUPER_TEMPLATE_NAME' => rawurlencode((isset($user->style['style_parent_tree']) && $user->style['style_parent_tree']) ? $user->style['style_parent_tree'] : $user->style['style_path']), 'T_IMAGES' => 'images', From b9a5810716e966b79b653e09e0e2afeaf2bf33e0 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 15:39:50 +0200 Subject: [PATCH 120/148] [ticket/15642] Replace > with > PHPBB3-15642 --- phpBB/language/en/acp/board.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php index 76982be098..eb53ac0370 100644 --- a/phpBB/language/en/acp/board.php +++ b/phpBB/language/en/acp/board.php @@ -371,7 +371,7 @@ $lang = array_merge($lang, array( 'ACP_CONTACT_SETTINGS_EXPLAIN' => 'Here you can enable and disable the contact page and also add a text that is displayed on the page.', 'CONTACT_US_ENABLE' => 'Enable contact page', - 'CONTACT_US_ENABLE_EXPLAIN' => 'This page allows users to send emails to board administrators. Please note that board-wide emails option must be enabled as well. You can find this option in General > Client Communication > Email settings.', + 'CONTACT_US_ENABLE_EXPLAIN' => 'This page allows users to send emails to board administrators. Please note that board-wide emails option must be enabled as well. You can find this option in General > Client Communication > Email settings.', 'CONTACT_US_INFO' => 'Contact information', 'CONTACT_US_INFO_EXPLAIN' => 'The message is displayed on the contact page', From 31d101e68cd7e9c52bb628594035f5dd13eea430 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 16:34:17 +0200 Subject: [PATCH 121/148] [ticket/15596] Migrate from data-vocabulary.org to schema.org PHPBB3-15596 --- phpBB/styles/prosilver/template/navbar_header.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/styles/prosilver/template/navbar_header.html b/phpBB/styles/prosilver/template/navbar_header.html index 2d33849cf0..2da14304c7 100644 --- a/phpBB/styles/prosilver/template/navbar_header.html +++ b/phpBB/styles/prosilver/template/navbar_header.html @@ -178,9 +178,9 @@
      @@ -49,7 +49,7 @@
    • - {bcc_recipient.NAME}{bcc_recipient.NAME_FULL} + {bcc_recipient.NAME}{bcc_recipient.NAME_FULL}
    diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html index 2ed0189c21..7cb44a0189 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html +++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html @@ -124,8 +124,8 @@

    {L_SENT_AT}{L_COLON} {SENT_DATE}
    {L_PM_FROM}{L_COLON} {MESSAGE_AUTHOR_FULL} -
    {L_TO}{L_COLON} {to_recipient.NAME_FULL}{to_recipient.NAME}  -
    {L_BCC}{L_COLON} {bcc_recipient.NAME_FULL}{bcc_recipient.NAME}  +
    {L_TO}{L_COLON} {to_recipient.NAME_FULL} style="color:{to_recipient.COLOUR};">{to_recipient.NAME}  +
    {L_BCC}{L_COLON} {bcc_recipient.NAME_FULL} style="color:{bcc_recipient.COLOUR};">{bcc_recipient.NAME} 

    From f82e0a83d1c6ec488f47013d583912f7082406d4 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 16:18:58 +0200 Subject: [PATCH 124/148] [ticket/15616] Add jumpbox to login_forum.html PHPBB3-15616 --- phpBB/includes/functions.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 1457888c9f..20d24819ec 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -2539,7 +2539,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa */ function login_forum_box($forum_data) { - global $db, $phpbb_container, $request, $template, $user, $phpbb_dispatcher; + global $db, $phpbb_container, $request, $template, $user, $phpbb_dispatcher, $phpbb_root_path, $phpEx; $password = $request->variable('password', '', true); @@ -2624,6 +2624,8 @@ function login_forum_box($forum_data) 'body' => 'login_forum.html') ); + make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_data['forum_id']); + page_footer(); } From d29d4389f9efdec4986c62052df7cd8a87135645 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 14:42:03 +0200 Subject: [PATCH 125/148] [ticket/15758] Show translated msg for INSECURE_REDIRECT PHPBB3-15758 --- phpBB/includes/functions.php | 10 +++++----- tests/security/redirect_test.php | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 1457888c9f..5351db31f6 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1744,14 +1744,14 @@ function redirect($url, $return = false, $disable_cd_check = false) if ($url_parts === false) { // Malformed url - trigger_error('INSECURE_REDIRECT', E_USER_ERROR); + trigger_error('INSECURE_REDIRECT', E_USER_WARNING); } else if (!empty($url_parts['scheme']) && !empty($url_parts['host'])) { // Attention: only able to redirect within the same domain if $disable_cd_check is false (yourdomain.com -> www.yourdomain.com will not work) if (!$disable_cd_check && $url_parts['host'] !== $user->host) { - trigger_error('INSECURE_REDIRECT', E_USER_ERROR); + trigger_error('INSECURE_REDIRECT', E_USER_WARNING); } } else if ($url[0] == '/') @@ -1791,13 +1791,13 @@ function redirect($url, $return = false, $disable_cd_check = false) if (!$disable_cd_check && strpos($url, generate_board_url(true) . '/') !== 0) { - trigger_error('INSECURE_REDIRECT', E_USER_ERROR); + trigger_error('INSECURE_REDIRECT', E_USER_WARNING); } // Make sure no linebreaks are there... to prevent http response splitting for PHP < 4.4.2 if (strpos(urldecode($url), "\n") !== false || strpos(urldecode($url), "\r") !== false || strpos($url, ';') !== false) { - trigger_error('INSECURE_REDIRECT', E_USER_ERROR); + trigger_error('INSECURE_REDIRECT', E_USER_WARNING); } // Now, also check the protocol and for a valid url the last time... @@ -1806,7 +1806,7 @@ function redirect($url, $return = false, $disable_cd_check = false) if ($url_parts === false || empty($url_parts['scheme']) || !in_array($url_parts['scheme'], $allowed_protocols)) { - trigger_error('INSECURE_REDIRECT', E_USER_ERROR); + trigger_error('INSECURE_REDIRECT', E_USER_WARNING); } /** diff --git a/tests/security/redirect_test.php b/tests/security/redirect_test.php index 40cb7d2f04..0177eb4259 100644 --- a/tests/security/redirect_test.php +++ b/tests/security/redirect_test.php @@ -109,7 +109,7 @@ class phpbb_security_redirect_test extends phpbb_security_test_base if ($expected_error !== false) { - $this->setExpectedTriggerError(E_USER_ERROR, $user->lang[$expected_error]); + $this->setExpectedTriggerError(E_USER_WARNING, $user->lang[$expected_error]); } $result = redirect($test, true, $disable_cd_check); From f3f1bfcbe8853093c4b557dae25b4a8fad12b97d Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Fri, 28 Sep 2018 12:23:59 +0200 Subject: [PATCH 126/148] [ticket/15809] Allow twig syntax for template events PHPBB3-15809 --- phpBB/phpbb/event/md_exporter.php | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/phpBB/phpbb/event/md_exporter.php b/phpBB/phpbb/event/md_exporter.php index bec91d04f4..085b20c234 100644 --- a/phpBB/phpbb/event/md_exporter.php +++ b/phpBB/phpbb/event/md_exporter.php @@ -439,16 +439,9 @@ class md_exporter $event_list = array(); $file_content = file_get_contents($this->path . $file); - $events = explode('', $event, 2); - $event_list[] = array_shift($event); - } + preg_match_all('/(?:{%|)/U', $file_content, $event_list); - return $event_list; + return $event_list[1]; } /** From eb4a95f659cdb2dfa5ae00643688d46c6fc30b89 Mon Sep 17 00:00:00 2001 From: Alec Date: Mon, 1 Oct 2018 00:42:55 -0400 Subject: [PATCH 127/148] [ticket/15819] Add core event to functions_posting to modify notifications Events added to allow modifying notification data before in the database. Useful to change variables in the notification message, such as usernames. Includes some other residual data to allow this event to be versatile. PHPBB3-15819 --- phpBB/includes/functions_posting.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index 78c66ac6b8..e28a637286 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -2282,6 +2282,19 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data 'post_subject' => $subject, )); + /** + * This event allows you to modify the notification data upon submission + * + * @event core.modify_submit_notification_data + * @var array notification_data The notification data to be inserted in to the database + * @var array data_ary The data array with a lot of the post submission data + * @var string mode The posting mode + * @var int poster_id The poster id + * @since 3.2.4-RC1 + */ + $vars = array('notification_data', 'data_ary', 'mode', 'poster_id'); + extract($phpbb_dispatcher->trigger_event('core.modify_submit_notification_data', compact($vars))); + /* @var $phpbb_notifications \phpbb\notification\manager */ $phpbb_notifications = $phpbb_container->get('notification_manager'); From d070f20a42ac201ce40661deac7d0721f801b91c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Calvo?= Date: Mon, 1 Oct 2018 15:16:42 +0200 Subject: [PATCH 128/148] [ticket/15244] Remove unglobalise related code PHPBB3-15244 --- phpBB/language/en/posting.php | 1 - phpBB/posting.php | 2 +- .../prosilver/template/posting_layout.html | 21 ------------------- 3 files changed, 1 insertion(+), 23 deletions(-) diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php index 7c415b3457..6c0e3f6916 100644 --- a/phpBB/language/en/posting.php +++ b/phpBB/language/en/posting.php @@ -264,7 +264,6 @@ $lang = array_merge($lang, array( 'TOPIC_BUMPED' => 'Topic has been bumped successfully.', 'UNAUTHORISED_BBCODE' => 'You cannot use certain BBCodes: %s.', - 'UNGLOBALISE_EXPLAIN' => 'To switch this topic back from being global to a normal topic, you need to select the forum you wish this topic to be displayed.', 'UNSUPPORTED_CHARACTERS_MESSAGE' => 'Your message contains the following unsupported characters:
    %s', 'UNSUPPORTED_CHARACTERS_SUBJECT' => 'Your subject contains the following unsupported characters:
    %s', 'UPDATE_COMMENT' => 'Update comment', diff --git a/phpBB/posting.php b/phpBB/posting.php index d97a22209f..4a4e20d305 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -40,7 +40,7 @@ $load = (isset($_POST['load'])) ? true : false; $confirm = $request->is_set_post('confirm'); $cancel = (isset($_POST['cancel']) && !isset($_POST['save'])) ? true : false; -$refresh = (isset($_POST['add_file']) || isset($_POST['delete_file']) || isset($_POST['cancel_unglobalise']) || $save || $load || $preview); +$refresh = (isset($_POST['add_file']) || isset($_POST['delete_file']) || $save || $load || $preview); $submit = $request->is_set_post('post') && !$refresh && !$preview; $mode = $request->variable('mode', ''); diff --git a/phpBB/styles/prosilver/template/posting_layout.html b/phpBB/styles/prosilver/template/posting_layout.html index 985f92b23d..7c9deb5369 100644 --- a/phpBB/styles/prosilver/template/posting_layout.html +++ b/phpBB/styles/prosilver/template/posting_layout.html @@ -38,27 +38,6 @@ - -
    -
    -
    -

    {L_SELECT_DESTINATION_FORUM}

    -

    {L_UNGLOBALISE_EXPLAIN}

    -
    -
    -
    -
    - -
    -
     
    -
    -
    -
    - -
    -
    - -
    From 0bb87b2de1ce127e5766f8c5a34ae9135ac58913 Mon Sep 17 00:00:00 2001 From: Oliver Schramm Date: Mon, 1 Oct 2018 17:07:28 +0200 Subject: [PATCH 129/148] [ticket/12430] Remove hilit param from topic title link PHPBB3-12430 --- phpBB/viewtopic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 79852330d9..dfec925a67 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -780,7 +780,7 @@ $template->assign_vars(array( 'U_TOPIC' => "{$server_path}viewtopic.$phpEx?f=$forum_id&t=$topic_id", 'U_FORUM' => $server_path, - 'U_VIEW_TOPIC' => $viewtopic_url, + 'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start") . (strlen($u_sort_param) ? "&$u_sort_param" : '')), 'U_CANONICAL' => generate_board_url() . '/' . append_sid("viewtopic.$phpEx", "t=$topic_id" . (($start) ? "&start=$start" : ''), true, ''), 'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id), 'U_VIEW_OLDER_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=previous"), From 4a2b12a0c8d7fc3761dde815ca3cfd5685c6a8c6 Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Mon, 1 Oct 2018 13:56:37 -0700 Subject: [PATCH 130/148] [ticket/15824] Fix cache initialization in UI framework PHPBB3-15824 --- tests/test_framework/phpbb_ui_test_case.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_framework/phpbb_ui_test_case.php b/tests/test_framework/phpbb_ui_test_case.php index d38d14f45c..72d15ae0b0 100644 --- a/tests/test_framework/phpbb_ui_test_case.php +++ b/tests/test_framework/phpbb_ui_test_case.php @@ -338,6 +338,12 @@ class phpbb_ui_test_case extends phpbb_test_case { if (!$this->cache) { + global $phpbb_container, $phpbb_root_path; + + $phpbb_container = new phpbb_mock_container_builder(); + $phpbb_container->setParameter('core.environment', PHPBB_ENVIRONMENT); + $phpbb_container->setParameter('core.cache_dir', $phpbb_root_path . 'cache/' . PHPBB_ENVIRONMENT . '/'); + $this->cache = new \phpbb\cache\driver\file; } From b487a3d9efbefc97aa7562ffbd4fa23577d7a8e8 Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Mon, 1 Oct 2018 17:29:13 -0700 Subject: [PATCH 131/148] [ticket/15824] Make UI test framework correctly install exts PHPBB3-15824 --- tests/test_framework/phpbb_ui_test_case.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_framework/phpbb_ui_test_case.php b/tests/test_framework/phpbb_ui_test_case.php index 72d15ae0b0..d16ac78c4b 100644 --- a/tests/test_framework/phpbb_ui_test_case.php +++ b/tests/test_framework/phpbb_ui_test_case.php @@ -192,6 +192,13 @@ class phpbb_ui_test_case extends phpbb_test_case } } + $install_config_file = $phpbb_root_path . 'store/install_config.php'; + + if (file_exists($install_config_file)) + { + unlink($install_config_file); + } + $container_builder = new \phpbb\di\container_builder($phpbb_root_path, $phpEx); $container = $container_builder ->with_environment('installer') @@ -205,11 +212,14 @@ class phpbb_ui_test_case extends phpbb_test_case ], 'cache.driver.class' => 'phpbb\cache\driver\file' ]) + ->with_config(new \phpbb\config_php_file($phpbb_root_path, $phpEx)) ->without_compiled_container() ->get_container(); $container->register('installer.install_finish.notify_user')->setSynthetic(true); $container->set('installer.install_finish.notify_user', new phpbb_mock_null_installer_task()); + $container->register('installer.install_finish.install_extensions')->setSynthetic(true); + $container->set('installer.install_finish.install_extensions', new phpbb_mock_null_installer_task()); $container->compile(); $language = $container->get('language'); From 842e40dab91302772e0e2916043429de884bc226 Mon Sep 17 00:00:00 2001 From: Oliver Schramm Date: Thu, 4 Oct 2018 01:56:52 +0200 Subject: [PATCH 132/148] [ticket/14812] Prune shadow topics during system cron too PHPBB3-14812 --- .../phpbb/cron/task/core/prune_all_forums.php | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/phpBB/phpbb/cron/task/core/prune_all_forums.php b/phpBB/phpbb/cron/task/core/prune_all_forums.php index b47939ccbe..5005f5b894 100644 --- a/phpBB/phpbb/cron/task/core/prune_all_forums.php +++ b/phpBB/phpbb/cron/task/core/prune_all_forums.php @@ -55,21 +55,26 @@ class prune_all_forums extends \phpbb\cron\task\base include($this->phpbb_root_path . 'includes/functions_admin.' . $this->php_ext); } - $sql = 'SELECT forum_id, prune_next, enable_prune, prune_days, prune_viewed, forum_flags, prune_freq - FROM ' . FORUMS_TABLE . " - WHERE enable_prune = 1 - AND prune_next < " . time(); + $sql = 'SELECT forum_id, prune_next, enable_prune, prune_days, prune_viewed, enable_shadow_prune, prune_shadow_days, prune_shadow_freq, prune_shadow_next, forum_flags, prune_freq + FROM ' . FORUMS_TABLE; $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { - if ($row['prune_days']) + if ($row['enable_prune'] && $row['prune_next'] < time()) { - auto_prune($row['forum_id'], 'posted', $row['forum_flags'], $row['prune_days'], $row['prune_freq']); - } + if ($row['prune_days']) + { + auto_prune($row['forum_id'], 'posted', $row['forum_flags'], $row['prune_days'], $row['prune_freq']); + } - if ($row['prune_viewed']) + if ($row['prune_viewed']) + { + auto_prune($row['forum_id'], 'viewed', $row['forum_flags'], $row['prune_viewed'], $row['prune_freq']); + } + } + if ($row['enable_shadow_prune'] && $row['prune_shadow_next'] < time() && $row['prune_shadow_days']) { - auto_prune($row['forum_id'], 'viewed', $row['forum_flags'], $row['prune_viewed'], $row['prune_freq']); + auto_prune($row['forum_id'], 'shadow', $row['forum_flags'], $row['prune_shadow_days'], $row['prune_shadow_freq']); } } $this->db->sql_freeresult($result); From 253b42372f05f38c57da95fa174eed92d7ff863a Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Wed, 3 Oct 2018 18:50:30 -0700 Subject: [PATCH 133/148] [ticket/15824] Add UI test method to wait for AJAX requests PHPBB3-15824 --- tests/test_framework/phpbb_ui_test_case.php | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/test_framework/phpbb_ui_test_case.php b/tests/test_framework/phpbb_ui_test_case.php index d16ac78c4b..15a1cd375e 100644 --- a/tests/test_framework/phpbb_ui_test_case.php +++ b/tests/test_framework/phpbb_ui_test_case.php @@ -606,4 +606,37 @@ class phpbb_ui_test_case extends phpbb_test_case $this->getDriver()->takeScreenshot($screenshot); } + + /** + * Wait for AJAX. Should be called after an AJAX action is made. + * + * @param string $framework javascript frameworks jquery|prototype|dojo + * @throws \Facebook\WebDriver\Exception\NoSuchElementException + * @throws \Facebook\WebDriver\Exception\TimeOutException + */ + public function waitForAjax($framework = 'jquery') + { + switch ($framework) + { + case 'jquery': + $code = 'return jQuery.active;'; + break; + case 'prototype': + $code = 'return Ajax.activeRequestCount;'; + break; + case 'dojo': + $code = 'return dojo.io.XMLHTTPTransport.inFlight.length;'; + break; + default: + throw new \RuntimeException('Unsupported framework'); + break; + } + // wait for at most 30s, retry every 2000ms (2s) + $driver = $this->getDriver(); + $driver->wait(30, 2000)->until( + function () use ($driver, $code) { + return !$driver->executeScript($code); + } + ); + } } From c9df803d3c99ddc513cff85ac7083d25b86e890f Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Mon, 8 Oct 2018 16:00:06 +0200 Subject: [PATCH 134/148] [ticket/15494] Allow user to be removed from NEWLY_REGISTERED multiple times PHPBB3-15494 --- phpBB/includes/functions_user.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index f7be2d2760..50cb140d9b 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -3604,11 +3604,6 @@ function remove_newly_registered($user_id, $user_data = false) } } - if (empty($user_data['user_new'])) - { - return false; - } - $sql = 'SELECT group_id FROM ' . GROUPS_TABLE . " WHERE group_name = 'NEWLY_REGISTERED' From 582c1f35626383592aef9aef413c911d4803475d Mon Sep 17 00:00:00 2001 From: rubencm Date: Mon, 8 Oct 2018 21:44:27 +0000 Subject: [PATCH 135/148] [ticket/15762] Update migration dependency PHPBB3-15762 --- .../phpbb/db/migration/data/v32x/forum_topics_per_page_type.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php b/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php index b9b88bac29..afcecf2ef0 100644 --- a/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php +++ b/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php @@ -19,7 +19,7 @@ class forum_topics_per_page_type extends \phpbb\db\migration\migration static public function depends_on() { return array( - '\phpbb\db\migration\data\v32x\v323rc2', + '\phpbb\db\migration\data\v32x\v323', ); } From 4a3c00d1c84284c030e7a7a37efc3ada57228726 Mon Sep 17 00:00:00 2001 From: Serge Skripchuk Date: Fri, 23 Mar 2018 19:20:54 +0200 Subject: [PATCH 136/148] [ticket/15600] Escaped ban reasons in JavaScript code of mcp_warn.html PHPBB3-15600 --- phpBB/styles/prosilver/template/mcp_ban.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/styles/prosilver/template/mcp_ban.html b/phpBB/styles/prosilver/template/mcp_ban.html index 5b798d9b6c..9475b6aa49 100644 --- a/phpBB/styles/prosilver/template/mcp_ban.html +++ b/phpBB/styles/prosilver/template/mcp_ban.html @@ -13,10 +13,10 @@ ban_length['{bans.BAN_ID}'] = '{bans.A_LENGTH}'; - ban_reason['{bans.BAN_ID}'] = '{bans.A_REASON}'; + ban_reason['{bans.BAN_ID}'] = '{{ bans.A_REASON | e('js') }}'; - ban_give_reason['{bans.BAN_ID}'] = '{bans.A_GIVE_REASON}'; + ban_give_reason['{bans.BAN_ID}'] = '{{ bans.A_GIVE_REASON | e('js') }}'; From f4b2849aa27fcf5dbd3b22b1daea69d04e28b23d Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Wed, 10 Oct 2018 21:28:10 +0200 Subject: [PATCH 137/148] [ticket/15557] Update composer.phar to 1.7.2 PHPBB3-15557 --- composer.phar | Bin 1585196 -> 1875611 bytes phpBB/composer.lock | 135 ++++++++++++++++++++++---------------------- 2 files changed, 67 insertions(+), 68 deletions(-) diff --git a/composer.phar b/composer.phar index fca2a8d72dd02c9e5025a760b940b5fd46e06d93..96fa2df7bdbe24e62d2435a043fd8d5e6228d4a4 100755 GIT binary patch delta 349335 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 z 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 diff --git a/phpBB/composer.lock b/phpBB/composer.lock index c83ff7aa51..786f2610b2 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -1,10 +1,9 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "hash": "620519ab8cf439078c08f8a4fb49efb8", "content-hash": "c843abc1344cd9df37f63c08a125cad0", "packages": [ { @@ -35,7 +34,7 @@ "MIT" ], "description": "Convenience wrapper around ini_get()", - "time": "2014-09-15 13:12:35" + "time": "2014-09-15T13:12:35+00:00" }, { "name": "google/recaptcha", @@ -80,7 +79,7 @@ "recaptcha", "spam" ], - "time": "2015-09-02 17:23:59" + "time": "2015-09-02T17:23:59+00:00" }, { "name": "guzzlehttp/guzzle", @@ -133,7 +132,7 @@ "rest", "web service" ], - "time": "2018-07-31 13:33:10" + "time": "2018-07-31T13:33:10+00:00" }, { "name": "guzzlehttp/ringphp", @@ -184,7 +183,7 @@ } ], "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.", - "time": "2018-07-31 13:22:33" + "time": "2018-07-31T13:22:33+00:00" }, { "name": "guzzlehttp/streams", @@ -234,7 +233,7 @@ "Guzzle", "stream" ], - "time": "2014-10-12 19:18:40" + "time": "2014-10-12T19:18:40+00:00" }, { "name": "ircmaxell/password-compat", @@ -276,7 +275,7 @@ "hashing", "password" ], - "time": "2014-11-20 16:49:30" + "time": "2014-11-20T16:49:30+00:00" }, { "name": "lusitanian/oauth", @@ -343,7 +342,7 @@ "oauth", "security" ], - "time": "2016-07-12 22:15:00" + "time": "2016-07-12T22:15:00+00:00" }, { "name": "marc1706/fast-image-size", @@ -395,7 +394,7 @@ "php", "size" ], - "time": "2017-10-23 18:52:01" + "time": "2017-10-23T18:52:01+00:00" }, { "name": "ocramius/proxy-manager", @@ -458,7 +457,7 @@ "proxy pattern", "service proxies" ], - "time": "2015-08-09 04:28:19" + "time": "2015-08-09T04:28:19+00:00" }, { "name": "paragonie/random_compat", @@ -506,7 +505,7 @@ "pseudorandom", "random" ], - "time": "2017-03-13 16:22:52" + "time": "2017-03-13T16:22:52+00:00" }, { "name": "patchwork/utf8", @@ -565,7 +564,7 @@ "utf-8", "utf8" ], - "time": "2016-05-18 13:57:10" + "time": "2016-05-18T13:57:10+00:00" }, { "name": "psr/log", @@ -612,7 +611,7 @@ "psr", "psr-3" ], - "time": "2016-10-10 12:19:37" + "time": "2016-10-10T12:19:37+00:00" }, { "name": "react/promise", @@ -658,7 +657,7 @@ "promise", "promises" ], - "time": "2018-06-13 15:59:06" + "time": "2018-06-13T15:59:06+00:00" }, { "name": "s9e/text-formatter", @@ -723,7 +722,7 @@ "parser", "shortcodes" ], - "time": "2017-12-10 00:55:53" + "time": "2017-12-10T00:55:53+00:00" }, { "name": "symfony/config", @@ -780,7 +779,7 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-07-26 11:13:39" + "time": "2018-07-26T11:13:39+00:00" }, { "name": "symfony/console", @@ -841,7 +840,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-07-26 11:13:39" + "time": "2018-07-26T11:13:39+00:00" }, { "name": "symfony/debug", @@ -898,7 +897,7 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-08-03 09:45:57" + "time": "2018-08-03T09:45:57+00:00" }, { "name": "symfony/dependency-injection", @@ -961,7 +960,7 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2018-07-26 11:13:39" + "time": "2018-07-26T11:13:39+00:00" }, { "name": "symfony/event-dispatcher", @@ -1021,7 +1020,7 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-07-26 09:03:18" + "time": "2018-07-26T09:03:18+00:00" }, { "name": "symfony/filesystem", @@ -1071,7 +1070,7 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-08-07 09:12:42" + "time": "2018-08-07T09:12:42+00:00" }, { "name": "symfony/finder", @@ -1120,7 +1119,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-07-26 11:13:39" + "time": "2018-07-26T11:13:39+00:00" }, { "name": "symfony/http-foundation", @@ -1175,7 +1174,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-08-27 15:52:41" + "time": "2018-08-27T15:52:41+00:00" }, { "name": "symfony/http-kernel", @@ -1259,7 +1258,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-08-27 17:33:38" + "time": "2018-08-27T17:33:38+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1317,7 +1316,7 @@ "polyfill", "portable" ], - "time": "2018-08-06 14:22:27" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -1376,7 +1375,7 @@ "portable", "shim" ], - "time": "2018-08-06 14:22:27" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/polyfill-php54", @@ -1434,7 +1433,7 @@ "portable", "shim" ], - "time": "2018-08-06 14:22:27" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/polyfill-php55", @@ -1490,7 +1489,7 @@ "portable", "shim" ], - "time": "2018-08-06 14:22:27" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/proxy-manager-bridge", @@ -1544,7 +1543,7 @@ ], "description": "Symfony ProxyManager Bridge", "homepage": "https://symfony.com", - "time": "2018-07-26 09:03:18" + "time": "2018-07-26T09:03:18+00:00" }, { "name": "symfony/routing", @@ -1618,7 +1617,7 @@ "uri", "url" ], - "time": "2018-07-26 11:13:39" + "time": "2018-07-26T11:13:39+00:00" }, { "name": "symfony/twig-bridge", @@ -1703,7 +1702,7 @@ ], "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "time": "2018-07-26 11:13:39" + "time": "2018-07-26T11:13:39+00:00" }, { "name": "symfony/yaml", @@ -1753,7 +1752,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-07-26 09:03:18" + "time": "2018-07-26T09:03:18+00:00" }, { "name": "twig/twig", @@ -1819,7 +1818,7 @@ "keywords": [ "templating" ], - "time": "2018-07-13 07:12:17" + "time": "2018-07-13T07:12:17+00:00" }, { "name": "zendframework/zend-code", @@ -1872,7 +1871,7 @@ "code", "zf2" ], - "time": "2015-06-03 15:31:59" + "time": "2015-06-03T15:31:59+00:00" }, { "name": "zendframework/zend-eventmanager", @@ -1917,7 +1916,7 @@ "eventmanager", "zf2" ], - "time": "2015-06-03 15:32:01" + "time": "2015-06-03T15:32:01+00:00" }, { "name": "zendframework/zend-stdlib", @@ -1973,7 +1972,7 @@ "stdlib", "zf2" ], - "time": "2015-06-03 15:32:03" + "time": "2015-06-03T15:32:03+00:00" } ], "packages-dev": [ @@ -2029,7 +2028,7 @@ "constructor", "instantiate" ], - "time": "2015-06-14 21:17:01" + "time": "2015-06-14T21:17:01+00:00" }, { "name": "fabpot/goutte", @@ -2078,7 +2077,7 @@ "keywords": [ "scraper" ], - "time": "2015-05-05 21:14:57" + "time": "2015-05-05T21:14:57+00:00" }, { "name": "facebook/webdriver", @@ -2124,7 +2123,7 @@ "selenium", "webdriver" ], - "time": "2016-08-10 00:44:08" + "time": "2016-08-10T00:44:08+00:00" }, { "name": "laravel/homestead", @@ -2165,7 +2164,7 @@ } ], "description": "A virtual machine for web artisans.", - "time": "2016-09-17 04:42:33" + "time": "2016-09-17T04:42:33+00:00" }, { "name": "michelf/php-markdown", @@ -2211,7 +2210,7 @@ "keywords": [ "markdown" ], - "time": "2018-01-15 00:49:33" + "time": "2018-01-15T00:49:33+00:00" }, { "name": "nikic/php-parser", @@ -2256,7 +2255,7 @@ "parser", "php" ], - "time": "2014-07-23 18:24:17" + "time": "2014-07-23T18:24:17+00:00" }, { "name": "phing/phing", @@ -2308,7 +2307,7 @@ "task", "tool" ], - "time": "2012-11-29 21:23:47" + "time": "2012-11-29T21:23:47+00:00" }, { "name": "phpdocumentor/reflection-docblock", @@ -2357,7 +2356,7 @@ "email": "mike.vanriel@naenius.com" } ], - "time": "2016-01-25 08:17:30" + "time": "2016-01-25T08:17:30+00:00" }, { "name": "phpspec/prophecy", @@ -2420,7 +2419,7 @@ "spy", "stub" ], - "time": "2018-08-05 17:53:17" + "time": "2018-08-05T17:53:17+00:00" }, { "name": "phpunit/dbunit", @@ -2479,7 +2478,7 @@ "testing", "xunit" ], - "time": "2015-03-29 14:23:04" + "time": "2015-03-29T14:23:04+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2541,7 +2540,7 @@ "testing", "xunit" ], - "time": "2015-10-06 15:47:00" + "time": "2015-10-06T15:47:00+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2588,7 +2587,7 @@ "filesystem", "iterator" ], - "time": "2017-11-27 13:52:08" + "time": "2017-11-27T13:52:08+00:00" }, { "name": "phpunit/php-text-template", @@ -2629,7 +2628,7 @@ "keywords": [ "template" ], - "time": "2015-06-21 13:50:34" + "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", @@ -2678,7 +2677,7 @@ "keywords": [ "timer" ], - "time": "2017-02-26 11:10:40" + "time": "2017-02-26T11:10:40+00:00" }, { "name": "phpunit/php-token-stream", @@ -2727,7 +2726,7 @@ "keywords": [ "tokenizer" ], - "time": "2017-12-04 08:55:13" + "time": "2017-12-04T08:55:13+00:00" }, { "name": "phpunit/phpunit", @@ -2799,7 +2798,7 @@ "testing", "xunit" ], - "time": "2017-06-21 08:07:12" + "time": "2017-06-21T08:07:12+00:00" }, { "name": "phpunit/phpunit-mock-objects", @@ -2855,7 +2854,7 @@ "mock", "xunit" ], - "time": "2015-10-02 06:51:40" + "time": "2015-10-02T06:51:40+00:00" }, { "name": "pimple/pimple", @@ -2903,7 +2902,7 @@ "container", "dependency injection" ], - "time": "2013-03-08 08:21:40" + "time": "2013-03-08T08:21:40+00:00" }, { "name": "sami/sami", @@ -2960,7 +2959,7 @@ "keywords": [ "phpdoc" ], - "time": "2015-06-05 03:36:34" + "time": "2015-06-05T03:36:34+00:00" }, { "name": "sebastian/comparator", @@ -3024,7 +3023,7 @@ "compare", "equality" ], - "time": "2017-01-29 09:50:25" + "time": "2017-01-29T09:50:25+00:00" }, { "name": "sebastian/diff", @@ -3076,7 +3075,7 @@ "keywords": [ "diff" ], - "time": "2017-05-22 07:24:03" + "time": "2017-05-22T07:24:03+00:00" }, { "name": "sebastian/environment", @@ -3126,7 +3125,7 @@ "environment", "hhvm" ], - "time": "2016-08-18 05:49:44" + "time": "2016-08-18T05:49:44+00:00" }, { "name": "sebastian/exporter", @@ -3193,7 +3192,7 @@ "export", "exporter" ], - "time": "2016-06-17 09:04:28" + "time": "2016-06-17T09:04:28+00:00" }, { "name": "sebastian/global-state", @@ -3244,7 +3243,7 @@ "keywords": [ "global state" ], - "time": "2015-10-12 03:26:01" + "time": "2015-10-12T03:26:01+00:00" }, { "name": "sebastian/recursion-context", @@ -3297,7 +3296,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-10-03 07:41:43" + "time": "2016-10-03T07:41:43+00:00" }, { "name": "sebastian/version", @@ -3332,7 +3331,7 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" + "time": "2015-06-21T13:59:46+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -3410,7 +3409,7 @@ "phpcs", "standards" ], - "time": "2017-05-22 02:43:20" + "time": "2017-05-22T02:43:20+00:00" }, { "name": "symfony/browser-kit", @@ -3467,7 +3466,7 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2018-07-26 09:03:18" + "time": "2018-07-26T09:03:18+00:00" }, { "name": "symfony/css-selector", @@ -3520,7 +3519,7 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-07-26 09:03:18" + "time": "2018-07-26T09:03:18+00:00" }, { "name": "symfony/dom-crawler", @@ -3577,7 +3576,7 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2018-07-24 10:05:38" + "time": "2018-07-24T10:05:38+00:00" }, { "name": "symfony/process", @@ -3626,7 +3625,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-08-03 09:45:57" + "time": "2018-08-03T09:45:57+00:00" } ], "aliases": [], From 97a24948e0b167b081c4a21c709c339891de4a41 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Wed, 10 Oct 2018 21:42:15 +0200 Subject: [PATCH 138/148] [ticket/15557] Update symfony to 2.8.46 PHPBB3-15557 --- phpBB/composer.lock | 147 ++++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 73 deletions(-) diff --git a/phpBB/composer.lock b/phpBB/composer.lock index 786f2610b2..d235568697 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -726,16 +726,16 @@ }, { "name": "symfony/config", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "06c0be4cdd8363f3ec8d592c9a4d1b981d5052af" + "reference": "fb3469266daaa67a1e6d42fc78fa6cdc254689f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/06c0be4cdd8363f3ec8d592c9a4d1b981d5052af", - "reference": "06c0be4cdd8363f3ec8d592c9a4d1b981d5052af", + "url": "https://api.github.com/repos/symfony/config/zipball/fb3469266daaa67a1e6d42fc78fa6cdc254689f6", + "reference": "fb3469266daaa67a1e6d42fc78fa6cdc254689f6", "shasum": "" }, "require": { @@ -779,20 +779,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:13:39+00:00" + "time": "2018-09-08T12:44:02+00:00" }, { "name": "symfony/console", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0c1fcbb9afb5cff992c982ff99c0434f0146dcfc" + "reference": "aca0dcc0c75496e17e2aa0303bb9c8e6d79ed789" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0c1fcbb9afb5cff992c982ff99c0434f0146dcfc", - "reference": "0c1fcbb9afb5cff992c982ff99c0434f0146dcfc", + "url": "https://api.github.com/repos/symfony/console/zipball/aca0dcc0c75496e17e2aa0303bb9c8e6d79ed789", + "reference": "aca0dcc0c75496e17e2aa0303bb9c8e6d79ed789", "shasum": "" }, "require": { @@ -840,20 +840,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:13:39+00:00" + "time": "2018-09-30T03:33:07+00:00" }, { "name": "symfony/debug", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "cbb8a5f212148964efbc414838c527229f9951b7" + "reference": "4fd77efcd4a499bf76d4ff46d092c67f3fe9e347" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/cbb8a5f212148964efbc414838c527229f9951b7", - "reference": "cbb8a5f212148964efbc414838c527229f9951b7", + "url": "https://api.github.com/repos/symfony/debug/zipball/4fd77efcd4a499bf76d4ff46d092c67f3fe9e347", + "reference": "4fd77efcd4a499bf76d4ff46d092c67f3fe9e347", "shasum": "" }, "require": { @@ -897,20 +897,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-08-03T09:45:57+00:00" + "time": "2018-09-21T12:46:38+00:00" }, { "name": "symfony/dependency-injection", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "ad2446d39d11c3daaa7f147d957941a187e47357" + "reference": "84219396d1a79d149a5a9d5f71afaf48dcfde7d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/ad2446d39d11c3daaa7f147d957941a187e47357", - "reference": "ad2446d39d11c3daaa7f147d957941a187e47357", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/84219396d1a79d149a5a9d5f71afaf48dcfde7d0", + "reference": "84219396d1a79d149a5a9d5f71afaf48dcfde7d0", "shasum": "" }, "require": { @@ -960,11 +960,11 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:13:39+00:00" + "time": "2018-09-08T12:44:02+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", @@ -1024,16 +1024,16 @@ }, { "name": "symfony/filesystem", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "0b252f4e25b7da17abb5a98eb60755b71d082c9c" + "reference": "91f194c5ec8d2ad5ce417a218ce3c46909e92f4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/0b252f4e25b7da17abb5a98eb60755b71d082c9c", - "reference": "0b252f4e25b7da17abb5a98eb60755b71d082c9c", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/91f194c5ec8d2ad5ce417a218ce3c46909e92f4d", + "reference": "91f194c5ec8d2ad5ce417a218ce3c46909e92f4d", "shasum": "" }, "require": { @@ -1070,20 +1070,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-08-07T09:12:42+00:00" + "time": "2018-09-24T08:04:37+00:00" }, { "name": "symfony/finder", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "f0de0b51913eb2caab7dfed6413b87e14fca780e" + "reference": "5ebb438d1aabe9dba93099dd06e0500f97817a6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/f0de0b51913eb2caab7dfed6413b87e14fca780e", - "reference": "f0de0b51913eb2caab7dfed6413b87e14fca780e", + "url": "https://api.github.com/repos/symfony/finder/zipball/5ebb438d1aabe9dba93099dd06e0500f97817a6e", + "reference": "5ebb438d1aabe9dba93099dd06e0500f97817a6e", "shasum": "" }, "require": { @@ -1119,20 +1119,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:13:39+00:00" + "time": "2018-09-21T12:46:38+00:00" }, { "name": "symfony/http-foundation", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "dc02e684171d0696edb6d4266e9d93af5e3f44d3" + "reference": "9fcce5f0b6896a135d192cc9fd5394fd46f74eff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/dc02e684171d0696edb6d4266e9d93af5e3f44d3", - "reference": "dc02e684171d0696edb6d4266e9d93af5e3f44d3", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9fcce5f0b6896a135d192cc9fd5394fd46f74eff", + "reference": "9fcce5f0b6896a135d192cc9fd5394fd46f74eff", "shasum": "" }, "require": { @@ -1174,20 +1174,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-08-27T15:52:41+00:00" + "time": "2018-09-23T15:27:53+00:00" }, { "name": "symfony/http-kernel", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "5424d38f10dc62752e655740224681a478d9f5bb" + "reference": "90411d2ad577b883f2fc9de06c86dd564d9ac676" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5424d38f10dc62752e655740224681a478d9f5bb", - "reference": "5424d38f10dc62752e655740224681a478d9f5bb", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/90411d2ad577b883f2fc9de06c86dd564d9ac676", + "reference": "90411d2ad577b883f2fc9de06c86dd564d9ac676", "shasum": "" }, "require": { @@ -1258,7 +1258,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-08-27T17:33:38+00:00" + "time": "2018-09-30T03:51:44+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1493,7 +1493,7 @@ }, { "name": "symfony/proxy-manager-bridge", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", @@ -1547,16 +1547,16 @@ }, { "name": "symfony/routing", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e26f791e8669603e9dc0a601e75a50f914eaa144" + "reference": "fed18962c40095adc36c2ad05bf0d957cc346f61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e26f791e8669603e9dc0a601e75a50f914eaa144", - "reference": "e26f791e8669603e9dc0a601e75a50f914eaa144", + "url": "https://api.github.com/repos/symfony/routing/zipball/fed18962c40095adc36c2ad05bf0d957cc346f61", + "reference": "fed18962c40095adc36c2ad05bf0d957cc346f61", "shasum": "" }, "require": { @@ -1617,20 +1617,20 @@ "uri", "url" ], - "time": "2018-07-26T11:13:39+00:00" + "time": "2018-09-08T12:44:02+00:00" }, { "name": "symfony/twig-bridge", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "2bb814a4554a7188275be36503dc27c0dd12cd2f" + "reference": "69d2a5542ea37309292d10029ce52b32656523a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/2bb814a4554a7188275be36503dc27c0dd12cd2f", - "reference": "2bb814a4554a7188275be36503dc27c0dd12cd2f", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/69d2a5542ea37309292d10029ce52b32656523a0", + "reference": "69d2a5542ea37309292d10029ce52b32656523a0", "shasum": "" }, "require": { @@ -1702,20 +1702,20 @@ ], "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "time": "2018-07-26T11:13:39+00:00" + "time": "2018-08-29T13:11:53+00:00" }, { "name": "symfony/yaml", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "fbf876678e29dc634430dcf0096e216eb0004467" + "reference": "5baf0f821b14eee8ca415e6a0361a9fa140c002c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/fbf876678e29dc634430dcf0096e216eb0004467", - "reference": "fbf876678e29dc634430dcf0096e216eb0004467", + "url": "https://api.github.com/repos/symfony/yaml/zipball/5baf0f821b14eee8ca415e6a0361a9fa140c002c", + "reference": "5baf0f821b14eee8ca415e6a0361a9fa140c002c", "shasum": "" }, "require": { @@ -1752,7 +1752,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-07-26T09:03:18+00:00" + "time": "2018-08-29T13:11:53+00:00" }, { "name": "twig/twig", @@ -2959,6 +2959,7 @@ "keywords": [ "phpdoc" ], + "abandoned": true, "time": "2015-06-05T03:36:34+00:00" }, { @@ -3413,7 +3414,7 @@ }, { "name": "symfony/browser-kit", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", @@ -3470,16 +3471,16 @@ }, { "name": "symfony/css-selector", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "294611f3a0d265bcf049e2da62cb4f712e3ed927" + "reference": "4cca41ebe83cd5b4bd0c1a9f6bdfaec7103f97fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/294611f3a0d265bcf049e2da62cb4f712e3ed927", - "reference": "294611f3a0d265bcf049e2da62cb4f712e3ed927", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4cca41ebe83cd5b4bd0c1a9f6bdfaec7103f97fb", + "reference": "4cca41ebe83cd5b4bd0c1a9f6bdfaec7103f97fb", "shasum": "" }, "require": { @@ -3519,20 +3520,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-07-26T09:03:18+00:00" + "time": "2018-09-08T12:44:02+00:00" }, { "name": "symfony/dom-crawler", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "2fd6513f2dd3b08446da420070084db376c0134c" + "reference": "ba0b706b5ac1c1afcf7d34507a5a272f51cc7721" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2fd6513f2dd3b08446da420070084db376c0134c", - "reference": "2fd6513f2dd3b08446da420070084db376c0134c", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ba0b706b5ac1c1afcf7d34507a5a272f51cc7721", + "reference": "ba0b706b5ac1c1afcf7d34507a5a272f51cc7721", "shasum": "" }, "require": { @@ -3576,20 +3577,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2018-07-24T10:05:38+00:00" + "time": "2018-09-21T12:46:38+00:00" }, { "name": "symfony/process", - "version": "v2.8.45", + "version": "v2.8.46", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "4be278e19064c3492095de50c9e375caae569ae1" + "reference": "f09e21b7c5aba06c47bbfad9cbcf13ac7f0db0a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/4be278e19064c3492095de50c9e375caae569ae1", - "reference": "4be278e19064c3492095de50c9e375caae569ae1", + "url": "https://api.github.com/repos/symfony/process/zipball/f09e21b7c5aba06c47bbfad9cbcf13ac7f0db0a6", + "reference": "f09e21b7c5aba06c47bbfad9cbcf13ac7f0db0a6", "shasum": "" }, "require": { @@ -3625,7 +3626,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-08-03T09:45:57+00:00" + "time": "2018-09-06T17:11:15+00:00" } ], "aliases": [], From 35d49f515092253c12ee49adf8aabdf4ce8e56a1 Mon Sep 17 00:00:00 2001 From: Jim Mossing Holsteyn Date: Sun, 23 Sep 2018 03:01:09 +0200 Subject: [PATCH 139/148] [ticket/15788] Fix return button for Privacy Policy Change the text from "Return to Login Page" to "Return to Previous page" as the privacy policy can now be accessed through the footer so we could return to any random previous page instead of just the login page. PHPBB3-15788 --- phpBB/ucp.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/ucp.php b/phpBB/ucp.php index 7eca5ede62..8cc46153b5 100644 --- a/phpBB/ucp.php +++ b/phpBB/ucp.php @@ -138,7 +138,7 @@ switch ($mode) 'AGREEMENT_TITLE' => $user->lang[$title], 'AGREEMENT_TEXT' => sprintf($user->lang[$message], $config['sitename'], generate_board_url()), 'U_BACK' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login'), - 'L_BACK' => $user->lang['BACK_TO_LOGIN'], + 'L_BACK' => $user->lang['BACK_TO_PREV'], )); page_footer(); From 52ffe758887d2321ba84c2f26adfa85e0bfa5624 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 16:52:58 +0200 Subject: [PATCH 140/148] [ticket/15554] Add simple_footer_body_after PHPBB3-15554 --- phpBB/docs/events.md | 7 +++++++ phpBB/styles/prosilver/template/simple_footer.html | 2 ++ 2 files changed, 9 insertions(+) diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index 6672353296..e833a3b6d3 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -1971,6 +1971,13 @@ simple_footer_after * Locations: + styles/prosilver/template/simple_footer.html * Since: 3.1.0-a1 +* Purpose: Add content prior to the scripts of the simple footer + +simple_footer_body_after +=== +* Locations: + + styles/prosilver/template/simple_footer.html +* Since: 3.2.4-RC1 * Purpose: Add content directly prior to the `` tag of the simple footer simple_header_body_before diff --git a/phpBB/styles/prosilver/template/simple_footer.html b/phpBB/styles/prosilver/template/simple_footer.html index 907ddd97ba..1ef44d1688 100644 --- a/phpBB/styles/prosilver/template/simple_footer.html +++ b/phpBB/styles/prosilver/template/simple_footer.html @@ -34,5 +34,7 @@ {$SCRIPTS} +{% EVENT simple_footer_body_after %} + From f9b1f9ced566a504bf5ba147eac9740d5abdce3c Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 15:11:12 +0200 Subject: [PATCH 141/148] [ticket/15706] Add mcp_post_report_buttons_top_* events PHPBB3-15706 --- phpBB/docs/events.md | 14 ++++++++++++++ phpBB/styles/prosilver/template/mcp_post.html | 2 ++ 2 files changed, 16 insertions(+) diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index 6672353296..4cad3563c3 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -974,6 +974,20 @@ mcp_post_additional_options * Since: 3.1.5-RC1 * Purpose: Add content within the list of post moderation actions +mcp_post_report_buttons_top_after +=== +* Locations: + + styles/prosilver/template/mcp_post.html +* Since: 3.2.4-RC1 +* Purpose: Add content after report buttons + +mcp_post_report_buttons_top_before +=== +* Locations: + + styles/prosilver/template/mcp_post.html +* Since: 3.2.4-RC1 +* Purpose: Add content before report buttons + mcp_topic_options_after === * Locations: diff --git a/phpBB/styles/prosilver/template/mcp_post.html b/phpBB/styles/prosilver/template/mcp_post.html index af16c8ab84..f066919529 100644 --- a/phpBB/styles/prosilver/template/mcp_post.html +++ b/phpBB/styles/prosilver/template/mcp_post.html @@ -31,10 +31,12 @@
    + {% EVENT mcp_post_report_buttons_top_before %}   + {% EVENT mcp_post_report_buttons_top_after %} {S_FORM_TOKEN}
    From d48ffde25d66c47186d89e9556a3b29e2c2390d0 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Tue, 25 Sep 2018 14:16:23 +0200 Subject: [PATCH 142/148] [ticket/15792] Add confirm_delete_body_delete_reason_before PHPBB3-15792 --- phpBB/docs/events.md | 7 +++++++ phpBB/styles/prosilver/template/confirm_delete_body.html | 2 ++ 2 files changed, 9 insertions(+) diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index 6672353296..28f9e82a69 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -652,6 +652,13 @@ attachment_file_prepend * Since: 3.1.6-RC1 * Purpose: Add custom attachment types displaying to the top of attachment block. +confirm_delete_body_delete_reason_before +=== +* Locations: + + styles/prosilver/template/confirm_delete_body.html +* Since: 3.2.4-RC1 +* Purpose: Add custom text to the confirmation of a post that is deleted. + forumlist_body_category_header_after === * Locations: diff --git a/phpBB/styles/prosilver/template/confirm_delete_body.html b/phpBB/styles/prosilver/template/confirm_delete_body.html index 98974963c0..637830a5bc 100644 --- a/phpBB/styles/prosilver/template/confirm_delete_body.html +++ b/phpBB/styles/prosilver/template/confirm_delete_body.html @@ -49,6 +49,8 @@
+ {% EVENT confirm_delete_body_delete_reason_before %} +

{L_DELETE_REASON_EXPLAIN}
From c67dd0c5912844a50323b97e8fecb30d21bb361c Mon Sep 17 00:00:00 2001 From: DSR! Date: Sat, 3 Mar 2018 12:12:38 -0300 Subject: [PATCH 143/148] [ticket/15836] Event to send message via external transport PHPBB3-15836 --- phpBB/includes/functions_messenger.php | 81 +++++++++++++++++++++----- 1 file changed, 65 insertions(+), 16 deletions(-) diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index fdd1dc6e32..7b530d7119 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -521,7 +521,7 @@ class messenger */ function msg_email() { - global $config; + global $config, $phpbb_dispatcher; if (empty($config['email_enable'])) { @@ -549,6 +549,33 @@ class messenger $contact_name = htmlspecialchars_decode($config['board_contact_name']); $board_contact = (($contact_name !== '') ? '"' . mail_encode($contact_name) . '" ' : '') . '<' . $config['board_contact'] . '>'; + $break = false; + $addresses = $this->addresses; + $subject = $this->subject; + $msg = $this->msg; + /** + * Event to send message via external transport + * + * @event core.notification_message_email + * @var bool break Flag indicating if the function return after hook + * @var array addresses The message recipients + * @var string subject The message subject + * @var string msg The message text + * @since 3.2.4-RC1 + */ + $vars = array( + 'break', + 'addresses', + 'subject', + 'msg', + ); + extract($phpbb_dispatcher->trigger_event('core.notification_message_email', compact($vars))); + + if ($break) + { + return true; + } + if (empty($this->replyto)) { $this->replyto = $board_contact; @@ -787,7 +814,7 @@ class queue */ function process() { - global $config, $phpEx, $phpbb_root_path, $user; + global $config, $phpEx, $phpbb_root_path, $user, $phpbb_dispatcher; $lock = new \phpbb\lock\flock($this->cache_file); $lock->acquire(); @@ -884,23 +911,45 @@ class queue switch ($object) { case 'email': - $err_msg = ''; - $to = (!$to) ? 'undisclosed-recipients:;' : $to; + $break = false; + /** + * Event to send message via external transport + * + * @event core.notification_message_email + * @var bool break Flag indicating if the function return after hook + * @var array addresses The message recipients + * @var string subject The message subject + * @var string msg The message text + * @since 3.2.4-RC1 + */ + $vars = array( + 'break', + 'addresses', + 'subject', + 'msg', + ); + extract($phpbb_dispatcher->trigger_event('core.notification_message_email', compact($vars))); - if ($config['smtp_delivery']) + if (!$break) { - $result = smtpmail($addresses, mail_encode($subject), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $err_msg, $headers); - } - else - { - $result = phpbb_mail($to, $subject, $msg, $headers, PHP_EOL, $err_msg); - } + $err_msg = ''; + $to = (!$to) ? 'undisclosed-recipients:;' : $to; - if (!$result) - { - $messenger = new messenger(); - $messenger->error('EMAIL', $err_msg); - continue 2; + if ($config['smtp_delivery']) + { + $result = smtpmail($addresses, mail_encode($subject), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $err_msg, $headers); + } + else + { + $result = phpbb_mail($to, $subject, $msg, $headers, PHP_EOL, $err_msg); + } + + if (!$result) + { + $messenger = new messenger(); + $messenger->error('EMAIL', $err_msg); + continue 2; + } } break; From a62141ea68e904927032276cb73ad483cbb93a1d Mon Sep 17 00:00:00 2001 From: Alec Date: Mon, 15 Oct 2018 21:57:23 -0400 Subject: [PATCH 144/148] [ticket/15841] Allow postrow pm link to be modified by event Allow postrow.contact pm link to be modified by event above All other variables in postrow.contact can be modified by the event already This lets you hide all contact info on a per user basis PHPBB3-15841 --- phpBB/viewtopic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 28e00dc6fa..55b41aa7fa 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -2115,7 +2115,7 @@ for ($i = 0, $end = count($post_list); $i < $end; ++$i) array( 'ID' => 'pm', 'NAME' => $user->lang['SEND_PRIVATE_MESSAGE'], - 'U_CONTACT' => $u_pm, + 'U_CONTACT' => $post_row['U_PM'], ), array( 'ID' => 'email', From 57375862101afce76250cfadb3256ae45ae73884 Mon Sep 17 00:00:00 2001 From: hubaishan Date: Wed, 17 Oct 2018 09:55:15 +0300 Subject: [PATCH 145/148] [ticket/15846] Fix Wrong id for downldable group `downloadable` extension group has id 5 not 6 PHPBB3-15846 --- phpBB/install/schemas/schema_data.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index 2c888bac75..b6ecabaf7f 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -795,11 +795,11 @@ INSERT INTO phpbb_extensions (group_id, extension) VALUES (4, 'ods'); INSERT INTO phpbb_extensions (group_id, extension) VALUES (4, 'odt'); INSERT INTO phpbb_extensions (group_id, extension) VALUES (4, 'rtf'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'mp3'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'mpeg'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'mpg'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'ogg'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'ogm'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (5, 'mp3'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (5, 'mpeg'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (5, 'mpg'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (5, 'ogg'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (5, 'ogm'); # Add default profile fields INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_location', 'profilefields.type.string', 'phpbb_location', '20', '2', '100', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, '', ''); From e046bd749821ed199a1054c4312555a3e83c6687 Mon Sep 17 00:00:00 2001 From: Jakub Senko Date: Thu, 18 Oct 2018 13:09:14 +0200 Subject: [PATCH 146/148] [ticket/15848] Update plupload to 2.3.6 PHPBB3-15848 --- phpBB/assets/plupload/plupload.full.min.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/phpBB/assets/plupload/plupload.full.min.js b/phpBB/assets/plupload/plupload.full.min.js index 3d01e66083..a58489dc64 100644 --- a/phpBB/assets/plupload/plupload.full.min.js +++ b/phpBB/assets/plupload/plupload.full.min.js @@ -1,6 +1,6 @@ /** * mOxie - multi-runtime File API & XMLHttpRequest L2 Polyfill - * v1.5.5 + * v1.5.7 * * Copyright 2013, Moxiecode Systems AB * Released under GPL License. @@ -8,15 +8,15 @@ * License: http://www.plupload.com/license * Contributing: http://www.plupload.com/contributing * - * Date: 2017-08-26 + * Date: 2017-11-03 */ -!function(e,t){var i=function(){var e={};return t.apply(e,arguments),e.moxie};"function"==typeof define&&define.amd?define("moxie",[],i):"object"==typeof module&&module.exports?module.exports=i():e.moxie=i()}(this||window,function(){!function(e,t){"use strict";function i(e,t){for(var i,n=[],r=0;r0&&c(n,function(n,u){var c=-1!==h(e(n),["array","object"]);return n===r||t&&o[u]===r?!0:(c&&i&&(n=a(n)),e(o[u])===e(n)&&c?s(t,i,[o[u],n]):o[u]=n,void 0)})}),o}function u(e,t){function i(){this.constructor=e}for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.super=t.prototype,e}function c(e,t){var i,n,r,o;if(e){try{i=e.length}catch(a){i=o}if(i===o||"number"!=typeof i){for(n in e)if(e.hasOwnProperty(n)&&t(e[n],n)===!1)return}else for(r=0;i>r;r++)if(t(e[r],r)===!1)return}}function l(t){var i;if(!t||"object"!==e(t))return!0;for(i in t)return!1;return!0}function d(t,i){function n(r){"function"===e(t[r])&&t[r](function(e){++ri;i++)if(t[i]===e)return i}return-1}function f(t,i){var n=[];"array"!==e(t)&&(t=[t]),"array"!==e(i)&&(i=[i]);for(var r in t)-1===h(t[r],i)&&n.push(t[r]);return n.length?n:!1}function p(e,t){var i=[];return c(e,function(e){-1!==h(e,t)&&i.push(e)}),i.length?i:null}function g(e){var t,i=[];for(t=0;ti;i++)n+=Math.floor(65535*Math.random()).toString(32);return(t||"o_")+n+(e++).toString(32)}}();return{guid:E,typeOf:e,extend:t,extendIf:i,extendImmutable:n,extendImmutableIf:r,clone:o,inherit:u,each:c,isEmptyObj:l,inSeries:d,inParallel:m,inArray:h,arrayDiff:f,arrayIntersect:p,toArray:g,trim:x,sprintf:w,parseSizeStr:v,delay:y}}),n("moxie/core/utils/Encode",[],function(){var e=function(e){return unescape(encodeURIComponent(e))},t=function(e){return decodeURIComponent(escape(e))},i=function(e,i){if("function"==typeof window.atob)return i?t(window.atob(e)):window.atob(e);var n,r,o,a,s,u,c,l,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",m=0,h=0,f="",p=[];if(!e)return e;e+="";do a=d.indexOf(e.charAt(m++)),s=d.indexOf(e.charAt(m++)),u=d.indexOf(e.charAt(m++)),c=d.indexOf(e.charAt(m++)),l=a<<18|s<<12|u<<6|c,n=255&l>>16,r=255&l>>8,o=255&l,p[h++]=64==u?String.fromCharCode(n):64==c?String.fromCharCode(n,r):String.fromCharCode(n,r,o);while(m>18,s=63&l>>12,u=63&l>>6,c=63&l,p[h++]=d.charAt(a)+d.charAt(s)+d.charAt(u)+d.charAt(c);while(mn;n++)if(e[n]!=t[n]){if(e[n]=u(e[n]),t[n]=u(t[n]),e[n]t[n]){o=1;break}}if(!i)return o;switch(i){case">":case"gt":return o>0;case">=":case"ge":return o>=0;case"<=":case"le":return 0>=o;case"==":case"=":case"eq":return 0===o;case"<>":case"!=":case"ne":return 0!==o;case"":case"<":case"lt":return 0>o;default:return null}}var n=function(e){var t="",i="?",n="function",r="undefined",o="object",a="name",s="version",u={has:function(e,t){return-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()}},c={rgx:function(){for(var t,i,a,s,u,c,l,d=0,m=arguments;d0?2==u.length?t[u[0]]=typeof u[1]==n?u[1].call(this,l):u[1]:3==u.length?t[u[0]]=typeof u[1]!==n||u[1].exec&&u[1].test?l?l.replace(u[1],u[2]):e:l?u[1].call(this,l,u[2]):e:4==u.length&&(t[u[0]]=l?u[3].call(this,l.replace(u[1],u[2])):e):t[u]=l?l:e;break}if(c)break}return t},str:function(t,n){for(var r in n)if(typeof n[r]===o&&n[r].length>0){for(var a=0;a=9)},use_data_uri_of:function(e){return i.use_data_uri&&33e3>e||i.use_data_uri_over32kb()},use_fileinput:function(){if(navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\/(1.0|2.0|2.5|3.0))/))return!1;var e=document.createElement("input");return e.setAttribute("type","file"),i.use_fileinput=!e.disabled},use_webgl:function(){var e,n=document.createElement("canvas"),r=null;try{r=n.getContext("webgl")||n.getContext("experimental-webgl")}catch(o){}return r||(r=null),e=!!r,i.use_webgl=e,n=t,e}};return function(t){var n=[].slice.call(arguments);return n.shift(),"function"===e.typeOf(i[t])?i[t].apply(this,n):!!i[t]}}(),o=(new n).getResult(),a={can:r,uaParser:n,browser:o.browser.name,version:o.browser.version,os:o.os.name,osVersion:o.os.version,verComp:i,swf_url:"../flash/Moxie.swf",xap_url:"../silverlight/Moxie.xap",global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"};return a.OS=a.os,a}),n("moxie/core/Exceptions",["moxie/core/utils/Basic"],function(e){function t(e,t){var i;for(i in e)if(e[i]===t)return i;return null}return{RuntimeError:function(){function i(e,i){this.code=e,this.name=t(n,e),this.message=this.name+(i||": RuntimeError "+this.code)}var n={NOT_INIT_ERR:1,EXCEPTION_ERR:3,NOT_SUPPORTED_ERR:9,JS_ERR:4};return e.extend(i,n),i.prototype=Error.prototype,i}(),OperationNotAllowedException:function(){function t(e){this.code=e,this.name="OperationNotAllowedException"}return e.extend(t,{NOT_ALLOWED_ERR:1}),t.prototype=Error.prototype,t}(),ImageError:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": ImageError "+this.code}var n={WRONG_FORMAT:1,MAX_RESOLUTION_ERR:2,INVALID_META_ERR:3};return e.extend(i,n),i.prototype=Error.prototype,i}(),FileException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": FileException "+this.code}var n={NOT_FOUND_ERR:1,SECURITY_ERR:2,ABORT_ERR:3,NOT_READABLE_ERR:4,ENCODING_ERR:5,NO_MODIFICATION_ALLOWED_ERR:6,INVALID_STATE_ERR:7,SYNTAX_ERR:8};return e.extend(i,n),i.prototype=Error.prototype,i}(),DOMException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": DOMException "+this.code}var n={INDEX_SIZE_ERR:1,DOMSTRING_SIZE_ERR:2,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,INVALID_CHARACTER_ERR:5,NO_DATA_ALLOWED_ERR:6,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INUSE_ATTRIBUTE_ERR:10,INVALID_STATE_ERR:11,SYNTAX_ERR:12,INVALID_MODIFICATION_ERR:13,NAMESPACE_ERR:14,INVALID_ACCESS_ERR:15,VALIDATION_ERR:16,TYPE_MISMATCH_ERR:17,SECURITY_ERR:18,NETWORK_ERR:19,ABORT_ERR:20,URL_MISMATCH_ERR:21,QUOTA_EXCEEDED_ERR:22,TIMEOUT_ERR:23,INVALID_NODE_TYPE_ERR:24,DATA_CLONE_ERR:25};return e.extend(i,n),i.prototype=Error.prototype,i}(),EventException:function(){function t(e){this.code=e,this.name="EventException"}return e.extend(t,{UNSPECIFIED_EVENT_TYPE_ERR:0}),t.prototype=Error.prototype,t}()}}),n("moxie/core/utils/Dom",["moxie/core/utils/Env"],function(e){var t=function(e){return"string"!=typeof e?e:document.getElementById(e)},i=function(e,t){if(!e.className)return!1;var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");return i.test(e.className)},n=function(e,t){i(e,t)||(e.className=e.className?e.className.replace(/\s+$/,"")+" "+t:t)},r=function(e,t){if(e.className){var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");e.className=e.className.replace(i,function(e,t,i){return" "===t&&" "===i?" ":""})}},o=function(e,t){return e.currentStyle?e.currentStyle[t]:window.getComputedStyle?window.getComputedStyle(e,null)[t]:void 0},a=function(t,i){function n(e){var t,i,n=0,r=0;return e&&(i=e.getBoundingClientRect(),t="CSS1Compat"===c.compatMode?c.documentElement:c.body,n=i.left+t.scrollLeft,r=i.top+t.scrollTop),{x:n,y:r}}var r,o,a,s=0,u=0,c=document;if(t=t,i=i||c.body,t&&t.getBoundingClientRect&&"IE"===e.browser&&(!c.documentMode||c.documentMode<8))return o=n(t),a=n(i),{x:o.x-a.x,y:o.y-a.y};for(r=t;r&&r!=i&&r.nodeType;)s+=r.offsetLeft||0,u+=r.offsetTop||0,r=r.offsetParent;for(r=t.parentNode;r&&r!=i&&r.nodeType;)s-=r.scrollLeft||0,u-=r.scrollTop||0,r=r.parentNode;return{x:s,y:u}},s=function(e){return{w:e.offsetWidth||e.clientWidth,h:e.offsetHeight||e.clientHeight}};return{get:t,hasClass:i,addClass:n,removeClass:r,getStyle:o,getPos:a,getSize:s}}),n("moxie/core/EventTarget",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic"],function(e,t,i){function n(){this.uid=i.guid()}var r={};return i.extend(n.prototype,{init:function(){this.uid||(this.uid=i.guid("uid_"))},addEventListener:function(e,t,n,o){var a,s=this;return this.hasOwnProperty("uid")||(this.uid=i.guid("uid_")),e=i.trim(e),/\s/.test(e)?(i.each(e.split(/\s+/),function(e){s.addEventListener(e,t,n,o)}),void 0):(e=e.toLowerCase(),n=parseInt(n,10)||0,a=r[this.uid]&&r[this.uid][e]||[],a.push({fn:t,priority:n,scope:o||this}),r[this.uid]||(r[this.uid]={}),r[this.uid][e]=a,void 0)},hasEventListener:function(e){var t;return e?(e=e.toLowerCase(),t=r[this.uid]&&r[this.uid][e]):t=r[this.uid],t?t:!1},removeEventListener:function(e,t){var n,o,a=this;if(e=e.toLowerCase(),/\s/.test(e))return i.each(e.split(/\s+/),function(e){a.removeEventListener(e,t)}),void 0;if(n=r[this.uid]&&r[this.uid][e]){if(t){for(o=n.length-1;o>=0;o--)if(n[o].fn===t){n.splice(o,1);break}}else n=[];n.length||(delete r[this.uid][e],i.isEmptyObj(r[this.uid])&&delete r[this.uid])}},removeAllEventListeners:function(){r[this.uid]&&delete r[this.uid]},dispatchEvent:function(e){var n,o,a,s,u,c={},l=!0;if("string"!==i.typeOf(e)){if(s=e,"string"!==i.typeOf(s.type))throw new t.EventException(t.EventException.UNSPECIFIED_EVENT_TYPE_ERR);e=s.type,s.total!==u&&s.loaded!==u&&(c.total=s.total,c.loaded=s.loaded),c.async=s.async||!1}if(-1!==e.indexOf("::")?function(t){n=t[0],e=t[1]}(e.split("::")):n=this.uid,e=e.toLowerCase(),o=r[n]&&r[n][e]){o.sort(function(e,t){return t.priority-e.priority}),a=[].slice.call(arguments),a.shift(),c.type=e,a.unshift(c);var d=[];i.each(o,function(e){a[0].target=e.scope,c.async?d.push(function(t){setTimeout(function(){t(e.fn.apply(e.scope,a)===!1)},1)}):d.push(function(t){t(e.fn.apply(e.scope,a)===!1)})}),d.length&&i.inSeries(d,function(e){l=!e})}return l},bindOnce:function(e,t,i,n){var r=this;r.bind.call(this,e,function o(){return r.unbind(e,o),t.apply(this,arguments)},i,n)},bind:function(){this.addEventListener.apply(this,arguments)},unbind:function(){this.removeEventListener.apply(this,arguments)},unbindAll:function(){this.removeAllEventListeners.apply(this,arguments)},trigger:function(){return this.dispatchEvent.apply(this,arguments)},handleEventProps:function(e){var t=this;this.bind(e.join(" "),function(e){var t="on"+e.type.toLowerCase();"function"===i.typeOf(this[t])&&this[t].apply(this,arguments)}),i.each(e,function(e){e="on"+e.toLowerCase(e),"undefined"===i.typeOf(t[e])&&(t[e]=null)})}}),n.instance=new n,n}),n("moxie/runtime/Runtime",["moxie/core/utils/Env","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/EventTarget"],function(e,t,i,n){function r(e,n,o,s,u){var c,l=this,d=t.guid(n+"_"),m=u||"browser";e=e||{},a[d]=this,o=t.extend({access_binary:!1,access_image_binary:!1,display_media:!1,do_cors:!1,drag_and_drop:!1,filter_by_extension:!0,resize_image:!1,report_upload_progress:!1,return_response_headers:!1,return_response_type:!1,return_status_code:!0,send_custom_headers:!1,select_file:!1,select_folder:!1,select_multiple:!0,send_binary_string:!1,send_browser_cookies:!0,send_multipart:!0,slice_blob:!1,stream_upload:!1,summon_file_dialog:!1,upload_filesize:!0,use_http_method:!0},o),e.preferred_caps&&(m=r.getMode(s,e.preferred_caps,m)),c=function(){var e={};return{exec:function(t,i,n,r){return c[i]&&(e[t]||(e[t]={context:this,instance:new c[i]}),e[t].instance[n])?e[t].instance[n].apply(this,r):void 0},removeInstance:function(t){delete e[t]},removeAllInstances:function(){var i=this;t.each(e,function(e,n){"function"===t.typeOf(e.instance.destroy)&&e.instance.destroy.call(e.context),i.removeInstance(n)})}}}(),t.extend(this,{initialized:!1,uid:d,type:n,mode:r.getMode(s,e.required_caps,m),shimid:d+"_container",clients:0,options:e,can:function(e,i){var n=arguments[2]||o;if("string"===t.typeOf(e)&&"undefined"===t.typeOf(i)&&(e=r.parseCaps(e)),"object"===t.typeOf(e)){for(var a in e)if(!this.can(a,e[a],n))return!1;return!0}return"function"===t.typeOf(n[e])?n[e].call(this,i):i===n[e]},getShimContainer:function(){var e,n=i.get(this.shimid);return n||(e=i.get(this.options.container)||document.body,n=document.createElement("div"),n.id=this.shimid,n.className="moxie-shim moxie-shim-"+this.type,t.extend(n.style,{position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),e.appendChild(n),e=null),n},getShim:function(){return c},shimExec:function(e,t){var i=[].slice.call(arguments,2);return l.getShim().exec.call(this,this.uid,e,t,i)},exec:function(e,t){var i=[].slice.call(arguments,2);return l[e]&&l[e][t]?l[e][t].apply(this,i):l.shimExec.apply(this,arguments)},destroy:function(){if(l){var e=i.get(this.shimid);e&&e.parentNode.removeChild(e),c&&c.removeAllInstances(),this.unbindAll(),delete a[this.uid],this.uid=null,d=l=c=e=null}}}),this.mode&&e.required_caps&&!this.can(e.required_caps)&&(this.mode=!1)}var o={},a={};return r.order="html5,flash,silverlight,html4",r.getRuntime=function(e){return a[e]?a[e]:!1},r.addConstructor=function(e,t){t.prototype=n.instance,o[e]=t},r.getConstructor=function(e){return o[e]||null},r.getInfo=function(e){var t=r.getRuntime(e);return t?{uid:t.uid,type:t.type,mode:t.mode,can:function(){return t.can.apply(t,arguments)}}:null},r.parseCaps=function(e){var i={};return"string"!==t.typeOf(e)?e||{}:(t.each(e.split(","),function(e){i[e]=!0}),i)},r.can=function(e,t){var i,n,o=r.getConstructor(e);return o?(i=new o({required_caps:t}),n=i.mode,i.destroy(),!!n):!1},r.thatCan=function(e,t){var i=(t||r.order).split(/\s*,\s*/);for(var n in i)if(r.can(i[n],e))return i[n];return null},r.getMode=function(e,i,n){var r=null;if("undefined"===t.typeOf(n)&&(n="browser"),i&&!t.isEmptyObj(e)){if(t.each(i,function(i,n){if(e.hasOwnProperty(n)){var o=e[n](i);if("string"==typeof o&&(o=[o]),r){if(!(r=t.arrayIntersect(r,o)))return r=!1}else r=o}}),r)return-1!==t.inArray(n,r)?n:r[0];if(r===!1)return!1}return n},r.getGlobalEventTarget=function(){if(/^moxie\./.test(e.global_event_dispatcher)&&!e.can("access_global_ns")){var i=t.guid("moxie_event_target_");window[i]=function(e,t){n.instance.dispatchEvent(e,t)},e.global_event_dispatcher=i}return e.global_event_dispatcher},r.capTrue=function(){return!0},r.capFalse=function(){return!1},r.capTest=function(e){return function(){return!!e}},r}),n("moxie/runtime/RuntimeClient",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/Runtime"],function(e,t,i,n){return function(){var e;i.extend(this,{connectRuntime:function(r){function o(i){var a,u;return i.length?(a=i.shift().toLowerCase(),(u=n.getConstructor(a))?(e=new u(r),e.bind("Init",function(){e.initialized=!0,setTimeout(function(){e.clients++,s.ruid=e.uid,s.trigger("RuntimeInit",e)},1)}),e.bind("Error",function(){e.destroy(),o(i)}),e.bind("Exception",function(e,i){var n=i.name+"(#"+i.code+")"+(i.message?", from: "+i.message:"");s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.EXCEPTION_ERR,n))}),e.mode?(e.init(),void 0):(e.trigger("Error"),void 0)):(o(i),void 0)):(s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)),e=null,void 0)}var a,s=this;if("string"===i.typeOf(r)?a=r:"string"===i.typeOf(r.ruid)&&(a=r.ruid),a){if(e=n.getRuntime(a))return s.ruid=a,e.clients++,e;throw new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)}o((r.runtime_order||n.order).split(/\s*,\s*/))},disconnectRuntime:function(){e&&--e.clients<=0&&e.destroy(),e=null},getRuntime:function(){return e&&e.uid?e:e=null},exec:function(){return e?e.exec.apply(this,arguments):null},can:function(t){return e?e.can(t):!1}})}}),n("moxie/file/Blob",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient"],function(e,t,i){function n(o,a){function s(t,i,o){var a,s=r[this.uid];return"string"===e.typeOf(s)&&s.length?(a=new n(null,{type:o,size:i-t}),a.detach(s.substr(t,a.size)),a):null}i.call(this),o&&this.connectRuntime(o),a?"string"===e.typeOf(a)&&(a={data:a}):a={},e.extend(this,{uid:a.uid||e.guid("uid_"),ruid:o,size:a.size||0,type:a.type||"",slice:function(e,t,i){return this.isDetached()?s.apply(this,arguments):this.getRuntime().exec.call(this,"Blob","slice",this.getSource(),e,t,i)},getSource:function(){return r[this.uid]?r[this.uid]:null},detach:function(e){if(this.ruid&&(this.getRuntime().exec.call(this,"Blob","destroy"),this.disconnectRuntime(),this.ruid=null),e=e||"","data:"==e.substr(0,5)){var i=e.indexOf(";base64,");this.type=e.substring(5,i),e=t.atob(e.substring(i+8))}this.size=e.length,r[this.uid]=e},isDetached:function(){return!this.ruid&&"string"===e.typeOf(r[this.uid])},destroy:function(){this.detach(),delete r[this.uid]}}),a.data?this.detach(a.data):r[this.uid]=a}var r={};return n}),n("moxie/core/I18n",["moxie/core/utils/Basic"],function(e){var t={};return{addI18n:function(i){return e.extend(t,i)},translate:function(e){return t[e]||e},_:function(e){return this.translate(e)},sprintf:function(t){var i=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=i.shift();return"undefined"!==e.typeOf(t)?t:""})}}}),n("moxie/core/utils/Mime",["moxie/core/utils/Basic","moxie/core/I18n"],function(e,t){var i="application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb xlt xla,application/vnd.ms-powerpoint,ppt pps pot ppa,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,application/vnd.openxmlformats-officedocument.presentationml.template,potx,application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,application/x-javascript,js,application/json,json,audio/mpeg,mp3 mpga mpega mp2,audio/x-wav,wav,audio/x-m4a,m4a,audio/ogg,oga ogg,audio/aiff,aiff aif,audio/flac,flac,audio/aac,aac,audio/ac3,ac3,audio/x-ms-wma,wma,image/bmp,bmp,image/gif,gif,image/jpeg,jpg jpeg jpe,image/photoshop,psd,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/plain,asc txt text diff log,text/html,htm html xhtml,text/css,css,text/csv,csv,text/rtf,rtf,video/mpeg,mpeg mpg mpe m2v,video/quicktime,qt mov,video/mp4,mp4,video/x-m4v,m4v,video/x-flv,flv,video/x-ms-wmv,wmv,video/avi,avi,video/webm,webm,video/3gpp,3gpp 3gp,video/3gpp2,3g2,video/vnd.rn-realvideo,rv,video/ogg,ogv,video/x-matroska,mkv,application/vnd.oasis.opendocument.formula-template,otf,application/octet-stream,exe",n={mimes:{},extensions:{},addMimeType:function(e){var t,i,n,r=e.split(/,/);for(t=0;ta;a++)o+=String.fromCharCode(r[a]);return o}}t.call(this),e.extend(this,{uid:e.guid("uid_"),readAsBinaryString:function(e){return n.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){return n.call(this,"readAsDataURL",e)},readAsText:function(e){return n.call(this,"readAsText",e)}})}}),n("moxie/xhr/FormData",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/file/Blob"],function(e,t,i){function n(){var e,n=[];t.extend(this,{append:function(r,o){var a=this,s=t.typeOf(o);o instanceof i?e={name:r,value:o}:"array"===s?(r+="[]",t.each(o,function(e){a.append(r,e)})):"object"===s?t.each(o,function(e,t){a.append(r+"["+t+"]",e)}):"null"===s||"undefined"===s||"number"===s&&isNaN(o)?a.append(r,"false"):n.push({name:r,value:o.toString()})},hasBlob:function(){return!!this.getBlob()},getBlob:function(){return e&&e.value||null},getBlobName:function(){return e&&e.name||null},each:function(i){t.each(n,function(e){i(e.value,e.name)}),e&&i(e.value,e.name)},destroy:function(){e=null,n=[]}})}return n}),n("moxie/xhr/XMLHttpRequest",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/utils/Encode","moxie/core/utils/Url","moxie/runtime/Runtime","moxie/runtime/RuntimeTarget","moxie/file/Blob","moxie/file/FileReaderSync","moxie/xhr/FormData","moxie/core/utils/Env","moxie/core/utils/Mime"],function(e,t,i,n,r,o,a,s,u,c,l,d){function m(){this.uid=e.guid("uid_")}function h(){function i(e,t){return I.hasOwnProperty(e)?1===arguments.length?l.can("define_property")?I[e]:A[e]:(l.can("define_property")?I[e]=t:A[e]=t,void 0):void 0}function u(t){function n(){R&&(R.destroy(),R=null),s.dispatchEvent("loadend"),s=null}function r(r){R.bind("LoadStart",function(e){i("readyState",h.LOADING),s.dispatchEvent("readystatechange"),s.dispatchEvent(e),L&&s.upload.dispatchEvent(e)}),R.bind("Progress",function(e){i("readyState")!==h.LOADING&&(i("readyState",h.LOADING),s.dispatchEvent("readystatechange")),s.dispatchEvent(e)}),R.bind("UploadProgress",function(e){L&&s.upload.dispatchEvent({type:"progress",lengthComputable:!1,total:e.total,loaded:e.loaded})}),R.bind("Load",function(t){i("readyState",h.DONE),i("status",Number(r.exec.call(R,"XMLHttpRequest","getStatus")||0)),i("statusText",f[i("status")]||""),i("response",r.exec.call(R,"XMLHttpRequest","getResponse",i("responseType"))),~e.inArray(i("responseType"),["text",""])?i("responseText",i("response")):"document"===i("responseType")&&i("responseXML",i("response")),U=r.exec.call(R,"XMLHttpRequest","getAllResponseHeaders"),s.dispatchEvent("readystatechange"),i("status")>0?(L&&s.upload.dispatchEvent(t),s.dispatchEvent(t)):(F=!0,s.dispatchEvent("error")),n()}),R.bind("Abort",function(e){s.dispatchEvent(e),n()}),R.bind("Error",function(e){F=!0,i("readyState",h.DONE),s.dispatchEvent("readystatechange"),M=!0,s.dispatchEvent(e),n()}),r.exec.call(R,"XMLHttpRequest","send",{url:x,method:v,async:T,user:w,password:y,headers:S,mimeType:D,encoding:O,responseType:s.responseType,withCredentials:s.withCredentials,options:k},t)}var s=this;E=(new Date).getTime(),R=new a,"string"==typeof k.required_caps&&(k.required_caps=o.parseCaps(k.required_caps)),k.required_caps=e.extend({},k.required_caps,{return_response_type:s.responseType}),t instanceof c&&(k.required_caps.send_multipart=!0),e.isEmptyObj(S)||(k.required_caps.send_custom_headers=!0),B||(k.required_caps.do_cors=!0),k.ruid?r(R.connectRuntime(k)):(R.bind("RuntimeInit",function(e,t){r(t)}),R.bind("RuntimeError",function(e,t){s.dispatchEvent("RuntimeError",t)}),R.connectRuntime(k))}function g(){i("responseText",""),i("responseXML",null),i("response",null),i("status",0),i("statusText",""),E=b=null}var x,v,w,y,E,b,R,_,A=this,I={timeout:0,readyState:h.UNSENT,withCredentials:!1,status:0,statusText:"",responseType:"",responseXML:null,responseText:null,response:null},T=!0,S={},O=null,D=null,N=!1,C=!1,L=!1,M=!1,F=!1,B=!1,P=null,H=null,k={},U="";e.extend(this,I,{uid:e.guid("uid_"),upload:new m,open:function(o,a,s,u,c){var l;if(!o||!a)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(/[\u0100-\uffff]/.test(o)||n.utf8_encode(o)!==o)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(~e.inArray(o.toUpperCase(),["CONNECT","DELETE","GET","HEAD","OPTIONS","POST","PUT","TRACE","TRACK"])&&(v=o.toUpperCase()),~e.inArray(v,["CONNECT","TRACE","TRACK"]))throw new t.DOMException(t.DOMException.SECURITY_ERR);if(a=n.utf8_encode(a),l=r.parseUrl(a),B=r.hasSameOrigin(l),x=r.resolveUrl(a),(u||c)&&!B)throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);if(w=u||l.user,y=c||l.pass,T=s||!0,T===!1&&(i("timeout")||i("withCredentials")||""!==i("responseType")))throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);N=!T,C=!1,S={},g.call(this),i("readyState",h.OPENED),this.dispatchEvent("readystatechange")},setRequestHeader:function(r,o){var a=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","content-transfer-encoding","date","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"];if(i("readyState")!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(/[\u0100-\uffff]/.test(r)||n.utf8_encode(r)!==r)throw new t.DOMException(t.DOMException.SYNTAX_ERR);return r=e.trim(r).toLowerCase(),~e.inArray(r,a)||/^(proxy\-|sec\-)/.test(r)?!1:(S[r]?S[r]+=", "+o:S[r]=o,!0)},hasRequestHeader:function(e){return e&&S[e.toLowerCase()]||!1},getAllResponseHeaders:function(){return U||""},getResponseHeader:function(t){return t=t.toLowerCase(),F||~e.inArray(t,["set-cookie","set-cookie2"])?null:U&&""!==U&&(_||(_={},e.each(U.split(/\r\n/),function(t){var i=t.split(/:\s+/);2===i.length&&(i[0]=e.trim(i[0]),_[i[0].toLowerCase()]={header:i[0],value:e.trim(i[1])})})),_.hasOwnProperty(t))?_[t].header+": "+_[t].value:null},overrideMimeType:function(n){var r,o;if(~e.inArray(i("readyState"),[h.LOADING,h.DONE]))throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(n=e.trim(n.toLowerCase()),/;/.test(n)&&(r=n.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))&&(n=r[1],r[2]&&(o=r[2])),!d.mimes[n])throw new t.DOMException(t.DOMException.SYNTAX_ERR);P=n,H=o},send:function(i,r){if(k="string"===e.typeOf(r)?{ruid:r}:r?r:{},this.readyState!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(i instanceof s)k.ruid=i.ruid,D=i.type||"application/octet-stream";else if(i instanceof c){if(i.hasBlob()){var o=i.getBlob();k.ruid=o.ruid,D=o.type||"application/octet-stream"}}else"string"==typeof i&&(O="UTF-8",D="text/plain;charset=UTF-8",i=n.utf8_encode(i));this.withCredentials||(this.withCredentials=k.required_caps&&k.required_caps.send_browser_cookies&&!B),L=!N&&this.upload.hasEventListener(),F=!1,M=!i,N||(C=!0),u.call(this,i)},abort:function(){if(F=!0,N=!1,~e.inArray(i("readyState"),[h.UNSENT,h.OPENED,h.DONE]))i("readyState",h.UNSENT);else{if(i("readyState",h.DONE),C=!1,!R)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);R.getRuntime().exec.call(R,"XMLHttpRequest","abort",M),M=!0}},destroy:function(){R&&("function"===e.typeOf(R.destroy)&&R.destroy(),R=null),this.unbindAll(),this.upload&&(this.upload.unbindAll(),this.upload=null)}}),this.handleEventProps(p.concat(["readystatechange"])),this.upload.handleEventProps(p)}var f={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",306:"Reserved",307:"Temporary Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",426:"Upgrade Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",510:"Not Extended"};m.prototype=i.instance;var p=["loadstart","progress","abort","error","load","timeout","loadend"];return h.UNSENT=0,h.OPENED=1,h.HEADERS_RECEIVED=2,h.LOADING=3,h.DONE=4,h.prototype=i.instance,h}),n("moxie/runtime/Transporter",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(e,t,i,n){function r(){function n(){l=d=0,c=this.result=null}function o(t,i){var n=this;u=i,n.bind("TransportingProgress",function(t){d=t.loaded,l>d&&-1===e.inArray(n.state,[r.IDLE,r.DONE])&&a.call(n)},999),n.bind("TransportingComplete",function(){d=l,n.state=r.DONE,c=null,n.result=u.exec.call(n,"Transporter","getAsBlob",t||"")},999),n.state=r.BUSY,n.trigger("TransportingStarted"),a.call(n)}function a(){var e,i=this,n=l-d;m>n&&(m=n),e=t.btoa(c.substr(d,m)),u.exec.call(i,"Transporter","receive",e,l)}var s,u,c,l,d,m;i.call(this),e.extend(this,{uid:e.guid("uid_"),state:r.IDLE,result:null,transport:function(t,i,r){var a=this;if(r=e.extend({chunk_size:204798},r),(s=r.chunk_size%3)&&(r.chunk_size+=3-s),m=r.chunk_size,n.call(this),c=t,l=t.length,"string"===e.typeOf(r)||r.ruid)o.call(a,i,this.connectRuntime(r));else{var u=function(e,t){a.unbind("RuntimeInit",u),o.call(a,i,t)};this.bind("RuntimeInit",u),this.connectRuntime(r)}},abort:function(){var e=this;e.state=r.IDLE,u&&(u.exec.call(e,"Transporter","clear"),e.trigger("TransportingAborted")),n.call(e)},destroy:function(){this.unbindAll(),u=null,this.disconnectRuntime(),n.call(this)}})}return r.IDLE=0,r.BUSY=1,r.DONE=2,r.prototype=n.instance,r}),n("moxie/image/Image",["moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/file/FileReaderSync","moxie/xhr/XMLHttpRequest","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/runtime/Transporter","moxie/core/utils/Env","moxie/core/EventTarget","moxie/file/Blob","moxie/file/File","moxie/core/utils/Encode"],function(e,t,i,n,r,o,a,s,u,c,l,d,m){function h(){function n(e){try{return e||(e=this.exec("Image","getInfo")),this.size=e.size,this.width=e.width,this.height=e.height,this.type=e.type,this.meta=e.meta,""===this.name&&(this.name=e.name),!0}catch(t){return this.trigger("error",t.code),!1}}function c(t){var n=e.typeOf(t);try{if(t instanceof h){if(!t.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);p.apply(this,arguments)}else if(t instanceof l){if(!~e.inArray(t.type,["image/jpeg","image/png"]))throw new i.ImageError(i.ImageError.WRONG_FORMAT);g.apply(this,arguments)}else if(-1!==e.inArray(n,["blob","file"]))c.call(this,new d(null,t),arguments[1]);else if("string"===n)"data:"===t.substr(0,5)?c.call(this,new l(null,{data:t}),arguments[1]):x.apply(this,arguments);else{if("node"!==n||"img"!==t.nodeName.toLowerCase())throw new i.DOMException(i.DOMException.TYPE_MISMATCH_ERR);c.call(this,t.src,arguments[1])}}catch(r){this.trigger("error",r.code)}}function p(t,i){var n=this.connectRuntime(t.ruid);this.ruid=n.uid,n.exec.call(this,"Image","loadFromImage",t,"undefined"===e.typeOf(i)?!0:i)}function g(t,i){function n(e){r.ruid=e.uid,e.exec.call(r,"Image","loadFromBlob",t)}var r=this;r.name=t.name||"",t.isDetached()?(this.bind("RuntimeInit",function(e,t){n(t)}),i&&"string"==typeof i.required_caps&&(i.required_caps=o.parseCaps(i.required_caps)),this.connectRuntime(e.extend({required_caps:{access_image_binary:!0,resize_image:!0}},i))):n(this.connectRuntime(t.ruid))}function x(e,t){var i,n=this;i=new r,i.open("get",e),i.responseType="blob",i.onprogress=function(e){n.trigger(e)},i.onload=function(){g.call(n,i.response,!0)},i.onerror=function(e){n.trigger(e)},i.onloadend=function(){i.destroy()},i.bind("RuntimeError",function(e,t){n.trigger("RuntimeError",t)}),i.send(null,t)}a.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,name:"",size:0,width:0,height:0,type:"",meta:{},clone:function(){this.load.apply(this,arguments)},load:function(){c.apply(this,arguments)},resize:function(t){var n,r,o=this,a={x:0,y:0,width:o.width,height:o.height},s=e.extendIf({width:o.width,height:o.height,type:o.type||"image/jpeg",quality:90,crop:!1,fit:!0,preserveHeaders:!0,resample:"default",multipass:!0},t);try{if(!o.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);if(o.width>h.MAX_RESIZE_WIDTH||o.height>h.MAX_RESIZE_HEIGHT)throw new i.ImageError(i.ImageError.MAX_RESOLUTION_ERR);if(n=o.meta&&o.meta.tiff&&o.meta.tiff.Orientation||1,-1!==e.inArray(n,[5,6,7,8])){var u=s.width;s.width=s.height,s.height=u}if(s.crop){switch(r=Math.max(s.width/o.width,s.height/o.height),t.fit?(a.width=Math.min(Math.ceil(s.width/r),o.width),a.height=Math.min(Math.ceil(s.height/r),o.height),r=s.width/a.width):(a.width=Math.min(s.width,o.width),a.height=Math.min(s.height,o.height),r=1),"boolean"==typeof s.crop&&(s.crop="cc"),s.crop.toLowerCase().replace(/_/,"-")){case"rb":case"right-bottom":a.x=o.width-a.width,a.y=o.height-a.height;break;case"cb":case"center-bottom":a.x=Math.floor((o.width-a.width)/2),a.y=o.height-a.height;break;case"lb":case"left-bottom":a.x=0,a.y=o.height-a.height;break;case"lt":case"left-top":a.x=0,a.y=0;break;case"ct":case"center-top":a.x=Math.floor((o.width-a.width)/2),a.y=0;break;case"rt":case"right-top":a.x=o.width-a.width,a.y=0;break;case"rc":case"right-center":case"right-middle":a.x=o.width-a.width,a.y=Math.floor((o.height-a.height)/2);break;case"lc":case"left-center":case"left-middle":a.x=0,a.y=Math.floor((o.height-a.height)/2);break;case"cc":case"center-center":case"center-middle":default:a.x=Math.floor((o.width-a.width)/2),a.y=Math.floor((o.height-a.height)/2)}a.x=Math.max(a.x,0),a.y=Math.max(a.y,0)}else r=Math.min(s.width/o.width,s.height/o.height),r>1&&!s.fit&&(r=1);this.exec("Image","resize",a,r,s)}catch(c){o.trigger("error",c.code)}},downsize:function(t){var i,n={width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,crop:!1,fit:!1,preserveHeaders:!0,resample:"default"};i="object"==typeof t?e.extend(n,t):e.extend(n,{width:arguments[0],height:arguments[1],crop:arguments[2],preserveHeaders:arguments[3]}),this.resize(i)},crop:function(e,t,i){this.downsize(e,t,!0,i)},getAsCanvas:function(){if(!u.can("create_canvas"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);return this.exec("Image","getAsCanvas")},getAsBlob:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsBlob",e||"image/jpeg",t||90)},getAsDataURL:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsDataURL",e||"image/jpeg",t||90)},getAsBinaryString:function(e,t){var i=this.getAsDataURL(e,t);return m.atob(i.substring(i.indexOf("base64,")+7))},embed:function(n,r){function o(t,r){var o=this;if(u.can("create_canvas")){var l=o.getAsCanvas();if(l)return n.appendChild(l),l=null,o.destroy(),c.trigger("embedded"),void 0}var d=o.getAsDataURL(t,r);if(!d)throw new i.ImageError(i.ImageError.WRONG_FORMAT);if(u.can("use_data_uri_of",d.length))n.innerHTML='',o.destroy(),c.trigger("embedded");else{var h=new s;h.bind("TransportingComplete",function(){a=c.connectRuntime(this.result.ruid),c.bind("Embedded",function(){e.extend(a.getShimContainer().style,{top:"0px",left:"0px",width:o.width+"px",height:o.height+"px"}),a=null},999),a.exec.call(c,"ImageView","display",this.result.uid,width,height),o.destroy()}),h.transport(m.atob(d.substring(d.indexOf("base64,")+7)),t,{required_caps:{display_media:!0},runtime_order:"flash,silverlight",container:n})}}var a,c=this,l=e.extend({width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,fit:!0,resample:"nearest"},r);try{if(!(n=t.get(n)))throw new i.DOMException(i.DOMException.INVALID_NODE_TYPE_ERR);if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);this.width>h.MAX_RESIZE_WIDTH||this.height>h.MAX_RESIZE_HEIGHT;var d=new h;return d.bind("Resize",function(){o.call(this,l.type,l.quality)}),d.bind("Load",function(){this.downsize(l)}),this.meta.thumb&&this.meta.thumb.width>=l.width&&this.meta.thumb.height>=l.height?d.load(this.meta.thumb.data):d.clone(this,!1),d}catch(f){this.trigger("error",f.code)}},destroy:function(){this.ruid&&(this.getRuntime().exec.call(this,"Image","destroy"),this.disconnectRuntime()),this.meta&&this.meta.thumb&&this.meta.thumb.data.destroy(),this.unbindAll()}}),this.handleEventProps(f),this.bind("Load Resize",function(){return n.call(this)},999)}var f=["progress","load","error","resize","embedded"];return h.MAX_RESIZE_WIDTH=8192,h.MAX_RESIZE_HEIGHT=8192,h.prototype=c.instance,h}),n("moxie/runtime/html5/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue,l=e.extend({access_binary:u(window.FileReader||window.File&&window.File.getAsDataURL),access_image_binary:function(){return o.can("access_binary")&&!!s.Image},display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:u(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest),drag_and_drop:u(function(){var e=document.createElement("div");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&("IE"!==n.browser||n.verComp(n.version,9,">"))}()),filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),return_response_headers:c,return_response_type:function(e){return"json"===e&&window.JSON?!0:n.can("return_response_type",e)},return_status_code:c,report_upload_progress:u(window.XMLHttpRequest&&(new XMLHttpRequest).upload),resize_image:function(){return o.can("access_binary")&&n.can("create_canvas")},select_file:function(){return n.can("use_fileinput")&&window.File},select_folder:function(){return o.can("select_file")&&("Chrome"===n.browser&&n.verComp(n.version,21,">=")||"Firefox"===n.browser&&n.verComp(n.version,42,">="))},select_multiple:function(){return!(!o.can("select_file")||"Safari"===n.browser&&"Windows"===n.os||"iOS"===n.os&&n.verComp(n.osVersion,"7.0.0",">")&&n.verComp(n.osVersion,"8.0.0","<"))},send_binary_string:u(window.XMLHttpRequest&&((new XMLHttpRequest).sendAsBinary||window.Uint8Array&&window.ArrayBuffer)),send_custom_headers:u(window.XMLHttpRequest),send_multipart:function(){return!!(window.XMLHttpRequest&&(new XMLHttpRequest).upload&&window.FormData)||o.can("send_binary_string")},slice_blob:u(window.File&&(File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice)),stream_upload:function(){return o.can("slice_blob")&&o.can("send_multipart")},summon_file_dialog:function(){return o.can("select_file")&&!("Firefox"===n.browser&&n.verComp(n.version,4,"<")||"Opera"===n.browser&&n.verComp(n.version,12,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<"))},upload_filesize:c,use_http_method:c},arguments[2]);i.call(this,t,arguments[1]||a,l),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html5",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html5/file/Blob",["moxie/runtime/html5/Runtime","moxie/file/Blob"],function(e,t){function i(){function e(e,t,i){var n;if(!window.File.prototype.slice)return(n=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)?n.call(e,t,i):null;try{return e.slice(),e.slice(t,i)}catch(r){return e.slice(t,i-t)}}this.slice=function(){return new t(this.getRuntime().uid,e.apply(this,arguments))},this.destroy=function(){this.getRuntime().getShim().removeInstance(this.uid)}}return e.Blob=i}),n("moxie/core/utils/Events",["moxie/core/utils/Basic"],function(e){function t(){this.returnValue=!1}function i(){this.cancelBubble=!0}var n={},r="moxie_"+e.guid(),o=function(o,a,s,u){var c,l;a=a.toLowerCase(),o.addEventListener?(c=s,o.addEventListener(a,c,!1)):o.attachEvent&&(c=function(){var e=window.event;e.target||(e.target=e.srcElement),e.preventDefault=t,e.stopPropagation=i,s(e)},o.attachEvent("on"+a,c)),o[r]||(o[r]=e.guid()),n.hasOwnProperty(o[r])||(n[o[r]]={}),l=n[o[r]],l.hasOwnProperty(a)||(l[a]=[]),l[a].push({func:c,orig:s,key:u})},a=function(t,i,o){var a,s;if(i=i.toLowerCase(),t[r]&&n[t[r]]&&n[t[r]][i]){a=n[t[r]][i];for(var u=a.length-1;u>=0&&(a[u].orig!==o&&a[u].key!==o||(t.removeEventListener?t.removeEventListener(i,a[u].func,!1):t.detachEvent&&t.detachEvent("on"+i,a[u].func),a[u].orig=null,a[u].func=null,a.splice(u,1),o===s));u--);if(a.length||delete n[t[r]][i],e.isEmptyObj(n[t[r]])){delete n[t[r]];try{delete t[r]}catch(c){t[r]=s}}}},s=function(t,i){t&&t[r]&&e.each(n[t[r]],function(e,n){a(t,n,i)})};return{addEvent:o,removeEvent:a,removeAllEvents:s}}),n("moxie/runtime/html5/file/FileInput",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){var e,s;i.extend(this,{init:function(u){var c,l,d,m,h,f,p=this,g=p.getRuntime();e=u,d=o.extList2mimes(e.accept,g.can("filter_by_extension")),l=g.getShimContainer(),l.innerHTML='",c=n.get(g.uid),i.extend(c.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),m=n.get(e.browse_button),s=n.getStyle(m,"z-index")||"auto",g.can("summon_file_dialog")&&("static"===n.getStyle(m,"position")&&(m.style.position="relative"),r.addEvent(m,"click",function(e){var t=n.get(g.uid);t&&!t.disabled&&t.click(),e.preventDefault()},p.uid),p.bind("Refresh",function(){h=parseInt(s,10)||1,n.get(e.browse_button).style.zIndex=h,this.getRuntime().getShimContainer().style.zIndex=h-1})),f=g.can("summon_file_dialog")?m:l,r.addEvent(f,"mouseover",function(){p.trigger("mouseenter")},p.uid),r.addEvent(f,"mouseout",function(){p.trigger("mouseleave")},p.uid),r.addEvent(f,"mousedown",function(){p.trigger("mousedown")},p.uid),r.addEvent(n.get(e.container),"mouseup",function(){p.trigger("mouseup")},p.uid),(g.can("summon_file_dialog")?c:m).setAttribute("tabindex",-1),c.onchange=function x(){if(p.files=[],i.each(this.files,function(i){var n="";return e.directory&&"."==i.name?!0:(i.webkitRelativePath&&(n="/"+i.webkitRelativePath.replace(/^\//,"")),i=new t(g.uid,i),i.relativePath=n,p.files.push(i),void 0)}),"IE"!==a.browser&&"IEMobile"!==a.browser)this.value="";else{var n=this.cloneNode(!0);this.parentNode.replaceChild(n,this),n.onchange=x}p.files.length&&p.trigger("change")},p.trigger({type:"ready",async:!0}),l=null},setOption:function(e,t){var i=this.getRuntime(),r=n.get(i.uid);switch(e){case"accept":if(t){var a=t.mimes||o.extList2mimes(t,i.can("filter_by_extension"));r.setAttribute("accept",a.join(","))}else r.removeAttribute("accept");break;case"directory":t&&i.can("select_folder")?(r.setAttribute("directory",""),r.setAttribute("webkitdirectory","")):(r.removeAttribute("directory"),r.removeAttribute("webkitdirectory"));break;case"multiple":t&&i.can("select_multiple")?r.setAttribute("multiple",""):r.removeAttribute("multiple")}},disable:function(e){var t,i=this.getRuntime();(t=n.get(i.uid))&&(t.disabled=!!e)},destroy:function(){var t=this.getRuntime(),i=t.getShim(),o=t.getShimContainer(),a=e&&n.get(e.container),u=e&&n.get(e.browse_button);a&&r.removeAllEvents(a,this.uid),u&&(r.removeAllEvents(u,this.uid),u.style.zIndex=s),o&&(r.removeAllEvents(o,this.uid),o.innerHTML=""),i.removeInstance(this.uid),e=o=a=u=i=null}})}return e.FileInput=s}),n("moxie/runtime/html5/file/FileDrop",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime"],function(e,t,i,n,r,o){function a(){function e(e){if(!e.dataTransfer||!e.dataTransfer.types)return!1;var t=i.toArray(e.dataTransfer.types||[]);return-1!==i.inArray("Files",t)||-1!==i.inArray("public.file-url",t)||-1!==i.inArray("application/x-moz-file",t)}function a(e,i){if(u(e)){var n=new t(f,e);n.relativePath=i||"",p.push(n)}}function s(e){for(var t=[],n=0;n=")&&u.verComp(u.version,7,"<"),f="Android Browser"===u.browser,p=!1;if(h=i.url.replace(/^.+?\/([\w\-\.]+)$/,"$1").toLowerCase(),m=c(),m.open(i.method,i.url,i.async,i.user,i.password),r instanceof o)r.isDetached()&&(p=!0),r=r.getSource();else if(r instanceof a){if(r.hasBlob())if(r.getBlob().isDetached())r=d.call(s,r),p=!0;else if((l||f)&&"blob"===t.typeOf(r.getBlob().getSource())&&window.FileReader)return e.call(s,i,r),void 0;if(r instanceof a){var g=new window.FormData;r.each(function(e,t){e instanceof o?g.append(t,e.getSource()):g.append(t,e)}),r=g}}m.upload?(i.withCredentials&&(m.withCredentials=!0),m.addEventListener("load",function(e){s.trigger(e)}),m.addEventListener("error",function(e){s.trigger(e)}),m.addEventListener("progress",function(e){s.trigger(e)}),m.upload.addEventListener("progress",function(e){s.trigger({type:"UploadProgress",loaded:e.loaded,total:e.total})})):m.onreadystatechange=function(){switch(m.readyState){case 1:break;case 2:break;case 3:var e,t;try{n.hasSameOrigin(i.url)&&(e=m.getResponseHeader("Content-Length")||0),m.responseText&&(t=m.responseText.length)}catch(r){e=t=0}s.trigger({type:"progress",lengthComputable:!!e,total:parseInt(e,10),loaded:t});break;case 4:m.onreadystatechange=function(){};try{if(m.status>=200&&m.status<400){s.trigger("load");break}}catch(r){}s.trigger("error")}},t.isEmptyObj(i.headers)||t.each(i.headers,function(e,t){m.setRequestHeader(t,e)}),""!==i.responseType&&"responseType"in m&&(m.responseType="json"!==i.responseType||u.can("return_response_type","json")?i.responseType:"text"),p?m.sendAsBinary?m.sendAsBinary(r):function(){for(var e=new Uint8Array(r.length),t=0;t0&&o.set(new Uint8Array(t.slice(0,e)),0),o.set(new Uint8Array(r),e),o.set(new Uint8Array(t.slice(e+n)),e+r.byteLength),this.clear(),t=o.buffer,i=new DataView(t);break}default:return t}},length:function(){return t?t.byteLength:0},clear:function(){i=t=null}})}function n(t){function i(e,i,n){n=3===arguments.length?n:t.length-i-1,t=t.substr(0,i)+e+t.substr(n+i)}e.extend(this,{readByteAt:function(e){return t.charCodeAt(e)},writeByteAt:function(e,t){i(String.fromCharCode(t),e,1)},SEGMENT:function(e,n,r){switch(arguments.length){case 1:return t.substr(e);case 2:return t.substr(e,n);case 3:i(null!==r?r:"",e,n);break;default:return t}},length:function(){return t?t.length:0},clear:function(){t=null}})}return e.extend(t.prototype,{littleEndian:!1,read:function(e,t){var i,n,r;if(e+t>this.length())throw new Error("You are trying to read outside the source boundaries.");for(n=this.littleEndian?0:-8*(t-1),r=0,i=0;t>r;r++)i|=this.readByteAt(e+r)<this.length())throw new Error("You are trying to write outside the source boundaries.");for(n=this.littleEndian?0:-8*(i-1),r=0;i>r;r++)this.writeByteAt(e+r,255&t>>Math.abs(n+8*r))},BYTE:function(e){return this.read(e,1)},SHORT:function(e){return this.read(e,2)},LONG:function(e){return this.read(e,4)},SLONG:function(e){var t=this.read(e,4);return t>2147483647?t-4294967296:t},CHAR:function(e){return String.fromCharCode(this.read(e,1))},STRING:function(e,t){return this.asArray("CHAR",e,t).join("")},asArray:function(e,t,i){for(var n=[],r=0;i>r;r++)n[r]=this[e](t+r);return n}}),t}),n("moxie/runtime/html5/image/JPEGHeaders",["moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,t){return function i(n){var r,o,a,s=[],u=0;if(r=new e(n),65496!==r.SHORT(0))throw r.clear(),new t.ImageError(t.ImageError.WRONG_FORMAT);for(o=2;o<=r.length();)if(a=r.SHORT(o),a>=65488&&65495>=a)o+=2;else{if(65498===a||65497===a)break;u=r.SHORT(o+2)+2,a>=65505&&65519>=a&&s.push({hex:a,name:"APP"+(15&a),start:o,length:u,segment:r.SEGMENT(o,u)}),o+=u}return r.clear(),{headers:s,restore:function(t){var i,n,r;for(r=new e(t),o=65504==r.SHORT(2)?4+r.SHORT(4):2,n=0,i=s.length;i>n;n++)r.SEGMENT(o,0,s[n].segment),o+=s[n].length;return t=r.SEGMENT(),r.clear(),t},strip:function(t){var n,r,o,a;for(o=new i(t),r=o.headers,o.purge(),n=new e(t),a=r.length;a--;)n.SEGMENT(r[a].start,r[a].length,"");return t=n.SEGMENT(),n.clear(),t},get:function(e){for(var t=[],i=0,n=s.length;n>i;i++)s[i].name===e.toUpperCase()&&t.push(s[i].segment);return t},set:function(e,t){var i,n,r,o=[];for("string"==typeof t?o.push(t):o=t,i=n=0,r=s.length;r>i&&(s[i].name===e.toUpperCase()&&(s[i].segment=o[n],s[i].length=o[n].length,n++),!(n>=o.length));i++);},purge:function(){this.headers=s=[]}}}}),n("moxie/runtime/html5/image/ExifParser",["moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,i,n){function r(o){function a(i,r){var o,a,s,u,c,m,h,f,p=this,g=[],x={},v={1:"BYTE",7:"UNDEFINED",2:"ASCII",3:"SHORT",4:"LONG",5:"RATIONAL",9:"SLONG",10:"SRATIONAL"},w={BYTE:1,UNDEFINED:1,ASCII:1,SHORT:2,LONG:4,RATIONAL:8,SLONG:4,SRATIONAL:8};for(o=p.SHORT(i),a=0;o>a;a++)if(g=[],h=i+2+12*a,s=r[p.SHORT(h)],s!==t){if(u=v[p.SHORT(h+=2)],c=p.LONG(h+=2),m=w[u],!m)throw new n.ImageError(n.ImageError.INVALID_META_ERR);if(h+=4,m*c>4&&(h=p.LONG(h)+d.tiffHeader),h+m*c>=this.length())throw new n.ImageError(n.ImageError.INVALID_META_ERR);"ASCII"!==u?(g=p.asArray(u,h,c),f=1==c?g[0]:g,x[s]=l.hasOwnProperty(s)&&"object"!=typeof f?l[s][f]:f):x[s]=e.trim(p.STRING(h,c).replace(/\0$/,""))}return x}function s(e,t,i){var n,r,o,a=0;if("string"==typeof t){var s=c[e.toLowerCase()];for(var u in s)if(s[u]===t){t=u;break}}n=d[e.toLowerCase()+"IFD"],r=this.SHORT(n);for(var l=0;r>l;l++)if(o=n+12*l+2,this.SHORT(o)==t){a=o+8;break}if(!a)return!1;try{this.write(a,i,4)}catch(m){return!1}return!0}var u,c,l,d,m,h;if(i.call(this,o),c={tiff:{274:"Orientation",270:"ImageDescription",271:"Make",272:"Model",305:"Software",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer"},exif:{36864:"ExifVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",36867:"DateTimeOriginal",33434:"ExposureTime",33437:"FNumber",34855:"ISOSpeedRatings",37377:"ShutterSpeedValue",37378:"ApertureValue",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37386:"FocalLength",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType",41988:"DigitalZoomRatio",41992:"Contrast",41993:"Saturation",41994:"Sharpness"},gps:{0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude"},thumb:{513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength"}},l={ColorSpace:{1:"sRGB",0:"Uncalibrated"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{1:"Daylight",2:"Fliorescent",3:"Tungsten",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 -5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},ExposureMode:{0:"Auto exposure",1:"Manual exposure",2:"Auto bracket"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},GPSLatitudeRef:{N:"North latitude",S:"South latitude"},GPSLongitudeRef:{E:"East longitude",W:"West longitude"}},d={tiffHeader:10},m=d.tiffHeader,u={clear:this.clear},e.extend(this,{read:function(){try{return r.prototype.read.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},write:function(){try{return r.prototype.write.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},UNDEFINED:function(){return this.BYTE.apply(this,arguments)},RATIONAL:function(e){return this.LONG(e)/this.LONG(e+4)},SRATIONAL:function(e){return this.SLONG(e)/this.SLONG(e+4)},ASCII:function(e){return this.CHAR(e)},TIFF:function(){return h||null},EXIF:function(){var t=null;if(d.exifIFD){try{t=a.call(this,d.exifIFD,c.exif)}catch(i){return null}if(t.ExifVersion&&"array"===e.typeOf(t.ExifVersion)){for(var n=0,r="";n=65472&&65475>=t)return n+=5,{height:e.SHORT(n),width:e.SHORT(n+=2)};i=e.SHORT(n+=2),n+=i-2}return null}function s(){var e,t,i=d.thumb();return i&&(e=new n(i),t=a(e),e.clear(),t)?(t.data=i,t):null}function u(){d&&l&&c&&(d.clear(),l.purge(),c.clear(),m=l=d=c=null)}var c,l,d,m;if(c=new n(o),65496!==c.SHORT(0))throw new t.ImageError(t.ImageError.WRONG_FORMAT);l=new i(o);try{d=new r(l.get("app1")[0])}catch(h){}m=a.call(this),e.extend(this,{type:"image/jpeg",size:c.length(),width:m&&m.width||0,height:m&&m.height||0,setExif:function(t,i){return d?("object"===e.typeOf(t)?e.each(t,function(e,t){d.setExif(t,e)}):d.setExif(t,i),l.set("app1",d.SEGMENT()),void 0):!1},writeHeaders:function(){return arguments.length?l.restore(arguments[0]):l.restore(o)},stripHeaders:function(e){return l.strip(e)},purge:function(){u.call(this)}}),d&&(this.meta={tiff:d.TIFF(),exif:d.EXIF(),gps:d.GPS(),thumb:s()})}return o}),n("moxie/runtime/html5/image/PNG",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader"],function(e,t,i){function n(n){function r(){var e,t;return e=a.call(this,8),"IHDR"==e.type?(t=e.start,{width:s.LONG(t),height:s.LONG(t+=4)}):null}function o(){s&&(s.clear(),n=l=u=c=s=null)}function a(e){var t,i,n,r;return t=s.LONG(e),i=s.STRING(e+=4,4),n=e+=4,r=s.LONG(e+t),{length:t,type:i,start:n,CRC:r}}var s,u,c,l;s=new i(n),function(){var t=0,i=0,n=[35152,20039,3338,6666];for(i=0;ii.height?"width":"height",a=Math.round(i[o]*n),s=!1;"nearest"!==r&&(.5>n||n>2)&&(n=.5>n?.5:2,s=!0);var u=t(i,n);return s?e(u,a/u[o],r):u}function t(e,t){var i=e.width,n=e.height,r=Math.round(i*t),o=Math.round(n*t),a=document.createElement("canvas");return a.width=r,a.height=o,a.getContext("2d").drawImage(e,0,0,i,n,0,0,r,o),e=null,a}return{scale:e}}),n("moxie/runtime/html5/image/Image",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/utils/Encode","moxie/file/Blob","moxie/file/File","moxie/runtime/html5/image/ImageInfo","moxie/runtime/html5/image/ResizerCanvas","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a,s,u,c){function l(){function e(){if(!w&&!x)throw new i.ImageError(i.DOMException.INVALID_STATE_ERR);return w||x}function l(){var t=e();return"canvas"==t.nodeName.toLowerCase()?t:(w=document.createElement("canvas"),w.width=t.width,w.height=t.height,w.getContext("2d").drawImage(t,0,0),w)}function d(e){return n.atob(e.substring(e.indexOf("base64,")+7))}function m(e,t){return"data:"+(t||"")+";base64,"+n.btoa(e)}function h(e){var t=this,n=e.substr(0,5);x=new Image,x.onerror=function(){g.call(this),t.trigger("error",i.ImageError.WRONG_FORMAT)},x.onload=function(){t.trigger("load")},x.src="data:"===n||"blob:"===n?e:m(e,E.type)}function f(e,t){var n,r=this;return window.FileReader?(n=new FileReader,n.onload=function(){t.call(r,this.result)},n.onerror=function(){r.trigger("error",i.ImageError.WRONG_FORMAT)},n.readAsDataURL(e),void 0):t.call(this,e.getAsDataURL())}function p(e,i){var n=Math.PI/180,r=document.createElement("canvas"),o=r.getContext("2d"),a=e.width,s=e.height;switch(t.inArray(i,[5,6,7,8])>-1?(r.width=s,r.height=a):(r.width=a,r.height=s),i){case 2:o.translate(a,0),o.scale(-1,1);break;case 3:o.translate(a,s),o.rotate(180*n);break;case 4:o.translate(0,s),o.scale(1,-1);break;case 5:o.rotate(90*n),o.scale(1,-1);break;case 6:o.rotate(90*n),o.translate(0,-s);break;case 7:o.rotate(90*n),o.translate(a,-s),o.scale(-1,1);break;case 8:o.rotate(-90*n),o.translate(-a,0)}return o.drawImage(e,0,0,a,s),r}function g(){v&&(v.purge(),v=null),x&&c.can("use_blob_uri")&&URL.revokeObjectURL(x.src),y=x=w=E=null,R=!1}var x,v,w,y,E,b=this,R=!1,_=!0;t.extend(this,{loadFromBlob:function(e){var t=this.getRuntime(),n=arguments.length>1?arguments[1]:!0;if(!t.can("access_binary"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);E=e,e.isDetached()?(y=e.getSource(),h.call(this,y)):c.can("use_blob_uri")?h.call(this,URL.createObjectURL(e.getSource())):f.call(this,e.getSource(),function(e){n&&(y=d(e)),h.call(this,e)})},loadFromImage:function(e,t){var i=this;i.meta=e.meta,E=new o(null,{name:e.name,size:e.size,type:e.type}),c.can("create_canvas")&&!t?(w=e.getAsCanvas(),setTimeout(function(){i.trigger("load")})):h.call(this,t?y=e.getAsBinaryString():e.getAsDataURL())},getInfo:function(){var t,i=this.getRuntime();return!v&&y&&i.can("access_image_binary")&&(v=new a(y)),t={width:e().width||0,height:e().height||0,type:E.type||u.getFileMime(E.name),size:y&&y.length||E.size||0,name:E.name||"",meta:null},_&&(t.meta=v&&v.meta||this.meta||{},!t.meta||!t.meta.thumb||t.meta.thumb.data instanceof r||(t.meta.thumb.data=new r(null,{type:"image/jpeg",data:t.meta.thumb.data}))),t},resize:function(t,i,n){var r=document.createElement("canvas");if(r.width=t.width,r.height=t.height,r.getContext("2d").drawImage(e(),t.x,t.y,t.width,t.height,0,0,r.width,r.height),w=s.scale(r,i),_=n.preserveHeaders,!_){var o=this.meta&&this.meta.tiff&&this.meta.tiff.Orientation||1;w=p(w,o)}this.width=w.width,this.height=w.height,R=!0,this.trigger("Resize")},getAsCanvas:function(){return w||(w=l()),w.id=this.uid+"_canvas",w},getAsBlob:function(e,t){return e!==this.type?(R=!0,new o(null,{name:E.name||"",type:e,data:b.getAsDataURL(e,t)})):new o(null,{name:E.name||"",type:e,data:b.getAsBinaryString(e,t)})},getAsDataURL:function(e){var t=arguments[1]||90;if(!R&&"data:"===x.src.substr(0,5))return x.src;if(l(),"image/jpeg"!==e)return w.toDataURL("image/png");try{return w.toDataURL("image/jpeg",t/100)}catch(i){return w.toDataURL("image/jpeg")}},getAsBinaryString:function(e,t){if(!R)return y||(y=d(b.getAsDataURL(e,t))),y;if("image/jpeg"!==e)y=d(b.getAsDataURL(e,t));else{var i;t||(t=90),l();try{i=w.toDataURL("image/jpeg",t/100)}catch(n){i=w.toDataURL("image/jpeg")}y=d(i),v&&(y=v.stripHeaders(y),_&&(v.meta&&v.meta.exif&&v.setExif({PixelXDimension:this.width,PixelYDimension:this.height}),y=v.writeHeaders(y)),v.purge(),v=null)}return R=!1,y},destroy:function(){b=null,g.call(this),this.getRuntime().getShim().removeInstance(this.uid)}})}return e.Image=l}),n("moxie/runtime/flash/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(i){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}function s(e){var n=i.get(e);n&&"OBJECT"==n.nodeName&&("IE"===t.browser?(n.style.display="none",function r(){4==n.readyState?u(e):setTimeout(r,10)}()):n.parentNode.removeChild(n))}function u(e){var t=i.get(e);if(t){for(var n in t)"function"==typeof t[n]&&(t[n]=null);t.parentNode.removeChild(t)}}function c(u){var c,m=this;u=e.extend({swf_url:t.swf_url},u),o.call(this,u,l,{access_binary:function(e){return e&&"browser"===m.mode},access_image_binary:function(e){return e&&"browser"===m.mode},display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:function(){return"client"===m.mode},resize_image:o.capTrue,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!e.arrayDiff(t,["","text","document"])||"browser"===m.mode},return_status_code:function(t){return"browser"===m.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:function(e){return e&&"browser"===m.mode},send_browser_cookies:function(e){return e&&"browser"===m.mode},send_custom_headers:function(e){return e&&"browser"===m.mode},send_multipart:o.capTrue,slice_blob:function(e){return e&&"browser"===m.mode},stream_upload:function(e){return e&&"browser"===m.mode},summon_file_dialog:!1,upload_filesize:function(t){return e.parseSizeStr(t)<=2097152||"client"===m.mode},use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}},{access_binary:function(e){return e?"browser":"client"},access_image_binary:function(e){return e?"browser":"client"},report_upload_progress:function(e){return e?"browser":"client"},return_response_type:function(t){return e.arrayDiff(t,["","text","json","document"])?"browser":["client","browser"]},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"browser":["client","browser"]},send_binary_string:function(e){return e?"browser":"client"},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"browser":"client"},slice_blob:function(e){return e?"browser":"client"},stream_upload:function(e){return e?"client":"browser"},upload_filesize:function(t){return e.parseSizeStr(t)>=2097152?"client":"browser"}},"client"),a()<11.3&&(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid)},shimExec:function(e,t){var i=[].slice.call(arguments,2);return m.getShim().exec(this.uid,e,t,i)},init:function(){var i,r,a;a=this.getShimContainer(),e.extend(a.style,{position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),i=''+''+''+''+"","IE"===t.browser?(r=document.createElement("div"),a.appendChild(r),r.outerHTML=i,r=a=null):a.innerHTML=i,c=setTimeout(function(){m&&!m.initialized&&m.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},5e3)},destroy:function(e){return function(){s(m.uid),e.call(m),clearTimeout(c),u=c=e=m=null}}(this.destroy)},d)}var l="flash",d={};return o.addConstructor(l,c),d}),n("moxie/runtime/flash/file/Blob",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={slice:function(e,i,n,r){var o=this.getRuntime();return 0>i?i=Math.max(e.size+i,0):i>0&&(i=Math.min(i,e.size)),0>n?n=Math.max(e.size+n,0):n>0&&(n=Math.min(n,e.size)),e=o.shimExec.call(this,"Blob","slice",i,n,r||""),e&&(e=new t(o.uid,e)),e}};return e.Blob=i}),n("moxie/runtime/flash/file/FileInput",["moxie/runtime/flash/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,t,i,n){var r={init:function(e){var r=this,o=this.getRuntime(),a=i.get(e.browse_button);a&&(a.setAttribute("tabindex",-1),a=null),this.bind("Change",function(){var e=o.shimExec.call(r,"FileInput","getFiles");r.files=[],n.each(e,function(e){r.files.push(new t(o.uid,e))})},999),this.getRuntime().shimExec.call(this,"FileInput","init",{accept:e.accept,multiple:e.multiple}),this.trigger("ready")}};return e.FileInput=r}),n("moxie/runtime/flash/file/FileReader",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n=this;return n.result="","readAsDataURL"===e&&(n.result="data:"+(t.type||"")+";base64,"),n.bind("Progress",function(t,r){r&&(n.result+=i(r,e))},999),n.getRuntime().shimExec.call(this,"FileReader","readAsBase64",t.uid)}};return e.FileReader=n}),n("moxie/runtime/flash/file/FileReaderSync",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n,r=this.getRuntime();return(n=r.shimExec.call(this,"FileReaderSync","readAsBase64",t.uid))?("readAsDataURL"===e&&(n="data:"+(t.type||"")+";base64,"+n),i(n,e,t.type)):null}};return e.FileReaderSync=n}),n("moxie/runtime/flash/runtime/Transporter",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={getAsBlob:function(e){var i=this.getRuntime(),n=i.shimExec.call(this,"Transporter","getAsBlob",e);return n?new t(i.uid,n):null}};return e.Transporter=i}),n("moxie/runtime/flash/xhr/XMLHttpRequest",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/file/File","moxie/file/FileReaderSync","moxie/runtime/flash/file/FileReaderSync","moxie/xhr/FormData","moxie/runtime/Transporter","moxie/runtime/flash/runtime/Transporter"],function(e,t,i,n,r,o,a,s){var u={send:function(e,n){function r(){e.transport=l.mode,l.shimExec.call(c,"XMLHttpRequest","send",e,n)}function o(e,t){l.shimExec.call(c,"XMLHttpRequest","appendBlob",e,t.uid),n=null,r()}function u(e,t){var i=new s;i.bind("TransportingComplete",function(){t(this.result)}),i.transport(e.getSource(),e.type,{ruid:l.uid})}var c=this,l=c.getRuntime();if(t.isEmptyObj(e.headers)||t.each(e.headers,function(e,t){l.shimExec.call(c,"XMLHttpRequest","setRequestHeader",t,e.toString())}),n instanceof a){var d;if(n.each(function(e,t){e instanceof i?d=t:l.shimExec.call(c,"XMLHttpRequest","append",t,e)}),n.hasBlob()){var m=n.getBlob();m.isDetached()?u(m,function(e){m.destroy(),o(d,e)}):o(d,m)}else n=null,r()}else n instanceof i?n.isDetached()?u(n,function(e){n.destroy(),n=e.uid,r()}):(n=n.uid,r()):r()},getResponse:function(e){var i,o,a=this.getRuntime();if(o=a.shimExec.call(this,"XMLHttpRequest","getResponseAsBlob")){if(o=new n(a.uid,o),"blob"===e)return o;try{if(i=new r,~t.inArray(e,["","text"]))return i.readAsText(o);if("json"===e&&window.JSON)return JSON.parse(i.readAsText(o))}finally{o.destroy()}}return null},abort:function(){var e=this.getRuntime();e.shimExec.call(this,"XMLHttpRequest","abort"),this.dispatchEvent("readystatechange"),this.dispatchEvent("abort")}};return e.XMLHttpRequest=u}),n("moxie/runtime/flash/image/Image",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/runtime/Transporter","moxie/file/Blob","moxie/file/FileReaderSync"],function(e,t,i,n,r){var o={loadFromBlob:function(e){function t(e){r.shimExec.call(n,"Image","loadFromBlob",e.uid),n=r=null}var n=this,r=n.getRuntime();if(e.isDetached()){var o=new i;o.bind("TransportingComplete",function(){t(o.result.getSource())}),o.transport(e.getSource(),e.type,{ruid:r.uid})}else t(e.getSource())},loadFromImage:function(e){var t=this.getRuntime();return t.shimExec.call(this,"Image","loadFromImage",e.uid)},getInfo:function(){var e=this.getRuntime(),t=e.shimExec.call(this,"Image","getInfo");return t.meta&&t.meta.thumb&&t.meta.thumb.data&&!(e.meta.thumb.data instanceof n)&&(t.meta.thumb.data=new n(e.uid,t.meta.thumb.data)),t},getAsBlob:function(e,t){var i=this.getRuntime(),r=i.shimExec.call(this,"Image","getAsBlob",e,t);return r?new n(i.uid,r):null},getAsDataURL:function(){var e,t=this.getRuntime(),i=t.Image.getAsBlob.apply(this,arguments);return i?(e=new r,e.readAsDataURL(i)):null}};return e.Image=o}),n("moxie/runtime/silverlight/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(e){var t,i,n,r,o,a=!1,s=null,u=0;try{try{s=new ActiveXObject("AgControl.AgControl"),s.IsVersionSupported(e)&&(a=!0),s=null}catch(c){var l=navigator.plugins["Silverlight Plug-In"];if(l){for(t=l.description,"1.0.30226.2"===t&&(t="2.0.30226.2"),i=t.split(".");i.length>3;)i.pop();for(;i.length<4;)i.push(0);for(n=e.split(".");n.length>4;)n.pop();do r=parseInt(n[u],10),o=parseInt(i[u],10),u++;while(u=r&&!isNaN(r)&&(a=!0)}}}catch(d){a=!1}return a}function s(s){var l,d=this;s=e.extend({xap_url:t.xap_url},s),o.call(this,s,u,{access_binary:o.capTrue,access_image_binary:o.capTrue,display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:o.capTrue,resize_image:o.capTrue,return_response_headers:function(e){return e&&"client"===d.mode},return_response_type:function(e){return"json"!==e?!0:!!window.JSON},return_status_code:function(t){return"client"===d.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:o.capTrue,send_browser_cookies:function(e){return e&&"browser"===d.mode},send_custom_headers:function(e){return e&&"client"===d.mode},send_multipart:o.capTrue,slice_blob:o.capTrue,stream_upload:!0,summon_file_dialog:!1,upload_filesize:o.capTrue,use_http_method:function(t){return"client"===d.mode||!e.arrayDiff(t,["GET","POST"])}},{return_response_headers:function(e){return e?"client":"browser"},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"client":["client","browser"]},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"client":"browser"},use_http_method:function(t){return e.arrayDiff(t,["GET","POST"])?"client":["client","browser"]}}),a("2.0.31005.0")&&"Opera"!==t.browser||(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid).content.Moxie},shimExec:function(e,t){var i=[].slice.call(arguments,2);return d.getShim().exec(this.uid,e,t,i)},init:function(){var e;e=this.getShimContainer(),e.innerHTML=''+''+''+''+''+''+"",l=setTimeout(function(){d&&!d.initialized&&d.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},"Windows"!==t.OS?1e4:5e3)},destroy:function(e){return function(){e.call(d),clearTimeout(l),s=l=e=d=null}}(this.destroy)},c)}var u="silverlight",c={};return o.addConstructor(u,s),c}),n("moxie/runtime/silverlight/file/Blob",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/Blob"],function(e,t,i){return e.Blob=t.extend({},i)}),n("moxie/runtime/silverlight/file/FileInput",["moxie/runtime/silverlight/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,t,i,n){function r(e){for(var t="",i=0;ii;i++)t=s.keys[i],a=s[t],a&&(/^(\d|[1-9]\d+)$/.test(a)?a=parseInt(a,10):/^\d*\.\d+$/.test(a)&&(a=parseFloat(a)),r.meta[e][t]=a)}),r.meta&&r.meta.thumb&&r.meta.thumb.data&&!(e.meta.thumb.data instanceof i)&&(r.meta.thumb.data=new i(e.uid,r.meta.thumb.data))),r.width=parseInt(o.width,10),r.height=parseInt(o.height,10),r.size=parseInt(o.size,10),r.type=o.type,r.name=o.name,r},resize:function(e,t,i){this.getRuntime().shimExec.call(this,"Image","resize",e.x,e.y,e.width,e.height,t,i.preserveHeaders,i.resample)}})}),n("moxie/runtime/html4/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue;i.call(this,t,a,{access_binary:u(window.FileReader||window.File&&File.getAsDataURL),access_image_binary:!1,display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:!1,drag_and_drop:!1,filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),resize_image:function(){return s.Image&&o.can("access_binary")&&n.can("create_canvas")},report_upload_progress:!1,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!!~e.inArray(t,["text","document",""])},return_status_code:function(t){return!e.arrayDiff(t,[200,404])},select_file:function(){return n.can("use_fileinput")},select_multiple:!1,send_binary_string:!1,send_custom_headers:!1,send_multipart:!0,slice_blob:!1,stream_upload:function(){return o.can("select_file")},summon_file_dialog:function(){return o.can("select_file")&&!("Firefox"===n.browser&&n.verComp(n.version,4,"<")||"Opera"===n.browser&&n.verComp(n.version,12,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<"))},upload_filesize:c,use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}}),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html4",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html4/file/FileInput",["moxie/runtime/html4/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){function e(){var o,c,d,m,h,f,p=this,g=p.getRuntime();f=i.guid("uid_"),o=g.getShimContainer(),s&&(d=n.get(s+"_form"),d&&(i.extend(d.style,{top:"100%"}),d.firstChild.setAttribute("tabindex",-1))),m=document.createElement("form"),m.setAttribute("id",f+"_form"),m.setAttribute("method","post"),m.setAttribute("enctype","multipart/form-data"),m.setAttribute("encoding","multipart/form-data"),i.extend(m.style,{overflow:"hidden",position:"absolute",top:0,left:0,width:"100%",height:"100%"}),h=document.createElement("input"),h.setAttribute("id",f),h.setAttribute("type","file"),h.setAttribute("accept",l.join(",")),g.can("summon_file_dialog")&&h.setAttribute("tabindex",-1),i.extend(h.style,{fontSize:"999px",opacity:0}),m.appendChild(h),o.appendChild(m),i.extend(h.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),"IE"===a.browser&&a.verComp(a.version,10,"<")&&i.extend(h.style,{filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}),h.onchange=function(){var i;this.value&&(i=this.files?this.files[0]:{name:this.value},i=new t(g.uid,i),this.onchange=function(){},e.call(p),p.files=[i],h.setAttribute("id",i.uid),m.setAttribute("id",i.uid+"_form"),p.trigger("change"),h=m=null)},g.can("summon_file_dialog")&&(c=n.get(u.browse_button),r.removeEvent(c,"click",p.uid),r.addEvent(c,"click",function(e){h&&!h.disabled&&h.click(),e.preventDefault()},p.uid)),s=f,o=d=c=null}var s,u,c,l=[];i.extend(this,{init:function(t){var i,a=this,s=a.getRuntime();u=t,l=o.extList2mimes(t.accept,s.can("filter_by_extension")),i=s.getShimContainer(),function(){var e,o,l;e=n.get(t.browse_button),c=n.getStyle(e,"z-index")||"auto",s.can("summon_file_dialog")?("static"===n.getStyle(e,"position")&&(e.style.position="relative"),a.bind("Refresh",function(){o=parseInt(c,10)||1,n.get(u.browse_button).style.zIndex=o,this.getRuntime().getShimContainer().style.zIndex=o-1})):e.setAttribute("tabindex",-1),l=s.can("summon_file_dialog")?e:i,r.addEvent(l,"mouseover",function(){a.trigger("mouseenter")},a.uid),r.addEvent(l,"mouseout",function(){a.trigger("mouseleave")},a.uid),r.addEvent(l,"mousedown",function(){a.trigger("mousedown")},a.uid),r.addEvent(n.get(t.container),"mouseup",function(){a.trigger("mouseup")},a.uid),e=null}(),e.call(this),i=null,a.trigger({type:"ready",async:!0})},setOption:function(e,t){var i,r=this.getRuntime();"accept"==e&&(l=t.mimes||o.extList2mimes(t,r.can("filter_by_extension"))),i=n.get(s),i&&i.setAttribute("accept",l.join(","))},disable:function(e){var t;(t=n.get(s))&&(t.disabled=!!e)},destroy:function(){var e=this.getRuntime(),t=e.getShim(),i=e.getShimContainer(),o=u&&n.get(u.container),a=u&&n.get(u.browse_button);o&&r.removeAllEvents(o,this.uid),a&&(r.removeAllEvents(a,this.uid),a.style.zIndex=c),i&&(r.removeAllEvents(i,this.uid),i.innerHTML=""),t.removeInstance(this.uid),s=l=u=i=o=a=t=null}})}return e.FileInput=s}),n("moxie/runtime/html4/file/FileReader",["moxie/runtime/html4/Runtime","moxie/runtime/html5/file/FileReader"],function(e,t){return e.FileReader=t}),n("moxie/runtime/html4/xhr/XMLHttpRequest",["moxie/runtime/html4/Runtime","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Url","moxie/core/Exceptions","moxie/core/utils/Events","moxie/file/Blob","moxie/xhr/FormData"],function(e,t,i,n,r,o,a,s){function u(){function e(e){var t,n,r,a,s=this,u=!1;if(l){if(t=l.id.replace(/_iframe$/,""),n=i.get(t+"_form")){for(r=n.getElementsByTagName("input"),a=r.length;a--;)switch(r[a].getAttribute("type")){case"hidden":r[a].parentNode.removeChild(r[a]);break;case"file":u=!0}r=[],u||n.parentNode.removeChild(n),n=null}setTimeout(function(){o.removeEvent(l,"load",s.uid),l.parentNode&&l.parentNode.removeChild(l);var t=s.getRuntime().getShimContainer();t.children.length||t.parentNode.removeChild(t),t=l=null,e()},1)}}var u,c,l;t.extend(this,{send:function(d,m){function h(){var i=w.getShimContainer()||document.body,r=document.createElement("div");r.innerHTML='',l=r.firstChild,i.appendChild(l),o.addEvent(l,"load",function(){var i;try{i=l.contentWindow.document||l.contentDocument||window.frames[l.id].document,/^4(0[0-9]|1[0-7]|2[2346])\s/.test(i.title)?u=i.title.replace(/^(\d+).*$/,"$1"):(u=200,c=t.trim(i.body.innerHTML),v.trigger({type:"progress",loaded:c.length,total:c.length}),x&&v.trigger({type:"uploadprogress",loaded:x.size||1025,total:x.size||1025}))}catch(r){if(!n.hasSameOrigin(d.url))return e.call(v,function(){v.trigger("error")}),void 0;u=404}e.call(v,function(){v.trigger("load")})},v.uid)}var f,p,g,x,v=this,w=v.getRuntime();if(u=c=null,m instanceof s&&m.hasBlob()){if(x=m.getBlob(),f=x.uid,g=i.get(f),p=i.get(f+"_form"),!p)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR)}else f=t.guid("uid_"),p=document.createElement("form"),p.setAttribute("id",f+"_form"),p.setAttribute("method",d.method),p.setAttribute("enctype","multipart/form-data"),p.setAttribute("encoding","multipart/form-data"),w.getShimContainer().appendChild(p);p.setAttribute("target",f+"_iframe"),m instanceof s&&m.each(function(e,i){if(e instanceof a)g&&g.setAttribute("name",i);else{var n=document.createElement("input");t.extend(n,{type:"hidden",name:i,value:e}),g?p.insertBefore(n,g):p.appendChild(n)}}),p.setAttribute("action",d.url),h(),p.submit(),v.trigger("loadstart")},getStatus:function(){return u},getResponse:function(e){if("json"===e&&"string"===t.typeOf(c)&&window.JSON)try{return JSON.parse(c.replace(/^\s*]*>/,"").replace(/<\/pre>\s*$/,""))}catch(i){return null}return c},abort:function(){var t=this;l&&l.contentWindow&&(l.contentWindow.stop?l.contentWindow.stop():l.contentWindow.document.execCommand?l.contentWindow.document.execCommand("Stop"):l.src="about:blank"),e.call(this,function(){t.dispatchEvent("abort")})},destroy:function(){this.getRuntime().getShim().removeInstance(this.uid)}})}return e.XMLHttpRequest=u}),n("moxie/runtime/html4/image/Image",["moxie/runtime/html4/Runtime","moxie/runtime/html5/image/Image"],function(e,t){return e.Image=t}),a(["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Dom","moxie/core/EventTarget","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/file/Blob","moxie/core/I18n","moxie/core/utils/Mime","moxie/file/FileInput","moxie/file/File","moxie/file/FileDrop","moxie/file/FileReader","moxie/core/utils/Url","moxie/runtime/RuntimeTarget","moxie/xhr/FormData","moxie/xhr/XMLHttpRequest","moxie/image/Image","moxie/core/utils/Events","moxie/runtime/html5/image/ResizerCanvas"])}(this)}); +!function(e,t){var i=function(){var e={};return t.apply(e,arguments),e.moxie};"function"==typeof define&&define.amd?define("moxie",[],i):"object"==typeof module&&module.exports?module.exports=i():e.moxie=i()}(this||window,function(){!function(e,t){"use strict";function i(e,t){for(var i,n=[],r=0;r0&&c(n,function(n,u){var c=-1!==h(e(n),["array","object"]);return n===r||t&&o[u]===r?!0:(c&&i&&(n=a(n)),e(o[u])===e(n)&&c?s(t,i,[o[u],n]):o[u]=n,void 0)})}),o}function u(e,t){function i(){this.constructor=e}for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.parent=t.prototype,e}function c(e,t){var i,n,r,o;if(e){try{i=e.length}catch(a){i=o}if(i===o||"number"!=typeof i){for(n in e)if(e.hasOwnProperty(n)&&t(e[n],n)===!1)return}else for(r=0;i>r;r++)if(t(e[r],r)===!1)return}}function l(t){var i;if(!t||"object"!==e(t))return!0;for(i in t)return!1;return!0}function d(t,i){function n(r){"function"===e(t[r])&&t[r](function(e){++ri;i++)if(t[i]===e)return i}return-1}function f(t,i){var n=[];"array"!==e(t)&&(t=[t]),"array"!==e(i)&&(i=[i]);for(var r in t)-1===h(t[r],i)&&n.push(t[r]);return n.length?n:!1}function p(e,t){var i=[];return c(e,function(e){-1!==h(e,t)&&i.push(e)}),i.length?i:null}function g(e){var t,i=[];for(t=0;ti;i++)n+=Math.floor(65535*Math.random()).toString(32);return(t||"o_")+n+(e++).toString(32)}}();return{guid:E,typeOf:e,extend:t,extendIf:i,extendImmutable:n,extendImmutableIf:r,clone:o,inherit:u,each:c,isEmptyObj:l,inSeries:d,inParallel:m,inArray:h,arrayDiff:f,arrayIntersect:p,toArray:g,trim:x,sprintf:w,parseSizeStr:v,delay:y}}),n("moxie/core/utils/Encode",[],function(){var e=function(e){return unescape(encodeURIComponent(e))},t=function(e){return decodeURIComponent(escape(e))},i=function(e,i){if("function"==typeof window.atob)return i?t(window.atob(e)):window.atob(e);var n,r,o,a,s,u,c,l,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",m=0,h=0,f="",p=[];if(!e)return e;e+="";do a=d.indexOf(e.charAt(m++)),s=d.indexOf(e.charAt(m++)),u=d.indexOf(e.charAt(m++)),c=d.indexOf(e.charAt(m++)),l=a<<18|s<<12|u<<6|c,n=255&l>>16,r=255&l>>8,o=255&l,p[h++]=64==u?String.fromCharCode(n):64==c?String.fromCharCode(n,r):String.fromCharCode(n,r,o);while(m>18,s=63&l>>12,u=63&l>>6,c=63&l,p[h++]=d.charAt(a)+d.charAt(s)+d.charAt(u)+d.charAt(c);while(mn;n++)if(e[n]!=t[n]){if(e[n]=u(e[n]),t[n]=u(t[n]),e[n]t[n]){o=1;break}}if(!i)return o;switch(i){case">":case"gt":return o>0;case">=":case"ge":return o>=0;case"<=":case"le":return 0>=o;case"==":case"=":case"eq":return 0===o;case"<>":case"!=":case"ne":return 0!==o;case"":case"<":case"lt":return 0>o;default:return null}}var n=function(e){var t="",i="?",n="function",r="undefined",o="object",a="name",s="version",u={has:function(e,t){return-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()}},c={rgx:function(){for(var t,i,a,s,u,c,l,d=0,m=arguments;d0?2==u.length?t[u[0]]=typeof u[1]==n?u[1].call(this,l):u[1]:3==u.length?t[u[0]]=typeof u[1]!==n||u[1].exec&&u[1].test?l?l.replace(u[1],u[2]):e:l?u[1].call(this,l,u[2]):e:4==u.length&&(t[u[0]]=l?u[3].call(this,l.replace(u[1],u[2])):e):t[u]=l?l:e;break}if(c)break}return t},str:function(t,n){for(var r in n)if(typeof n[r]===o&&n[r].length>0){for(var a=0;a=")),i.use_blob_uri},use_data_uri:function(){var e=new Image;return e.onload=function(){i.use_data_uri=1===e.width&&1===e.height},setTimeout(function(){e.src="data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=="},1),!1}(),use_data_uri_over32kb:function(){return i.use_data_uri&&("IE"!==a.browser||a.version>=9)},use_data_uri_of:function(e){return i.use_data_uri&&33e3>e||i.use_data_uri_over32kb()},use_fileinput:function(){if(navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\/(1.0|2.0|2.5|3.0))/))return!1;var e=document.createElement("input");return e.setAttribute("type","file"),i.use_fileinput=!e.disabled},use_webgl:function(){var e,n=document.createElement("canvas"),r=null;try{r=n.getContext("webgl")||n.getContext("experimental-webgl")}catch(o){}return r||(r=null),e=!!r,i.use_webgl=e,n=t,e}};return function(t){var n=[].slice.call(arguments);return n.shift(),"function"===e.typeOf(i[t])?i[t].apply(this,n):!!i[t]}}(),o=(new n).getResult(),a={can:r,uaParser:n,browser:o.browser.name,version:o.browser.version,os:o.os.name,osVersion:o.os.version,verComp:i,swf_url:"../flash/Moxie.swf",xap_url:"../silverlight/Moxie.xap",global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"};return a.OS=a.os,a}),n("moxie/core/Exceptions",["moxie/core/utils/Basic"],function(e){function t(e,t){var i;for(i in e)if(e[i]===t)return i;return null}return{RuntimeError:function(){function i(e,i){this.code=e,this.name=t(n,e),this.message=this.name+(i||": RuntimeError "+this.code)}var n={NOT_INIT_ERR:1,EXCEPTION_ERR:3,NOT_SUPPORTED_ERR:9,JS_ERR:4};return e.extend(i,n),i.prototype=Error.prototype,i}(),OperationNotAllowedException:function(){function t(e){this.code=e,this.name="OperationNotAllowedException"}return e.extend(t,{NOT_ALLOWED_ERR:1}),t.prototype=Error.prototype,t}(),ImageError:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": ImageError "+this.code}var n={WRONG_FORMAT:1,MAX_RESOLUTION_ERR:2,INVALID_META_ERR:3};return e.extend(i,n),i.prototype=Error.prototype,i}(),FileException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": FileException "+this.code}var n={NOT_FOUND_ERR:1,SECURITY_ERR:2,ABORT_ERR:3,NOT_READABLE_ERR:4,ENCODING_ERR:5,NO_MODIFICATION_ALLOWED_ERR:6,INVALID_STATE_ERR:7,SYNTAX_ERR:8};return e.extend(i,n),i.prototype=Error.prototype,i}(),DOMException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": DOMException "+this.code}var n={INDEX_SIZE_ERR:1,DOMSTRING_SIZE_ERR:2,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,INVALID_CHARACTER_ERR:5,NO_DATA_ALLOWED_ERR:6,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INUSE_ATTRIBUTE_ERR:10,INVALID_STATE_ERR:11,SYNTAX_ERR:12,INVALID_MODIFICATION_ERR:13,NAMESPACE_ERR:14,INVALID_ACCESS_ERR:15,VALIDATION_ERR:16,TYPE_MISMATCH_ERR:17,SECURITY_ERR:18,NETWORK_ERR:19,ABORT_ERR:20,URL_MISMATCH_ERR:21,QUOTA_EXCEEDED_ERR:22,TIMEOUT_ERR:23,INVALID_NODE_TYPE_ERR:24,DATA_CLONE_ERR:25};return e.extend(i,n),i.prototype=Error.prototype,i}(),EventException:function(){function t(e){this.code=e,this.name="EventException"}return e.extend(t,{UNSPECIFIED_EVENT_TYPE_ERR:0}),t.prototype=Error.prototype,t}()}}),n("moxie/core/utils/Dom",["moxie/core/utils/Env"],function(e){var t=function(e){return"string"!=typeof e?e:document.getElementById(e)},i=function(e,t){if(!e.className)return!1;var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");return i.test(e.className)},n=function(e,t){i(e,t)||(e.className=e.className?e.className.replace(/\s+$/,"")+" "+t:t)},r=function(e,t){if(e.className){var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");e.className=e.className.replace(i,function(e,t,i){return" "===t&&" "===i?" ":""})}},o=function(e,t){return e.currentStyle?e.currentStyle[t]:window.getComputedStyle?window.getComputedStyle(e,null)[t]:void 0},a=function(t,i){function n(e){var t,i,n=0,r=0;return e&&(i=e.getBoundingClientRect(),t="CSS1Compat"===c.compatMode?c.documentElement:c.body,n=i.left+t.scrollLeft,r=i.top+t.scrollTop),{x:n,y:r}}var r,o,a,s=0,u=0,c=document;if(t=t,i=i||c.body,t&&t.getBoundingClientRect&&"IE"===e.browser&&(!c.documentMode||c.documentMode<8))return o=n(t),a=n(i),{x:o.x-a.x,y:o.y-a.y};for(r=t;r&&r!=i&&r.nodeType;)s+=r.offsetLeft||0,u+=r.offsetTop||0,r=r.offsetParent;for(r=t.parentNode;r&&r!=i&&r.nodeType;)s-=r.scrollLeft||0,u-=r.scrollTop||0,r=r.parentNode;return{x:s,y:u}},s=function(e){return{w:e.offsetWidth||e.clientWidth,h:e.offsetHeight||e.clientHeight}};return{get:t,hasClass:i,addClass:n,removeClass:r,getStyle:o,getPos:a,getSize:s}}),n("moxie/core/EventTarget",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic"],function(e,t,i){function n(){this.uid=i.guid()}var r={};return i.extend(n.prototype,{init:function(){this.uid||(this.uid=i.guid("uid_"))},addEventListener:function(e,t,n,o){var a,s=this;return this.hasOwnProperty("uid")||(this.uid=i.guid("uid_")),e=i.trim(e),/\s/.test(e)?(i.each(e.split(/\s+/),function(e){s.addEventListener(e,t,n,o)}),void 0):(e=e.toLowerCase(),n=parseInt(n,10)||0,a=r[this.uid]&&r[this.uid][e]||[],a.push({fn:t,priority:n,scope:o||this}),r[this.uid]||(r[this.uid]={}),r[this.uid][e]=a,void 0)},hasEventListener:function(e){var t;return e?(e=e.toLowerCase(),t=r[this.uid]&&r[this.uid][e]):t=r[this.uid],t?t:!1},removeEventListener:function(e,t){var n,o,a=this;if(e=e.toLowerCase(),/\s/.test(e))return i.each(e.split(/\s+/),function(e){a.removeEventListener(e,t)}),void 0;if(n=r[this.uid]&&r[this.uid][e]){if(t){for(o=n.length-1;o>=0;o--)if(n[o].fn===t){n.splice(o,1);break}}else n=[];n.length||(delete r[this.uid][e],i.isEmptyObj(r[this.uid])&&delete r[this.uid])}},removeAllEventListeners:function(){r[this.uid]&&delete r[this.uid]},dispatchEvent:function(e){var n,o,a,s,u,c={},l=!0;if("string"!==i.typeOf(e)){if(s=e,"string"!==i.typeOf(s.type))throw new t.EventException(t.EventException.UNSPECIFIED_EVENT_TYPE_ERR);e=s.type,s.total!==u&&s.loaded!==u&&(c.total=s.total,c.loaded=s.loaded),c.async=s.async||!1}if(-1!==e.indexOf("::")?function(t){n=t[0],e=t[1]}(e.split("::")):n=this.uid,e=e.toLowerCase(),o=r[n]&&r[n][e]){o.sort(function(e,t){return t.priority-e.priority}),a=[].slice.call(arguments),a.shift(),c.type=e,a.unshift(c);var d=[];i.each(o,function(e){a[0].target=e.scope,c.async?d.push(function(t){setTimeout(function(){t(e.fn.apply(e.scope,a)===!1)},1)}):d.push(function(t){t(e.fn.apply(e.scope,a)===!1)})}),d.length&&i.inSeries(d,function(e){l=!e})}return l},bindOnce:function(e,t,i,n){var r=this;r.bind.call(this,e,function o(){return r.unbind(e,o),t.apply(this,arguments)},i,n)},bind:function(){this.addEventListener.apply(this,arguments)},unbind:function(){this.removeEventListener.apply(this,arguments)},unbindAll:function(){this.removeAllEventListeners.apply(this,arguments)},trigger:function(){return this.dispatchEvent.apply(this,arguments)},handleEventProps:function(e){var t=this;this.bind(e.join(" "),function(e){var t="on"+e.type.toLowerCase();"function"===i.typeOf(this[t])&&this[t].apply(this,arguments)}),i.each(e,function(e){e="on"+e.toLowerCase(e),"undefined"===i.typeOf(t[e])&&(t[e]=null)})}}),n.instance=new n,n}),n("moxie/runtime/Runtime",["moxie/core/utils/Env","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/EventTarget"],function(e,t,i,n){function r(e,n,o,s,u){var c,l=this,d=t.guid(n+"_"),m=u||"browser";e=e||{},a[d]=this,o=t.extend({access_binary:!1,access_image_binary:!1,display_media:!1,do_cors:!1,drag_and_drop:!1,filter_by_extension:!0,resize_image:!1,report_upload_progress:!1,return_response_headers:!1,return_response_type:!1,return_status_code:!0,send_custom_headers:!1,select_file:!1,select_folder:!1,select_multiple:!0,send_binary_string:!1,send_browser_cookies:!0,send_multipart:!0,slice_blob:!1,stream_upload:!1,summon_file_dialog:!1,upload_filesize:!0,use_http_method:!0},o),e.preferred_caps&&(m=r.getMode(s,e.preferred_caps,m)),c=function(){var e={};return{exec:function(t,i,n,r){return c[i]&&(e[t]||(e[t]={context:this,instance:new c[i]}),e[t].instance[n])?e[t].instance[n].apply(this,r):void 0},removeInstance:function(t){delete e[t]},removeAllInstances:function(){var i=this;t.each(e,function(e,n){"function"===t.typeOf(e.instance.destroy)&&e.instance.destroy.call(e.context),i.removeInstance(n)})}}}(),t.extend(this,{initialized:!1,uid:d,type:n,mode:r.getMode(s,e.required_caps,m),shimid:d+"_container",clients:0,options:e,can:function(e,i){var n=arguments[2]||o;if("string"===t.typeOf(e)&&"undefined"===t.typeOf(i)&&(e=r.parseCaps(e)),"object"===t.typeOf(e)){for(var a in e)if(!this.can(a,e[a],n))return!1;return!0}return"function"===t.typeOf(n[e])?n[e].call(this,i):i===n[e]},getShimContainer:function(){var e,n=i.get(this.shimid);return n||(e=i.get(this.options.container)||document.body,n=document.createElement("div"),n.id=this.shimid,n.className="moxie-shim moxie-shim-"+this.type,t.extend(n.style,{position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),e.appendChild(n),e=null),n},getShim:function(){return c},shimExec:function(e,t){var i=[].slice.call(arguments,2);return l.getShim().exec.call(this,this.uid,e,t,i)},exec:function(e,t){var i=[].slice.call(arguments,2);return l[e]&&l[e][t]?l[e][t].apply(this,i):l.shimExec.apply(this,arguments)},destroy:function(){if(l){var e=i.get(this.shimid);e&&e.parentNode.removeChild(e),c&&c.removeAllInstances(),this.unbindAll(),delete a[this.uid],this.uid=null,d=l=c=e=null}}}),this.mode&&e.required_caps&&!this.can(e.required_caps)&&(this.mode=!1)}var o={},a={};return r.order="html5,flash,silverlight,html4",r.getRuntime=function(e){return a[e]?a[e]:!1},r.addConstructor=function(e,t){t.prototype=n.instance,o[e]=t},r.getConstructor=function(e){return o[e]||null},r.getInfo=function(e){var t=r.getRuntime(e);return t?{uid:t.uid,type:t.type,mode:t.mode,can:function(){return t.can.apply(t,arguments)}}:null},r.parseCaps=function(e){var i={};return"string"!==t.typeOf(e)?e||{}:(t.each(e.split(","),function(e){i[e]=!0}),i)},r.can=function(e,t){var i,n,o=r.getConstructor(e);return o?(i=new o({required_caps:t}),n=i.mode,i.destroy(),!!n):!1},r.thatCan=function(e,t){var i=(t||r.order).split(/\s*,\s*/);for(var n in i)if(r.can(i[n],e))return i[n];return null},r.getMode=function(e,i,n){var r=null;if("undefined"===t.typeOf(n)&&(n="browser"),i&&!t.isEmptyObj(e)){if(t.each(i,function(i,n){if(e.hasOwnProperty(n)){var o=e[n](i);if("string"==typeof o&&(o=[o]),r){if(!(r=t.arrayIntersect(r,o)))return r=!1}else r=o}}),r)return-1!==t.inArray(n,r)?n:r[0];if(r===!1)return!1}return n},r.getGlobalEventTarget=function(){if(/^moxie\./.test(e.global_event_dispatcher)&&!e.can("access_global_ns")){var i=t.guid("moxie_event_target_");window[i]=function(e,t){n.instance.dispatchEvent(e,t)},e.global_event_dispatcher=i}return e.global_event_dispatcher},r.capTrue=function(){return!0},r.capFalse=function(){return!1},r.capTest=function(e){return function(){return!!e}},r}),n("moxie/runtime/RuntimeClient",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/Runtime"],function(e,t,i,n){return function(){var e;i.extend(this,{connectRuntime:function(r){function o(i){var a,u;return i.length?(a=i.shift().toLowerCase(),(u=n.getConstructor(a))?(e=new u(r),e.bind("Init",function(){e.initialized=!0,setTimeout(function(){e.clients++,s.ruid=e.uid,s.trigger("RuntimeInit",e)},1)}),e.bind("Error",function(){e.destroy(),o(i)}),e.bind("Exception",function(e,i){var n=i.name+"(#"+i.code+")"+(i.message?", from: "+i.message:"");s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.EXCEPTION_ERR,n))}),e.mode?(e.init(),void 0):(e.trigger("Error"),void 0)):(o(i),void 0)):(s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)),e=null,void 0)}var a,s=this;if("string"===i.typeOf(r)?a=r:"string"===i.typeOf(r.ruid)&&(a=r.ruid),a){if(e=n.getRuntime(a))return s.ruid=a,e.clients++,e;throw new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)}o((r.runtime_order||n.order).split(/\s*,\s*/))},disconnectRuntime:function(){e&&--e.clients<=0&&e.destroy(),e=null},getRuntime:function(){return e&&e.uid?e:e=null},exec:function(){return e?e.exec.apply(this,arguments):null},can:function(t){return e?e.can(t):!1}})}}),n("moxie/file/Blob",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient"],function(e,t,i){function n(o,a){function s(t,i,o){var a,s=r[this.uid];return"string"===e.typeOf(s)&&s.length?(a=new n(null,{type:o,size:i-t}),a.detach(s.substr(t,a.size)),a):null}i.call(this),o&&this.connectRuntime(o),a?"string"===e.typeOf(a)&&(a={data:a}):a={},e.extend(this,{uid:a.uid||e.guid("uid_"),ruid:o,size:a.size||0,type:a.type||"",slice:function(e,t,i){return this.isDetached()?s.apply(this,arguments):this.getRuntime().exec.call(this,"Blob","slice",this.getSource(),e,t,i)},getSource:function(){return r[this.uid]?r[this.uid]:null},detach:function(e){if(this.ruid&&(this.getRuntime().exec.call(this,"Blob","destroy"),this.disconnectRuntime(),this.ruid=null),e=e||"","data:"==e.substr(0,5)){var i=e.indexOf(";base64,");this.type=e.substring(5,i),e=t.atob(e.substring(i+8))}this.size=e.length,r[this.uid]=e},isDetached:function(){return!this.ruid&&"string"===e.typeOf(r[this.uid])},destroy:function(){this.detach(),delete r[this.uid]}}),a.data?this.detach(a.data):r[this.uid]=a}var r={};return n}),n("moxie/core/I18n",["moxie/core/utils/Basic"],function(e){var t={};return{addI18n:function(i){return e.extend(t,i)},translate:function(e){return t[e]||e},_:function(e){return this.translate(e)},sprintf:function(t){var i=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=i.shift();return"undefined"!==e.typeOf(t)?t:""})}}}),n("moxie/core/utils/Mime",["moxie/core/utils/Basic","moxie/core/I18n"],function(e,t){var i="application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb xlt xla,application/vnd.ms-powerpoint,ppt pps pot ppa,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,application/vnd.openxmlformats-officedocument.presentationml.template,potx,application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,application/x-javascript,js,application/json,json,audio/mpeg,mp3 mpga mpega mp2,audio/x-wav,wav,audio/x-m4a,m4a,audio/ogg,oga ogg,audio/aiff,aiff aif,audio/flac,flac,audio/aac,aac,audio/ac3,ac3,audio/x-ms-wma,wma,image/bmp,bmp,image/gif,gif,image/jpeg,jpg jpeg jpe,image/photoshop,psd,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/plain,asc txt text diff log,text/html,htm html xhtml,text/css,css,text/csv,csv,text/rtf,rtf,video/mpeg,mpeg mpg mpe m2v,video/quicktime,qt mov,video/mp4,mp4,video/x-m4v,m4v,video/x-flv,flv,video/x-ms-wmv,wmv,video/avi,avi,video/webm,webm,video/3gpp,3gpp 3gp,video/3gpp2,3g2,video/vnd.rn-realvideo,rv,video/ogg,ogv,video/x-matroska,mkv,application/vnd.oasis.opendocument.formula-template,otf,application/octet-stream,exe",n={},r={},o=function(e){var t,i,o,a=e.split(/,/);for(t=0;ta;a++)o+=String.fromCharCode(r[a]);return o}}t.call(this),e.extend(this,{uid:e.guid("uid_"),readAsBinaryString:function(e){return n.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){return n.call(this,"readAsDataURL",e)},readAsText:function(e){return n.call(this,"readAsText",e)}})}}),n("moxie/xhr/FormData",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/file/Blob"],function(e,t,i){function n(){var e,n=[];t.extend(this,{append:function(r,o){var a=this,s=t.typeOf(o);o instanceof i?e={name:r,value:o}:"array"===s?(r+="[]",t.each(o,function(e){a.append(r,e)})):"object"===s?t.each(o,function(e,t){a.append(r+"["+t+"]",e)}):"null"===s||"undefined"===s||"number"===s&&isNaN(o)?a.append(r,"false"):n.push({name:r,value:o.toString()})},hasBlob:function(){return!!this.getBlob()},getBlob:function(){return e&&e.value||null},getBlobName:function(){return e&&e.name||null},each:function(i){t.each(n,function(e){i(e.value,e.name)}),e&&i(e.value,e.name)},destroy:function(){e=null,n=[]}})}return n}),n("moxie/xhr/XMLHttpRequest",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/utils/Encode","moxie/core/utils/Url","moxie/runtime/Runtime","moxie/runtime/RuntimeTarget","moxie/file/Blob","moxie/file/FileReaderSync","moxie/xhr/FormData","moxie/core/utils/Env","moxie/core/utils/Mime"],function(e,t,i,n,r,o,a,s,u,c,l,d){function m(){this.uid=e.guid("uid_")}function h(){function i(e,t){return I.hasOwnProperty(e)?1===arguments.length?l.can("define_property")?I[e]:A[e]:(l.can("define_property")?I[e]=t:A[e]=t,void 0):void 0}function u(t){function n(){_&&(_.destroy(),_=null),s.dispatchEvent("loadend"),s=null}function r(r){_.bind("LoadStart",function(e){i("readyState",h.LOADING),s.dispatchEvent("readystatechange"),s.dispatchEvent(e),L&&s.upload.dispatchEvent(e)}),_.bind("Progress",function(e){i("readyState")!==h.LOADING&&(i("readyState",h.LOADING),s.dispatchEvent("readystatechange")),s.dispatchEvent(e)}),_.bind("UploadProgress",function(e){L&&s.upload.dispatchEvent({type:"progress",lengthComputable:!1,total:e.total,loaded:e.loaded})}),_.bind("Load",function(t){i("readyState",h.DONE),i("status",Number(r.exec.call(_,"XMLHttpRequest","getStatus")||0)),i("statusText",f[i("status")]||""),i("response",r.exec.call(_,"XMLHttpRequest","getResponse",i("responseType"))),~e.inArray(i("responseType"),["text",""])?i("responseText",i("response")):"document"===i("responseType")&&i("responseXML",i("response")),U=r.exec.call(_,"XMLHttpRequest","getAllResponseHeaders"),s.dispatchEvent("readystatechange"),i("status")>0?(L&&s.upload.dispatchEvent(t),s.dispatchEvent(t)):(F=!0,s.dispatchEvent("error")),n()}),_.bind("Abort",function(e){s.dispatchEvent(e),n()}),_.bind("Error",function(e){F=!0,i("readyState",h.DONE),s.dispatchEvent("readystatechange"),M=!0,s.dispatchEvent(e),n()}),r.exec.call(_,"XMLHttpRequest","send",{url:x,method:v,async:T,user:w,password:y,headers:S,mimeType:D,encoding:O,responseType:s.responseType,withCredentials:s.withCredentials,options:k},t)}var s=this;E=(new Date).getTime(),_=new a,"string"==typeof k.required_caps&&(k.required_caps=o.parseCaps(k.required_caps)),k.required_caps=e.extend({},k.required_caps,{return_response_type:s.responseType}),t instanceof c&&(k.required_caps.send_multipart=!0),e.isEmptyObj(S)||(k.required_caps.send_custom_headers=!0),B||(k.required_caps.do_cors=!0),k.ruid?r(_.connectRuntime(k)):(_.bind("RuntimeInit",function(e,t){r(t)}),_.bind("RuntimeError",function(e,t){s.dispatchEvent("RuntimeError",t)}),_.connectRuntime(k))}function g(){i("responseText",""),i("responseXML",null),i("response",null),i("status",0),i("statusText",""),E=b=null}var x,v,w,y,E,b,_,R,A=this,I={timeout:0,readyState:h.UNSENT,withCredentials:!1,status:0,statusText:"",responseType:"",responseXML:null,responseText:null,response:null},T=!0,S={},O=null,D=null,N=!1,C=!1,L=!1,M=!1,F=!1,B=!1,P=null,H=null,k={},U="";e.extend(this,I,{uid:e.guid("uid_"),upload:new m,open:function(o,a,s,u,c){var l;if(!o||!a)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(/[\u0100-\uffff]/.test(o)||n.utf8_encode(o)!==o)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(~e.inArray(o.toUpperCase(),["CONNECT","DELETE","GET","HEAD","OPTIONS","POST","PUT","TRACE","TRACK"])&&(v=o.toUpperCase()),~e.inArray(v,["CONNECT","TRACE","TRACK"]))throw new t.DOMException(t.DOMException.SECURITY_ERR);if(a=n.utf8_encode(a),l=r.parseUrl(a),B=r.hasSameOrigin(l),x=r.resolveUrl(a),(u||c)&&!B)throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);if(w=u||l.user,y=c||l.pass,T=s||!0,T===!1&&(i("timeout")||i("withCredentials")||""!==i("responseType")))throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);N=!T,C=!1,S={},g.call(this),i("readyState",h.OPENED),this.dispatchEvent("readystatechange")},setRequestHeader:function(r,o){var a=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","content-transfer-encoding","date","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"];if(i("readyState")!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(/[\u0100-\uffff]/.test(r)||n.utf8_encode(r)!==r)throw new t.DOMException(t.DOMException.SYNTAX_ERR);return r=e.trim(r).toLowerCase(),~e.inArray(r,a)||/^(proxy\-|sec\-)/.test(r)?!1:(S[r]?S[r]+=", "+o:S[r]=o,!0)},hasRequestHeader:function(e){return e&&S[e.toLowerCase()]||!1},getAllResponseHeaders:function(){return U||""},getResponseHeader:function(t){return t=t.toLowerCase(),F||~e.inArray(t,["set-cookie","set-cookie2"])?null:U&&""!==U&&(R||(R={},e.each(U.split(/\r\n/),function(t){var i=t.split(/:\s+/);2===i.length&&(i[0]=e.trim(i[0]),R[i[0].toLowerCase()]={header:i[0],value:e.trim(i[1])})})),R.hasOwnProperty(t))?R[t].header+": "+R[t].value:null},overrideMimeType:function(n){var r,o;if(~e.inArray(i("readyState"),[h.LOADING,h.DONE]))throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(n=e.trim(n.toLowerCase()),/;/.test(n)&&(r=n.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))&&(n=r[1],r[2]&&(o=r[2])),!d.mimes[n])throw new t.DOMException(t.DOMException.SYNTAX_ERR);P=n,H=o},send:function(i,r){if(k="string"===e.typeOf(r)?{ruid:r}:r?r:{},this.readyState!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(i instanceof s)k.ruid=i.ruid,D=i.type||"application/octet-stream";else if(i instanceof c){if(i.hasBlob()){var o=i.getBlob();k.ruid=o.ruid,D=o.type||"application/octet-stream"}}else"string"==typeof i&&(O="UTF-8",D="text/plain;charset=UTF-8",i=n.utf8_encode(i));this.withCredentials||(this.withCredentials=k.required_caps&&k.required_caps.send_browser_cookies&&!B),L=!N&&this.upload.hasEventListener(),F=!1,M=!i,N||(C=!0),u.call(this,i)},abort:function(){if(F=!0,N=!1,~e.inArray(i("readyState"),[h.UNSENT,h.OPENED,h.DONE]))i("readyState",h.UNSENT);else{if(i("readyState",h.DONE),C=!1,!_)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);_.getRuntime().exec.call(_,"XMLHttpRequest","abort",M),M=!0}},destroy:function(){_&&("function"===e.typeOf(_.destroy)&&_.destroy(),_=null),this.unbindAll(),this.upload&&(this.upload.unbindAll(),this.upload=null)}}),this.handleEventProps(p.concat(["readystatechange"])),this.upload.handleEventProps(p)}var f={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",306:"Reserved",307:"Temporary Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",426:"Upgrade Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",510:"Not Extended"};m.prototype=i.instance;var p=["loadstart","progress","abort","error","load","timeout","loadend"];return h.UNSENT=0,h.OPENED=1,h.HEADERS_RECEIVED=2,h.LOADING=3,h.DONE=4,h.prototype=i.instance,h}),n("moxie/runtime/Transporter",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(e,t,i,n){function r(){function n(){l=d=0,c=this.result=null}function o(t,i){var n=this;u=i,n.bind("TransportingProgress",function(t){d=t.loaded,l>d&&-1===e.inArray(n.state,[r.IDLE,r.DONE])&&a.call(n)},999),n.bind("TransportingComplete",function(){d=l,n.state=r.DONE,c=null,n.result=u.exec.call(n,"Transporter","getAsBlob",t||"")},999),n.state=r.BUSY,n.trigger("TransportingStarted"),a.call(n)}function a(){var e,i=this,n=l-d;m>n&&(m=n),e=t.btoa(c.substr(d,m)),u.exec.call(i,"Transporter","receive",e,l)}var s,u,c,l,d,m;i.call(this),e.extend(this,{uid:e.guid("uid_"),state:r.IDLE,result:null,transport:function(t,i,r){var a=this;if(r=e.extend({chunk_size:204798},r),(s=r.chunk_size%3)&&(r.chunk_size+=3-s),m=r.chunk_size,n.call(this),c=t,l=t.length,"string"===e.typeOf(r)||r.ruid)o.call(a,i,this.connectRuntime(r));else{var u=function(e,t){a.unbind("RuntimeInit",u),o.call(a,i,t)};this.bind("RuntimeInit",u),this.connectRuntime(r)}},abort:function(){var e=this;e.state=r.IDLE,u&&(u.exec.call(e,"Transporter","clear"),e.trigger("TransportingAborted")),n.call(e)},destroy:function(){this.unbindAll(),u=null,this.disconnectRuntime(),n.call(this)}})}return r.IDLE=0,r.BUSY=1,r.DONE=2,r.prototype=n.instance,r}),n("moxie/image/Image",["moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/file/FileReaderSync","moxie/xhr/XMLHttpRequest","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/runtime/Transporter","moxie/core/utils/Env","moxie/core/EventTarget","moxie/file/Blob","moxie/file/File","moxie/core/utils/Encode"],function(e,t,i,n,r,o,a,s,u,c,l,d,m){function h(){function n(e){try{return e||(e=this.exec("Image","getInfo")),this.size=e.size,this.width=e.width,this.height=e.height,this.type=e.type,this.meta=e.meta,""===this.name&&(this.name=e.name),!0}catch(t){return this.trigger("error",t.code),!1}}function c(t){var n=e.typeOf(t);try{if(t instanceof h){if(!t.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);p.apply(this,arguments)}else if(t instanceof l){if(!~e.inArray(t.type,["image/jpeg","image/png"]))throw new i.ImageError(i.ImageError.WRONG_FORMAT);g.apply(this,arguments)}else if(-1!==e.inArray(n,["blob","file"]))c.call(this,new d(null,t),arguments[1]);else if("string"===n)"data:"===t.substr(0,5)?c.call(this,new l(null,{data:t}),arguments[1]):x.apply(this,arguments);else{if("node"!==n||"img"!==t.nodeName.toLowerCase())throw new i.DOMException(i.DOMException.TYPE_MISMATCH_ERR);c.call(this,t.src,arguments[1])}}catch(r){this.trigger("error",r.code)}}function p(t,i){var n=this.connectRuntime(t.ruid);this.ruid=n.uid,n.exec.call(this,"Image","loadFromImage",t,"undefined"===e.typeOf(i)?!0:i)}function g(t,i){function n(e){r.ruid=e.uid,e.exec.call(r,"Image","loadFromBlob",t)}var r=this;r.name=t.name||"",t.isDetached()?(this.bind("RuntimeInit",function(e,t){n(t)}),i&&"string"==typeof i.required_caps&&(i.required_caps=o.parseCaps(i.required_caps)),this.connectRuntime(e.extend({required_caps:{access_image_binary:!0,resize_image:!0}},i))):n(this.connectRuntime(t.ruid))}function x(e,t){var i,n=this;i=new r,i.open("get",e),i.responseType="blob",i.onprogress=function(e){n.trigger(e)},i.onload=function(){g.call(n,i.response,!0)},i.onerror=function(e){n.trigger(e)},i.onloadend=function(){i.destroy()},i.bind("RuntimeError",function(e,t){n.trigger("RuntimeError",t)}),i.send(null,t)}a.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,name:"",size:0,width:0,height:0,type:"",meta:{},clone:function(){this.load.apply(this,arguments)},load:function(){c.apply(this,arguments)},resize:function(t){var n,r,o=this,a={x:0,y:0,width:o.width,height:o.height},s=e.extendIf({width:o.width,height:o.height,type:o.type||"image/jpeg",quality:90,crop:!1,fit:!0,preserveHeaders:!0,resample:"default",multipass:!0},t);try{if(!o.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);if(o.width>h.MAX_RESIZE_WIDTH||o.height>h.MAX_RESIZE_HEIGHT)throw new i.ImageError(i.ImageError.MAX_RESOLUTION_ERR);if(n=o.meta&&o.meta.tiff&&o.meta.tiff.Orientation||1,-1!==e.inArray(n,[5,6,7,8])){var u=s.width;s.width=s.height,s.height=u}if(s.crop){switch(r=Math.max(s.width/o.width,s.height/o.height),t.fit?(a.width=Math.min(Math.ceil(s.width/r),o.width),a.height=Math.min(Math.ceil(s.height/r),o.height),r=s.width/a.width):(a.width=Math.min(s.width,o.width),a.height=Math.min(s.height,o.height),r=1),"boolean"==typeof s.crop&&(s.crop="cc"),s.crop.toLowerCase().replace(/_/,"-")){case"rb":case"right-bottom":a.x=o.width-a.width,a.y=o.height-a.height;break;case"cb":case"center-bottom":a.x=Math.floor((o.width-a.width)/2),a.y=o.height-a.height;break;case"lb":case"left-bottom":a.x=0,a.y=o.height-a.height;break;case"lt":case"left-top":a.x=0,a.y=0;break;case"ct":case"center-top":a.x=Math.floor((o.width-a.width)/2),a.y=0;break;case"rt":case"right-top":a.x=o.width-a.width,a.y=0;break;case"rc":case"right-center":case"right-middle":a.x=o.width-a.width,a.y=Math.floor((o.height-a.height)/2);break;case"lc":case"left-center":case"left-middle":a.x=0,a.y=Math.floor((o.height-a.height)/2);break;case"cc":case"center-center":case"center-middle":default:a.x=Math.floor((o.width-a.width)/2),a.y=Math.floor((o.height-a.height)/2)}a.x=Math.max(a.x,0),a.y=Math.max(a.y,0)}else r=Math.min(s.width/o.width,s.height/o.height),r>1&&!s.fit&&(r=1);this.exec("Image","resize",a,r,s)}catch(c){o.trigger("error",c.code)}},downsize:function(t){var i,n={width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,crop:!1,fit:!1,preserveHeaders:!0,resample:"default"};i="object"==typeof t?e.extend(n,t):e.extend(n,{width:arguments[0],height:arguments[1],crop:arguments[2],preserveHeaders:arguments[3]}),this.resize(i)},crop:function(e,t,i){this.downsize(e,t,!0,i)},getAsCanvas:function(){if(!u.can("create_canvas"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);return this.exec("Image","getAsCanvas")},getAsBlob:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsBlob",e||"image/jpeg",t||90)},getAsDataURL:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsDataURL",e||"image/jpeg",t||90)},getAsBinaryString:function(e,t){var i=this.getAsDataURL(e,t);return m.atob(i.substring(i.indexOf("base64,")+7))},embed:function(n,r){function o(t,r){var o=this;if(u.can("create_canvas")){var l=o.getAsCanvas();if(l)return n.appendChild(l),l=null,o.destroy(),c.trigger("embedded"),void 0}var d=o.getAsDataURL(t,r);if(!d)throw new i.ImageError(i.ImageError.WRONG_FORMAT);if(u.can("use_data_uri_of",d.length))n.innerHTML='',o.destroy(),c.trigger("embedded");else{var h=new s;h.bind("TransportingComplete",function(){a=c.connectRuntime(this.result.ruid),c.bind("Embedded",function(){e.extend(a.getShimContainer().style,{top:"0px",left:"0px",width:o.width+"px",height:o.height+"px"}),a=null},999),a.exec.call(c,"ImageView","display",this.result.uid,width,height),o.destroy()}),h.transport(m.atob(d.substring(d.indexOf("base64,")+7)),t,{required_caps:{display_media:!0},runtime_order:"flash,silverlight",container:n})}}var a,c=this,l=e.extend({width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,fit:!0,resample:"nearest"},r);try{if(!(n=t.get(n)))throw new i.DOMException(i.DOMException.INVALID_NODE_TYPE_ERR);if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);this.width>h.MAX_RESIZE_WIDTH||this.height>h.MAX_RESIZE_HEIGHT;var d=new h;return d.bind("Resize",function(){o.call(this,l.type,l.quality)}),d.bind("Load",function(){this.downsize(l)}),this.meta.thumb&&this.meta.thumb.width>=l.width&&this.meta.thumb.height>=l.height?d.load(this.meta.thumb.data):d.clone(this,!1),d}catch(f){this.trigger("error",f.code)}},destroy:function(){this.ruid&&(this.getRuntime().exec.call(this,"Image","destroy"),this.disconnectRuntime()),this.meta&&this.meta.thumb&&this.meta.thumb.data.destroy(),this.unbindAll()}}),this.handleEventProps(f),this.bind("Load Resize",function(){return n.call(this)},999)}var f=["progress","load","error","resize","embedded"];return h.MAX_RESIZE_WIDTH=8192,h.MAX_RESIZE_HEIGHT=8192,h.prototype=c.instance,h}),n("moxie/runtime/html5/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue,l=e.extend({access_binary:u(window.FileReader||window.File&&window.File.getAsDataURL),access_image_binary:function(){return o.can("access_binary")&&!!s.Image},display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:u(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest),drag_and_drop:u(function(){var e=document.createElement("div");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&("IE"!==n.browser||n.verComp(n.version,9,">"))}()),filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),return_response_headers:c,return_response_type:function(e){return"json"===e&&window.JSON?!0:n.can("return_response_type",e)},return_status_code:c,report_upload_progress:u(window.XMLHttpRequest&&(new XMLHttpRequest).upload),resize_image:function(){return o.can("access_binary")&&n.can("create_canvas")},select_file:function(){return n.can("use_fileinput")&&window.File},select_folder:function(){return o.can("select_file")&&("Chrome"===n.browser&&n.verComp(n.version,21,">=")||"Firefox"===n.browser&&n.verComp(n.version,42,">="))},select_multiple:function(){return!(!o.can("select_file")||"Safari"===n.browser&&"Windows"===n.os||"iOS"===n.os&&n.verComp(n.osVersion,"7.0.0",">")&&n.verComp(n.osVersion,"8.0.0","<"))},send_binary_string:u(window.XMLHttpRequest&&((new XMLHttpRequest).sendAsBinary||window.Uint8Array&&window.ArrayBuffer)),send_custom_headers:u(window.XMLHttpRequest),send_multipart:function(){return!!(window.XMLHttpRequest&&(new XMLHttpRequest).upload&&window.FormData)||o.can("send_binary_string")},slice_blob:u(window.File&&(File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice)),stream_upload:function(){return o.can("slice_blob")&&o.can("send_multipart")},summon_file_dialog:function(){return o.can("select_file")&&!("Firefox"===n.browser&&n.verComp(n.version,4,"<")||"Opera"===n.browser&&n.verComp(n.version,12,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<"))},upload_filesize:c,use_http_method:c},arguments[2]);i.call(this,t,arguments[1]||a,l),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html5",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html5/file/Blob",["moxie/runtime/html5/Runtime","moxie/file/Blob"],function(e,t){function i(){function e(e,t,i){var n;if(!window.File.prototype.slice)return(n=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)?n.call(e,t,i):null;try{return e.slice(),e.slice(t,i)}catch(r){return e.slice(t,i-t)}}this.slice=function(){return new t(this.getRuntime().uid,e.apply(this,arguments))},this.destroy=function(){this.getRuntime().getShim().removeInstance(this.uid)}}return e.Blob=i}),n("moxie/core/utils/Events",["moxie/core/utils/Basic"],function(e){function t(){this.returnValue=!1}function i(){this.cancelBubble=!0}var n={},r="moxie_"+e.guid(),o=function(o,a,s,u){var c,l;a=a.toLowerCase(),o.addEventListener?(c=s,o.addEventListener(a,c,!1)):o.attachEvent&&(c=function(){var e=window.event;e.target||(e.target=e.srcElement),e.preventDefault=t,e.stopPropagation=i,s(e)},o.attachEvent("on"+a,c)),o[r]||(o[r]=e.guid()),n.hasOwnProperty(o[r])||(n[o[r]]={}),l=n[o[r]],l.hasOwnProperty(a)||(l[a]=[]),l[a].push({func:c,orig:s,key:u})},a=function(t,i,o){var a,s;if(i=i.toLowerCase(),t[r]&&n[t[r]]&&n[t[r]][i]){a=n[t[r]][i];for(var u=a.length-1;u>=0&&(a[u].orig!==o&&a[u].key!==o||(t.removeEventListener?t.removeEventListener(i,a[u].func,!1):t.detachEvent&&t.detachEvent("on"+i,a[u].func),a[u].orig=null,a[u].func=null,a.splice(u,1),o===s));u--);if(a.length||delete n[t[r]][i],e.isEmptyObj(n[t[r]])){delete n[t[r]];try{delete t[r]}catch(c){t[r]=s}}}},s=function(t,i){t&&t[r]&&e.each(n[t[r]],function(e,n){a(t,n,i)})};return{addEvent:o,removeEvent:a,removeAllEvents:s}}),n("moxie/runtime/html5/file/FileInput",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){var e,s;i.extend(this,{init:function(u){var c,l,d,m,h,f,p=this,g=p.getRuntime();e=u,d=o.extList2mimes(e.accept,g.can("filter_by_extension")),l=g.getShimContainer(),l.innerHTML='",c=n.get(g.uid),i.extend(c.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),m=n.get(e.browse_button),s=n.getStyle(m,"z-index")||"auto",g.can("summon_file_dialog")&&("static"===n.getStyle(m,"position")&&(m.style.position="relative"),r.addEvent(m,"click",function(e){var t=n.get(g.uid);t&&!t.disabled&&t.click(),e.preventDefault()},p.uid),p.bind("Refresh",function(){h=parseInt(s,10)||1,n.get(e.browse_button).style.zIndex=h,this.getRuntime().getShimContainer().style.zIndex=h-1})),f=g.can("summon_file_dialog")?m:l,r.addEvent(f,"mouseover",function(){p.trigger("mouseenter")},p.uid),r.addEvent(f,"mouseout",function(){p.trigger("mouseleave")},p.uid),r.addEvent(f,"mousedown",function(){p.trigger("mousedown")},p.uid),r.addEvent(n.get(e.container),"mouseup",function(){p.trigger("mouseup")},p.uid),(g.can("summon_file_dialog")?c:m).setAttribute("tabindex",-1),c.onchange=function x(){if(p.files=[],i.each(this.files,function(i){var n="";return e.directory&&"."==i.name?!0:(i.webkitRelativePath&&(n="/"+i.webkitRelativePath.replace(/^\//,"")),i=new t(g.uid,i),i.relativePath=n,p.files.push(i),void 0)}),"IE"!==a.browser&&"IEMobile"!==a.browser)this.value="";else{var n=this.cloneNode(!0);this.parentNode.replaceChild(n,this),n.onchange=x}p.files.length&&p.trigger("change")},p.trigger({type:"ready",async:!0}),l=null},setOption:function(e,t){var i=this.getRuntime(),r=n.get(i.uid);switch(e){case"accept":if(t){var a=t.mimes||o.extList2mimes(t,i.can("filter_by_extension"));r.setAttribute("accept",a.join(","))}else r.removeAttribute("accept");break;case"directory":t&&i.can("select_folder")?(r.setAttribute("directory",""),r.setAttribute("webkitdirectory","")):(r.removeAttribute("directory"),r.removeAttribute("webkitdirectory"));break;case"multiple":t&&i.can("select_multiple")?r.setAttribute("multiple",""):r.removeAttribute("multiple")}},disable:function(e){var t,i=this.getRuntime();(t=n.get(i.uid))&&(t.disabled=!!e)},destroy:function(){var t=this.getRuntime(),i=t.getShim(),o=t.getShimContainer(),a=e&&n.get(e.container),u=e&&n.get(e.browse_button);a&&r.removeAllEvents(a,this.uid),u&&(r.removeAllEvents(u,this.uid),u.style.zIndex=s),o&&(r.removeAllEvents(o,this.uid),o.innerHTML=""),i.removeInstance(this.uid),e=o=a=u=i=null}})}return e.FileInput=s}),n("moxie/runtime/html5/file/FileDrop",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime"],function(e,t,i,n,r,o){function a(){function e(e){if(!e.dataTransfer||!e.dataTransfer.types)return!1;var t=i.toArray(e.dataTransfer.types||[]);return-1!==i.inArray("Files",t)||-1!==i.inArray("public.file-url",t)||-1!==i.inArray("application/x-moz-file",t)}function a(e,i){if(u(e)){var n=new t(f,e);n.relativePath=i||"",p.push(n)}}function s(e){for(var t=[],n=0;n=")&&u.verComp(u.version,7,"<"),f="Android Browser"===u.browser,p=!1;if(h=i.url.replace(/^.+?\/([\w\-\.]+)$/,"$1").toLowerCase(),m=c(),m.open(i.method,i.url,i.async,i.user,i.password),r instanceof o)r.isDetached()&&(p=!0),r=r.getSource();else if(r instanceof a){if(r.hasBlob())if(r.getBlob().isDetached())r=d.call(s,r),p=!0;else if((l||f)&&"blob"===t.typeOf(r.getBlob().getSource())&&window.FileReader)return e.call(s,i,r),void 0;if(r instanceof a){var g=new window.FormData;r.each(function(e,t){e instanceof o?g.append(t,e.getSource()):g.append(t,e)}),r=g}}m.upload?(i.withCredentials&&(m.withCredentials=!0),m.addEventListener("load",function(e){s.trigger(e)}),m.addEventListener("error",function(e){s.trigger(e)}),m.addEventListener("progress",function(e){s.trigger(e)}),m.upload.addEventListener("progress",function(e){s.trigger({type:"UploadProgress",loaded:e.loaded,total:e.total})})):m.onreadystatechange=function(){switch(m.readyState){case 1:break;case 2:break;case 3:var e,t;try{n.hasSameOrigin(i.url)&&(e=m.getResponseHeader("Content-Length")||0),m.responseText&&(t=m.responseText.length)}catch(r){e=t=0}s.trigger({type:"progress",lengthComputable:!!e,total:parseInt(e,10),loaded:t});break;case 4:m.onreadystatechange=function(){};try{if(m.status>=200&&m.status<400){s.trigger("load");break}}catch(r){}s.trigger("error")}},t.isEmptyObj(i.headers)||t.each(i.headers,function(e,t){m.setRequestHeader(t,e)}),""!==i.responseType&&"responseType"in m&&(m.responseType="json"!==i.responseType||u.can("return_response_type","json")?i.responseType:"text"),p?m.sendAsBinary?m.sendAsBinary(r):function(){for(var e=new Uint8Array(r.length),t=0;t0&&o.set(new Uint8Array(t.slice(0,e)),0),o.set(new Uint8Array(r),e),o.set(new Uint8Array(t.slice(e+n)),e+r.byteLength),this.clear(),t=o.buffer,i=new DataView(t);break}default:return t}},length:function(){return t?t.byteLength:0},clear:function(){i=t=null}})}function n(t){function i(e,i,n){n=3===arguments.length?n:t.length-i-1,t=t.substr(0,i)+e+t.substr(n+i)}e.extend(this,{readByteAt:function(e){return t.charCodeAt(e)},writeByteAt:function(e,t){i(String.fromCharCode(t),e,1)},SEGMENT:function(e,n,r){switch(arguments.length){case 1:return t.substr(e);case 2:return t.substr(e,n);case 3:i(null!==r?r:"",e,n);break;default:return t}},length:function(){return t?t.length:0},clear:function(){t=null}})}return e.extend(t.prototype,{littleEndian:!1,read:function(e,t){var i,n,r;if(e+t>this.length())throw new Error("You are trying to read outside the source boundaries.");for(n=this.littleEndian?0:-8*(t-1),r=0,i=0;t>r;r++)i|=this.readByteAt(e+r)<this.length())throw new Error("You are trying to write outside the source boundaries.");for(n=this.littleEndian?0:-8*(i-1),r=0;i>r;r++)this.writeByteAt(e+r,255&t>>Math.abs(n+8*r))},BYTE:function(e){return this.read(e,1)},SHORT:function(e){return this.read(e,2)},LONG:function(e){return this.read(e,4)},SLONG:function(e){var t=this.read(e,4);return t>2147483647?t-4294967296:t},CHAR:function(e){return String.fromCharCode(this.read(e,1))},STRING:function(e,t){return this.asArray("CHAR",e,t).join("")},asArray:function(e,t,i){for(var n=[],r=0;i>r;r++)n[r]=this[e](t+r);return n}}),t}),n("moxie/runtime/html5/image/JPEGHeaders",["moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,t){return function i(n){var r,o,a,s=[],u=0;if(r=new e(n),65496!==r.SHORT(0))throw r.clear(),new t.ImageError(t.ImageError.WRONG_FORMAT);for(o=2;o<=r.length();)if(a=r.SHORT(o),a>=65488&&65495>=a)o+=2;else{if(65498===a||65497===a)break;u=r.SHORT(o+2)+2,a>=65505&&65519>=a&&s.push({hex:a,name:"APP"+(15&a),start:o,length:u,segment:r.SEGMENT(o,u)}),o+=u}return r.clear(),{headers:s,restore:function(t){var i,n,r;for(r=new e(t),o=65504==r.SHORT(2)?4+r.SHORT(4):2,n=0,i=s.length;i>n;n++)r.SEGMENT(o,0,s[n].segment),o+=s[n].length;return t=r.SEGMENT(),r.clear(),t},strip:function(t){var n,r,o,a;for(o=new i(t),r=o.headers,o.purge(),n=new e(t),a=r.length;a--;)n.SEGMENT(r[a].start,r[a].length,"");return t=n.SEGMENT(),n.clear(),t},get:function(e){for(var t=[],i=0,n=s.length;n>i;i++)s[i].name===e.toUpperCase()&&t.push(s[i].segment);return t},set:function(e,t){var i,n,r,o=[];for("string"==typeof t?o.push(t):o=t,i=n=0,r=s.length;r>i&&(s[i].name===e.toUpperCase()&&(s[i].segment=o[n],s[i].length=o[n].length,n++),!(n>=o.length));i++);},purge:function(){this.headers=s=[]}}}}),n("moxie/runtime/html5/image/ExifParser",["moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,i,n){function r(o){function a(i,r){var o,a,s,u,c,m,h,f,p=this,g=[],x={},v={1:"BYTE",7:"UNDEFINED",2:"ASCII",3:"SHORT",4:"LONG",5:"RATIONAL",9:"SLONG",10:"SRATIONAL"},w={BYTE:1,UNDEFINED:1,ASCII:1,SHORT:2,LONG:4,RATIONAL:8,SLONG:4,SRATIONAL:8};for(o=p.SHORT(i),a=0;o>a;a++)if(g=[],h=i+2+12*a,s=r[p.SHORT(h)],s!==t){if(u=v[p.SHORT(h+=2)],c=p.LONG(h+=2),m=w[u],!m)throw new n.ImageError(n.ImageError.INVALID_META_ERR);if(h+=4,m*c>4&&(h=p.LONG(h)+d.tiffHeader),h+m*c>=this.length())throw new n.ImageError(n.ImageError.INVALID_META_ERR);"ASCII"!==u?(g=p.asArray(u,h,c),f=1==c?g[0]:g,x[s]=l.hasOwnProperty(s)&&"object"!=typeof f?l[s][f]:f):x[s]=e.trim(p.STRING(h,c).replace(/\0$/,""))}return x}function s(e,t,i){var n,r,o,a=0;if("string"==typeof t){var s=c[e.toLowerCase()];for(var u in s)if(s[u]===t){t=u;break}}n=d[e.toLowerCase()+"IFD"],r=this.SHORT(n);for(var l=0;r>l;l++)if(o=n+12*l+2,this.SHORT(o)==t){a=o+8;break}if(!a)return!1;try{this.write(a,i,4)}catch(m){return!1}return!0}var u,c,l,d,m,h;if(i.call(this,o),c={tiff:{274:"Orientation",270:"ImageDescription",271:"Make",272:"Model",305:"Software",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer"},exif:{36864:"ExifVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",36867:"DateTimeOriginal",33434:"ExposureTime",33437:"FNumber",34855:"ISOSpeedRatings",37377:"ShutterSpeedValue",37378:"ApertureValue",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37386:"FocalLength",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType",41988:"DigitalZoomRatio",41992:"Contrast",41993:"Saturation",41994:"Sharpness"},gps:{0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude"},thumb:{513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength"}},l={ColorSpace:{1:"sRGB",0:"Uncalibrated"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{1:"Daylight",2:"Fliorescent",3:"Tungsten",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 -5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},ExposureMode:{0:"Auto exposure",1:"Manual exposure",2:"Auto bracket"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},GPSLatitudeRef:{N:"North latitude",S:"South latitude"},GPSLongitudeRef:{E:"East longitude",W:"West longitude"}},d={tiffHeader:10},m=d.tiffHeader,u={clear:this.clear},e.extend(this,{read:function(){try{return r.prototype.read.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},write:function(){try{return r.prototype.write.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},UNDEFINED:function(){return this.BYTE.apply(this,arguments)},RATIONAL:function(e){return this.LONG(e)/this.LONG(e+4)},SRATIONAL:function(e){return this.SLONG(e)/this.SLONG(e+4)},ASCII:function(e){return this.CHAR(e)},TIFF:function(){return h||null},EXIF:function(){var t=null;if(d.exifIFD){try{t=a.call(this,d.exifIFD,c.exif)}catch(i){return null}if(t.ExifVersion&&"array"===e.typeOf(t.ExifVersion)){for(var n=0,r="";n=65472&&65475>=t)return n+=5,{height:e.SHORT(n),width:e.SHORT(n+=2)};i=e.SHORT(n+=2),n+=i-2}return null}function s(){var e,t,i=d.thumb();return i&&(e=new n(i),t=a(e),e.clear(),t)?(t.data=i,t):null}function u(){d&&l&&c&&(d.clear(),l.purge(),c.clear(),m=l=d=c=null)}var c,l,d,m;if(c=new n(o),65496!==c.SHORT(0))throw new t.ImageError(t.ImageError.WRONG_FORMAT);l=new i(o);try{d=new r(l.get("app1")[0])}catch(h){}m=a.call(this),e.extend(this,{type:"image/jpeg",size:c.length(),width:m&&m.width||0,height:m&&m.height||0,setExif:function(t,i){return d?("object"===e.typeOf(t)?e.each(t,function(e,t){d.setExif(t,e)}):d.setExif(t,i),l.set("app1",d.SEGMENT()),void 0):!1},writeHeaders:function(){return arguments.length?l.restore(arguments[0]):l.restore(o)},stripHeaders:function(e){return l.strip(e)},purge:function(){u.call(this)}}),d&&(this.meta={tiff:d.TIFF(),exif:d.EXIF(),gps:d.GPS(),thumb:s()})}return o}),n("moxie/runtime/html5/image/PNG",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader"],function(e,t,i){function n(n){function r(){var e,t;return e=a.call(this,8),"IHDR"==e.type?(t=e.start,{width:s.LONG(t),height:s.LONG(t+=4)}):null}function o(){s&&(s.clear(),n=l=u=c=s=null)}function a(e){var t,i,n,r;return t=s.LONG(e),i=s.STRING(e+=4,4),n=e+=4,r=s.LONG(e+t),{length:t,type:i,start:n,CRC:r}}var s,u,c,l;s=new i(n),function(){var t=0,i=0,n=[35152,20039,3338,6666];for(i=0;ii.height?"width":"height",a=Math.round(i[o]*n),s=!1;"nearest"!==r&&(.5>n||n>2)&&(n=.5>n?.5:2,s=!0);var u=t(i,n);return s?e(u,a/u[o],r):u}function t(e,t){var i=e.width,n=e.height,r=Math.round(i*t),o=Math.round(n*t),a=document.createElement("canvas");return a.width=r,a.height=o,a.getContext("2d").drawImage(e,0,0,i,n,0,0,r,o),e=null,a}return{scale:e}}),n("moxie/runtime/html5/image/Image",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/utils/Encode","moxie/file/Blob","moxie/file/File","moxie/runtime/html5/image/ImageInfo","moxie/runtime/html5/image/ResizerCanvas","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a,s,u){function c(){function e(){if(!v&&!g)throw new i.ImageError(i.DOMException.INVALID_STATE_ERR);return v||g}function c(){var t=e();return"canvas"==t.nodeName.toLowerCase()?t:(v=document.createElement("canvas"),v.width=t.width,v.height=t.height,v.getContext("2d").drawImage(t,0,0),v)}function l(e){return n.atob(e.substring(e.indexOf("base64,")+7))}function d(e,t){return"data:"+(t||"")+";base64,"+n.btoa(e)}function m(e){var t=this;g=new Image,g.onerror=function(){p.call(this),t.trigger("error",i.ImageError.WRONG_FORMAT)},g.onload=function(){t.trigger("load")},g.src="data:"==e.substr(0,5)?e:d(e,y.type)}function h(e,t){var n,r=this;return window.FileReader?(n=new FileReader,n.onload=function(){t.call(r,this.result)},n.onerror=function(){r.trigger("error",i.ImageError.WRONG_FORMAT)},n.readAsDataURL(e),void 0):t.call(this,e.getAsDataURL())}function f(e,i){var n=Math.PI/180,r=document.createElement("canvas"),o=r.getContext("2d"),a=e.width,s=e.height;switch(t.inArray(i,[5,6,7,8])>-1?(r.width=s,r.height=a):(r.width=a,r.height=s),i){case 2:o.translate(a,0),o.scale(-1,1);break;case 3:o.translate(a,s),o.rotate(180*n);break;case 4:o.translate(0,s),o.scale(1,-1);break;case 5:o.rotate(90*n),o.scale(1,-1);break;case 6:o.rotate(90*n),o.translate(0,-s);break;case 7:o.rotate(90*n),o.translate(a,-s),o.scale(-1,1);break;case 8:o.rotate(-90*n),o.translate(-a,0)}return o.drawImage(e,0,0,a,s),r}function p(){x&&(x.purge(),x=null),w=g=v=y=null,b=!1}var g,x,v,w,y,E=this,b=!1,_=!0;t.extend(this,{loadFromBlob:function(e){var t=this.getRuntime(),n=arguments.length>1?arguments[1]:!0;if(!t.can("access_binary"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);return y=e,e.isDetached()?(w=e.getSource(),m.call(this,w),void 0):(h.call(this,e.getSource(),function(e){n&&(w=l(e)),m.call(this,e)}),void 0)},loadFromImage:function(e,t){this.meta=e.meta,y=new o(null,{name:e.name,size:e.size,type:e.type}),m.call(this,t?w=e.getAsBinaryString():e.getAsDataURL())},getInfo:function(){var t,i=this.getRuntime();return!x&&w&&i.can("access_image_binary")&&(x=new a(w)),t={width:e().width||0,height:e().height||0,type:y.type||u.getFileMime(y.name),size:w&&w.length||y.size||0,name:y.name||"",meta:null},_&&(t.meta=x&&x.meta||this.meta||{},!t.meta||!t.meta.thumb||t.meta.thumb.data instanceof r||(t.meta.thumb.data=new r(null,{type:"image/jpeg",data:t.meta.thumb.data}))),t},resize:function(t,i,n){var r=document.createElement("canvas");if(r.width=t.width,r.height=t.height,r.getContext("2d").drawImage(e(),t.x,t.y,t.width,t.height,0,0,r.width,r.height),v=s.scale(r,i),_=n.preserveHeaders,!_){var o=this.meta&&this.meta.tiff&&this.meta.tiff.Orientation||1;v=f(v,o)}this.width=v.width,this.height=v.height,b=!0,this.trigger("Resize")},getAsCanvas:function(){return v||(v=c()),v.id=this.uid+"_canvas",v},getAsBlob:function(e,t){return e!==this.type?(b=!0,new o(null,{name:y.name||"",type:e,data:E.getAsDataURL(e,t)})):new o(null,{name:y.name||"",type:e,data:E.getAsBinaryString(e,t)})},getAsDataURL:function(e){var t=arguments[1]||90;if(!b)return g.src;if(c(),"image/jpeg"!==e)return v.toDataURL("image/png");try{return v.toDataURL("image/jpeg",t/100)}catch(i){return v.toDataURL("image/jpeg")}},getAsBinaryString:function(e,t){if(!b)return w||(w=l(E.getAsDataURL(e,t))),w;if("image/jpeg"!==e)w=l(E.getAsDataURL(e,t));else{var i;t||(t=90),c();try{i=v.toDataURL("image/jpeg",t/100)}catch(n){i=v.toDataURL("image/jpeg")}w=l(i),x&&(w=x.stripHeaders(w),_&&(x.meta&&x.meta.exif&&x.setExif({PixelXDimension:this.width,PixelYDimension:this.height}),w=x.writeHeaders(w)),x.purge(),x=null)}return b=!1,w},destroy:function(){E=null,p.call(this),this.getRuntime().getShim().removeInstance(this.uid)}})}return e.Image=c}),n("moxie/runtime/flash/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(i){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}function s(e){var n=i.get(e);n&&"OBJECT"==n.nodeName&&("IE"===t.browser?(n.style.display="none",function r(){4==n.readyState?u(e):setTimeout(r,10)}()):n.parentNode.removeChild(n))}function u(e){var t=i.get(e);if(t){for(var n in t)"function"==typeof t[n]&&(t[n]=null);t.parentNode.removeChild(t)}}function c(u){var c,m=this;u=e.extend({swf_url:t.swf_url},u),o.call(this,u,l,{access_binary:function(e){return e&&"browser"===m.mode},access_image_binary:function(e){return e&&"browser"===m.mode},display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:function(){return"client"===m.mode},resize_image:o.capTrue,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!e.arrayDiff(t,["","text","document"])||"browser"===m.mode},return_status_code:function(t){return"browser"===m.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:function(e){return e&&"browser"===m.mode},send_browser_cookies:function(e){return e&&"browser"===m.mode},send_custom_headers:function(e){return e&&"browser"===m.mode},send_multipart:o.capTrue,slice_blob:function(e){return e&&"browser"===m.mode},stream_upload:function(e){return e&&"browser"===m.mode},summon_file_dialog:!1,upload_filesize:function(t){return e.parseSizeStr(t)<=2097152||"client"===m.mode},use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}},{access_binary:function(e){return e?"browser":"client"},access_image_binary:function(e){return e?"browser":"client"},report_upload_progress:function(e){return e?"browser":"client"},return_response_type:function(t){return e.arrayDiff(t,["","text","json","document"])?"browser":["client","browser"]},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"browser":["client","browser"]},send_binary_string:function(e){return e?"browser":"client"},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"browser":"client"},slice_blob:function(e){return e?"browser":"client"},stream_upload:function(e){return e?"client":"browser"},upload_filesize:function(t){return e.parseSizeStr(t)>=2097152?"client":"browser"}},"client"),a()<11.3&&(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid)},shimExec:function(e,t){var i=[].slice.call(arguments,2);return m.getShim().exec(this.uid,e,t,i)},init:function(){var i,r,a;a=this.getShimContainer(),e.extend(a.style,{position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),i=''+''+''+''+"","IE"===t.browser?(r=document.createElement("div"),a.appendChild(r),r.outerHTML=i,r=a=null):a.innerHTML=i,c=setTimeout(function(){m&&!m.initialized&&m.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},5e3)},destroy:function(e){return function(){s(m.uid),e.call(m),clearTimeout(c),u=c=e=m=null}}(this.destroy)},d)}var l="flash",d={};return o.addConstructor(l,c),d}),n("moxie/runtime/flash/file/Blob",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={slice:function(e,i,n,r){var o=this.getRuntime();return 0>i?i=Math.max(e.size+i,0):i>0&&(i=Math.min(i,e.size)),0>n?n=Math.max(e.size+n,0):n>0&&(n=Math.min(n,e.size)),e=o.shimExec.call(this,"Blob","slice",i,n,r||""),e&&(e=new t(o.uid,e)),e}};return e.Blob=i}),n("moxie/runtime/flash/file/FileInput",["moxie/runtime/flash/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,t,i,n){var r={init:function(e){var r=this,o=this.getRuntime(),a=i.get(e.browse_button);a&&(a.setAttribute("tabindex",-1),a=null),this.bind("Change",function(){var e=o.shimExec.call(r,"FileInput","getFiles");r.files=[],n.each(e,function(e){r.files.push(new t(o.uid,e))})},999),this.getRuntime().shimExec.call(this,"FileInput","init",{accept:e.accept,multiple:e.multiple}),this.trigger("ready")}};return e.FileInput=r}),n("moxie/runtime/flash/file/FileReader",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n=this;return n.result="","readAsDataURL"===e&&(n.result="data:"+(t.type||"")+";base64,"),n.bind("Progress",function(t,r){r&&(n.result+=i(r,e))},999),n.getRuntime().shimExec.call(this,"FileReader","readAsBase64",t.uid)}};return e.FileReader=n}),n("moxie/runtime/flash/file/FileReaderSync",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n,r=this.getRuntime();return(n=r.shimExec.call(this,"FileReaderSync","readAsBase64",t.uid))?("readAsDataURL"===e&&(n="data:"+(t.type||"")+";base64,"+n),i(n,e,t.type)):null}};return e.FileReaderSync=n}),n("moxie/runtime/flash/runtime/Transporter",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={getAsBlob:function(e){var i=this.getRuntime(),n=i.shimExec.call(this,"Transporter","getAsBlob",e);return n?new t(i.uid,n):null}};return e.Transporter=i}),n("moxie/runtime/flash/xhr/XMLHttpRequest",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/file/File","moxie/file/FileReaderSync","moxie/runtime/flash/file/FileReaderSync","moxie/xhr/FormData","moxie/runtime/Transporter","moxie/runtime/flash/runtime/Transporter"],function(e,t,i,n,r,o,a,s){var u={send:function(e,n){function r(){e.transport=l.mode,l.shimExec.call(c,"XMLHttpRequest","send",e,n)}function o(e,t){l.shimExec.call(c,"XMLHttpRequest","appendBlob",e,t.uid),n=null,r()}function u(e,t){var i=new s;i.bind("TransportingComplete",function(){t(this.result)}),i.transport(e.getSource(),e.type,{ruid:l.uid})}var c=this,l=c.getRuntime();if(t.isEmptyObj(e.headers)||t.each(e.headers,function(e,t){l.shimExec.call(c,"XMLHttpRequest","setRequestHeader",t,e.toString())}),n instanceof a){var d;if(n.each(function(e,t){e instanceof i?d=t:l.shimExec.call(c,"XMLHttpRequest","append",t,e)}),n.hasBlob()){var m=n.getBlob();m.isDetached()?u(m,function(e){m.destroy(),o(d,e)}):o(d,m)}else n=null,r()}else n instanceof i?n.isDetached()?u(n,function(e){n.destroy(),n=e.uid,r()}):(n=n.uid,r()):r()},getResponse:function(e){var i,o,a=this.getRuntime();if(o=a.shimExec.call(this,"XMLHttpRequest","getResponseAsBlob")){if(o=new n(a.uid,o),"blob"===e)return o;try{if(i=new r,~t.inArray(e,["","text"]))return i.readAsText(o);if("json"===e&&window.JSON)return JSON.parse(i.readAsText(o))}finally{o.destroy()}}return null},abort:function(){var e=this.getRuntime();e.shimExec.call(this,"XMLHttpRequest","abort"),this.dispatchEvent("readystatechange"),this.dispatchEvent("abort")}};return e.XMLHttpRequest=u}),n("moxie/runtime/flash/image/Image",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/runtime/Transporter","moxie/file/Blob","moxie/file/FileReaderSync"],function(e,t,i,n,r){var o={loadFromBlob:function(e){function t(e){r.shimExec.call(n,"Image","loadFromBlob",e.uid),n=r=null}var n=this,r=n.getRuntime();if(e.isDetached()){var o=new i;o.bind("TransportingComplete",function(){t(o.result.getSource())}),o.transport(e.getSource(),e.type,{ruid:r.uid})}else t(e.getSource())},loadFromImage:function(e){var t=this.getRuntime();return t.shimExec.call(this,"Image","loadFromImage",e.uid)},getInfo:function(){var e=this.getRuntime(),t=e.shimExec.call(this,"Image","getInfo");return t.meta&&t.meta.thumb&&t.meta.thumb.data&&!(e.meta.thumb.data instanceof n)&&(t.meta.thumb.data=new n(e.uid,t.meta.thumb.data)),t},getAsBlob:function(e,t){var i=this.getRuntime(),r=i.shimExec.call(this,"Image","getAsBlob",e,t);return r?new n(i.uid,r):null},getAsDataURL:function(){var e,t=this.getRuntime(),i=t.Image.getAsBlob.apply(this,arguments);return i?(e=new r,e.readAsDataURL(i)):null}};return e.Image=o}),n("moxie/runtime/silverlight/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(e){var t,i,n,r,o,a=!1,s=null,u=0;try{try{s=new ActiveXObject("AgControl.AgControl"),s.IsVersionSupported(e)&&(a=!0),s=null}catch(c){var l=navigator.plugins["Silverlight Plug-In"];if(l){for(t=l.description,"1.0.30226.2"===t&&(t="2.0.30226.2"),i=t.split(".");i.length>3;)i.pop();for(;i.length<4;)i.push(0);for(n=e.split(".");n.length>4;)n.pop();do r=parseInt(n[u],10),o=parseInt(i[u],10),u++;while(u=r&&!isNaN(r)&&(a=!0)}}}catch(d){a=!1}return a}function s(s){var l,d=this;s=e.extend({xap_url:t.xap_url},s),o.call(this,s,u,{access_binary:o.capTrue,access_image_binary:o.capTrue,display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:o.capTrue,resize_image:o.capTrue,return_response_headers:function(e){return e&&"client"===d.mode},return_response_type:function(e){return"json"!==e?!0:!!window.JSON},return_status_code:function(t){return"client"===d.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:o.capTrue,send_browser_cookies:function(e){return e&&"browser"===d.mode},send_custom_headers:function(e){return e&&"client"===d.mode},send_multipart:o.capTrue,slice_blob:o.capTrue,stream_upload:!0,summon_file_dialog:!1,upload_filesize:o.capTrue,use_http_method:function(t){return"client"===d.mode||!e.arrayDiff(t,["GET","POST"])}},{return_response_headers:function(e){return e?"client":"browser"},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"client":["client","browser"]},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"client":"browser"},use_http_method:function(t){return e.arrayDiff(t,["GET","POST"])?"client":["client","browser"]}}),a("2.0.31005.0")&&"Opera"!==t.browser||(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid).content.Moxie},shimExec:function(e,t){var i=[].slice.call(arguments,2);return d.getShim().exec(this.uid,e,t,i)},init:function(){var e;e=this.getShimContainer(),e.innerHTML=''+''+''+''+''+''+"",l=setTimeout(function(){d&&!d.initialized&&d.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},"Windows"!==t.OS?1e4:5e3)},destroy:function(e){return function(){e.call(d),clearTimeout(l),s=l=e=d=null}}(this.destroy)},c)}var u="silverlight",c={};return o.addConstructor(u,s),c}),n("moxie/runtime/silverlight/file/Blob",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/Blob"],function(e,t,i){return e.Blob=t.extend({},i)}),n("moxie/runtime/silverlight/file/FileInput",["moxie/runtime/silverlight/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,t,i,n){function r(e){for(var t="",i=0;ii;i++)t=s.keys[i],a=s[t],a&&(/^(\d|[1-9]\d+)$/.test(a)?a=parseInt(a,10):/^\d*\.\d+$/.test(a)&&(a=parseFloat(a)),r.meta[e][t]=a)}),r.meta&&r.meta.thumb&&r.meta.thumb.data&&!(e.meta.thumb.data instanceof i)&&(r.meta.thumb.data=new i(e.uid,r.meta.thumb.data))),r.width=parseInt(o.width,10),r.height=parseInt(o.height,10),r.size=parseInt(o.size,10),r.type=o.type,r.name=o.name,r},resize:function(e,t,i){this.getRuntime().shimExec.call(this,"Image","resize",e.x,e.y,e.width,e.height,t,i.preserveHeaders,i.resample)}})}),n("moxie/runtime/html4/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue;i.call(this,t,a,{access_binary:u(window.FileReader||window.File&&File.getAsDataURL),access_image_binary:!1,display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:!1,drag_and_drop:!1,filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),resize_image:function(){return s.Image&&o.can("access_binary")&&n.can("create_canvas")},report_upload_progress:!1,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!!~e.inArray(t,["text","document",""])},return_status_code:function(t){return!e.arrayDiff(t,[200,404])},select_file:function(){return n.can("use_fileinput")},select_multiple:!1,send_binary_string:!1,send_custom_headers:!1,send_multipart:!0,slice_blob:!1,stream_upload:function(){return o.can("select_file")},summon_file_dialog:function(){return o.can("select_file")&&!("Firefox"===n.browser&&n.verComp(n.version,4,"<")||"Opera"===n.browser&&n.verComp(n.version,12,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<"))},upload_filesize:c,use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}}),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html4",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html4/file/FileInput",["moxie/runtime/html4/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){function e(){var o,c,d,m,h,f,p=this,g=p.getRuntime();f=i.guid("uid_"),o=g.getShimContainer(),s&&(d=n.get(s+"_form"),d&&(i.extend(d.style,{top:"100%"}),d.firstChild.setAttribute("tabindex",-1))),m=document.createElement("form"),m.setAttribute("id",f+"_form"),m.setAttribute("method","post"),m.setAttribute("enctype","multipart/form-data"),m.setAttribute("encoding","multipart/form-data"),i.extend(m.style,{overflow:"hidden",position:"absolute",top:0,left:0,width:"100%",height:"100%"}),h=document.createElement("input"),h.setAttribute("id",f),h.setAttribute("type","file"),h.setAttribute("accept",l.join(",")),g.can("summon_file_dialog")&&h.setAttribute("tabindex",-1),i.extend(h.style,{fontSize:"999px",opacity:0}),m.appendChild(h),o.appendChild(m),i.extend(h.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),"IE"===a.browser&&a.verComp(a.version,10,"<")&&i.extend(h.style,{filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}),h.onchange=function(){var i;this.value&&(i=this.files?this.files[0]:{name:this.value},i=new t(g.uid,i),this.onchange=function(){},e.call(p),p.files=[i],h.setAttribute("id",i.uid),m.setAttribute("id",i.uid+"_form"),p.trigger("change"),h=m=null)},g.can("summon_file_dialog")&&(c=n.get(u.browse_button),r.removeEvent(c,"click",p.uid),r.addEvent(c,"click",function(e){h&&!h.disabled&&h.click(),e.preventDefault()},p.uid)),s=f,o=d=c=null}var s,u,c,l=[];i.extend(this,{init:function(t){var i,a=this,s=a.getRuntime();u=t,l=o.extList2mimes(t.accept,s.can("filter_by_extension")),i=s.getShimContainer(),function(){var e,o,l;e=n.get(t.browse_button),c=n.getStyle(e,"z-index")||"auto",s.can("summon_file_dialog")?("static"===n.getStyle(e,"position")&&(e.style.position="relative"),a.bind("Refresh",function(){o=parseInt(c,10)||1,n.get(u.browse_button).style.zIndex=o,this.getRuntime().getShimContainer().style.zIndex=o-1})):e.setAttribute("tabindex",-1),l=s.can("summon_file_dialog")?e:i,r.addEvent(l,"mouseover",function(){a.trigger("mouseenter")},a.uid),r.addEvent(l,"mouseout",function(){a.trigger("mouseleave")},a.uid),r.addEvent(l,"mousedown",function(){a.trigger("mousedown")},a.uid),r.addEvent(n.get(t.container),"mouseup",function(){a.trigger("mouseup")},a.uid),e=null}(),e.call(this),i=null,a.trigger({type:"ready",async:!0})},setOption:function(e,t){var i,r=this.getRuntime();"accept"==e&&(l=t.mimes||o.extList2mimes(t,r.can("filter_by_extension"))),i=n.get(s),i&&i.setAttribute("accept",l.join(","))},disable:function(e){var t;(t=n.get(s))&&(t.disabled=!!e)},destroy:function(){var e=this.getRuntime(),t=e.getShim(),i=e.getShimContainer(),o=u&&n.get(u.container),a=u&&n.get(u.browse_button);o&&r.removeAllEvents(o,this.uid),a&&(r.removeAllEvents(a,this.uid),a.style.zIndex=c),i&&(r.removeAllEvents(i,this.uid),i.innerHTML=""),t.removeInstance(this.uid),s=l=u=i=o=a=t=null}})}return e.FileInput=s}),n("moxie/runtime/html4/file/FileReader",["moxie/runtime/html4/Runtime","moxie/runtime/html5/file/FileReader"],function(e,t){return e.FileReader=t}),n("moxie/runtime/html4/xhr/XMLHttpRequest",["moxie/runtime/html4/Runtime","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Url","moxie/core/Exceptions","moxie/core/utils/Events","moxie/file/Blob","moxie/xhr/FormData"],function(e,t,i,n,r,o,a,s){function u(){function e(e){var t,n,r,a,s=this,u=!1;if(l){if(t=l.id.replace(/_iframe$/,""),n=i.get(t+"_form")){for(r=n.getElementsByTagName("input"),a=r.length;a--;)switch(r[a].getAttribute("type")){case"hidden":r[a].parentNode.removeChild(r[a]);break;case"file":u=!0}r=[],u||n.parentNode.removeChild(n),n=null}setTimeout(function(){o.removeEvent(l,"load",s.uid),l.parentNode&&l.parentNode.removeChild(l);var t=s.getRuntime().getShimContainer();t.children.length||t.parentNode.removeChild(t),t=l=null,e()},1)}}var u,c,l;t.extend(this,{send:function(d,m){function h(){var i=w.getShimContainer()||document.body,r=document.createElement("div");r.innerHTML='',l=r.firstChild,i.appendChild(l),o.addEvent(l,"load",function(){var i;try{i=l.contentWindow.document||l.contentDocument||window.frames[l.id].document,/^4(0[0-9]|1[0-7]|2[2346])\s/.test(i.title)?u=i.title.replace(/^(\d+).*$/,"$1"):(u=200,c=t.trim(i.body.innerHTML),v.trigger({type:"progress",loaded:c.length,total:c.length}),x&&v.trigger({type:"uploadprogress",loaded:x.size||1025,total:x.size||1025}))}catch(r){if(!n.hasSameOrigin(d.url))return e.call(v,function(){v.trigger("error")}),void 0;u=404}e.call(v,function(){v.trigger("load")})},v.uid)}var f,p,g,x,v=this,w=v.getRuntime();if(u=c=null,m instanceof s&&m.hasBlob()){if(x=m.getBlob(),f=x.uid,g=i.get(f),p=i.get(f+"_form"),!p)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR)}else f=t.guid("uid_"),p=document.createElement("form"),p.setAttribute("id",f+"_form"),p.setAttribute("method",d.method),p.setAttribute("enctype","multipart/form-data"),p.setAttribute("encoding","multipart/form-data"),w.getShimContainer().appendChild(p);p.setAttribute("target",f+"_iframe"),m instanceof s&&m.each(function(e,i){if(e instanceof a)g&&g.setAttribute("name",i);else{var n=document.createElement("input");t.extend(n,{type:"hidden",name:i,value:e}),g?p.insertBefore(n,g):p.appendChild(n)}}),p.setAttribute("action",d.url),h(),p.submit(),v.trigger("loadstart")},getStatus:function(){return u},getResponse:function(e){if("json"===e&&"string"===t.typeOf(c)&&window.JSON)try{return JSON.parse(c.replace(/^\s*]*>/,"").replace(/<\/pre>\s*$/,""))}catch(i){return null}return c},abort:function(){var t=this;l&&l.contentWindow&&(l.contentWindow.stop?l.contentWindow.stop():l.contentWindow.document.execCommand?l.contentWindow.document.execCommand("Stop"):l.src="about:blank"),e.call(this,function(){t.dispatchEvent("abort")})},destroy:function(){this.getRuntime().getShim().removeInstance(this.uid)}})}return e.XMLHttpRequest=u}),n("moxie/runtime/html4/image/Image",["moxie/runtime/html4/Runtime","moxie/runtime/html5/image/Image"],function(e,t){return e.Image=t}),a(["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Dom","moxie/core/EventTarget","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/file/Blob","moxie/core/I18n","moxie/core/utils/Mime","moxie/file/FileInput","moxie/file/File","moxie/file/FileDrop","moxie/file/FileReader","moxie/core/utils/Url","moxie/runtime/RuntimeTarget","moxie/xhr/FormData","moxie/xhr/XMLHttpRequest","moxie/image/Image","moxie/core/utils/Events","moxie/runtime/html5/image/ResizerCanvas"])}(this)}); /** * Plupload - multi-runtime File Uploader - * v2.3.3 + * v2.3.6 * * Copyright 2013, Moxiecode Systems AB * Released under GPL License. @@ -24,6 +24,6 @@ return t}var o={init:function(e){var o=this,a=this.getRuntime(),s=i.get(e.browse * License: http://www.plupload.com/license * Contributing: http://www.plupload.com/contributing * - * Date: 2017-08-28 + * Date: 2017-11-03 */ -!function(e,t){var i=function(){var e={};return t.apply(e,arguments),e.plupload};"function"==typeof define&&define.amd?define("plupload",["./moxie"],i):"object"==typeof module&&module.exports?module.exports=i(require("./moxie")):e.plupload=i(e.moxie)}(this||window,function(e){!function(e,t,i){function n(e){function t(e,t,i){var r={chunks:"slice_blob",jpgresize:"send_binary_string",pngresize:"send_binary_string",progress:"report_upload_progress",multi_selection:"select_multiple",dragdrop:"drag_and_drop",drop_element:"drag_and_drop",headers:"send_custom_headers",urlstream_upload:"send_binary_string",canSendBinary:"send_binary",triggerDialog:"summon_file_dialog"};r[e]?n[r[e]]=t:i||(n[e]=t)}var i=e.required_features,n={};return"string"==typeof i?l.each(i.split(/\s*,\s*/),function(e){t(e,!0)}):"object"==typeof i?l.each(i,function(e,i){t(i,e)}):i===!0&&(e.chunk_size&&e.chunk_size>0&&(n.slice_blob=!0),l.isEmptyObj(e.resize)&&e.multipart!==!1||(n.send_binary_string=!0),e.http_method&&(n.use_http_method=e.http_method),l.each(e,function(e,i){t(i,!!e,!0)})),n}var r=window.setTimeout,s={},a=t.core.utils,o=t.runtime.Runtime,l={VERSION:"2.3.3",STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-601,FILE_DUPLICATE_ERROR:-602,IMAGE_FORMAT_ERROR:-700,MEMORY_ERROR:-701,IMAGE_DIMENSIONS_ERROR:-702,moxie:t,mimeTypes:a.Mime.mimes,ua:a.Env,typeOf:a.Basic.typeOf,extend:a.Basic.extend,guid:a.Basic.guid,getAll:function(e){var t,i=[];"array"!==l.typeOf(e)&&(e=[e]);for(var n=e.length;n--;)t=l.get(e[n]),t&&i.push(t);return i.length?i:null},get:a.Dom.get,each:a.Basic.each,getPos:a.Dom.getPos,getSize:a.Dom.getSize,xmlEncode:function(e){var t={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},i=/[<>&\"\']/g;return e?(""+e).replace(i,function(e){return t[e]?"&"+t[e]+";":e}):e},toArray:a.Basic.toArray,inArray:a.Basic.inArray,inSeries:a.Basic.inSeries,addI18n:t.core.I18n.addI18n,translate:t.core.I18n.translate,sprintf:a.Basic.sprintf,isEmptyObj:a.Basic.isEmptyObj,hasClass:a.Dom.hasClass,addClass:a.Dom.addClass,removeClass:a.Dom.removeClass,getStyle:a.Dom.getStyle,addEvent:a.Events.addEvent,removeEvent:a.Events.removeEvent,removeAllEvents:a.Events.removeAllEvents,cleanName:function(e){var t,i;for(i=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"],t=0;t0?"&":"?")+i),e},formatSize:function(e){function t(e,t){return Math.round(e*Math.pow(10,t))/Math.pow(10,t)}if(e===i||/\D/.test(e))return l.translate("N/A");var n=Math.pow(1024,4);return e>n?t(e/n,1)+" "+l.translate("tb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("gb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("mb"):e>1024?Math.round(e/1024)+" "+l.translate("kb"):e+" "+l.translate("b")},parseSize:a.Basic.parseSizeStr,predictRuntime:function(e,t){var i,n;return i=new l.Uploader(e),n=o.thatCan(i.getOption().required_features,t||e.runtimes),i.destroy(),n},addFileFilter:function(e,t){s[e]=t}};l.addFileFilter("mime_types",function(e,t,i){e.length&&!e.regexp.test(t.name)?(this.trigger("Error",{code:l.FILE_EXTENSION_ERROR,message:l.translate("File extension error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("max_file_size",function(e,t,i){var n;e=l.parseSize(e),t.size!==n&&e&&t.size>e?(this.trigger("Error",{code:l.FILE_SIZE_ERROR,message:l.translate("File size error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("prevent_duplicates",function(e,t,i){if(e)for(var n=this.files.length;n--;)if(t.name===this.files[n].name&&t.size===this.files[n].size)return this.trigger("Error",{code:l.FILE_DUPLICATE_ERROR,message:l.translate("Duplicate file error."),file:t}),i(!1),void 0;i(!0)}),l.addFileFilter("prevent_empty",function(e,t,n){e&&!t.size&&t.size!==i?(this.trigger("Error",{code:l.FILE_SIZE_ERROR,message:l.translate("File size error."),file:t}),n(!1)):n(!0)}),l.Uploader=function(e){function a(){var e,t,i=0;if(this.state==l.STARTED){for(t=0;t0?Math.ceil(100*(e.loaded/e.size)):100,d()}function d(){var e,t,n,r=0;for(I.reset(),e=0;eS)&&(r+=n),I.loaded+=n):I.size=i,t.status==l.DONE?I.uploaded++:t.status==l.FAILED?I.failed++:I.queued++;I.size===i?I.percent=D.length>0?Math.ceil(100*(I.uploaded/D.length)):0:(I.bytesPerSec=Math.ceil(r/((+new Date-S||1)/1e3)),I.percent=I.size>0?Math.ceil(100*(I.loaded/I.size)):0)}function c(){var e=F[0]||P[0];return e?e.getRuntime().uid:!1}function f(){this.bind("FilesAdded FilesRemoved",function(e){e.trigger("QueueChanged"),e.refresh()}),this.bind("CancelUpload",b),this.bind("BeforeUpload",m),this.bind("UploadFile",_),this.bind("UploadProgress",E),this.bind("StateChanged",v),this.bind("QueueChanged",d),this.bind("Error",R),this.bind("FileUploaded",y),this.bind("Destroy",z)}function p(e,i){var n=this,r=0,s=[],a={runtime_order:e.runtimes,required_caps:e.required_features,preferred_caps:x,swf_url:e.flash_swf_url,xap_url:e.silverlight_xap_url};l.each(e.runtimes.split(/\s*,\s*/),function(t){e[t]&&(a[t]=e[t])}),e.browse_button&&l.each(e.browse_button,function(i){s.push(function(s){var u=new t.file.FileInput(l.extend({},a,{accept:e.filters.mime_types,name:e.file_data_name,multiple:e.multi_selection,container:e.container,browse_button:i}));u.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),multi_selection:e.can("select_multiple")}),r++,F.push(this),s()},u.onchange=function(){n.addFile(this.files)},u.bind("mouseenter mouseleave mousedown mouseup",function(t){U||(e.browse_button_hover&&("mouseenter"===t.type?l.addClass(i,e.browse_button_hover):"mouseleave"===t.type&&l.removeClass(i,e.browse_button_hover)),e.browse_button_active&&("mousedown"===t.type?l.addClass(i,e.browse_button_active):"mouseup"===t.type&&l.removeClass(i,e.browse_button_active)))}),u.bind("mousedown",function(){n.trigger("Browse")}),u.bind("error runtimeerror",function(){u=null,s()}),u.init()})}),e.drop_element&&l.each(e.drop_element,function(e){s.push(function(i){var s=new t.file.FileDrop(l.extend({},a,{drop_zone:e}));s.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),dragdrop:e.can("drag_and_drop")}),r++,P.push(this),i()},s.ondrop=function(){n.addFile(this.files)},s.bind("error runtimeerror",function(){s=null,i()}),s.init()})}),l.inSeries(s,function(){"function"==typeof i&&i(r)})}function g(e,n,r,s){var a=new t.image.Image;try{a.onload=function(){n.width>this.width&&n.height>this.height&&n.quality===i&&n.preserve_headers&&!n.crop?(this.destroy(),s(e)):a.downsize(n.width,n.height,n.crop,n.preserve_headers)},a.onresize=function(){var t=this.getAsBlob(e.type,n.quality);this.destroy(),s(t)},a.bind("error runtimeerror",function(){this.destroy(),s(e)}),a.load(e,r)}catch(o){s(e)}}function h(e,i,r){function s(e,i,n){var r=O[e];switch(e){case"max_file_size":"max_file_size"===e&&(O.max_file_size=O.filters.max_file_size=i);break;case"chunk_size":(i=l.parseSize(i))&&(O[e]=i,O.send_file_name=!0);break;case"multipart":O[e]=i,i||(O.send_file_name=!0);break;case"http_method":O[e]="PUT"===i.toUpperCase()?"PUT":"POST";break;case"unique_names":O[e]=i,i&&(O.send_file_name=!0);break;case"filters":"array"===l.typeOf(i)&&(i={mime_types:i}),n?l.extend(O.filters,i):O.filters=i,i.mime_types&&("string"===l.typeOf(i.mime_types)&&(i.mime_types=t.core.utils.Mime.mimes2extList(i.mime_types)),i.mime_types.regexp=function(e){var t=[];return l.each(e,function(e){l.each(e.extensions.split(/,/),function(e){/^\s*\*\s*$/.test(e)?t.push("\\.*"):t.push("\\."+e.replace(new RegExp("["+"/^$.*+?|()[]{}\\".replace(/./g,"\\$&")+"]","g"),"\\$&"))})}),new RegExp("("+t.join("|")+")$","i")}(i.mime_types),O.filters.mime_types=i.mime_types);break;case"resize":O.resize=i?l.extend({preserve_headers:!0,crop:!1},i):!1;break;case"prevent_duplicates":O.prevent_duplicates=O.filters.prevent_duplicates=!!i;break;case"container":case"browse_button":case"drop_element":i="container"===e?l.get(i):l.getAll(i);case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":O[e]=i,n||(u=!0);break;default:O[e]=i}n||a.trigger("OptionChanged",e,i,r)}var a=this,u=!1;"object"==typeof e?l.each(e,function(e,t){s(t,e,r)}):s(e,i,r),r?(O.required_features=n(l.extend({},O)),x=n(l.extend({},O,{required_features:!0}))):u&&(a.trigger("Destroy"),p.call(a,O,function(e){e?(a.runtime=o.getInfo(c()).type,a.trigger("Init",{runtime:a.runtime}),a.trigger("PostInit")):a.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}))}function m(e,t){if(e.settings.unique_names){var i=t.name.match(/\.([^.]+)$/),n="part";i&&(n=i[1]),t.target_name=t.id+"."+n}}function _(e,i){function n(){c-->0?r(s,1e3):(i.loaded=p,e.trigger("Error",{code:l.HTTP_ERROR,message:l.translate("HTTP Error."),file:i,response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()}))}function s(){var t,n,r={};i.status===l.UPLOADING&&e.state!==l.STOPPED&&(e.settings.send_file_name&&(r.name=i.target_name||i.name),d&&f.chunks&&o.size>d?(n=Math.min(d,o.size-p),t=o.slice(p,p+n)):(n=o.size,t=o),d&&f.chunks&&(e.settings.send_chunk_number?(r.chunk=Math.ceil(p/d),r.chunks=Math.ceil(o.size/d)):(r.offset=p,r.total=o.size)),e.trigger("BeforeChunkUpload",i,r,t,p)&&a(r,t,n))}function a(a,d,g){var m;T=new t.xhr.XMLHttpRequest,T.upload&&(T.upload.onprogress=function(t){i.loaded=Math.min(i.size,p+t.loaded),e.trigger("UploadProgress",i)}),T.onload=function(){return T.status<200&&T.status>=400?(n(),void 0):(c=e.settings.max_retries,g=o.size?(i.size!=i.origSize&&(o.destroy(),o=null),e.trigger("UploadProgress",i),i.status=l.DONE,i.completeTimestamp=+new Date,e.trigger("FileUploaded",i,{response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()})):r(s,1),void 0)},T.onerror=function(){n()},T.onloadend=function(){this.destroy()},e.settings.multipart&&f.multipart?(T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),m=new t.xhr.FormData,l.each(l.extend(a,e.settings.multipart_params),function(e,t){m.append(t,e)}),m.append(e.settings.file_data_name,d),T.send(m,h)):(u=l.buildUrl(e.settings.url,l.extend(a,e.settings.multipart_params)),T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),T.hasRequestHeader("Content-Type")||T.setRequestHeader("Content-Type","application/octet-stream"),T.send(d,h))}var o,u=e.settings.url,d=e.settings.chunk_size,c=e.settings.max_retries,f=e.features,p=0,h={runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:x,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url};i.loaded&&(p=i.loaded=d?d*Math.floor(i.loaded/d):0),o=i.getSource(),l.isEmptyObj(e.settings.resize)||-1===l.inArray(o.type,["image/jpeg","image/png"])?s():g(o,e.settings.resize,h,function(e){o=e,i.size=e.size,s()})}function E(e,t){u(t)}function v(e){if(e.state==l.STARTED)S=+new Date;else if(e.state==l.STOPPED)for(var t=e.files.length-1;t>=0;t--)e.files[t].status==l.UPLOADING&&(e.files[t].status=l.QUEUED,d())}function b(){T&&T.abort()}function y(e){d(),r(function(){a.call(e)},1)}function R(e,t){t.code===l.INIT_ERROR?e.destroy():t.code===l.HTTP_ERROR&&(t.file.status=l.FAILED,t.file.completeTimestamp=+new Date,u(t.file),e.state==l.STARTED&&(e.trigger("CancelUpload"),r(function(){a.call(e)},1)))}function z(e){e.stop(),l.each(D,function(e){e.destroy()}),D=[],F.length&&(l.each(F,function(e){e.destroy()}),F=[]),P.length&&(l.each(P,function(e){e.destroy()}),P=[]),x={},U=!1,S=T=null,I.reset()}var O,S,I,T,w=l.guid(),D=[],x={},F=[],P=[],U=!1;O={chunk_size:0,file_data_name:"file",filters:{mime_types:[],max_file_size:0,prevent_duplicates:!1,prevent_empty:!0},flash_swf_url:"js/Moxie.swf",http_method:"POST",max_retries:0,multipart:!0,multi_selection:!0,resize:!1,runtimes:o.order,send_file_name:!0,send_chunk_number:!0,silverlight_xap_url:"js/Moxie.xap"},h.call(this,e,null,!0),I=new l.QueueProgress,l.extend(this,{id:w,uid:w,state:l.STOPPED,features:{},runtime:null,files:D,settings:O,total:I,init:function(){var e,t,i=this;return e=i.getOption("preinit"),"function"==typeof e?e(i):l.each(e,function(e,t){i.bind(t,e)}),f.call(i),l.each(["container","browse_button","drop_element"],function(e){return null===i.getOption(e)?(t={code:l.INIT_ERROR,message:l.sprintf(l.translate("%s specified, but cannot be found."),e)},!1):void 0}),t?i.trigger("Error",t):O.browse_button||O.drop_element?(p.call(i,O,function(e){var t=i.getOption("init");"function"==typeof t?t(i):l.each(t,function(e,t){i.bind(t,e)}),e?(i.runtime=o.getInfo(c()).type,i.trigger("Init",{runtime:i.runtime}),i.trigger("PostInit")):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}),void 0):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("You must specify either browse_button or drop_element.")})},setOption:function(e,t){h.call(this,e,t,!this.runtime)},getOption:function(e){return e?O[e]:O},refresh:function(){F.length&&l.each(F,function(e){e.trigger("Refresh")}),this.trigger("Refresh")},start:function(){this.state!=l.STARTED&&(this.state=l.STARTED,this.trigger("StateChanged"),a.call(this))},stop:function(){this.state!=l.STOPPED&&(this.state=l.STOPPED,this.trigger("StateChanged"),this.trigger("CancelUpload"))},disableBrowse:function(){U=arguments[0]!==i?arguments[0]:!0,F.length&&l.each(F,function(e){e.disable(U)}),this.trigger("DisableBrowse",U)},getFile:function(e){var t;for(t=D.length-1;t>=0;t--)if(D[t].id===e)return D[t]},addFile:function(e,i){function n(e,t){var i=[];l.each(u.settings.filters,function(t,n){s[n]&&i.push(function(i){s[n].call(u,t,e,function(e){i(!e)})})}),l.inSeries(i,t)}function a(e){var s=l.typeOf(e);if(e instanceof t.file.File){if(!e.ruid&&!e.isDetached()){if(!o)return!1;e.ruid=o,e.connectRuntime(o)}a(new l.File(e))}else e instanceof t.file.Blob?(a(e.getSource()),e.destroy()):e instanceof l.File?(i&&(e.name=i),d.push(function(t){n(e,function(i){i||(D.push(e),f.push(e),u.trigger("FileFiltered",e)),r(t,1)})})):-1!==l.inArray(s,["file","blob"])?a(new t.file.File(null,e)):"node"===s&&"filelist"===l.typeOf(e.files)?l.each(e.files,a):"array"===s&&(i=null,l.each(e,a))}var o,u=this,d=[],f=[];o=c(),a(e),d.length&&l.inSeries(d,function(){f.length&&u.trigger("FilesAdded",f)})},removeFile:function(e){for(var t="string"==typeof e?e:e.id,i=D.length-1;i>=0;i--)if(D[i].id===t)return this.splice(i,1)[0]},splice:function(e,t){var n=D.splice(e===i?0:e,t===i?D.length:t),r=!1;return this.state==l.STARTED&&(l.each(n,function(e){return e.status===l.UPLOADING?(r=!0,!1):void 0}),r&&this.stop()),this.trigger("FilesRemoved",n),l.each(n,function(e){e.destroy()}),r&&this.start(),n},dispatchEvent:function(e){var t,i;if(e=e.toLowerCase(),t=this.hasEventListener(e)){t.sort(function(e,t){return t.priority-e.priority}),i=[].slice.call(arguments),i.shift(),i.unshift(this);for(var n=0;n0&&(n.slice_blob=!0),l.isEmptyObj(e.resize)&&e.multipart!==!1||(n.send_binary_string=!0),e.http_method&&(n.use_http_method=e.http_method),l.each(e,function(e,i){t(i,!!e,!0)})),n}var r=window.setTimeout,s={},a=t.core.utils,o=t.runtime.Runtime,l={VERSION:"2.3.6",STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-601,FILE_DUPLICATE_ERROR:-602,IMAGE_FORMAT_ERROR:-700,MEMORY_ERROR:-701,IMAGE_DIMENSIONS_ERROR:-702,moxie:t,mimeTypes:a.Mime.mimes,ua:a.Env,typeOf:a.Basic.typeOf,extend:a.Basic.extend,guid:a.Basic.guid,getAll:function(e){var t,i=[];"array"!==l.typeOf(e)&&(e=[e]);for(var n=e.length;n--;)t=l.get(e[n]),t&&i.push(t);return i.length?i:null},get:a.Dom.get,each:a.Basic.each,getPos:a.Dom.getPos,getSize:a.Dom.getSize,xmlEncode:function(e){var t={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},i=/[<>&\"\']/g;return e?(""+e).replace(i,function(e){return t[e]?"&"+t[e]+";":e}):e},toArray:a.Basic.toArray,inArray:a.Basic.inArray,inSeries:a.Basic.inSeries,addI18n:t.core.I18n.addI18n,translate:t.core.I18n.translate,sprintf:a.Basic.sprintf,isEmptyObj:a.Basic.isEmptyObj,hasClass:a.Dom.hasClass,addClass:a.Dom.addClass,removeClass:a.Dom.removeClass,getStyle:a.Dom.getStyle,addEvent:a.Events.addEvent,removeEvent:a.Events.removeEvent,removeAllEvents:a.Events.removeAllEvents,cleanName:function(e){var t,i;for(i=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"],t=0;t0?"&":"?")+i),e},formatSize:function(e){function t(e,t){return Math.round(e*Math.pow(10,t))/Math.pow(10,t)}if(e===i||/\D/.test(e))return l.translate("N/A");var n=Math.pow(1024,4);return e>n?t(e/n,1)+" "+l.translate("tb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("gb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("mb"):e>1024?Math.round(e/1024)+" "+l.translate("kb"):e+" "+l.translate("b")},parseSize:a.Basic.parseSizeStr,predictRuntime:function(e,t){var i,n;return i=new l.Uploader(e),n=o.thatCan(i.getOption().required_features,t||e.runtimes),i.destroy(),n},addFileFilter:function(e,t){s[e]=t}};l.addFileFilter("mime_types",function(e,t,i){e.length&&!e.regexp.test(t.name)?(this.trigger("Error",{code:l.FILE_EXTENSION_ERROR,message:l.translate("File extension error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("max_file_size",function(e,t,i){var n;e=l.parseSize(e),t.size!==n&&e&&t.size>e?(this.trigger("Error",{code:l.FILE_SIZE_ERROR,message:l.translate("File size error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("prevent_duplicates",function(e,t,i){if(e)for(var n=this.files.length;n--;)if(t.name===this.files[n].name&&t.size===this.files[n].size)return this.trigger("Error",{code:l.FILE_DUPLICATE_ERROR,message:l.translate("Duplicate file error."),file:t}),i(!1),void 0;i(!0)}),l.addFileFilter("prevent_empty",function(e,t,n){e&&!t.size&&t.size!==i?(this.trigger("Error",{code:l.FILE_SIZE_ERROR,message:l.translate("File size error."),file:t}),n(!1)):n(!0)}),l.Uploader=function(e){function a(){var e,t,i=0;if(this.state==l.STARTED){for(t=0;t0?Math.ceil(100*(e.loaded/e.size)):100,d()}function d(){var e,t,n,r=0;for(I.reset(),e=0;eS)&&(r+=n),I.loaded+=n):I.size=i,t.status==l.DONE?I.uploaded++:t.status==l.FAILED?I.failed++:I.queued++;I.size===i?I.percent=D.length>0?Math.ceil(100*(I.uploaded/D.length)):0:(I.bytesPerSec=Math.ceil(r/((+new Date-S||1)/1e3)),I.percent=I.size>0?Math.ceil(100*(I.loaded/I.size)):0)}function c(){var e=F[0]||P[0];return e?e.getRuntime().uid:!1}function f(){this.bind("FilesAdded FilesRemoved",function(e){e.trigger("QueueChanged"),e.refresh()}),this.bind("CancelUpload",b),this.bind("BeforeUpload",m),this.bind("UploadFile",_),this.bind("UploadProgress",E),this.bind("StateChanged",v),this.bind("QueueChanged",d),this.bind("Error",R),this.bind("FileUploaded",y),this.bind("Destroy",z)}function p(e,i){var n=this,r=0,s=[],a={runtime_order:e.runtimes,required_caps:e.required_features,preferred_caps:x,swf_url:e.flash_swf_url,xap_url:e.silverlight_xap_url};l.each(e.runtimes.split(/\s*,\s*/),function(t){e[t]&&(a[t]=e[t])}),e.browse_button&&l.each(e.browse_button,function(i){s.push(function(s){var u=new t.file.FileInput(l.extend({},a,{accept:e.filters.mime_types,name:e.file_data_name,multiple:e.multi_selection,container:e.container,browse_button:i}));u.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),multi_selection:e.can("select_multiple")}),r++,F.push(this),s()},u.onchange=function(){n.addFile(this.files)},u.bind("mouseenter mouseleave mousedown mouseup",function(t){U||(e.browse_button_hover&&("mouseenter"===t.type?l.addClass(i,e.browse_button_hover):"mouseleave"===t.type&&l.removeClass(i,e.browse_button_hover)),e.browse_button_active&&("mousedown"===t.type?l.addClass(i,e.browse_button_active):"mouseup"===t.type&&l.removeClass(i,e.browse_button_active)))}),u.bind("mousedown",function(){n.trigger("Browse")}),u.bind("error runtimeerror",function(){u=null,s()}),u.init()})}),e.drop_element&&l.each(e.drop_element,function(e){s.push(function(i){var s=new t.file.FileDrop(l.extend({},a,{drop_zone:e}));s.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),dragdrop:e.can("drag_and_drop")}),r++,P.push(this),i()},s.ondrop=function(){n.addFile(this.files)},s.bind("error runtimeerror",function(){s=null,i()}),s.init()})}),l.inSeries(s,function(){"function"==typeof i&&i(r)})}function g(e,n,r,s){var a=new t.image.Image;try{a.onload=function(){n.width>this.width&&n.height>this.height&&n.quality===i&&n.preserve_headers&&!n.crop?(this.destroy(),s(e)):a.downsize(n.width,n.height,n.crop,n.preserve_headers)},a.onresize=function(){var t=this.getAsBlob(e.type,n.quality);this.destroy(),s(t)},a.bind("error runtimeerror",function(){this.destroy(),s(e)}),a.load(e,r)}catch(o){s(e)}}function h(e,i,r){function s(e,i,n){var r=O[e];switch(e){case"max_file_size":"max_file_size"===e&&(O.max_file_size=O.filters.max_file_size=i);break;case"chunk_size":(i=l.parseSize(i))&&(O[e]=i,O.send_file_name=!0);break;case"multipart":O[e]=i,i||(O.send_file_name=!0);break;case"http_method":O[e]="PUT"===i.toUpperCase()?"PUT":"POST";break;case"unique_names":O[e]=i,i&&(O.send_file_name=!0);break;case"filters":"array"===l.typeOf(i)&&(i={mime_types:i}),n?l.extend(O.filters,i):O.filters=i,i.mime_types&&("string"===l.typeOf(i.mime_types)&&(i.mime_types=t.core.utils.Mime.mimes2extList(i.mime_types)),i.mime_types.regexp=function(e){var t=[];return l.each(e,function(e){l.each(e.extensions.split(/,/),function(e){/^\s*\*\s*$/.test(e)?t.push("\\.*"):t.push("\\."+e.replace(new RegExp("["+"/^$.*+?|()[]{}\\".replace(/./g,"\\$&")+"]","g"),"\\$&"))})}),new RegExp("("+t.join("|")+")$","i")}(i.mime_types),O.filters.mime_types=i.mime_types);break;case"resize":O.resize=i?l.extend({preserve_headers:!0,crop:!1},i):!1;break;case"prevent_duplicates":O.prevent_duplicates=O.filters.prevent_duplicates=!!i;break;case"container":case"browse_button":case"drop_element":i="container"===e?l.get(i):l.getAll(i);case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":O[e]=i,n||(u=!0);break;default:O[e]=i}n||a.trigger("OptionChanged",e,i,r)}var a=this,u=!1;"object"==typeof e?l.each(e,function(e,t){s(t,e,r)}):s(e,i,r),r?(O.required_features=n(l.extend({},O)),x=n(l.extend({},O,{required_features:!0}))):u&&(a.trigger("Destroy"),p.call(a,O,function(e){e?(a.runtime=o.getInfo(c()).type,a.trigger("Init",{runtime:a.runtime}),a.trigger("PostInit")):a.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}))}function m(e,t){if(e.settings.unique_names){var i=t.name.match(/\.([^.]+)$/),n="part";i&&(n=i[1]),t.target_name=t.id+"."+n}}function _(e,i){function n(){c-->0?r(s,1e3):(i.loaded=p,e.trigger("Error",{code:l.HTTP_ERROR,message:l.translate("HTTP Error."),file:i,response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()}))}function s(){var t,n,r={};i.status===l.UPLOADING&&e.state!==l.STOPPED&&(e.settings.send_file_name&&(r.name=i.target_name||i.name),d&&f.chunks&&o.size>d?(n=Math.min(d,o.size-p),t=o.slice(p,p+n)):(n=o.size,t=o),d&&f.chunks&&(e.settings.send_chunk_number?(r.chunk=Math.ceil(p/d),r.chunks=Math.ceil(o.size/d)):(r.offset=p,r.total=o.size)),e.trigger("BeforeChunkUpload",i,r,t,p)&&a(r,t,n))}function a(a,d,g){var m;T=new t.xhr.XMLHttpRequest,T.upload&&(T.upload.onprogress=function(t){i.loaded=Math.min(i.size,p+t.loaded),e.trigger("UploadProgress",i)}),T.onload=function(){return T.status<200||T.status>=400?(n(),void 0):(c=e.settings.max_retries,g=o.size?(i.size!=i.origSize&&(o.destroy(),o=null),e.trigger("UploadProgress",i),i.status=l.DONE,i.completeTimestamp=+new Date,e.trigger("FileUploaded",i,{response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()})):r(s,1),void 0)},T.onerror=function(){n()},T.onloadend=function(){this.destroy()},e.settings.multipart&&f.multipart?(T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),m=new t.xhr.FormData,l.each(l.extend(a,e.settings.multipart_params),function(e,t){m.append(t,e)}),m.append(e.settings.file_data_name,d),T.send(m,h)):(u=l.buildUrl(e.settings.url,l.extend(a,e.settings.multipart_params)),T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),T.hasRequestHeader("Content-Type")||T.setRequestHeader("Content-Type","application/octet-stream"),T.send(d,h))}var o,u=e.settings.url,d=e.settings.chunk_size,c=e.settings.max_retries,f=e.features,p=0,h={runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:x,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url};i.loaded&&(p=i.loaded=d?d*Math.floor(i.loaded/d):0),o=i.getSource(),l.isEmptyObj(e.settings.resize)||-1===l.inArray(o.type,["image/jpeg","image/png"])?s():g(o,e.settings.resize,h,function(e){o=e,i.size=e.size,s()})}function E(e,t){u(t)}function v(e){if(e.state==l.STARTED)S=+new Date;else if(e.state==l.STOPPED)for(var t=e.files.length-1;t>=0;t--)e.files[t].status==l.UPLOADING&&(e.files[t].status=l.QUEUED,d())}function b(){T&&T.abort()}function y(e){d(),r(function(){a.call(e)},1)}function R(e,t){t.code===l.INIT_ERROR?e.destroy():t.code===l.HTTP_ERROR&&(t.file.status=l.FAILED,t.file.completeTimestamp=+new Date,u(t.file),e.state==l.STARTED&&(e.trigger("CancelUpload"),r(function(){a.call(e)},1)))}function z(e){e.stop(),l.each(D,function(e){e.destroy()}),D=[],F.length&&(l.each(F,function(e){e.destroy()}),F=[]),P.length&&(l.each(P,function(e){e.destroy()}),P=[]),x={},U=!1,S=T=null,I.reset()}var O,S,I,T,w=l.guid(),D=[],x={},F=[],P=[],U=!1;O={chunk_size:0,file_data_name:"file",filters:{mime_types:[],max_file_size:0,prevent_duplicates:!1,prevent_empty:!0},flash_swf_url:"js/Moxie.swf",http_method:"POST",max_retries:0,multipart:!0,multi_selection:!0,resize:!1,runtimes:o.order,send_file_name:!0,send_chunk_number:!0,silverlight_xap_url:"js/Moxie.xap"},h.call(this,e,null,!0),I=new l.QueueProgress,l.extend(this,{id:w,uid:w,state:l.STOPPED,features:{},runtime:null,files:D,settings:O,total:I,init:function(){var e,t,i=this;return e=i.getOption("preinit"),"function"==typeof e?e(i):l.each(e,function(e,t){i.bind(t,e)}),f.call(i),l.each(["container","browse_button","drop_element"],function(e){return null===i.getOption(e)?(t={code:l.INIT_ERROR,message:l.sprintf(l.translate("%s specified, but cannot be found."),e)},!1):void 0}),t?i.trigger("Error",t):O.browse_button||O.drop_element?(p.call(i,O,function(e){var t=i.getOption("init");"function"==typeof t?t(i):l.each(t,function(e,t){i.bind(t,e)}),e?(i.runtime=o.getInfo(c()).type,i.trigger("Init",{runtime:i.runtime}),i.trigger("PostInit")):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}),void 0):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("You must specify either browse_button or drop_element.")})},setOption:function(e,t){h.call(this,e,t,!this.runtime)},getOption:function(e){return e?O[e]:O},refresh:function(){F.length&&l.each(F,function(e){e.trigger("Refresh")}),this.trigger("Refresh")},start:function(){this.state!=l.STARTED&&(this.state=l.STARTED,this.trigger("StateChanged"),a.call(this))},stop:function(){this.state!=l.STOPPED&&(this.state=l.STOPPED,this.trigger("StateChanged"),this.trigger("CancelUpload"))},disableBrowse:function(){U=arguments[0]!==i?arguments[0]:!0,F.length&&l.each(F,function(e){e.disable(U)}),this.trigger("DisableBrowse",U)},getFile:function(e){var t;for(t=D.length-1;t>=0;t--)if(D[t].id===e)return D[t]},addFile:function(e,i){function n(e,t){var i=[];l.each(u.settings.filters,function(t,n){s[n]&&i.push(function(i){s[n].call(u,t,e,function(e){i(!e)})})}),l.inSeries(i,t)}function a(e){var s=l.typeOf(e);if(e instanceof t.file.File){if(!e.ruid&&!e.isDetached()){if(!o)return!1;e.ruid=o,e.connectRuntime(o)}a(new l.File(e))}else e instanceof t.file.Blob?(a(e.getSource()),e.destroy()):e instanceof l.File?(i&&(e.name=i),d.push(function(t){n(e,function(i){i||(D.push(e),f.push(e),u.trigger("FileFiltered",e)),r(t,1)})})):-1!==l.inArray(s,["file","blob"])?a(new t.file.File(null,e)):"node"===s&&"filelist"===l.typeOf(e.files)?l.each(e.files,a):"array"===s&&(i=null,l.each(e,a))}var o,u=this,d=[],f=[];o=c(),a(e),d.length&&l.inSeries(d,function(){f.length&&u.trigger("FilesAdded",f)})},removeFile:function(e){for(var t="string"==typeof e?e:e.id,i=D.length-1;i>=0;i--)if(D[i].id===t)return this.splice(i,1)[0]},splice:function(e,t){var n=D.splice(e===i?0:e,t===i?D.length:t),r=!1;return this.state==l.STARTED&&(l.each(n,function(e){return e.status===l.UPLOADING?(r=!0,!1):void 0}),r&&this.stop()),this.trigger("FilesRemoved",n),l.each(n,function(e){e.destroy()}),r&&this.start(),n},dispatchEvent:function(e){var t,i;if(e=e.toLowerCase(),t=this.hasEventListener(e)){t.sort(function(e,t){return t.priority-e.priority}),i=[].slice.call(arguments),i.shift(),i.unshift(this);for(var n=0;n Date: Sat, 20 Oct 2018 11:05:04 +0200 Subject: [PATCH 147/148] [ticket/15852] Fix whois for IPv6 addresses PHPBB3-15852 --- phpBB/includes/functions_user.php | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index 2677916a7d..d019b867fa 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -1429,21 +1429,14 @@ function user_ipwhois($ip) return ''; } - if (preg_match(get_preg_expression('ipv4'), $ip)) - { - // IPv4 address - $whois_host = 'whois.arin.net.'; - } - else if (preg_match(get_preg_expression('ipv6'), $ip)) - { - // IPv6 address - $whois_host = 'whois.sixxs.net.'; - } - else + if (!preg_match(get_preg_expression('ipv4'), $ip) && !preg_match(get_preg_expression('ipv6'), $ip)) { return ''; } + // IPv4 & IPv6 addresses + $whois_host = 'whois.arin.net.'; + $ipwhois = ''; if (($fsk = @fsockopen($whois_host, 43))) From dbd0304c1d659e938d4f311649631e7a6fdb32f6 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Fri, 19 Oct 2018 12:26:37 -0400 Subject: [PATCH 148/148] [ticket/15836] Rename event to have unique name PHPBB3-15836 --- phpBB/includes/functions_messenger.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index 7b530d7119..75c15657b0 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -915,7 +915,7 @@ class queue /** * Event to send message via external transport * - * @event core.notification_message_email + * @event core.notification_message_process * @var bool break Flag indicating if the function return after hook * @var array addresses The message recipients * @var string subject The message subject @@ -928,7 +928,7 @@ class queue 'subject', 'msg', ); - extract($phpbb_dispatcher->trigger_event('core.notification_message_email', compact($vars))); + extract($phpbb_dispatcher->trigger_event('core.notification_message_process', compact($vars))); if (!$break) {