瀏覽代碼

Merge pull request #212 from emanuele45/master

another bunch of mixed things
emanuele45 11 年之前
父節點
當前提交
ee6b6c309d
共有 59 個文件被更改,包括 385 次插入167 次删除
  1. 2 2
      Sources/Admin.php
  2. 1 1
      Sources/Attachments.php
  3. 8 5
      Sources/Display.php
  4. 1 1
      Sources/Errors.php
  5. 6 6
      Sources/Load.php
  6. 3 3
      Sources/ManageAttachments.php
  7. 1 1
      Sources/ManageBans.php
  8. 2 2
      Sources/ManageBoards.php
  9. 2 2
      Sources/ManageCalendar.php
  10. 2 2
      Sources/ManageLanguages.php
  11. 2 2
      Sources/ManageMail.php
  12. 1 1
      Sources/ManageMaintenance.php
  13. 2 2
      Sources/ManageMembergroups.php
  14. 2 2
      Sources/ManageMembers.php
  15. 2 2
      Sources/ManageNews.php
  16. 1 1
      Sources/ManagePaid.php
  17. 3 3
      Sources/ManagePermissions.php
  18. 5 5
      Sources/ManagePosts.php
  19. 3 3
      Sources/ManageRegistration.php
  20. 1 1
      Sources/ManageScheduledTasks.php
  21. 4 4
      Sources/ManageSearch.php
  22. 2 2
      Sources/ManageSearchEngines.php
  23. 7 7
      Sources/ManageServer.php
  24. 17 16
      Sources/ManageSettings.php
  25. 209 19
      Sources/ManageSmileys.php
  26. 2 1
      Sources/MessageIndex.php
  27. 1 1
      Sources/News.php
  28. 3 2
      Sources/Packages.php
  29. 2 2
      Sources/Poll.php
  30. 1 1
      Sources/Profile-Modify.php
  31. 0 3
      Sources/Profile.php
  32. 8 8
      Sources/Search.php
  33. 4 4
      Sources/Subs-Boards.php
  34. 2 2
      Sources/Subs-Calendar.php
  35. 4 4
      Sources/Subs-Categories.php
  36. 2 1
      Sources/Subs-Editor.php
  37. 1 1
      Sources/Subs-List.php
  38. 4 4
      Sources/Subs-Members.php
  39. 5 5
      Sources/Subs-Post.php
  40. 3 3
      Sources/Subs.php
  41. 2 2
      Sources/Xml.php
  42. 1 1
      Themes/default/BoardIndex.template.php
  43. 4 0
      Themes/default/GenericControls.template.php
  44. 6 1
      Themes/default/MessageIndex.template.php
  45. 1 1
      Themes/default/Packages.template.php
  46. 1 0
      Themes/default/Themes.template.php
  47. 1 1
      Themes/default/css/jquery.sceditor.css
  48. 2 0
      Themes/default/index.template.php
  49. 2 0
      Themes/default/languages/ManageScheduledTasks.english.php
  50. 2 1
      Themes/default/languages/ManageSettings.english.php
  51. 1 0
      Themes/default/languages/index.english.php
  52. 2 1
      Themes/default/scripts/jquery.sceditor.bbcode.js
  53. 2 2
      Themes/default/scripts/jquery.sceditor.js
  54. 8 6
      index.php
  55. 7 1
      other/install_2-1_postgresql.sql
  56. 2 3
      other/install_2-1_sqlite.sql
  57. 2 2
      other/upgrade_2-0_sqlite.sql
  58. 4 4
      other/upgrade_2-1_postgresql.sql
  59. 4 4
      other/upgrade_2-1_sqlite.sql

+ 2 - 2
Sources/Admin.php

@@ -760,7 +760,7 @@ function AdminSearchInternal()
 		array('ModifyPruningSettings', 'area=logs;sa=pruning'),
 	);
 
-	call_integration_hook('integrate_admin_search', array(&$language_files, &$include_files, &$settings_search));
+	call_integration_hook('integrate_admin_search', array($language_files, $include_files, $settings_search));
 
 	loadLanguage(implode('+', $language_files));
 
@@ -938,7 +938,7 @@ function AdminLogs()
 		'pruning' => array('ManageSettings.php', 'ModifyPruningSettings'),
 	);
 
-	call_integration_hook('integrate_manage_logs', array(&$log_functions));
+	call_integration_hook('integrate_manage_logs', array($log_functions));
 
 	$sub_action = isset($_REQUEST['sa']) && isset($log_functions[$_REQUEST['sa']]) && empty($log_functions[$_REQUEST['sa']]['disabled']) ? $_REQUEST['sa'] : 'errorlog';
 	// If it's not got a sa set it must have come here for first time, pretend error log should be reversed.

+ 1 - 1
Sources/Attachments.php

@@ -444,7 +444,7 @@ function processAttachments()
 	//   id_folder => $modSettings['currentAttachmentUploadDir']
 	//   errors => An array of errors (use the index of the $txt variable for that error).
 	// Template changes can be done using "integrate_upload_template".
