diff --git a/wp-admin/includes/misc.php b/wp-admin/includes/misc.php index bb7a9b29db..ba7e8ff39f 100644 --- a/wp-admin/includes/misc.php +++ b/wp-admin/includes/misc.php @@ -170,4 +170,71 @@ function show_message($message) { echo "

$message

\n"; } +/* Whitelist functions */ +function register_setting($option_group, $option_name, $sanitize_callback = '') { + return add_option_update_handler($option_group, $option_name, $sanitize_callback); +} + +function unregister_setting($option_group, $option_name, $sanitize_callback = '') { + return remove_option_update_handler($option_group, $option_name, $sanitize_callback); +} + +function add_option_update_handler($option_group, $option_name, $sanitize_callback = '') { + global $new_whitelist_options; + $new_whitelist_options[ $option_group ][] = $option_name; + if ( $sanitize_callback != '' ) + add_filter( "sanitize_option_{$option_name}", $sanitize_callback ); +} + +function remove_option_update_handler($option_group, $option_name, $sanitize_callback = '') { + global $new_whitelist_options; + $pos = array_search( $option_name, $new_whitelist_options ); + if ( $pos !== false ) + unset( $new_whitelist_options[ $option_group ][ $pos ] ); + if ( $sanitize_callback != '' ) + remove_filter( "sanitize_option_{$option_name}", $sanitize_callback ); +} + +function option_update_filter( $options ) { + global $new_whitelist_options; + + if ( is_array( $new_whitelist_options ) ) + $options = add_option_whitelist( $new_whitelist_options, $options ); + + return $options; +} +add_filter( 'whitelist_options', 'option_update_filter' ); + +function add_option_whitelist( $new_options, $options = '' ) { + if( $options == '' ) { + global $whitelist_options; + } else { + $whitelist_options = $options; + } + foreach( $new_options as $page => $keys ) { + foreach( $keys as $key ) { + $pos = array_search( $key, $whitelist_options[ $page ] ); + if( $pos === false ) + $whitelist_options[ $page ][] = $key; + } + } + return $whitelist_options; +} + +function remove_option_whitelist( $del_options, $options = '' ) { + if( $options == '' ) { + global $whitelist_options; + } else { + $whitelist_options = $options; + } + foreach( $del_options as $page => $keys ) { + foreach( $keys as $key ) { + $pos = array_search( $key, $whitelist_options[ $page ] ); + if( $pos !== false ) + unset( $whitelist_options[ $page ][ $pos ] ); + } + } + return $whitelist_options; +} + ?> diff --git a/wp-admin/options-discussion.php b/wp-admin/options-discussion.php index 00ca9a0238..fe063aac62 100644 --- a/wp-admin/options-discussion.php +++ b/wp-admin/options-discussion.php @@ -18,7 +18,8 @@ include('admin-header.php');

- + + @@ -159,7 +160,6 @@ echo apply_filters('default_avatar_select', $avatar_list);

-

diff --git a/wp-admin/options-general.php b/wp-admin/options-general.php index 64f00500e4..aac087e864 100644 --- a/wp-admin/options-general.php +++ b/wp-admin/options-general.php @@ -18,7 +18,8 @@ include('./admin-header.php');

- + +
@@ -120,7 +121,6 @@ endfor;

-

diff --git a/wp-admin/options-misc.php b/wp-admin/options-misc.php index e5c082eac5..487a81f29f 100644 --- a/wp-admin/options-misc.php +++ b/wp-admin/options-misc.php @@ -19,7 +19,8 @@ include('admin-header.php');

- + +

@@ -158,7 +159,6 @@ include('admin-header.php');

-

diff --git a/wp-admin/options-privacy.php b/wp-admin/options-privacy.php index 9e3d9cad82..e787f07b4d 100644 --- a/wp-admin/options-privacy.php +++ b/wp-admin/options-privacy.php @@ -18,7 +18,8 @@ include('./admin-header.php');

- + +
@@ -34,7 +35,6 @@ include('./admin-header.php');

-

diff --git a/wp-admin/options-reading.php b/wp-admin/options-reading.php index 39ecab9a5d..8cedc76350 100644 --- a/wp-admin/options-reading.php +++ b/wp-admin/options-reading.php @@ -18,7 +18,8 @@ include('admin-header.php');

- + +
@@ -74,7 +75,6 @@ include('admin-header.php');

-

diff --git a/wp-admin/options-writing.php b/wp-admin/options-writing.php index 6f0ed91bd3..0d7d6b2c31 100644 --- a/wp-admin/options-writing.php +++ b/wp-admin/options-writing.php @@ -18,8 +18,8 @@ include('admin-header.php');

- - + + @@ -138,7 +138,6 @@ endforeach;

-

diff --git a/wp-admin/options.php b/wp-admin/options.php index 1ac910175f..ed67687d02 100644 --- a/wp-admin/options.php +++ b/wp-admin/options.php @@ -21,6 +21,19 @@ $parent_file = 'options-general.php'; wp_reset_vars(array('action')); +$whitelist_options = array( + 'general' => array('blogname', 'blogdescription', 'admin_email', 'users_can_register', 'gmt_offset', 'date_format', 'time_format', 'start_of_week', 'comment_registration', 'default_role'), + 'discussion' => array( 'default_pingback_flag', 'default_ping_status', 'default_comment_status', 'comments_notify', 'moderation_notify', 'comment_moderation', 'require_name_email', 'comment_whitelist', 'comment_max_links', 'moderation_keys', 'blacklist_keys', 'show_avatars', 'avatar_rating' ), + 'misc' => array( 'hack_file', 'use_linksupdate', 'uploads_use_yearmonth_folders', 'upload_path', 'thumbnail_size_w', 'thumbnail_size_h', 'thumbnail_crop', 'medium_size_w', 'medium_size_h', 'image_default_size', 'image_default_align', 'image_default_link_type', 'large_size_w', 'large_size_h' ), + 'privacy' => array( 'blog_public' ), + 'reading' => array( 'posts_per_page', 'posts_per_rss', 'rss_use_excerpt', 'blog_charset', 'gzipcompression', 'show_on_front', 'page_on_front', 'page_for_posts' ), + 'writing' => array( 'default_post_edit_rows', 'use_smilies', 'ping_sites', 'mailserver_url', 'mailserver_port', 'mailserver_login', 'mailserver_pass', 'default_category', 'default_email_category', 'use_balanceTags', 'default_link_category', 'enable_app', 'enable_xmlrpc' ), + 'options' => array( '' ) ); +if ( !defined( 'WP_SITEURL' ) ) $whitelist_options['general'][] = 'siteurl'; +if ( defined( 'WP_HOME' ) ) $whitelist_options['general'][] = 'home'; + +$whitelist_options = apply_filters( 'whitelist_options', $whitelist_options ); + if ( !current_user_can('manage_options') ) wp_die(__('Cheatin’ uh?')); @@ -29,15 +42,16 @@ switch($action) { case 'update': $any_changed = 0; - check_admin_referer('update-options'); + $option_page = $_POST[ 'option_page' ]; + check_admin_referer( $option_page . '-options' ); - if ( !$_POST['page_options'] ) { - foreach ( (array) $_POST as $key => $value) { - if ( !in_array($key, array('_wpnonce', '_wp_http_referer')) ) - $options[] = $key; - } + if ( !isset( $whitelist_options[ $option_page ] ) ) + wp_die( __( 'Error! Options page not found.' ) ); + + if ( $option_page == 'options' ) { + $options = explode(',', stripslashes( $_POST[ 'page_options' ] )); } else { - $options = explode(',', stripslashes($_POST['page_options'])); + $options = $whitelist_options[ $option_page ]; } if ($options) { @@ -63,8 +77,9 @@ default:

- + +
get_results("SELECT * FROM $wpdb->options ORDER BY option_name");