aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTristan Darricau <github@nicofuma.fr>2016-12-03 14:42:27 +0100
committerTristan Darricau <github@nicofuma.fr>2016-12-03 14:42:27 +0100
commit3acee9a3eea8e3fdcef59876da273358a46903e8 (patch)
tree3ed42316c51a61a1f40fb4a2c2f5952efc64c11d
parent487df8befc9477c742b2794593c2ddb290c1c678 (diff)
parent5895f56de05b637765a6583b8c51c1db3daabe91 (diff)
downloadforums-3acee9a3eea8e3fdcef59876da273358a46903e8.tar
forums-3acee9a3eea8e3fdcef59876da273358a46903e8.tar.gz
forums-3acee9a3eea8e3fdcef59876da273358a46903e8.tar.bz2
forums-3acee9a3eea8e3fdcef59876da273358a46903e8.tar.xz
forums-3acee9a3eea8e3fdcef59876da273358a46903e8.zip
Merge pull request #4189 from marc1706/ticket/14492
[ticket/14492] Improve send stats page and include VigLink * marc1706/ticket/14492: (47 commits) [ticket/14492] Add user service to installer & only instantiate if needed [ticket/14492] Fix redirection to help phpBB page [ticket/14492] Encode URI components in systemdata for stats [ticket/14492] Always update the time the stats were sent [ticket/14492] Update versions in files [ticket/14492] Add missing event variable [ticket/14492] Don't explicitly pass data providers by refs [ticket/14492] Update phpBB version and fix miscellaneous code issues [ticket/14492] Install all extensions if 'all' is specified for extensions [ticket/14492] Checkout master if viglink tag does not exist for latest version [ticket/14492] Add language variables for updating extensions [ticket/14492] Prevent timeouts in install & update extensions tasks [ticket/14492] Use same list for checking if extension should be updated [ticket/14492] Add missing config to schema_data.sql [ticket/14492] Unify version check for installing default extensions [ticket/14492] Use extension manager instead of finder and add try/catch [ticket/14492] Checkout viglink for each version depending on tags [ticket/14492] Remove unused use statement [ticket/14492] Redirect to help phpBB page after installation [ticket/14492] Properly retrieve version updating from ...
-rw-r--r--build/build.xml49
-rw-r--r--phpBB/adm/style/acp_help_phpbb.html61
-rw-r--r--phpBB/adm/style/acp_send_statistics.html64
-rw-r--r--phpBB/adm/style/admin.css108
-rw-r--r--phpBB/adm/style/admin.js14
-rw-r--r--phpBB/adm/style/ajax.js99
-rw-r--r--phpBB/adm/style/overall_header.html1
-rw-r--r--phpBB/config/installer/container/services.yml6
-rw-r--r--phpBB/config/installer/container/services_install_finish.yml12
-rw-r--r--phpBB/config/installer/container/services_update_database.yml11
-rw-r--r--phpBB/docs/events.md12
-rw-r--r--phpBB/docs/install-config.sample.yml2
-rw-r--r--phpBB/docs/update-config.sample.yml1
-rw-r--r--phpBB/includes/acp/acp_help_phpbb.php143
-rw-r--r--phpBB/includes/acp/acp_send_statistics.php91
-rw-r--r--phpBB/includes/acp/info/acp_help_phpbb.php (renamed from phpBB/includes/acp/info/acp_send_statistics.php)8
-rw-r--r--phpBB/includes/functions_acp.php1
-rw-r--r--phpBB/includes/questionnaire/questionnaire.php6
-rw-r--r--phpBB/install/schemas/schema_data.sql2
-rw-r--r--phpBB/language/en/acp/common.php10
-rw-r--r--phpBB/language/en/cli.php2
-rw-r--r--phpBB/language/en/install.php3
-rw-r--r--phpBB/phpbb/db/migration/data/v320/add_help_phpbb.php50
-rw-r--r--phpBB/phpbb/install/console/command/install/install.php3
-rw-r--r--phpBB/phpbb/install/console/command/update/update.php3
-rw-r--r--phpBB/phpbb/install/installer.php11
-rw-r--r--phpBB/phpbb/install/installer_configuration.php4
-rw-r--r--phpBB/phpbb/install/module/install_finish/task/install_extensions.php199
-rw-r--r--phpBB/phpbb/install/module/update_database/task/update.php2
-rw-r--r--phpBB/phpbb/install/module/update_database/task/update_extensions.php263
-rw-r--r--phpBB/phpbb/install/module/update_filesystem/task/file_check.php32
-rw-r--r--phpBB/phpbb/install/updater_configuration.php4
-rw-r--r--tests/test_framework/phpbb_functional_test_case.php2
33 files changed, 1106 insertions, 173 deletions
diff --git a/build/build.xml b/build/build.xml
index 9cf222ae9e..4fe6e0e908 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -142,6 +142,7 @@
<phingcall target="export">
<property name="revision" value="release-${version}" />
+ <property name="version" value="${version}" />
<property name="dir" value="build/old_versions/release-${version}" />
<property name="skip-composer" value="true" />
</phingcall>
@@ -287,6 +288,54 @@
</else>
</if>
+ <!-- Checkout latest viglink to ext folder -->
+ <available file="${dir}/ext" type="dir" property="add-viglink-ext" />
+ <exec dir="${dir}"
+ command='php -r "echo version_compare(&apos;${version}&apos;, &apos;3.2.0-RC2&apos;, &apos;>=&apos;) ? &apos;true&apos; : &apos;false&apos;;"'
+ checkreturn="true"
+ outputProperty='viglink-available' />
+ <if>
+ <and>
+ <equals arg1="${add-viglink-ext}" arg2="1" trim="true" />
+ <or>
+ <equals arg1="${revision}" arg2="HEAD" trim="true" />
+ <equals arg1="${viglink-available}" arg2="1" trim="true" />
+ </or>
+ </and>
+ <then>
+ <exec dir="${dir}/ext" command="mkdir phpbb" passthru="true" />
+
+ <exec dir="${dir}/ext/phpbb" command="git clone https://github.com/phpbb-extensions/viglink.git viglink" passthru="true" checkreturn="true" />
+ <if>
+ <equals arg1="${revision}" arg2="HEAD" trim="true" />
+ <then>
+ <exec dir="${dir}/ext/phpbb/viglink"
+ command="git rev-parse release-phpbb-${version}"
+ returnProperty='viglink_head_tag_exists' />
+ <if>
+ <equals arg1="${viglink_head_tag_exists}" arg2="0" trim="true" />
+ <then>
+ <exec dir="${dir}/ext/phpbb/viglink" command="git checkout release-phpbb-${version}" passthru="true" />
+ </then>
+ <else>
+ <exec dir="${dir}/ext/phpbb/viglink" command="git checkout master" passthru="true" />
+ </else>
+ </if>
+ </then>
+ <else>
+ <exec dir="${dir}/ext/phpbb/viglink" command="git checkout release-phpbb-${version}" passthru="true" />
+ </else>
+ </if>
+ <delete dir="${dir}/ext/phpbb/viglink/.git" />
+ <delete dir="${dir}/ext/phpbb/viglink/tests" />
+ <delete dir="${dir}/ext/phpbb/viglink/travis" />
+ <delete file="${dir}/ext/phpbb/viglink/.gitattributes" />
+ <delete file="${dir}/ext/phpbb/viglink/.travis.yml" />
+ <delete file="${dir}/ext/phpbb/viglink/phpunit.xml.dist" />
+ <delete file="${dir}/ext/phpbb/viglink/README.md" />
+ </then>
+ </if>
+
<!-- Create schema.json -->
<exec dir="${dir}" command="php develop/create_schema_files.php" />
diff --git a/phpBB/adm/style/acp_help_phpbb.html b/phpBB/adm/style/acp_help_phpbb.html
new file mode 100644
index 0000000000..48a4595913
--- /dev/null
+++ b/phpBB/adm/style/acp_help_phpbb.html
@@ -0,0 +1,61 @@
+<!-- INCLUDE overall_header.html -->
+
+<a id="maincontent"></a>
+
+<h1>{L_ACP_HELP_PHPBB}</h1>
+
+<form id="acp_help_phpbb" method="post" action="{U_ACTION}" data-ajax-action="{U_COLLECT_STATS}">
+<div class="send-stats-row">
+ <!-- EVENT acp_help_phpbb_stats_before -->
+ <div class="send-stats-tile">
+ <h2><i class="icon fa-bar-chart"></i>Send statistics</h2>
+ <p>{L_EXPLAIN_SEND_STATISTICS}</p>
+ <div class="send-stats-row">
+ <div class="send-stats-data-row send-stats-data-only-row">
+ <a id="trigger-configlist" data-ajax="toggle_link" data-overlay="false" data-toggle-text="{L_HIDE_STATISTICS}"><span>{L_SHOW_STATISTICS}</span><i class="icon fa-angle-down"></i></a>
+ </div>
+ <div class="send-stats-data-row">
+ <div class="configlist" id="configlist">
+ <!-- BEGIN providers -->
+ <fieldset>
+ <legend>{providers.NAME}</legend>
+ <!-- BEGIN values -->
+ <dl>
+ <dt>{providers.values.KEY}</dt>
+ <dd>{providers.values.VALUE}</dd>
+ </dl>
+ <!-- END values -->
+ </fieldset>
+ <!-- END providers -->
+ </div>
+ </div>
+ </div>
+ <dl class="send-stats-settings">
+ <dt>
+ <input name="help_send_statistics" id="help_send_statistics" type="checkbox"<!-- IF S_COLLECT_STATS --> checked="checked"<!-- ENDIF --> />
+ <label for="help_send_statistics"></label>
+ </dt>
+ <dd>{L_SEND_STATISTICS_LONG}</dd>
+ </dl>
+ </div>
+ <!-- EVENT acp_help_phpbb_stats_after -->
+ <fieldset>
+ <p class="submit-buttons">
+ <input type="hidden" name="systemdata" value="{RAW_DATA}" />
+ <input type="hidden" name="help_send_statistics_time" value="{COLLECT_STATS_TIME}" />
+ <input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />
+ </p>
+ {S_FORM_TOKEN}
+ </fieldset>
+</div>
+</form>
+<form action="{U_COLLECT_STATS}" method="post" target="questionaire_result" id="questionnaire-form">
+ <fieldset>
+ <p class="submit-buttons">
+ <input type="hidden" name="systemdata" value="{RAW_DATA}" />
+ <input class="button1" type="submit" id="submit_stats" name="submit" value="{L_SEND_STATISTICS}" />
+ </p>
+ </fieldset>
+</form>
+
+<!-- INCLUDE overall_footer.html -->
diff --git a/phpBB/adm/style/acp_send_statistics.html b/phpBB/adm/style/acp_send_statistics.html
deleted file mode 100644
index 480e438e1f..0000000000
--- a/phpBB/adm/style/acp_send_statistics.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!-- INCLUDE overall_header.html -->
-
-<a id="maincontent"></a>
-
-<h1>{L_SEND_STATISTICS}</h1>
-
-<p>{L_EXPLAIN_SEND_STATISTICS}</p>
-
-<script type="text/javascript">
-//<![CDATA[
-var iframect = 0;
-
-function iframe_updated()
-{
- if (iframect++ == 0)
- {
- return;
- }
-
- phpbb.toggleDisplay('questionnaire-form', -1);
- phpbb.toggleDisplay('questionnaire-thanks', 1);
-}
-//]]>
-</script>
-
-<iframe onload="iframe_updated();" name="questionaire_result" style="display: none;"></iframe>
-
-<form action="{U_COLLECT_STATS}" method="post" target="questionaire_result" id="questionnaire-form">
-
- <p><a href="{U_ACP_MAIN}">{L_DONT_SEND_STATISTICS}</a></p>
-
- <p>{L_EXPLAIN_SHOW_STATISTICS}</p>
-
- <p id="show-button"><input type="button" class="button2" onclick="phpbb.toggleDisplay('configlist', 1); phpbb.toggleDisplay('show-button', -1);" value="{L_SHOW_STATISTICS}" /></p>
-
- <div id="configlist">
- <input type="button" class="button2" onclick="phpbb.toggleDisplay('show-button', 1); phpbb.toggleDisplay('configlist', -1);" value="{L_HIDE_STATISTICS}" />
- <p class="submit-buttons">
- <input class="button1" type="submit" id="submit" name="submit" value="{L_SEND_STATISTICS}" />
- </p>
-
- <!-- BEGIN providers -->
- <fieldset>
- <legend>{providers.NAME}</legend>
- <!-- BEGIN values -->
- <dl>
- <dt>{providers.values.KEY}</dt>
- <dd>{providers.values.VALUE}</dd>
- </dl>
- <!-- END values -->
- </fieldset>
- <!-- END providers -->
- </div>
- <p class="submit-buttons">
- <input type="hidden" name="systemdata" value="{RAW_DATA}" />
- <input class="button1" type="submit" id="submit" name="submit" value="{L_SEND_STATISTICS}" />
- </p>
-</form>
-
-<div id="questionnaire-thanks" class="successbox">
- <p><strong>{L_THANKS_SEND_STATISTICS}</strong><br /><br /><a href="{U_ACP_MAIN}">&laquo; {L_GO_ACP_MAIN}</a></p>
-</div>
-
-<!-- INCLUDE overall_footer.html -->
diff --git a/phpBB/adm/style/admin.css b/phpBB/adm/style/admin.css
index e1668bf70b..bcf01fe597 100644
--- a/phpBB/adm/style/admin.css
+++ b/phpBB/adm/style/admin.css
@@ -2583,3 +2583,111 @@ fieldset.permissions .padding {
line-height: 25px;
font-weight: bold;
}
+
+.send-stats-row {
+ margin: 15px 0;
+}
+
+.send-stats-row:before {
+ display: table;
+ content: " ";
+}
+
+.send-stats-tile {
+ position: relative;
+ padding: 14px;
+ margin-bottom: 20px;
+ background-color: #eff0f2;
+ border-radius: 6px;
+ box-shadow: rgba(0,0,0,0.3) 1px 1px 5px;
+}
+
+.send-stats-tile h2 {
+ margin-top: 0;
+ text-align: center;
+ padding-bottom: 1em;
+}
+
+.send-stats-tile i {
+ padding-right: 0.3em;
+}
+
+.icon {
+ font-family: FontAwesome;
+ font-style: normal;
+}
+
+.send-stats-data-row {
+ background: #f9f9f9;
+ border-radius: 6px;
+ border: #DEDEDE 1px solid;
+ padding: 10px;
+ border-top-width: 0;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.send-stats-data-hidden .configlist {
+ display: none;
+}
+
+.send-stats-data-only-row {
+ border-radius: 6px !important;
+ border-bottom-width: 1px !important;
+}
+
+.send-stats-data-hidden {
+ padding: 0;
+ border: none;
+}
+
+.send-stats-row > .send-stats-data-row:first-child {
+ background-color: #d9edf7;
+ border-bottom-width: 0;
+ border-top-right-radius: 6px;
+ border-top-left-radius: 6px;
+ border-top-width: 1px;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.send-stats-settings dt, .send-stats-settings dd {
+ min-width: 25px;
+}
+
+.send-stats-settings dd {
+ line-height: 1.5em;
+}
+
+.send-stats-settings input {
+ display: none;
+}
+
+.send-stats-settings input[type=checkbox] + label:before {
+ content: "\f096";
+ font-family: FontAwesome;
+ font-size: 1.5em;
+}
+
+.send-stats-settings input[type=checkbox]:checked + label:before {
+ content: "\f14a";
+ color: #3c763d;
+}
+
+.send-stats-data-row a:hover span {
+ text-decoration: underline;
+}
+
+.send-stats-data-row a {
+ text-decoration: none;
+ cursor: default;
+}
+
+.send-stats-data-row i {
+ padding-left: 6px;
+}
+
+.configlist {
+ word-wrap: break-word;
+ word-break: break-all;
+}
diff --git a/phpBB/adm/style/admin.js b/phpBB/adm/style/admin.js
index 253fd46a62..551c78a4a3 100644
--- a/phpBB/adm/style/admin.js
+++ b/phpBB/adm/style/admin.js
@@ -243,8 +243,16 @@ function parse_document(container)
parse_document($('body'));
- // Hide configlist and success message in send statistics page
- phpbb.toggleDisplay('configlist', -1);
- phpbb.toggleDisplay('questionnaire-thanks', -1);
+ $('#questionnaire-form').css('display', 'none');
+ var $triggerConfiglist = $('#trigger-configlist');
+
+ $triggerConfiglist.on('click', function () {
+ var $configlist = $('#configlist');
+ $configlist.closest('.send-stats-data-row').toggleClass('send-stats-data-hidden');
+ $configlist.closest('.send-stats-row').find('.send-stats-data-row:first-child').toggleClass('send-stats-data-only-row');
+ $(this).find('i').toggleClass('fa-angle-down fa-angle-up');
+ });
+
+ $('#configlist').closest('.send-stats-data-row').addClass('send-stats-data-hidden');
});
})(jQuery);
diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js
index 3c1c57505b..d5154b2a61 100644
--- a/phpBB/adm/style/ajax.js
+++ b/phpBB/adm/style/ajax.js
@@ -4,6 +4,101 @@
'use strict';
+
+phpbb.prepareSendStats = function () {
+ var $form = $('#acp_help_phpbb');
+ var $dark = $('#darkenwrapper');
+ var $loadingIndicator;
+
+ $form.on('submit', function (event) {
+ var $this = $(this),
+ currentTime = Math.floor(new Date().getTime() / 1000),
+ statsTime = parseInt($this.find('input[name=help_send_statistics_time]').val(), 10);
+
+ event.preventDefault();
+ $this.unbind('submit');
+
+ // Skip ajax request if form is submitted too early or send stats
+ // checkbox is not checked
+ if (!$this.find('input[name=help_send_statistics]').is(':checked') ||
+ statsTime > currentTime) {
+ $form.find('input[type=submit]').click();
+ setTimeout(function () {
+ $form.find('input[type=submit]').click();
+ }, 300);
+ return;
+ }
+
+ /**
+ * Handler for AJAX errors
+ */
+ function errorHandler(jqXHR, textStatus, errorThrown) {
+ if (typeof console !== 'undefined' && console.log) {
+ console.log('AJAX error. status: ' + textStatus + ', message: ' + errorThrown);
+ }
+ phpbb.clearLoadingTimeout();
+ var errorText = '';
+
+ if (typeof errorThrown === 'string' && errorThrown.length > 0) {
+ errorText = errorThrown;
+ } else {
+ errorText = $dark.attr('data-ajax-error-text-' + textStatus);
+ if (typeof errorText !== 'string' || !errorText.length) {
+ errorText = $dark.attr('data-ajax-error-text');
+ }
+ }
+ phpbb.alert($dark.attr('data-ajax-error-title'), errorText);
+ }
+
+ /**
+ * This is a private function used to handle the callbacks, refreshes
+ * and alert. It calls the callback, refreshes the page if necessary, and
+ * displays an alert to the user and removes it after an amount of time.
+ *
+ * It cannot be called from outside this function, and is purely here to
+ * avoid repetition of code.
+ *
+ * @param {object} res The object sent back by the server.
+ */
+ function returnHandler(res) {
+ phpbb.clearLoadingTimeout();
+
+ // If a confirmation is not required, display an alert and call the
+ // callbacks.
+ $dark.fadeOut(phpbb.alertTime);
+
+ if ($loadingIndicator) {
+ $loadingIndicator.fadeOut(phpbb.alertTime);
+ }
+
+ var $sendStatisticsSuccess = $('<input />', {
+ type: 'hidden',
+ name: 'send_statistics_response',
+ value: res
+ });
+ $sendStatisticsSuccess.appendTo('p.submit-buttons');
+
+ // Finish actual form submission
+ $form.find('input[type=submit]').click();
+ }
+
+ $loadingIndicator = phpbb.loadingIndicator();
+
+ $.ajax({
+ url: $this.attr('data-ajax-action').replace('&amp;', '&'),
+ type: 'POST',
+ data: 'systemdata=' + encodeURIComponent($this.find('input[name=systemdata]').val()),
+ success: returnHandler,
+ error: errorHandler,
+ cache: false
+ }).always(function() {
+ if ($loadingIndicator && $loadingIndicator.is(':visible')) {
+ $loadingIndicator.fadeOut(phpbb.alertTime);
+ }
+ });
+ });
+};
+
/**
* The following callbacks are for reording items. row_down
* is triggered when an item is moved down, and row_up is triggered when
@@ -225,6 +320,10 @@ $(function() {
$(this).attr('data-clicked', true);
});
}
+
+ if ($('#acp_help_phpbb')) {
+ phpbb.prepareSendStats();
+ }
});
diff --git a/phpBB/adm/style/overall_header.html b/phpBB/adm/style/overall_header.html
index f227f729fd..1e8de766ff 100644
--- a/phpBB/adm/style/overall_header.html
+++ b/phpBB/adm/style/overall_header.html
@@ -7,6 +7,7 @@
<!-- IF META -->{META}<!-- ENDIF -->
<title>{PAGE_TITLE}</title>
+<link href="{T_FONT_AWESOME_LINK}" rel="stylesheet">
<link href="style/admin.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen" />
<script type="text/javascript">
diff --git a/phpBB/config/installer/container/services.yml b/phpBB/config/installer/container/services.yml
index 4c3ed3bfcb..c16547c649 100644
--- a/phpBB/config/installer/container/services.yml
+++ b/phpBB/config/installer/container/services.yml
@@ -88,6 +88,12 @@ services:
calls:
- [setLexer, ['@template.twig.lexer']]
+ user:
+ class: phpbb\user
+ arguments:
+ - '@language'
+ - '%datetime.class%'
+
console.exception_subscriber:
class: phpbb\console\exception_subscriber
arguments:
diff --git a/phpBB/config/installer/container/services_install_finish.yml b/phpBB/config/installer/container/services_install_finish.yml
index 8b06ad7d97..6a46d8f9d9 100644
--- a/phpBB/config/installer/container/services_install_finish.yml
+++ b/phpBB/config/installer/container/services_install_finish.yml
@@ -7,6 +7,16 @@ services:
tags:
- { name: install_finish, order: 10 }
+ installer.install_finish.install_extensions:
+ class: phpbb\install\module\install_finish\task\install_extensions
+ arguments:
+ - '@installer.helper.container_factory'
+ - '@installer.helper.config'
+ - '@installer.helper.iohandler'
+ - '%core.root_path%'
+ tags:
+ - { name: install_finish, order: 20 }
+
installer.install_finish.notify_user:
class: phpbb\install\module\install_finish\task\notify_user
arguments:
@@ -16,7 +26,7 @@ services:
- '%core.root_path%'
- '%core.php_ext%'
tags:
- - { name: install_finish, order: 20 }
+ - { name: install_finish, order: 30 }
installer.module.install_finish_collection:
class: phpbb\di\ordered_service_collection
diff --git a/phpBB/config/installer/container/services_update_database.yml b/phpBB/config/installer/container/services_update_database.yml
index 9cb9cb9abf..bb97cff489 100644
--- a/phpBB/config/installer/container/services_update_database.yml
+++ b/phpBB/config/installer/container/services_update_database.yml
@@ -11,6 +11,17 @@ services:
tags:
- { name: update_database_task, order: 10 }
+ installer.update_database.update_extensions:
+ class: phpbb\install\module\update_database\task\update_extensions
+ arguments:
+ - '@installer.helper.container_factory'
+ - '@installer.helper.config'
+ - '@installer.helper.iohandler'
+ - '@installer.helper.update_helper'
+ - '%core.root_path%'
+ tags:
+ - { name: update_database_task, order: 20 }
+
installer.module.update_database_collection:
class: phpbb\di\ordered_service_collection
arguments:
diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md
index a939c6ff7e..619ba06c5f 100644
--- a/phpBB/docs/events.md
+++ b/phpBB/docs/events.md
@@ -196,6 +196,18 @@ acp_groups_position_teampage_add_button_before
* Since: 3.1.7-RC1
* Purpose: Add content before adding group to teampage submit button
+acp_help_phpbb_stats_after
+===
+* Location: adm/style/acp_help_phpbb.html
+* Since: 3.2.0-RC2
+* Purpose: Add content after send statistics tile
+
+acp_help_phpbb_stats_before
+===
+* Location: adm/style/acp_help_phpbb.html
+* Since: 3.2.0-RC2
+* Purpose: Add content before send statistics tile
+
acp_logs_quick_select_forum_button_append
===
* Location: adm/style/acp_logs.html
diff --git a/phpBB/docs/install-config.sample.yml b/phpBB/docs/install-config.sample.yml
index 47c0324599..a354e52e2f 100644
--- a/phpBB/docs/install-config.sample.yml
+++ b/phpBB/docs/install-config.sample.yml
@@ -34,3 +34,5 @@ installer:
server_name: localhost
server_port: 80
script_path: /
+
+ extensions: ['phpbb/viglink']
diff --git a/phpBB/docs/update-config.sample.yml b/phpBB/docs/update-config.sample.yml
index f3b52a8c01..caa1a9ef1e 100644
--- a/phpBB/docs/update-config.sample.yml
+++ b/phpBB/docs/update-config.sample.yml
@@ -1,2 +1,3 @@
updater:
type: all
+ extensions: ['phpbb/viglink']
diff --git a/phpBB/includes/acp/acp_help_phpbb.php b/phpBB/includes/acp/acp_help_phpbb.php
new file mode 100644
index 0000000000..7991a0dad6
--- /dev/null
+++ b/phpBB/includes/acp/acp_help_phpbb.php
@@ -0,0 +1,143 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+class acp_help_phpbb
+{
+ var $u_action;
+
+ function main($id, $mode)
+ {
+ global $config, $request, $template, $user, $phpbb_dispatcher, $phpbb_admin_path, $phpbb_root_path, $phpEx;
+
+ if (!class_exists('phpbb_questionnaire_data_collector'))
+ {
+ include($phpbb_root_path . 'includes/questionnaire/questionnaire.' . $phpEx);
+ }
+
+ $collect_url = "https://www.phpbb.com/stats/receive_stats.php";
+
+ $this->tpl_name = 'acp_help_phpbb';
+ $this->page_title = 'ACP_HELP_PHPBB';
+
+ $submit = ($request->is_set_post('submit')) ? true : false;
+
+ $form_key = 'acp_help_phpbb';
+ add_form_key($form_key);
+ $error = array();
+
+ if ($submit && !check_form_key($form_key))
+ {
+ $error[] = $user->lang['FORM_INVALID'];
+ }
+ // Do not write values if there is an error
+ if (sizeof($error))
+ {
+ $submit = false;
+ }
+
+ // generate a unique id if necessary
+ if (!isset($config['questionnaire_unique_id']))
+ {
+ $install_id = unique_id();
+ $config->set('questionnaire_unique_id', $install_id);
+ }
+ else
+ {
+ $install_id = $config['questionnaire_unique_id'];
+ }
+
+ $collector = new phpbb_questionnaire_data_collector($install_id);
+
+ // Add data provider
+ $collector->add_data_provider(new phpbb_questionnaire_php_data_provider());
+ $collector->add_data_provider(new phpbb_questionnaire_system_data_provider());
+ $collector->add_data_provider(new phpbb_questionnaire_phpbb_data_provider($config));
+
+ /**
+ * Event to modify ACP help phpBB page and/or listen to submit
+ *
+ * @event core.acp_help_phpbb_submit_before
+ * @var boolean submit Do we display the form or process the submission
+ * @since 3.2.0-RC2
+ */
+ $vars = array('submit');
+ extract($phpbb_dispatcher->trigger_event('core.acp_help_phpbb_submit_before', compact($vars)));
+
+ if ($submit)
+ {
+ $config->set('help_send_statistics', $request->variable('help_send_statistics', false));
+ $response = $request->variable('send_statistics_response', '');
+
+ $config->set('help_send_statistics_time', time());
+
+ if (!empty($response))
+ {
+ if ((strpos($response, 'Thank you') !== false || strpos($response, 'Flood protection') !== false))
+ {
+ trigger_error($user->lang('THANKS_SEND_STATISTICS') . adm_back_link($this->u_action));
+ }
+ else
+ {
+ trigger_error($user->lang('FAIL_SEND_STATISTICS') . adm_back_link($this->u_action));
+ }
+ }
+
+ trigger_error($user->lang('CONFIG_UPDATED') . adm_back_link($this->u_action));
+ }
+
+ $template->assign_vars(array(
+ 'U_COLLECT_STATS' => $collect_url,
+ 'S_COLLECT_STATS' => (!empty($config['help_send_statistics'])) ? true : false,
+ 'RAW_DATA' => $collector->get_data_for_form(),
+ 'U_ACP_MAIN' => append_sid("{$phpbb_admin_path}index.$phpEx"),
+ 'U_ACTION' => $this->u_action,
+ // Pass earliest time we should try to send stats again
+ 'COLLECT_STATS_TIME' => intval($config['help_send_statistics_time']) + 86400,
+ ));
+
+ $raw = $collector->get_data_raw();
+
+ foreach ($raw as $provider => $data)
+ {
+ if ($provider == 'install_id')
+ {
+ $data = array($provider => $data);
+ }
+
+ $template->assign_block_vars('providers', array(
+ 'NAME' => htmlspecialchars($provider),
+ ));
+
+ foreach ($data as $key => $value)
+ {
+ if (is_array($value))
+ {
+ $value = utf8_wordwrap(serialize($value), 75, "\n", true);
+ }
+
+ $template->assign_block_vars('providers.values', array(
+ 'KEY' => utf8_htmlspecialchars($key),
+ 'VALUE' => utf8_htmlspecialchars($value),
+ ));
+ }
+ }
+ }
+}
diff --git a/phpBB/includes/acp/acp_send_statistics.php b/phpBB/includes/acp/acp_send_statistics.php
deleted file mode 100644
index 74da5996f1..0000000000
--- a/phpBB/includes/acp/acp_send_statistics.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-/**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
-
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-class acp_send_statistics
-{
- var $u_action;
-
- function main($id, $mode)
- {
- global $config, $template, $phpbb_admin_path, $phpbb_root_path, $phpEx;
-
- if (!class_exists('phpbb_questionnaire_data_collector'))
- {
- include($phpbb_root_path . 'includes/questionnaire/questionnaire.' . $phpEx);
- }
-
- $collect_url = "https://www.phpbb.com/stats/receive_stats.php";
-
- $this->tpl_name = 'acp_send_statistics';
- $this->page_title = 'ACP_SEND_STATISTICS';
-
- // generate a unique id if necessary
- if (!isset($config['questionnaire_unique_id']))
- {
- $install_id = unique_id();
- $config->set('questionnaire_unique_id', $install_id);
- }
- else
- {
- $install_id = $config['questionnaire_unique_id'];
- }
-
- $collector = new phpbb_questionnaire_data_collector($install_id);
-
- // Add data provider
- $collector->add_data_provider(new phpbb_questionnaire_php_data_provider());
- $collector->add_data_provider(new phpbb_questionnaire_system_data_provider());
- $collector->add_data_provider(new phpbb_questionnaire_phpbb_data_provider($config));
-
- $template->assign_vars(array(
- 'U_COLLECT_STATS' => $collect_url,
- 'RAW_DATA' => $collector->get_data_for_form(),
- 'U_ACP_MAIN' => append_sid("{$phpbb_admin_path}index.$phpEx"),
- ));
-
- $raw = $collector->get_data_raw();
-
- foreach ($raw as $provider => $data)
- {
- if ($provider == 'install_id')
- {
- $data = array($provider => $data);
- }
-
- $template->assign_block_vars('providers', array(
- 'NAME' => htmlspecialchars($provider),
- ));
-
- foreach ($data as $key => $value)
- {
- if (is_array($value))
- {
- $value = utf8_wordwrap(serialize($value), 75, "\n", true);
- }
-
- $template->assign_block_vars('providers.values', array(
- 'KEY' => utf8_htmlspecialchars($key),
- 'VALUE' => utf8_htmlspecialchars($value),
- ));
- }
- }
- }
-}
diff --git a/phpBB/includes/acp/info/acp_send_statistics.php b/phpBB/includes/acp/info/acp_help_phpbb.php
index a0db1a48c4..dee8ef41d7 100644
--- a/phpBB/includes/acp/info/acp_send_statistics.php
+++ b/phpBB/includes/acp/info/acp_help_phpbb.php
@@ -11,15 +11,15 @@
*
*/
-class acp_send_statistics_info
+class acp_help_phpbb_info
{
function module()
{
return array(
- 'filename' => 'acp_send_statistics',
- 'title' => 'ACP_SEND_STATISTICS',
+ 'filename' => 'acp_help_phpbb',
+ 'title' => 'ACP_HELP_PHPBB',
'modes' => array(
- 'send_statistics' => array('title' => 'ACP_SEND_STATISTICS', 'auth' => 'acl_a_server', 'cat' => array('ACP_SERVER_CONFIGURATION')),
+ 'help_phpbb' => array('title' => 'ACP_HELP_PHPBB', 'auth' => 'acl_a_server', 'cat' => array('ACP_SERVER_CONFIGURATION')),
),
);
}
diff --git a/phpBB/includes/functions_acp.php b/phpBB/includes/functions_acp.php
index 766669480d..8bf42aa36e 100644
--- a/phpBB/includes/functions_acp.php
+++ b/phpBB/includes/functions_acp.php
@@ -88,6 +88,7 @@ function adm_page_header($page_title)
'T_ICONS_PATH' => "{$phpbb_root_path}{$config['icons_path']}/",
'T_RANKS_PATH' => "{$phpbb_root_path}{$config['ranks_path']}/",
'T_UPLOAD_PATH' => "{$phpbb_root_path}{$config['upload_path']}/",
+ 'T_FONT_AWESOME_LINK' => !empty($config['allow_cdn']) && !empty($config['load_font_awesome_url']) ? $config['load_font_awesome_url'] : "{$phpbb_root_path}assets/css/font-awesome.min.css?assets_version=" . $config['assets_version'],
'T_ASSETS_VERSION' => $config['assets_version'],
diff --git a/phpBB/includes/questionnaire/questionnaire.php b/phpBB/includes/questionnaire/questionnaire.php
index 6350f4bc5a..9699843db4 100644
--- a/phpBB/includes/questionnaire/questionnaire.php
+++ b/phpBB/includes/questionnaire/questionnaire.php
@@ -46,9 +46,9 @@ class phpbb_questionnaire_data_collector
$this->providers = array();
}
- function add_data_provider(&$provider)
+ function add_data_provider($provider)
{
- $this->providers[] = &$provider;
+ $this->providers[] = $provider;
}
/**
@@ -80,7 +80,7 @@ class phpbb_questionnaire_data_collector
{
foreach (array_keys($this->providers) as $key)
{
- $provider = &$this->providers[$key];
+ $provider = $this->providers[$key];
$this->data[$provider->get_identifier()] = $provider->get_data();
}
$this->data['install_id'] = $this->install_id;
diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql
index 0cff26977e..56a4efa230 100644
--- a/phpBB/install/schemas/schema_data.sql
+++ b/phpBB/install/schemas/schema_data.sql
@@ -142,6 +142,8 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('fulltext_postgres_
INSERT INTO phpbb_config (config_name, config_value) VALUES ('fulltext_sphinx_indexer_mem_limit', '512');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('fulltext_sphinx_stopwords', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('gzip_compress', '0');
+INSERT INTO phpbb_config (config_name, config_value) VALUES ('help_send_statistics', '1');
+INSERT INTO phpbb_config (config_name, config_value) VALUES ('help_send_statistics_time', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('hot_threshold', '25');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('icons_path', 'images/icons');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_create_thumbnail', '0');
diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php
index f30d1e7198..053671e1a2 100644
--- a/phpBB/language/en/acp/common.php
+++ b/phpBB/language/en/acp/common.php
@@ -108,6 +108,8 @@ $lang = array_merge($lang, array(
'ACP_GROUPS_PERMISSIONS' => 'Group permissions',
'ACP_GROUPS_POSITION' => 'Manage group positions',
+ 'ACP_HELP_PHPBB' => 'Help support phpBB',
+
'ACP_ICONS' => 'Topic icons',
'ACP_ICONS_SMILIES' => 'Topic icons/smilies',
'ACP_INACTIVE_USERS' => 'Inactive users',
@@ -167,7 +169,6 @@ $lang = array_merge($lang, array(
'ACP_SEARCH_SETTINGS' => 'Search settings',
'ACP_SECURITY_SETTINGS' => 'Security settings',
- 'ACP_SEND_STATISTICS' => 'Send statistical information',
'ACP_SERVER_CONFIGURATION' => 'Server configuration',
'ACP_SERVER_SETTINGS' => 'Server settings',
'ACP_SIGNATURE_SETTINGS' => 'Signature settings',
@@ -474,16 +475,18 @@ $lang = array_merge($lang, array(
'USER_IS_INACTIVE' => 'User is inactive',
));
-// Send statistics page
+// Help support phpBB page
$lang = array_merge($lang, array(
'EXPLAIN_SEND_STATISTICS' => 'Please send information about your server and board configurations to phpBB for statistical analysis. All information that could identify you or your website has been removed - the data is entirely <strong>anonymous</strong>. We base decisions about future phpBB versions on this information. The statistics are made available publically. We also share this data with the PHP project, the programming language phpBB is made with.',
'EXPLAIN_SHOW_STATISTICS' => 'Using the button below you can preview all variables that will be transmitted.',
'DONT_SEND_STATISTICS' => 'Return to the ACP if you do not wish to send statistical information to phpBB.',
'GO_ACP_MAIN' => 'Go to the ACP start page',
'HIDE_STATISTICS' => 'Hide details',
- 'SEND_STATISTICS' => 'Send statistical information',
+ 'SEND_STATISTICS' => 'Send statistics',
+ 'SEND_STATISTICS_LONG' => 'Send statistical information',
'SHOW_STATISTICS' => 'Show details',
'THANKS_SEND_STATISTICS' => 'Thank you for submitting your information.',
+ 'FAIL_SEND_STATISTICS' => 'phpBB was unable to send statistics',
));
// Log Entries
@@ -816,4 +819,5 @@ $lang = array_merge($lang, array(
'LOG_EXT_ENABLE' => '<strong>Extension enabled</strong><br />» %s',
'LOG_EXT_DISABLE' => '<strong>Extension disabled</strong><br />» %s',
'LOG_EXT_PURGE' => '<strong>Extension’s data deleted</strong><br />» %s',
+ 'LOG_EXT_UPDATE' => '<strong>Extension updated</strong><br />» %s',
));
diff --git a/phpBB/language/en/cli.php b/phpBB/language/en/cli.php
index db4b5f9ec6..09f46a5cee 100644
--- a/phpBB/language/en/cli.php
+++ b/phpBB/language/en/cli.php
@@ -104,6 +104,8 @@ $lang = array_merge($lang, array(
'CLI_EXTENSION_NAME' => 'Name of the extension',
'CLI_EXTENSION_PURGE_FAILURE' => 'Could not purge extension %s',
'CLI_EXTENSION_PURGE_SUCCESS' => 'Successfully purged extension %s',
+ 'CLI_EXTENSION_UPDATE_FAILURE' => 'Could not update extension %s',
+ 'CLI_EXTENSION_UPDATE_SUCCESS' => 'Successfully updated extension %s',
'CLI_EXTENSION_NOT_FOUND' => 'No extensions were found.',
'CLI_EXTENSIONS_AVAILABLE' => 'Available',
'CLI_EXTENSIONS_DISABLED' => 'Disabled',
diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php
index 35cea17a24..45ed51f641 100644
--- a/phpBB/language/en/install.php
+++ b/phpBB/language/en/install.php
@@ -301,6 +301,7 @@ $lang = array_merge($lang, array(
'TASK_ADD_MODULES' => 'Installing modules',
// Install finish tasks
+ 'TASK_INSTALL_EXTENSIONS' => 'Installing packaged extensions',
'TASK_NOTIFY_USER' => 'Sending notification e-mail',
'TASK_POPULATE_MIGRATIONS' => 'Populating migrations',
@@ -457,6 +458,8 @@ $lang = array_merge($lang, array(
'STAGE_UPDATE_DATABASE' => 'Update database',
'INLINE_UPDATE_SUCCESSFUL' => 'The database update was successful.',
+
+ 'TASK_UPDATE_EXTENSIONS' => 'Updating extensions',
));
// Converter
diff --git a/phpBB/phpbb/db/migration/data/v320/add_help_phpbb.php b/phpBB/phpbb/db/migration/data/v320/add_help_phpbb.php
new file mode 100644
index 0000000000..afa67fbc58
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v320/add_help_phpbb.php
@@ -0,0 +1,50 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @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\v320;
+
+class add_help_phpbb extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v320\v320rc1',
+ );
+ }
+
+ public function effectively_installed()
+ {
+ return isset($this->config['help_send_statistics']);
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.add', array('help_send_statistics', true)),
+ array('config.add', array('help_send_statistics_time', 0)),
+ array('module.remove', array(
+ 'acp',
+ false,
+ 'ACP_SEND_STATISTICS',
+ )),
+ array('module.add', array(
+ 'acp',
+ 'ACP_SERVER_CONFIGURATION',
+ array(
+ 'module_basename' => 'acp_help_phpbb',
+ 'modes' => array('help_phpbb'),
+ ),
+ )),
+ );
+ }
+}
diff --git a/phpBB/phpbb/install/console/command/install/install.php b/phpBB/phpbb/install/console/command/install/install.php
index de3a2e2d61..52a348fe44 100644
--- a/phpBB/phpbb/install/console/command/install/install.php
+++ b/phpBB/phpbb/install/console/command/install/install.php
@@ -151,6 +151,7 @@ class install extends \phpbb\console\command\command
try
{
$this->installer->run();
+ return 0;
}
catch (installer_exception $e)
{
@@ -203,5 +204,7 @@ class install extends \phpbb\console\command\command
$iohandler->set_input('server_port', $config['server']['server_port']);
$iohandler->set_input('script_path', $config['server']['script_path']);
$iohandler->set_input('submit_server', 'submit');
+
+ $iohandler->set_input('install-extensions', $config['extensions']);
}
}
diff --git a/phpBB/phpbb/install/console/command/update/update.php b/phpBB/phpbb/install/console/command/update/update.php
index 116f42f758..e827761d1c 100644
--- a/phpBB/phpbb/install/console/command/update/update.php
+++ b/phpBB/phpbb/install/console/command/update/update.php
@@ -151,6 +151,7 @@ class update extends \phpbb\console\command\command
try
{
$this->installer->run();
+ return 0;
}
catch (installer_exception $e)
{
@@ -175,5 +176,7 @@ class update extends \phpbb\console\command\command
$iohandler->set_input('submit_update_file', 'submit');
$iohandler->set_input('submit_continue_file_update', 'submit');
+
+ $iohandler->set_input('update-extensions', $config['extensions']);
}
}
diff --git a/phpBB/phpbb/install/installer.php b/phpBB/phpbb/install/installer.php
index 240423ae78..a7d3b99dcb 100644
--- a/phpBB/phpbb/install/installer.php
+++ b/phpBB/phpbb/install/installer.php
@@ -243,8 +243,15 @@ class installer
}
else
{
- global $SID;
- $acp_url = $this->web_root . 'adm/index.php' . $SID;
+ // Start session and try to apply session id
+ $auth = $this->container_factory->get('auth');
+ $user = $this->container_factory->get('user');
+ $user->session_begin();
+ $auth->acl($user->data);
+ $user->setup();
+ $phpbb_root_path = $this->container_factory->get_parameter('core.root_path');
+
+ $acp_url = append_sid($phpbb_root_path . 'adm/index.php', 'i=acp_help_phpbb&mode=help_phpbb', true, $user->session_id);
$this->iohandler->add_success_message('INSTALLER_FINISHED', array(
'ACP_LINK',
$acp_url,
diff --git a/phpBB/phpbb/install/installer_configuration.php b/phpBB/phpbb/install/installer_configuration.php
index c660c99d0f..805140338c 100644
--- a/phpBB/phpbb/install/installer_configuration.php
+++ b/phpBB/phpbb/install/installer_configuration.php
@@ -136,6 +136,10 @@ class installer_configuration implements ConfigurationInterface
->end()
->end()
->end()
+ ->arrayNode('extensions')
+ ->prototype('scalar')->end()
+ ->defaultValue([])
+ ->end()
->end()
;
return $treeBuilder;
diff --git a/phpBB/phpbb/install/module/install_finish/task/install_extensions.php b/phpBB/phpbb/install/module/install_finish/task/install_extensions.php
new file mode 100644
index 0000000000..553a30ea28
--- /dev/null
+++ b/phpBB/phpbb/install/module/install_finish/task/install_extensions.php
@@ -0,0 +1,199 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @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\install\module\install_finish\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+
+/**
+ * Installs extensions that exist in ext folder upon install
+ */
+class install_extensions extends \phpbb\install\task_base
+{
+ /**
+ * @var \phpbb\install\helper\config
+ */
+ protected $install_config;
+
+ /**
+ * @var \phpbb\install\helper\iohandler\iohandler_interface
+ */
+ protected $iohandler;
+
+ /**
+ * @var \phpbb\config\db
+ */
+ protected $config;
+
+ /**
+ * @var \phpbb\log\log_interface
+ */
+ protected $log;
+
+ /**
+ * @var \phpbb\user
+ */
+ protected $user;
+
+ /** @var \phpbb\extension\manager */
+ protected $extension_manager;
+
+ /** @var \Symfony\Component\Finder\Finder */
+ protected $finder;
+
+ /** @var string Extension table */
+ protected $extension_table;
+
+ /** @var \phpbb\db\driver\driver_interface */
+ protected $db;
+
+ /**
+ * Constructor
+ *
+ * @param \phpbb\install\helper\container_factory $container
+ * @param \phpbb\install\helper\config $install_config
+ * @param \phpbb\install\helper\iohandler\iohandler_interface $iohandler
+ * @param string $phpbb_root_path phpBB root path
+ */
+ public function __construct(\phpbb\install\helper\container_factory $container, \phpbb\install\helper\config $install_config, \phpbb\install\helper\iohandler\iohandler_interface $iohandler, $phpbb_root_path)
+ {
+ $this->install_config = $install_config;
+ $this->iohandler = $iohandler;
+ $this->extension_table = $container->get_parameter('tables.ext');
+
+ $this->log = $container->get('log');
+ $this->user = $container->get('user');
+ $this->extension_manager = $container->get('ext.manager');
+ $this->config = $container->get('config');
+ $this->db = $container->get('dbal.conn');
+ $this->finder = new \Symfony\Component\Finder\Finder();
+ $this->finder->in($phpbb_root_path . 'ext/')
+ ->ignoreUnreadableDirs()
+ ->depth('< 3')
+ ->files()
+ ->name('composer.json');
+
+ // Make sure asset version exists in config. Otherwise we might try to
+ // insert the assets_version setting into the database and cause a
+ // duplicate entry error.
+ if (!isset($this->config['assets_version']))
+ {
+ $this->config['assets_version'] = 0;
+ }
+
+ parent::__construct(true);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->user->session_begin();
+ $this->user->setup(array('common', 'acp/common', 'cli'));
+
+ $install_extensions = $this->iohandler->get_input('install-extensions', array());
+
+ $all_available_extensions = $this->extension_manager->all_available();
+ $i = $this->install_config->get('install_extensions_index', 0);
+ $available_extensions = array_slice($all_available_extensions, $i);
+
+ // Install extensions
+ foreach ($available_extensions as $ext_name => $ext_path)
+ {
+ if (!empty($install_extensions) && $install_extensions !== ['all'] && !in_array($ext_name, $install_extensions))
+ {
+ continue;
+ }
+
+ try
+ {
+ $this->extension_manager->enable($ext_name);
+ $extensions = $this->get_extensions();
+
+ if (isset($extensions[$ext_name]) && $extensions[$ext_name]['ext_active'])
+ {
+ // Create log
+ $this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_ENABLE', time(), array($ext_name));
+ $this->iohandler->add_success_message(array('CLI_EXTENSION_ENABLE_SUCCESS', $ext_name));
+ }
+ else
+ {
+ $this->iohandler->add_log_message(array('CLI_EXTENSION_ENABLE_FAILURE', $ext_name));
+ }
+ }
+ catch (\Exception $e)
+ {
+ // Add fail log and continue
+ $this->iohandler->add_log_message(array('CLI_EXTENSION_ENABLE_FAILURE', $ext_name));
+ }
+
+ $i++;
+
+ // Stop execution if resource limit is reached
+ if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
+ {
+ break;
+ }
+ }
+
+ $this->install_config->set('install_extensions_index', $i);
+
+ if ($i < sizeof($all_available_extensions))
+ {
+ throw new resource_limit_reached_exception();
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ static public function get_step_count()
+ {
+ return 1;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_task_lang_name()
+ {
+ return 'TASK_INSTALL_EXTENSIONS';
+ }
+
+ /**
+ * Get extensions from database
+ *
+ * @return array List of extensions
+ */
+ private function get_extensions()
+ {
+ $sql = 'SELECT *
+ FROM ' . $this->extension_table;
+
+ $result = $this->db->sql_query($sql);
+ $extensions_row = $this->db->sql_fetchrowset($result);
+ $this->db->sql_freeresult($result);
+
+ $extensions = array();
+
+ foreach ($extensions_row as $extension)
+ {
+ $extensions[$extension['ext_name']] = $extension;
+ }
+
+ ksort($extensions);
+
+ return $extensions;
+ }
+}
diff --git a/phpBB/phpbb/install/module/update_database/task/update.php b/phpBB/phpbb/install/module/update_database/task/update.php
index 9d7ba2f919..fb9eb44e6a 100644
--- a/phpBB/phpbb/install/module/update_database/task/update.php
+++ b/phpBB/phpbb/install/module/update_database/task/update.php
@@ -211,8 +211,6 @@ class update extends task_base
$this->iohandler->add_success_message('INLINE_UPDATE_SUCCESSFUL');
- $this->config->delete('version_update_from');
-
$this->cache->purge();
$this->config->increment('assets_version', 1);
diff --git a/phpBB/phpbb/install/module/update_database/task/update_extensions.php b/phpBB/phpbb/install/module/update_database/task/update_extensions.php
new file mode 100644
index 0000000000..13c1591dcd
--- /dev/null
+++ b/phpBB/phpbb/install/module/update_database/task/update_extensions.php
@@ -0,0 +1,263 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @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\install\module\update_database\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\helper\container_factory;
+use phpbb\install\helper\config;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\helper\update_helper;
+use phpbb\install\task_base;
+use Symfony\Component\Finder\Finder;
+
+/**
+ * Installs extensions that exist in ext folder upon install
+ */
+class update_extensions extends task_base
+{
+ /**
+ * @var \phpbb\cache\driver\driver_interface
+ */
+ protected $cache;
+
+ /**
+ * @var config
+ */
+ protected $install_config;
+
+ /**
+ * @var iohandler_interface
+ */
+ protected $iohandler;
+
+ /** @var update_helper */
+ protected $update_helper;
+
+ /**
+ * @var \phpbb\config\db
+ */
+ protected $config;
+
+ /**
+ * @var \phpbb\log\log_interface
+ */
+ protected $log;
+
+ /**
+ * @var \phpbb\user
+ */
+ protected $user;
+
+ /** @var \phpbb\extension\manager */
+ protected $extension_manager;
+
+ /** @var Finder */
+ protected $finder;
+
+ /** @var string Extension table */
+ protected $extension_table;
+
+ /** @var \phpbb\db\driver\driver_interface */
+ protected $db;
+
+ /**
+ * @var array List of default extensions to update, grouped by version
+ * they were added
+ */
+ static public $default_extensions_update = [
+ '3.2.0-RC2' => ['phpbb/viglink']
+ ];
+
+ /**
+ * Constructor
+ *
+ * @param container_factory $container
+ * @param config $install_config
+ * @param iohandler_interface $iohandler
+ * @param $update_helper $update_helper
+ * @param string $phpbb_root_path phpBB root path
+ */
+ public function __construct(container_factory $container, config $install_config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path)
+ {
+ $this->install_config = $install_config;
+ $this->iohandler = $iohandler;
+ $this->extension_table = $container->get_parameter('tables.ext');
+
+ $this->log = $container->get('log');
+ $this->user = $container->get('user');
+ $this->extension_manager = $container->get('ext.manager');
+ $this->cache = $container->get('cache.driver');
+ $this->config = $container->get('config');
+ $this->db = $container->get('dbal.conn');
+ $this->update_helper = $update_helper;
+ $this->finder = new Finder();
+ $this->finder->in($phpbb_root_path . 'ext/')
+ ->ignoreUnreadableDirs()
+ ->depth('< 3')
+ ->files()
+ ->name('composer.json');
+
+ // Make sure asset version exists in config. Otherwise we might try to
+ // insert the assets_version setting into the database and cause a
+ // duplicate entry error.
+ if (!isset($this->config['assets_version']))
+ {
+ $this->config['assets_version'] = 0;
+ }
+
+ parent::__construct(true);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->user->session_begin();
+ $this->user->setup(array('common', 'acp/common', 'cli'));
+
+ $update_info = $this->install_config->get('update_info_unprocessed', []);
+ $version_from = !empty($update_info) ? $update_info['version']['from'] : $this->config['version_update_from'];
+
+ if (!empty($version_from))
+ {
+ $update_extensions = $this->iohandler->get_input('update-extensions', []);
+
+ // Create list of default extensions that need to be enabled in update
+ $default_update_extensions = [];
+ foreach (self::$default_extensions_update as $version => $extensions)
+ {
+ if ($this->update_helper->phpbb_version_compare($version_from, $version, '<='))
+ {
+ $default_update_extensions = array_merge($default_update_extensions, $extensions);
+ }
+ }
+
+ $all_available_extensions = $this->extension_manager->all_available();
+ $i = $this->install_config->get('update_extensions_index', 0);
+ $available_extensions = array_slice($all_available_extensions, $i);
+
+ // Update available extensions
+ foreach ($available_extensions as $ext_name => $ext_path)
+ {
+ // Update extensions if:
+ // 1) Extension is currently enabled
+ // 2) Extension was implicitly defined as needing an update
+ // 3) Extension was newly added as default phpBB extension in
+ // this update and should be enabled by default.
+ if ($this->extension_manager->is_enabled($ext_name) ||
+ in_array($ext_name, $update_extensions) ||
+ in_array($ext_name, $default_update_extensions)
+ )
+ {
+ try
+ {
+ $extension_enabled = $this->extension_manager->is_enabled($ext_name);
+ if ($extension_enabled)
+ {
+ $this->extension_manager->disable($ext_name);
+ }
+ $this->extension_manager->enable($ext_name);
+ $extensions = $this->get_extensions();
+
+ if (isset($extensions[$ext_name]) && $extensions[$ext_name]['ext_active'])
+ {
+ // Create log
+ $this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_UPDATE', time(), array($ext_name));
+ $this->iohandler->add_success_message(array('CLI_EXTENSION_UPDATE_SUCCESS', $ext_name));
+ }
+ else
+ {
+ $this->iohandler->add_log_message('CLI_EXTENSION_UPDATE_FAILURE', array($ext_name));
+ }
+
+ // Disable extensions if it was disabled by the admin before
+ if (!$extension_enabled && !in_array($ext_name, $default_update_extensions))
+ {
+ $this->extension_manager->disable($ext_name);
+ }
+ }
+ catch (\Exception $e)
+ {
+ // Add fail log and continue
+ $this->iohandler->add_log_message('CLI_EXTENSION_UPDATE_FAILURE', array($ext_name));
+ }
+ }
+
+ $i++;
+
+ // Stop execution if resource limit is reached
+ if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
+ {
+ break;
+ }
+ }
+
+ $this->install_config->set('update_extensions_index', $i);
+
+ if ($i < sizeof($all_available_extensions))
+ {
+ throw new resource_limit_reached_exception();
+ }
+ }
+
+ $this->config->delete('version_update_from');
+
+ $this->cache->purge();
+
+ $this->config->increment('assets_version', 1);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ static public function get_step_count()
+ {
+ return 1;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_task_lang_name()
+ {
+ return 'TASK_UPDATE_EXTENSIONS';
+ }
+
+ /**
+ * Get extensions from database
+ *
+ * @return array List of extensions
+ */
+ private function get_extensions()
+ {
+ $sql = 'SELECT *
+ FROM ' . $this->extension_table;
+
+ $result = $this->db->sql_query($sql);
+ $extensions_row = $this->db->sql_fetchrowset($result);
+ $this->db->sql_freeresult($result);
+
+ $extensions = array();
+
+ foreach ($extensions_row as $extension)
+ {
+ $extensions[$extension['ext_name']] = $extension;
+ }
+
+ ksort($extensions);
+
+ return $extensions;
+ }
+}
diff --git a/phpBB/phpbb/install/module/update_filesystem/task/file_check.php b/phpBB/phpbb/install/module/update_filesystem/task/file_check.php
index f4b3870148..5b48350e73 100644
--- a/phpBB/phpbb/install/module/update_filesystem/task/file_check.php
+++ b/phpBB/phpbb/install/module/update_filesystem/task/file_check.php
@@ -118,6 +118,17 @@ class file_check extends task_base
$this->iohandler->set_task_count($task_count);
$this->iohandler->set_progress('UPDATE_CHECK_FILES', 0);
+ // Create list of default extensions that should have been added prior
+ // to this update
+ $default_update_extensions = [];
+ foreach (\phpbb\install\module\update_database\task\update_extensions::$default_extensions_update as $version => $extensions)
+ {
+ if ($this->update_helper->phpbb_version_compare($update_info['version']['from'], $version, '>'))
+ {
+ $default_update_extensions = array_merge($default_update_extensions, $extensions);
+ }
+ }
+
foreach ($update_info['files'] as $key => $filename)
{
$old_file = $old_path . $filename;
@@ -138,6 +149,27 @@ class file_check extends task_base
$progress_count++;
$this->iohandler->set_progress('UPDATE_CHECK_FILES', $progress_count);
+ // Do not copy default extension again if the previous version was
+ // packaged with it but it does not exist (e.g. deleted by admin)
+ if (strpos($file, $this->phpbb_root_path . 'ext/') !== false)
+ {
+ $skip_file = false;
+ foreach ($default_update_extensions as $ext_name)
+ {
+ if (strpos($file, $this->phpbb_root_path . 'ext/' . $ext_name) !== false &&
+ !$this->filesystem->exists($this->phpbb_root_path . 'ext/' . $ext_name . '/composer.json'))
+ {
+ $skip_file = true;
+ break;
+ }
+ }
+
+ if ($skip_file)
+ {
+ continue;
+ }
+ }
+
if (!$this->filesystem->exists($file))
{
$file_update_info['new'][] = $filename;
diff --git a/phpBB/phpbb/install/updater_configuration.php b/phpBB/phpbb/install/updater_configuration.php
index e992356290..5c1c29f1da 100644
--- a/phpBB/phpbb/install/updater_configuration.php
+++ b/phpBB/phpbb/install/updater_configuration.php
@@ -32,6 +32,10 @@ class updater_configuration implements ConfigurationInterface
->addDefaultsIfNotSet()
->children()
->enumNode('type')->values(['all','db_only'])->defaultValue('all')->end()
+ ->arrayNode('extensions')
+ ->prototype('scalar')->end()
+ ->defaultValue([])
+ ->end()
->end()
;
diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php
index 20b89aba4e..2a37ca0e53 100644
--- a/tests/test_framework/phpbb_functional_test_case.php
+++ b/tests/test_framework/phpbb_functional_test_case.php
@@ -309,6 +309,8 @@ class phpbb_functional_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');