-	call_integration_hook('integrate_attachment_upload', array());
+	call_integration_hook('integrate_attachment_upload');
 }
 
 /**

+ 8 - 5
Sources/Display.php

@@ -150,7 +150,7 @@ function Display()
 	);
 	$topic_selects = array();
 	$topic_tables = array();
-	call_integration_hook('integrate_display_topic', array(&$topic_selects, &$topic_tables, &$topic_parameters));
+	call_integration_hook('integrate_display_topic', array($topic_selects, $topic_tables, $topic_parameters));
 
 	// @todo Why isn't this cached?
 	// @todo if we get id_board in this query and cache it, we can save a query on posting
@@ -976,7 +976,7 @@ function Display()
 		);
 		$msg_selects = array();
 		$msg_tables = array();
-		call_integration_hook('integrate_query_message', array(&$msg_selects, &$msg_tables, &$msg_parameters));
+		call_integration_hook('integrate_query_message', array($msg_selects, $msg_tables, $msg_parameters));
 
 		// What?  It's not like it *couldn't* be only guests in this topic...
 		if (!empty($posters))
@@ -1113,7 +1113,7 @@ function Display()
 					'post_button' => $txt['post'],
 				),
 				// add height and width for the editor
-				'height' => '175px',
+				'height' => '250px',
 				'width' => '100%',
 				// We do XML preview here.
 				'preview_type' => 0,
@@ -1159,7 +1159,10 @@ function Display()
 		$context['mod_buttons'][] = array('text' => 'restore_topic', 'image' => '', 'lang' => true, 'url' => $scripturl . '?action=restoretopic;topics=' . $context['current_topic'] . ';' . $context['session_var'] . '=' . $context['session_id']);
 
 	// Allow adding new mod buttons easily.
-	call_integration_hook('integrate_display_buttons');
+	// Note: $context['normal_buttons'] and $context['mod_buttons'] are added for backward compatibility with 2.0, but are deprecated and should not be used
+	call_integration_hook('integrate_display_buttons', array($context['normal_buttons']));
+	// Note: integrate_mod_buttons is no more necessary and deprecated, but is kept for backward compatibility with 2.0
+	call_integration_hook('integrate_mod_buttons', array($context['mod_buttons']));
 }
 
 /**
@@ -1287,7 +1290,7 @@ function prepareDisplayContext($reset = false)
 	if (!empty($output['modified']['name']))
 		$output['modified']['last_edit_text'] = sprintf($txt['last_edit_by'], $output['modified']['time'], $output['modified']['name']);
 
-	call_integration_hook('integrate_prepare_display_context', array(&$output, &$message));
+	call_integration_hook('integrate_prepare_display_context', array($output, $message));
 
 	if (empty($options['view_newest_first']))
 		$counter++;

+ 1 - 1
Sources/Errors.php

@@ -88,7 +88,7 @@ function log_error($error_message, $error_type = 'general', $file = null, $line
 	if (empty($tried_hook))
 	{
 		$tried_hook = true;
-		call_integration_hook('integrate_error_types', array(&$other_error_types));
+		call_integration_hook('integrate_error_types', array($other_error_types));
 		$known_error_types += $other_error_types;
 	}
 	// Make sure the category that was specified is a valid one

+ 6 - 6
Sources/Load.php

@@ -950,7 +950,7 @@ function loadMemberData($users, $is_name = false, $set = 'normal')
 		trigger_error('loadMemberData(): Invalid member data set \'' . $set . '\'', E_USER_WARNING);
 
 	// Allow mods to easily add to the selected member data
-	call_integration_hook('integrate_load_member_data', array(&$select_columns, &$select_tables));
+	call_integration_hook('integrate_load_member_data', array($select_columns, $select_tables));
 
 	if (!empty($users))
 	{
@@ -1236,7 +1236,7 @@ function loadMemberContext($user, $display_custom_fields = false)
 		}
 	}
 
-	call_integration_hook('integrate_member_context', array(&$user, $display_custom_fields));
+	call_integration_hook('integrate_member_context', array($user, $display_custom_fields));
 	return true;
 }
 
@@ -2584,7 +2584,7 @@ function cache_quick_get($key, $file, $function, $params, $level = 1)
 	// @todo Why are we doing this if caching is disabled?
 
 	if (function_exists('call_integration_hook'))
-		call_integration_hook('pre_cache_quick_get', array(&$key, &$file, &$function, &$params, &$level));
+		call_integration_hook('pre_cache_quick_get', array($key, $file, $function, $params, $level));
 
 	/* Refresh the cache if either:
 		1. Caching is disabled.
@@ -2607,7 +2607,7 @@ function cache_quick_get($key, $file, $function, $params, $level = 1)
 		eval($cache_block['post_retri_eval']);
 
 	if (function_exists('call_integration_hook'))
-		call_integration_hook('post_cache_quick_get', array(&$cache_block));
+		call_integration_hook('post_cache_quick_get', array($cache_block));
 
 	return $cache_block['data'];
 }
@@ -2738,7 +2738,7 @@ function cache_put_data($key, $value, $ttl = 120)
 	}
 
 	if (function_exists('call_integration_hook'))
-		call_integration_hook('cache_put_data', array(&$key, &$value, &$ttl));
+		call_integration_hook('cache_put_data', array($key, $value, $ttl));
 
 	if (isset($db_show_debug) && $db_show_debug === true)
 		$cache_hits[$cache_count]['t'] = array_sum(explode(' ', microtime())) - array_sum(explode(' ', $st));
@@ -2834,7 +2834,7 @@ function cache_get_data($key, $ttl = 120)
 	}
 
 	if (function_exists('call_integration_hook'))
-		call_integration_hook('cache_get_data', array(&$key, &$ttl, &$value));
+		call_integration_hook('cache_get_data', array($key, $ttl, $value));
 
 	return empty($value) ? null : @unserialize($value);
 }

+ 3 - 3
Sources/ManageAttachments.php

@@ -54,7 +54,7 @@ function ManageAttachments()
 		'transfer' => 'TransferAttachments',
 	);
 
-	call_integration_hook('integrate_manage_attachments', array(&$subActions));
+	call_integration_hook('integrate_manage_attachments', array($subActions));
 
 	// Pick the correct sub-action.
 	if (isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]))
@@ -189,7 +189,7 @@ function ManageAttachmentSettings($return_config = false)
 	base_dir.addEventListener("change", toggleSubDir, false);
 	toggleSubDir();';
 
-	call_integration_hook('integrate_modify_attachment_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_attachment_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -319,7 +319,7 @@ function ManageAvatarSettings($return_config = false)
 			array('text', 'custom_avatar_url', 40),
 	);
 
-	call_integration_hook('integrate_modify_avatar_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_avatar_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;

+ 1 - 1
Sources/ManageBans.php

@@ -44,7 +44,7 @@ function Ban()
 		'log' => 'BanLog',
 	);
 
-	call_integration_hook('integrate_manage_bans', array(&$subActions));
+	call_integration_hook('integrate_manage_bans', array($subActions));
 
 	// Default the sub-action to 'view ban list'.
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'list';

+ 2 - 2
Sources/ManageBoards.php

@@ -44,7 +44,7 @@ function ManageBoards()
 		'settings' => array('EditBoardSettings', 'admin_forum'),
 	);
 
-	call_integration_hook('integrate_manage_boards', array(&$subActions));
+	call_integration_hook('integrate_manage_boards', array($subActions));
 
 	// Default to sub action 'main' or 'settings' depending on permissions.
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (allowedTo('manage_boards') ? 'main' : 'settings');
@@ -804,7 +804,7 @@ function EditBoardSettings($return_config = false)
 			array('check', 'deny_boards_access'),
 	);
 
-	call_integration_hook('integrate_modify_board_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_board_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;

+ 2 - 2
Sources/ManageCalendar.php

@@ -41,7 +41,7 @@ function ManageCalendar()
 		'settings' => 'ModifyCalendarSettings'
 	);
 
-	call_integration_hook('integrate_manage_calendar', array(&$subActions));
+	call_integration_hook('integrate_manage_calendar', array($subActions));
 
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'holidays';
 
@@ -335,7 +335,7 @@ function ModifyCalendarSettings($return_config = false)
 			array('int', 'cal_maxspan', 6, 'postinput' => $txt['days_word']),
 	);
 
-	call_integration_hook('integrate_modify_calendar_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_calendar_settings', array($config_vars));
 	if ($return_config)
 		return $config_vars;
 

+ 2 - 2
Sources/ManageLanguages.php

@@ -44,7 +44,7 @@ function ManageLanguages()
 	);
 
 	$config_vars = array();
-	call_integration_hook('integrate_manage_languages', array(&$config_vars));
+	call_integration_hook('integrate_manage_languages', array($config_vars));
 
 	// By default we're managing languages.
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'edit';
@@ -797,7 +797,7 @@ function ModifyLanguageSettings($return_config = false)
 		array('userLanguage', $txt['userLanguage'], 'db', 'check', null, 'userLanguage'),
 	);
 
-	call_integration_hook('integrate_language_settings', array(&$config_vars));
+	call_integration_hook('integrate_language_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;

+ 2 - 2
Sources/ManageMail.php

@@ -43,7 +43,7 @@ function ManageMail()
 		'settings' => 'ModifyMailSettings',
 	);
 
-	call_integration_hook('integrate_manage_mail', array(&$subActions));
+	call_integration_hook('integrate_manage_mail', array($subActions));
 
 	// By default we want to browse
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'browse';
@@ -314,7 +314,7 @@ function ModifyMailSettings($return_config = false)
 			'birthday_body' => array('var_message', 'birthday_body', 'var_message' => nl2br($body), 'disabled' => true, 'size' => ceil(strlen($body) / 25)),
 	);
 
-	call_integration_hook('integrate_modify_mail_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_mail_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;

+ 1 - 1
Sources/ManageMaintenance.php

@@ -91,7 +91,7 @@ function ManageMaintenance()
 		),
 	);
 
-	call_integration_hook('integrate_manage_maintenance', array(&$subActions));
+	call_integration_hook('integrate_manage_maintenance', array($subActions));
 
 	// Yep, sub-action time!
 	if (isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]))

+ 2 - 2
Sources/ManageMembergroups.php

@@ -40,7 +40,7 @@ function ModifyMembergroups()
 		'settings' => array('ModifyMembergroupsettings', 'admin_forum'),
 	);
 
-	call_integration_hook('integrate_manage_membergroups', array(&$subActions));
+	call_integration_hook('integrate_manage_membergroups', array($subActions));
 
 	// Default to sub action 'index' or 'settings' depending on permissions.
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (allowedTo('manage_membergroups') ? 'index' : 'settings');
@@ -1163,7 +1163,7 @@ function ModifyMembergroupsettings()
 			array('permissions', 'manage_membergroups'),
 	);
 
-	call_integration_hook('integrate_modify_membergroup_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_membergroup_settings', array($config_vars));
 
 	if (isset($_REQUEST['save']))
 	{

+ 2 - 2
Sources/ManageMembers.php

@@ -37,7 +37,7 @@ function ViewMembers()
 		'query' => array('ViewMemberlist', 'moderate_forum'),
 	);
 
-	call_integration_hook('integrate_manage_members', array(&$subActions));
+	call_integration_hook('integrate_manage_members', array($subActions));
 
 	// Default to sub action 'index' or 'settings' depending on permissions.
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'all';
@@ -278,7 +278,7 @@ function ViewMemberlist()
 			'++' => '>'
 		);
 
-		call_integration_hook('integrate_view_members_params', array(&$params));
+		call_integration_hook('integrate_view_members_params', array($params));
 
 		$search_params = array();
 		if ($context['sub_action'] == 'query' && !empty($_REQUEST['params']) && empty($_POST['types']))

+ 2 - 2
Sources/ManageNews.php

@@ -41,7 +41,7 @@ function ManageNews()
 		'settings' => array('ModifyNewsSettings', 'admin_forum'),
 	);
 
-	call_integration_hook('integrate_manage_news', array(&$subActions));
+	call_integration_hook('integrate_manage_news', array($subActions));
 
 	// Default to sub action 'main' or 'settings' depending on permissions.
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (allowedTo('edit_news') ? 'editnews' : (allowedTo('send_mail') ? 'mailingmembers' : 'settings'));
@@ -1048,7 +1048,7 @@ function ModifyNewsSettings($return_config = false)
 			array('text', 'xmlnews_maxlen', 'subtext' => $txt['xmlnews_maxlen_note'], 10),
 	);
 
-	call_integration_hook('integrate_modify_news_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_news_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;

+ 1 - 1
Sources/ManagePaid.php

@@ -40,7 +40,7 @@ function ManagePaidSubscriptions()
 		'viewsub' => array('ViewSubscribedUsers', 'admin_forum'),
 	);
 
-	call_integration_hook('integrate_manage_subscriptions', array(&$subActions));
+	call_integration_hook('integrate_manage_subscriptions', array($subActions));
 
 	// Default the sub-action to 'view subscriptions', but only if they have already set things up..
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (!empty($modSettings['paid_currency_symbol']) ? 'view' : 'settings');

+ 3 - 3
Sources/ManagePermissions.php

@@ -44,7 +44,7 @@ function ModifyPermissions()
 		'settings' => array('GeneralPermissionSettings', 'admin_forum'),
 	);
 
-	call_integration_hook('integrate_manage_permissions', array(&$subActions));
+	call_integration_hook('integrate_manage_permissions', array($subActions));
 
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) && empty($subActions[$_REQUEST['sa']]['disabled']) ? $_REQUEST['sa'] : (allowedTo('manage_permissions') ? 'index' : 'settings');
 	isAllowedTo($subActions[$_REQUEST['sa']][1]);
@@ -975,7 +975,7 @@ function GeneralPermissionSettings($return_config = false)
 			array('check', 'permission_enable_postgroups', 0, $txt['permission_settings_enable_postgroups'], 'help' => 'permissions_postgroups'),
 	);
 
-	call_integration_hook('integrate_modify_permission_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_permission_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -2285,7 +2285,7 @@ function ModifyPostModeration()
 		'attachment' => array('post_attachment', 'post_unapproved_attachments'),
 	);
 
-	call_integration_hook('integrate_post_moderation_mapping', array(&$mappings));
+	call_integration_hook('integrate_post_moderation_mapping', array($mappings));
 
 	// Start this with the guests/members.
 	$context['profile_groups'] = array(

+ 5 - 5
Sources/ManagePosts.php

@@ -38,7 +38,7 @@ function ManagePostSettings()
 		'topics' => 'ModifyTopicSettings',
 	);
 
-	call_integration_hook('integrate_manage_posts', array(&$subActions));
+	call_integration_hook('integrate_manage_posts', array($subActions));
 
 	// Default the sub-action to 'posts'.
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'posts';
@@ -128,7 +128,7 @@ function SetCensor()
 			'censorIgnoreCase' => empty($_POST['censorIgnoreCase']) ? '0' : '1',
 		);
 
-		call_integration_hook('integrate_save_censors', array(&$updates));
+		call_integration_hook('integrate_save_censors', array($updates));
 
 		updateSettings($updates);
 	}
@@ -201,7 +201,7 @@ function ModifyPostSettings($return_config = false)
 			array('int', 'preview_characters', 'subtext' => $txt['preview_characters_zero'], 'postinput' => $txt['preview_characters_units']),
 	);
 
-	call_integration_hook('integrate_modify_post_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_post_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -276,7 +276,7 @@ function ModifyBBCSettings($return_config = false)
 	$context['settings_post_javascript'] = '
 		toggleBBCDisabled(\'disabledBBC\', ' . (empty($modSettings['enableBBC']) ? 'true' : 'false') . ');';
 
-	call_integration_hook('integrate_modify_bbc_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_bbc_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -353,7 +353,7 @@ function ModifyTopicSettings($return_config = false)
 
 	);
 
-	call_integration_hook('integrate_modify_topic_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_topic_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;

+ 3 - 3
Sources/ManageRegistration.php

@@ -41,7 +41,7 @@ function RegCenter()
 		'settings' => array('ModifyRegistrationSettings', 'admin_forum'),
 	);
 
-	call_integration_hook('integrate_manage_registrations', array(&$subActions));
+	call_integration_hook('integrate_manage_registrations', array($subActions));
 
 	// Work out which to call...
 	$context['sub_action'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (allowedTo('moderate_forum') ? 'register' : 'settings');
@@ -284,14 +284,14 @@ function ModifyRegistrationSettings($return_config = false)
 			array('check', 'notify_new_registration'),
 			array('check', 'send_welcomeEmail'),
 		'',
-			array('int', 'coppaAge', 'subtext' => $txt['setting_coppaAge_desc'], 'onchange' => 'checkCoppa();'),
+			array('int', 'coppaAge', 'subtext' => $txt['setting_coppaAge_desc'], 'onchange' => 'checkCoppa();', 'onkeyup' => 'checkCoppa();'),
 			array('select', 'coppaType', array($txt['setting_coppaType_reject'], $txt['setting_coppaType_approval']), 'onchange' => 'checkCoppa();'),
 			array('large_text', 'coppaPost', 'subtext' => $txt['setting_coppaPost_desc']),
 			array('text', 'coppaFax'),
 			array('text', 'coppaPhone'),
 	);
 
-	call_integration_hook('integrate_modify_registration_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_registration_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;

+ 1 - 1
Sources/ManageScheduledTasks.php

@@ -39,7 +39,7 @@ function ManageScheduledTasks()
 		'tasks' => 'ScheduledTasks',
 	);
 
-	call_integration_hook('integrate_manage_scheduled_tasks', array(&$subActions));
+	call_integration_hook('integrate_manage_scheduled_tasks', array($subActions));
 
 	// We need to find what's the action.
 	if (isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]))

+ 4 - 4
Sources/ManageSearch.php

@@ -48,7 +48,7 @@ function ManageSearch()
 		'createmsgindex' => 'CreateMessageIndex',
 	);
 
-	call_integration_hook('integrate_manage_search', array(&$subActions));
+	call_integration_hook('integrate_manage_search', array($subActions));
 
 	// Default the sub-action to 'edit search settings'.
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'weights';
@@ -103,7 +103,7 @@ function EditSearchSettings($return_config = false)
 			array('int', 'search_floodcontrol_time', 'subtext' => $txt['search_floodcontrol_time_desc'], 6, 'postinput' => $txt['seconds']),
 	);
 
-	call_integration_hook('integrate_modify_search_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_search_settings', array($config_vars));
 
 	// Perhaps the search method wants to add some settings?
 	require_once($sourcedir . '/Search.php');
@@ -117,7 +117,7 @@ function EditSearchSettings($return_config = false)
 	$context['page_title'] = $txt['search_settings_title'];
 	$context['sub_template'] = 'show_settings';
 
-	call_integration_hook('integrate_modify_search_weights', array(&$factors));
+	call_integration_hook('integrate_modify_search_weights', array($factors));
 
 	// We'll need this for the settings.
 	require_once($sourcedir . '/ManageServer.php');
@@ -166,7 +166,7 @@ function EditWeights()
 		'search_weight_sticky',
 	);
 
-	call_integration_hook('integrate_modify_search_weights', array(&$factors));
+	call_integration_hook('integrate_modify_search_weights', array($factors));
 
 	// A form was submitted.
 	if (isset($_POST['save']))

+ 2 - 2
Sources/ManageSearchEngines.php

@@ -36,7 +36,7 @@ function SearchEngines()
 		'stats' => 'SpiderStats',
 	);
 
-	call_integration_hook('integrate_manage_search_engines', array(&$subActions));
+	call_integration_hook('integrate_manage_search_engines', array($subActions));
 
 	// Ensure we have a valid subaction.
 	$context['sub_action'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'stats';
@@ -88,7 +88,7 @@ function ManageSearchEngineSettings($return_config = false)
 		}
 		disableFields();';
 
-	call_integration_hook('integrate_modify_search_engine_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_search_engine_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;

+ 7 - 7
Sources/ManageServer.php

@@ -99,7 +99,7 @@ function ModifySettings()
 		'phpinfo' => 'ShowPHPinfoSettings',
 	);
 
-	call_integration_hook('integrate_server_settings', array(&$subActions));
+	call_integration_hook('integrate_server_settings', array($subActions));
 
 	// By default we're editing the core settings
 	$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'general';
@@ -162,7 +162,7 @@ function ModifyGeneralSettings($return_config = false)
 		array('disableHostnameLookup', $txt['disableHostnameLookup'], 'db', 'check', null, 'disableHostnameLookup'),
 	);
 
-	call_integration_hook('integrate_general_settings', array(&$config_vars));
+	call_integration_hook('integrate_general_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -225,7 +225,7 @@ function ModifyDatabaseSettings($return_config = false)
 		array('cachedir', $txt['cachedir'], 'file', 'text', 36),
 	);
 
-	call_integration_hook('integrate_database_settings', array(&$config_vars));
+	call_integration_hook('integrate_database_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -274,7 +274,7 @@ function ModifyCookieSettings($return_config = false)
 		array('databaseSession_lifetime', $txt['databaseSession_lifetime'], 'db', 'int', false, 'databaseSession_lifetime', 'postinput' => $txt['seconds']),
 	);
 
-	call_integration_hook('integrate_cookie_settings', array(&$config_vars));
+	call_integration_hook('integrate_cookie_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -371,7 +371,7 @@ function ModifyCacheSettings($return_config = false)
 		cache_type.addEventListener("change", toggleCache);
 		toggleCache();';
 
-	call_integration_hook('integrate_modify_cache_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_cache_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -465,7 +465,7 @@ function ModifyLoadBalancingSettings($return_config = false)
 		$config_vars[] = array('text', $name, 'value' => $value, 'disabled' => $disabled);
 	}
 
-	call_integration_hook('integrate_loadavg_settings', array(&$config_vars));
+	call_integration_hook('integrate_loadavg_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -733,7 +733,7 @@ function prepareDBSettingContext(&$config_vars)
 		}
 	}
 
-	call_integration_hook('integrate_prepare_db_settings', array(&$config_vars));
+	call_integration_hook('integrate_prepare_db_settings', array($config_vars));
 	createToken('admin-dbsc');
 }
 

+ 17 - 16
Sources/ManageSettings.php

@@ -61,7 +61,7 @@ function ModifyFeatureSettings()
 		'profileedit' => 'EditCustomProfiles',
 	);
 
-	call_integration_hook('integrate_modify_features', array(&$subActions));
+	call_integration_hook('integrate_modify_features', array($subActions));
 
 	// If Advanced Profile Fields are disabled don't show the setting page
 	if (!in_array('cp', $context['admin_features']))
@@ -113,7 +113,7 @@ function ModifySecuritySettings()
 		'moderation' => 'ModifyModerationSettings',
 	);
 
-	call_integration_hook('integrate_modify_security', array(&$subActions));
+	call_integration_hook('integrate_modify_security', array($subActions));
 
 	// If Warning System is disabled don't show the setting page
 	if (!in_array('w', $context['admin_features']))
@@ -539,7 +539,7 @@ function ModifyBasicSettings($return_config = false)
 	else
 		unset($config_vars['default_timezone']);
 
-	call_integration_hook('integrate_modify_basic_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_basic_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -601,7 +601,7 @@ function ModifyGeneralSecuritySettings($return_config = false)
 			array('check', 'enableReportPM'),
 	);
 
-	call_integration_hook('integrate_general_security_settings', array(&$config_vars));
+	call_integration_hook('integrate_general_security_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -655,7 +655,7 @@ function ModifyLayoutSettings($return_config = false)
 			array('check', 'timeLoadPageEnable'),
 	);
 
-	call_integration_hook('integrate_layout_settings', array(&$config_vars));
+	call_integration_hook('integrate_layout_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -704,7 +704,7 @@ function ModifyKarmaSettings($return_config = false)
 			array('text', 'karmaSmiteLabel'),
 	);
 
-	call_integration_hook('integrate_karma_settings', array(&$config_vars));
+	call_integration_hook('integrate_karma_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -745,7 +745,7 @@ function ModifyModerationSettings($return_config = false)
 			array('select', 'warning_show', 'subtext' => $txt['setting_warning_show_note'], array($txt['setting_warning_show_mods'], $txt['setting_warning_show_user'], $txt['setting_warning_show_all'])),
 	);
 
-	call_integration_hook('integrate_moderation_settings', array(&$config_vars));
+	call_integration_hook('integrate_moderation_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -779,7 +779,7 @@ function ModifyModerationSettings($return_config = false)
 		$save_vars[] = array('text', 'warning_settings');
 		unset($save_vars['rem1'], $save_vars['rem2']);
 
-		call_integration_hook('integrate_save_karma_settings', array(&$save_vars));
+		call_integration_hook('integrate_save_karma_settings', array($save_vars));
 
 		saveDBSettings($save_vars);
 		redirectexit('action=admin;area=securitysettings;sa=moderation');
@@ -829,7 +829,7 @@ function ModifySpamSettings($return_config = false)
 				array('callback', 'question_answer_list'),
 	);
 
-	call_integration_hook('integrate_spam_settings', array(&$config_vars));
+	call_integration_hook('integrate_spam_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -940,7 +940,7 @@ function ModifySpamSettings($return_config = false)
 		if (empty($count_questions) || $_POST['qa_verification_number'] > $count_questions)
 			$_POST['qa_verification_number'] = $count_questions;
 
-		call_integration_hook('integrate_save_spam_settings', array(&$save_vars));
+		call_integration_hook('integrate_save_spam_settings', array($save_vars));
 
 		// Now save.
 		saveDBSettings($save_vars);
@@ -1017,7 +1017,7 @@ function ModifySignatureSettings($return_config = false)
 			array('bbc', 'signature_bbc'),
 	);
 
-	call_integration_hook('integrate_signature_settings', array(&$config_vars));
+	call_integration_hook('integrate_signature_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -1236,7 +1236,7 @@ function ModifySignatureSettings($return_config = false)
 				}
 
 				$sig = strtr($sig, array("\n" => '<br />'));
-				call_integration_hook('integrate_apply_signature_settings', array(&$sig, $sig_limits, $disabledTags));
+				call_integration_hook('integrate_apply_signature_settings', array($sig, $sig_limits, $disabledTags));
 				if ($sig != $row['signature'])
 					$changes[$row['id_member']] = $sig;
 			}
@@ -1263,6 +1263,7 @@ function ModifySignatureSettings($return_config = false)
 			if (!$done)
 				pauseSignatureApplySettings();
 		}
+		$settings_applied = true;
 	}
 
 	$context['signature_settings'] = array(
@@ -1310,7 +1311,7 @@ function ModifySignatureSettings($return_config = false)
 				$sig_limits[] = !empty($_POST['signature_' . $key]) ? max(1, (int) $_POST['signature_' . $key]) : 0;
 		}
 
-		call_integration_hook('integrate_save_signature_settings', array(&$sig_limits, &$bbcTags));
+		call_integration_hook('integrate_save_signature_settings', array($sig_limits, $bbcTags));
 
 		$_POST['signature_settings'] = implode(',', $sig_limits) . ':' . implode(',', array_diff($bbcTags, $_POST['signature_bbc_enabledTags']));
 
@@ -1325,7 +1326,7 @@ function ModifySignatureSettings($return_config = false)
 	$context['post_url'] = $scripturl . '?action=admin;area=featuresettings;save;sa=sig';
 	$context['settings_title'] = $txt['signature_settings'];
 
-	$context['settings_message'] = '<p class="centertext">' . sprintf($txt['signature_settings_warning'], $context['session_id'], $context['session_var']) . '</p>';
+	$context['settings_message'] = !empty($settings_applied) ? '<div class="infobox">' . $txt['signature_settings_applied'] . '</div>' : '<p class="centertext">' . sprintf($txt['signature_settings_warning'], $context['session_id'], $context['session_var']) . '</p>';
 
 	prepareDBSettingContext($config_vars);
 }
@@ -2097,7 +2098,7 @@ function ModifyPruningSettings($return_config = false)
 			// Mod Developers: Do NOT use the pruningOptions master variable for this as SMF Core may overwrite your setting in the future!
 	);
 
-	call_integration_hook('integrate_prune_settings', array(&$config_vars));
+	call_integration_hook('integrate_prune_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -2184,7 +2185,7 @@ function ModifyGeneralModSettings($return_config = false)
 
 		$save_vars = $config_vars;
 
-		call_integration_hook('integrate_save_general_mod_settings', array(&$save_vars));
+		call_integration_hook('integrate_save_general_mod_settings', array($save_vars));
 
 		// This line is to help mod authors do a search/add after if you want to add something here. Keyword: FOOT TAPPING SUCKS!
 		saveDBSettings($save_vars);

+ 209 - 19
Sources/ManageSmileys.php

@@ -42,7 +42,7 @@ function ManageSmileys()
 		'install' => 'InstallSmileySet'
 	);
 
-	call_integration_hook('integrate_manage_smileys', array(&$subActions));
+	call_integration_hook('integrate_manage_smileys', array($subActions));
 
 	// If customized smileys is disabled don't show the setting page
 	if (empty($modSettings['smiley_enable']))
@@ -143,7 +143,7 @@ function EditSmileySettings($return_config = false)
 			array('check', 'messageIcons_enable', 'subtext' => $txt['setting_messageIcons_enable_note']),
 	);
 
-	call_integration_hook('integrate_modify_smiley_settings', array(&$config_vars));
+	call_integration_hook('integrate_modify_smiley_settings', array($config_vars));
 
 	if ($return_config)
 		return $config_vars;
@@ -1404,40 +1404,230 @@ function EditSmileyOrder()
  */
 function InstallSmileySet()
 {
-	global $sourcedir, $boarddir, $modSettings, $smcFunc;
+	global $sourcedir, $boarddir, $modSettings, $smcFunc, $scripturl, $context, $txt, $user_info;
 
 	isAllowedTo('manage_smileys');
 	checkSession('request');
+	// One of these two may be necessary
+	loadLanguage('Errors');
+	loadLanguage('Packages');
 
 	require_once($sourcedir . '/Subs-Package.php');
 
-	$name = strtok(basename(isset($_FILES['set_gz']) ? $_FILES['set_gz']['name'] : $_REQUEST['set_gz']), '.');
-	$name = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $name);
+	// Installing unless proven otherwise
+	$testing = false;
 
