Merge branch 'develop' of git://github.com/phpbb/phpbb3 into ticket/11786

This commit is contained in:
rechosen 2013-09-23 18:08:29 +02:00
commit e45b69ee09
241 changed files with 8066 additions and 5562 deletions

View file

@ -1,12 +1,30 @@
<IfModule mod_rewrite.c>
RewriteEngine on
#
# Uncomment the statement below if you want to make use of
# HTTP authentication and it does not already work.
# This could be required if you are for example using PHP via Apache CGI.
#
#<IfModule mod_rewrite.c>
#RewriteEngine on
#RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
#</IfModule>
#
# The following 3 lines will rewrite URLs passed through the front controller
# to not require app.php in the actual URL. In other words, a controller is
# by default accessed at /app.php/my/controller, but can also be accessed at
# /my/controller
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ app.php [QSA,L]
#
# If symbolic links are not already being followed,
# uncomment the line below.
# http://anothersysadmin.wordpress.com/2008/06/10/mod_rewrite-forbidden-403-with-apache-228/
#
#Options +FollowSymLinks
</IfModule>
<Files "config.php">
Order Allow,Deny

View file

@ -50,7 +50,7 @@ $module_id = request_var('i', '');
$mode = request_var('mode', '');
// Set custom style for admin area
$phpbb_style->set_custom_style('admin', $phpbb_admin_path . 'style', array(), '');
$template->set_custom_style('adm', $phpbb_admin_path . 'style');
$template->assign_var('T_ASSETS_PATH', $phpbb_root_path . 'assets');
$template->assign_var('T_TEMPLATE_PATH', $phpbb_admin_path . 'style');

View file

@ -752,6 +752,10 @@ optgroup, select {
color: #000;
}
select:focus {
outline-style: none;
}
optgroup {
font-size: 1.00em;
font-weight: bold;
@ -997,6 +1001,7 @@ input:focus, textarea:focus {
border: 1px solid #BC2A4D;
background-color: #E9E9E2;
color: #BC2A4D;
outline-style: none;
}
/* Submit button fieldset or paragraph
@ -1091,6 +1096,11 @@ input.disabled {
color: #666666;
}
/* Focus states */
input.button1:focus, input.button2:focus, input.button3:focus {
outline-style: none;
}
/* jQuery popups
---------------------------------------- */
.phpbb_alert {

View file

@ -0,0 +1,17 @@
<h2>{L_AUTH_PROVIDER_OAUTH_TITLE}</h2>
<p>{L_AUTH_PROVIDER_OAUTH_EXPLAIN}</p>
<!-- BEGIN oauth_services -->
<fieldset>
<legend>{oauth_services.ACTUAL_NAME}</legend>
<dl>
<dt><label for="oauth_service_{oauth_services.NAME}_key">{L_AUTH_PROVIDER_OAUTH_KEY}{L_COLON}</label></dt>
<dd><input type="text" id="oauth_service_{oauth_services.NAME}_key" size="40" name="config[auth_oauth_{oauth_services.NAME}_key]" value="{oauth_services.KEY}" /></dd>
</dl>
<dl>
<dt><label for="oauth_service_{oauth_services.NAME}_secret">{L_AUTH_PROVIDER_OAUTH_SECRET}{L_COLON}</label></dt>
<dd><input type="text" id="oauth_service_{oauth_services.NAME}_secret" size="40" name="config[auth_oauth_{oauth_services.NAME}_secret]" value="{oauth_services.SECRET}" /></dd>
</dl>
</fieldset>
<!-- END oauth_services -->

View file

@ -12,7 +12,7 @@
var jump_page = '{LA_JUMP_PAGE}{L_COLON}';
var on_page = '{ON_PAGE}';
var per_page = '{PER_PAGE}';
var base_url = '{A_BASE_URL}';
var base_url = '{BASE_URL|e('js')}';
var menu_state = 'shown';

View file

@ -12,7 +12,7 @@
var jump_page = '{LA_JUMP_PAGE}{L_COLON}';
var on_page = '{ON_PAGE}';
var per_page = '{PER_PAGE}';
var base_url = '{A_BASE_URL}';
var base_url = '{BASE_URL|e('js')}';
/**
* Window popup

View file

@ -22,7 +22,7 @@ $auth->acl($user->data);
$user->setup();
// Set custom template for admin area
$phpbb_style->set_custom_style('admin', $phpbb_admin_path . 'style', array(), '');
$template->set_custom_style('adm', $phpbb_admin_path . 'style');
$template->set_filenames(array(
'body' => 'colour_swatch.html')

View file

@ -24,7 +24,6 @@ $user->session_begin();
$auth->acl($user->data);
$user->setup('app');
$symfony_request = phpbb_create_symfony_request($request);
$http_kernel = $phpbb_container->get('http_kernel');
$response = $http_kernel->handle($symfony_request);
$response->send();

View file

@ -47,7 +47,13 @@ if (!defined('PHPBB_INSTALLED'))
// Eliminate . and .. from the path
require($phpbb_root_path . 'phpbb/filesystem.' . $phpEx);
$phpbb_filesystem = new phpbb_filesystem();
$phpbb_filesystem = new phpbb_filesystem(
new phpbb_symfony_request(
new phpbb_request()
),
$phpbb_root_path,
$phpEx
);
$script_path = $phpbb_filesystem->clean_path($script_path);
$url = (($secure) ? 'https://' : 'http://') . $server_name;
@ -109,6 +115,10 @@ $db = $phpbb_container->get('dbal.conn');
// make sure request_var uses this request instance
request_var('', 0, false, false, $request); // "dependency injection" for a function
// Create a Symfony Request object from our phpbb_request object
$symfony_request = $phpbb_container->get('symfony_request');
$phpbb_filesystem = $phpbb_container->get('filesystem');
// Grab global variables, re-cache if necessary
$config = $phpbb_container->get('config');
set_config(null, null, null, $config);
@ -121,7 +131,6 @@ $phpbb_extension_manager = $phpbb_container->get('ext.manager');
$phpbb_subscriber_loader = $phpbb_container->get('event.subscriber_loader');
$template = $phpbb_container->get('template');
$phpbb_style = $phpbb_container->get('style');
// Add own hook handler
require($phpbb_root_path . 'includes/hooks/index.' . $phpEx);

View file

@ -1,16 +1,17 @@
{
"minimum-stability": "beta",
"require": {
"symfony/config": "2.1.*",
"symfony/dependency-injection": "2.1.*",
"symfony/event-dispatcher": "2.1.*",
"symfony/http-kernel": "2.1.*",
"symfony/routing": "2.1.*",
"symfony/yaml": "2.1.*",
"lusitanian/oauth": "0.2.*",
"symfony/config": "2.3.*",
"symfony/dependency-injection": "2.3.*",
"symfony/event-dispatcher": "2.3.*",
"symfony/http-kernel": "2.3.*",
"symfony/routing": "2.3.*",
"symfony/yaml": "2.3.*",
"twig/twig": "1.13.*"
},
"require-dev": {
"fabpot/goutte": "v0.1.0",
"fabpot/goutte": "1.0.*",
"phpunit/dbunit": "1.2.*",
"phpunit/phpunit": "3.7.*",
"phing/phing": "2.4.*"

899
phpBB/composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -35,3 +35,45 @@ services:
- @user
tags:
- { name: auth.provider }
auth.provider.oauth:
class: phpbb_auth_provider_oauth
arguments:
- @dbal.conn
- @config
- @request
- @user
- %tables.auth_provider_oauth_token_storage%
- %tables.auth_provider_oauth_account_assoc%
- @auth.provider.oauth.service_collection
- %tables.users%
- %core.root_path%
- %core.php_ext%
tags:
- { name: auth.provider }
auth.provider.oauth.service_collection:
class: phpbb_di_service_collection
arguments:
- @service_container
tags:
- { name: service_collection, tag: auth.provider.oauth.service }
auth.provider.oauth.service.bitly:
class: phpbb_auth_provider_oauth_service_bitly
arguments:
- @config
- @request
tags:
- { name: auth.provider.oauth.service }
auth.provider.oauth.service.facebook:
class: phpbb_auth_provider_oauth_service_facebook
arguments:
- @config
- @request
tags:
- { name: auth.provider.oauth.service }
auth.provider.oauth.service.google:
class: phpbb_auth_provider_oauth_service_google
arguments:
- @config
- @request
tags:
- { name: auth.provider.oauth.service }

View file

@ -103,6 +103,42 @@ services:
tags:
- { name: notification.type }
notification.type.group_request:
class: phpbb_notification_type_group_request
scope: prototype # scope MUST be prototype for this to work!
arguments:
- @user_loader
- @dbal.conn
- @cache.driver
- @user
- @auth
- @config
- %core.root_path%
- %core.php_ext%
- %tables.notification_types%
- %tables.notifications%
- %tables.user_notifications%
tags:
- { name: notification.type }
notification.type.group_request_approved:
class: phpbb_notification_type_group_request_approved
scope: prototype # scope MUST be prototype for this to work!
arguments:
- @user_loader
- @dbal.conn
- @cache.driver
- @user
- @auth
- @config
- %core.root_path%
- %core.php_ext%
- %tables.notification_types%
- %tables.notifications%
- %tables.user_notifications%
tags:
- { name: notification.type }
notification.type.pm:
class: phpbb_notification_type_pm
scope: prototype # scope MUST be prototype for this to work!

View file

@ -90,6 +90,7 @@ services:
arguments:
- @template
- @user
- @config
- %core.root_path%
- %core.php_ext%
@ -98,7 +99,7 @@ services:
arguments:
- @user
- @service_container
- @style
- @template
cron.task_collection:
class: phpbb_di_service_collection
@ -168,6 +169,11 @@ services:
filesystem:
class: phpbb_filesystem
arguments:
- @symfony_request
- %core.root_path%
- %core.php_ext%
- %core.adm_relative_path%
groupposition.legend:
class: phpbb_groupposition_legend
@ -251,40 +257,19 @@ services:
request:
class: phpbb_request
style:
class: phpbb_style
symfony_request:
class: phpbb_symfony_request
arguments:
- %core.root_path%
- %core.php_ext%
- @config
- @user
- @style.resource_locator
- @style.path_provider_ext
- @template
style.resource_locator:
class: phpbb_style_resource_locator
style.path_provider_ext:
class: phpbb_style_extension_path_provider
arguments:
- @ext.manager
- @style.path_provider
- %core.root_path%
style.path_provider:
class: phpbb_style_path_provider
- @request
template:
class: phpbb_template_twig
arguments:
- %core.root_path%
- %core.php_ext%
- @filesystem
- @config
- @user
- @template_context
- @ext.manager
- %core.adm_relative_path%
template_context:
class: phpbb_template_context

View file

@ -1,4 +1,6 @@
parameters:
tables.auth_provider_oauth_token_storage: %core.table_prefix%oauth_tokens
tables.auth_provider_oauth_account_assoc: %core.table_prefix%oauth_accounts
tables.config: %core.table_prefix%config
tables.config_text: %core.table_prefix%config_text
tables.ext: %core.table_prefix%ext

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -145,7 +145,6 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11265">PHPBB3-11265</a>] - Functional tests do not assert that board installation succeeded</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11269">PHPBB3-11269</a>] - Travis functional test case errors</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11278">PHPBB3-11278</a>] - Firebird tables are not removed correctly on 3.0.9-rc1 update</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11288">PHPBB3-11288</a>] - Search fooled by hyphens</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11291">PHPBB3-11291</a>] - &quot;Could not open input file: ../composer.phar&quot; error during phing's create-package</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11292">PHPBB3-11292</a>] - Newlines removed in display of PM reports, no clickable links in PM reports</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11301">PHPBB3-11301</a>] - &quot;String offset cast occured&quot; error on PHP 5.4</li>
@ -185,6 +184,9 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11674">PHPBB3-11674</a>] - Do not include vendor folder if there are no dependencies.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11524">PHPBB3-11524</a>] - MySQL Upgrader throws warnings on PHP 5.4</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11720">PHPBB3-11720</a>] - Reporting posts leads to white page error</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11769">PHPBB3-11769</a>] - Wrong poster in subscription email when poster is using the Quote button</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11775">PHPBB3-11775</a>] - Error while moving posts to a new topic</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11802">PHPBB3-11802</a>] - Undefined variable $browser in /download/file.php</li>
</ul>
<h4>Improvement</h4>
<ul>

View file

@ -832,7 +832,7 @@ $sql = 'SELECT *
$sql_ary = array(
'somedata' =&gt; $my_string,
'otherdata' =&gt; $an_int,
'moredata' =&gt; $another_int
'moredata' =&gt; $another_int,
);
$db-&gt;sql_query('INSERT INTO ' . SOME_TABLE . ' ' . $db-&gt;sql_build_array('INSERT', $sql_ary));
@ -844,7 +844,7 @@ $db-&gt;sql_query('INSERT INTO ' . SOME_TABLE . ' ' . $db-&gt;sql_build_array('I
$sql_ary = array(
'somedata' =&gt; $my_string,
'otherdata' =&gt; $an_int,
'moredata' =&gt; $another_int
'moredata' =&gt; $another_int,
);
$sql = 'UPDATE ' . SOME_TABLE . '
@ -937,20 +937,20 @@ $sql_array = array(
'FROM' =&gt; array(
FORUMS_WATCH_TABLE =&gt; 'fw',
FORUMS_TABLE =&gt; 'f'
FORUMS_TABLE =&gt; 'f',
),
'LEFT_JOIN' =&gt; array(
array(
'FROM' =&gt; array(FORUMS_TRACK_TABLE =&gt; 'ft'),
'ON' =&gt; 'ft.user_id = ' . $user-&gt;data['user_id'] . ' AND ft.forum_id = f.forum_id'
)
'ON' =&gt; 'ft.user_id = ' . $user-&gt;data['user_id'] . ' AND ft.forum_id = f.forum_id',
),
),
'WHERE' =&gt; 'fw.user_id = ' . $user-&gt;data['user_id'] . '
AND f.forum_id = fw.forum_id',
'ORDER_BY' =&gt; 'left_id'
'ORDER_BY' =&gt; 'left_id',
);
$sql = $db-&gt;sql_build_query('SELECT', $sql_array);
@ -964,13 +964,13 @@ $sql_array = array(
'FROM' =&gt; array(
FORUMS_WATCH_TABLE =&gt; 'fw',
FORUMS_TABLE =&gt; 'f'
FORUMS_TABLE =&gt; 'f',
),
'WHERE' =&gt; 'fw.user_id = ' . $user-&gt;data['user_id'] . '
AND f.forum_id = fw.forum_id',
'ORDER_BY' =&gt; 'left_id'
'ORDER_BY' =&gt; 'left_id',
);
if ($config['load_db_lastread'])
@ -978,8 +978,8 @@ if ($config['load_db_lastread'])
$sql_array['LEFT_JOIN'] = array(
array(
'FROM' =&gt; array(FORUMS_TRACK_TABLE =&gt; 'ft'),
'ON' =&gt; 'ft.user_id = ' . $user-&gt;data['user_id'] . ' AND ft.forum_id = f.forum_id'
)
'ON' =&gt; 'ft.user_id = ' . $user-&gt;data['user_id'] . ' AND ft.forum_id = f.forum_id',
),
);
$sql_array['SELECT'] .= ', ft.mark_time ';

View file

@ -179,6 +179,66 @@ ucp_pm_viewmessage_print_head_append
* Location: styles/prosilver/template/ucp_pm_viewmessage_print.html
* Purpose: Add asset calls directly before the `</head>` tag of the Print PM screen
ucp_prefs_personal_prepend
===
* Locations:
+ styles/prosilver/template/ucp_prefs_personal.html
+ styles/subsilver2/template/ucp_prefs_personal.html
* Purpose: Add user options to the top of the Edit Global Settings block
ucp_prefs_personal_append
===
* Locations:
+ styles/prosilver/template/ucp_prefs_personal.html
+ styles/subsilver2/template/ucp_prefs_personal.html
* Purpose: Add user options to the bottom of the Edit Global Settings block
ucp_prefs_post_prepend
===
* Locations:
+ styles/prosilver/template/ucp_prefs_post.html
+ styles/subsilver2/template/ucp_prefs_post.html
* Purpose: Add user options to the top of the Edit Posting Defaults block
ucp_prefs_post_append
===
* Locations:
+ styles/prosilver/template/ucp_prefs_post.html
+ styles/subsilver2/template/ucp_prefs_post.html
* Purpose: Add user options to the bottom of the Edit Posting Defaults block
ucp_prefs_view_radio_buttons_prepend
===
* Locations:
+ styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html
* Purpose: Add options to the top of the radio buttons block of the Edit
Display Options screen
ucp_prefs_view_radio_buttons_append
===
* Locations:
+ styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html
* Purpose: Add options to the bottom of the radio buttons block of the Edit
Display Options screen
ucp_prefs_view_select_menu_prepend
===
* Locations:
+ styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html
* Purpose: Add options to the top of the drop-down lists block of the Edit
Display Options screen
ucp_prefs_view_select_menu_append
===
* Locations:
+ styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html
* Purpose: Add options to the bottom of the drop-down lists block of the Edit
Display Options screen
viewtopic_print_head_append
===
* Location: styles/prosilver/template/viewtopic_print.html

View file

@ -328,6 +328,7 @@ class acp_board
'session_length' => array('lang' => 'SESSION_LENGTH', 'validate' => 'int:60:9999999999', 'type' => 'number:60:9999999999', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']),
'active_sessions' => array('lang' => 'LIMIT_SESSIONS', 'validate' => 'int:0:9999', 'type' => 'number:0:9999', 'explain' => true),
'load_online_time' => array('lang' => 'ONLINE_LENGTH', 'validate' => 'int:0:999', 'type' => 'number:0:999', 'explain' => true, 'append' => ' ' . $user->lang['MINUTES']),
'read_notification_expire_days' => array('lang' => 'READ_NOTIFICATION_EXPIRE_DAYS', 'validate' => 'int:0', 'type' => 'number:0', 'explain' => true, 'append' => ' ' . $user->lang['DAYS']),
'legend2' => 'GENERAL_OPTIONS',
'load_notifications' => array('lang' => 'LOAD_NOTIFICATIONS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
@ -375,6 +376,7 @@ class acp_board
'use_system_cron' => array('lang' => 'USE_SYSTEM_CRON', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'legend2' => 'PATH_SETTINGS',
'enable_mod_rewrite' => array('lang' => 'MOD_REWRITE_ENABLE', 'validate' => 'bool', 'type' => 'custom', 'method' => 'enable_mod_rewrite', 'explain' => true),
'smilies_path' => array('lang' => 'SMILIES_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true),
'icons_path' => array('lang' => 'ICONS_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true),
'upload_icons_path' => array('lang' => 'UPLOAD_ICONS_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true),
@ -658,6 +660,13 @@ class acp_board
$auth_tpl = $provider->get_acp_template($this->new_config);
if ($auth_tpl)
{
if (array_key_exists('BLOCK_VAR_NAME', $auth_tpl))
{
foreach ($auth_tpl['BLOCK_VARS'] as $block_vars)
{
$template->assign_block_vars($auth_tpl['BLOCK_VAR_NAME'], $block_vars);
}
}
$template->assign_vars($auth_tpl['TEMPLATE_VARS']);
$template->assign_block_vars('auth_tpl', array(
'TEMPLATE_FILE' => $auth_tpl['TEMPLATE_FILE'],
@ -994,4 +1003,51 @@ class acp_board
$cache->destroy('sql', FORUMS_TABLE);
}
/**
* Option to enable/disable removal of 'app.php' from URLs
*
* Note that if mod_rewrite is on, URLs without app.php will still work,
* but any paths generated by the controller helper url() method will not
* contain app.php.
*
* @param int $value The current config value
* @param string $key The config key
* @return string The HTML for the form field
*/
function enable_mod_rewrite($value, $key)
{
global $user, $config;
// Determine whether mod_rewrite is enabled on the server
// NOTE: This only works on Apache servers on which PHP is NOT
// installed as CGI. In that case, there is no way for PHP to
// determine whether or not the Apache module is enabled.
//
// To be clear on the value of $mod_rewite:
// null = Cannot determine whether or not the server has mod_rewrite
// enabled
// false = Can determine that the server does NOT have mod_rewrite
// enabled
// true = Can determine that the server DOES have mod_rewrite_enabled
$mod_rewrite = null;
if (function_exists('apache_get_modules'))
{
$mod_rewrite = (bool) in_array('mod_rewrite', apache_get_modules());
}
// If $message is false, mod_rewrite is enabled.
// Otherwise, it is not and we need to:
// 1) disable the form field
// 2) make sure the config value is set to 0
// 3) append the message to the return
$value = ($mod_rewrite === false) ? 0 : $value;
$message = $mod_rewrite === null ? 'MOD_REWRITE_INFORMATION_UNAVAILABLE' : ($mod_rewrite === false ? 'MOD_REWRITE_DISABLED' : false);
// Let's do some friendly HTML injection if we want to disable the
// form field because h_radio() has no pretty way of doing so
$field_name = 'config[enable_mod_rewrite]' . ($message === 'MOD_REWRITE_DISABLED' ? '" disabled="disabled' : '');
return h_radio($field_name, array(1 => 'YES', 0 => 'NO'), $value) .
($message !== false ? '<br /><span>' . $user->lang($message) . '</span>' : '');
}
}

View file

@ -126,17 +126,14 @@ class bbcode
*/
function bbcode_cache_init()
{
global $phpbb_root_path, $phpEx, $config, $user, $phpbb_extension_manager;
global $phpbb_root_path, $phpEx, $config, $user, $phpbb_extension_manager, $phpbb_filesystem;
if (empty($this->template_filename))
{
$this->template_bitfield = new bitfield($user->style['bbcode_bitfield']);
$style_resource_locator = new phpbb_style_resource_locator();
$style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider(), $phpbb_root_path);
$template = new phpbb_template_twig($phpbb_root_path, $phpEx, $config, $user, new phpbb_template_context(), $phpbb_extension_manager);
$style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider, $template);
$style->set_style();
$template = new phpbb_template_twig($phpbb_filesystem, $config, $user, new phpbb_template_context(), $phpbb_extension_manager);
$template->set_style();
$template->set_filenames(array('bbcode.html' => 'bbcode.html'));
$this->template_filename = $template->get_source_file_for_handle('bbcode.html');
}

