Esempio n. 1
0
function pretty_run_maintenance($installing = false)
{
    global $boarddir, $context, $modSettings, $smcFunc;
    $context['pretty']['maintenance_tasks'] = array();
    //	Get the array of actions
    $indexphp = file_get_contents($boarddir . '/index.php');
    preg_match('~actionArray\\s*=\\s*array[^;]+~', $indexphp, $actionArrayText);
    preg_match_all('~\'([^\']+)\'\\s*=>~', $actionArrayText[0], $actionArray, PREG_PATTERN_ORDER);
    $context['pretty']['action_array'] = $actionArray[1];
    if (function_exists('call_integration_hook')) {
        $dummy = array();
        call_integration_hook('integrate_actions', array(&$dummy));
        $context['pretty']['action_array'] += array_keys($dummy);
    }
    $context['pretty']['maintenance_tasks'][] = 'Updating the array of actions';
    //	Update the list of boards
    //	Get the current pretty board urls, or make new arrays if there are none
    $pretty_board_urls = isset($modSettings['pretty_board_urls']) ? unserialize($modSettings['pretty_board_urls']) : array();
    $pretty_board_lookup_old = isset($modSettings['pretty_board_lookup']) ? unserialize($modSettings['pretty_board_lookup']) : array();
    //	Fix old boards by replacing ' with \x12
    $pretty_board_urls = str_replace("'", "", $pretty_board_urls);
    $pretty_board_lookup = array();
    foreach ($pretty_board_lookup_old as $board => $id) {
        $pretty_board_lookup[str_replace("'", "", $board)] = $id;
    }
    //	Fix old topics too
    $smcFunc['db_query']('', '
		UPDATE {db_prefix}pretty_topic_urls
		SET pretty_url = REPLACE(pretty_url, {string:old_quote}, {string:new_quote})', array('old_quote' => "'", 'new_quote' => "", 'db_error_skip' => true));
    $context['pretty']['maintenance_tasks'][] = 'Fixing any old boards and topics with broken quotes';
    //	Get the board names
    $query = $smcFunc['db_query']('', "\n\t\tSELECT id_board, name\n\t\tFROM {db_prefix}boards");
    //	Process each board
    while ($row = $smcFunc['db_fetch_assoc']($query)) {
        //	Don't replace the board urls if they already exist
        if (!isset($pretty_board_urls[$row['id_board']]) || $pretty_board_urls[$row['id_board']] == '' || in_array($row['id_board'], $pretty_board_lookup) === false) {
            $pretty_text = pretty_generate_url($row['name']);
            //	We need to have something to refer to this board by...
            if ($pretty_text == '') {
                //	... so use 'bID_BOARD'
                $pretty_text = 'b' . $row['id_board'];
            }
            //	Numerical or duplicate URLs aren't allowed!
            if (is_numeric($pretty_text) || isset($pretty_board_lookup[$pretty_text]) || in_array($pretty_text, $context['pretty']['action_array'])) {
                //	Add suffix '-ID_BOARD' to the pretty url
                $pretty_text .= ($pretty_text != '' ? '-' : 'b') . $row['id_board'];
            }
            //	Update the arrays
            $pretty_board_urls[$row['id_board']] = $pretty_text;
            $pretty_board_lookup[$pretty_text] = $row['id_board'];
        } elseif (in_array($pretty_board_urls[$row['id_board']], $context['pretty']['action_array'])) {
            $pretty_text = $pretty_board_urls[$row['id_board']] . '-' . $row['id_board'];
            $pretty_board_urls[$row['id_board']] = $pretty_text;
            $pretty_board_lookup[$pretty_text] = $row['id_board'];
        }
    }
    $smcFunc['db_free_result']($query);
    $context['pretty']['maintenance_tasks'][] = 'Updating board URLs';
    //	Update the database
    updateSettings(array('pretty_action_array' => serialize($context['pretty']['action_array']), 'pretty_board_lookup' => serialize($pretty_board_lookup), 'pretty_board_urls' => serialize($pretty_board_urls)));
    //	Update the filter callbacks
    pretty_update_filters($installing);
    $context['pretty']['maintenance_tasks'][] = 'Update the filters';
}
Esempio n. 2
0
function pretty_urls_topic_filter($urls)
{
    global $context, $db_prefix, $modSettings, $scripturl, $sourcedir;
    $pattern = '`' . $scripturl . '(.*[?;&])topic=([.a-zA-Z0-9]+)(.*)`S';
    $query_data = array();
    foreach ($urls as $url_id => $url) {
        //	Get the topic data ready to query the database with
        if (!isset($url['replacement'])) {
            if (preg_match($pattern, $url['url'], $matches)) {
                if (strpos($matches[2], '.') !== false) {
                    list($urls[$url_id]['topic_id'], $urls[$url_id]['start']) = explode('.', $matches[2]);
                } else {
                    $urls[$url_id]['topic_id'] = $matches[2];
                    $urls[$url_id]['start'] = '0';
                }
                $urls[$url_id]['topic_id'] = (int) $urls[$url_id]['topic_id'];
                $urls[$url_id]['match1'] = $matches[1];
                $urls[$url_id]['match3'] = $matches[3];
                $query_data[] = $urls[$url_id]['topic_id'];
            }
        }
    }
    //	Query the database with these topic IDs
    if (count($query_data) != 0) {
        //	Look for existing topic URLs
        $query_data = array_keys(array_flip($query_data));
        $topicData = array();
        $unpretty_topics = array();
        $query = db_query("\n\t\t\tSELECT t.ID_TOPIC, t.ID_BOARD, p.pretty_url\n\t\t\tFROM {$db_prefix}topics AS t\n\t\t\t\tLEFT JOIN {$db_prefix}pretty_topic_urls AS p ON (t.ID_TOPIC = p.ID_TOPIC)\n\t\t\tWHERE t.ID_TOPIC IN (" . implode(', ', $query_data) . ")", __FILE__, __LINE__);
        while ($row = mysql_fetch_assoc($query)) {
            if (isset($row['pretty_url'])) {
                $topicData[$row['ID_TOPIC']] = array('pretty_board' => isset($context['pretty']['board_urls'][$row['ID_BOARD']]) ? $context['pretty']['board_urls'][$row['ID_BOARD']] : $row['ID_BOARD'], 'pretty_url' => $row['pretty_url']);
            } else {
                $unpretty_topics[] = $row['ID_TOPIC'];
            }
        }
        mysql_free_result($query);
        //	Generate new topic URLs if required
        if (count($unpretty_topics) != 0) {
            require_once $sourcedir . '/Subs-PrettyUrls.php';
            //	Get the topic subjects
            $new_topics = array();
            $new_urls = array();
            $query_check = array();
            $existing_urls = array();
            $add_new = array();
            $query = db_query("\n\t\t\t\tSELECT t.ID_TOPIC, t.ID_BOARD, m.subject\n\t\t\t\tFROM {$db_prefix}topics AS t\n\t\t\t\t\tINNER JOIN {$db_prefix}messages AS m ON (m.ID_MSG = t.ID_FIRST_MSG)\n\t\t\t\tWHERE t.ID_TOPIC IN (" . implode(', ', $unpretty_topics) . ')', __FILE__, __LINE__);
            while ($row = mysql_fetch_assoc($query)) {
                $new_topics[] = array('ID_TOPIC' => $row['ID_TOPIC'], 'ID_BOARD' => $row['ID_BOARD'], 'subject' => $row['subject']);
            }
            mysql_free_result($query);
            //	Generate URLs for each new topic
            foreach ($new_topics as $row) {
                $pretty_text = substr(pretty_generate_url($row['subject']), 0, 80);
                //	A topic in the recycle board doesn't deserve a proper URL
                if ($modSettings['recycle_enable'] && $row['ID_BOARD'] == $modSettings['recycle_board'] || $pretty_text == '') {
                    //	Use 'tID_TOPIC' as a pretty url
                    $pretty_text = 't' . $row['ID_TOPIC'];
                }
                //	No duplicates and no numerical URLs - that would just confuse everyone!
                if (in_array($pretty_text, $new_urls) || is_numeric($pretty_text)) {
                    //	Add suffix '-ID_TOPIC' to the pretty url
                    $pretty_text = substr($pretty_text, 0, 70) . '-' . $row['ID_TOPIC'];
                }
                $query_check[] = '\'' . addslashes($pretty_text) . '\'';
                $new_urls[$row['ID_TOPIC']] = $pretty_text;
            }
            //	Find any duplicates of existing URLs
            if (!empty($query_check)) {
                $query = db_query("\n    \t\t\t\tSELECT pretty_url\n    \t\t\t\tFROM {$db_prefix}pretty_topic_urls\n    \t\t\t\tWHERE pretty_url IN (" . implode(', ', $query_check) . ')', __FILE__, __LINE__);
                while ($row = mysql_fetch_assoc($query)) {
                    $existing_urls[] = $row['pretty_url'];
                }
                mysql_free_result($query);
            }
            //	Finalise the new URLs ...
            foreach ($new_topics as $row) {
                $pretty_text = $new_urls[$row['ID_TOPIC']];
                //	Check if the new URL is already in use
                if (in_array($pretty_text, $existing_urls)) {
                    $pretty_text = substr($pretty_text, 0, 70) . '-' . $row['ID_TOPIC'];
                }
                $add_new[] = '(' . $row['ID_TOPIC'] . ', \'' . addslashes($pretty_text) . '\')';
                //	Add to the original array of topic URLs
                $topicData[$row['ID_TOPIC']] = array('pretty_board' => isset($context['pretty']['board_urls'][$row['ID_BOARD']]) ? $context['pretty']['board_urls'][$row['ID_BOARD']] : $row['ID_BOARD'], 'pretty_url' => $pretty_text);
            }
            //	... and add them to the database!
            db_query("\n\t\t\t\tINSERT IGNORE INTO {$db_prefix}pretty_topic_urls\n\t\t\t\t\t(ID_TOPIC, pretty_url)\n\t\t\t\tVALUES " . implode(', ', $add_new), __FILE__, __LINE__);
        }
        //	Build the replacement URLs
        foreach ($urls as $url_id => $url) {
            if (isset($url['topic_id']) && isset($topicData[$url['topic_id']])) {
                $start = $url['start'] != '0' || is_numeric($topicData[$url['topic_id']]['pretty_url']) ? $url['start'] . '/' : '';
                $urls[$url_id]['replacement'] = $modSettings['pretty_root_url'] . '/' . $topicData[$url['topic_id']]['pretty_board'] . '/' . $topicData[$url['topic_id']]['pretty_url'] . '/' . $start . $url['match1'] . $url['match3'];
            }
        }
    }
    return $urls;
}
Esempio n. 3
0
function pretty_urls_topic_filter($urls)
{
    global $context, $modSettings, $scripturl, $smcFunc, $sourcedir;
    $pattern = '`' . $scripturl . '(.*[?;&])topic=([.a-zA-Z0-9]+)(.*)`S';
    $query_data = array();
    foreach ($urls as $url_id => $url) {
        //	Get the topic data ready to query the database with
        if (!isset($url['replacement'])) {
            if (preg_match($pattern, $url['url'], $matches)) {
                if (strpos($matches[2], '.') !== false) {
                    list($urls[$url_id]['topic_id'], $urls[$url_id]['start']) = explode('.', $matches[2]);
                } else {
                    $urls[$url_id]['topic_id'] = $matches[2];
                    $urls[$url_id]['start'] = '0';
                }
                $urls[$url_id]['topic_id'] = (int) $urls[$url_id]['topic_id'];
                $urls[$url_id]['match1'] = $matches[1];
                $urls[$url_id]['match3'] = $matches[3];
                $query_data[] = $urls[$url_id]['topic_id'];
            }
        }
    }
    //	Query the database with these topic IDs
    if (count($query_data) != 0) {
        //	Look for existing topic URLs
        $query_data = array_keys(array_flip($query_data));
        $topicData = array();
        $unpretty_topics = array();
        $query = $smcFunc['db_query']('', '
			SELECT t.id_topic, t.id_board, p.pretty_url
			FROM {db_prefix}topics AS t
				LEFT JOIN {db_prefix}pretty_topic_urls AS p ON (t.id_topic = p.id_topic)
			WHERE t.id_topic IN ({array_int:topic_ids})', array('topic_ids' => $query_data));
        while ($row = $smcFunc['db_fetch_assoc']($query)) {
            if (isset($row['pretty_url'])) {
                $topicData[$row['id_topic']] = array('pretty_board' => isset($context['pretty']['board_urls'][$row['id_board']]) ? $context['pretty']['board_urls'][$row['id_board']] : $row['id_board'], 'pretty_url' => $row['pretty_url']);
            } else {
                $unpretty_topics[] = $row['id_topic'];
            }
        }
        $smcFunc['db_free_result']($query);
        //	Generate new topic URLs if required
        if (count($unpretty_topics) != 0) {
            require_once $sourcedir . '/Subs-PrettyUrls.php';
            //	Get the topic subjects
            $new_topics = array();
            $new_urls = array();
            $query_check = array();
            $existing_urls = array();
            $add_new = array();
            $query = $smcFunc['db_query']('', '
				SELECT t.id_topic, t.id_board, m.subject
				FROM {db_prefix}topics AS t
					INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg)
				WHERE t.id_topic IN ({array_int:topic_ids})', array('topic_ids' => $unpretty_topics));
            while ($row = $smcFunc['db_fetch_assoc']($query)) {
                $new_topics[] = array('id_topic' => $row['id_topic'], 'id_board' => $row['id_board'], 'subject' => $row['subject']);
            }
            $smcFunc['db_free_result']($query);
            //	Generate URLs for each new topic
            foreach ($new_topics as $row) {
                $pretty_text = substr(pretty_generate_url($row['subject']), 0, 80);
                //	A topic in the recycle board doesn't deserve a proper URL
                if ($modSettings['recycle_enable'] && $row['id_board'] == $modSettings['recycle_board'] || $pretty_text == '') {
                    //	Use 'tID_TOPIC' as a pretty url
                    $pretty_text = 't' . $row['id_topic'];
                }
                //	No duplicates and no numerical URLs - that would just confuse everyone!
                if (in_array($pretty_text, $new_urls) || is_numeric($pretty_text)) {
                    //	Add suffix '-ID_TOPIC' to the pretty url
                    $pretty_text = substr($pretty_text, 0, 70) . '-' . $row['id_topic'];
                }
                $query_check[] = $pretty_text;
                $new_urls[$row['id_topic']] = $pretty_text;
            }
            //	Find any duplicates of existing URLs
            if (!empty($query_check)) {
                $query = $smcFunc['db_query']('', '
    				SELECT pretty_url
    				FROM {db_prefix}pretty_topic_urls
    				WHERE pretty_url IN ({array_string:new_urls})', array('new_urls' => $query_check));
                while ($row = $smcFunc['db_fetch_assoc']($query)) {
                    $existing_urls[] = $row['pretty_url'];
                }
                $smcFunc['db_free_result']($query);
            }
            //	Finalise the new URLs ...
            foreach ($new_topics as $row) {
                $pretty_text = $new_urls[$row['id_topic']];
                //	Check if the new URL is already in use
                if (in_array($pretty_text, $existing_urls)) {
                    $pretty_text = substr($pretty_text, 0, 70) . '-' . $row['id_topic'];
                }
                $add_new[] = array($row['id_topic'], $pretty_text);
                //	Add to the original array of topic URLs
                $topicData[$row['id_topic']] = array('pretty_board' => isset($context['pretty']['board_urls'][$row['id_board']]) ? $context['pretty']['board_urls'][$row['id_board']] : $row['id_board'], 'pretty_url' => $pretty_text);
            }
            //	... and add them to the database!
            $smcFunc['db_insert']('', '{db_prefix}pretty_topic_urls', array('id_topic' => 'int', 'pretty_url' => 'string'), $add_new, array());
        }
        //	Build the replacement URLs
        foreach ($urls as $url_id => $url) {
            if (isset($url['topic_id']) && isset($topicData[$url['topic_id']])) {
                $start = $url['start'] != '0' || is_numeric($topicData[$url['topic_id']]['pretty_url']) ? $url['start'] . '/' : '';
                $urls[$url_id]['replacement'] = $modSettings['pretty_root_url'] . '/' . $topicData[$url['topic_id']]['pretty_board'] . '/' . $topicData[$url['topic_id']]['pretty_url'] . '/' . $start . $url['match1'] . $url['match3'];
            }
        }
    }
    return $urls;
}
Esempio n. 4
0
function pretty_run_maintenance($installing = false)
{
    global $boarddir, $context, $db_prefix, $modSettings;
    $context['pretty']['maintenance_tasks'] = array();
    //	Get the array of actions
    $indexphp = file_get_contents($boarddir . '/index.php');
    preg_match('~actionArray\\s*=\\s*array[^;]+~', $indexphp, $actionArrayText);
    preg_match_all('~\'([^\']+)\'\\s*=>~', $actionArrayText[0], $actionArray, PREG_PATTERN_ORDER);
    $context['pretty']['action_array'] = $actionArray[1];
    $context['pretty']['maintenance_tasks'][] = 'Updating the array of actions';
    //	Update the list of boards
    //	Get the current pretty board urls, or make new arrays if there are none
    $pretty_board_urls = isset($modSettings['pretty_board_urls']) ? unserialize($modSettings['pretty_board_urls']) : array();
    $pretty_board_lookup_old = isset($modSettings['pretty_board_lookup']) ? unserialize($modSettings['pretty_board_lookup']) : array();
    //	Fix old boards by replacing ' with \x12
    $pretty_board_urls = str_replace("'", "", $pretty_board_urls);
    $pretty_board_lookup = array();
    foreach ($pretty_board_lookup_old as $board => $id) {
        $pretty_board_lookup[str_replace("'", "", $board)] = $id;
    }
    //	Fix old topics too
    db_query("\n\t\tUPDATE {$db_prefix}pretty_topic_urls\n\t\tSET pretty_url = REPLACE(pretty_url, '\\'', '" . chr(18) . "')", __FILE__, __LINE__);
    $context['pretty']['maintenance_tasks'][] = 'Fixing any old boards and topics with broken quotes';
    //	Get the board names
    $query = db_query("\n\t\tSELECT ID_BOARD, name\n\t\tFROM {$db_prefix}boards", __FILE__, __LINE__);
    //	Process each board
    while ($row = mysql_fetch_assoc($query)) {
        //	Don't replace the board urls if they already exist
        if (!isset($pretty_board_urls[$row['ID_BOARD']]) || $pretty_board_urls[$row['ID_BOARD']] == '' || in_array($row['ID_BOARD'], $pretty_board_lookup) === false) {
            $pretty_text = pretty_generate_url($row['name']);
            //	We need to have something to refer to this board by...
            if ($pretty_text == '') {
                //	... so use 'bID_BOARD'
                $pretty_text = 'b' . $row['ID_BOARD'];
            }
            //	Numerical or duplicate URLs aren't allowed!
            if (is_numeric($pretty_text) || isset($pretty_board_lookup[$pretty_text]) || in_array($pretty_text, $context['pretty']['action_array'])) {
                //	Add suffix '-ID_BOARD' to the pretty url
                $pretty_text .= ($pretty_text != '' ? '-' : 'b') . $row['ID_BOARD'];
            }
            //	Update the arrays
            $pretty_board_urls[$row['ID_BOARD']] = $pretty_text;
            $pretty_board_lookup[$pretty_text] = $row['ID_BOARD'];
        } elseif (in_array($pretty_board_urls[$row['ID_BOARD']], $context['pretty']['action_array'])) {
            $pretty_text = $pretty_board_urls[$row['ID_BOARD']] . '-' . $row['ID_BOARD'];
            $pretty_board_urls[$row['ID_BOARD']] = $pretty_text;
            $pretty_board_lookup[$pretty_text] = $row['ID_BOARD'];
        }
    }
    mysql_free_result($query);
    $context['pretty']['maintenance_tasks'][] = 'Updating board URLs';
    //	Update the database
    updateSettings(array('pretty_action_array' => addslashes(serialize($context['pretty']['action_array'])), 'pretty_board_lookup' => addslashes(serialize($pretty_board_lookup)), 'pretty_board_urls' => addslashes(serialize($pretty_board_urls))));
    //	Update the filter callbacks
    pretty_update_filters($installing);
    $context['pretty']['maintenance_tasks'][] = 'Update the filters';
}