-	//@todo Decide: overwrite or not?
-	if (isset($_FILES['set_gz']) && is_uploaded_file($_FILES['set_gz']['tmp_name']) && (ini_get('open_basedir') != '' || file_exists($_FILES['set_gz']['tmp_name'])))
-		$extracted = read_tgz_file($_FILES['set_gz']['tmp_name'], $boarddir . '/Smileys/' . $name);
-	elseif (isset($_REQUEST['set_gz']))
+	if (isset($_REQUEST['set_gz']))
 	{
+		$base_name = strtr(basename($_REQUEST['set_gz']), ':/', '-_');
+		$name = $smcFunc['htmlspecialchars'](strtok(basename($_REQUEST['set_gz']), '.'));
+		$name_pr = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $name);
+		$context['filename'] = $base_name;
+
 		// Check that the smiley is from simplemachines.org, for now... maybe add mirroring later.
 		if (preg_match('~^http://[\w_\-]+\.simplemachines\.org/~', $_REQUEST['set_gz']) == 0 || strpos($_REQUEST['set_gz'], 'dlattach') !== false)
 			fatal_lang_error('not_on_simplemachines');
 
-		$extracted = read_tgz_file($_REQUEST['set_gz'], $boarddir . '/Smileys/' . $name);
+		$destination = $boarddir . '/Packages/' . $base_name;
+
+		if (file_exists($destination))
+			fatal_lang_error('package_upload_error_exists');
+
+		// Let's copy it to the Packages directory
+		file_put_contents($destination, fetch_web_data($_REQUEST['set_gz']));
+		$testing = true;
+	}
+	elseif (isset($_REQUEST['package']))
+	{
+		$base_name = basename($_REQUEST['package']);
+		$name = $smcFunc['htmlspecialchars'](strtok(basename($_REQUEST['package']), '.'));
+		$name_pr = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $name);
+		$context['filename'] = $base_name;
+
+		$destination = $boarddir . '/Packages/' . basename($_REQUEST['package']);
 	}