View file

@ -61,6 +61,7 @@ define('LOGIN_CONTINUE', 1);
define('LOGIN_BREAK', 2);
define('LOGIN_SUCCESS', 3);
define('LOGIN_SUCCESS_CREATE_PROFILE', 20);
define('LOGIN_SUCCESS_LINK_PROFILE', 21);
define('LOGIN_ERROR_USERNAME', 10);
define('LOGIN_ERROR_PASSWORD', 11);
define('LOGIN_ERROR_ACTIVE', 12);

File diff suppressed because it is too large Load diff

View file

@ -7,8 +7,6 @@
*
*/
use Symfony\Component\HttpFoundation\Request;
/**
* @ignore
*/
@ -1072,7 +1070,14 @@ function phpbb_clean_path($path)
global $phpbb_root_path, $phpEx;
require($phpbb_root_path . 'includes/filesystem.' . $phpEx);
}
$phpbb_filesystem = new phpbb_filesystem();
$phpbb_filesystem = new phpbb_filesystem(
new phpbb_symfony_request(
new phpbb_request()
),
$phpbb_root_path,
$phpEx
);
}
return $phpbb_filesystem->clean_path($path);
@ -2343,7 +2348,6 @@ function phpbb_generate_template_pagination($template, $base_url, $block_var_nam
$template_array = array(
$tpl_prefix . 'BASE_URL' => $base_url,
'A_' . $tpl_prefix . 'BASE_URL' => addslashes($base_url),
$tpl_prefix . 'PER_PAGE' => $per_page,
'U_' . $tpl_prefix . 'PREVIOUS_PAGE' => $previous_page,
'U_' . $tpl_prefix . 'NEXT_PAGE' => ($on_page != $total_pages) ? $base_url . $url_delim . $start_name . '=' . ($on_page * $per_page) : '',
@ -2383,7 +2387,7 @@ function phpbb_on_page($template, $user, $base_url, $num_items, $per_page, $star
$template->assign_vars(array(
'PER_PAGE' => $per_page,
'ON_PAGE' => $on_page,
'A_BASE_URL' => addslashes($base_url),
'BASE_URL' => $base_url,
));
return sprintf($user->lang['PAGE_OF'], $on_page, max(ceil($num_items / $per_page), 1));
@ -2411,7 +2415,7 @@ function phpbb_on_page($template, $user, $base_url, $num_items, $per_page, $star
*/
function append_sid($url, $params = false, $is_amp = true, $session_id = false)
{
global $_SID, $_EXTRA_URL, $phpbb_hook;
global $_SID, $_EXTRA_URL, $phpbb_hook, $phpbb_filesystem;
global $phpbb_dispatcher;
if ($params === '' || (is_array($params) && empty($params)))
@ -2420,6 +2424,12 @@ function append_sid($url, $params = false, $is_amp = true, $session_id = false)
$params = false;
}
// Update the root path with the correct relative web path
if ($phpbb_filesystem instanceof phpbb_filesystem)
{
$url = $phpbb_filesystem->update_web_root_path($url);
}
$append_sid_overwrite = false;
/**
@ -2809,8 +2819,22 @@ function build_url($strip_vars = false)
{
global $user, $phpbb_root_path;
$page = $user->page['page'];
// We need to be cautious here.
// On some situations, the redirect path is an absolute URL, sometimes a relative path
// For a relative path, let's prefix it with $phpbb_root_path to point to the correct location,
// else we use the URL directly.
$url_parts = parse_url($page);
// URL
if ($url_parts !== false && !empty($url_parts['scheme']) && !empty($url_parts['host']))
{
$page = $phpbb_root_path . $page;
}
// Append SID
$redirect = append_sid($user->page['page'], false, false);
$redirect = append_sid($page, false, false);
// Add delimiter if not there...
if (strpos($redirect, '?') === false)
@ -2865,19 +2889,7 @@ function build_url($strip_vars = false)
$redirect .= ($query) ? '?' . $query : '';
}
// We need to be cautious here.
// On some situations, the redirect path is an absolute URL, sometimes a relative path
// For a relative path, let's prefix it with $phpbb_root_path to point to the correct location,
// else we use the URL directly.
$url_parts = @parse_url($redirect);
// URL
if ($url_parts !== false && !empty($url_parts['scheme']) && !empty($url_parts['host']))
{
return str_replace('&', '&amp;', $redirect);
}
return $phpbb_root_path . str_replace('&', '&amp;', $redirect);
}
/**
@ -3199,7 +3211,7 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = false, $s_display = true)
{
global $db, $user, $template, $auth, $phpEx, $phpbb_root_path, $config;
global $request;
global $request, $phpbb_container;
if (!class_exists('phpbb_captcha_factory', false))
{
@ -3226,7 +3238,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
trigger_error('NO_AUTH_ADMIN');
}
if (isset($_POST['login']))
if ($request->is_set_post('login') || ($request->is_set('login') && $request->variable('login', '') == 'external'))
{
// Get credential
if ($admin)
@ -3367,6 +3379,29 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
$s_hidden_fields['credential'] = $credential;
}
$auth_provider = $phpbb_container->get('auth.provider.' . $config['auth_method']);
$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'],
));
}
$s_hidden_fields = build_hidden_fields($s_hidden_fields);
$template->assign_vars(array(
@ -5051,7 +5086,7 @@ function phpbb_build_hidden_fields_for_query_params($request, $exclude = null)
function page_header($page_title = '', $display_online_list = true, $item_id = 0, $item = 'forum')
{
global $db, $config, $template, $SID, $_SID, $_EXTRA_URL, $user, $auth, $phpEx, $phpbb_root_path;
global $phpbb_dispatcher, $request, $phpbb_container;
global $phpbb_dispatcher, $request, $phpbb_container, $adm_relative_path;
if (defined('HEADER_INC'))
{
@ -5208,7 +5243,12 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
// Determine board url - we may need it later
$board_url = generate_board_url() . '/';
$web_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? $board_url : $phpbb_root_path;
// This path is sent with the base template paths in the assign_vars()
// call below. We need to correct it in case we are accessing from a
// controller because the web paths will be incorrect otherwise.
$phpbb_filesystem = $phpbb_container->get('filesystem');
$corrected_path = $phpbb_filesystem->get_web_root_path();
$web_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? $board_url : $corrected_path;
// Send a proper content-language to the output
$user_lang = $user->lang['USER_LANG'];
@ -5289,7 +5329,7 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
'SID' => $SID,
'_SID' => $_SID,
'SESSION_ID' => $user->session_id,
'ROOT_PATH' => $phpbb_root_path,
'ROOT_PATH' => $web_path,
'BOARD_URL' => $board_url,
'L_LOGIN_LOGOUT' => $l_login_logout,
@ -5300,7 +5340,6 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
'U_PRIVATEMSGS' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=inbox'),
'U_RETURN_INBOX' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=inbox'),
'U_POPUP_PM' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=popup'),
'UA_POPUP_PM' => addslashes(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=popup')),
'U_MEMBERLIST' => append_sid("{$phpbb_root_path}memberlist.$phpEx"),
'U_VIEWONLINE' => ($auth->acl_gets('u_viewprofile', 'a_user', 'a_useradd', 'a_userdel')) ? append_sid("{$phpbb_root_path}viewonline.$phpEx") : '',
'U_LOGIN_LOGOUT' => $u_login_logout,
@ -5346,7 +5385,7 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
'S_FORUM_ID' => $forum_id,
'S_TOPIC_ID' => $topic_id,
'S_LOGIN_ACTION' => ((!defined('ADMIN_START')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login') : append_sid("index.$phpEx", false, true, $user->session_id)),
'S_LOGIN_ACTION' => ((!defined('ADMIN_START')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login') : append_sid("{$phpbb_root_path}{$adm_relative_path}index.$phpEx", false, true, $user->session_id)),
'S_LOGIN_REDIRECT' => build_hidden_fields(array('redirect' => build_url())),
'S_ENABLE_FEEDS' => ($config['feed_enable']) ? true : false,
@ -5390,8 +5429,6 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
'T_UPLOAD' => $config['upload_path'],
'SITE_LOGO_IMG' => $user->img('site_logo'),
'A_COOKIE_SETTINGS' => addslashes('; path=' . $config['cookie_path'] . ((!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain']) . ((!$config['cookie_secure']) ? '' : '; secure')),
));
// application/xhtml+xml not used because of IE
@ -5675,49 +5712,3 @@ function phpbb_convert_30_dbms_to_31($dbms)
throw new \RuntimeException("You have specified an invalid dbms driver: $dbms");
}
/**
* Create a Symfony Request object from phpbb_request object
*
* @param phpbb_request $request Request object
* @return Request A Symfony Request object
*/
function phpbb_create_symfony_request(phpbb_request $request)
{
// This function is meant to sanitize the global input arrays
$sanitizer = function(&$value, $key) {
$type_cast_helper = new phpbb_request_type_cast_helper();
$type_cast_helper->set_var($value, $value, gettype($value), true);
};
// We need to re-enable the super globals so we can access them here
$request->enable_super_globals();
$get_parameters = $_GET;
$post_parameters = $_POST;
$server_parameters = $_SERVER;
$files_parameters = $_FILES;
$cookie_parameters = $_COOKIE;
// And now disable them again for security
$request->disable_super_globals();
array_walk_recursive($get_parameters, $sanitizer);
array_walk_recursive($post_parameters, $sanitizer);
// Until we fix the issue with relative paths, we have to fake path info
// to allow urls like app.php?controller=foo/bar
$controller = $request->variable('controller', '');
$path_info = '/' . $controller;
$request_uri = $server_parameters['REQUEST_URI'];
// Remove the query string from REQUEST_URI
if ($pos = strpos($request_uri, '?'))
{
$request_uri = substr($request_uri, 0, $pos);
}
// Add the path info (i.e. controller route) to the REQUEST_URI
$server_parameters['REQUEST_URI'] = $request_uri . $path_info;
$server_parameters['SCRIPT_NAME'] = '';
return new Request($get_parameters, $post_parameters, array(), $cookie_parameters, $files_parameters, $server_parameters);
}

View file

@ -727,37 +727,58 @@ function make_clickable($text, $server_url = false, $class = 'postlink')
$server_url = generate_board_url();
}
static $magic_url_match;
static $magic_url_replace;
static $static_class;
static $magic_url_match_args;
if (!is_array($magic_url_match) || $static_class != $class)
if (!is_array($magic_url_match_args) || $static_class != $class)
{
$static_class = $class;
$class = ($static_class) ? ' class="' . $static_class . '"' : '';
$local_class = ($static_class) ? ' class="' . $static_class . '-local"' : '';
$magic_url_match = $magic_url_replace = array();
// Be sure to not let the matches cross over. ;)
$magic_url_match_args = array();
// relative urls for this board
$magic_url_match[] = '#(^|[\n\t (>.])(' . preg_quote($server_url, '#') . ')/(' . get_preg_expression('relative_url_inline') . ')#ie';
$magic_url_replace[] = "make_clickable_callback(MAGIC_URL_LOCAL, '\$1', '\$2', '\$3', '$local_class')";
$magic_url_match_args[] = array(
'#(^|[\n\t (>.])(' . preg_quote($server_url, '#') . ')/(' . get_preg_expression('relative_url_inline') . ')#i',
MAGIC_URL_LOCAL,
$local_class,
);
// matches a xxxx://aaaaa.bbb.cccc. ...
$magic_url_match[] = '#(^|[\n\t (>.])(' . get_preg_expression('url_inline') . ')#ie';
$magic_url_replace[] = "make_clickable_callback(MAGIC_URL_FULL, '\$1', '\$2', '', '$class')";
$magic_url_match_args[] = array(
'#(^|[\n\t (>.])(' . get_preg_expression('url_inline') . ')#i',
MAGIC_URL_FULL,
$class,
);
// matches a "www.xxxx.yyyy[/zzzz]" kinda lazy URL thing
$magic_url_match[] = '#(^|[\n\t (>])(' . get_preg_expression('www_url_inline') . ')#ie';
$magic_url_replace[] = "make_clickable_callback(MAGIC_URL_WWW, '\$1', '\$2', '', '$class')";
$magic_url_match_args[] = array(
'#(^|[\n\t (>])(' . get_preg_expression('www_url_inline') . ')#i',
MAGIC_URL_WWW,
$class,
);
// matches an email@domain type address at the start of a line, or after a space or after what might be a BBCode.
$magic_url_match[] = '/(^|[\n\t (>])(' . get_preg_expression('email') . ')/ie';
$magic_url_replace[] = "make_clickable_callback(MAGIC_URL_EMAIL, '\$1', '\$2', '', '')";
$magic_url_match_args[] = array(
'/(^|[\n\t (>])(' . get_preg_expression('email') . ')/i',
MAGIC_URL_EMAIL,
'',
);
}
return preg_replace($magic_url_match, $magic_url_replace, $text);
foreach ($magic_url_match_args as $magic_args)
{
if (preg_match($magic_args[0], $text, $matches))
{
$text = preg_replace_callback($magic_args[0], function($matches) use ($magic_args)
{
return make_clickable_callback($magic_args[1], $matches[1], $matches[2], $matches[3], $magic_args[2]);
}, $text);
}
}
return $text;
}
/**
@ -813,7 +834,7 @@ function bbcode_nl2br($text)
*/
function smiley_text($text, $force_option = false)
{
global $config, $user, $phpbb_root_path;
global $config, $user, $phpbb_filesystem;
if ($force_option || !$config['allow_smilies'] || !$user->optionget('viewsmilies'))
{
@ -821,7 +842,7 @@ function smiley_text($text, $force_option = false)
}
else
{
$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_root_path;
$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_filesystem->get_web_root_path();
return preg_replace('#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/(.*?) \/><!\-\- s\1 \-\->#', '<img class="smilies" src="' . $root_path . $config['smilies_path'] . '/\2 />', $text);
}
}

View file

@ -21,7 +21,7 @@ if (!defined('IN_PHPBB'))
*/
class messenger
{
var $vars, $msg, $extra_headers, $replyto, $from, $subject;
var $msg, $extra_headers, $replyto, $from, $subject;
var $addresses = array();
var $mail_priority = MAIL_NORMAL_PRIORITY;
@ -53,7 +53,7 @@ class messenger
function reset()
{
$this->addresses = $this->extra_headers = array();
$this->vars = $this->msg = $this->replyto = $this->from = '';
$this->msg = $this->replyto = $this->from = '';
$this->mail_priority = MAIL_NORMAL_PRIORITY;
}
@ -258,8 +258,6 @@ class messenger
'body' => $template_file . '.txt',
));
$this->vars = $this->template->get_template_vars();
return true;
}
@ -288,26 +286,11 @@ class messenger
global $config, $user;
// We add some standard variables we always use, no need to specify them always
if (!isset($this->vars['U_BOARD']))
{
$this->assign_vars(array(
'U_BOARD' => generate_board_url(),
));
}
if (!isset($this->vars['EMAIL_SIG']))
{
$this->assign_vars(array(
'EMAIL_SIG' => str_replace('<br />', "\n", "-- \n" . htmlspecialchars_decode($config['board_email_sig'])),
));
}
if (!isset($this->vars['SITENAME']))
{
$this->assign_vars(array(
'SITENAME' => htmlspecialchars_decode($config['sitename']),
));
}
// Parse message through template
$this->msg = trim($this->template->assign_display('body'));
@ -643,14 +626,14 @@ class messenger
*/
protected function setup_template()
{
global $config, $phpbb_root_path, $phpEx, $user, $phpbb_extension_manager;
global $config, $phpbb_filesystem, $user, $phpbb_extension_manager;
if ($this->template instanceof phpbb_template)
{
return;
}
$this->template = new phpbb_template_twig($phpbb_root_path, $phpEx, $config, $user, new phpbb_template_context(), $phpbb_extension_manager);
$this->template = new phpbb_template_twig($phpbb_filesystem, $config, $user, new phpbb_template_context(), $phpbb_extension_manager);
}
/**
@ -660,7 +643,7 @@ class messenger
{
$this->setup_template();
$this->template->set_style_names(array($path_name), $paths);
$this->template->set_custom_style($path_name, $paths);
}
}

View file

@ -455,7 +455,7 @@ class p_master
*/
function load_active($mode = false, $module_url = false, $execute_module = true)
{
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user, $phpbb_style;
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user, $template;
$module_path = $this->include_path . $this->p_class;
$icat = request_var('icat', '');
@ -508,7 +508,7 @@ class p_master
if (is_dir($module_style_dir))
{
$phpbb_style->set_custom_style('admin', array($module_style_dir, $phpbb_admin_path . 'style'), array(), '');
$template->set_custom_style('adm', array($module_style_dir, $phpbb_admin_path . 'style'));
}
}
@ -537,7 +537,7 @@ class p_master
if (is_dir($phpbb_root_path . $module_style_dir))
{
$phpbb_style->set_style(array($module_style_dir, 'styles'));
$template->set_style(array($module_style_dir, 'styles'));
}
}

