function jetpack_protect_save_whitelist($whitelist)
{
    $whitelist_error = false;
    $new_items = array();
    if (!is_array($whitelist)) {
        return new WP_Error('invalid_parameters', __('Expecting an array', 'jetpack'));
    }
    // validate each item
    foreach ($whitelist as $item) {
        $item = trim($item);
        if (empty($item)) {
            continue;
        }
        $range = false;
        if (strpos($item, '-')) {
            $item = explode('-', $item);
            $range = true;
        }
        $new_item = new stdClass();
        $new_item->range = $range;
        if (!empty($range)) {
            $low = trim($item[0]);
            $high = trim($item[1]);
            if (!filter_var($low, FILTER_VALIDATE_IP) || !filter_var($high, FILTER_VALIDATE_IP)) {
                $whitelist_error = true;
                break;
            }
            if (!jetpack_convert_ip_address($low) || !jetpack_convert_ip_address($high)) {
                $whitelist_error = true;
                break;
            }
            $new_item->range_low = $low;
            $new_item->range_high = $high;
        } else {
            if (!filter_var($item, FILTER_VALIDATE_IP)) {
                $whitelist_error = true;
                break;
            }
            if (!jetpack_convert_ip_address($item)) {
                $whitelist_error = true;
                break;
            }
            $new_item->ip_address = $item;
        }
        $new_items[] = $new_item;
    }
    // end item loop
    if (!empty($whitelist_error)) {
        return new WP_Error('invalid_ip', __('One of your IP addresses was not valid.', 'jetpack'));
    }
    update_site_option('jetpack_protect_whitelist', $new_items);
    return true;
}
function jetpack_protect_save_whitelist($whitelist, $global = false)
{
    $whitelist_error = false;
    $new_items = array();
    if (!is_array($whitelist)) {
        return new WP_Error('invalid_parameters', __('Expecting an array', 'jetpack'));
    }
    if ($global && !is_multisite()) {
        return new WP_Error('invalid_parameters', __('Cannot use global flag on non-multisites', 'jetpack'));
    }
    if ($global && !current_user_can('manage_network')) {
        return new WP_Error('permission_denied', __('Only super admins can edit the global whitelist', 'jetpack'));
    }
    // validate each item
    foreach ($whitelist as $item) {
        $item = trim($item);
        if (empty($item)) {
            continue;
        }
        $range = false;
        if (strpos($item, '-')) {
            $item = explode('-', $item);
            $range = true;
        }
        $new_item = new stdClass();
        $new_item->range = $range;
        if (!empty($range)) {
            $low = trim($item[0]);
            $high = trim($item[1]);
            if (!filter_var($low, FILTER_VALIDATE_IP) || !filter_var($high, FILTER_VALIDATE_IP)) {
                $whitelist_error = true;
                break;
            }
            if (!jetpack_convert_ip_address($low) || !jetpack_convert_ip_address($high)) {
                $whitelist_error = true;
                break;
            }
            $new_item->range_low = $low;
            $new_item->range_high = $high;
        } else {
            if (!filter_var($item, FILTER_VALIDATE_IP)) {
                $whitelist_error = true;
                break;
            }
            if (!jetpack_convert_ip_address($item)) {
                $whitelist_error = true;
                break;
            }
            $new_item->ip_address = $item;
        }
        $new_items[] = $new_item;
    }
    // end item loop
    if (!empty($whitelist_error)) {
        return new WP_Error('invalid_ip', __('One of your IP addresses was not valid.', 'jetpack'));
    }
    if ($global) {
        update_site_option('jetpack_protect_global_whitelist', $new_items);
        // once a user has saved their global whitelist, we can permanently remove the legacy option
        delete_site_option('jetpack_protect_whitelist');
    } else {
        Jetpack_Options::update_option('protect_whitelist', $new_items);
    }
    return true;
}