+
+	if (!file_exists($destination))
+		fatal_lang_error('package_no_file', false);
+
+	// Make sure temp directory exists and is empty.
+	if (file_exists($boarddir . '/Packages/temp'))
+		deltree($boarddir . '/Packages/temp', false);
+
+	if (!mktree($boarddir . '/Packages/temp', 0755))
+	{
+		deltree($boarddir . '/Packages/temp', false);
+		if (!mktree($boarddir . '/Packages/temp', 0777))
+		{
+			deltree($boarddir . '/Packages/temp', false);
+			// @todo not sure about url in destination_url
+			create_chmod_control(array($boarddir . '/Packages/temp/delme.tmp'), array('destination_url' => $scripturl . '?action=admin;area=smileys;sa=install;set_gz=' . $_REQUEST['set_gz'], 'crash_on_error' => true));
+
+			deltree($boarddir . '/Packages/temp', false);
+			if (!mktree($boarddir . '/Packages/temp', 0777))
+				fatal_lang_error('package_cant_download', false);
+		}
+	}
+
+	$extracted = read_tgz_file($destination, $boarddir . '/Packages/temp');
+	if (!$extracted)
+		fatal_lang_error('packageget_unable', false, array('http://custom.simplemachines.org/mods/index.php?action=search;type=12;basic_search=' . $name));
+	if ($extracted && !file_exists($boarddir . '/Packages/temp/package-info.xml'))
+		foreach ($extracted as $file)
+			if (basename($file['filename']) == 'package-info.xml')
+			{
+				$base_path = dirname($file['filename']) . '/';
+				break;
+			}
+
+	if (!isset($base_path))
+		$base_path = '';
+
+	if (!file_exists($boarddir . '/Packages/temp/' . $base_path . 'package-info.xml'))
+		fatal_lang_error('package_get_error_missing_xml', false);
+
+	$smileyInfo = getPackageInfo($context['filename']);
+	if (!is_array($smileyInfo))
+		fatal_lang_error($smileyInfo);
+
+	// See if it is installed?
+	$request = $smcFunc['db_query']('', '
+		SELECT version, themes_installed, db_changes
+		FROM {db_prefix}log_packages
+		WHERE package_id = {string:current_package}
+			AND install_state != {int:not_installed}
+		ORDER BY time_installed DESC
+		LIMIT 1',
+		array(
+			'not_installed'	=> 0,
+			'current_package' => $smileyInfo['id'],
+		)
+	);
+
+	if ($smcFunc['db_num_rows']($request) > 0)
+		fata_lang_error('package_installed_warning1');
+
+	// Everything is fine, now it's time to do something
+	$actions = parsePackageInfo($smileyInfo['xml'], true, 'install');
+
+	$context['post_url'] = $scripturl . '?action=admin;area=smileys;sa=install;package=' . $base_name;
+	$has_readme = false;
+	$context['has_failure'] = false;
+	$context['actions'] = array();
+	$context['ftp_needed'] = false;
+
+	foreach ($actions as $action)
+	{
+		if ($action['type'] == 'readme' || $action['type'] == 'license')
+		{
+			$has_readme = true;
+			$type = 'package_' . $action['type'];
+			if (file_exists($boarddir . '/Packages/temp/' . $base_path . $action['filename']))
+				$context[$type] = htmlspecialchars(trim(file_get_contents($boarddir . '/Packages/temp/' . $base_path . $action['filename']), "\n\r"));
+			elseif (file_exists($action['filename']))
+				$context[$type] = htmlspecialchars(trim(file_get_contents($action['filename']), "\n\r"));
+
+			if (!empty($action['parse_bbc']))
+			{
+				require_once($sourcedir . '/Subs-Post.php');
+				preparsecode($context[$type]);
+				$context[$type] = parse_bbc($context[$type]);
+			}
+			else
+				$context[$type] = nl2br($context[$type]);
+
+			continue;
+		}
+		elseif ($action['type'] == 'require-dir')
+		{
+			// Do this one...
+			$thisAction = array(
+				'type' => $txt['package_extract'] . ' ' . ($action['type'] == 'require-dir' ? $txt['package_tree'] : $txt['package_file']),
+				'action' => $smcFunc['htmlspecialchars'](strtr($action['destination'], array($boarddir => '.')))
+			);
+
+			$file =  $boarddir . '/Packages/temp/' . $base_path . $action['filename'];
+			if (isset($action['filename']) && (!file_exists($file) || !is_writable(dirname($action['destination']))))
+			{
+				$context['has_failure'] = true;
+
+				$thisAction += array(
+					'description' => $txt['package_action_error'],
+					'failed' => true,
+				);
+			}
+			// @todo None given?
+			if (empty($thisAction['description']))
+				$thisAction['description'] = isset($action['description']) ? $action['description'] : '';
+
+			$context['actions'][] = $thisAction;
+		}
+		elseif ($action['type'] == 'credits')
+		{
+			// Time to build the billboard
+			$credits_tag = array(
+				'url' => $action['url'],
+				'license' => $action['license'],
+				'copyright' => $action['copyright'],
+				'title' => $action['title'],
+			);
+		}
+	}
+
+	if ($testing)
+	{
+		$context['sub_template'] = 'view_package';
+		$context['uninstalling'] = false;
+		$context['is_installed'] = false;
+		$context['package_name'] = $smileyInfo['name'];
+		loadTemplate('Packages');
+	}
+	// Do the actual install
 	else