View file

@ -2166,6 +2166,11 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
update_forum_tracking_info($data['forum_id'], $forum_last_post_time, $f_mark_time, false);
}
// If a username was supplied or the poster is a guest, we will use the supplied username.
// Doing it this way we can use "...post by guest-username..." in notifications when
// "guest-username" is supplied or ommit the username if it is not.
$username = ($username !== '' || !$user->data['is_registered']) ? $username : $user->data['username'];
// Send Notifications
$notification_data = array_merge($data, array(
'topic_title' => (isset($data['topic_title'])) ? $data['topic_title'] : $subject,

View file

@ -2534,7 +2534,7 @@ function group_delete($group_id, $group_name = false)
*/
function group_user_add($group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $default = false, $leader = 0, $pending = 0, $group_attributes = false)
{
global $db, $auth;
global $db, $auth, $phpbb_container;
// We need both username and user_id info
$result = user_get_id_name($user_id_ary, $username_ary);
@ -2622,6 +2622,20 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
group_update_listings($group_id);
if ($pending)
{
$phpbb_notifications = $phpbb_container->get('notification_manager');
foreach ($add_id_ary as $user_id)
{
$phpbb_notifications->add_notifications('group_request', array(
'group_id' => $group_id,
'user_id' => $user_id,
'group_name' => $group_name,
));
}
}
// Return false - no error
return false;
}
@ -2635,7 +2649,7 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
*/
function group_user_del($group_id, $user_id_ary = false, $username_ary = false, $group_name = false)
{
global $db, $auth, $config, $phpbb_dispatcher;
global $db, $auth, $config, $phpbb_dispatcher, $phpbb_container;
if ($config['coppa_enable'])
{
@ -2769,6 +2783,10 @@ function group_user_del($group_id, $user_id_ary = false, $username_ary = false,
group_update_listings($group_id);
$phpbb_notifications = $phpbb_container->get('notification_manager');
$phpbb_notifications->delete_notifications('group_request', $user_id_ary, $group_id);
// Return false - no error
return false;
}
@ -2858,7 +2876,7 @@ function remove_default_rank($group_id, $user_ids)
*/
function group_user_attributes($action, $group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $group_attributes = false)
{
global $db, $auth, $phpbb_root_path, $phpEx, $config;
global $db, $auth, $phpbb_root_path, $phpEx, $config, $phpbb_container;
// We need both username and user_id info
$result = user_get_id_name($user_id_ary, $username_ary);
@ -2911,11 +2929,10 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
AND ' . $db->sql_in_set('ug.user_id', $user_id_ary);
$result = $db->sql_query($sql);
$user_id_ary = $email_users = array();
$user_id_ary = array();
while ($row = $db->sql_fetchrow($result))
{
$user_id_ary[] = $row['user_id'];
$email_users[] = $row;
}
$db->sql_freeresult($result);
@ -2930,26 +2947,14 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
AND " . $db->sql_in_set('user_id', $user_id_ary);
$db->sql_query($sql);
// Send approved email to users...
include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
$messenger = new messenger();
$phpbb_notifications = $phpbb_container->get('notification_manager');
foreach ($email_users as $row)
{
$messenger->template('group_approved', $row['user_lang']);
$messenger->set_addresses($row);
$messenger->assign_vars(array(
'USERNAME' => htmlspecialchars_decode($row['username']),
'GROUP_NAME' => htmlspecialchars_decode($group_name),
'U_GROUP' => generate_board_url() . "/ucp.$phpEx?i=groups&mode=membership")
);
$messenger->send($row['user_notify_type']);
}
$messenger->save_queue();
$phpbb_notifications->add_notifications('group_request_approved', array(
'user_ids' => $user_id_ary,
'group_id' => $group_id,
'group_name' => $group_name,
));
$phpbb_notifications->delete_notifications('group_request', $user_id_ary, $group_id);
$log = 'LOG_USERS_APPROVED';
break;

View file

@ -161,6 +161,7 @@ class mcp_pm_reports
'S_CLOSE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=pm_reports&amp;mode=pm_report_details&amp;r=' . $report_id),
'S_CAN_VIEWIP' => $auth->acl_getf_global('m_info'),
'S_POST_REPORTED' => $pm_info['message_reported'],
'S_REPORT_CLOSED' => $report['report_closed'],
'S_USER_NOTES' => true,
'U_MCP_REPORT' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=pm_reports&amp;mode=pm_report_details&amp;r=' . $report_id),

View file

@ -189,6 +189,7 @@ class mcp_reports
'S_POST_REPORTED' => $post_info['post_reported'],
'S_POST_UNAPPROVED' => ($post_info['post_visibility'] == ITEM_UNAPPROVED),
'S_POST_LOCKED' => $post_info['post_edit_locked'],
'S_REPORT_CLOSED' => $report['report_closed'],
'S_USER_NOTES' => true,
'U_EDIT' => ($auth->acl_get('m_edit', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;f={$post_info['forum_id']}&amp;p={$post_info['post_id']}") : '',

View file

@ -669,10 +669,10 @@ function merge_posts($topic_id, $to_topic_id)
}
// If the topic no longer exist, we will update the topic watch table.
phpbb_update_rows_avoiding_duplicates_notify_status($db, TOPICS_WATCH_TABLE, 'topic_id', $topic_ids, $to_topic_id);
phpbb_update_rows_avoiding_duplicates_notify_status($db, TOPICS_WATCH_TABLE, 'topic_id', array($topic_id), $to_topic_id);
// If the topic no longer exist, we will update the bookmarks table.
phpbb_update_rows_avoiding_duplicates($db, BOOKMARKS_TABLE, 'topic_id', $topic_id, $to_topic_id);
phpbb_update_rows_avoiding_duplicates($db, BOOKMARKS_TABLE, 'topic_id', array($topic_id), $to_topic_id);
}
// Link to the new topic

View file

@ -0,0 +1,34 @@
<?php
/**
*
* @package ucp
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @package module_install
*/
class ucp_auth_link_info
{
function module()
{
return array(
'filename' => 'ucp_auth_link',
'title' => 'UCP_AUTH_LINK',
'version' => '1.0.0',
'modes' => array(
'auth_link' => array('title' => 'UCP_AUTH_LINK_MANAGE', 'auth' => '', 'cat' => array('UCP_PROFILE')),
),
);
}
function install()
{
}
function uninstall()
{
}
}

View file

@ -0,0 +1,142 @@
<?php
/**
*
* @package ucp
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
class ucp_auth_link
{
/**
* @var string
*/
public $u_action;
/**
* Generates the ucp_auth_link page and handles the auth link process
*
* @param int $id
* @param string $mode
*/
public function main($id, $mode)
{
global $config, $request, $template, $phpbb_container, $user;
$error = array();
$auth_provider = $phpbb_container->get('auth.provider.' . $config['auth_method']);
// confirm that the auth provider supports this page
$provider_data = $auth_provider->get_auth_link_data();
if ($provider_data === null)
{
$error[] = 'UCP_AUTH_LINK_NOT_SUPPORTED';
}
$s_hidden_fields = array();
add_form_key('ucp_auth_link');
$submit = $request->variable('submit', false, false, phpbb_request_interface::POST);
// This path is only for primary actions
if (!sizeof($error) && $submit)
{
if (!check_form_key('ucp_auth_link'))
{
$error[] = 'FORM_INVALID';
}
if (!sizeof($error))
{
// Any post data could be necessary for auth (un)linking
$link_data = $request->get_super_global(phpbb_request_interface::POST);
// The current user_id is also necessary
$link_data['user_id'] = $user->data['user_id'];
// Tell the provider that the method is auth_link not login_link
$link_data['link_method'] = 'auth_link';
if ($request->variable('link', 0, false, phpbb_request_interface::POST))
{
$error[] = $auth_provider->link_account($link_data);
}
else
{
$error[] = $auth_provider->unlink_account($link_data);
}
// Template data may have changed, get new data
$provider_data = $auth_provider->get_auth_link_data();
}
}
// In some cases, a request to an external server may be required. In
// these cases, the GET parameter 'link' should exist and should be true
if ($request->variable('link', false))
{
// In this case the link data should only be populated with the
// link_method as the provider dictates how data is returned to it.
$link_data = array('link_method' => 'auth_link');
$error[] = $auth_provider->link_account($link_data);
// Template data may have changed, get new data
$provider_data = $auth_provider->get_auth_link_data();
}
if (isset($provider_data['VARS']))
{
// Handle hidden fields separately
if (isset($provider_data['VARS']['HIDDEN_FIELDS']))
{
$s_hidden_fields = array_merge($s_hidden_fields, $provider_data['VARS']['HIDDEN_FIELDS']);
unset($provider_data['VARS']['HIDDEN_FIELDS']);
}
$template->assign_vars($provider_data['VARS']);
}
if (isset($provider_data['BLOCK_VAR_NAME']))
{
foreach ($provider_data['BLOCK_VARS'] as $block_vars)
{
// See if there are additional hidden fields. This should be an associative array
if (isset($block_vars['HIDDEN_FIELDS']))
{
$block_vars['HIDDEN_FIELDS'] = build_hidden_fields($block_vars['HIDDEN_FIELDS']);
}
$template->assign_block_vars($provider_data['BLOCK_VAR_NAME'], $block_vars);
}
}
$s_hidden_fields = build_hidden_fields($s_hidden_fields);
// Replace "error" strings with their real, localised form
$error = array_map(array($user, 'lang'), $error);
$error = implode('<br />', $error);
$template->assign_vars(array(
'ERROR' => $error,
'PROVIDER_TEMPLATE_FILE' => $provider_data['TEMPLATE_FILE'],
'S_HIDDEN_FIELDS' => $s_hidden_fields,
'S_UCP_ACTION' => $this->u_action,
));
$this->tpl_name = 'ucp_auth_link';
$this->page_title = 'UCP_AUTH_LINK';
}
}

View file

@ -197,37 +197,6 @@ class ucp_groups
else
{
group_user_add($group_id, $user->data['user_id'], false, false, false, 0, 1);
include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
$messenger = new messenger();
$sql = 'SELECT u.username, u.username_clean, u.user_email, u.user_notify_type, u.user_jabber, u.user_lang
FROM ' . USER_GROUP_TABLE . ' ug, ' . USERS_TABLE . " u
WHERE ug.user_id = u.user_id
AND ug.group_leader = 1
AND ug.group_id = $group_id";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$messenger->template('group_request', $row['user_lang']);
$messenger->set_addresses($row);
$messenger->assign_vars(array(
'USERNAME' => htmlspecialchars_decode($row['username']),
'GROUP_NAME' => htmlspecialchars_decode($group_row[$group_id]['group_name']),
'REQUEST_USERNAME' => $user->data['username'],
'U_PENDING' => generate_board_url() . "/ucp.$phpEx?i=groups&mode=manage&action=list&g=$group_id",
'U_GROUP' => generate_board_url() . "/memberlist.$phpEx?mode=group&g=$group_id")
);
$messenger->send($row['user_notify_type']);
}
$db->sql_freeresult($result);
$messenger->save_queue();
}
add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_JOIN' . (($group_row[$group_id]['group_type'] == GROUP_FREE) ? '' : '_PENDING'), $group_row[$group_id]['group_name']);

View file

@ -0,0 +1,243 @@
<?php
/**
*
* @package ucp
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* ucp_login_link
* Allows users of external accounts link those accounts to their phpBB accounts
* during an attempted login.
* @package ucp
*/
class ucp_login_link
{
/**
* @var string
*/
public $u_action;
/**
* Generates the ucp_login_link page and handles login link process
*
* @param int $id
* @param string $mode
*/
function main($id, $mode)
{
global $config, $phpbb_container, $request, $template, $user;
global $phpbb_root_path, $phpEx;
// Initialize necessary variables
$login_error = null;
$login_link_error = null;
$login_username = null;
// Build the data array
$data = $this->get_login_link_data_array();
// Ensure the person was sent here with login_link data
if (empty($data))
{
$login_link_error = $user->lang['LOGIN_LINK_NO_DATA_PROVIDED'];
}
// Use the auth_provider requested even if different from configured
$auth_provider = 'auth.provider.' . $request->variable('auth_provider', $config['auth_method']);
$auth_provider = $phpbb_container->get($auth_provider);
// Set the link_method to login_link
$data['link_method'] = 'login_link';
// Have the authentication provider check that all necessary data is available
$result = $auth_provider->login_link_has_necessary_data($data);
if ($result !== null)
{
$login_link_error = $user->lang[$result];
}
// Perform link action if there is no error
if (!$login_link_error)
{
if ($request->is_set_post('login'))
{
$login_username = $request->variable('login_username', '', false, phpbb_request_interface::POST);
$login_password = $request->untrimmed_variable('login_password', '', true, phpbb_request_interface::POST);
$login_result = $auth_provider->login($login_username, $login_password);
// We only care if there is or is not an error
$login_error = $this->process_login_result($login_result);
if (!$login_error)
{
// Give the user_id to the data
$data['user_id'] = $login_result['user_row']['user_id'];
// The user is now logged in, attempt to link the user to the external account
$result = $auth_provider->link_account($data);
if ($result)
{
$login_link_error = $user->lang[$result];
}
else
{
// Finish login
$result = $user->session_create($login_result['user_row']['user_id'], false, false, true);
// Perform a redirect as the account has been linked
$this->perform_redirect();
}
}
}
}
$template->assign_vars(array(
// Common template elements
'LOGIN_LINK_ERROR' => $login_link_error,
'PASSWORD_CREDENTIAL' => 'login_password',
'USERNAME_CREDENTIAL' => 'login_username',
'S_HIDDEN_FIELDS' => $this->get_hidden_fields($data),
// Registration elements
'REGISTER_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'),
// Login elements
'LOGIN_ERROR' => $login_error,
'LOGIN_USERNAME' => $login_username,
));
$this->tpl_name = 'ucp_login_link';
$this->page_title = 'UCP_LOGIN_LINK';
}
/**
* Builds the hidden fields string from the data array.
*
* @param array $data This function only includes data in the array
* that has a key that begins with 'login_link_'
* @return string A string of hidden fields that can be included in the
* template
*/
protected function get_hidden_fields($data)
{
$fields = array();
foreach ($data as $key => $value)
{
$fields['login_link_' . $key] = $value;
}
return build_hidden_fields($fields);
}
/**
* Builds the login_link data array
*
* @return array All login_link data. This is all GET data whose names
* begin with 'login_link_'
*/
protected function get_login_link_data_array()
{
global $request;
$var_names = $request->variable_names(phpbb_request_interface::GET);
$login_link_data = array();
$string_start_length = strlen('login_link_');
foreach ($var_names as $var_name)
{
if (strpos($var_name, 'login_link_') === 0)
{
$key_name = substr($var_name, $string_start_length);
$login_link_data[$key_name] = $request->variable($var_name, '', false, phpbb_request_interface::GET);
}
}
return $login_link_data;
}
/**
* Processes the result array from the login process
* @param array $result The login result array
* @return string|null If there was an error in the process, a string is
* returned. If the login was successful, then null is
* returned.
*/
protected function process_login_result($result)
{
global $config, $request, $template, $user;
$login_error = null;
if ($result['status'] != LOGIN_SUCCESS)
{
// Handle all errors first
if ($result['status'] == LOGIN_BREAK)
{
trigger_error($result['error_msg']);
}
switch ($result['status'])
{
case LOGIN_ERROR_ATTEMPTS:
$captcha = phpbb_captcha_factory::get_instance($config['captcha_plugin']);
$captcha->init(CONFIRM_LOGIN);
$template->assign_vars(array(
'CAPTCHA_TEMPLATE' => $captcha->get_template(),
));
$login_error = $user->lang[$result['error_msg']];
break;
case LOGIN_ERROR_PASSWORD_CONVERT:
$login_error = sprintf(
$user->lang[$result['error_msg']],
($config['email_enable']) ? '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=sendpassword') . '">' : '',
($config['email_enable']) ? '</a>' : '',
($config['board_contact']) ? '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">' : '',
($config['board_contact']) ? '</a>' : ''
);
break;
// Username, password, etc...
default:
$login_error = $user->lang[$result['error_msg']];
// Assign admin contact to some error messages
if ($result['error_msg'] == 'LOGIN_ERROR_USERNAME' || $result['error_msg'] == 'LOGIN_ERROR_PASSWORD')
{
$login_error = (!$config['board_contact']) ? sprintf($user->lang[$result['error_msg']], '', '') : sprintf($user->lang[$result['error_msg']], '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">', '</a>');
}
break;
}
}
return $login_error;
}
/**
* Performs a post login redirect
*/
protected function perform_redirect()
{
global $phpbb_root_path, $phpEx;
$url = append_sid($phpbb_root_path . 'index.' . $phpEx);
redirect($url);
}
}

