diff options
Diffstat (limited to 'phpBB')
57 files changed, 791 insertions, 80 deletions
diff --git a/phpBB/adm/style/acp_icons.html b/phpBB/adm/style/acp_icons.html index 9117052d87..f18dad0ef6 100644 --- a/phpBB/adm/style/acp_icons.html +++ b/phpBB/adm/style/acp_icons.html @@ -7,7 +7,7 @@  	<script type="text/javascript" defer="defer">  	// <![CDATA[  	<!-- IF S_ADD_CODE --> -	 +  			var smiley = Array();  			<!-- BEGIN smile -->  				smiley['{smile.SMILEY_URL}'] = Array(); @@ -37,10 +37,10 @@  					}  				}  			} -		 +  	<!-- ENDIF --> -	 +  	function toggle_select(icon, display, select)  	{  		var disp = document.getElementById('order_disp_' + select); @@ -101,7 +101,7 @@  	<tbody>  	<!-- BEGIN items -->  		<tr> -	 +  		<td style="text-align: center;"><img src="{items.IMG_SRC}" alt="" title="" /><input type="hidden" name="image[{items.IMG}]" value="1" /></td>  		<td style="vertical-align: top;">[{items.IMG}]</td>  		<!-- IF S_SMILIES --> @@ -121,7 +121,7 @@  				<optgroup id="order_disp_{items.S_ROW_COUNT}" label="{L_DISPLAY_POSTING}" <!-- IF not items.POSTING_CHECKED -->disabled="disabled" class="disabled-options" <!-- ENDIF -->>{S_ORDER_LIST_DISPLAY}</optgroup>  				<optgroup id="order_no_disp_{items.S_ROW_COUNT}" label="{L_DISPLAY_POSTING_NO}" <!-- IF  items.POSTING_CHECKED -->disabled="disabled" class="disabled-options" <!-- ENDIF -->>{S_ORDER_LIST_UNDISPLAY}</optgroup>  			</select></td> -		<!-- ENDIF -->	 +		<!-- ENDIF -->  		<!-- IF S_ADD -->  			<td><input type="checkbox" class="radio" name="add_img[{items.IMG}]" value="1" /></td>  		<!-- ENDIF --> @@ -147,6 +147,8 @@  	</tr>  	<!-- ENDIF -->  	<!-- ELSE --> +	</thead> +	<tbody>  	<tr class="row3">  		<td colspan="{COLSPAN}">{L_NO_ICONS}</td>  	</tr> @@ -174,7 +176,7 @@  	<fieldset>  		<legend>{L_IMPORT}</legend> -	 +  	<!-- IF not S_PAK_OPTIONS -->  		<p>{L_NO_PAK_OPTIONS}</p> @@ -259,7 +261,7 @@  	</table>  	<div class="pagination">  	<!-- IF .pagination --> -		<!-- INCLUDE pagination.html -->	 +		<!-- INCLUDE pagination.html -->  	<!-- ENDIF -->  	</div>  	<p class="quick"> diff --git a/phpBB/develop/regex_idn.php b/phpBB/develop/regex_idn.php new file mode 100644 index 0000000000..d871695c50 --- /dev/null +++ b/phpBB/develop/regex_idn.php @@ -0,0 +1,151 @@ +<?php +// +// Security message: +// +// This script is potentially dangerous. +// Remove or comment the next line (die(".... ) to enable this script. +// Do NOT FORGET to either remove this script or disable it after you have used it. +// +die("Please read the first lines of this script for instructions on how to enable it"); + +// IP regular expressions + +$dec_octet = '(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])'; +$h16 = '[\dA-F]{1,4}'; +$ipv4 = "(?:$dec_octet\.){3}$dec_octet"; +$ls32 = "(?:$h16:$h16|$ipv4)"; + +$ipv6_construct = array( +	array(false,	'',		'{6}',	$ls32), +	array(false,	'::',	'{0,5}', "(?:$h16(?::$h16)?|$ipv4)"), +	array('',		':',	'{4}',	$ls32), +	array('{1,2}',	':',	'{3}',	$ls32), +	array('{1,3}',	':',	'{2}',	$ls32), +	array('{1,4}',	':',	'',		$ls32), +	array('{1,5}',	':',	false,	$ls32), +	array('{1,6}',	':',	false,	$h16), +	array('{1,7}',	':',	false,	''), +	array(false, '::', false, '') +); + +$ipv6 = '(?:'; +foreach ($ipv6_construct as $ip_type) +{ +	$ipv6 .= '(?:'; +	if ($ip_type[0] !== false) +	{ +		$ipv6 .= "(?:$h16:)" . $ip_type[0]; +	} +	$ipv6 .= $ip_type[1]; +	if ($ip_type[2] !== false) +	{ +		$ipv6 .= "(?:$h16:)" . $ip_type[2]; +	} +	$ipv6 .= $ip_type[3] . ')|'; +} +$ipv6 = substr($ipv6, 0, -1) . ')'; + +echo 'IPv4: ' . $ipv4 . "<br /><br />\n\nIPv6: " . $ipv6 . "<br /><br />\n\n"; + +// URL regular expressions + +/* IDN2008 characters derivation +** http://unicode.org/faq/idn.html#33	- IDN FAQ: derivation of valid characters in terms of Unicode properties +** http://unicode.org/reports/tr46/		- Unicode Technical Standard #46. Unicode IDNA Compatibility Processing +** http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt	- Unicode Character Database +*/ +/* +** Remove Control Characters and Whitespace (as in IDNA2003) +*/ +$no_cc = '\p{C}\p{Z}'; +/* +** Remove Symbols, Punctuation, non-decimal Numbers, and Enclosing Marks +*/ +$no_symbol = '\p{S}\p{P}\p{Nl}\p{No}\p{Me}'; +/* +** Remove characters used for archaic Hangul (Korean) - \p{HST=L} and \p{HST=V} +** as per http://unicode.org/Public/UNIDATA/HangulSyllableType.txt +*/ +$no_hangul = '\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}'; +/* +** Remove three blocks of technical or archaic symbols. +*/ +$no_cdm = '\x{20D0}-\x{20FF}';						// \p{block=Combining_Diacritical_Marks_For_Symbols} +$no_musical = '\x{1D100}-\x{1D1FF}';					// \p{block=Musical_Symbols} +$no_ancient_greek_musical = '\x{1D200}-\x{1D24F}';	// \p{block=Ancient_Greek_Musical_Notation}	 +/* Remove certain exceptions: +** U+0640 ARABIC TATWEEL +** U+07FA NKO LAJANYALAN +** U+302E HANGUL SINGLE DOT TONE MARK +** U+302F HANGUL DOUBLE DOT TONE MARK +** U+3031 VERTICAL KANA REPEAT MARK +** U+3032 VERTICAL KANA REPEAT WITH VOICED SOUND MARK +** .. +** U+3035 VERTICAL KANA REPEAT MARK LOWER HALF +** U+303B VERTICAL IDEOGRAPHIC ITERATION MARK +*/ +$no_certain_exceptions = '\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}'; +/* Add certain exceptions: +** U+00B7 MIDDLE DOT +** U+0375 GREEK LOWER NUMERAL SIGN +** U+05F3 HEBREW PUNCTUATION GERESH +** U+05F4 HEBREW PUNCTUATION GERSHAYIM +** U+30FB KATAKANA MIDDLE DOT +** U+002D HYPHEN-MINUS +** U+06FD ARABIC SIGN SINDHI AMPERSAND +** U+06FE ARABIC SIGN SINDHI POSTPOSITION MEN +** U+0F0B TIBETAN MARK INTERSYLLABIC TSHEG +** U+3007 IDEOGRAPHIC NUMBER ZERO +*/ +$add_certain_exceptions = '\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}'; +/* Add special exceptions (Deviations): +** U+00DF LATIN SMALL LETTER SHARP S +** U+03C2 GREEK SMALL LETTER FINAL SIGMA +** U+200C ZERO WIDTH NON-JOINER +** U+200D ZERO WIDTH JOINER +*/ +$add_deviations = '\x{00DF}\x{03C2}\x{200C}\x{200D}'; + +// Concatenate remove/add regexes respectively +$remove_chars = "$no_cc$no_symbol$no_hangul$no_cdm$no_musical$no_ancient_greek_musical$no_certain_exceptions"; +$add_chars = "$add_certain_exceptions$add_deviations"; + +// Initialize inline mode +$inline = false; + +do +{ +	$inline = !$inline; + +	$pct_encoded = "%[\dA-F]{2}"; +	$unreserved = "$add_chars\pL0-9\-._~"; +	$sub_delims = ($inline) ? '!$&\'(*+,;=' : '!$&\'()*+,;='; +	$scheme = ($inline) ? '[a-z][a-z\d+]*': '[a-z][a-z\d+\-.]*' ; // avoid automatic parsing of "word" in "last word.http://..." +	$pchar = "(?:[^$remove_chars]*[$unreserved$sub_delims:@|]+|$pct_encoded)"; // rfc: no "|" + +	$reg_name = "(?:[^$remove_chars]*[$unreserved$sub_delims:@|]+|$pct_encoded)+"; // rfc: * instead of + and no "|" and no "@" and no ":" (included instead of userinfo) +	//$userinfo = "(?:(?:[$unreserved$sub_delims:]+|$pct_encoded))*"; +	$ipv4_simple = '[0-9.]+'; +	$ipv6_simple = '\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\]'; +	$host = "(?:$reg_name|$ipv4_simple|$ipv6_simple)"; +	$port = '\d*'; +	//$authority = "(?:$userinfo@)?$host(?::$port)?"; +	$authority = "$host(?::$port)?"; +	$segment = "$pchar*"; +	$path_abempty = "(?:/$segment)*"; +	$hier_part = "/{2}$authority$path_abempty"; +	$query = "(?:[^$remove_chars]*[$unreserved$sub_delims:@/?|]+|$pct_encoded)*"; // pchar | "/" | "?", rfc: no "|" +	$fragment = $query; + +	$url =  "$scheme:$hier_part(?:\?$query)?(?:\#$fragment)?"; +	echo (($inline) ? 'URL inline: ' : 'URL: ') . $url . "<br /><br />\n\n"; + +	// no scheme, shortened authority, but host has to start with www. +	$www_url =  "www\.$reg_name(?::$port)?$path_abempty(?:\?$query)?(?:\#$fragment)?"; +	echo (($inline) ? 'www.URL_inline: ' : 'www.URL: ') . $www_url . "<br /><br />\n\n"; + +	// no schema and no authority +	$relative_url = "$segment$path_abempty(?:\?$query)?(?:\#$fragment)?"; +	echo (($inline) ? 'relative URL inline: ' : 'relative URL: ') . $relative_url . "<br /><br />\n\n"; +} +while ($inline); diff --git a/phpBB/docs/FAQ.html b/phpBB/docs/FAQ.html index d9ba651032..cd1ec4ae14 100644 --- a/phpBB/docs/FAQ.html +++ b/phpBB/docs/FAQ.html @@ -243,7 +243,7 @@ I want to sue you because i think you host an illegal board!</h2>  		<div class="content"> -<p>Please read the paragraph about permissions in our extensive <a href="https://www.phpbb.com/support/documentation/3.0/">online documentation</a>.</p> +<p>Please read the paragraph about permissions in our extensive <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">online documentation</a>.</p>  		</div> @@ -299,7 +299,7 @@ I want to sue you because i think you host an illegal board!</h2>  		<div class="content"> -<p>Please read our <a href="https://www.phpbb.com/support/documentation/3.0/">extensive user documentation</a> first, it may just explain what you want to know.</p> +<p>Please read our <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">extensive user documentation</a> first, it may just explain what you want to know.</p>  <p>Feel free to search our community forum for the information you require. <strong>PLEASE DO NOT</strong> post your question without having first used search, chances are someone has already asked and answered your question. You can find our board here:</p> diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html index 80e09f1bf9..534d9eff73 100644 --- a/phpBB/docs/INSTALL.html +++ b/phpBB/docs/INSTALL.html @@ -39,7 +39,7 @@  <p>This document will walk you through the basics on installing, updating and converting the forum software.</p> -<p>A basic overview of running phpBB can be found in the accompanying <a href="README.html">README</a> file. Please ensure you read that document in addition to this! For more detailed information on using, installing, updating and converting phpBB you should read <a href="https://www.phpbb.com/support/documentation/3.0/">the documentation</a> available online.</p> +<p>A basic overview of running phpBB can be found in the accompanying <a href="README.html">README</a> file. Please ensure you read that document in addition to this! For more detailed information on using, installing, updating and converting phpBB you should read <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">the documentation</a> available online.</p>  <h1>Install</h1> diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html index 77d5d33115..b66f47178e 100644 --- a/phpBB/docs/README.html +++ b/phpBB/docs/README.html @@ -134,7 +134,7 @@  	<p>Installation of these packages is straightforward: simply download the required language pack, uncompress (unzip) it and via FTP transfer the included <code>language</code> and <code>styles</code> folders to the root of your board installation. The language can then be installed via the Administration Control Panel of your board: <code>Customise tab -> Language management -> Language packs</code>. A more detailed description of the process is in the Knowledge Base article, <a href="https://www.phpbb.com/kb/article/how-to-install-a-language-pack/">How to Install a Language Pack</a>.</p> -	<p>If your language is not available, please visit our <a href="https://www.phpbb.com/community/viewforum.php?f=66">[3.0.x] Translations</a> forum where you will find topics on translations in progress. Should you wish to volunteer to translate a language not currently available or assist in maintaining an existing language pack, you can <a href="https://www.phpbb.com/languages/apply.php">Apply to become a translator</a>.</p> +	<p>If your language is not available, please visit our <a href="https://www.phpbb.com/community/viewforum.php?f=491">[3.1.x] Translations</a> forum where you will find topics on translations in progress. Should you wish to volunteer to translate a language not currently available or assist in maintaining an existing language pack, you can <a href="https://www.phpbb.com/languages/apply.php">Apply to become a translator</a>.</p>  	<a name="styles"></a><h3>2.ii. Styles</h3> @@ -150,7 +150,7 @@  	<a name="extensions"></a><h3>2.iii. Extensions</h3> -	<p>We are proud to have a thriving extensions community. These third party extensions to the standard phpBB software, extend its capabilities still further. You can browse through many of the extensions in the <a href="https://www.phpbb.com/customise/db/extensions-27/">Extensions</a> section of our <a href="https://www.phpbb.com/customise/db/">Customisation Database</a>.</p> +	<p>We are proud to have a thriving extensions community. These third party extensions to the standard phpBB software, extend its capabilities still further. You can browse through many of the extensions in the <a href="https://www.phpbb.com/customise/db/extensions-36">Extensions</a> section of our <a href="https://www.phpbb.com/customise/db/">Customisation Database</a>.</p>  	<p>For more information about extensions, please see: <a href="https://www.phpbb.com/extensions">https://www.phpbb.com/extensions</a></p> @@ -180,7 +180,7 @@  	<p>Comprehensive documentation is now available on the phpBB website:</p> -	<p><a href="https://www.phpbb.com/support/documentation/3.0/">https://www.phpbb.com/support/documentation/3.0/</a></p> +	<p><a href="https://www.phpbb.com/support/docs/en/3.1/ug/">https://www.phpbb.com/support/docs/en/3.1/ug/</a></p>  	<p>This covers everything from installation to setting permissions and managing users.</p> diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index 7863814daa..3ab3fc65da 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -456,6 +456,46 @@ mcp_ban_unban_before  * Since: 3.1.0-RC3  * Purpose: Add additional fields to the unban form in MCP +mcp_front_latest_logs_after +=== +* Locations: +    + styles/prosilver/template/mcp_front.html +    + styles/subsilver2/template/mcp_front.html +* Since: 3.1.3-RC1 +* Purpose: Add content after latest logs list + +mcp_front_latest_logs_before +=== +* Locations: +    + styles/prosilver/template/mcp_front.html +    + styles/subsilver2/template/mcp_front.html +* Since: 3.1.3-RC1 +* Purpose: Add content before latest logs list + +mcp_front_latest_reported_before +=== +* Locations: +    + styles/prosilver/template/mcp_front.html +    + styles/subsilver2/template/mcp_front.html +* Since: 3.1.3-RC1 +* Purpose: Add content before latest reported posts list + +mcp_front_latest_reported_pms_before +=== +* Locations: +    + styles/prosilver/template/mcp_front.html +    + styles/subsilver2/template/mcp_front.html +* Since: 3.1.3-RC1 +* Purpose: Add content before latest reported private messages list + +mcp_front_latest_unapproved_before +=== +* Locations: +    + styles/prosilver/template/mcp_front.html +    + styles/subsilver2/template/mcp_front.html +* Since: 3.1.3-RC1 +* Purpose: Add content before latest unapproved posts list +  memberlist_body_username_append  ===  * Locations: @@ -635,6 +675,14 @@ overall_footer_after  * Since: 3.1.0-a1  * Purpose: Add content at the end of the file, directly prior to the `</body>` tag +overall_footer_body_after +=== +* Locations: +    + styles/prosilver/template/overall_footer.html +    + styles/subsilver2/template/overall_footer.html +* Since: 3.1.3-RC1 +* Purpose: Add content before the `</body>` tag but after the $SCRIPTS var, i.e. after the js scripts have been loaded +  overall_footer_breadcrumb_append  ===  * Locations: @@ -1407,6 +1455,22 @@ viewtopic_body_poll_question_prepend  * Since: 3.1.0-b3  * Purpose: Add content directly before the poll question on the View topic screen +viewtopic_body_post_author_after +=== +* Locations: +    + styles/prosilver/template/viewtopic_body.html +    + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.3-RC1 +* Purpose: Add content directly after the post author on the view topic screen + +viewtopic_body_post_author_before +=== +* Locations: +    + styles/prosilver/template/viewtopic_body.html +    + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.3-RC1 +* Purpose: Add content directly before the post author on the view topic screen +  viewtopic_body_post_buttons_after  ===  * Locations: diff --git a/phpBB/includes/acp/acp_email.php b/phpBB/includes/acp/acp_email.php index 4fefd6bec3..fcc2bd7641 100644 --- a/phpBB/includes/acp/acp_email.php +++ b/phpBB/includes/acp/acp_email.php @@ -40,6 +40,7 @@ class acp_email  		$error = array();  		$usernames	= request_var('usernames', '', true); +		$usernames	= (!empty($usernames)) ? explode("\n", $usernames) : array();  		$group_id	= request_var('g', 0);  		$subject	= utf8_normalize_nfc(request_var('subject', '', true));  		$message	= utf8_normalize_nfc(request_var('message', '', true)); @@ -69,7 +70,7 @@ class acp_email  			if (!sizeof($error))  			{ -				if ($usernames) +				if (!empty($usernames))  				{  					// If giving usernames the admin is able to email inactive users too...  					$sql_ary = array( @@ -77,7 +78,7 @@ class acp_email  						'FROM'		=> array(  							USERS_TABLE		=> '',  						), -						'WHERE'		=> $db->sql_in_set('username_clean', array_map('utf8_clean_string', explode("\n", $usernames))) . ' +						'WHERE'		=> $db->sql_in_set('username_clean', array_map('utf8_clean_string', $usernames)) . '  							AND user_allow_massemail = 1',  						'ORDER_BY'	=> 'user_lang, user_notify_type',  					); @@ -194,6 +195,39 @@ class acp_email  				$errored = false; +				$email_template = 'admin_send_email'; +				$template_data = array( +					'CONTACT_EMAIL' => phpbb_get_board_contact($config, $phpEx), +					'MESSAGE'		=> htmlspecialchars_decode($message), +				); +				$generate_log_entry = true; + +				/** +				* Modify email template data before the emails are sent +				* +				* @event core.acp_email_send_before +				* @var	string	email_template		The template to be used for sending the email +				* @var	string	subject				The subject of the email +				* @var	array	template_data		Array with template data assigned to email template +				* @var	bool	generate_log_entry	If false, no log entry will be created +				* @var	array	usernames			Usernames which will be displayed in log entry, if it will be created +				* @var	int		group_id			The group this email will be sent to +				* @var	bool	use_queue			If true, email queue will be used for sending +				* @var	int		priority			Priority of sent emails +				* @since 3.1.3-RC1 +				*/ +				$vars = array( +					'email_template', +					'subject', +					'template_data', +					'generate_log_entry', +					'usernames', +					'group_id', +					'use_queue', +					'priority', +				); +				extract($phpbb_dispatcher->trigger_event('core.acp_email_send_before', compact($vars))); +  				for ($i = 0, $size = sizeof($email_list); $i < $size; $i++)  				{  					$used_lang = $email_list[$i][0]['lang']; @@ -207,17 +241,14 @@ class acp_email  						$messenger->im($email_row['jabber'], $email_row['name']);  					} -					$messenger->template('admin_send_email', $used_lang); +					$messenger->template($email_template, $used_lang);  					$messenger->anti_abuse_headers($config, $user);  					$messenger->subject(htmlspecialchars_decode($subject));  					$messenger->set_mail_priority($priority); -					$messenger->assign_vars(array( -						'CONTACT_EMAIL' => phpbb_get_board_contact($config, $phpEx), -						'MESSAGE'		=> htmlspecialchars_decode($message)) -					); +					$messenger->assign_vars($template_data);  					if (!($messenger->send($used_method)))  					{ @@ -228,24 +259,26 @@ class acp_email  				$messenger->save_queue(); -				if ($usernames) -				{ -					$usernames = explode("\n", $usernames); -					add_log('admin', 'LOG_MASS_EMAIL', implode(', ', utf8_normalize_nfc($usernames))); -				} -				else +				if ($generate_log_entry)  				{ -					if ($group_id) +					if (!empty($usernames))  					{ -						$group_name = get_group_name($group_id); +						add_log('admin', 'LOG_MASS_EMAIL', implode(', ', utf8_normalize_nfc($usernames)));  					}  					else  					{ -						// Not great but the logging routine doesn't cope well with localising on the fly -						$group_name = $user->lang['ALL_USERS']; -					} +						if ($group_id) +						{ +							$group_name = get_group_name($group_id); +						} +						else +						{ +							// Not great but the logging routine doesn't cope well with localising on the fly +							$group_name = $user->lang['ALL_USERS']; +						} -					add_log('admin', 'LOG_MASS_EMAIL', $group_name); +						add_log('admin', 'LOG_MASS_EMAIL', $group_name); +					}  				}  				if (!$errored) @@ -286,7 +319,7 @@ class acp_email  			'WARNING_MSG'			=> (sizeof($error)) ? implode('<br />', $error) : '',  			'U_ACTION'				=> $this->u_action,  			'S_GROUP_OPTIONS'		=> $select_list, -			'USERNAMES'				=> $usernames, +			'USERNAMES'				=> implode("\n", $usernames),  			'U_FIND_USERNAME'		=> append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=acp_email&field=usernames'),  			'SUBJECT'				=> $subject,  			'MESSAGE'				=> $message, diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 31b033604d..881e50dd5a 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -173,6 +173,21 @@ class acp_users  				$delete_type	= request_var('delete_type', '');  				$ip				= request_var('ip', 'ip'); +				/** +				 * Run code at beginning of ACP users overview +				 * +				 * @event core.acp_users_overview_before +				 * @var	array   user_row    Current user data +				 * @var	string  mode        Active module +				 * @var	string  action      Module that should be run +				 * @var	bool    submit      Do we display the form only +				 *                          or did the user press submit +				 * @var	array   error       Array holding error messages +				 * @since 3.1.3-RC1 +				 */ +				$vars = array('user_row', 'mode', 'action', 'submit', 'error'); +				extract($phpbb_dispatcher->trigger_event('core.acp_users_overview_before', compact($vars))); +  				if ($submit)  				{  					if ($delete) diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php index 3460db4882..5f6dcde448 100644 --- a/phpBB/includes/bbcode.php +++ b/phpBB/includes/bbcode.php @@ -129,7 +129,7 @@ class bbcode  	*/  	function bbcode_cache_init()  	{ -		global $phpbb_root_path, $phpEx, $config, $user, $phpbb_extension_manager, $phpbb_path_helper; +		global $phpbb_root_path, $phpEx, $config, $user, $phpbb_dispatcher, $phpbb_extension_manager, $phpbb_path_helper;  		if (empty($this->template_filename))  		{ @@ -388,6 +388,26 @@ class bbcode  				break;  			}  		} + +		$bbcode_cache = $this->bbcode_cache; +		$bbcode_bitfield = $this->bbcode_bitfield; +		$bbcode_uid = $this->bbcode_uid; + +		/** +		* Use this event to modify the bbcode_cache +		* +		* @event core.bbcode_cache_init_end +		* @var	array	bbcode_cache		The array of cached search and replace patterns of bbcodes +		* @var	string	bbcode_bitfield		The bbcode bitfield +		* @var	string	bbcode_uid			The bbcode uid +		* @since 3.1.3-RC1 +		*/ +		$vars = array('bbcode_cache', 'bbcode_bitfield', 'bbcode_uid'); +		extract($phpbb_dispatcher->trigger_event('core.bbcode_cache_init_end', compact($vars))); + +		$this->bbcode_cache = $bbcode_cache; +		$this->bbcode_bitfield = $bbcode_bitfield; +		$this->bbcode_uid = $bbcode_uid;  	}  	/** diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 1a3560dbb1..321394639b 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -2922,6 +2922,19 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa  			break;  		} + +		/** +		 * This event allows an extension to process when a user fails a login attempt +		 * +		 * @event core.login_box_failed +		 * @var array   result      Login result data +		 * @var string  username    User name used to login +		 * @var string  password    Password used to login +		 * @var string  err         Error message +		 * @since 3.1.3-RC1 +		 */ +		$vars = array('result', 'username', 'password', 'err'); +		extract($phpbb_dispatcher->trigger_event('core.login_box_failed', compact($vars)));  	}  	// Assign credential for username/password pair @@ -3327,23 +3340,33 @@ function get_preg_expression($mode)  		break;  		case 'url': +			// generated with regex_idn.php file in the develop folder +			return "[a-z][a-z\d+\-.]*:/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?"; +		break; +  		case 'url_inline': -			$inline = ($mode == 'url') ? ')' : ''; -			$scheme = ($mode == 'url') ? '[a-z\d+\-.]' : '[a-z\d+]'; // avoid automatic parsing of "word" in "last word.http://..." -			// generated with regex generation file in the develop folder -			return "[a-z]$scheme*:/{2}(?:(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?"; +			// generated with regex_idn.php file in the develop folder +			return "[a-z][a-z\d+]*:/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?";  		break;  		case 'www_url': +			// generated with regex_idn.php file in the develop folder +			return "www\.(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})+(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?"; +		break; +  		case 'www_url_inline': -			$inline = ($mode == 'www_url') ? ')' : ''; -			return "www\.(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})+(?::\d*)?(?:/(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?"; +			// generated with regex_idn.php file in the develop folder +			return "www\.(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})+(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?";  		break;  		case 'relative_url': +			// generated with regex_idn.php file in the develop folder +			return "(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?"; +		break; +  		case 'relative_url_inline': -			$inline = ($mode == 'relative_url') ? ')' : ''; -			return "(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})*(?:/(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?"; +			// generated with regex_idn.php file in the develop folder +			return "(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})*(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?";  		break;  		case 'table_prefix': diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php index 0b9ea23fe7..b016659541 100644 --- a/phpBB/includes/functions_admin.php +++ b/phpBB/includes/functions_admin.php @@ -2311,7 +2311,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,  */  function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync = true)  { -	global $db; +	global $db, $phpbb_dispatcher;  	if (!is_array($forum_id))  	{ @@ -2351,6 +2351,21 @@ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync  		$sql_and .= ' AND topic_status = ' . ITEM_MOVED . " AND topic_last_post_time < $prune_date";  	} +	/** +	* Use this event to modify the SQL that selects topics to be pruned +	* +	* @event core.prune_sql +	* @var string	forum_id		The forum id +	* @var string	prune_mode		The prune mode +	* @var string	prune_date		The prune date +	* @var int		prune_flags		The prune flags +	* @var bool		auto_sync		Whether or not to perform auto sync +	* @var string	sql_and			SQL text appended to where clause +	* @since 3.1.3-RC1 +	*/ +	$vars = array('forum_id', 'prune_mode', 'prune_date', 'prune_flags', 'auto_sync', 'sql_and'); +	extract($phpbb_dispatcher->trigger_event('core.prune_sql', compact($vars))); +  	$sql = 'SELECT topic_id  		FROM ' . TOPICS_TABLE . '  		WHERE ' . $db->sql_in_set('forum_id', $forum_id) . " diff --git a/phpBB/includes/functions_convert.php b/phpBB/includes/functions_convert.php index 9d480692e9..61ab4721c4 100644 --- a/phpBB/includes/functions_convert.php +++ b/phpBB/includes/functions_convert.php @@ -2148,6 +2148,7 @@ function fix_empty_primary_groups()  	}  	$sql = 'SELECT user_id FROM ' . USER_GROUP_TABLE . ' WHERE group_id = ' . get_group_id('global_moderators'); +	$result = $db->sql_query($sql);  	$user_ids = array();  	while ($row = $db->sql_fetchrow($result)) diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index af44f6270e..22ade15b48 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -1825,6 +1825,30 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		break;  	} +	/** +	* Modify sql query data for post submitting +	* +	* @event core.submit_post_modify_sql_data +	* @var	array	data				Array with the data for the post +	* @var	array	poll				Array with the poll data for the post +	* @var	string	post_mode			Variable containing posting mode value +	* @var	bool	sql_data			Array with the data for the posting SQL query +	* @var	string	subject				Variable containing post subject value +	* @var	int		topic_type			Variable containing topic type value +	* @var	string	username			Variable containing post author name +	* @since 3.1.3-RC1 +	*/ +	$vars = array( +		'data', +		'poll', +		'post_mode', +		'sql_data', +		'subject', +		'topic_type', +		'username', +	); +	extract($phpbb_dispatcher->trigger_event('core.submit_post_modify_sql_data', compact($vars))); +  	// Submit new topic  	if ($post_mode == 'post')  	{ diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php index 12ef94c07a..04a2726d22 100644 --- a/phpBB/includes/message_parser.php +++ b/phpBB/includes/message_parser.php @@ -313,7 +313,7 @@ class bbcode_firstpass extends bbcode  		$in = str_replace(' ', '%20', $in);  		// Checking urls -		if (!preg_match('#^' . get_preg_expression('url') . '$#i', $in) && !preg_match('#^' . get_preg_expression('www_url') . '$#iu', $in)) +		if (!preg_match('#^' . get_preg_expression('url') . '$#iu', $in) && !preg_match('#^' . get_preg_expression('www_url') . '$#iu', $in))  		{  			return '[img]' . $in . '[/img]';  		} @@ -1172,13 +1172,18 @@ class parse_message extends bbcode_firstpass  		* @var bool		update_this_message		Do we alter the parsed message  		* @var string	mode					Posting mode  		* @var string	message					The message text to parse +		* @var string	bbcode_bitfield			The bbcode_bitfield before parsing +		* @var string	bbcode_uid				The bbcode_uid before parsing  		* @var bool		return					Do we return after the event is triggered if $warn_msg is not empty  		* @var array	warn_msg				Array of the warning messages  		* @since 3.1.2-RC1 +		* @change 3.1.3-RC1 Added vars $bbcode_bitfield and $bbcode_uid  		*/  		$message = $this->message;  		$warn_msg = $this->warn_msg;  		$return = false; +		$bbcode_bitfield = $this->bbcode_bitfield; +		$bbcode_uid = $this->bbcode_uid;  		$vars = array(  			'allow_bbcode',  			'allow_magic_url', @@ -1190,12 +1195,16 @@ class parse_message extends bbcode_firstpass  			'update_this_message',  			'mode',  			'message', +			'bbcode_bitfield', +			'bbcode_uid',  			'return',  			'warn_msg',  		);  		extract($phpbb_dispatcher->trigger_event('core.message_parser_check_message', compact($vars)));  		$this->message = $message;  		$this->warn_msg = $warn_msg; +		$this->bbcode_bitfield = $bbcode_bitfield; +		$this->bbcode_uid = $bbcode_uid;  		if ($return && !empty($this->warn_msg))  		{  			return (!$update_this_message) ? $return_message : $this->warn_msg; diff --git a/phpBB/install/install_convert.php b/phpBB/install/install_convert.php index 17161b5eae..6a892a7373 100644 --- a/phpBB/install/install_convert.php +++ b/phpBB/install/install_convert.php @@ -2014,7 +2014,7 @@ class install_convert extends module  					{  						$value = $fields[1][$firstkey];  					} -					else if (is_array($fields[2])) +					else if (is_array($fields[2]) && !is_callable($fields[2]))  					{  						// Execute complex function/eval/typecast  						$value = $fields[1]; diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index 103262b516..3bcf5c4f94 100644 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -2083,7 +2083,7 @@ class install_install extends module  		return array(  			'language'		=> basename(request_var('language', '')),  			'dbms'			=> request_var('dbms', ''), -			'dbhost'		=> request_var('dbhost', ''), +			'dbhost'		=> request_var('dbhost', '', true),  			'dbport'		=> request_var('dbport', ''),  			'dbuser'		=> request_var('dbuser', ''),  			'dbpasswd'		=> request_var('dbpasswd', '', true), diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index ea51e5df76..7efbd3166c 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -805,7 +805,7 @@ INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_len  INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_aol', 'profilefields.type.string', 'phpbb_aol', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 5, 1, '', '');  INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_icq', 'profilefields.type.string', 'phpbb_icq', '20', '3', '15', '', '', '[0-9]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 6, 1, 'SEND_ICQ_MESSAGE', 'https://www.icq.com/people/%s/');  INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_wlm', 'profilefields.type.string', 'phpbb_wlm', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 7, 1, '', ''); -INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_yahoo', 'profilefields.type.string', 'phpbb_yahoo', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 8, 1, 'SEND_YIM_MESSAGE', 'http://edit.yahoo.com/config/send_webmesg?.target=%s&.src=pg'); +INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_yahoo', 'profilefields.type.string', 'phpbb_yahoo', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 8, 1, 'SEND_YIM_MESSAGE', 'ymsgr:sendim?%s');  INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_facebook', 'profilefields.type.string', 'phpbb_facebook', '20', '5', '50', '', '', '[\w.]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 9, 1, 'VIEW_FACEBOOK_PROFILE', 'http://facebook.com/%s/');  INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_twitter', 'profilefields.type.string', 'phpbb_twitter', '20', '1', '15', '', '', '[\w_]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 10, 1, 'VIEW_TWITTER_PROFILE', 'http://twitter.com/%s');  INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_skype', 'profilefields.type.string', 'phpbb_skype', '20', '6', '32', '', '', '[a-zA-Z][\w\.,\-_]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 11, 1, 'VIEW_SKYPE_PROFILE', 'skype:%s?userinfo'); diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php index 91fc1215fc..fdbc4aebd0 100644 --- a/phpBB/language/en/acp/common.php +++ b/phpBB/language/en/acp/common.php @@ -558,6 +558,7 @@ $lang = array_merge($lang, array(  	'LOG_LOCK_POST'				=> '<strong>Locked post</strong><br />» %s',  	'LOG_MERGE'					=> '<strong>Merged posts</strong> into topic<br />» %s',  	'LOG_MOVE'					=> '<strong>Moved topic</strong><br />» from %1$s to %2$s', +	'LOG_MOVED_TOPIC'			=> '<strong>Moved topic</strong><br />» %s',  	'LOG_PM_REPORT_CLOSED'		=> '<strong>Closed PM report</strong><br />» %s',  	'LOG_PM_REPORT_DELETED'		=> '<strong>Deleted PM report</strong><br />» %s',  	'LOG_POST_APPROVED'			=> '<strong>Approved post</strong><br />» %s', diff --git a/phpBB/language/en/acp/permissions.php b/phpBB/language/en/acp/permissions.php index 8654a9e88c..1ade2d6eb8 100644 --- a/phpBB/language/en/acp/permissions.php +++ b/phpBB/language/en/acp/permissions.php @@ -54,7 +54,7 @@ $lang = array_merge($lang, array(  		<br /> -		<p>For further information on setting up and managing permissions on your phpBB3 board, please see <a href="https://www.phpbb.com/support/documentation/3.0/quickstart/quick_permissions.html">Chapter 1.5 of our Quick Start Guide</a>.</p> +		<p>For further information on setting up and managing permissions on your phpBB3 board, please see the section on <a href="https://www.phpbb.com/support/docs/en/3.1/ug/quickstart/permissions/">Setting permissions of our Quick Start Guide</a>.</p>  	',  	'ACL_NEVER'				=> 'Never', diff --git a/phpBB/language/en/acp/search.php b/phpBB/language/en/acp/search.php index 98412cb050..bda965b615 100644 --- a/phpBB/language/en/acp/search.php +++ b/phpBB/language/en/acp/search.php @@ -84,7 +84,7 @@ $lang = array_merge($lang, array(  	'FULLTEXT_SPHINX_WRONG_DATABASE'		=> 'The sphinx search for phpBB supports MySQL and PostgreSQL only.',  	'FULLTEXT_SPHINX_CONFIG_FILE'			=> 'Sphinx config file',  	'FULLTEXT_SPHINX_CONFIG_FILE_EXPLAIN'	=> 'The generated content of the sphinx config file. This data needs to be pasted into the sphinx.conf which is used by sphinx search daemon. Replace the [dbuser] and [dbpassword] placeholders with your database credentials.', -	'FULLTEXT_SPHINX_NO_CONFIG_DATA'		=> 'The sphinx data and config directory paths are not defined. Please define them to generate the config file.', +	'FULLTEXT_SPHINX_NO_CONFIG_DATA'		=> 'The sphinx data directory path is not defined. Please define the path and submit to generate the config file.',  	'GENERAL_SEARCH_SETTINGS'				=> 'General search settings',  	'GO_TO_SEARCH_INDEX'					=> 'Go to search index page', diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php index 107de9c64f..dd22e84fcb 100644 --- a/phpBB/language/en/install.php +++ b/phpBB/language/en/install.php @@ -80,7 +80,7 @@ $lang = array_merge($lang, array(  	'CONTINUE_OLD_CONVERSION'	=> 'Continue previously started conversion',  	'CONVERT'					=> 'Convert',  	'CONVERT_COMPLETE'			=> 'Conversion completed', -	'CONVERT_COMPLETE_EXPLAIN'	=> 'You have now successfully converted your board to phpBB 3.1. You can now login and <a href="../">access your board</a>. Please ensure that the settings were transferred correctly before enabling your board by deleting the install directory. Remember that help on using phpBB is available online via the <a href="https://www.phpbb.com/support/documentation/3.0/">Documentation</a> and the <a href="https://www.phpbb.com/community/viewforum.php?f=46">support forums</a>.', +	'CONVERT_COMPLETE_EXPLAIN'	=> 'You have now successfully converted your board to phpBB 3.1. You can now login and <a href="../">access your board</a>. Please ensure that the settings were transferred correctly before enabling your board by deleting the install directory. Remember that help on using phpBB is available online via the <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">Documentation</a> and the <a href="https://www.phpbb.com/community/viewforum.php?f=466">support forums</a>.',  	'CONVERT_INTRO'				=> 'Welcome to the phpBB Unified Convertor Framework',  	'CONVERT_INTRO_BODY'		=> 'From here, you are able to import data from other (installed) board systems. The list below shows all the conversion modules currently available. If there is no convertor shown in this list for the board software you wish to convert from, please check our website where further conversion modules may be available for download.',  	'CONVERT_NEW_CONVERSION'	=> 'New conversion', @@ -192,7 +192,7 @@ $lang = array_merge($lang, array(  		<h2>Convert an existing board to phpBB3</h2>  		<p>The phpBB Unified Convertor Framework supports the conversion of phpBB 2.0.x and other board systems to phpBB3. If you have an existing board that you wish to convert, please <a href="%2$s">proceed to the convertor</a>.</p>  		<h2>Go live with your phpBB3!</h2> -		<p>Clicking the button below will take you to a form for submitting statistical data to phpBB in your Administration Control Panel (ACP). We would appreciate it if you could help us by sending that information. Afterwards you should take some time to examine the options available to you. Remember that help is available online via the <a href="https://www.phpbb.com/support/documentation/3.0/">Documentation</a>, <a href="%3$s">README</a> and the <a href="https://www.phpbb.com/community/viewforum.php?f=46">Support Forums</a>.</p><p><strong>Please delete, move or rename the install directory before using your board. While this directory exists, only the Administration Control Panel (ACP) will be accessible.</strong>', +		<p>Clicking the button below will take you to a form for submitting statistical data to phpBB in your Administration Control Panel (ACP). We would appreciate it if you could help us by sending that information. Afterwards you should take some time to examine the options available to you. Remember that help is available online via the <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">Documentation</a>, <a href="%3$s">README</a> and the <a href="https://www.phpbb.com/community/viewforum.php?f=466">Support Forums</a>.</p><p><strong>Please delete, move or rename the install directory before using your board. While this directory exists, only the Administration Control Panel (ACP) will be accessible.</strong>',  	'INSTALL_INTRO'				=> 'Welcome to Installation',  	'INSTALL_INTRO_BODY'		=> 'With this option, it is possible to install phpBB3 onto your server.</p><p>In order to proceed, you will need your database settings. If you do not know your database settings, please contact your host and ask for them. You will not be able to continue without them. You need:</p> @@ -274,7 +274,7 @@ $lang = array_merge($lang, array(  	'MAKE_FOLDER_WRITABLE'		=> 'Please make sure that this folder exists and is writable by the webserver then try again:<br />»<strong>%s</strong>.',  	'MAKE_FOLDERS_WRITABLE'		=> 'Please make sure that these folders exist and are writable by the webserver then try again:<br />»<strong>%s</strong>.', -	'MYSQL_SCHEMA_UPDATE_REQUIRED'	=> 'Your MySQL database schema for phpBB is outdated. phpBB detected a schema for MySQL 3.x/4.x, but the server runs on MySQL %2$s.<br /><strong>Before you proceed the update, you need to upgrade the schema.</strong><br /><br />Please refer to the <a href="https://www.phpbb.com/kb/article/doesnt-have-a-default-value-errors/">Knowledge Base article about upgrading the MySQL schema</a>. If you encounter problems, please use <a href="https://www.phpbb.com/community/viewforum.php?f=46">our support forums</a>.', +	'MYSQL_SCHEMA_UPDATE_REQUIRED'	=> 'Your MySQL database schema for phpBB is outdated. phpBB detected a schema for MySQL 3.x/4.x, but the server runs on MySQL %2$s.<br /><strong>Before you proceed the update, you need to upgrade the schema.</strong><br /><br />Please refer to the <a href="https://www.phpbb.com/kb/article/doesnt-have-a-default-value-errors/">Knowledge Base article about upgrading the MySQL schema</a>. If you encounter problems, please use <a href="https://www.phpbb.com/community/viewforum.php?f=466">our support forums</a>.',  	'NAMING_CONFLICT'			=> 'Naming conflict: %s and %s are both aliases<br /><br />%s',  	'NEXT_STEP'					=> 'Proceed to next step', @@ -345,7 +345,7 @@ $lang = array_merge($lang, array(  	'SUB_LICENSE'				=> 'License',  	'SUB_SUPPORT'				=> 'Support',  	'SUCCESSFUL_CONNECT'		=> 'Successful connection', -	'SUPPORT_BODY'				=> 'Full support will be provided for the current stable release of phpBB3, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB3</li><li>converting from other discussion board software to phpBB3 (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=486">Convertors Forum</a>)</li></ul><p>We encourage users still running beta versions of phpBB3 to replace their installation with a fresh copy of the latest version.</p><h2>Extensions / Styles</h2><p>For issues relating to Extensions, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=451">Extensions Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=471">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/community/viewtopic.php?f=14&t=571070">The phpBB Welcome Package</a><br /><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/documentation/3.1/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, why not <a href="https://www.phpbb.com/support/">subscribe to our mailing list</a>?<br /><br />', +	'SUPPORT_BODY'				=> 'Full support will be provided for the current stable release of phpBB3, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB3</li><li>converting from other discussion board software to phpBB3 (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=486">Convertors Forum</a>)</li></ul><p>We encourage users still running beta versions of phpBB3 to replace their installation with a fresh copy of the latest version.</p><h2>Extensions / Styles</h2><p>For issues relating to Extensions, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=451">Extensions Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=471">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/community/viewtopic.php?f=14&t=571070">The phpBB Welcome Package</a><br /><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/docs/en/3.1/ug/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, why not <a href="https://www.phpbb.com/support/">subscribe to our mailing list</a>?<br /><br />',  	'SYNC_FORUMS'				=> 'Starting to synchronise forums',  	'SYNC_POST_COUNT'			=> 'Synchronising post_counts',  	'SYNC_POST_COUNT_ID'		=> 'Synchronising post_counts from <var>entry</var> %1$s to %2$s.', diff --git a/phpBB/language/en/search.php b/phpBB/language/en/search.php index ec5dd99eb8..13e5bf7a97 100644 --- a/phpBB/language/en/search.php +++ b/phpBB/language/en/search.php @@ -71,6 +71,7 @@ $lang = array_merge($lang, array(  	'NO_RECENT_SEARCHES'	=> 'No searches have been carried out recently.',  	'NO_SEARCH'				=> 'Sorry but you are not permitted to use the search system.',  	'NO_SEARCH_RESULTS'		=> 'No suitable matches were found.', +	'NO_SEARCH_LOAD'		=> 'Sorry but you cannot use search at this time. The server has high load. Please try again later.',  	'NO_SEARCH_TIME'		=> array(  		1	=> 'Sorry but you cannot use search at this time. Please try again in %d second.',  		2	=> 'Sorry but you cannot use search at this time. Please try again in %d seconds.', diff --git a/phpBB/mcp.php b/phpBB/mcp.php index 25765b1af7..f9d46db528 100644 --- a/phpBB/mcp.php +++ b/phpBB/mcp.php @@ -137,6 +137,28 @@ if ($forum_id && !$auth->acl_get('f_read', $forum_id))  	trigger_error('NOT_AUTHORISED');  } +/** +* Allow applying additional permissions to MCP access besides f_read +* +* @event core.mcp_global_f_read_auth_after +* @var	string		action			The action the user tried to execute +* @var	int			forum_id		The forum the user tried to access +* @var	string		mode			The MCP module the user is trying to access +* @var	p_master	module			Module system class +* @var	bool		quickmod		True if the user is accessing using quickmod tools +* @var	int			topic_id		The topic the user tried to access +* @since 3.1.3-RC1 +*/ +$vars = array( +	'action', +	'forum_id', +	'mode', +	'module', +	'quickmod', +	'topic_id', +); +extract($phpbb_dispatcher->trigger_event('core.mcp_global_f_read_auth_after', compact($vars))); +  if ($forum_id)  {  	$module->acl_forum_id = $forum_id; diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php index 5a5be6f761..e64dab635b 100644 --- a/phpBB/memberlist.php +++ b/phpBB/memberlist.php @@ -173,6 +173,22 @@ switch ($mode)  			'ORDER_BY'	=> 'u.username_clean ASC',  		); +		/** +		 * Modify the query used to get the users for the team page +		 * +		 * @event core.memberlist_team_modify_query +		 * @var array	sql_ary			Array containing the query +		 * @var array	group_ids		Array of group ids +		 * @var array	teampage_data	The teampage data +		 * @since 3.1.3-RC1 +		 */ +		$vars = array( +			'sql_ary', +			'group_ids', +			'teampage_data', +		); +		extract($phpbb_dispatcher->trigger_event('core.memberlist_team_modify_query', compact($vars))); +  		$result = $db->sql_query($db->sql_build_query('SELECT', $sql_ary));  		$user_ary = $user_ids = $group_users = array(); @@ -285,7 +301,7 @@ switch ($mode)  						$user_rank_data = phpbb_get_user_rank($row, (($row['user_id'] == ANONYMOUS) ? false : $row['user_posts'])); -						$template->assign_block_vars('group.user', array( +						$template_vars = array(  							'USER_ID'		=> $row['user_id'],  							'FORUMS'		=> $row['forums'],  							'FORUM_OPTIONS'	=> (isset($row['forums_options'])) ? true : false, @@ -304,7 +320,25 @@ switch ($mode)  							'USERNAME'			=> get_username_string('username', $row['user_id'], $row['username'], $row['user_colour']),  							'USER_COLOR'		=> get_username_string('colour', $row['user_id'], $row['username'], $row['user_colour']),  							'U_VIEW_PROFILE'	=> get_username_string('profile', $row['user_id'], $row['username'], $row['user_colour']), -						)); +						); + +						/** +						 * Modify the template vars for displaying the user in the groups on the teampage +						 * +						 * @event core.memberlist_team_modify_template_vars +						 * @var array	template_vars		Array containing the query +						 * @var array	row					Array containing the action user row +						 * @var array	groups_ary			Array of groups with all users that should be displayed +						 * @since 3.1.3-RC1 +						 */ +						$vars = array( +							'template_vars', +							'row', +							'groups_ary', +						); +						extract($phpbb_dispatcher->trigger_event('core.memberlist_team_modify_template_vars', compact($vars))); + +						$template->assign_block_vars('group.user', $template_vars);  						if ($config['teampage_memberships'] != 2)  						{ diff --git a/phpBB/phpbb/config/db.php b/phpBB/phpbb/config/db.php index ef20ebf62a..26489bdd34 100644 --- a/phpBB/phpbb/config/db.php +++ b/phpBB/phpbb/config/db.php @@ -145,9 +145,9 @@ class db extends \phpbb\config\config  			$sql .= " AND config_value = '" . $this->db->sql_escape($old_value) . "'";  		} -		$result = $this->db->sql_query($sql); +		$this->db->sql_query($sql); -		if (!$this->db->sql_affectedrows($result) && isset($this->config[$key])) +		if (!$this->db->sql_affectedrows() && isset($this->config[$key]))  		{  			return false;  		} diff --git a/phpBB/phpbb/db/migration/data/v31x/plupload_last_gc_dynamic.php b/phpBB/phpbb/db/migration/data/v31x/plupload_last_gc_dynamic.php new file mode 100644 index 0000000000..0783d707c5 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v31x/plupload_last_gc_dynamic.php @@ -0,0 +1,31 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v31x; + +class plupload_last_gc_dynamic extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v31x\v312'); +	} + +	public function update_data() +	{ +		return array( +			// Make plupload_last_gc dynamic. +			array('config.remove', array('plupload_last_gc')), +			array('config.add', array('plupload_last_gc', 0, 1)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v31x/profilefield_yahoo_update_url.php b/phpBB/phpbb/db/migration/data/v31x/profilefield_yahoo_update_url.php new file mode 100644 index 0000000000..4df9083bdf --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v31x/profilefield_yahoo_update_url.php @@ -0,0 +1,38 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v31x; + +class profilefield_yahoo_update_url extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v31x\v312'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'update_contact_url'))), +		); +	} + +	public function update_contact_url() +	{ +		$sql = 'UPDATE ' . $this->table_prefix . "profile_fields +			SET field_contact_url = 'ymsgr:sendim?%s' +			WHERE field_name = 'phpbb_yahoo' +				AND field_contact_url = 'http://edit.yahoo.com/config/send_webmesg?.target=%s&.src=pg'"; +		$this->sql_query($sql); +	} +} diff --git a/phpBB/phpbb/db/migration/tool/module.php b/phpBB/phpbb/db/migration/tool/module.php index db43046a95..035625b095 100644 --- a/phpBB/phpbb/db/migration/tool/module.php +++ b/phpBB/phpbb/db/migration/tool/module.php @@ -475,6 +475,7 @@ class module implements \phpbb\db\migration\tool\tool_interface  		if (!class_exists('acp_modules'))  		{  			include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext); +			$this->user->add_lang('acp/modules');  		}  		$acp_modules = new \acp_modules();  		$module = $acp_modules->get_module_infos($basename, $class, true); diff --git a/phpBB/phpbb/db/tools.php b/phpBB/phpbb/db/tools.php index c8d25f23a2..f523b39fb3 100644 --- a/phpBB/phpbb/db/tools.php +++ b/phpBB/phpbb/db/tools.php @@ -2175,7 +2175,7 @@ class tools  				}  			// no break  			case 'mysql_41': -				$statements[] = 'ALTER TABLE ' . $table_name . ' ADD INDEX ' . $index_name . '(' . implode(', ', $column) . ')'; +				$statements[] = 'ALTER TABLE ' . $table_name . ' ADD INDEX ' . $index_name . ' (' . implode(', ', $column) . ')';  			break;  			case 'mssql': diff --git a/phpBB/phpbb/error_collector.php b/phpBB/phpbb/error_collector.php index 7141f83174..bf8efd1065 100644 --- a/phpBB/phpbb/error_collector.php +++ b/phpBB/phpbb/error_collector.php @@ -16,15 +16,28 @@ namespace phpbb;  class error_collector  {  	var $errors; +	var $error_types; -	function __construct() +	/** +	 * Constructor. +	 * +	 * The variable $error_types may be set to a mask of PHP error types that +	 * the collector should keep, e.g. `E_ALL`. If unset, the current value of +	 * the error_reporting() function will be used to determine which errors +	 * the collector will keep. +	 * +	 * @see PHPBB3-13306 +	 * @param int|null $error_types +	 */ +	function __construct($error_types = null)  	{  		$this->errors = array(); +		$this->error_types = $error_types;  	}  	function install()  	{ -		set_error_handler(array(&$this, 'error_handler')); +		set_error_handler(array(&$this, 'error_handler'), ($this->error_types !== null) ? $this->error_types : error_reporting());  	}  	function uninstall() diff --git a/phpBB/phpbb/log/log.php b/phpBB/phpbb/log/log.php index 2af8b50b54..0c5205530b 100644 --- a/phpBB/phpbb/log/log.php +++ b/phpBB/phpbb/log/log.php @@ -708,6 +708,50 @@ class log implements \phpbb\log\log_interface  			}  		} +		/** +		* Allow modifying or execute extra final filter on log entries +		* +		* @event core.get_logs_after +		* @var	array	log			Array with all our log entries +		* @var	array	topic_id_list		Array of topic ids, for which we +		*									get the permission data +		* @var	array	reportee_id_list	Array of additional user IDs we +		*									get the username strings for +		* @var	string	mode		Mode of the entries we display +		* @var	bool	count_logs	Do we count all matching entries? +		* @var	int		limit		Limit the number of entries +		* @var	int		offset		Offset when fetching the entries +		* @var	mixed	forum_id	Limit entries to the forum_id, +		*							can also be an array of forum_ids +		* @var	int		topic_id	Limit entries to the topic_id +		* @var	int		user_id		Limit entries to the user_id +		* @var	int		log_time	Limit maximum age of log entries +		* @var	string	sort_by		SQL order option +		* @var	string	keywords	Will only return entries that have the +		*							keywords in log_operation or log_data +		* @var	string	profile_url	URL to the users profile +		* @var	int		log_type	The type of logs it was filtered +		* @since 3.1.3-RC1 +		*/ +		$vars = array( +			'log', +			'topic_id_list', +			'reportee_id_list', +			'mode', +			'count_logs', +			'limit', +			'offset', +			'forum_id', +			'topic_id', +			'user_id', +			'log_time', +			'sort_by', +			'keywords', +			'profile_url', +			'log_type', +		); +		extract($this->dispatcher->trigger_event('core.get_logs_after', compact($vars))); +  		return $log;  	} diff --git a/phpBB/phpbb/profilefields/type/type_url.php b/phpBB/phpbb/profilefields/type/type_url.php index bc8ac869d0..fe0bffd582 100644 --- a/phpBB/phpbb/profilefields/type/type_url.php +++ b/phpBB/phpbb/profilefields/type/type_url.php @@ -64,7 +64,7 @@ class type_url extends type_string  			return false;  		} -		if (!preg_match('#^' . get_preg_expression('url') . '$#i', $field_value)) +		if (!preg_match('#^' . get_preg_expression('url') . '$#iu', $field_value))  		{  			return $this->user->lang('FIELD_INVALID_URL', $this->get_field_name($field_data['lang_name']));  		} diff --git a/phpBB/phpbb/request/request.php b/phpBB/phpbb/request/request.php index f0f2f7e2a2..56ce3999ed 100644 --- a/phpBB/phpbb/request/request.php +++ b/phpBB/phpbb/request/request.php @@ -275,7 +275,7 @@ class request implements \phpbb\request\request_interface  	*/  	public function file($form_name)  	{ -		return $this->variable($form_name, array('name' => 'none'), false, \phpbb\request\request_interface::FILES); +		return $this->variable($form_name, array('name' => 'none'), true, \phpbb\request\request_interface::FILES);  	}  	/** diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php index 691d0d5bef..0a6a18ffbe 100644 --- a/phpBB/phpbb/session.php +++ b/phpBB/phpbb/session.php @@ -1082,7 +1082,7 @@ class session  	*/  	function check_ban($user_id = false, $user_ips = false, $user_email = false, $return = false)  	{ -		global $config, $db; +		global $config, $db, $phpbb_dispatcher;  		if (defined('IN_CHECK_BAN') || defined('SKIP_CHECK_BAN'))  		{ @@ -1196,6 +1196,20 @@ class session  		}  		$db->sql_freeresult($result); +		/** +		* Event to set custom ban type +		* +		* @event core.session_set_custom_ban +		* @var	bool		return				If $return is false this routine does not return on finding a banned user, it outputs a relevant message and stops execution +		* @var	bool		banned				Check if user already banned +		* @var	array|false	ban_row				Ban data +		* @var	string		ban_triggered_by	Method that caused ban, can be your custom method +		* @since 3.1.3-RC1 +		*/ +		$ban_row = isset($ban_row) ? $ban_row : false; +		$vars = array('return', 'banned', 'ban_row', 'ban_triggered_by'); +		extract($phpbb_dispatcher->trigger_event('core.session_set_custom_ban', compact($vars))); +  		if ($banned && !$return)  		{  			global $template, $phpbb_root_path, $phpEx; diff --git a/phpBB/phpbb/template/twig/twig.php b/phpBB/phpbb/template/twig/twig.php index 5b71bb5e8a..db3a8e3571 100644 --- a/phpBB/phpbb/template/twig/twig.php +++ b/phpBB/phpbb/template/twig/twig.php @@ -115,6 +115,11 @@ class twig extends \phpbb\template\base  			)  		); +		if (defined('DEBUG')) +		{ +			$this->twig->addExtension(new \Twig_Extension_Debug()); +		} +  		$lexer = new \phpbb\template\twig\lexer($this->twig);  		$this->twig->setLexer($lexer); diff --git a/phpBB/posting.php b/phpBB/posting.php index dda7455845..10c3b696e6 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -344,6 +344,48 @@ switch ($mode)  		}  	break;  } +/** +* This event allows you to do extra auth checks and verify if the user +* has the required permissions +* +* Extensions should only change the error and is_authed variables. +* +* @event core.modify_posting_auth +* @var	int		post_id		ID of the post +* @var	int		topic_id	ID of the topic +* @var	int		forum_id	ID of the forum +* @var	int		draft_id	ID of the draft +* @var	int		lastclick	Timestamp of when the form was last loaded +* @var	bool	submit		Whether or not the form has been submitted +* @var	bool	preview		Whether or not the post is being previewed +* @var	bool	save		Whether or not a draft is being saved +* @var	bool	load		Whether or not a draft is being loaded +* @var	bool	refresh		Whether or not to retain previously submitted data +* @var	string	mode		What action to take if the form has been submitted +*							post|reply|quote|edit|delete|bump|smilies|popup +* @var	array	error		Any error strings; a non-empty array aborts +*							form submission. +*							NOTE: Should be actual language strings, NOT +*							language keys. +* @var	bool	is_authed	Does the user have the required permissions? +* @since 3.1.3-RC1 +*/ +$vars = array( +	'post_id', +	'topic_id', +	'forum_id', +	'draft_id', +	'lastclick', +	'submit', +	'preview', +	'save', +	'load', +	'refresh', +	'mode', +	'error', +	'is_authed', +); +extract($phpbb_dispatcher->trigger_event('core.modify_posting_auth', compact($vars)));  if (!$is_authed)  { diff --git a/phpBB/report.php b/phpBB/report.php index 1b5d3c9d46..3ea6bb40c5 100644 --- a/phpBB/report.php +++ b/phpBB/report.php @@ -99,6 +99,24 @@ if ($post_id)  	// Check required permissions  	$acl_check_ary = array('f_list' => 'POST_NOT_EXIST', 'f_read' => 'USER_CANNOT_READ', 'f_report' => 'USER_CANNOT_REPORT'); +	/** +	* This event allows you to do extra auth checks and verify if the user +	* has the required permissions +	* +	* @event core.report_post_auth +	* @var	array	forum_data		All data available from the forums table on this post's forum +	* @var	array	report_data		All data available from the topics and the posts tables on this post (and its topic) +	* @var	array	acl_check_ary	An array with the ACL to be tested. The evaluation is made in the same order as the array is sorted +	*								The key is the ACL name and the value is the language key for the error message. +	* @since 3.1.3-RC1 +	*/ +	$vars = array( +		'forum_data', +		'report_data', +		'acl_check_ary', +	); +	extract($phpbb_dispatcher->trigger_event('core.report_post_auth', compact($vars))); +  	foreach ($acl_check_ary as $acl => $error)  	{  		if (!$auth->acl_get($acl, $forum_id)) diff --git a/phpBB/search.php b/phpBB/search.php index e80a89b382..164d834ff2 100644 --- a/phpBB/search.php +++ b/phpBB/search.php @@ -101,7 +101,7 @@ if (!$auth->acl_get('u_search') || !$auth->acl_getf_global('f_search') || !$conf  if ($user->load && $config['limit_search_load'] && ($user->load > doubleval($config['limit_search_load'])))  {  	$template->assign_var('S_NO_SEARCH', true); -	trigger_error('NO_SEARCH_TIME'); +	trigger_error('NO_SEARCH_LOAD');  }  // It is applicable if the configuration setting is non-zero, and the user cannot @@ -311,6 +311,26 @@ if ($keywords || $author || $author_id || $search_id || $submit)  	// define some variables needed for retrieving post_id/topic_id information  	$sort_by_sql = array('a' => 'u.username_clean', 't' => (($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time'), 'f' => 'f.forum_id', 'i' => 't.topic_title', 's' => (($show_results == 'posts') ? 'p.post_subject' : 't.topic_title')); +	/** +	* Event to modify the SQL parameters before pre-made searches +	* +	* @event core.search_modify_param_before +	* @var	string	keywords		String of the specified keywords +	* @var	array	sort_by_sql		Array of SQL sorting instructions +	* @var	array	ex_fid_ary		Array of excluded forum ids +	* @var	array	author_id_ary	Array of exclusive author ids +	* @var	string	search_id		The id of the search request +	* @since 3.1.3-RC1 +	*/ +	$vars = array( +		'keywords', +		'sort_by_sql', +		'ex_fid_ary', +		'author_id_ary', +		'search_id', +	); +	extract($phpbb_dispatcher->trigger_event('core.search_modify_param_before', compact($vars))); +  	// pre-made searches  	$sql = $field = $l_search_title = '';  	if ($search_id) diff --git a/phpBB/styles/prosilver/template/mcp_front.html b/phpBB/styles/prosilver/template/mcp_front.html index 44295611cf..8fe7dfdf65 100644 --- a/phpBB/styles/prosilver/template/mcp_front.html +++ b/phpBB/styles/prosilver/template/mcp_front.html @@ -2,6 +2,8 @@  <h2>{PAGE_TITLE}</h2> +<!-- EVENT mcp_front_latest_unapproved_before --> +  <!-- IF S_SHOW_UNAPPROVED -->  	<form id="mcp_queue" method="post" action="{S_MCP_QUEUE_ACTION}"> @@ -59,6 +61,8 @@  		</form>  <!-- ENDIF --> +<!-- EVENT mcp_front_latest_reported_before --> +  <!-- IF S_SHOW_REPORTS -->  	<div class="panel">  		<div class="inner"> @@ -100,6 +104,8 @@  	</div>  <!-- ENDIF --> +<!-- EVENT mcp_front_latest_reported_pms_before --> +  <!-- IF S_SHOW_PM_REPORTS -->  	<div class="panel">  		<div class="inner"> @@ -141,6 +147,8 @@  	</div>  <!-- ENDIF --> +<!-- EVENT mcp_front_latest_logs_before --> +  <!-- IF S_SHOW_LOGS -->  	<div class="panel">  		<div class="inner"> @@ -180,4 +188,6 @@  	</div>  <!-- ENDIF --> +<!-- EVENT mcp_front_latest_logs_after --> +  <!-- INCLUDE mcp_footer.html --> diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html index 275859ac97..6f35d0e80b 100644 --- a/phpBB/styles/prosilver/template/overall_footer.html +++ b/phpBB/styles/prosilver/template/overall_footer.html @@ -48,5 +48,7 @@  <!-- IF S_PLUPLOAD --><!-- INCLUDE plupload.html --><!-- ENDIF -->  {$SCRIPTS} +<!-- EVENT overall_footer_body_after --> +  </body>  </html> diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html index ad08c1220b..121094f6e0 100644 --- a/phpBB/styles/prosilver/template/overall_header.html +++ b/phpBB/styles/prosilver/template/overall_header.html @@ -1,7 +1,7 @@  <!DOCTYPE html>  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head> -<meta charset="utf-8"> +<meta charset="utf-8" />  <meta name="viewport" content="width=device-width" />  {META}  <title><!-- IF UNREAD_NOTIFICATIONS_COUNT -->({UNREAD_NOTIFICATIONS_COUNT}) <!-- ENDIF --><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title> diff --git a/phpBB/styles/prosilver/template/simple_header.html b/phpBB/styles/prosilver/template/simple_header.html index 6d22a074be..a0c7bc68bb 100644 --- a/phpBB/styles/prosilver/template/simple_header.html +++ b/phpBB/styles/prosilver/template/simple_header.html @@ -1,7 +1,7 @@  <!DOCTYPE html>  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head> -<meta charset="utf-8"> +<meta charset="utf-8" />  <meta name="viewport" content="width=device-width" />  {META}  <title>{SITENAME} • <!-- IF S_IN_MCP -->{L_MCP} • <!-- ELSEIF S_IN_UCP -->{L_UCP} • <!-- ENDIF -->{PAGE_TITLE}</title> diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html index ce0f4941a5..7fe0d67077 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html +++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html @@ -1,7 +1,7 @@  <!DOCTYPE html>  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head> -<meta charset="utf-8"> +<meta charset="utf-8" />  <meta name="robots" content="noindex" />  {META}  <title>{SITENAME} • {PAGE_TITLE}</title> diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html index 621e2d6143..7850412cf3 100644 --- a/phpBB/styles/prosilver/template/viewtopic_body.html +++ b/phpBB/styles/prosilver/template/viewtopic_body.html @@ -137,7 +137,9 @@  					<!-- ENDIF -->  					<!-- EVENT viewtopic_body_avatar_after -->  				</div> +				<!-- EVENT viewtopic_body_post_author_before -->  				<!-- IF not postrow.U_POST_AUTHOR --><strong>{postrow.POST_AUTHOR_FULL}</strong><!-- ELSE -->{postrow.POST_AUTHOR_FULL}<!-- ENDIF --> +				<!-- EVENT viewtopic_body_post_author_after -->  			</dt>  			<!-- IF postrow.RANK_TITLE or postrow.RANK_IMG --><dd class="profile-rank">{postrow.RANK_TITLE}<!-- IF postrow.RANK_TITLE and postrow.RANK_IMG --><br /><!-- ENDIF -->{postrow.RANK_IMG}</dd><!-- ENDIF --> @@ -313,7 +315,7 @@  		</div> -		<div class="back2top"><a href="#wrap" class="top" title="{L_BACK_TO_TOP}">{L_BACK_TO_TOP}</a></div> +		<div class="back2top"><a href="#top" class="top" title="{L_BACK_TO_TOP}">{L_BACK_TO_TOP}</a></div>  		</div>  	</div> diff --git a/phpBB/styles/prosilver/template/viewtopic_print.html b/phpBB/styles/prosilver/template/viewtopic_print.html index 5c44f58adb..66199295bb 100644 --- a/phpBB/styles/prosilver/template/viewtopic_print.html +++ b/phpBB/styles/prosilver/template/viewtopic_print.html @@ -1,7 +1,7 @@  <!DOCTYPE html>  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head> -<meta charset="utf-8"> +<meta charset="utf-8" />  <meta name="robots" content="noindex" />  {META}  <title>{SITENAME} • {PAGE_TITLE}</title> diff --git a/phpBB/styles/subsilver2/template/index.htm b/phpBB/styles/subsilver2/template/index.htm index 4763c05f0e..a1356823e2 100644 --- a/phpBB/styles/subsilver2/template/index.htm +++ b/phpBB/styles/subsilver2/template/index.htm @@ -1,7 +1,7 @@  <html>  <head>  <title>subSilver created by subBlue Design</title> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />  </head>  <body bgcolor="#FFFFFF" text="#000000"> diff --git a/phpBB/styles/subsilver2/template/mcp_front.html b/phpBB/styles/subsilver2/template/mcp_front.html index 7c17e13c52..55adb3b550 100644 --- a/phpBB/styles/subsilver2/template/mcp_front.html +++ b/phpBB/styles/subsilver2/template/mcp_front.html @@ -1,5 +1,7 @@  <!-- INCLUDE mcp_header.html --> +<!-- EVENT mcp_front_latest_unapproved_before --> +  <!-- IF S_SHOW_UNAPPROVED -->  	<form name="mcp_queue" method="post" action="{S_MCP_QUEUE_ACTION}"> @@ -44,6 +46,8 @@  	<br clear="all" /><br />  <!-- ENDIF --> +<!-- EVENT mcp_front_latest_reported_before --> +  <!-- IF S_SHOW_REPORTS -->  	<table class="tablebg" width="100%" cellspacing="1">  	<tr> @@ -73,6 +77,8 @@  	<br clear="all" /><br />  <!-- ENDIF --> +<!-- EVENT mcp_front_latest_reported_pms_before --> +  <!-- IF S_SHOW_PM_REPORTS -->  	<table class="tablebg" width="100%" cellspacing="1">  	<tr> @@ -104,6 +110,8 @@  	<br clear="all" /><br />  <!-- ENDIF --> +<!-- EVENT mcp_front_latest_logs_before --> +  <!-- IF S_SHOW_LOGS -->  	<table class="tablebg" width="100%" cellspacing="1" cellpadding="4" border="0" align="{S_CONTENT_FLOW_END}">  	<tr> @@ -134,4 +142,6 @@  	<br clear="all" />  <!-- ENDIF --> +<!-- EVENT mcp_front_latest_logs_after --> +  <!-- INCLUDE mcp_footer.html --> diff --git a/phpBB/styles/subsilver2/template/overall_footer.html b/phpBB/styles/subsilver2/template/overall_footer.html index 42ee17f2ed..176110c58d 100644 --- a/phpBB/styles/subsilver2/template/overall_footer.html +++ b/phpBB/styles/subsilver2/template/overall_footer.html @@ -23,5 +23,7 @@  {$SCRIPTS} +<!-- EVENT overall_footer_body_after --> +  </body>  </html> diff --git a/phpBB/styles/subsilver2/template/overall_header.html b/phpBB/styles/subsilver2/template/overall_header.html index 4741154889..225a7d85ff 100644 --- a/phpBB/styles/subsilver2/template/overall_header.html +++ b/phpBB/styles/subsilver2/template/overall_header.html @@ -1,7 +1,7 @@  <!DOCTYPE html>  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head> -<meta charset="utf-8"> +<meta charset="utf-8" />  {META}  <title><!-- IF UNREAD_NOTIFICATIONS_COUNT -->({UNREAD_NOTIFICATIONS_COUNT}) <!-- ENDIF --><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title> diff --git a/phpBB/styles/subsilver2/template/simple_header.html b/phpBB/styles/subsilver2/template/simple_header.html index d292c4594a..3abf89719f 100644 --- a/phpBB/styles/subsilver2/template/simple_header.html +++ b/phpBB/styles/subsilver2/template/simple_header.html @@ -1,7 +1,7 @@  <!DOCTYPE html>  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head> -<meta charset="utf-8"> +<meta charset="utf-8" />  {META}  <title>{SITENAME} • <!-- IF S_IN_MCP -->{L_MCP} • <!-- ELSEIF S_IN_UCP -->{L_UCP} • <!-- ENDIF -->{PAGE_TITLE}</title> diff --git a/phpBB/styles/subsilver2/template/ucp_pm_viewmessage_print.html b/phpBB/styles/subsilver2/template/ucp_pm_viewmessage_print.html index f70f39f9d8..fd5e390d83 100644 --- a/phpBB/styles/subsilver2/template/ucp_pm_viewmessage_print.html +++ b/phpBB/styles/subsilver2/template/ucp_pm_viewmessage_print.html @@ -1,7 +1,7 @@  <!DOCTYPE html>  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head> -<meta charset="utf-8"> +<meta charset="utf-8" />  <meta name="robots" content="noindex" />  <title>{SITENAME} :: {PAGE_TITLE}</title> @@ -78,7 +78,7 @@ hr.sep {  	<td width="10%" nowrap="nowrap">{L_PM_FROM}{L_COLON} </td>  	<td><b>{MESSAGE_AUTHOR}</b> [ {SENT_DATE} ]</td>  </tr> -	 +  <!-- IF S_TO_RECIPIENT -->  	<tr>  		<td width="10%" nowrap="nowrap">{L_TO}{L_COLON}</td> diff --git a/phpBB/styles/subsilver2/template/viewtopic_body.html b/phpBB/styles/subsilver2/template/viewtopic_body.html index 24a8c12be0..780ece82a2 100644 --- a/phpBB/styles/subsilver2/template/viewtopic_body.html +++ b/phpBB/styles/subsilver2/template/viewtopic_body.html @@ -163,7 +163,9 @@  					<a id="unread" class="anchor"<!-- IF S_UNREAD_VIEW --> data-url="{postrow.U_MINI_POST}"<!-- ENDIF -->></a>  				<!-- ENDIF -->  				<a name="p{postrow.POST_ID}" class="anchor"></a> +				<!-- EVENT viewtopic_body_post_author_before -->  				<b class="postauthor"<!-- IF postrow.POST_AUTHOR_COLOUR --> style="color: {postrow.POST_AUTHOR_COLOUR}"<!-- ENDIF -->>{postrow.POST_AUTHOR}</b> +				<!-- EVENT viewtopic_body_post_author_after -->  			</td>  			<td width="100%" height="25">  				<table width="100%" cellspacing="0"> diff --git a/phpBB/styles/subsilver2/template/viewtopic_print.html b/phpBB/styles/subsilver2/template/viewtopic_print.html index a99d807cf2..9497fda121 100644 --- a/phpBB/styles/subsilver2/template/viewtopic_print.html +++ b/phpBB/styles/subsilver2/template/viewtopic_print.html @@ -1,7 +1,7 @@  <!DOCTYPE html>  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head> -<meta charset="utf-8"> +<meta charset="utf-8" />  <meta name="robots" content="noindex" />  <title>{SITENAME} :: {PAGE_TITLE}</title> @@ -23,7 +23,7 @@ td {  	line-height: 150%;  } -.code, .codecontent,  +.code, .codecontent,  .quote, .quotecontent {  	margin: 0 5px 0 5px;  	padding: 5px; diff --git a/phpBB/styles/subsilver2/theme/images/index.htm b/phpBB/styles/subsilver2/theme/images/index.htm index 29531416fe..957f68a803 100644 --- a/phpBB/styles/subsilver2/theme/images/index.htm +++ b/phpBB/styles/subsilver2/theme/images/index.htm @@ -1,7 +1,7 @@  <html>  <head>  <title>subSilver created by subBlue Design</title> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />  </head>  <body bgcolor="#FFFFFF" text="#000000"> diff --git a/phpBB/ucp.php b/phpBB/ucp.php index 182bc2e285..8c74ca1f3c 100644 --- a/phpBB/ucp.php +++ b/phpBB/ucp.php @@ -164,6 +164,22 @@ switch ($mode)  				$cookie_name = str_replace($config['cookie_name'] . '_', '', $cookie_name); +				/** +				* Event to save custom cookies from deletion +				* +				* @event core.ucp_delete_cookies +				* @var	string	cookie_name		Cookie name to checking +				* @var	bool	retain_cookie	Do we retain our cookie or not, true if retain +				* @since 3.1.3-RC1 +				*/ +				$retain_cookie = false; +				$vars = array('cookie_name', 'retain_cookie'); +				extract($phpbb_dispatcher->trigger_event('core.ucp_delete_cookies', compact($vars))); +				if ($retain_cookie) +				{ +					continue; +				} +  				// Polls are stored as {cookie_name}_poll_{topic_id}, cookie_name_ got removed, therefore checking for poll_  				if (strpos($cookie_name, 'poll_') !== 0)  				{ diff --git a/phpBB/viewforum.php b/phpBB/viewforum.php index 1f455494f7..92ac9171cb 100644 --- a/phpBB/viewforum.php +++ b/phpBB/viewforum.php @@ -370,7 +370,7 @@ $template->assign_vars(array(  	'U_MCP'				=> ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&i=main&mode=forum_view", true, $user->session_id) : '',  	'U_POST_NEW_TOPIC'	=> ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=post&f=' . $forum_id) : '',  	'U_VIEW_FORUM'		=> append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id" . ((strlen($u_sort_param)) ? "&$u_sort_param" : '') . (($start == 0) ? '' : "&start=$start")), -	'U_CANONICAL'		=> generate_board_url() . '/' . append_sid("viewforum.$phpEx", "f=$forum_id" . ((strlen($u_sort_param)) ? "&$u_sort_param" : '') . (($start) ? "&start=$start" : ''), true, ''), +	'U_CANONICAL'		=> generate_board_url() . '/' . append_sid("viewforum.$phpEx", "f=$forum_id" . (($start) ? "&start=$start" : ''), true, ''),  	'U_MARK_TOPICS'		=> ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . "&f=$forum_id&mark=topics&mark_time=" . time()) : '',  )); @@ -395,7 +395,7 @@ $sql_array = array(  * @var	array	forum_data			Array with forum data  * @var	array	sql_array			The SQL array to get the data of all topics  * @since 3.1.0-a1 -* @change 3.1.0-RC4 Added forum_data var  +* @change 3.1.0-RC4 Added forum_data var  */  $vars = array(  	'forum_data', @@ -554,6 +554,7 @@ $sql_ary = array(  * Event to modify the SQL query before the topic ids data is retrieved  *  * @event core.viewforum_get_topic_ids_data +* @var	array	forum_data		Data about the forum  * @var	array	sql_ary			SQL query array to get the topic ids data  * @var	string	sql_approved	Topic visibility SQL string  * @var	int		sql_limit		Number of records to select @@ -564,8 +565,11 @@ $sql_ary = array(  * @var	bool	store_reverse	Flag indicating if we select from the late pages  *  * @since 3.1.0-RC4 +* +* @changed 3.1.3 Added forum_data  */  $vars = array( +	'forum_data',  	'sql_ary',  	'sql_approved',  	'sql_limit', @@ -883,6 +887,28 @@ if (sizeof($topic_list))  		$s_type_switch = ($row['topic_type'] == POST_ANNOUNCE || $row['topic_type'] == POST_GLOBAL) ? 1 : 0; +		/** +		* Event after the topic data has been assigned to the template +		* +		* @event core.viewforum_topic_row_after +		* @var	array	row				Array with the topic data +		* @var	array	rowset			Array with topics data (in topic_id => topic_data format) +		* @var	bool	s_type_switch	Flag indicating if the topic type is [global] announcement +		* @var	int		topic_id		The topic ID +		* @var	array	topic_list		Array with current viewforum page topic ids +		* @var	array	topic_row		Template array with topic data +		* @since 3.1.3-RC1 +		*/ +		$vars = array( +			'row', +			'rowset', +			's_type_switch', +			'topic_id', +			'topic_list', +			'topic_row', +		); +		extract($phpbb_dispatcher->trigger_event('core.viewforum_topic_row_after', compact($vars))); +  		if ($unread_topic)  		{  			$mark_forum_read = false; diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index a44169d3f1..5f897e8d94 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -692,7 +692,7 @@ $template->assign_vars(array(  	'U_TOPIC'				=> "{$server_path}viewtopic.$phpEx?f=$forum_id&t=$topic_id",  	'U_FORUM'				=> $server_path,  	'U_VIEW_TOPIC' 			=> $viewtopic_url, -	'U_CANONICAL'			=> generate_board_url() . '/' . append_sid("viewtopic.$phpEx", "t=$topic_id" . ((strlen($u_sort_param)) ? "&$u_sort_param" : '') . (($start) ? "&start=$start" : ''), true, ''), +	'U_CANONICAL'			=> generate_board_url() . '/' . append_sid("viewtopic.$phpEx", "t=$topic_id" . (($start) ? "&start=$start" : ''), true, ''),  	'U_VIEW_FORUM' 			=> append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),  	'U_VIEW_OLDER_TOPIC'	=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=previous"),  	'U_VIEW_NEWER_TOPIC'	=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=next"),  | 