-		redirectexit('action=admin;area=smileys');
+	{
+		$actions = parsePackageInfo($smileyInfo['xml'], false, 'install');
+		foreach ($context['actions'] as $action)
+		{
+			updateSettings(array(
+				'smiley_sets_known' => $modSettings['smiley_sets_known'] . ',' . basename($action['action']),
+				'smiley_sets_names' => $modSettings['smiley_sets_names'] . "\n" . $smileyInfo['name'] . (count($context['actions']) > 1 ? ' ' .  (!empty($action['description']) ? $smcFunc['htmlspecialchars']($action['description']) : basename($action['action'])) : ''),
+			));
+		}
 
-	updateSettings(array(
-		'smiley_sets_known' => $modSettings['smiley_sets_known'] . ',' . $name,
-		'smiley_sets_names' => $modSettings['smiley_sets_names'] . "\n" . strtok(basename(isset($_FILES['set_gz']) ? $_FILES['set_gz']['name'] : $_REQUEST['set_gz']), '.'),
-	));
+		package_flush_cache();
 
-	cache_put_data('parsing_smileys', null, 480);
-	cache_put_data('posting_smileys', null, 480);
+		// Time to tell pacman we have a new package installed!
+		package_put_contents($boarddir . '/Packages/installed.list', time());
+		// Credits tag?
+		$credits_tag = (empty($credits_tag)) ? '' : serialize($credits_tag);
+		$smcFunc['db_insert']('',
+			'{db_prefix}log_packages',
+			array(
+				'filename' => 'string', 'name' => 'string', 'package_id' => 'string', 'version' => 'string',
+				'id_member_installed' => 'int', 'member_installed' => 'string','time_installed' => 'int',
+				'install_state' => 'int', 'failed_steps' => 'string', 'themes_installed' => 'string',
+				'member_removed' => 'int', 'db_changes' => 'string', 'credits' => 'string',
+			),
+			array(
+				$smileyInfo['filename'], $smileyInfo['name'], $smileyInfo['id'], $smileyInfo['version'],
+				$user_info['id'], $user_info['name'], time(),
+				1, '', '',
+				0, '', $credits_tag,
+			),
+			array('id_install')
+		);
+
+		logAction('install_package', array('package' => $smcFunc['htmlspecialchars']($smileyInfo['name']), 'version' => $smcFunc['htmlspecialchars']($smileyInfo['version'])), 'admin');
 
-	// @todo Add some confirmation?
-	redirectexit('action=admin;area=smileys');
+		cache_put_data('parsing_smileys', null, 480);
+		cache_put_data('posting_smileys', null, 480);
+	}
+
+	if (file_exists($boarddir . '/Packages/temp'))
+		deltree($boarddir . '/Packages/temp');
+
+	if (!$testing)
+		redirectexit('action=admin;area=smileys');
 }
 
 /**

+ 2 - 1
Sources/MessageIndex.php

@@ -676,7 +676,8 @@ function MessageIndex()
 	);
 
 	// Allow adding new buttons easily.
-	call_integration_hook('integrate_messageindex_buttons');
+	// Note: $context['normal_buttons'] is added for backward compatibility with 2.0, but is deprecated and should not be used
+	call_integration_hook('integrate_messageindex_buttons', &$context['normal_buttons']);
 }
 
 /**

+ 1 - 1
Sources/News.php

@@ -181,7 +181,7 @@ function ShowXmlFeed()
 	);
 
 	// Easy adding of sub actions
- 	call_integration_hook('integrate_xmlfeeds', array(&$subActions));
+ 	call_integration_hook('integrate_xmlfeeds', array($subActions));
 
 	if (empty($_GET['sa']) || !isset($subActions[$_GET['sa']]))
 		$_GET['sa'] = 'recent';

+ 3 - 2
Sources/Packages.php

@@ -752,6 +752,7 @@ function PackageInstallTest()
 		$context['ftp_needed'] = !empty($ftp_status['files']['notwritable']) && !empty($context['package_ftp']);
 	}
 
+	$context['post_url'] = $scripturl .'?action=admin;area=packages;sa=' . ($context['uninstalling'] ? 'uninstall' : 'install') . ($context['ftp_needed'] ? '' : '2') . ';package=' . $context['filename'] . ';pid=' . $context['install_id'];
 	checkSubmitOnce('register');
 }
 
@@ -960,7 +961,7 @@ function PackageInstall()
 	if (!isset($old_version) || $context['is_installed'])
 		$install_log = parsePackageInfo($packageInfo['xml'], false, 'install');
 
-	$context['install_finished'] = false;
+	$install_finished = false;
 
 	// @todo Make a log of any errors that occurred and output them?
 
@@ -1171,7 +1172,7 @@ function PackageInstall()
 		}
 		$smcFunc['db_free_result']($request);
 
-		$context['install_finished'] = true;
+		$install_finished = true;
 	}
 
 	// If there's database changes - and they want them removed - let's do it last!

+ 2 - 2
Sources/Poll.php

@@ -215,7 +215,7 @@ function Vote()
 	}
 
 	// Maybe let a social networking mod log this, or something?
-	call_integration_hook('integrate_poll_vote', array(&$row['id_poll'], &$pollOptions));
+	call_integration_hook('integrate_poll_vote', array($row['id_poll'], $pollOptions));
 
 	// Return to the post...
 	redirectexit('topic=' . $topic . '.' . $_REQUEST['start']);
@@ -978,7 +978,7 @@ function RemovePoll()
 	);
 
 	// A mod might have logged this (social network?), so let them remove, it too
-	call_integration_hook('integrate_poll_remove', array(&$pollID));
+	call_integration_hook('integrate_poll_remove', array($pollID));
 
 	// Take the moderator back to the topic.
 	redirectexit('topic=' . $topic . '.' . $_REQUEST['start']);

+ 1 - 1
Sources/Profile-Modify.php

@@ -1393,7 +1393,7 @@ function editBuddies($memID)
 				unset($new_buddies[$k]);
 		}
 
-		call_integration_hook('integrate_add_buddies', array($memID, &$new_buddies));
+		call_integration_hook('integrate_add_buddies', array($memID, $new_buddies));
 
 		if (!empty($new_buddies))
 		{

+ 0 - 3
Sources/Profile.php

@@ -350,9 +350,6 @@ function ModifyProfile($post_errors = array())
 		),
 	);
 
-	// Let them modify profile areas easily.
-	call_integration_hook('integrate_profile_areas', array(&$profile_areas));
-
 	// Do some cleaning ready for the menu function.
 	$context['password_areas'] = array();
 	$current_area = isset($_REQUEST['area']) ? $_REQUEST['area'] : '';

+ 8 - 8
Sources/Search.php

@@ -292,7 +292,7 @@ function PlushSearch2()
 		),
 	);
 
-	call_integration_hook('integrate_search_weights', array(&$weight_factors));
+	call_integration_hook('integrate_search_weights', array($weight_factors));
 
 	$weight = array();
 	$weight_total = 0;
@@ -591,7 +591,7 @@ function PlushSearch2()
 		'num_replies',
 		'id_msg',
 	);
-	call_integration_hook('integrate_search_sort_columns', array(&$sort_columns));
+	call_integration_hook('integrate_search_sort_columns', array($sort_columns));
 	if (empty($search_params['sort']) && !empty($_REQUEST['sort']))
 		list ($search_params['sort'], $search_params['sort_dir']) = array_pad(explode('|', $_REQUEST['sort']), 2, '');
 	$search_params['sort'] = !empty($search_params['sort']) && in_array($search_params['sort'], $sort_columns) ? $search_params['sort'] : 'relevance';
@@ -606,7 +606,7 @@ function PlushSearch2()
 	$recentMsg = $modSettings['maxMsgID'] - $minMsg;
 
 	// *** Parse the search query
-	call_integration_hook('integrate_search_params', array(&$search_params));
+	call_integration_hook('integrate_search_params', array($search_params));
 
 	/*
 	 * Unfortunately, searching for words like this is going to be slow, so we're blacklisting them.
@@ -615,7 +615,7 @@ function PlushSearch2()
 	 * @todo Maybe only blacklist if they are the only word, or "any" is used?
 	 */
 	$blacklisted_words = array('img', 'url', 'quote', 'www', 'http', 'the', 'is', 'it', 'are', 'if');
-	call_integration_hook('integrate_search_blacklisted_words', array(&$blacklisted_words));
+	call_integration_hook('integrate_search_blacklisted_words', array($blacklisted_words));
 
 	// What are we searching for?
 	if (empty($search_params['search']))
@@ -1088,7 +1088,7 @@ function PlushSearch2()
 							$subject_query_params['excluded_phrases_' . $count++] = empty($modSettings['search_match_words']) || $no_regexp ? '%' . strtr($phrase, array('_' => '\\_', '%' => '\\%')) . '%' : '[[:<:]]' . addcslashes(preg_replace(array('/([\[\]$.+*?|{}()])/'), array('[$1]'), $phrase), '\\\'') . '[[:>:]]';
 						}
 					}
-					call_integration_hook('integrate_subject_only_search_query', array(&$subject_query, &$subject_query_params));
+					call_integration_hook('integrate_subject_only_search_query', array($subject_query, $subject_query_params));
 
 					$relevance = '1000 * (';
 					foreach ($weight_factors as $type => $value)
@@ -1336,7 +1336,7 @@ function PlushSearch2()
 								$subject_query['params']['exclude_phrase_' . $count++] = empty($modSettings['search_match_words']) || $no_regexp ? '%' . strtr($phrase, array('_' => '\\_', '%' => '\\%')) . '%' : '[[:<:]]' . addcslashes(preg_replace(array('/([\[\]$.+*?|{}()])/'), array('[$1]'), $phrase), '\\\'') . '[[:>:]]';
 							}
 						}