View file

@ -26,7 +26,7 @@ class ucp_prefs
function main($id, $mode)
{
global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
global $config, $db, $user, $auth, $template, $phpbb_dispatcher, $phpbb_root_path, $phpEx;
$submit = (isset($_POST['submit'])) ? true : false;
$error = $data = array();
@ -55,6 +55,20 @@ class ucp_prefs
$data['notifymethod'] = NOTIFY_BOTH;
}
/**
* Add UCP edit global settings data before they are assigned to the template or submitted
*
* To assign data to the template, use $template->assign_vars()
*
* @event core.ucp_prefs_personal_data
* @var bool submit Do we display the form only
* or did the user press submit
* @var array data Array with current ucp options data
* @since 3.1-A1
*/
$vars = array('submit', 'data');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_personal_data', compact($vars)));
if ($submit)
{
if ($config['override_user_style'])
@ -93,6 +107,17 @@ class ucp_prefs
'user_style' => $data['style'],
);
/**
* Update UCP edit global settings data on form submit
*
* @event core.ucp_prefs_personal_update_data
* @var array data Submitted display options data
* @var array sql_ary Display options data we udpate
* @since 3.1-A1
*/
$vars = array('data', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_personal_update_data', compact($vars)));
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE user_id = ' . $user->data['user_id'];
@ -209,6 +234,20 @@ class ucp_prefs
'wordcensor' => request_var('wordcensor', (bool) $user->optionget('viewcensors')),
);
/**
* Add UCP edit display options data before they are assigned to the template or submitted
*
* To assign data to the template, use $template->assign_vars()
*
* @event core.ucp_prefs_view_data
* @var bool submit Do we display the form only
* or did the user press submit
* @var array data Array with current ucp options data
* @since 3.1-A1
*/
$vars = array('submit', 'data');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_view_data', compact($vars)));
if ($submit)
{
$error = validate_data($data, array(
@ -247,6 +286,17 @@ class ucp_prefs
'user_post_show_days' => $data['post_st'],
);
/**
* Update UCP edit display options data on form submit
*
* @event core.ucp_prefs_view_update_data
* @var array data Submitted display options data
* @var array sql_ary Display options data we udpate
* @since 3.1-A1
*/
$vars = array('data', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_view_update_data', compact($vars)));
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE user_id = ' . $user->data['user_id'];
@ -335,6 +385,20 @@ class ucp_prefs
);
add_form_key('ucp_prefs_post');
/**
* Add UCP edit posting defaults data before they are assigned to the template or submitted
*
* To assign data to the template, use $template->assign_vars()
*
* @event core.ucp_prefs_post_data
* @var bool submit Do we display the form only
* or did the user press submit
* @var array data Array with current ucp options data
* @since 3.1-A1
*/
$vars = array('submit', 'data');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_post_data', compact($vars)));
if ($submit)
{
if (check_form_key('ucp_prefs_post'))
@ -348,6 +412,17 @@ class ucp_prefs
'user_notify' => $data['notify'],
);
/**
* Update UCP edit posting defaults data on form submit
*
* @event core.ucp_prefs_post_update_data
* @var array data Submitted display options data
* @var array sql_ary Display options data we udpate
* @since 3.1-A1
*/
$vars = array('data', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_post_update_data', compact($vars)));
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE user_id = ' . $user->data['user_id'];

View file

@ -27,7 +27,7 @@ class ucp_register
function main($id, $mode)
{
global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
global $request;
global $request, $phpbb_container;
//
if ($config['require_activation'] == USER_ACTIVATION_DISABLE)
@ -78,19 +78,37 @@ class ucp_register
}
}
$cp = new custom_profile();
$error = $cp_data = $cp_error = array();
$s_hidden_fields = array();
// Handle login_link data added to $_hidden_fields
$login_link_data = $this->get_login_link_data_array();
if (!empty($login_link_data))
{
// Confirm that we have all necessary data
$auth_provider = 'auth.provider.' . $request->variable('auth_provider', $config['auth_method']);
$auth_provider = $phpbb_container->get($auth_provider);
$result = $auth_provider->login_link_has_necessary_data($login_link_data);
if ($result !== null)
{
$error[] = $user->lang[$result];
}
$s_hidden_fields = array_merge($s_hidden_fields, $this->get_login_link_data_for_hidden_fields($login_link_data));
}
if (!$agreed || ($coppa === false && $config['coppa_enable']) || ($coppa && !$config['coppa_enable']))
{
$add_lang = ($change_lang) ? '&amp;change_lang=' . urlencode($change_lang) : '';
$add_coppa = ($coppa !== false) ? '&amp;coppa=' . $coppa : '';
$s_hidden_fields = array(
$s_hidden_fields = array_merge($s_hidden_fields, array(
'change_lang' => '',
);
));
// If we change the language, we want to pass on some more possible parameter.
if ($change_lang)
@ -398,15 +416,28 @@ class ucp_register
}
}
// Perform account linking if necessary
if (!empty($login_link_data))
{
$login_link_data['user_id'] = $user_id;
$result = $auth_provider->link_account($login_link_data);
if ($result)
{
$message = $message . '<br /><br />' . $user->lang[$result];
}
}
$message = $message . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>');
trigger_error($message);
}
}
$s_hidden_fields = array(
$s_hidden_fields = array_merge($s_hidden_fields, array(
'agreed' => 'true',
'change_lang' => 0,
);
));
if ($config['coppa_enable'])
{
@ -474,4 +505,49 @@ class ucp_register
$this->tpl_name = 'ucp_register';
$this->page_title = 'UCP_REGISTRATION';
}
/**
* Creates the login_link data array
*
* @return array Returns an array of all POST paramaters whose names
* begin with 'login_link_'
*/
protected function get_login_link_data_array()
{
global $request;
$var_names = $request->variable_names(phpbb_request_interface::POST);
$login_link_data = array();
$string_start_length = strlen('login_link_');
foreach ($var_names as $var_name)
{
if (strpos($var_name, 'login_link_') === 0)
{
$key_name = substr($var_name, $string_start_length);
$login_link_data[$key_name] = $request->variable($var_name, '', false, phpbb_request_interface::POST);
}
}
return $login_link_data;
}
/**
* Prepends they key names of an associative array with 'login_link_' for
* inclusion on the page as hidden fields.
*
* @param array $data The array to be modified
* @return array The modified array
*/
protected function get_login_link_data_for_hidden_fields($data)
{
$new_data = array();
foreach ($data as $key => $value)
{
$new_data['login_link_' . $key] = $value;
}
return $new_data;
}
}

View file

@ -101,6 +101,8 @@ class ucp_remind
$messenger->set_addresses($user_row);
$messenger->anti_abuse_headers($config, $user);
$messenger->assign_vars(array(
'USERNAME' => htmlspecialchars_decode($user_row['username']),
'PASSWORD' => htmlspecialchars_decode($user_password),

View file

@ -244,15 +244,11 @@ $config = new phpbb_config(array(
'load_tplcompile' => '1'
));
$phpbb_style_resource_locator = new phpbb_style_resource_locator();
$phpbb_style_path_provider = new phpbb_style_path_provider();
$template = new phpbb_template_twig($phpbb_root_path, $phpEx, $config, $user, new phpbb_template_context());
$phpbb_style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template);
$phpbb_style->set_ext_dir_prefix('adm/');
$phpbb_filesystem = $phpbb_container->get('filesystem');
$template = new phpbb_template_twig($phpbb_filesystem, $config, $user, new phpbb_template_context());
$paths = array($phpbb_root_path . 'install/update/new/adm/style', $phpbb_admin_path . 'style');
$paths = array_filter($paths, 'is_dir');
$phpbb_style->set_custom_style('admin', $paths, array(), '');
$template->set_custom_style('adm', $paths);
$template->assign_var('T_ASSETS_PATH', '../assets');
$template->assign_var('T_TEMPLATE_PATH', $phpbb_admin_path . 'style');

View file

@ -70,7 +70,7 @@ class install_update extends module
function main($mode, $sub)
{
global $phpbb_style, $template, $phpEx, $phpbb_root_path, $user, $db, $config, $cache, $auth, $language;
global $template, $phpEx, $phpbb_root_path, $user, $db, $config, $cache, $auth, $language;
global $request, $phpbb_admin_path, $phpbb_adm_relative_path, $phpbb_container;
// We must enable super globals, otherwise creating a new instance of the request class,
@ -143,7 +143,7 @@ class install_update extends module
// Set custom template again. ;)
$paths = array($phpbb_root_path . 'install/update/new/adm/style', $phpbb_admin_path . 'style');
$paths = array_filter($paths, 'is_dir');
$phpbb_style->set_custom_style('admin', $paths, array(), '');
$template->set_custom_style('adm', $paths);
$template->assign_vars(array(
'S_USER_LANG' => $user->lang['USER_LANG'],

View file

@ -128,6 +128,27 @@ CREATE INDEX phpbb_acl_users_user_id ON phpbb_acl_users(user_id);;
CREATE INDEX phpbb_acl_users_auth_option_id ON phpbb_acl_users(auth_option_id);;
CREATE INDEX phpbb_acl_users_auth_role_id ON phpbb_acl_users(auth_role_id);;
# Table: 'phpbb_oauth_tokens'
CREATE TABLE phpbb_oauth_tokens (
user_id INTEGER DEFAULT 0 NOT NULL,
session_id CHAR(32) CHARACTER SET NONE DEFAULT '' NOT NULL,
provider VARCHAR(255) CHARACTER SET NONE DEFAULT '' NOT NULL,
oauth_token BLOB SUB_TYPE TEXT CHARACTER SET NONE DEFAULT '' NOT NULL
);;
CREATE INDEX phpbb_oauth_tokens_user_id ON phpbb_oauth_tokens(user_id);;
CREATE INDEX phpbb_oauth_tokens_provider ON phpbb_oauth_tokens(provider);;
# Table: 'phpbb_oauth_accounts'
CREATE TABLE phpbb_oauth_accounts (
user_id INTEGER DEFAULT 0 NOT NULL,
provider VARCHAR(255) CHARACTER SET NONE DEFAULT '' NOT NULL,
oauth_provider_id BLOB SUB_TYPE TEXT CHARACTER SET UTF8 DEFAULT '' NOT NULL
);;
ALTER TABLE phpbb_oauth_accounts ADD PRIMARY KEY (user_id, provider);;
# Table: 'phpbb_banlist'
CREATE TABLE phpbb_banlist (
ban_id INTEGER NOT NULL,

View file

@ -166,6 +166,43 @@ CREATE INDEX [auth_role_id] ON [phpbb_acl_users]([auth_role_id]) ON [PRIMARY]
GO
/*
Table: 'phpbb_oauth_tokens'
*/
CREATE TABLE [phpbb_oauth_tokens] (
[user_id] [int] DEFAULT (0) NOT NULL ,
[session_id] [char] (32) DEFAULT ('') NOT NULL ,
[provider] [varchar] (255) DEFAULT ('') NOT NULL ,
[oauth_token] [text] DEFAULT ('') NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE INDEX [user_id] ON [phpbb_oauth_tokens]([user_id]) ON [PRIMARY]
GO
CREATE INDEX [provider] ON [phpbb_oauth_tokens]([provider]) ON [PRIMARY]
GO
/*
Table: 'phpbb_oauth_accounts'
*/
CREATE TABLE [phpbb_oauth_accounts] (
[user_id] [int] DEFAULT (0) NOT NULL ,
[provider] [varchar] (255) DEFAULT ('') NOT NULL ,
[oauth_provider_id] [varchar] (4000) DEFAULT ('') NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [phpbb_oauth_accounts] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_oauth_accounts] PRIMARY KEY CLUSTERED
(
[user_id],
[provider]
) ON [PRIMARY]
GO
/*
Table: 'phpbb_banlist'
*/

View file

@ -90,6 +90,26 @@ CREATE TABLE phpbb_acl_users (
);
# Table: 'phpbb_oauth_tokens'
CREATE TABLE phpbb_oauth_tokens (
user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
session_id binary(32) DEFAULT '' NOT NULL,
provider varbinary(255) DEFAULT '' NOT NULL,
oauth_token mediumblob NOT NULL,
KEY user_id (user_id),
KEY provider (provider)
);
# Table: 'phpbb_oauth_accounts'
CREATE TABLE phpbb_oauth_accounts (
user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
provider varbinary(255) DEFAULT '' NOT NULL,
oauth_provider_id blob NOT NULL,
PRIMARY KEY (user_id, provider)
);
# Table: 'phpbb_banlist'
CREATE TABLE phpbb_banlist (
ban_id mediumint(8) UNSIGNED NOT NULL auto_increment,

View file

@ -90,6 +90,26 @@ CREATE TABLE phpbb_acl_users (
) CHARACTER SET `utf8` COLLATE `utf8_bin`;
# Table: 'phpbb_oauth_tokens'
CREATE TABLE phpbb_oauth_tokens (
user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
session_id char(32) DEFAULT '' NOT NULL,
provider varchar(255) DEFAULT '' NOT NULL,
oauth_token mediumtext NOT NULL,
KEY user_id (user_id),
KEY provider (provider)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;
# Table: 'phpbb_oauth_accounts'
CREATE TABLE phpbb_oauth_accounts (
user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
provider varchar(255) DEFAULT '' NOT NULL,
oauth_provider_id text NOT NULL,
PRIMARY KEY (user_id, provider)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;
# Table: 'phpbb_banlist'
CREATE TABLE phpbb_banlist (
ban_id mediumint(8) UNSIGNED NOT NULL auto_increment,

View file

@ -210,6 +210,34 @@ CREATE INDEX phpbb_acl_users_auth_option_id ON phpbb_acl_users (auth_option_id)
CREATE INDEX phpbb_acl_users_auth_role_id ON phpbb_acl_users (auth_role_id)
/
/*
Table: 'phpbb_oauth_tokens'
*/
CREATE TABLE phpbb_oauth_tokens (
user_id number(8) DEFAULT '0' NOT NULL,
session_id char(32) DEFAULT '' ,
provider varchar2(255) DEFAULT '' ,
oauth_token clob DEFAULT ''
)
/
CREATE INDEX phpbb_oauth_tokens_user_id ON phpbb_oauth_tokens (user_id)
/
CREATE INDEX phpbb_oauth_tokens_provider ON phpbb_oauth_tokens (provider)
/
/*
Table: 'phpbb_oauth_accounts'
*/
CREATE TABLE phpbb_oauth_accounts (
user_id number(8) DEFAULT '0' NOT NULL,
provider varchar2(255) DEFAULT '' ,
oauth_provider_id clob DEFAULT '' ,
CONSTRAINT pk_phpbb_oauth_accounts PRIMARY KEY (user_id, provider)
)
/
/*
Table: 'phpbb_banlist'
*/

View file

@ -188,6 +188,30 @@ CREATE INDEX phpbb_acl_users_user_id ON phpbb_acl_users (user_id);
CREATE INDEX phpbb_acl_users_auth_option_id ON phpbb_acl_users (auth_option_id);
CREATE INDEX phpbb_acl_users_auth_role_id ON phpbb_acl_users (auth_role_id);
/*
Table: 'phpbb_oauth_tokens'
*/
CREATE TABLE phpbb_oauth_tokens (
user_id INT4 DEFAULT '0' NOT NULL CHECK (user_id >= 0),
session_id char(32) DEFAULT '' NOT NULL,
provider varchar(255) DEFAULT '' NOT NULL,
oauth_token TEXT DEFAULT '' NOT NULL
);
CREATE INDEX phpbb_oauth_tokens_user_id ON phpbb_oauth_tokens (user_id);
CREATE INDEX phpbb_oauth_tokens_provider ON phpbb_oauth_tokens (provider);
/*
Table: 'phpbb_oauth_accounts'
*/
CREATE TABLE phpbb_oauth_accounts (
user_id INT4 DEFAULT '0' NOT NULL CHECK (user_id >= 0),
provider varchar(255) DEFAULT '' NOT NULL,
oauth_provider_id varchar(4000) DEFAULT '' NOT NULL,
PRIMARY KEY (user_id, provider)
);
/*
Table: 'phpbb_banlist'
*/

View file

@ -101,6 +101,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_function_nam
INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_max_chunk_size', '50');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_package_size', '20');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_confirm', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_mod_rewrite', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_pm_icons', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_post_confirm', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('feed_enable', '1');

View file

@ -89,6 +89,26 @@ CREATE INDEX phpbb_acl_users_user_id ON phpbb_acl_users (user_id);
CREATE INDEX phpbb_acl_users_auth_option_id ON phpbb_acl_users (auth_option_id);
CREATE INDEX phpbb_acl_users_auth_role_id ON phpbb_acl_users (auth_role_id);
# Table: 'phpbb_oauth_tokens'
CREATE TABLE phpbb_oauth_tokens (
user_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
session_id char(32) NOT NULL DEFAULT '',
provider varchar(255) NOT NULL DEFAULT '',
oauth_token mediumtext(16777215) NOT NULL DEFAULT ''
);
CREATE INDEX phpbb_oauth_tokens_user_id ON phpbb_oauth_tokens (user_id);
CREATE INDEX phpbb_oauth_tokens_provider ON phpbb_oauth_tokens (provider);
# Table: 'phpbb_oauth_accounts'
CREATE TABLE phpbb_oauth_accounts (
user_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
provider varchar(255) NOT NULL DEFAULT '',
oauth_provider_id text(65535) NOT NULL DEFAULT '',
PRIMARY KEY (user_id, provider)
);
# Table: 'phpbb_banlist'
CREATE TABLE phpbb_banlist (
ban_id INTEGER PRIMARY KEY NOT NULL ,

View file

@ -367,6 +367,8 @@ $lang = array_merge($lang, array(
'LOAD_JQUERY_CDN_EXPLAIN' => 'If this setting is enabled, jQuery will be served from Googles AJAX API CDN instead of the copy included with phpBB on your server. If the CDN fails, phpBB will attempt to fall back to the copy included with phpBB.',
'LOAD_USER_ACTIVITY' => 'Show users activity',
'LOAD_USER_ACTIVITY_EXPLAIN' => 'Displays active topic/forum in user profiles and user control panel. It is recommended to disable this on boards with more than one million posts.',
'READ_NOTIFICATION_EXPIRE_DAYS' => 'Read Notification Expiration',
'READ_NOTIFICATION_EXPIRE_DAYS_EXPLAIN' => 'Number of days that will elapse before a read notification will automatically be deleted. Set this value to 0 to make notifications permanent.',
'RECOMPILE_STYLES' => 'Recompile stale style components',
'RECOMPILE_STYLES_EXPLAIN' => 'Check for updated style components on filesystem and recompile.',
'YES_ANON_READ_MARKING' => 'Enable topic marking for guests',
@ -390,10 +392,16 @@ $lang = array_merge($lang, array(
// Auth settings
$lang = array_merge($lang, array(
'ACP_AUTH_SETTINGS_EXPLAIN' => 'phpBB supports authentication plug-ins, or modules. These allow you determine how users are authenticated when they log into the board. By default three plug-ins are provided; DB, LDAP and Apache. Not all methods require additional information so only fill out fields if they are relevant to the selected method.',
'ACP_AUTH_SETTINGS_EXPLAIN' => 'phpBB supports authentication plug-ins, or modules. These allow you determine how users are authenticated when they log into the board. By default four plug-ins are provided: DB, LDAP, Apache, and OAuth. Not all methods require additional information so only fill out fields if they are relevant to the selected method.',
'AUTH_METHOD' => 'Select an authentication method',
'AUTH_PROVIDER_OAUTH_ERROR_ELEMENT_MISSING' => 'Both the key and secret of each enabled OAuth service provider must be provided. Only one was provided for an OAuth service provider.',
'AUTH_PROVIDER_OAUTH_EXPLAIN' => 'Each OAuth provider requires a unique secret and key in order to authenticate with the external server.<br />These should be supplied by the OAuth service when you register your website with them and should be entered exactly as provided to you.<br />Any service that does not have both a key and a secret entered here will not be available for use by the forum users.',
'AUTH_PROVIDER_OAUTH_KEY' => 'Key',
'AUTH_PROVIDER_OAUTH_TITLE' => 'OAuth',
'AUTH_PROVIDER_OAUTH_SECRET' => 'Secret',
'APACHE_SETUP_BEFORE_USE' => 'You have to setup apache authentication before you switch phpBB to this authentication method. Keep in mind that the username you use for apache authentication has to be the same as your phpBB username. Apache authentication can only be used with mod_php (not with a CGI version) and safe_mode disabled.',
'LDAP_DN' => 'LDAP base <var>dn</var>',
@ -427,6 +435,10 @@ $lang = array_merge($lang, array(
'FORCE_SERVER_VARS_EXPLAIN' => 'If set to yes the server settings defined here will be used in favour of the automatically determined values.',
'ICONS_PATH' => 'Post icons storage path',
'ICONS_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/icons</samp>.',
'MOD_REWRITE_ENABLE' => 'Enable URL Rewriting',
'MOD_REWRITE_ENABLE_EXPLAIN' => 'When enabled, URLs containing app.php will be rewritten to remove the filename (i.e. app.php/foo will become /foo). <strong>Apache servers mod_rewrite module is required for this functionality to work; if this option is enabled without mod_rewrite support, URLs on your board may be broken.</strong>',
'MOD_REWRITE_DISABLED' => 'The <strong>mod_rewrite</strong> module on your Apache web server is disabled. Enable the module or contact your web hosting provider if you wish to enable this feature.',
'MOD_REWRITE_INFORMATION_UNAVAILABLE' => 'We are unable to determine whether or not this server supports URL rewriting. This setting may be enabled but if URL rewriting is not available, paths generated by this board (such as for use in links) may be broken. Contact your web hosting provider if you are unsure whether or not you can safely enable this feature.',
'PATH_SETTINGS' => 'Path settings',
'RANKS_PATH' => 'Rank image storage path',
'RANKS_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/ranks</samp>.',

View file

@ -88,6 +88,14 @@ $lang = array_merge($lang, array(
'ATTACHED_IMAGE_NOT_IMAGE' => 'The image file you tried to attach is invalid.',
'AUTHOR' => 'Author',
'AUTH_NO_PROFILE_CREATED' => 'The creation of a user profile was unsuccessful.',
'AUTH_PROVIDER_OAUTH_ERROR_INVALID_ENTRY' => 'Invalid database entry.',
'AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE' => 'Invalid service type provided to OAuth service handler.',
'AUTH_PROVIDER_OAUTH_ERROR_SERVICE_NOT_CREATED' => 'OAuth service not created',
'AUTH_PROVIDER_OAUTH_SERVICE_BITLY' => 'Bitly',
'AUTH_PROVIDER_OAUTH_SERVICE_FACEBOOK' => 'Facebook',
'AUTH_PROVIDER_OAUTH_SERVICE_GOOGLE' => 'Google',
'AUTH_PROVIDER_OAUTH_TOKEN_ERROR_NOT_STORED' => 'OAuth token not stored.',
'AUTH_PROVIDER_OAUTH_TOKEN_ERROR_INCORRECTLY_STORED' => 'OAuth token incorrectly stored.',
'AVATAR_DISALLOWED_CONTENT' => 'The upload was rejected because the uploaded file was identified as a possible attack vector.',
'AVATAR_DISALLOWED_EXTENSION' => 'This file cannot be displayed because the extension <strong>%s</strong> is not allowed.',
'AVATAR_EMPTY_REMOTE_DATA' => 'The specified avatar could not be uploaded because the remote data appears to be invalid or corrupted.',
@ -351,6 +359,7 @@ $lang = array_merge($lang, array(
'LOGIN_CONFIRM_EXPLAIN' => 'To prevent brute forcing accounts the board requires you to enter a confirmation code after a maximum amount of failed logins. The code is displayed in the image you should see below. If you are visually impaired or cannot otherwise read this code please contact the %sBoard Administrator%s.', // unused
'LOGIN_ERROR_ATTEMPTS' => 'You exceeded the maximum allowed number of login attempts. In addition to your username and password you now also have to solve the CAPTCHA below.',
'LOGIN_ERROR_EXTERNAL_AUTH_APACHE' => 'You have not been authenticated by Apache.',
'LOGIN_ERROR_OAUTH_SERVICE_DOES_NOT_EXIST' => 'A non-existant OAuth service has been requested.',
'LOGIN_ERROR_PASSWORD' => 'You have specified an incorrect password. Please check your password and try again. If you continue to have problems please contact the %sBoard Administrator%s.',
'LOGIN_ERROR_PASSWORD_CONVERT' => 'It was not possible to convert your password when updating this bulletin boards software. Please %srequest a new password%s. If you continue to have problems please contact the %sBoard Administrator%s.',
'LOGIN_ERROR_USERNAME' => 'You have specified an incorrect username. Please check your username and try again. If you continue to have problems please contact the %sBoard Administrator%s.',
@ -414,6 +423,8 @@ $lang = array_merge($lang, array(
2 => '<strong>%d</strong> Notifications',
),
'NOTIFICATION_BOOKMARK' => '%1$s replied to the topic "%2$s" you have bookmarked.',
'NOTIFICATION_GROUP_REQUEST' => '%1$s is requesting to join the group %2$s.',
'NOTIFICATION_GROUP_REQUEST_APPROVED' => 'Your request to join the group %1$s has been approved.',
'NOTIFICATION_PM' => '%1$s sent you a Private Message "%2$s".',
'NOTIFICATION_POST' => '%1$s replied to the topic "%2$s".',
'NOTIFICATION_POST_APPROVED' => 'Your post was approved "%2$s".',

View file

@ -2,7 +2,7 @@ Subject: Forum post notification - "{FORUM_NAME}"
Hello {USERNAME},
You are receiving this notification because you are watching the forum "{FORUM_NAME}" at "{SITENAME}". This forum has received a new reply to the topic "{TOPIC_TITLE}"<!-- IF AUTHOR_NAME --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit. You can use the following link to view the last unread reply, no more notifications will be sent until you visit the topic.
You are receiving this notification because you are watching the forum "{FORUM_NAME}" at "{SITENAME}". This forum has received a new reply to the topic "{TOPIC_TITLE}"<!-- IF AUTHOR_NAME !== '' --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit. You can use the following link to view the last unread reply, no more notifications will be sent until you visit the topic.
{U_NEWEST_POST}

View file

@ -1,10 +0,0 @@
Subject: Your request has been approved
Congratulations,
Your request to join the "{GROUP_NAME}" group on "{SITENAME}" has been approved.
Click on the following link to see your group membership.
{U_GROUP}
{EMAIL_SIG}

View file

@ -2,7 +2,7 @@ Subject: New topic notification - "{FORUM_NAME}"
Hello {USERNAME},
You are receiving this notification because you are watching the forum "{FORUM_NAME}" at "{SITENAME}". This forum has received a new topic<!-- IF AUTHOR_NAME --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit, "{TOPIC_TITLE}". You can use the following link to view the forum, no more notifications will be sent until you visit the forum.
You are receiving this notification because you are watching the forum "{FORUM_NAME}" at "{SITENAME}". This forum has received a new topic<!-- IF AUTHOR_NAME !== '' --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit, "{TOPIC_TITLE}". You can use the following link to view the forum, no more notifications will be sent until you visit the forum.
{U_FORUM}

View file

@ -2,7 +2,7 @@ Subject: Topic reply notification - "{TOPIC_TITLE}"
Hello {USERNAME},
You are receiving this notification because you are watching the topic "{TOPIC_TITLE}" at "{SITENAME}". This topic has received a reply<!-- IF AUTHOR_NAME --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit. You can use the following link to view the replies made, no more notifications will be sent until you visit the topic.
You are receiving this notification because you are watching the topic "{TOPIC_TITLE}" at "{SITENAME}". This topic has received a reply<!-- IF AUTHOR_NAME !== '' --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit. You can use the following link to view the replies made, no more notifications will be sent until you visit the topic.
If you want to view the newest post made since your last visit, click the following link:
{U_NEWEST_POST}

View file

@ -270,6 +270,10 @@ $lang = array_merge($lang, array(
'LINK_REMOTE_SIZE' => 'Avatar dimensions',
'LINK_REMOTE_SIZE_EXPLAIN' => 'Specify the width and height of the avatar, leave blank to attempt automatic verification.',
'LOGIN_EXPLAIN_UCP' => 'Please login in order to access the User Control Panel.',
'LOGIN_LINK' => 'Link or register your account on an external service with your board account',
'LOGIN_LINK_EXPLAIN' => 'You have attempted to login with an external service that is not yet connected to an account on this board. You must now either link this account to an existing account or create a new account.',
'LOGIN_LINK_MISSING_DATA' => 'Data that is necessary to link your account with an external service is not available. Please restart the login process.',
'LOGIN_LINK_NO_DATA_PROVIDED' => 'No data has been provided to this page to link an external account to a forum account. Please contact the board administrator if you continue to experience problems.',
'LOGIN_KEY' => 'Login Key',
'LOGIN_TIME' => 'Login Time',
'LOGIN_REDIRECT' => 'You have been successfully logged in.',
@ -313,6 +317,7 @@ $lang = array_merge($lang, array(
'NOTIFICATION_METHOD_JABBER' => 'Jabber',
'NOTIFICATION_TYPE' => 'Notification type',
'NOTIFICATION_TYPE_BOOKMARK' => 'Someone replies to a topic you have bookmarked',
'NOTIFICATION_TYPE_GROUP_REQUEST' => 'Someone requests to join a group you lead',
'NOTIFICATION_TYPE_IN_MODERATION_QUEUE' => 'A post or topic needs approval',
'NOTIFICATION_TYPE_MODERATION_QUEUE' => 'Your topics/posts are approved or disapproved by a moderator',
'NOTIFICATION_TYPE_PM' => 'Someone sends you a private message',
@ -475,11 +480,20 @@ $lang = array_merge($lang, array(
'UCP_ADMIN_ACTIVATE' => 'Please note that you will need to enter a valid email address before your account is activated. The administrator will review your account and if approved you will receive an email at the address you specified.',
'UCP_AIM' => 'AOL Instant Messenger',
'UCP_ATTACHMENTS' => 'Attachments',
'UCP_AUTH_LINK' => 'External accounts',
'UCP_AUTH_LINK_ASK' => 'You currently have no account associated with this external service. Click the button below to link your board account to an account with this external service.',
'UCP_AUTH_LINK_ID' => 'Unique identifier',
'UCP_AUTH_LINK_LINK' => 'Link',
'UCP_AUTH_LINK_MANAGE' => 'Manage external account associations',
'UCP_AUTH_LINK_NOT_SUPPORTED' => 'Linking board accounts to external services is not supported by this boards current authentication method.',
'UCP_AUTH_LINK_TITLE' => 'Manage your external account associations',
'UCP_AUTH_LINK_UNLINK' => 'Unlink',
'UCP_COPPA_BEFORE' => 'Before %s',
'UCP_COPPA_ON_AFTER' => 'On or after %s',
'UCP_EMAIL_ACTIVATE' => 'Please note that you will need to enter a valid email address before your account is activated. You will receive an email at the address you provide that contains an account activation link.',
'UCP_ICQ' => 'ICQ number',
'UCP_JABBER' => 'Jabber address',
'UCP_LOGIN_LINK' => 'Set up an external account association',
'UCP_MAIN' => 'Overview',
'UCP_MAIN_ATTACHMENTS' => 'Manage attachments',

View file

@ -970,6 +970,18 @@ class phpbb_auth
);
}
// If the auth provider wants us to link an empty account do so and redirect
if ($login['status'] == LOGIN_SUCCESS_LINK_PROFILE)
{
// If this status exists a fourth field is in the $login array called 'redirect_data'
// This data is passed along as GET data to the next page allow the account to be linked
$params = array('mode' => 'login_link');
$url = append_sid($phpbb_root_path . 'ucp.' . $phpEx, array_merge($params, $login['redirect_data']));
redirect($url);
}
// If login succeeded, we will log the user in... else we pass the login array through...
if ($login['status'] == LOGIN_SUCCESS)
{

View file

@ -54,6 +54,22 @@ abstract class phpbb_auth_provider_base implements phpbb_auth_provider_interface
return;
}
/**
* {@inheritdoc}
*/
public function get_login_data()
{
return;
}
/**
* {@inheritdoc}
*/
public function get_auth_link_data()
{
return;
}
/**
* {@inheritdoc}
*/
@ -69,4 +85,28 @@ abstract class phpbb_auth_provider_base implements phpbb_auth_provider_interface
{
return;
}
/**
* {@inheritdoc}
*/
public function login_link_has_necessary_data($login_link_data)
{
return;
}
/**
* {@inheritdoc}
*/
public function link_account(array $link_data)
{
return;
}
/**
* {@inheritdoc}
*/
public function unlink_account(array $link_data)
{
return;
}
}

View file

@ -45,6 +45,11 @@ interface phpbb_auth_provider_interface
* 'error_msg' => string
* 'user_row' => array
* )
* A fourth key of the array may be present:
* 'redirect_data' This key is only used when 'status' is
* equal to LOGIN_SUCCESS_LINK_PROFILE and its value is an
* associative array that is turned into GET variables on
* the redirect url.
*/
public function login($username, $password);
@ -80,9 +85,48 @@ interface phpbb_auth_provider_interface
* 'TEMPLATE_FILE' => string,
* 'TEMPLATE_VARS' => array(...),
* )
* An optional third element may be added to this
* array: 'BLOCK_VAR_NAME'. If this is present,
* then its value should be a string that is used
* to designate the name of the loop used in the
* ACP template file. When this is present, an
* additional key named 'BLOCK_VARS' is required.
* This must be an array containing at least one
* array of variables that will be assigned during
* the loop in the template. An example of this is
* presented below:
* array(
* 'BLOCK_VAR_NAME' => string,
* 'BLOCK_VARS' => array(
* 'KEY IS UNIMPORTANT' => array(...),
* ),
* 'TEMPLATE_FILE' => string,
* 'TEMPLATE_VARS' => array(...),
* )
*/
public function get_acp_template($new_config);
/**
* Returns an array of data necessary to build custom elements on the login
* form.
*
* @return array|null If this function is not implemented on an auth
* provider then it returns null. If it is implemented
* it will return an array of up to four elements of
* which only 'TEMPLATE_FILE'. If 'BLOCK_VAR_NAME' is
* present then 'BLOCK_VARS' must also be present in
* the array. The fourth element 'VARS' is also
* optional. The array, with all four elements present
* looks like the following:
* array(
* 'TEMPLATE_FILE' => string,
* 'BLOCK_VAR_NAME' => string,
* 'BLOCK_VARS' => array(...),
* 'VARS' => array(...),
* )
*/
public function get_login_data();
/**
* Performs additional actions during logout.
*
@ -102,4 +146,52 @@ interface phpbb_auth_provider_interface
* session should be closed, or null if not implemented.
*/
public function validate_session($user);
/**
* Checks to see if $login_link_data contains all information except for the
* user_id of an account needed to successfully link an external account to
* a forum account.
*
* @param array $link_data Any data needed to link a phpBB account to
* an external account.
* @return string|null Returns a string with a language constant if there
* is data missing or null if there is no error.
*/
public function login_link_has_necessary_data($login_link_data);
/**
* Links an external account to a phpBB account.
*
* @param array $link_data Any data needed to link a phpBB account to
* an external account.
*/
public function link_account(array $link_data);
/**
* Returns an array of data necessary to build the ucp_auth_link page
*
* @return array|null If this function is not implemented on an auth
* provider then it returns null. If it is implemented
* it will return an array of up to four elements of
* which only 'TEMPLATE_FILE'. If 'BLOCK_VAR_NAME' is
* present then 'BLOCK_VARS' must also be present in
* the array. The fourth element 'VARS' is also
* optional. The array, with all four elements present
* looks like the following:
* array(
* 'TEMPLATE_FILE' => string,
* 'BLOCK_VAR_NAME' => string,
* 'BLOCK_VARS' => array(...),
* 'VARS' => array(...),
* )
*/
public function get_auth_link_data();
/**
* Unlinks an external account from a phpBB account.
*
* @param array $link_data Any data needed to unlink a phpBB account
* from a phpbb account.
*/
public function unlink_account(array $link_data);
}

View file

@ -0,0 +1,618 @@
<?php
/**
*
* @package auth
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
use OAuth\Common\Consumer\Credentials;
use OAuth\Common\Http\Uri\Uri;
/**
* OAuth authentication provider for phpBB3
*
* @package auth
*/
class phpbb_auth_provider_oauth extends phpbb_auth_provider_base
{
/**
* Database driver
*
* @var phpbb_db_driver
*/
protected $db;
/**
* phpBB config
*
* @var phpbb_config
*/
protected $config;
/**
* phpBB request object
*
* @var phpbb_request
*/
protected $request;
/**
* phpBB user
*
* @var phpbb_user
*/
protected $user;
/**
* OAuth token table
*
* @var string
*/
protected $auth_provider_oauth_token_storage_table;
/**
* OAuth account association table
*
* @var string
*/
protected $auth_provider_oauth_token_account_assoc;
/**
* All OAuth service providers
*
* @var phpbb_di_service_collection Contains phpbb_auth_provider_oauth_service_interface
*/
protected $service_providers;
/**
* Users table
*
* @var string
*/
protected $users_table;
/**
* Cached current uri object
*
* @var \OAuth\Common\Http\Uri\UriInterface|null
*/
protected $current_uri;
/**
* phpBB root path
*
* @var string
*/
protected $phpbb_root_path;
/**
* PHP extenstion
*
* @var string
*/
protected $php_ext;
/**
* OAuth Authentication Constructor
*
* @param phpbb_db_driver $db
* @param phpbb_config $config
* @param phpbb_request $request
* @param phpbb_user $user
* @param string $auth_provider_oauth_token_storage_table
* @param string $auth_provider_oauth_token_account_assoc
* @param phpbb_di_service_collection $service_providers Contains phpbb_auth_provider_oauth_service_interface
* @param string $users_table
* @param string $phpbb_root_path
* @param string $php_ext
*/
public function __construct(phpbb_db_driver $db, phpbb_config $config, phpbb_request $request, phpbb_user $user, $auth_provider_oauth_token_storage_table, $auth_provider_oauth_token_account_assoc, phpbb_di_service_collection $service_providers, $users_table, $phpbb_root_path, $php_ext)
{
$this->db = $db;
$this->config = $config;
$this->request = $request;
$this->user = $user;
$this->auth_provider_oauth_token_storage_table = $auth_provider_oauth_token_storage_table;
$this->auth_provider_oauth_token_account_assoc = $auth_provider_oauth_token_account_assoc;
$this->service_providers = $service_providers;
$this->users_table = $users_table;
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext;
}
/**
* {@inheritdoc}
*/
public function init()
{
// This does not test whether or not the key and secret provided are valid.
foreach ($this->service_providers as $service_provider)
{
$credentials = $service_provider->get_service_credentials();
if (($credentials['key'] && !$credentials['secret']) || (!$credentials['key'] && $credentials['secret']))
{
return $this->user->lang['AUTH_PROVIDER_OAUTH_ERROR_ELEMENT_MISSING'];
}
}
return false;
}
/**
* {@inheritdoc}
*/
public function login($username, $password)
{
// Temporary workaround for only having one authentication provider available
if (!$this->request->is_set('oauth_service'))
{
$provider = new phpbb_auth_provider_db($this->db, $this->config, $this->request, $this->user, $this->phpbb_root_path, $this->php_ext);
return $provider->login($username, $password);
}
// Requst the name of the OAuth service
$service_name_original = $this->request->variable('oauth_service', '', false);
$service_name = 'auth.provider.oauth.service.' . strtolower($service_name_original);
if ($service_name_original === '' || !array_key_exists($service_name, $this->service_providers))
{
return array(
'status' => LOGIN_ERROR_EXTERNAL_AUTH,
'error_msg' => 'LOGIN_ERROR_OAUTH_SERVICE_DOES_NOT_EXIST',
'user_row' => array('user_id' => ANONYMOUS),
);
}
// Get the service credentials for the given service
$service_credentials = $this->service_providers[$service_name]->get_service_credentials();
$storage = new phpbb_auth_provider_oauth_token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
$query = 'mode=login&login=external&oauth_service=' . $service_name_original;
$service = $this->get_service($service_name_original, $storage, $service_credentials, $this->service_providers[$service_name]->get_auth_scope(), $query);
if ($this->request->is_set('code', phpbb_request_interface::GET))
{
$this->service_providers[$service_name]->set_external_service_provider($service);
$unique_id = $this->service_providers[$service_name]->perform_auth_login();
// Check to see if this provider is already assosciated with an account
$data = array(
'provider' => $service_name_original,
'oauth_provider_id' => $unique_id
);
$sql = 'SELECT user_id FROM ' . $this->auth_provider_oauth_token_account_assoc . '
WHERE ' . $this->db->sql_build_array('SELECT', $data);
$result = $this->db->sql_query($sql);
$row = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);
if (!$row)
{
// The user does not yet exist, ask to link or create profile
return array(
'status' => LOGIN_SUCCESS_LINK_PROFILE,
'error_msg' => 'LOGIN_OAUTH_ACCOUNT_NOT_LINKED',
'user_row' => array(),
'redirect_data' => array(
'auth_provider' => 'oauth',
'login_link_oauth_service' => $service_name_original,
),
);
}
// Retrieve the user's account
$sql = 'SELECT user_id, username, user_password, user_passchg, user_pass_convert, user_email, user_type, user_login_attempts
FROM ' . $this->users_table . '
WHERE user_id = ' . (int) $row['user_id'];
$result = $this->db->sql_query($sql);
$row = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);
if (!$row)
{
throw new Exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_ENTRY');
}
// Update token storage to store the user_id
$storage->set_user_id($row['user_id']);
// The user is now authenticated and can be logged in
return array(
'status' => LOGIN_SUCCESS,
'error_msg' => false,
'user_row' => $row,
);
}
else
{
$url = $service->getAuthorizationUri();
header('Location: ' . $url);
}
}
/**
* Returns the cached current_uri object or creates and caches it if it is
* not already created. In each case the query string is updated based on
* the $query parameter.
*
* @param string $service_name The name of the service
* @param string $query The query string of the current_uri
* used in redirects
* @return \OAuth\Common\Http\Uri\UriInterface
*/
protected function get_current_uri($service_name, $query)
{
if ($this->current_uri)
{
$this->current_uri->setQuery($query);
return $this->current_uri;
}
$uri_factory = new \OAuth\Common\Http\Uri\UriFactory();
$current_uri = $uri_factory->createFromSuperGlobalArray($this->request->get_super_global(phpbb_request_interface::SERVER));
$current_uri->setQuery($query);
$this->current_uri = $current_uri;
return $current_uri;
}
/**
* Returns a new service object
*
* @param string $service_name The name of the service
* @param phpbb_auth_oauth_token_storage $storage
* @param array $service_credentials {@see phpbb_auth_provider_oauth::get_service_credentials}
* @param array $scope The scope of the request against
* the api.
* @param string $query The query string of the
* current_uri used in redirection
* @return \OAuth\Common\Service\ServiceInterface
*/
protected function get_service($service_name, phpbb_auth_provider_oauth_token_storage $storage, array $service_credentials, array $scopes = array(), $query)
{
$current_uri = $this->get_current_uri($service_name, $query);
// Setup the credentials for the requests
$credentials = new Credentials(
$service_credentials['key'],
$service_credentials['secret'],
$current_uri->getAbsoluteUri()
);
$service_factory = new \OAuth\ServiceFactory();
$service = $service_factory->createService($service_name, $credentials, $storage, $scopes);
if (!$service)
{
throw new Exception('AUTH_PROVIDER_OAUTH_ERROR_SERVICE_NOT_CREATED');
}
return $service;
}
/**
* {@inheritdoc}
*/
public function get_login_data()
{
$login_data = array(
'TEMPLATE_FILE' => 'login_body_oauth.html',
'BLOCK_VAR_NAME' => 'oauth',
'BLOCK_VARS' => array(),
);
foreach ($this->service_providers as $service_name => $service_provider)
{
// Only include data if the credentials are set
$credentials = $service_provider->get_service_credentials();
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;
$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)],
);
}
}
return $login_data;
}
/**
* {@inheritdoc}
*/
public function acp()
{
$ret = array();
foreach ($this->service_providers as $service_name => $service_provider)
{
$actual_name = str_replace('auth.provider.oauth.service.', '', $service_name);
$ret[] = 'auth_oauth_' . $actual_name . '_key';
$ret[] = 'auth_oauth_' . $actual_name . '_secret';
}
return $ret;
}
/**
* {@inheritdoc}
*/
public function get_acp_template($new_config)
{
$ret = array(
'BLOCK_VAR_NAME' => 'oauth_services',
'BLOCK_VARS' => array(),
'TEMPLATE_FILE' => 'auth_provider_oauth.html',
'TEMPLATE_VARS' => array(),
);
foreach ($this->service_providers as $service_name => $service_provider)
{
$actual_name = str_replace('auth.provider.oauth.service.', '', $service_name);
$ret['BLOCK_VARS'][$actual_name] = array(
'ACTUAL_NAME' => $this->user->lang['AUTH_PROVIDER_OAUTH_SERVICE_' . strtoupper($actual_name)],
'KEY' => $new_config['auth_oauth_' . $actual_name . '_key'],
'NAME' => $actual_name,
'SECRET' => $new_config['auth_oauth_' . $actual_name . '_secret'],
);
}
return $ret;
}
/**
* {@inheritdoc}
*/
public function login_link_has_necessary_data($login_link_data)
{
if (empty($login_link_data))
{
return 'LOGIN_LINK_NO_DATA_PROVIDED';
}
if (!array_key_exists('oauth_service', $login_link_data) || !$login_link_data['oauth_service'] ||
!array_key_exists('link_method', $login_link_data) || !$login_link_data['link_method'])
{
return 'LOGIN_LINK_MISSING_DATA';
}
return null;
}
/**
* {@inheritdoc}
*/
public function link_account(array $link_data)
{
// Check for a valid link method (auth_link or login_link)
if (!array_key_exists('link_method', $link_data) ||
!in_array($link_data['link_method'], array(
'auth_link',
'login_link',
)))
{
return 'LOGIN_LINK_MISSING_DATA';
}
// We must have an oauth_service listed, check for it two ways
if (!array_key_exists('oauth_service', $link_data) || !$link_data['oauth_service'])
{
$link_data['oauth_service'] = $this->request->variable('oauth_service', '');
if (!$link_data['oauth_service'])
{
return 'LOGIN_LINK_MISSING_DATA';
}
}
$service_name = 'auth.provider.oauth.service.' . strtolower($link_data['oauth_service']);
if (!array_key_exists($service_name, $this->service_providers))
{
return 'LOGIN_ERROR_OAUTH_SERVICE_DOES_NOT_EXIST';
}
switch ($link_data['link_method'])
{
case 'auth_link':
return $this->link_account_auth_link($link_data, $service_name);
case 'login_link':
return $this->link_account_login_link($link_data, $service_name);
}
}
/**
* Performs the account linking for login_link
*
* @param array $link_data The same variable given to {@see phpbb_auth_provider_interface::link_account}
* @param string $service_name The name of the service being used in
* linking.
* @return string|null Returns a language constant (string) if an error is
* encountered, or null on success.
*/
protected function link_account_login_link(array $link_data, $service_name)
{
$storage = new phpbb_auth_provider_oauth_token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
// Check for an access token, they should have one
if (!$storage->has_access_token_by_session($service_name))
{
return 'LOGIN_LINK_ERROR_OAUTH_NO_ACCESS_TOKEN';
}
// Prepare the query string
$query = 'mode=login_link&login_link_oauth_service=' . strtolower($link_data['oauth_service']);
// Prepare for an authentication request
$service_credentials = $this->service_providers[$service_name]->get_service_credentials();
$scopes = $this->service_providers[$service_name]->get_auth_scope();
$service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $scopes, $query);
$this->service_providers[$service_name]->set_external_service_provider($service);
// The user has already authenticated successfully, request to authenticate again
$unique_id = $this->service_providers[$service_name]->perform_token_auth();
// Insert into table, they will be able to log in after this
$data = array(
'user_id' => $link_data['user_id'],
'provider' => strtolower($link_data['oauth_service']),
'oauth_provider_id' => $unique_id,
);
$this->link_account_perform_link($data);
// Update token storage to store the user_id
$storage->set_user_id($link_data['user_id']);
}
/**
* Performs the account linking for auth_link
*
* @param array $link_data The same variable given to {@see phpbb_auth_provider_interface::link_account}
* @param string $service_name The name of the service being used in
* linking.
* @return string|null Returns a language constant (string) if an error is
* encountered, or null on success.
*/
protected function link_account_auth_link(array $link_data, $service_name)
{
$storage = new phpbb_auth_provider_oauth_token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
$query = 'i=ucp_auth_link&mode=auth_link&link=1&oauth_service=' . strtolower($link_data['oauth_service']);
$service_credentials = $this->service_providers[$service_name]->get_service_credentials();
$scopes = $this->service_providers[$service_name]->get_auth_scope();
$service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $scopes, $query);
if ($this->request->is_set('code', phpbb_request_interface::GET))
{
$this->service_providers[$service_name]->set_external_service_provider($service);
$unique_id = $this->service_providers[$service_name]->perform_auth_login();
// Insert into table, they will be able to log in after this
$data = array(
'user_id' => $this->user->data['user_id'],
'provider' => strtolower($link_data['oauth_service']),
'oauth_provider_id' => $unique_id,
);
$this->link_account_perform_link($data);
}
else
{
$url = $service->getAuthorizationUri();
header('Location: ' . $url);
}
}
/**
* Performs the query that inserts an account link
*
* @param array $data This array is passed to db->sql_build_array
*/
protected function link_account_perform_link(array $data)
{
$sql = 'INSERT INTO ' . $this->auth_provider_oauth_token_account_assoc . '
' . $this->db->sql_build_array('INSERT', $data);
$this->db->sql_query($sql);
}
/**
* {@inheritdoc}
*/
public function logout($data, $new_session)
{
// Clear all tokens belonging to the user
$storage = new phpbb_auth_provider_oauth_token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
$storage->clearAllTokens();
return;
}
/**
* {@inheritdoc}
*/
public function get_auth_link_data()
{
$block_vars = array();
// Get all external accounts tied to the current user
$data = array(
'user_id' => (int) $this->user->data['user_id'],
);
$sql = 'SELECT oauth_provider_id, provider FROM ' . $this->auth_provider_oauth_token_account_assoc . '
WHERE ' . $this->db->sql_build_array('SELECT', $data);
$result = $this->db->sql_query($sql);
$rows = $this->db->sql_fetchrowset($result);
$this->db->sql_freeresult($result);
$oauth_user_ids = array();
if ($rows !== false && sizeof($rows))
{
foreach ($rows as $row)
{
$oauth_user_ids[$row['provider']] = $row['oauth_provider_id'];
}
}
unset($rows);
foreach ($this->service_providers as $service_name => $service_provider)
{
// Only include data if the credentials are set
$credentials = $service_provider->get_service_credentials();
if ($credentials['key'] && $credentials['secret'])
{
$actual_name = str_replace('auth.provider.oauth.service.', '', $service_name);
$block_vars[$service_name] = array(
'HIDDEN_FIELDS' => array(
'link' => (!isset($oauth_user_ids[$actual_name])),
'oauth_service' => $actual_name,
),
'SERVICE_NAME' => $this->user->lang['AUTH_PROVIDER_OAUTH_SERVICE_' . strtoupper($actual_name)],
'UNIQUE_ID' => (isset($oauth_user_ids[$actual_name])) ? $oauth_user_ids[$actual_name] : null,
);
}
}
return array(
'BLOCK_VAR_NAME' => 'oauth',
'BLOCK_VARS' => $block_vars,
'TEMPLATE_FILE' => 'ucp_auth_link_oauth.html',
);
}
/**
* {@inheritdoc}
*/
public function unlink_account(array $link_data)
{
if (!array_key_exists('oauth_service', $link_data) || !$link_data['oauth_service'])
{
return 'LOGIN_LINK_MISSING_DATA';
}
// Remove the link
$sql = 'DELETE FROM ' . $this->auth_provider_oauth_token_account_assoc . "
WHERE provider = '" . $this->db->sql_escape($link_data['oauth_service']) . "'
AND user_id = " . (int) $this->user->data['user_id'];
$this->db->sql_query($sql);
// Clear all tokens belonging to the user on this servce
$service_name = 'auth.provider.oauth.service.' . strtolower($link_data['oauth_service']);
$storage = new phpbb_auth_provider_oauth_token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
$storage->clearToken($service_name);
return;
}
}

View file

@ -0,0 +1,55 @@
<?php
/**
*
* @package auth
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Base OAuth abstract class that all OAuth services should implement
*
* @package auth
*/
abstract class phpbb_auth_provider_oauth_service_base implements phpbb_auth_provider_oauth_service_interface
{
/**
* External OAuth service provider
*
* @var \OAuth\Common\Service\ServiceInterface
*/
protected $service_provider;
/**
* {@inheritdoc}
*/
public function get_external_service_provider()
{
return $this->service_provider;
}
/**
* {@inheritdoc}
*/
public function get_auth_scope()
{
return array();
}
/**
* {@inheritdoc}
*/
public function set_external_service_provider(\OAuth\Common\Service\ServiceInterface $service_provider)
{
$this->service_provider = $service_provider;
}
}

View file

@ -0,0 +1,98 @@
<?php
/**
*
* @package auth
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Bitly OAuth service
*
* @package auth
*/
class phpbb_auth_provider_oauth_service_bitly extends phpbb_auth_provider_oauth_service_base
{
/**
* phpBB config
*
* @var phpbb_config
*/
protected $config;
/**
* phpBB request
*
* @var phpbb_request
*/
protected $request;
/**
* Constructor
*
* @param phpbb_config $config
* @param phpbb_request $request
*/
public function __construct(phpbb_config $config, phpbb_request $request)
{
$this->config = $config;
$this->request = $request;
}
/**
* {@inheritdoc}
*/
public function get_service_credentials()
{
return array(
'key' => $this->config['auth_oauth_bitly_key'],
'secret' => $this->config['auth_oauth_bitly_secret'],
);
}
/**
* {@inheritdoc}
*/
public function perform_auth_login()
{
if (!($this->service_provider instanceof \OAuth\OAuth2\Service\Bitly))
{
throw new phpbb_auth_provider_oauth_service_exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE');
}
// This was a callback request from bitly, get the token
$this->service_provider->requestAccessToken($this->request->variable('code', ''));
// Send a request with it
$result = json_decode($this->service_provider->request('user/info'), true);
// Return the unique identifier returned from bitly
return $result['data']['login'];
}
/**
* {@inheritdoc}
*/
public function perform_token_auth()
{
if (!($this->service_provider instanceof \OAuth\OAuth2\Service\Bitly))
{
throw new phpbb_auth_provider_oauth_service_exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE');
}
// Send a request with it
$result = json_decode($this->service_provider->request('user/info'), true);
// Return the unique identifier returned from bitly
return $result['data']['login'];
}
}

View file

@ -0,0 +1,25 @@
<?php
/**
*
* @package auth
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* OAuth service exception class
*
* @package auth
*/
class phpbb_auth_provider_oauth_service_exception extends RuntimeException
{
}

View file

@ -0,0 +1,98 @@
<?php
/**
*
* @package auth
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Facebook OAuth service
*
* @package auth
*/
class phpbb_auth_provider_oauth_service_facebook extends phpbb_auth_provider_oauth_service_base
{
/**
* phpBB config
*
* @var phpbb_config
*/
protected $config;
/**
* phpBB request
*
* @var phpbb_request
*/
protected $request;
/**
* Constructor
*
* @param phpbb_config $config
* @param phpbb_request $request
*/
public function __construct(phpbb_config $config, phpbb_request $request)
{
$this->config = $config;
$this->request = $request;
}
/**
* {@inheritdoc}
*/
public function get_service_credentials()
{
return array(
'key' => $this->config['auth_oauth_facebook_key'],
'secret' => $this->config['auth_oauth_facebook_secret'],
);
}
/**
* {@inheritdoc}
*/
public function perform_auth_login()
{
if (!($this->service_provider instanceof \OAuth\OAuth2\Service\Facebook))
{
throw new phpbb_auth_provider_oauth_service_exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE');
}
// This was a callback request, get the token
$this->service_provider->requestAccessToken($this->request->variable('code', ''));
// Send a request with it
$result = json_decode($this->service_provider->request('/me'), true);
// Return the unique identifier
return $result['id'];
}
/**
* {@inheritdoc}
*/
public function perform_token_auth()
{
if (!($this->service_provider instanceof \OAuth\OAuth2\Service\Facebook))
{
throw new phpbb_auth_provider_oauth_service_exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE');
}
// Send a request with it
$result = json_decode($this->service_provider->request('/me'), true);
// Return the unique identifier
return $result['id'];
}
}

View file

@ -0,0 +1,109 @@
<?php
/**
*
* @package auth
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Google OAuth service
*
* @package auth
*/
class phpbb_auth_provider_oauth_service_google extends phpbb_auth_provider_oauth_service_base
{
/**
* phpBB config
*
* @var phpbb_config
*/
protected $config;
/**
* phpBB request
*
* @var phpbb_request
*/
protected $request;
/**
* Constructor
*
* @param phpbb_config $config
* @param phpbb_request $request
*/
public function __construct(phpbb_config $config, phpbb_request $request)
{
$this->config = $config;
$this->request = $request;
}
/**
* {@inheritdoc}
*/
public function get_auth_scope()
{
return array(
'userinfo_email',
'userinfo_profile',
);
}
/**
* {@inheritdoc}
*/
public function get_service_credentials()
{
return array(
'key' => $this->config['auth_oauth_google_key'],
'secret' => $this->config['auth_oauth_google_secret'],
);
}
/**
* {@inheritdoc}
*/
public function perform_auth_login()
{
if (!($this->service_provider instanceof \OAuth\OAuth2\Service\Google))
{
throw new phpbb_auth_provider_oauth_service_exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE');
}
// This was a callback request, get the token
$this->service_provider->requestAccessToken($this->request->variable('code', ''));
// Send a request with it
$result = json_decode($this->service_provider->request('https://www.googleapis.com/oauth2/v1/userinfo'), true);
// Return the unique identifier
return $result['id'];
}
/**
* {@inheritdoc}
*/
public function perform_token_auth()
{
if (!($this->service_provider instanceof \OAuth\OAuth2\Service\Google))
{
throw new phpbb_auth_provider_oauth_service_exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE');
}
// Send a request with it
$result = json_decode($this->service_provider->request('https://www.googleapis.com/oauth2/v1/userinfo'), true);
// Return the unique identifier
return $result['id'];
}
}

View file

@ -0,0 +1,77 @@
<?php
/**
*
* @package auth
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* OAuth service interface
*
* @package auth
*/
interface phpbb_auth_provider_oauth_service_interface
{
/**
* Returns an array of the scopes necessary for auth
*
* @return array An array of the required scopes
*/
public function get_auth_scope();
/**
* Returns the external library service provider once it has been set
*
* @param \OAuth\Common\Service\ServiceInterface|null
*/
public function get_external_service_provider();
/**
* Returns an array containing the service credentials belonging to requested
* service.
*
* @return array An array containing the 'key' and the 'secret' of the
* service in the form:
* array(
* 'key' => string
* 'secret' => string
* )
*/
public function get_service_credentials();
/**
* Returns the results of the authentication in json format
*
* @throws phpbb_auth_provider_oauth_service_exception
* @return string The unique identifier returned by the service provider
* that is used to authenticate the user with phpBB.
*/
public function perform_auth_login();
/**
* Returns the results of the authentication in json format
* Use this function when the user already has an access token
*
* @throws phpbb_auth_provider_oauth_service_exception
* @return string The unique identifier returned by the service provider
* that is used to authenticate the user with phpBB.
*/
public function perform_token_auth();
/**
* Sets the external library service provider
*
* @param \OAuth\Common\Service\ServiceInterface $service
*/
public function set_external_service_provider(\OAuth\Common\Service\ServiceInterface $service_provider);
}

View file

@ -0,0 +1,366 @@
<?php
/**
*
* @package auth
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
use OAuth\OAuth1\Token\StdOAuth1Token;
use OAuth\Common\Token\TokenInterface;
use OAuth\Common\Storage\TokenStorageInterface;
use OAuth\Common\Storage\Exception\StorageException;
use OAuth\Common\Storage\Exception\TokenNotFoundException;
/**
* OAuth storage wrapper for phpbb's cache
*
* @package auth
*/
class phpbb_auth_provider_oauth_token_storage implements TokenStorageInterface
{
/**
* Cache driver.
*
* @var phpbb_db_driver
*/
protected $db;
/**
* phpBB user
*
* @var phpbb_user
*/
protected $user;
/**
* OAuth token table
*
* @var string
*/
protected $auth_provider_oauth_table;
/**
* @var object|TokenInterface
*/
protected $cachedToken;
/**
* Creates token storage for phpBB.
*
* @param phpbb_db_driver $db
* @param phpbb_user $user
* @param string $auth_provider_oauth_table
*/
public function __construct(phpbb_db_driver $db, phpbb_user $user, $auth_provider_oauth_table)
{
$this->db = $db;
$this->user = $user;
$this->auth_provider_oauth_table = $auth_provider_oauth_table;
}
/**
* {@inheritdoc}
*/
public function retrieveAccessToken($service)
{
$service = $this->get_service_name_for_db($service);
if ($this->cachedToken instanceOf TokenInterface)
{
return $this->cachedToken;
}
$data = array(
'user_id' => (int) $this->user->data['user_id'],
'provider' => $service,
);
if ((int) $this->user->data['user_id'] === ANONYMOUS)
{
$data['session_id'] = $this->user->data['session_id'];
}
return $this->_retrieve_access_token($data);
}
/**
* {@inheritdoc}
*/
public function storeAccessToken($service, TokenInterface $token)
{
$service = $this->get_service_name_for_db($service);
$this->cachedToken = $token;
$data = array(
'user_id' => (int) $this->user->data['user_id'],
'provider' => $service,
'oauth_token' => $this->json_encode_token($token),
'session_id' => $this->user->data['session_id'],
);
$sql = 'INSERT INTO ' . $this->auth_provider_oauth_table . '
' . $this->db->sql_build_array('INSERT', $data);
$this->db->sql_query($sql);
}
/**
* {@inheritdoc}
*/
public function hasAccessToken($service)
{
$service = $this->get_service_name_for_db($service);
if ($this->cachedToken) {
return true;
}
$data = array(
'user_id' => (int) $this->user->data['user_id'],
'provider' => $service,
);
if ((int) $this->user->data['user_id'] === ANONYMOUS)
{
$data['session_id'] = $this->user->data['session_id'];
}
return $this->_has_acess_token($data);
}
/**
* {@inheritdoc}
*/
public function clearToken($service)
{
$service = $this->get_service_name_for_db($service);
$this->cachedToken = null;
$sql = 'DELETE FROM ' . $this->auth_provider_oauth_table . '
WHERE user_id = ' . (int) $this->user->data['user_id'] . "
AND provider = '" . $this->db->sql_escape($service) . "'";
if ((int) $this->user->data['user_id'] === ANONYMOUS)
{
$sql .= " AND session_id = '" . $this->db->sql_escape($this->user->data['session_id']) . "'";
}
$this->db->sql_query($sql);
}
/**
* {@inheritdoc}
*/
public function clearAllTokens()
{
$this->cachedToken = null;
$sql = 'DELETE FROM ' . $this->auth_provider_oauth_table . '
WHERE user_id = ' . (int) $this->user->data['user_id'];
if ((int) $this->user->data['user_id'] === ANONYMOUS)
{
$sql .= " AND session_id = '" . $this->db->sql_escape($this->user->data['session_id']) . "'";
}
$this->db->sql_query($sql);
}
/**
* Updates the user_id field in the database assosciated with the token
*
* @param int $user_id
*/
public function set_user_id($user_id)
{
if (!$this->cachedToken)
{
return;
}
$sql = 'UPDATE ' . $this->auth_provider_oauth_table . '
SET ' . $this->db->sql_build_array('UPDATE', array(
'user_id' => (int) $user_id
)) . '
WHERE user_id = ' . (int) $this->user->data['user_id'] . "
AND session_id = '" . $this->db->sql_escape($this->user->data['session_id']) . "'";
$this->db->sql_query($sql);
}
/**
* Checks to see if an access token exists solely by the session_id of the user
*
* @return bool true if they have token, false if they don't
*/
public function has_access_token_by_session($service)
{
$service = $this->get_service_name_for_db($service);
if ($this->cachedToken)
{
return true;
}
$data = array(
'session_id' => $this->user->data['session_id'],
'provider' => $service,
);
return $this->_has_acess_token($data);
}
/**
* A helper function that performs the query for has access token functions
*
* @param array $data
* @return bool
*/
protected function _has_acess_token($data)
{
return (bool) $this->get_access_token_row($data);
}
public function retrieve_access_token_by_session($service)
{
$service = $this->get_service_name_for_db($service);
if ($this->cachedToken instanceOf TokenInterface) {
return $this->cachedToken;
}
$data = array(
'session_id' => $this->user->data['session_id'],
'provider' => $service,
);
return $this->_retrieve_access_token($data);
}
/**
* A helper function that performs the query for retrieve access token functions
* Also checks if the token is a valid token
*
* @param array $data
* @return mixed
*/
protected function _retrieve_access_token($data)
{
$row = $this->get_access_token_row($data);
if (!$row)
{
throw new TokenNotFoundException('AUTH_PROVIDER_OAUTH_TOKEN_ERROR_NOT_STORED');
}
$token = $this->json_decode_token($row['oauth_token']);
// Ensure that the token was serialized/unserialized correctly
if (!($token instanceof TokenInterface))
{
$this->clearToken();
throw new TokenNotFoundException('AUTH_PROVIDER_OAUTH_TOKEN_ERROR_INCORRECTLY_STORED');
}
$this->cachedToken = $token;
return $token;
}
/**
* A helper function that performs the query for retrieving an access token
*
* @param array $data
* @return mixed
*/
protected function get_access_token_row($data)
{
$sql = 'SELECT oauth_token FROM ' . $this->auth_provider_oauth_table . '
WHERE ' . $this->db->sql_build_array('SELECT', $data);
$result = $this->db->sql_query($sql);
$row = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);
return $row;
}
public function json_encode_token(TokenInterface $token)
{
$members = array(
'accessToken' => $token->getAccessToken(),
'endOfLife' => $token->getEndOfLife(),
'extraParams' => $token->getExtraParams(),
'refreshToken' => $token->getRefreshToken(),
'token_class' => get_class($token),
);
// Handle additional data needed for OAuth1 tokens
if ($token instanceof StdOAuth1Token)
{
$members['requestToken'] = $token->getRequestToken();
$members['requestTokenSecret'] = $token->getRequestTokenSecret();
$members['accessTokenSecret'] = $token->getAccessTokenSecret();
}
return json_encode($members);
}
public function json_decode_token($json)
{
$token_data = json_decode($json, true);
if ($token_data === null)
{
throw new TokenNotFoundException('AUTH_PROVIDER_OAUTH_TOKEN_ERROR_INCORRECTLY_STORED');
}
$token_class = $token_data['token_class'];
$access_token = $token_data['accessToken'];
$refresh_token = $token_data['refreshToken'];
$endOfLife = $token_data['endOfLife'];
$extra_params = $token_data['extraParams'];
// Create the token
$token = new $token_class($access_token, $refresh_token, TokenInterface::EOL_NEVER_EXPIRES, $extra_params);
$token->setEndOfLife($endOfLife);
// Handle OAuth 1.0 specific elements
if ($token instanceof StdOAuth1Token)
{
$token->setRequestToken($token_data['requestToken']);
$token->setRequestTokenSecret($token_data['requestTokenSecret']);
$token->setAccessTokenSecret($token_data['accessTokenSecret']);
}
return $token;
}
/**
* Returns the name of the service as it must be stored in the database.
*
* @param string $service The name of the OAuth service
* @return string The name of the OAuth service as it needs to be stored
* in the database.
*/
protected function get_service_name_for_db($service)
{
// Enforce the naming convention for oauth services
if (strpos($service, 'auth.provider.oauth.service.') !== 0)
{
$service = 'auth.provider.oauth.service.' . strtolower($service);
}
return $service;
}
}

View file

@ -35,6 +35,12 @@ class phpbb_controller_helper
*/
protected $user;
/**
* config object
* @var phpbb_config
*/
protected $config;
/**
* phpBB root path
* @var string
@ -55,10 +61,11 @@ class phpbb_controller_helper
* @param string $phpbb_root_path phpBB root path
* @param string $php_ext PHP extension
*/
public function __construct(phpbb_template $template, phpbb_user $user, $phpbb_root_path, $php_ext)
public function __construct(phpbb_template $template, phpbb_user $user, phpbb_config $config, $phpbb_root_path, $php_ext)
{
$this->template = $template;
$this->user = $user;
$this->config = $config;
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext;
}
@ -102,22 +109,14 @@ class phpbb_controller_helper
$route = substr($route, 0, $route_delim);
}
if (is_array($params) && !empty($params))
// If enable_mod_rewrite is false, we need to include app.php
$route_prefix = $this->phpbb_root_path;
if (empty($this->config['enable_mod_rewrite']))
{
$params = array_merge(array(
'controller' => $route,
), $params);
}
else if (is_string($params) && $params)
{
$params = 'controller=' . $route . (($is_amp) ? '&amp;' : '&') . $params;
}
else
{
$params = array('controller' => $route);
$route_prefix .= 'app.' . $this->php_ext . '/';
}
return append_sid($this->phpbb_root_path . 'app.' . $this->php_ext . $route_params, $params, $is_amp, $session_id);
return append_sid($route_prefix . "$route" . $route_params, $params, $is_amp, $session_id);
}
/**

View file

@ -38,23 +38,23 @@ class phpbb_controller_resolver implements ControllerResolverInterface
protected $container;
/**
* phpbb_style object
* @var phpbb_style
* phpbb_template object
* @var phpbb_template
*/
protected $style;
protected $template;
/**
* Construct method
*
* @param phpbb_user $user User Object
* @param ContainerInterface $container ContainerInterface object
* @param phpbb_style $style
* @param phpbb_template $template
*/
public function __construct(phpbb_user $user, ContainerInterface $container, phpbb_style $style = null)
public function __construct(phpbb_user $user, ContainerInterface $container, phpbb_template $template = null)
{
$this->user = $user;
$this->container = $container;
$this->style = $style;
$this->template = $template;
}
/**
@ -96,13 +96,13 @@ class phpbb_controller_resolver implements ControllerResolverInterface
$controller_dir = explode('_', get_class($controller_object));
// 0 phpbb, 1 ext, 2 vendor, 3 extension name, ...
if (!is_null($this->style) && isset($controller_dir[3]) && $controller_dir[1] === 'ext')
if (!is_null($this->template) && isset($controller_dir[3]) && $controller_dir[1] === 'ext')
{
$controller_style_dir = 'ext/' . $controller_dir[2] . '/' . $controller_dir[3] . '/styles';
if (is_dir($controller_style_dir))
{
$this->style->set_style(array($controller_style_dir, 'styles'));
$this->template->set_style(array($controller_style_dir, 'styles'));
}
}

View file

@ -0,0 +1,65 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Prune notifications cron task.
*
* @package phpBB3
*/
class phpbb_cron_task_core_prune_notifications extends phpbb_cron_task_base
{
protected $config;
protected $notification_manager;
/**
* Constructor.
*
* @param phpbb_config $config The config
* @param phpbb_notification_manager $notification_manager Notification manager
*/
public function __construct(phpbb_config $config, phpbb_notification_manager $notification_manager)
{
$this->config = $config;
$this->notification_manager = $notification_manager;
}
/**
* {@inheritdoc}
*/
public function run()
{
// time minus expire days in seconds
$timestamp = time() - ($this->config['read_notification_expire_days'] * 60 * 60 * 24);
$this->notification_manager->prune_notifications($timestamp);
}
/**
* {@inheritdoc}
*/
public function is_runnable()
{
return (bool) $this->config['read_notification_expire_days'];
}
/**
* {@inheritdoc}
*/
public function should_run()
{
return $this->config['read_notification_last_gc'] < time() - $this->config['read_notification_gc'];
}
}

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_10 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.10', '>=');
return phpbb_version_compare($this->config['version'], '3.0.10', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_10_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.10-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.10-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_10_rc2 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.10-RC2', '>=');
return phpbb_version_compare($this->config['version'], '3.0.10-RC2', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_10_rc3 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.10-RC3', '>=');
return phpbb_version_compare($this->config['version'], '3.0.10-RC3', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_11 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.11', '>=');
return phpbb_version_compare($this->config['version'], '3.0.11', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_11_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.11-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.11-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_11_rc2 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.11-RC2', '>=');
return phpbb_version_compare($this->config['version'], '3.0.11-RC2', '>=');
}
static public function depends_on()

View file

@ -13,7 +13,7 @@ class phpbb_db_migration_data_30x_3_0_12_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.12-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.12-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_1_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.1-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.1-RC1', '>=');
}
public function update_schema()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_2 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.2', '>=');
return phpbb_version_compare($this->config['version'], '3.0.2', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_2_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.2-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.2-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_2_rc2 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.2-RC2', '>=');
return phpbb_version_compare($this->config['version'], '3.0.2-RC2', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_3 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.3', '>=');
return phpbb_version_compare($this->config['version'], '3.0.3', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_3_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.3-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.3-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_4 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.4', '>=');
return phpbb_version_compare($this->config['version'], '3.0.4', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_4_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.4-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.4-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_5 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.5', '>=');
return phpbb_version_compare($this->config['version'], '3.0.5', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_5_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.5-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.5-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_5_rc1part2 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.5-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.5-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_6 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.6', '>=');
return phpbb_version_compare($this->config['version'], '3.0.6', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_6_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.6-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.6-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_6_rc2 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.6-RC2', '>=');
return phpbb_version_compare($this->config['version'], '3.0.6-RC2', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_6_rc3 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.6-RC3', '>=');
return phpbb_version_compare($this->config['version'], '3.0.6-RC3', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_6_rc4 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.6-RC4', '>=');
return phpbb_version_compare($this->config['version'], '3.0.6-RC4', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_7 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.7', '>=');
return phpbb_version_compare($this->config['version'], '3.0.7', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_7_pl1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.7-pl1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.7-pl1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_7_rc1 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.7-RC1', '>=');
return phpbb_version_compare($this->config['version'], '3.0.7-RC1', '>=');
}
static public function depends_on()

View file

@ -11,7 +11,7 @@ class phpbb_db_migration_data_30x_3_0_7_rc2 extends phpbb_db_migration
{
public function effectively_installed()
{
return version_compare($this->config['version'], '3.0.7-RC2', '>=');
return phpbb_version_compare($this->config['version'], '3.0.7-RC2', '>=');
}
static public function depends_on()

Some files were not shown because too many files have changed in this diff Show more