-						call_integration_hook('integrate_subject_search_query', array(&$subject_query));
+						call_integration_hook('integrate_subject_search_query', array($subject_query));
 
 						// Nothing to search for?
 						if (empty($subject_query['where']))
@@ -1554,7 +1554,7 @@ function PlushSearch2()
 						$main_query['parameters']['board_query'] = $boardQuery;
 					}
 				}
-				call_integration_hook('integrate_main_search_query', array(&$main_query));
+				call_integration_hook('integrate_main_search_query', array($main_query));
 
 				// Did we either get some indexed results, or otherwise did not do an indexed query?
 				if (!empty($indexedResults) || !$searchAPI->supportsMethod('indexedWordQuery', $query_params))
@@ -2114,7 +2114,7 @@ function prepareSearchContext($reset = false)
 	);
 	$counter++;
 
-	call_integration_hook('integrate_search_message_context', array($counter, &$output));
+	call_integration_hook('integrate_search_message_context', array($counter, $output));
 
 	return $output;
 }

+ 4 - 4
Sources/Subs-Boards.php

@@ -442,7 +442,7 @@ function modifyBoard($board_id, &$boardOptions)
 		fatal_lang_error('no_board');
 
 	$id = $board_id;
-	call_integration_hook('integrate_pre_modify_board', array($id, &$boardOptions));
+	call_integration_hook('integrate_pre_modify_board', array($id, $boardOptions));
 
 	// All things that will be updated in the database will be in $boardUpdates.
 	$boardUpdates = array();
@@ -622,7 +622,7 @@ function modifyBoard($board_id, &$boardOptions)
 	}
 
 	$id = $board_id;
-	call_integration_hook('integrate_modify_board', array($id, &$boardUpdates, &$boardUpdateParameters));
+	call_integration_hook('integrate_modify_board', array($id, $boardUpdates, $boardUpdateParameters));
 
 	// Do the updates (if any).
 	if (!empty($boardUpdates))
@@ -753,7 +753,7 @@ function createBoard($boardOptions)
 		'-1,0', '',
 	);
 
-	call_integration_hook('integrate_create_board', array(&$boardOptions, &$board_columns, &$board_parameters));
+	call_integration_hook('integrate_create_board', array($boardOptions, $board_columns, $board_parameters));
 
 	// Insert a board, the settings are dealt with later.
 	$smcFunc['db_insert']('',
@@ -833,7 +833,7 @@ function deleteBoards($boards_to_remove, $moveChildrenTo = null)
 
 	getBoardTree();
 
-	call_integration_hook('integrate_delete_board', array($boards_to_remove, &$moveChildrenTo));
+	call_integration_hook('integrate_delete_board', array($boards_to_remove, $moveChildrenTo));
 
 	// If $moveChildrenTo is set to null, include the children in the removal.
 	if ($moveChildrenTo === null)

+ 2 - 2
Sources/Subs-Calendar.php

@@ -864,7 +864,7 @@ function insertEvent(&$eventOptions)
 		$eventOptions['start_date'], $eventOptions['end_date'],
 	);
 
-	call_integration_hook('integrate_create_event', array(&$eventOptions, &$event_columns, &$event_parameters));
+	call_integration_hook('integrate_create_event', array($eventOptions, $event_columns, $event_parameters));
 
 	// Insert the event!
 	$smcFunc['db_insert']('',
@@ -926,7 +926,7 @@ function modifyEvent($event_id, &$eventOptions)
 
 	// This is to prevent hooks to modify the id of the event
 	$real_event_id = $event_id;
-	call_integration_hook('integrate_modify_event', array($event_id, &$eventOptions, &$event_columns, &$event_parameters));
+	call_integration_hook('integrate_modify_event', array($event_id, $eventOptions, $event_columns, $event_parameters));
 
 	$smcFunc['db_query']('', '
 		UPDATE {db_prefix}calendar

+ 4 - 4
Sources/Subs-Categories.php

@@ -32,7 +32,7 @@ function modifyCategory($category_id, $catOptions)
 	$catParameters = array();
 
 	$cat_id = $category_id;
-	call_integration_hook('integrate_pre_modify_category', array($cat_id, &$catOptions));
+	call_integration_hook('integrate_pre_modify_category', array($cat_id, $catOptions));
 
 	// Wanna change the categories position?
 	if (isset($catOptions['move_after']))
@@ -95,7 +95,7 @@ function modifyCategory($category_id, $catOptions)
 	}
 
 	$cat_id = $category_id;
-	call_integration_hook('integrate_modify_category', array($cat_id, &$catUpdates, &$catParameters));
+	call_integration_hook('integrate_modify_category', array($cat_id, $catUpdates, $catParameters));
 
 	// Do the updates (if any).
 	if (!empty($catUpdates))
@@ -147,7 +147,7 @@ function createCategory($catOptions)
 		$catOptions['cat_name'],
 	);
 
-	call_integration_hook('integrate_create_category', array(&$catOptions, &$cat_columns, &$cat_parameters));
+	call_integration_hook('integrate_create_category', array($catOptions, $cat_columns, $cat_parameters));
 
 	// Add the category to the database.
 	$smcFunc['db_insert']('',
@@ -188,7 +188,7 @@ function deleteCategories($categories, $moveBoardsTo = null)
 
 	getBoardTree();
 
-	call_integration_hook('integrate_delete_category', array($categories, &$moveBoardsTo));
+	call_integration_hook('integrate_delete_category', array($categories, $moveBoardsTo));
 
 	// With no category set to move the boards to, delete them all.
 	if ($moveBoardsTo === null)

+ 2 - 1
Sources/Subs-Editor.php

@@ -1656,7 +1656,8 @@ function create_control_richedit($editorOptions)
 		);
 
 		// Allow mods to modify BBC buttons.
-		call_integration_hook('integrate_bbc_buttons');
+		// Note: pass the array here is not necessary and is deprecated, but it is ketp for backward compatibility with 2.0
+		call_integration_hook('integrate_bbc_buttons', array(&$context['bbc_tags']));
 
 		// Show the toggle?
 		if (empty($modSettings['disable_wysiwyg']))

+ 1 - 1
Sources/Subs-List.php

@@ -31,7 +31,7 @@ function createList($listOptions)
 	assert((empty($listOptions['default_sort_col']) || isset($listOptions['columns'][$listOptions['default_sort_col']])));
 	assert((!isset($listOptions['form']) || isset($listOptions['form']['href'])));
 
-	call_integration_hook('integrate_' . $listOptions['id'], array(&$listOptions));
+	call_integration_hook('integrate_' . $listOptions['id'], array($listOptions));
 
 	// All the context data will be easily accessible by using a reference.
 	$context[$listOptions['id']] = array();

+ 4 - 4
Sources/Subs-Members.php

@@ -699,7 +699,7 @@ function registerMember(&$regOptions, $return_errors = false)
 	);
 
 	// Call an optional function to validate the users' input.
-	call_integration_hook('integrate_register', array(&$regOptions, &$theme_vars, &$knownInts, &$knownFloats));
+	call_integration_hook('integrate_register', array(&$regOptions, &$theme_vars, $knownInts, $knownFloats));
 
 	$column_names = array();
 	$values = array();
@@ -1065,8 +1065,8 @@ function membersAllowedTo($permission, $board_id = null)
 		SELECT mem.id_member
 		FROM {db_prefix}members AS mem' . ($include_moderators || $exclude_moderators ? '
 			LEFT JOIN {db_prefix}moderators AS mods ON (mods.id_member = mem.id_member AND mods.id_board = {int:board_id})' : '') . '
-		WHERE (' . ($include_moderators ? 'mods.id_member IS NOT NULL OR ' : '') . 'mem.id_group IN ({array_int:member_groups_allowed}) OR FIND_IN_SET({raw:member_group_allowed_implode}, mem.additional_groups) != 0)' . (empty($member_groups['denied']) ? '' : '
-			AND NOT (' . ($exclude_moderators ? 'mods.id_member IS NOT NULL OR ' : '') . 'mem.id_group IN ({array_int:member_groups_denied}) OR FIND_IN_SET({raw:member_group_denied_implode}, mem.additional_groups) != 0)'),
+		WHERE (' . ($include_moderators ? 'mods.id_member IS NOT NULL OR ' : '') . 'mem.id_group IN ({array_int:member_groups_allowed}) OR FIND_IN_SET({raw:member_group_allowed_implode}, mem.additional_groups) != 0 OR mem.id_post_group IN ({array_int:member_groups_allowed}))' . (empty($member_groups['denied']) ? '' : '
+			AND NOT (' . ($exclude_moderators ? 'mods.id_member IS NOT NULL OR ' : '') . 'mem.id_group IN ({array_int:member_groups_denied}) OR FIND_IN_SET({raw:member_group_denied_implode}, mem.additional_groups) != 0 OR mem.id_post_group IN ({array_int:member_groups_denied}))'),
 		array(
 			'member_groups_allowed' => $member_groups['allowed'],
 			'member_groups_denied' => $member_groups['denied'],
@@ -1173,7 +1173,7 @@ function reattributePosts($memID, $email = false, $membername = false, $post_cou
 	);
 
 	// Allow mods with their own post tables to reattribute posts as well :)
- 	call_integration_hook('integrate_reattribute_posts', array(&$memID, &$email, &$membername, &$post_count));
+ 	call_integration_hook('integrate_reattribute_posts', array($memID, $email, $membername, $post_count));
 }
 
 /**

+ 5 - 5
Sources/Subs-Post.php

@@ -1829,7 +1829,7 @@ function createPost(&$msgOptions, &$topicOptions, &$posterOptions)
 	$new_topic = empty($topicOptions['id']);
 
 	$message_columns = array(
-		'id_board' => 'int', 'id_topic' => 'int', 'id_member' => 'int', 'subject' => 'string-255', 'body' => (!empty($modSettings['max_messageLength']) && $modSettings['max_messageLength'] > 65534 ? 'string-' . $modSettings['max_messageLength'] : (isset($modSettings['max_messageLength']) && $modSettings['max_messageLength'] == 0 ? 'string' : 'string-65534')),
+		'id_board' => 'int', 'id_topic' => 'int', 'id_member' => 'int', 'subject' => 'string-255', 'body' => (!empty($modSettings['max_messageLength']) && $modSettings['max_messageLength'] > 65534 ? 'string-' . $modSettings['max_messageLength'] : (empty($modSettings['max_messageLength']) ? 'string' : 'string-65534')),
 		'poster_name' => 'string-255', 'poster_email' => 'string-255', 'poster_time' => 'int', 'poster_ip' => 'string-255',
 		'smileys_enabled' => 'int', 'modified_name' => 'string', 'icon' => 'string-16', 'approved' => 'int',
 	);
@@ -1841,7 +1841,7 @@ function createPost(&$msgOptions, &$topicOptions, &$posterOptions)
 	);
 
 	// What if we want to do anything with posts?
-	call_integration_hook('integrate_create_post', array(&$msgOptions, &$topicOptions, &$posterOptions, &$message_columns, &$message_parameters));
+	call_integration_hook('integrate_create_post', array($msgOptions, $topicOptions, $posterOptions, $message_columns, $message_parameters));
 
 	// Insert the post.
 	$smcFunc['db_insert']('',
@@ -1884,7 +1884,7 @@ function createPost(&$msgOptions, &$topicOptions, &$posterOptions)
 			$topicOptions['redirect_expires'] === null ? 0 : $topicOptions['redirect_expires'], $topicOptions['redirect_topic'] === null ? 0 : $topicOptions['redirect_topic'],
 		);
 
-		call_integration_hook('integrate_before_create_topic', array(&$msgOptions, &$topicOptions, &$posterOptions, &$topic_columns, &$topic_parameters));
+		call_integration_hook('integrate_before_create_topic', array($msgOptions, $topicOptions, $posterOptions, $topic_columns, $topic_parameters));
 
 		$smcFunc['db_insert']('',
 			'{db_prefix}topics',
@@ -1960,7 +1960,7 @@ function createPost(&$msgOptions, &$topicOptions, &$posterOptions)
 				'is_sticky = {int:is_sticky}',
 			);
 
-		call_integration_hook('integrate_modify_topic', array(&$topics_columns, &$update_parameters, &$msgOptions, &$topicOptions, &$posterOptions));
+		call_integration_hook('integrate_modify_topic', array($topics_columns, $update_parameters, $msgOptions, $topicOptions, $posterOptions));
 
 		// Update the number of replies and the lock/sticky status.
 		$smcFunc['db_query']('', '
@@ -2147,7 +2147,7 @@ function modifyPost(&$msgOptions, &$topicOptions, &$posterOptions)
 		'id_msg' => $msgOptions['id'],
 	);
 
-	call_integration_hook('integrate_modify_post', array(&$messages_columns, &$update_parameters, &$msgOptions, &$topicOptions, &$posterOptions, &$messageInts));
+	call_integration_hook('integrate_modify_post', array($messages_columns, $update_parameters, $msgOptions, $topicOptions, $posterOptions, $messageInts));
 
 	foreach ($messages_columns as $var => $val)
 	{

+ 3 - 3
Sources/Subs.php

@@ -882,7 +882,7 @@ function parse_bbc($message, $smileys = true, $cache_id = '', $parse_tags = arra
 	}
 
 	// Allow mods access before entering the main parse_bbc loop
-	call_integration_hook('integrate_pre_parsebbc', array(&$message, &$smileys, &$cache_id, &$parse_tags));
+	call_integration_hook('integrate_pre_parsebbc', array($message, $smileys, $cache_id, $parse_tags));
 
 	// Sift out the bbc for a performance improvement.
 	if (empty($bbc_codes) || $message === false || !empty($parse_tags))
@@ -2379,7 +2379,7 @@ function parse_bbc($message, $smileys = true, $cache_id = '', $parse_tags = arra
 	$message = strtr($message, array('  ' => ' &nbsp;', "\r" => '', "\n" => '<br />', '<br /> ' => '<br />&nbsp;', '&#13;' => "\n"));
 
 	// Allow mods access to what parse_bbc created
-	call_integration_hook('integrate_post_parsebbc', array(&$message, &$smileys, &$cache_id, &$parse_tags));
+	call_integration_hook('integrate_post_parsebbc', array($message, $smileys, $cache_id, $parse_tags));
 
 	// Cache the output if it took some time...
 	if (isset($cache_key, $cache_t) && array_sum(explode(' ', microtime())) - array_sum(explode(' ', $cache_t)) > 0.05)
@@ -4011,7 +4011,7 @@ function setupMenuContext()
 
 	// Not all actions are simple.
 	if (!empty($needs_action_hook))
-		call_integration_hook('integrate_current_action', array(&$current_action));
+		call_integration_hook('integrate_current_action', array($current_action));
 
 	if (isset($context['menu_buttons'][$current_action]))
 		$context['menu_buttons'][$current_action]['active_button'] = true;

+ 2 - 2
Sources/Xml.php

@@ -37,7 +37,7 @@ function XMLhttpMain()
 	);
 
 	// Easy adding of sub actions
- 	call_integration_hook('integrate_xmlhttp', array(&$sub_actions));
+ 	call_integration_hook('integrate_xmlhttp', array($sub_actions));
 
 	if (!isset($_REQUEST['sa'], $sub_actions[$_REQUEST['sa']]))
 		fatal_lang_error('no_access', false);
@@ -83,7 +83,7 @@ function ListMessageIcons()
 
 function EnableCoreFeatures()
 {
-	global $context, $smcFunc, $sourcedir, $modSettings, $txt;
+	global $context, $smcFunc, $sourcedir, $modSettings, $txt, $boarddir, $settings;
 
 	$context['xml_data'] = array();
 	// Just in case, maybe we don't need it

+ 1 - 1
Themes/default/BoardIndex.template.php

@@ -18,7 +18,7 @@ function template_main()
 	if (!$settings['show_stats_index'])
 		echo '
 	<div id="index_common_stats">
-		', $txt['members'], ': ', $context['common_stats']['total_members'], ' &nbsp;&#8226;&nbsp; ', $txt['posts_made'], ': ', $context['common_stats']['total_posts'], ' &nbsp;&#8226;&nbsp; ', $txt['topics'], ': ', $context['common_stats']['total_topics'], '
+		', $txt['members'], ': ', $context['common_stats']['total_members'], ' &nbsp;&#8226;&nbsp; ', $txt['posts_made'], ': ', $context['common_stats']['total_posts'], ' &nbsp;&#8226;&nbsp; ', $txt['topics_made'], ': ', $context['common_stats']['total_topics'], '<br />
 		', $settings['show_latest_member'] ? ' ' . sprintf($txt['welcome_newest_member'], ' <strong>' . $context['common_stats']['latest_member']['link'] . '</strong>') : '' , '
 	</div>';
 

+ 4 - 0
Themes/default/GenericControls.template.php

@@ -77,6 +77,10 @@ function template_control_richedit($editor_id, $smileyContainer = null, $bbcCont
 			echo '
 					}';
 		}
+		else
+			echo ',
+					emoticons:
+					{}';
 
 		if ($context['show_bbc'] && $bbcContainer !== null)
 		{

+ 6 - 1
Themes/default/MessageIndex.template.php

@@ -117,6 +117,11 @@ function template_main()
 		}
 		echo '
 			</tbody>
+			<tbody class="divider">
+				<tr>
+					<td colspan="4"></td>
+				</tr>
+			</tbody>
 		</table>
 	</div>';
 	}
@@ -140,7 +145,7 @@ function template_main()
 		<h3 class="catbg">', $context['name'], '</h3>
 	</div>
 	<p class="description_board">
-		', $context['description'], '<br/>';
+		', $context['description'], '<br />';
 	else
 		echo '
 	<p class="description_board">';

+ 1 - 1
Themes/default/Packages.template.php

@@ -92,7 +92,7 @@ function template_view_package()
 	}
 
 	echo '
-		<form action="', $scripturl, '?action=admin;area=packages;sa=', $context['uninstalling'] ? 'uninstall' : 'install', $context['ftp_needed'] ? '' : '2', ';package=', $context['filename'], ';pid=', $context['install_id'], '" onsubmit="submitonce(this);" method="post" accept-charset="', $context['character_set'], '">
+		<form action="', $context['post_url'], '" onsubmit="submitonce(this);" method="post" accept-charset="', $context['character_set'], '">
 			<div class="cat_bar">
 				<h3 class="catbg">
 					', $context['uninstalling'] ? $txt['package_uninstall_actions'] : $txt['package_install_actions'], ' &quot;', $context['package_name'], '&quot;

+ 1 - 0
Themes/default/Themes.template.php

@@ -409,6 +409,7 @@ function template_set_options()
 					</dl>
 					<input type="submit" name="submit" value="', $txt['save'], '" class="button_submit" />
 					<input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '" />
+					<input type="hidden" name="', $context['admin-sto_token_var'], '" value="', $context['admin-sto_token'], '" />
 				</div>
 			</div>
 		</form>

+ 1 - 1
Themes/default/css/jquery.sceditor.css

@@ -252,7 +252,7 @@ div.sceditor-dropdown, div.sceditor-dropdown div {
 	background: url('../images/bbc/shadow.png');
 }
 .sceditor-button-move div {
-	background: url('../images/bbc/move.png');
+	background: url('../images/bbc/move.gif');
 }
 .sceditor-button-superscript div {
 	background: url('../images/bbc/sup.png');

+ 2 - 0
Themes/default/index.template.php

@@ -584,6 +584,8 @@ function template_button_strip($button_strip, $direction = '', $strip_options =
 	$buttons = array();
 	foreach ($button_strip as $key => $value)
 	{
+		// @todo this check here doesn't make much sense now (from 2.1 on), it should be moved to where the button array is generated
+		// Kept for backward compatibility
 		if (!isset($value['test']) || !empty($context[$value['test']]))
 			$buttons[] = '
 				<li><a' . (isset($value['id']) ? ' id="button_strip_' . $value['id'] . '"' : '') . ' class="button_strip_' . $key . (isset($value['active']) ? ' active' : '') . '" href="' . $value['url'] . '"' . (isset($value['custom']) ? ' ' . $value['custom'] : '') . '><span>' . $txt[$value['text']] . '</span></a></li>';

+ 2 - 0
Themes/default/languages/ManageScheduledTasks.english.php

@@ -33,6 +33,8 @@ $txt['scheduled_task_paid_subscriptions'] = 'Paid Subscription Checks';
 $txt['scheduled_task_desc_paid_subscriptions'] = 'Sends out any necessary paid subscription reminders and removes expired member subscriptions.';
 $txt['scheduled_task_remove_topic_redirect'] = 'Remove MOVED: redirection topics';
 $txt['scheduled_task_desc_remove_topic_redirect'] = 'Deletes "MOVED:" topic notifications as specified when the moved notice was created.';
+$txt['scheduled_task_remove_temp_attachments'] = 'Remove temporary attachment files';
+$txt['scheduled_task_desc_remove_temp_attachments'] = 'Deletes temporary files created while attaching a file to a post that for any reason weren\'t renamed or deleted before.';
 
 $txt['scheduled_task_reg_starting'] = 'Starting at %1$s';
 $txt['scheduled_task_reg_repeating'] = 'repeating every %1$d %2$s';

+ 2 - 1
Themes/default/languages/ManageSettings.english.php

@@ -205,7 +205,8 @@ $txt['setting_warning_show_all'] = 'All Users';
 
 $txt['signature_settings'] = 'Signature Settings';
 $txt['signature_settings_desc'] = 'Use the settings on this page to decide how member signatures should be treated in SMF.';
-$txt['signature_settings_warning'] = 'Note that settings are not applied to existing signatures by default. Click <a href="' . $scripturl . '?action=admin;area=featuresettings;sa=sig;apply;%2$s=%1$s">here</a> to apply updated rules to existing signatures.';
+$txt['signature_settings_warning'] = 'Note that settings are not applied to existing signatures by default. <a href="' . $scripturl . '?action=admin;area=featuresettings;sa=sig;apply;%2$s=%1$s">Run the process now</a>';
+$txt['signature_settings_applied'] = 'The updated rules have been applied to the existing signatures.';
 $txt['signature_enable'] = 'Enable signatures';
 $txt['signature_max_length'] = 'Maximum allowed characters';
 $txt['signature_max_lines'] = 'Maximum amount of lines';

+ 1 - 0
Themes/default/languages/index.english.php

@@ -83,6 +83,7 @@ $txt['position'] = 'Position';
 $txt['profile_of'] = 'View the profile of';
 $txt['total'] = 'Total';
 $txt['posts_made'] = 'Posts';
+$txt['topics_made'] = 'Topics';
 $txt['website'] = 'Website';
 $txt['register'] = 'Register';
 $txt['warning_status'] = 'Warning Status';

+ 2 - 1
Themes/default/scripts/jquery.sceditor.bbcode.js

@@ -114,6 +114,7 @@
 				ftp: { txtExec: ["[ftp]", "[/ftp]"] },
 				tt: { txtExec: ["[tt]", "[/tt]"] },
 				glow: { txtExec: ["[glow=red,2,300]", "[/glow]"] },
+				move: { txtExec: ["[[move]", "[/move]"] },
 				shadow: { txtExec: ["[shadow=red,left]", "[/shadow]"] },
 				pre: { txtExec: ["[pre]", "[/pre]"] },
 				// @todo: check tooltip
@@ -527,7 +528,7 @@
 						if(attrs.charAt(0) === "=")
 							attrs = "defaultattr" + attrs;
 
-						if (typeof base.bbcodes[bbcode].attrs == 'function')
+						if (typeof base.bbcodes[bbcode] != 'undefined' && typeof base.bbcodes[bbcode].attrs == 'function')
 						{
 							var declaredAttrs = base.bbcodes[bbcode].attrs();
 							var attrArray = new Array;

+ 2 - 2
Themes/default/scripts/jquery.sceditor.js

@@ -286,8 +286,8 @@
 		initEditor = function () {
 			var $doc, $body;
 
-			$textEditor	= $('<textarea></textarea>').hide();
-			$wysiwygEditor	= $('<iframe frameborder="0"></iframe>');
+			$textEditor	= $('<textarea></textarea>').attr('tabindex', $textarea.attr('tabindex')).hide();
+			$wysiwygEditor	= $('<iframe frameborder="0"></iframe>').attr('tabindex', $textarea.attr('tabindex'));
 
 			if(window.location.protocol === "https:")
 				$wysiwygEditor.attr("src", "javascript:false");

+ 8 - 6
index.php

@@ -194,7 +194,7 @@ function smf_main()
 		fatal_lang_error('not_a_topic', false);
 
 	$no_stat_actions = array('dlattach', 'findmember', 'jsoption', 'requestmembers', 'smstats', '.xml', 'xmlhttp', 'verificationcode', 'viewquery', 'viewsmfile');
-	call_integration_hook('integrate_pre_log_stats', array(&$no_stat_actions));
+	call_integration_hook('integrate_pre_log_stats', array($no_stat_actions));
 	// Do some logging, unless this is an attachment, avatar, toggle of editor buttons, theme option, XML feed etc.
 	if (empty($_REQUEST['action']) || !in_array($_REQUEST['action'], $no_stat_actions))
 	{
@@ -234,11 +234,13 @@ function smf_main()
 		// Action and board are both empty... BoardIndex! Unless someone else wants to do something different.
 		if (empty($board) && empty($topic))
 		{
-			$call = '';
-			call_integration_hook('integrate_default_action', array(&$call));
-			$call = strpos($call, '::') !== false ? explode('::', $call) : $call;
-			if (!empty($call) && is_callable($call))
-				return $call;
+			$defaultActions = call_integration_hook('integrate_default_action');
+			foreach ($defaultActions as $defaultAction)
+			{
+				$call = strpos($defaultAction, '::') !== false ? explode('::', $defaultAction) : $defaultAction;
+				if (!empty($call) && is_callable($call))
+					return $call;
+			}
 
 			require_once($sourcedir . '/BoardIndex.php');
 

+ 7 - 1
other/install_2-1_postgresql.sql

@@ -2565,12 +2565,18 @@ VALUES (1, 1, 1, 1, 0, 0);
 # --------------------------------------------------------
 
 
+#
+# Sequence for table `user_drafts`
+#
+
+CREATE SEQUENCE {$db_prefix}user_drafts_seq;
+
 #
 # Table structure for table `user_drafts`
 #
 
 CREATE TABLE {$db_prefix}user_drafts (
-  id_draft int unsigned NOT NULL auto_increment,
+  id_draft int default nextval('{$db_prefix}user_drafts_seq'),
   id_topic int unsigned NOT NULL default '0',
   id_board smallint unsigned NOT NULL default '0',
   id_reply int unsigned NOT NULL default '0',

+ 2 - 3
other/install_2-1_sqlite.sql

@@ -2204,7 +2204,7 @@ VALUES (1, 1, 1, 1, 0, 0);
 #
 
 CREATE TABLE {$db_prefix}user_drafts (
-  id_draft int unsigned NOT NULL auto_increment,
+  id_draft int primary key,
   id_topic int unsigned NOT NULL default '0',
   id_board smallint unsigned NOT NULL default '0',
   id_reply int unsigned NOT NULL default '0',
@@ -2218,8 +2218,7 @@ CREATE TABLE {$db_prefix}user_drafts (
   locked smallint NOT NULL default '0',
   is_sticky smallint NOT NULL default '0',
   to_list varchar(255) NOT NULL default '',
-  outbox smallint NOT NULL default '0',
-  PRIMARY KEY (id_draft)
+  outbox smallint NOT NULL default '0'
 );
 
 #

+ 2 - 2
other/upgrade_2-0_sqlite.sql

@@ -957,8 +957,8 @@ $request = upgrade_query("
 	FROM {$db_prefix}membergroups
 	WHERE id_group = 1
 	LIMIT 1");
-list ($admin_group_type) = mysql_fetch_row($request);
-mysql_free_result($request);
+list ($admin_group_type) = $smcFunc['db_fetch_row']($request);
+$smcFunc['db_free_result']($request);
 
 // Not protected means we haven't updated yet!
 if ($admin_group_type != 1)

+ 4 - 4
other/upgrade_2-1_postgresql.sql

@@ -282,12 +282,12 @@ if (@$modSettings['smfVersion'] < '2.1')
 		FROM {$db_prefix}board_permissions
 		WHERE permission = 'post_unapproved_topics'");
 	$inserts = array();
-	while ($row = mysql_fetch_assoc($request))
+	while ($row = $smcFunc['db_fetch_assoc']($request))
 	{
 		$inserts[] = "($row[id_group], $row[id_board], 'post_draft', $row[add_deny])";
 		$inserts[] = "($row[id_group], $row[id_board], 'post_autosave_draft', $row[add_deny])";
 	}
-	mysql_free_result($request);
+	$smcFunc['db_free_result']($request);
 
 	if (!empty($inserts))
 		upgrade_query("
@@ -302,12 +302,12 @@ if (@$modSettings['smfVersion'] < '2.1')
 		FROM {$db_prefix}permissions
 		WHERE permission = 'pm_send'");
 	$inserts = array();
-	while ($row = mysql_fetch_assoc($request))
+	while ($row = $smcFunc['db_fetch_assoc']($request))
 	{
 		$inserts[] = "($row[id_group], 'pm_draft', $row[add_deny])";
 		$inserts[] = "($row[id_group], 'pm_autosave_draft', $row[add_deny])";
 	}
-	mysql_free_result($request);
+	$smcFunc['db_free_result']($request);
 
 	if (!empty($inserts))
 		upgrade_query("

+ 4 - 4
other/upgrade_2-1_sqlite.sql

@@ -258,12 +258,12 @@ if (@$modSettings['smfVersion'] < '2.1')
 		FROM {$db_prefix}board_permissions
 		WHERE permission = 'post_unapproved_topics'");
 	$inserts = array();
-	while ($row = mysql_fetch_assoc($request))
+	while ($row = $smcFunc['db_fetch_assoc']($request))
 	{
 		$inserts[] = "($row[id_group], $row[id_board], 'post_draft', $row[add_deny])";
 		$inserts[] = "($row[id_group], $row[id_board], 'post_autosave_draft', $row[add_deny])";
 	}
-	mysql_free_result($request);
+	$smcFunc['db_free_result']($request);
 
 	if (!empty($inserts))
 		upgrade_query("
@@ -278,12 +278,12 @@ if (@$modSettings['smfVersion'] < '2.1')
 		FROM {$db_prefix}permissions
 		WHERE permission = 'pm_send'");
 	$inserts = array();
-	while ($row = mysql_fetch_assoc($request))
+	while ($row = $smcFunc['db_fetch_assoc']($request))
 	{
 		$inserts[] = "($row[id_group], 'pm_draft', $row[add_deny])";
 		$inserts[] = "($row[id_group], 'pm_autosave_draft', $row[add_deny])";
 	}
-	mysql_free_result($request);
+	$smcFunc['db_free_result']($request);
 
 	if (!empty($inserts))
 		upgrade_query("