/** * Get information about new versions of ocPortal (or more accurately, what's wrong with this version). * * @return tempcode Information about the installed ocPortal version */ function get_future_version_information() { require_lang('version'); $url = 'http://ocportal.com/version.php?version=' . rawurlencode(ocp_version_full()) . '&lang=' . rawurlencode(user_lang()); $data = http_download_file($url, NULL, false); if (!is_null($data)) { $data = str_replace('"../upgrader.php"', '"' . get_base_url() . '/upgrader.php"', $data); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($data); } require_code('character_sets'); $data = convert_to_internal_encoding($data); $table = new ocp_tempcode(); $lines = explode(chr(10), $data); foreach ($lines as $line) { if (trim($line) != '') { $table->attach(paragraph($line)); } } $table = make_string_tempcode(preg_replace('#<p>\\s*</p>#', '', $table->evaluate())); } else { $table = paragraph(do_lang_tempcode('CANNOT_CONNECT_HOME'), 'dfsdff32ffd'); } require_code('xhtml'); /*$table->attach('<script type="text/javascript">// <![CDATA[ window.open(\''.$url.'\'); //]]></script>');*/ return make_string_tempcode(xhtmlise_html($table->evaluate())); }
/** * Standard modular run function. * * @param array A map of parameters. * @return tempcode The result of execution. */ function run($map) { unset($map); require_css('side_blocks'); $netlinks = get_option('network_links'); if (strlen($netlinks) > 0) { require_code('character_sets'); $data = http_download_file($netlinks, NULL, false); if (is_null($data)) { $if_network = do_lang_tempcode('HTTP_DOWNLOAD_NO_SERVER', escape_html($netlinks)); } else { $if_network = make_string_tempcode(convert_to_internal_encoding($data)); } return do_template('BLOCK_SIDE_NETWORK', array('_GUID' => '5fe8867b9f69670ad61e6c78b956fab2', 'CONTENT' => $if_network)); } return new ocp_tempcode(); }
/** * This will get the XML file from ocportal.com. * * @param ?ID_TEXT The ID to do under (NULL: root) * @return string The XML file */ function get_file($id) { $stub = get_param_integer('localhost', 0) == 1 ? get_base_url() : 'http://ocportal.com'; $v = 'Version ' . float_to_raw_string(ocp_version_number(), 1); if (!is_null($id)) { $v = $id; } $url = $stub . '/data/ajax_tree.php?hook=choose_download&id=' . rawurlencode($v) . '&file_type=tar'; require_code('character_sets'); $contents = http_download_file($url); $utf = $GLOBALS['HTTP_CHARSET'] == 'utf-8'; // We have to use 'U' in the regexp to work around a Chrome parser bug (we can't rely on convert_to_internal_encoding being 100% correct) require_code('character_sets'); $contents = convert_to_internal_encoding($contents); $contents = preg_replace('#^\\s*\\<' . '\\?xml version="1.0" encoding="[^"]*"\\?' . '\\>\\<request\\>#' . ($utf ? 'U' : ''), '', $contents); $contents = preg_replace('#</request>#' . ($utf ? 'U' : ''), '', $contents); $contents = preg_replace('#<category [^>]*has_children="false"[^>]*>[^>]*</category>#' . ($utf ? 'U' : ''), '', $contents); $contents = preg_replace('#<category [^>]*title="Manual install required"[^>]*>[^>]*</category>#' . ($utf ? 'U' : ''), '', $contents); return $contents; }
/** * Get the form to add a bookmark / set breadcrumbs. * * @param mixed Where the form should go to * @return tempcode The form */ function add_bookmark_form($post_url) { $title = get_page_title('ADD_BOOKMARK'); require_lang('zones'); require_code('character_sets'); $url = base64_decode(get_param('url', '', true)); $url = convert_to_internal_encoding($url, 'UTF-8'); // Note that this is intentionally passed in to not be a short URL $page_link = convert_to_internal_encoding(url_to_pagelink($url, false, false), 'UTF-8'); $default_title = get_param('title', '', true); $default_title = convert_to_internal_encoding($default_title, 'UTF-8'); $default_title = preg_replace('#\\s.\\s' . str_replace('#', '\\#', preg_quote(get_site_name())) . '$#s', '', $default_title); $default_title = preg_replace('#^' . str_replace('#', '\\#', preg_quote(get_site_name())) . '\\s.\\s#s', '', $default_title); $default_title_2 = @preg_replace('#\\s.\\s' . str_replace('#', '\\#', preg_quote(get_site_name())) . '$#su', '', $default_title); $default_title_2 = @preg_replace('#^' . str_replace('#', '\\#', preg_quote(get_site_name())) . '\\s.\\s#su', '', $default_title_2); if ($default_title_2 !== false) { $default_title = $default_title_2; } if (!is_string($default_title)) { $default_title = ''; } require_code('form_templates'); $rows = $GLOBALS['SITE_DB']->query_select('bookmarks', array('DISTINCT b_folder'), array('b_owner' => get_member()), 'ORDER BY b_folder'); $list = new ocp_tempcode(); $list->attach(form_input_list_entry('', false, do_lang_tempcode('NA_EM'))); $list->attach(form_input_list_entry('!', true, do_lang_tempcode('ROOT_EM'))); foreach ($rows as $row) { if ($row['b_folder'] != '') { $list->attach(form_input_list_entry($row['b_folder'])); } } $fields = new ocp_tempcode(); $fields->attach(form_input_list(do_lang_tempcode('OLD_BOOKMARK_FOLDER'), do_lang_tempcode('DESCRIPTION_OLD_BOOKMARK_FOLDER'), 'folder', $list, NULL, false, false)); $fields->attach(form_input_line(do_lang_tempcode('ALT_FIELD', do_lang_tempcode('NEW_BOOKMARK_FOLDER')), do_lang_tempcode('DESCRIPTION_NEW_BOOKMARK_FOLDER'), 'folder_new', '', false)); $fields->attach(form_input_line(do_lang_tempcode('TITLE'), do_lang_tempcode('DESCRIPTION_TITLE'), 'title', $default_title == '' ? '' : substr($default_title, 0, 200), true)); $fields->attach(form_input_line(do_lang_tempcode('PAGE_LINK'), do_lang_tempcode('DESCRIPTION_PAGE_LINK_BOOKMARK'), 'page_link', $page_link, true)); $submit_name = do_lang_tempcode('ADD_BOOKMARK'); breadcrumb_set_parents(array(array('_SELF:_SELF:misc', do_lang_tempcode('MANAGE_BOOKMARKS')))); $javascript = 'standardAlternateFields(\'folder\',\'folder_new\'); var title=document.getElementById(\'title\'); if (((title.value==\'\') || (title.value==\'0\')) && (window.opener)) title.value=getInnerHTML(window.opener.document.getElementsByTagName(\'title\')[0]); '; return do_template('FORM_SCREEN', array('_GUID' => '7e94bb97008de4fa0fffa2b5f91c95eb', 'TITLE' => $title, 'HIDDEN' => '', 'TEXT' => '', 'FIELDS' => $fields, 'URL' => $post_url, 'SUBMIT_NAME' => $submit_name, 'JAVASCRIPT' => $javascript)); }
/** * Standard modular run function. * * @param array A map of parameters. * @return tempcode The result of execution. */ function run($map) { require_lang('newsletter'); require_lang('javascript'); $newsletter_id = array_key_exists('param', $map) ? intval($map['param']) : db_get_first_id(); $_newsletter_title = $GLOBALS['SITE_DB']->query_value_null_ok('newsletters', 'title', array('id' => $newsletter_id)); if (is_null($_newsletter_title)) { return paragraph(do_lang_tempcode('MISSING_RESOURCE')); } $newsletter_title = get_translated_text($_newsletter_title); $address = post_param('address' . strval($newsletter_id), ''); if ($address != '') { require_code('newsletter'); require_code('type_validation'); if (!is_valid_email_address($address)) { $msg = do_template('INLINE_WIP_MESSAGE', array('MESSAGE' => do_lang_tempcode('INVALID_EMAIL_ADDRESS'))); return do_template('BLOCK_MAIN_NEWSLETTER_SIGNUP', array('URL' => get_self_url(), 'MSG' => $msg)); } if (!array_key_exists('path', $map)) { $map['path'] = 'uploads/website_specific/signup.txt'; } require_code('character_sets'); $password = basic_newsletter_join($address, 4, NULL, !file_exists(get_custom_file_base() . '/' . $map['path']), $newsletter_id, post_param('firstname' . strval($newsletter_id), ''), post_param('lastname' . strval($newsletter_id), '')); if ($password == '') { return do_template('INLINE_WIP_MESSAGE', array('MESSAGE' => do_lang_tempcode('NEWSLETTER_THIS_ALSO'))); } if ($password == do_lang('NA')) { $manage_url = build_url(array('page' => 'newsletter', 'email' => $address), get_module_zone('newsletter')); return do_template('INLINE_WIP_MESSAGE', array('MESSAGE' => do_lang_tempcode('ALREADY_EMAIL_ADDRESS', escape_html($manage_url->evaluate())))); } require_code('mail'); if (file_exists(get_custom_file_base() . '/' . $map['path'])) { $url = (url_is_local($map['path']) ? get_custom_base_url() . '/' : '') . $map['path']; mail_wrap(array_key_exists('subject', $map) ? $map['subject'] : do_lang('WELCOME'), convert_to_internal_encoding(http_download_file($url)), array($address), array_key_exists('to', $map) ? $map['to'] : '', '', '', 3, NULL, false, NULL, true); } return do_template('BLOCK_MAIN_NEWSLETTER_SIGNUP_DONE', array('_GUID' => '9953c83685df4970de8f23fcd5dd15bb', 'NEWSLETTER_TITLE' => $newsletter_title, 'NID' => strval($newsletter_id), 'PASSWORD' => $password)); } else { return do_template('BLOCK_MAIN_NEWSLETTER_SIGNUP', array('NEWSLETTER_TITLE' => $newsletter_title, 'NID' => strval($newsletter_id), 'URL' => get_self_url())); } }
/** * Convert the specified comcode (text format) into a tempcode tree. You shouldn't output the tempcode tree to the browser, as it looks really horrible. If you are in a rare case where you need to output directly (not through templates), you should call the evaluate method on the tempcode object, to convert it into a string. * * @param LONG_TEXT The comcode to convert * @param MEMBER The member the evaluation is running as. This is a security issue, and you should only run as an administrator if you have considered where the comcode came from carefully * @param boolean Whether to explicitly execute this with admin rights. There are a few rare situations where this should be done, for data you know didn't come from a member, but is being evaluated by one. * @param ?integer The position to conduct wordwrapping at (NULL: do not conduct word-wrapping) * @param ?string A special identifier that can identify this resource in a sea of our resources of this class; usually this can be ignored, but may be used to provide a binding between Javascript in evaluated comcode, and the surrounding environment (NULL: no explicit binding) * @param object The database connection to use * @param boolean Whether to parse so as to create something that would fit inside a semihtml tag. It means we generate HTML, with Comcode written into it where the tag could never be reverse-converted (e.g. a block). * @param boolean Whether this is being pre-parsed, to pick up errors before row insertion. * @param boolean Whether to treat this whole thing as being wrapped in semihtml, but apply normal security otherwise. * @param boolean Whether we are only doing this parse to find the title structure * @param boolean Whether to only check the Comcode. It's best to use the check_comcode function which will in turn use this parameter. * @param ?array A list of words to highlight (NULL: none) * @param ?MEMBER The member we are running on behalf of, with respect to how attachments are handled; we may use this members attachments that are already within this post, and our new attachments will be handed to this member (NULL: member evaluating) * @return tempcode The tempcode generated */ function comcode_text_to_tempcode($comcode, $source_member, $as_admin, $wrap_pos, $pass_id, $connection, $semiparse_mode, $preparse_mode, $is_all_semihtml, $structure_sweep, $check_only, $highlight_bits = NULL, $on_behalf_of_member = NULL) { global $ADVERTISING_BANNERS, $ALLOWED_ENTITIES, $POTENTIALLY_EMPTY_TAGS, $CODE_TAGS, $REVERSABLE_TAGS, $PUREHTML_TAGS, $DANGEROUS_TAGS, $VALID_COMCODE_TAGS, $BLOCK_TAGS, $POTENTIAL_JS_NAUGHTY_ARRAY, $TEXTUAL_TAGS, $LEET_FILTER, $IMPORTED_CUSTOM_COMCODE, $REPLACE_TARGETS; $wml = false; // removed feature from ocPortal now $print_mode = get_param_integer('wide_print', 0) == 1; $len = strlen($comcode); if (function_exists('set_time_limit') && ini_get('max_execution_time') != '0') { @set_time_limit(300); } $allowed_html_seqs = array('<table>', '<table class="[^"]*">', '<table class="[^"]*" summary="[^"]*">', '<table summary="[^"]*">', '</table>', '<tr>', '</tr>', '<td>', '</td>', '<th>', '</th>', '<pre>', '</pre>', '<br />', '<br/>', '<br >', '<br>', '<p>', '</p>', '<p />', '<b>', '</b>', '<u>', '</u>', '<i>', '</i>', '<em>', '</em>', '<strong>', '</strong>', '<li>', '</li>', '<ul>', '</ul>', '<ol>', '</ol>', '<del>', '</del>', '<dir>', '</dir>', '<s>', '</s>', '</a>', '</font>', '<!--', '<h1 id="main_page_title">', '<h1 class="main_page_title">', '<h1 id="main_page_title" class="main_page_title">', '</h1>', '<img (class="inline_image" )?alt="[^"]*" src="[^"]*" (complete="true" )*/>', '<img src=["\'][^"\'<>]*["\']( border=["\'][^"\'<>]*["\'])?( alt=["\'][^"\'<>]*["\'])?( )?(/)?' . '>', '<a href=["\'][^"\'<>]*["\']( target=["\'][^"\'<>]*["\'])?' . '>'); // HTML tag may actually be used in very limited conditions: only the following HTML seqs will come out as HTML. This is, unless the blacklist filter is used instead. if ($as_admin) { $comcode_dangerous = true; $comcode_dangerous_html = true; } else { $comcode_dangerous = $GLOBALS['MICRO_BOOTUP'] == 0 && has_specific_permission($source_member, 'comcode_dangerous'); $comcode_dangerous_html = false; if (has_specific_permission($source_member, 'allow_html') && ($is_all_semihtml || strpos($comcode, '[html') !== false || strpos($comcode, '[semihtml') !== false)) { $comcode_dangerous_html = true; /*foreach (array_keys($POTENTIALLY_EMPTY_TAGS) as $tag) // Find whether we really need to enable the computational-expensive filtering. Code disabled, not sure why this would have ever worked! { if (($tag!='html') && ($tag!='semihtml') && (strpos($comcode,'['.$tag)!==false)) { $comcode_dangerous_html=false; break; } }*/ } } if (is_null($pass_id)) { $pass_id = strval(mt_rand(0, 32000)); } // This is a unique ID that refers to this specific piece of comcode global $COMCODE_ATTACHMENTS; if (!array_key_exists($pass_id, $COMCODE_ATTACHMENTS)) { $COMCODE_ATTACHMENTS[$pass_id] = array(); } // Tag level $current_tag = ''; $attribute_map = array(); $tag_output = new ocp_tempcode(); $continuation = ''; $close = mixed(); // Properties that come from our tag $white_space_area = true; $textual_area = true; $formatting_allowed = true; $in_html = false; $in_semihtml = $is_all_semihtml; $in_separate_parse_section = false; // Not escaped because it has to be passed to a secondary filter $in_code_tag = false; $code_nest_stack = 0; // Our state $status = CCP_NO_MANS_LAND; $lax = $GLOBALS['LAX_COMCODE'] || function_exists('get_member') && $source_member != get_member() || count($_POST) == 0; // if we don't want to produce errors for technically invalid Comcode $tag_stack = array(); $pos = 0; $line_starting = true; $just_ended = false; $none_wrap_length = 0; $just_new_line = true; // So we can detect lists starting right away $just_title = false; global $NUM_LINES; $NUM_LINES = 0; $queued_tempcode = new ocp_tempcode(); $mindless_mode = false; // If we're doing a semi parse mode and going over a tag we don't actually process $tag_raw = ''; if (!is_null($wrap_pos) && strtolower(get_charset()) == 'utf-8') { $wrap_pos *= 2; } $stupidity_mode = get_value('stupidity_mode'); // bork or leet if ($comcode_dangerous) { $stupidity_mode = get_param('stupidity_mode', ''); } if ($stupidity_mode == 'leet') { $LEET_FILTER = array('B' => '8', 'C' => '(', 'E' => '3', 'G' => '9', 'I' => '1', 'L' => '1', 'O' => '0', 'P' => '9', 'S' => '5', 'U' => '0', 'V' => '\\/', 'Z' => '2'); } $smilies = $GLOBALS['FORUM_DRIVER']->find_emoticons(); // We'll be needing the smiley array $shortcuts = array('(EUR-)' => '€', '{f.}' => 'ƒ', '-|-' => '†', '=|=' => '‡', '{%o}' => '‰', '{~S}' => 'Š', '{~Z}' => 'Ž', '(TM)' => '™', '{~s}' => 'š', '{~z}' => 'ž', '{.Y.}' => 'Ÿ', '(c)' => '©', '(r)' => '®', '---' => '—', '--' => '–', '...' => '…', '-->' => '→', '<--' => '←'); // Text syntax possibilities, that get maintained as our cursor moves through the text block $list_indent = 0; $list_type = 'ul'; if ($is_all_semihtml) { filter_html($as_admin, $source_member, $pos, $len, $comcode, false, false); } // Pre-filter the whole lot (note that this means during general output we do no additional filtering) while ($pos < $len) { $next = $comcode[$pos]; ++$pos; // State machine switch ($status) { case CCP_NO_MANS_LAND: if ($next == '[') { // Look ahead to make sure it's a valid tag. If it's not then it's considered normal user input, not a tag at all $dif = $pos < $len && $comcode[$pos] == '/' ? 1 : 0; $ahead = substr($comcode, $pos + $dif, MAX_COMCODE_TAG_LOOK_AHEAD_LENGTH); $equal_pos = strpos($ahead, '='); $space_pos = strpos($ahead, ' '); $end_pos = strpos($ahead, ']'); $lax_end_pos = strpos($ahead, '['); $cl_pos = strpos($ahead, chr(10)); if ($equal_pos === false) { $equal_pos = MAX_COMCODE_TAG_LOOK_AHEAD_LENGTH + 3; } if ($space_pos === false) { $space_pos = MAX_COMCODE_TAG_LOOK_AHEAD_LENGTH + 3; } if ($end_pos === false) { $end_pos = MAX_COMCODE_TAG_LOOK_AHEAD_LENGTH + 3; } if ($lax_end_pos === false) { $lax_end_pos = MAX_COMCODE_TAG_LOOK_AHEAD_LENGTH + 3; } if ($cl_pos === false) { $cl_pos = MAX_COMCODE_TAG_LOOK_AHEAD_LENGTH + 3; } $use_pos = min($equal_pos, $space_pos, $end_pos, $lax_end_pos, $cl_pos); $potential_tag = strtolower(substr($ahead, 0, $use_pos)); if ($use_pos != 22 && (!$in_semihtml || $dif == 1 || $potential_tag != 'html' && $potential_tag != 'semihtml') && (!$in_html || $dif == 1 && $potential_tag == 'html') && (!$in_code_tag || isset($CODE_TAGS[$potential_tag]) && $potential_tag == $current_tag) && (!$structure_sweep || $potential_tag != 'contents')) { if ($in_code_tag) { if ($dif == 1) { $code_nest_stack--; } else { $code_nest_stack++; } $ok = $code_nest_stack == -1; } else { $ok = true; } if ($ok) { if (!isset($VALID_COMCODE_TAGS[$potential_tag])) { if (!$IMPORTED_CUSTOM_COMCODE) { _custom_comcode_import($connection); } } if (isset($VALID_COMCODE_TAGS[$potential_tag]) && strtolower(substr($ahead, 0, 2)) != 'i ') { if ($comcode[$pos] != '/' || count($tag_stack) == 0) { $mindless_mode = $semiparse_mode && (!isset($REVERSABLE_TAGS[$potential_tag]) || is_string($REVERSABLE_TAGS[$potential_tag]) && preg_match($REVERSABLE_TAGS[$potential_tag], substr($comcode, $pos, 100)) != 0) && !isset($PUREHTML_TAGS[$potential_tag]); } else { $mindless_mode = $tag_stack[count($tag_stack) - 1][7]; } $close = false; $current_tag = ''; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; if ($just_new_line || isset($BLOCK_TAGS[$potential_tag])) { list($close_list, $list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($close_list); } $tag_output->attach($close_list); } $status = CCP_STARTING_TAG; if ($mindless_mode) { if ($comcode[$pos] != '/') { if (array_key_exists($potential_tag, $BLOCK_TAGS)) { $tag_raw = '​<kbd title="' . escape_html($potential_tag) . '" class="ocp_keep_block">['; } else { $tag_raw = '​<kbd title="' . escape_html($potential_tag) . '" class="ocp_keep">['; } } else { $tag_raw = '['; } } else { $tag_raw = ''; } continue; } } } else { if ($use_pos != 22 && (($in_semihtml || $in_html) && ($potential_tag == 'html' || $potential_tag == 'semihtml')) && !$in_code_tag) { $ahc = strpos($ahead, ']'); if ($ahc !== false) { $pos += $ahc + 1; continue; } } } } if ($in_html || $in_semihtml && !$in_code_tag && ($next == '<' || $next == '>' || $next == '"')) { if ($next == chr(10)) { ++$NUM_LINES; } if (!$comcode_dangerous_html && $next == '<') { $close = strpos($comcode, '>', $pos - 1); $portion = substr($comcode, $pos - 1, $close - $pos + 2); $seq_ok = false; foreach ($allowed_html_seqs as $allowed_html_seq) { if (preg_match('#^' . $allowed_html_seq . '$#', $portion) != 0) { $seq_ok = true; } } if (!$seq_ok) { // $next='<'; //OLD STYLE if ($close !== false) { $pos = $close + 1; } // NEW STYLE continue; } } if (substr($comcode, $pos - 1, 4) == '<!--') { $continuation .= '<!--'; $pos += 3; } else { $continuation .= $mindless_mode && $in_code_tag ? escape_html($next) : $next; } } else { // Text-format possibilities if ($just_new_line && $formatting_allowed && !$wml) { if ($continuation != '') { if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; } // List $found_list = false; $old_list_indent = $list_indent; if ($pos + 2 < $len && is_numeric($next) && (is_numeric($comcode[$pos]) && $comcode[$pos + 1] == ')' && $comcode[$pos + 2] == ' ' || $comcode[$pos] == ')' && $comcode[$pos + 1] == ' ') && ($list_type == '1' && $list_indent != 0 || preg_match('#^[^\\n]*\\n\\d+\\) #', substr($comcode, $pos + 1)) != 0)) { if ($list_indent != 0 && $list_type != '1') { list($temp_tpl, $old_list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); } $list_indent = 1; $found_list = true; $scan_pos = $pos; $list_type = '1'; } elseif ($pos + 2 < $len && ord($next) >= ord('a') && ord($next) <= ord('z') && $comcode[$pos] == ')' && $comcode[$pos + 1] == ' ' && ($list_type == 'a' && $list_indent != 0 || preg_match('#^[^\\n]*\\n[a-z]+\\) #', substr($comcode, $pos + 1)) != 0)) { if ($list_indent != 0 && $list_type != 'a') { list($temp_tpl, $old_list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); } $list_indent = 1; $found_list = true; $scan_pos = $pos; $list_type = 'a'; } elseif ($next == ' ') { if ($old_list_indent != 0 && $list_type != 'ul') { list($temp_tpl, $old_list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); } $scan_pos = $pos - 1; $list_indent = 0; while ($scan_pos < $len) { $scan_next = $comcode[$scan_pos]; if ($scan_next == '-' && $scan_pos + 1 < $len && $comcode[$scan_pos + 1] == ' ') { $found_list = true; break; } else { if ($scan_next == ' ') { ++$list_indent; } else { break; } } ++$scan_pos; } if (!$found_list) { $list_indent = 0; } else { $list_type = 'ul'; } } else { list($close_list, $list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($close_list); } $tag_output->attach($close_list); $old_list_indent = 0; if ($next == '-' && !$just_title) { $scan_pos = $pos; $found_rule = true; while ($scan_pos < $len) { $scan_next = $comcode[$scan_pos]; if ($scan_next != '-') { if ($scan_next == chr(10)) { ++$NUM_LINES; break; } else { $found_rule = false; } } ++$scan_pos; } if ($found_rule) { $_temp_tpl = do_template('COMCODE_TEXTCODE_LINE'); $tag_output->attach($_temp_tpl); $pos = $scan_pos + 1; $just_ended = true; $none_wrap_length = 0; continue; } } } // List handling if ($list_indent == $old_list_indent && $old_list_indent != 0) { $temp_tpl = '</li>'; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); } for ($i = $list_indent; $i < $old_list_indent; ++$i) { $temp_tpl = '</li>'; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); $temp_tpl = $list_type == 'ul' ? '</ul>' : '</ol>'; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); } if ($list_indent < $old_list_indent && $list_indent != 0) { $temp_tpl = '</li>'; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); } if ($found_list) { if ($list_indent - $old_list_indent > 1 && !$lax) { return comcode_parse_error($preparse_mode, array('CCP_LIST_JUMPYNESS'), $pos, $comcode, $check_only); } for ($i = $old_list_indent; $i < $list_indent; ++$i) { switch ($list_type) { case 'ul': if ($i < $list_indent - 1) { $temp_tpl = '<ul><li>'; } else { $temp_tpl = '<ul>'; } if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); break; case '1': if ($i < $list_indent - 1) { $temp_tpl = '<ol type="1"><li>'; } else { $temp_tpl = '<ol type="1">'; } if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); break; case 'a': if ($i < $list_indent - 1) { $temp_tpl = '<ol type="a"><li>'; } else { $temp_tpl = '<ol type="a">'; } if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); break; } } $temp_tpl = '<li>'; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); $just_ended = true; $none_wrap_length = 0; $next = ''; $pos = $scan_pos + 2; } } if ($next == chr(10) && $white_space_area && $print_mode && $list_indent == 0) { $tag_output->attach($queued_tempcode); $queued_tempcode = new ocp_tempcode(); } if ($next == chr(10) && $white_space_area && !$in_semihtml && (!$just_ended || $semiparse_mode || substr($comcode, $pos, 3) == ' - ')) { ++$NUM_LINES; $line_starting = true; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $just_new_line = true; $none_wrap_length = 0; if ($list_indent == 0 && !$just_ended) { $temp_tpl = '<br />'; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); } } else { $just_new_line = false; if ($next == ' ' && $white_space_area && !$in_semihtml) { if ($line_starting || $pos > 1 && $comcode[$pos - 2] == ' ') { $next = ' '; ++$none_wrap_length; } else { $none_wrap_length = 0; } $continuation .= $mindless_mode && $in_code_tag ? escape_html($next) : $next; } elseif ($next == "\t" && $white_space_area && !$in_semihtml) { if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $tab_tpl = do_template('COMCODE_TEXTCODE_TAB'); $_tab_tpl = $tab_tpl->evaluate(); $none_wrap_length += strlen($_tab_tpl); $tag_output->attach($tab_tpl); } else { if ($next == ' ' || $next == "\t" || $just_ended) { $none_wrap_length = 0; } else { if (!is_null($wrap_pos) && $none_wrap_length >= $wrap_pos && (strtolower(get_charset()) != 'utf-8' || preg_replace(array('#[\\x09\\x0A\\x0D\\x20-\\x7E]#', '#[\\xC2-\\xDF][\\x80-\\xBF]#', '#\\xE0[\\xA0-\\xBF][\\x80-\\xBF]#', '#[\\xE1-\\xEC\\xEE\\xEF][\\x80-\\xBF]{2}#', '#\\xED[\\x80-\\x9F][\\x80-\\xBF]#', '#\\xF0[\\x90-\\xBF][\\x80-\\xBF]{2}#', '#[\\xF1-\\xF3][\\x80-\\xBF]{3}#', '#\\xF4[\\x80-\\x8F][\\x80-\\xBF]{2}#'), array('', '', '', '', '', '', '', ''), $continuation) == '') && $textual_area && !$in_semihtml) { if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $temp_tpl = '<br />'; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); $none_wrap_length = 0; } elseif ($textual_area) { ++$none_wrap_length; } } $line_starting = false; $just_ended = false; $differented = false; // If somehow via lookahead we've changed this to HTML and thus won't use it in raw form // Variable lookahead if (!$in_code_tag && ($next == '{' && isset($comcode[$pos]) && ($comcode[$pos] == '$' || $comcode[$pos] == '+' || $comcode[$pos] == '!'))) { if ($comcode_dangerous) { if (!$in_code_tag && (!$semiparse_mode || in_tag_stack($tag_stack, array('url', 'img', 'flash')))) { if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; if ($comcode[$pos] == '+') { $p_end = $pos + 5; while ($p_end < $len) { $p_portion = substr($comcode, $pos - 1, $p_end - ($pos - 1) + 5); if (substr_count($p_portion, '{+START') == substr_count($p_portion, '{+END')) { break; } $p_end++; } $p_len = 1; while ($pos + $p_len < $len) { $p_portion = substr($comcode, $pos - 1, $p_len); if (substr_count(str_replace('{', ' { ', $p_portion), '{') == substr_count(str_replace('}', ' } ', $p_portion), '}')) { break; } // str_replace is to workaround a Quercus bug #4494 $p_len++; } $p_len--; $p_portion = substr($comcode, $pos + $p_len, $p_end - ($pos + $p_len)); require_code('tempcode_compiler'); $ret = template_to_tempcode(substr($comcode, $pos - 1, $p_len + 1) . '{DIRECTIVE_EMBEDMENT}' . substr($comcode, $p_end, 6)); $attaches_before = count($COMCODE_ATTACHMENTS[$pass_id]); $ret->singular_bind('DIRECTIVE_EMBEDMENT', comcode_text_to_tempcode($p_portion, $source_member, $as_admin, $wrap_pos, $pass_id, $connection, $semiparse_mode, $preparse_mode, $in_semihtml, $structure_sweep, $check_only, $highlight_bits, $on_behalf_of_member)); for ($attach_inspect = $attaches_before; $attach_inspect < count($COMCODE_ATTACHMENTS[$pass_id]); $attach_inspect++) { $COMCODE_ATTACHMENTS[$pass_id][$attach_inspect]['marker'] += $pos + $p_len; } $pos = $p_end + 6; } elseif ($comcode[$pos] == '!') { $p_len = $pos; $balance = 1; while ($p_len < $len && $balance != 0) { if ($comcode[$p_len] == '{') { $balance++; } elseif ($comcode[$p_len] == '}') { $balance--; } $p_len++; } $ret = new ocp_tempcode(); $less_pos = $pos - 1; $ret->parse_from($comcode, $less_pos, $p_len); $pos = $p_len; if ($ret->parameterless(0) && $pos < $len) { $matches = array(); if (preg_match('#\\{\\!([\\w\\d\\_\\:]+)(\\}|$)#U', substr($comcode, $less_pos, $p_len - $less_pos), $matches) != 0) { $temp_lang_string = $matches[1]; $ret = comcode_lang_string($temp_lang_string); // Recreate as a Comcode lang string } } } else { $p_len = $pos; $balance = 1; while ($p_len < $len && $balance != 0) { if ($comcode[$p_len] == '{') { $balance++; } elseif ($comcode[$p_len] == '}') { $balance--; } $p_len++; } $ret = new ocp_tempcode(); $less_pos = $pos - 1; $ret->parse_from($comcode, $less_pos, $p_len); $pos = $p_len; } $differented = true; if ($pos <= $len || !$lax) { $tag_output->attach($ret); } } } else { if ($comcode[$pos] == '$' && $pos < $len - 2 && $comcode[$pos + 1] == ',' && strpos($comcode, '}', $pos) !== false) { $pos = strpos($comcode, '}', $pos) + 1; $differented = true; } } } // Escaping of comcode tag starts lookahead if ($next == '\\' && !$in_code_tag) { if ($pos != $len && ($comcode[$pos] == '"' || substr($comcode, $pos - 1, 6) == '"')) { if ($semiparse_mode) { $continuation .= '\\'; } if ($comcode[$pos] == '"') { $continuation .= $mindless_mode ? '"' : '"'; ++$pos; } else { $continuation .= '"'; $pos += 6; } $differented = true; } elseif ($pos != $len && $comcode[$pos] == '[') { if ($semiparse_mode) { $continuation .= '\\'; } $continuation .= '['; ++$pos; $differented = true; } elseif ($pos != $len && $comcode[$pos] == '{') { if ($semiparse_mode) { $continuation .= '\\'; } $continuation .= '{'; ++$pos; $differented = true; } elseif ($pos == $len || $comcode[$pos] == '\\') { if ($semiparse_mode) { $continuation .= '\\'; } $continuation .= '\\'; ++$pos; $differented = true; } } if (!$differented) { if (($textual_area || $in_semihtml) && trim($next) != '' && !$wml) { // Emoticon lookahead foreach ($smilies as $smiley => $imgcode) { if ($in_semihtml) { $smiley = ' ' . $smiley . ' '; } if ($next == $smiley[0]) { if (substr($comcode, $pos - 1, strlen($smiley)) == $smiley) { if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $pos += strlen($smiley) - 1; $differented = true; $tag_output->attach(do_emoticon($imgcode)); break; } } } } } if (trim($next) != '' && !$in_code_tag && !$differented) { // CEDI pages if ($pos < $len && $next == '[' && $pos + 1 < $len && $comcode[$pos] == '[' && !$semiparse_mode && addon_installed('cedi')) { $matches = array(); if (preg_match('#^\\[([^\\[\\]]*)\\]\\]#', substr($comcode, $pos, 200), $matches) != 0) { $cedi_page_name = $matches[1]; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $hash_pos = strpos($cedi_page_name, '#'); if ($hash_pos !== false) { $jump_to = substr($cedi_page_name, $hash_pos + 1); $cedi_page_name = substr($cedi_page_name, 0, $hash_pos); } else { $jump_to = ''; } $cedi_page_url = build_url(array('page' => 'cedi', 'type' => 'misc', 'find' => $cedi_page_name), get_module_zone('cedi')); if ($jump_to != '') { $cedi_page_url->attach('#' . $jump_to); } $tag_output->attach(do_template('COMCODE_CEDI_LINK', array('_GUID' => 'ebcd7ba5290c5b2513272a53b4d666e5', 'URL' => $cedi_page_url, 'TEXT' => $cedi_page_name))); $pos += strlen($matches[1]) + 3; $differented = true; } } // Usernames if ($pos < $len && $next == '{' && $pos + 1 < $len && $comcode[$pos] == '{' && !$in_code_tag && !$semiparse_mode) { $matches = array(); if (preg_match('#^\\{([^"{}&\'\\$<>]+)\\}\\}#', substr($comcode, $pos, 80), $matches) != 0) { $username = $matches[1]; if ($username[0] == '?') { $username_info = true; $username = substr($username, 1); } else { $username_info = false; } $this_member_id = $GLOBALS['FORUM_DRIVER']->get_member_from_username($username); if (!is_null($this_member_id) && !is_guest($this_member_id)) { if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $poster_url = $GLOBALS['FORUM_DRIVER']->member_profile_url($this_member_id, false, true); if (get_forum_type() == 'ocf' && $username_info) { require_lang('ocf'); require_code('ocf_members2'); $details = ocf_show_member_box($this_member_id); $tag_output->attach(do_template('HYPERLINK_TOOLTIP', array('_GUID' => 'd8f4f4ac70bd52b3ef9ee74ae9c5e085', 'TOOLTIP' => $details, 'CAPTION' => $username, 'URL' => $poster_url, 'NEW_WINDOW' => false))); } else { $tag_output->attach(hyperlink($poster_url, $username)); } $pos += strlen($matches[1]) + 3; $differented = true; } } } } if ($textual_area && !$in_code_tag && trim($next) != '' && !$differented) { // Shortcut lookahead if (!$differented) { if ($in_semihtml && substr($comcode, $pos - 1, 3) == '-->') { $continuation .= '-->'; $pos += 2; break; } foreach ($shortcuts as $code => $replacement) { if ($next == $code[0] && substr($comcode, $pos - 1, strlen($code)) == $code) { if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $pos += strlen($code) - 1; $differented = true; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($replacement); } $tag_output->attach($replacement); break; } } } } if ($textual_area && !$in_code_tag && trim($next) != '' && !$differented) { // Table syntax if (!$differented) { if ($pos < $len && $comcode[$pos] == '|') { $end_tbl = strpos($comcode, chr(10) . '|}', $pos); if ($end_tbl !== false) { $end_fst_line_pos = strpos($comcode, chr(10), $pos); $caption = substr($comcode, $pos + 2, max($end_fst_line_pos - $pos - 2, 0)); $pos += strlen($caption) + 1; $rows = preg_split('#(\\|-|\\|\\})#Um', substr($comcode, $pos, $end_tbl - $pos)); if (preg_match('#(^|\\s)floats($|\\s)#', $caption) != 0) { $caption = preg_replace('#(^|\\s)floats($|\\s)#', '', $caption); $ratios = array(); $ratios_matches = array(); if (preg_match('#(^|\\s)([\\d\\.]+%(:[\\d\\.]+%)*)($|\\s)#', $caption, $ratios_matches) != 0) { $ratios = explode(':', $ratios_matches[2]); $caption = str_replace($ratios_matches[0], '', $caption); } foreach ($rows as $h => $row) { if ($h != 0) { $tag_output->attach(do_template('BLOCK_SEPARATOR')); } $cells = preg_split('/(\\n\\! | \\!\\! |\\n\\| | \\|\\| )/', $row, -1, PREG_SPLIT_DELIM_CAPTURE); array_shift($cells); // First one is non-existant empty $spec = true; // Find which to float $to_float = NULL; foreach ($cells as $i => $cell) { if (!$spec) { if (strpos($cell, '!') !== false || is_null($to_float)) { $to_float = $i; } } $spec = !$spec; } $tag_output->attach(do_template('COMCODE_FAKE_TABLE_WRAP_START')); // Do floated one $i_dir_1 = $to_float == 1 ? 'left' : 'right'; $i_dir_2 = $to_float != 1 ? 'left' : 'right'; if (preg_match('#(^|\\s)wide($|\\s)#', $caption) != 0) { $tag_output->attach(do_template('COMCODE_FAKE_TABLE_WIDE_START', array('_GUID' => 'ced8c3a142f74296a464b085ba6891c9', 'WIDTH' => array_key_exists($to_float == 1 ? 0 : count($cells) - 1, $ratios) ? $ratios[$to_float == 1 ? 0 : count($cells) - 1] : (count($cells) == 2 ? '0' : float_to_raw_string(97.0 / (floatval(count($cells)) / 2.0 - 1.0), 2) . '%'), 'FLOAT' => $i_dir_1, 'PADDING' => $to_float == 1 ? '' : '-left', 'PADDING_AMOUNT' => count($cells) == 2 ? '0' : float_to_raw_string(3.0 / (floatval(count($cells) - 2) / 2.0), 2)))); } else { $tag_output->attach(do_template('COMCODE_FAKE_TABLE_START', array('_GUID' => '90be72fcbb6b9d8a312da0bee5b86cb3', 'WIDTH' => array_key_exists($to_float, $ratios) ? $ratios[$to_float] : '', 'FLOAT' => $i_dir_1, 'PADDING' => $to_float == 1 ? '' : '-left', 'PADDING_AMOUNT' => count($cells) == 2 ? '0' : float_to_raw_string(3.0 / (floatval(count($cells) - 2.0) / 2.0), 2)))); } $attaches_before = count($COMCODE_ATTACHMENTS[$pass_id]); $tag_output->attach(comcode_text_to_tempcode(isset($cells[$to_float]) ? rtrim($cells[$to_float]) : '', $source_member, $as_admin, 60, $pass_id, $connection, $semiparse_mode, $preparse_mode, $in_semihtml, $structure_sweep, $check_only, $highlight_bits, $on_behalf_of_member)); for ($attach_inspect = $attaches_before; $attach_inspect < count($COMCODE_ATTACHMENTS[$pass_id]); $attach_inspect++) { $COMCODE_ATTACHMENTS[$pass_id][$attach_inspect]['marker'] += strpos($comcode, $cells[$to_float], $pos); } $tag_output->attach(do_template('COMCODE_FAKE_TABLE_END')); // Do non-floated ones $cell_i = 0; foreach ($cells as $i => $cell) { if ($i % 2 == 1) { if ($i != $to_float) { if (preg_match('#(^|\\s)wide($|\\s)#', $caption) != 0) { $tag_output->attach(do_template('COMCODE_FAKE_TABLE_WIDE2_START', array('_GUID' => '9bac42a1b62c5c9a2f758639fcb3bb2f', 'WIDTH' => array_key_exists($cell_i, $ratios) ? $ratios[$cell_i] : float_to_raw_string(97.0 / (floatval(count($cells)) / 2.0), 2) . '%', 'PADDING_AMOUNT' => count($cells) == 2 ? '0' : float_to_raw_string(3.0 / (floatval(count($cells) - 2) / 2.0), 2), 'FLOAT' => $i_dir_1, 'PADDING' => $to_float == 1 || $cell_i != 0 ? '-left' : ''))); } else { $tag_output->attach(do_template('COMCODE_FAKE_TABLE_2_START', array('_GUID' => '0f15f9d5554635ed7ac154c9dc5c72b8', 'WIDTH' => array_key_exists($cell_i, $ratios) ? $ratios[$cell_i] : '', 'FLOAT' => $i_dir_1, 'PADDING' => $to_float == 1 || $cell_i != 0 ? '-left' : '', 'PADDING_AMOUNT' => count($cells) == 2 ? '0' : float_to_raw_string(3.0 / (floatval(count($cells) - 2) / 2.0), 2)))); } $attaches_before = count($COMCODE_ATTACHMENTS[$pass_id]); $tag_output->attach(comcode_text_to_tempcode(rtrim($cell), $source_member, $as_admin, 60, $pass_id, $connection, $semiparse_mode, $preparse_mode, $in_semihtml, $structure_sweep, $check_only, $highlight_bits, $on_behalf_of_member)); for ($attach_inspect = $attaches_before; $attach_inspect < count($COMCODE_ATTACHMENTS[$pass_id]); $attach_inspect++) { $COMCODE_ATTACHMENTS[$pass_id][$attach_inspect]['marker'] += strpos($comcode, $cell, $pos); } $tag_output->attach(do_template('COMCODE_FAKE_TABLE_END')); } $cell_i++; } } $tag_output->attach(do_template('COMCODE_FAKE_TABLE_WRAP_END')); } } else { $ratios = array(); $ratios_matches = array(); if (preg_match('#(^|\\s)([\\d\\.]+%(:[\\d\\.]+%)*)($|\\s)#', $caption, $ratios_matches) != 0) { $ratios = explode(':', $ratios_matches[2]); $caption = str_replace($ratios_matches[0], '', $caption); } if (preg_match('#(^|\\s)wide($|\\s)#', $caption) != 0) { $tag_output->attach(do_template('COMCODE_REAL_TABLE_START', array('SUMMARY' => preg_replace('#(^|\\s)wide($|\\s)#', '', $caption)))); } else { $tag_output->attach(do_template('COMCODE_REAL_TABLE_START_SUMMARY', array('_GUID' => '0c5674fba61ba14b4b9fa39ea31ff54f', 'CAPTION' => $caption))); } foreach ($rows as $table_row) { $tag_output->attach(do_template('COMCODE_REAL_TABLE_ROW_START')); $cells = preg_split('/(\\n\\! | \\!\\! |\\n\\| | \\|\\| )/', $table_row, -1, PREG_SPLIT_DELIM_CAPTURE); array_shift($cells); // First one is non-existant empty $spec = true; $c_type = ''; $cell_i = 0; foreach ($cells as $i => $cell) { if ($spec) { $c_type = strpos($cell, '!') !== false ? 'th' : 'td'; } else { $attaches_before = count($COMCODE_ATTACHMENTS[$pass_id]); $_mid = comcode_text_to_tempcode(rtrim($cell), $source_member, $as_admin, 60, $pass_id, $connection, $semiparse_mode, $preparse_mode, $in_semihtml, $structure_sweep, $check_only, $highlight_bits, $on_behalf_of_member); for ($attach_inspect = $attaches_before; $attach_inspect < count($COMCODE_ATTACHMENTS[$pass_id]); $attach_inspect++) { $COMCODE_ATTACHMENTS[$pass_id][$attach_inspect]['marker'] += strpos($comcode, $cell, $pos); } $tag_output->attach(do_template('COMCODE_REAL_TABLE_CELL', array('_GUID' => '6640df8b503f65e3d36f595b0acf7600', 'WIDTH' => array_key_exists($cell_i, $ratios) ? $ratios[$cell_i] : '', 'C_TYPE' => $c_type, 'MID' => $_mid, 'PADDING' => $cell_i == 0 ? '' : '-left', 'PADDING_AMOUNT' => count($cells) == 2 ? '0' : float_to_raw_string(5.0 / (floatval(count($cells) - 2) / 2.0), 2)))); $cell_i++; } $spec = !$spec; } $tag_output->attach(do_template('COMCODE_REAL_TABLE_ROW_END')); } $tag_output->attach(do_template('COMCODE_REAL_TABLE_END')); } $pos = $end_tbl + 3; $differented = true; } } } // Advertising $b_all = true; // leave true - for test purposes only if (!$differented && !$semiparse_mode && !$in_code_tag && addon_installed('banners') && ($b_all || !has_specific_permission($source_member, 'banner_free'))) { // Pick up correctly, including permission filtering if (is_null($ADVERTISING_BANNERS)) { $rows = $GLOBALS['SITE_DB']->query('SELECT * FROM ' . get_table_prefix() . 'banners b LEFT JOIN ' . get_table_prefix() . 'banner_types t ON b.b_type=t.id WHERE t_comcode_inline=1 AND ' . db_string_not_equal_to('b_title_text', ''), NULL, NULL, true); if (!is_null($rows)) { // Filter out what we don't have permission for if (get_option('use_banner_permissions', true) == '1') { require_code('permissions'); $groups = _get_where_clause_groups($source_member); if (!is_null($groups)) { $perhaps = collapse_1d_complexity('category_name', $GLOBALS['SITE_DB']->query('SELECT category_name FROM ' . get_table_prefix() . 'group_category_access WHERE ' . db_string_equal_to('module_the_name', 'banners') . ' AND (' . $groups . ')')); $new_rows = array(); foreach ($rows as $row) { if (in_array($row['name'], $perhaps)) { $new_rows[] = $row; } } $rows = $new_rows; } } $ADVERTISING_BANNERS = array(); foreach ($rows as $row) { $trigger_text = $row['b_title_text']; foreach (explode(',', $trigger_text) as $t) { if (trim($t) != '') { $ADVERTISING_BANNERS[trim($t)] = $row; } } } } } // Apply if (!is_null($ADVERTISING_BANNERS)) { foreach ($ADVERTISING_BANNERS as $ad_trigger => $ad_bits) { if (strtolower($next) == strtolower($ad_trigger[0])) { if (strtolower(substr($comcode, $pos - 1, strlen($ad_trigger))) == strtolower($ad_trigger)) { require_code('banners'); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $differented = true; $ad_text = show_banner($ad_bits['name'], $ad_bits['b_title_text'], get_translated_tempcode($ad_bits['caption']), $ad_bits['img_url'], '', $ad_bits['site_url'], $ad_bits['b_type']); $embed_output = _do_tags_comcode('tooltip', array('param' => $ad_text, 'url' => url_is_local($ad_bits['site_url']) && $ad_bits['site_url'] != '' ? get_custom_base_url() . '/' . $ad_bits['site_url'] : $ad_bits['site_url']), substr($comcode, $pos - 1, strlen($ad_trigger)), $comcode_dangerous, $pass_id, $pos, $source_member, $as_admin, $connection, $comcode, $wml, $structure_sweep, $semiparse_mode, $highlight_bits); $pos += strlen($ad_trigger) - 1; $tag_output->attach($embed_output); } } } } } // Search highlighting lookahead if (!$differented && !is_null($highlight_bits)) { foreach ($highlight_bits as $highlight_bit) { if (strtolower($next) == strtolower($highlight_bit[0])) { if (strtolower(substr($comcode, $pos - 1, strlen($highlight_bit))) == strtolower($highlight_bit)) { if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $differented = true; $embed_output = _do_tags_comcode('highlight', array(), escape_html(substr($comcode, $pos - 1, strlen($highlight_bit))), $comcode_dangerous, $pass_id, $pos, $source_member, $as_admin, $connection, $comcode, $wml, $structure_sweep, $semiparse_mode, $highlight_bits); $pos += strlen($highlight_bit) - 1; $tag_output->attach($embed_output); break; } } } } // Link lookahead if (!$differented && !$in_code_tag) { if (!$in_semihtml && $next == 'h' && (substr($comcode, $pos - 1, strlen('http://')) == 'http://' || substr($comcode, $pos - 1, strlen('https://')) == 'https://' || substr($comcode, $pos - 1, strlen('ftp://')) == 'ftp://')) { $link_end_pos = strpos($comcode, ' ', $pos - 1); $link_end_pos_2 = strpos($comcode, chr(10), $pos - 1); $link_end_pos_3 = strpos($comcode, '[', $pos - 1); $link_end_pos_4 = strpos($comcode, ')', $pos - 1); $link_end_pos_5 = strpos($comcode, '"', $pos - 1); $link_end_pos_6 = strpos($comcode, '>', $pos - 1); $link_end_pos_7 = strpos($comcode, '<', $pos - 1); $link_end_pos_8 = strpos($comcode, '.' . chr(10), $pos - 1); $link_end_pos_9 = strpos($comcode, ', ', $pos - 1); $link_end_pos_10 = strpos($comcode, '. ', $pos - 1); $link_end_pos_11 = strpos($comcode, "'", $pos - 1); if ($link_end_pos_2 !== false && ($link_end_pos === false || $link_end_pos_2 < $link_end_pos)) { $link_end_pos = $link_end_pos_2; } if ($link_end_pos_3 !== false && ($link_end_pos === false || $link_end_pos_3 < $link_end_pos)) { $link_end_pos = $link_end_pos_3; } if ($link_end_pos_4 !== false && ($link_end_pos === false || $link_end_pos_4 < $link_end_pos)) { $link_end_pos = $link_end_pos_4; } if ($link_end_pos_5 !== false && ($link_end_pos === false || $link_end_pos_5 < $link_end_pos)) { $link_end_pos = $link_end_pos_5; } if ($link_end_pos_6 !== false && ($link_end_pos === false || $link_end_pos_6 < $link_end_pos)) { $link_end_pos = $link_end_pos_6; } if ($link_end_pos_7 !== false && ($link_end_pos === false || $link_end_pos_7 < $link_end_pos)) { $link_end_pos = $link_end_pos_7; } if ($link_end_pos_8 !== false && ($link_end_pos === false || $link_end_pos_8 < $link_end_pos)) { $link_end_pos = $link_end_pos_8; } if ($link_end_pos_9 !== false && ($link_end_pos === false || $link_end_pos_9 < $link_end_pos)) { $link_end_pos = $link_end_pos_9; } if ($link_end_pos_10 !== false && ($link_end_pos === false || $link_end_pos_10 < $link_end_pos)) { $link_end_pos = $link_end_pos_10; } if ($link_end_pos_11 !== false && ($link_end_pos === false || $link_end_pos_11 < $link_end_pos)) { $link_end_pos = $link_end_pos_11; } if ($link_end_pos === false) { $link_end_pos = strlen($comcode); } $auto_link = preg_replace('#(keep|for)_session=[\\d\\w]*#', 'filtered=1', substr($comcode, $pos - 1, $link_end_pos - $pos + 1)); if (substr($auto_link, -3) != '://') { if (substr($auto_link, -1) == '.') { $auto_link = substr($auto_link, 0, strlen($auto_link) - 1); $link_end_pos--; } $auto_link_tempcode = new ocp_tempcode(); $auto_link_tempcode->attach($auto_link); if (!$check_only) { $link_captions_title = $GLOBALS['SITE_DB']->query_value_null_ok('url_title_cache', 't_title', array('t_url' => $auto_link)); if (is_null($link_captions_title) || substr($link_captions_title, 0, 1) == '!') { $GLOBALS['COMCODE_PARSE_URLS_CHECKED']++; if ($GLOBALS['NO_LINK_TITLES'] || $GLOBALS['COMCODE_PARSE_URLS_CHECKED'] >= MAX_URLS_TO_READ) { $link_captions_title = $auto_link; } else { $link_captions_title = ''; $downloaded_at_link = http_download_file($auto_link, 3000, false); if (is_string($downloaded_at_link) && $GLOBALS['HTTP_DOWNLOAD_MIME_TYPE'] !== NULL && strpos($GLOBALS['HTTP_DOWNLOAD_MIME_TYPE'], 'html') !== false && $GLOBALS['HTTP_MESSAGE'] == '200') { $matches = array(); if (preg_match('#\\s*<title[^>]*\\s*>\\s*(.*)\\s*\\s*<\\s*/title\\s*>#miU', $downloaded_at_link, $matches) != 0) { require_code('character_sets'); $link_captions_title = trim(str_replace('–', '-', str_replace('—', '-', @html_entity_decode(convert_to_internal_encoding($matches[1]), ENT_QUOTES, get_charset())))); if ((strpos(strtolower($link_captions_title), 'login') !== false || strpos(strtolower($link_captions_title), 'log in') !== false) && substr($auto_link, 0, strlen(get_base_url())) == get_base_url()) { $link_captions_title = ''; } // don't show login screen titles for our own website. Better to see the link verbatim } } $GLOBALS['SITE_DB']->query_insert('url_title_cache', array('t_url' => substr($auto_link, 0, 255), 't_title' => substr($link_captions_title, 0, 255)), false, true); // To stop weird race-like conditions } } $embed_output = mixed(); $link_handlers = find_all_hooks('systems', 'comcode_link_handlers'); foreach (array_keys($link_handlers) as $link_handler) { require_code('hooks/systems/comcode_link_handlers/' . $link_handler); $link_handler_ob = object_factory('Hook_comcode_link_handler_' . $link_handler, true); if (is_null($link_handler_ob)) { continue; } $embed_output = $link_handler_ob->bind($auto_link, $link_captions_title, $comcode_dangerous, $pass_id, $pos, $source_member, $as_admin, $connection, $comcode, $wml, $structure_sweep, $semiparse_mode, $highlight_bits); if (!is_null($embed_output)) { break; } } if (is_null($embed_output)) { $page_link = url_to_pagelink($auto_link, true); if ($link_captions_title == '') { $link_captions_title = $auto_link; } if ($page_link != '') { $embed_output = _do_tags_comcode('page', array('param' => $page_link), make_string_tempcode(escape_html($link_captions_title)), $comcode_dangerous, $pass_id, $pos, $source_member, $as_admin, $connection, $comcode, $wml, $structure_sweep, $semiparse_mode, $highlight_bits); } else { $embed_output = _do_tags_comcode('url', array('param' => $link_captions_title), $auto_link_tempcode, $comcode_dangerous, $pass_id, $pos, $source_member, $as_admin, $connection, $comcode, $wml, $structure_sweep, $semiparse_mode, $highlight_bits); } } } else { $embed_output = new ocp_tempcode(); } if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; $tag_output->attach($embed_output); $pos += $link_end_pos - $pos; $differented = true; } } } } if (!$differented) { if ($stupidity_mode != '' && $textual_area) { if ($stupidity_mode == 'leet' && mt_rand(0, 1) == 1) { if (array_key_exists(strtoupper($next), $LEET_FILTER)) { $next = $LEET_FILTER[strtoupper($next)]; } } elseif ($stupidity_mode == 'bork' && mt_rand(0, 60) == 1) { $next .= '-bork-bork-bork-'; } } if (!$in_separate_parse_section && (!$in_semihtml || !$comcode_dangerous_html && !$is_all_semihtml)) { if ($next == '&') { $ahead = substr($comcode, $pos, 20); $ahead_lower = strtolower($ahead); $matches = array(); $entity = preg_match('#^(\\#)?([\\w]*);#', $ahead_lower, $matches) != 0; // If it is a SAFE entity, use it if ($entity && !$in_code_tag) { if ($matches[1] == '' && ($in_semihtml || isset($ALLOWED_ENTITIES[$matches[2]]))) { $pos += strlen($matches[2]) + 1; $continuation .= '&' . $matches[2] . ';'; } elseif (is_numeric($matches[2]) && $matches[1] == '#') { $matched_entity = intval(base_convert($matches[2], 16, 10)); if ($matched_entity < 127 && array_key_exists(chr($matched_entity), $POTENTIAL_JS_NAUGHTY_ARRAY)) { $continuation .= escape_html($next); } else { $pos += strlen($matches[2]) + 2; $continuation .= '&#' . $matches[2] . ';'; } } else { $continuation .= '&'; } } else { $continuation .= '&'; } } else { $continuation .= escape_html($next); } } else { $continuation .= $next; } } } } } break; case CCP_IN_TAG_NAME: if ($mindless_mode && $next != '[') { $tag_raw .= $next; } if ($next == '=') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_RIGHT; $current_attribute_name = 'param'; } elseif (trim($next) == '') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; } elseif ($next == '[') { if (!$lax) { return comcode_parse_error($preparse_mode, array('CCP_TAG_OPEN_ANOMALY'), $pos, $comcode, $check_only); } $next = ']'; $pos--; } if ($next == ']') { if ($close) { if ($formatting_allowed) { list($close_list, $list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($close_list); } $tag_output->attach($close_list); } if (count($tag_stack) == 0) { if ($lax) { $status = CCP_NO_MANS_LAND; break; } return comcode_parse_error($preparse_mode, array('CCP_NO_CLOSE', $current_tag), strrpos(substr($comcode, 0, $pos), '['), $comcode, $check_only); } $has_it = false; foreach (array_reverse($tag_stack) as $t) { if ($t[0] == $current_tag) { $has_it = true; break; } if ($in_semihtml && ($current_tag == 'html' || $current_tag == 'semihtml')) { // Only search one level for this break; } } if ($has_it) { $_last = array_pop($tag_stack); if ($_last[0] != $current_tag) { if (!$lax) { return comcode_parse_error($preparse_mode, array('CCP_NO_CLOSE_MATCH', $current_tag, $_last[0]), $pos, $comcode, $check_only); } do { $embed_output = _do_tags_comcode($_last[0], $_last[1], $tag_output, $comcode_dangerous, $pass_id, $pos, $source_member, $as_admin, $connection, $comcode, $wml, $structure_sweep, $semiparse_mode, NULL, NULL, $in_semihtml, $is_all_semihtml); $in_code_tag = false; $white_space_area = $_last[3]; $in_separate_parse_section = $_last[4]; $formatting_allowed = $_last[5]; $textual_area = $_last[6]; $tag_output = $_last[2]; $tag_output->attach($embed_output); $mindless_mode = $_last[7]; $comcode_dangerous = $_last[8]; $comcode_dangerous_html = $_last[9]; if (count($tag_stack) == 0) { $status = CCP_NO_MANS_LAND; break 2; } $_last = array_pop($tag_stack); } while ($_last[0] != $current_tag); } } else { $extraneous_semihtml = !$is_all_semihtml && !$in_semihtml || $current_tag != 'html' && $current_tag != 'semihtml'; if (!$lax && $extraneous_semihtml) { $_last = array_pop($tag_stack); return comcode_parse_error($preparse_mode, array('CCP_NO_CLOSE_MATCH', $current_tag, $_last[0]), $pos, $comcode, $check_only); } $status = CCP_NO_MANS_LAND; break; } // Do the comcode for this tag if ($in_semihtml) { foreach ($_last[1] as $index => $conv) { $_last[1][$index] = @html_entity_decode(str_replace('<br />', chr(10), $conv), ENT_QUOTES, get_charset()); } } $mindless_mode = $_last[7]; if ($mindless_mode) { $embed_output = $tag_output; } elseif (!$check_only) { $_structure_sweep = false; if ($structure_sweep) { $_structure_sweep = !in_tag_stack($tag_stack, array('title')); } $embed_output = _do_tags_comcode($_last[0], $_last[1], $tag_output, $comcode_dangerous, $pass_id, $pos, $source_member, $as_admin, $connection, $comcode, $wml, $_structure_sweep, $semiparse_mode, $highlight_bits, NULL, $in_semihtml, $is_all_semihtml); } else { $embed_output = new ocp_tempcode(); } $in_code_tag = false; $white_space_area = $_last[3]; $in_separate_parse_section = $_last[4]; $formatting_allowed = $_last[5]; $textual_area = $_last[6]; $tag_output = $_last[2]; $comcode_dangerous = $_last[8]; $comcode_dangerous_html = $_last[9]; if ($print_mode && $_last[0] == 'exp_thumb') { $queued_tempcode->attach($embed_output); } else { $tag_output->attach($embed_output); } $just_ended = isset($BLOCK_TAGS[$current_tag]); if ($current_tag == 'title') { if (strlen($comcode) > $pos + 1 && $comcode[$pos] == chr(10) && $comcode[$pos + 1] == chr(10)) { $NUM_LINES += 2; $pos += 2; $just_new_line = true; } } if ($current_tag == 'html') { $in_html = false; } elseif ($current_tag == 'semihtml') { $in_semihtml = false; } $status = CCP_NO_MANS_LAND; } else { if ($current_tag == 'title') { $just_new_line = false; list($close_list, $list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($close_list); } $tag_output->attach($close_list); } array_push($tag_stack, array($current_tag, $attribute_map, $tag_output, $white_space_area, $in_separate_parse_section, $formatting_allowed, $textual_area, $mindless_mode, $comcode_dangerous, $comcode_dangerous_html)); list($tag_output, $comcode_dangerous, $comcode_dangerous_html, $white_space_area, $formatting_allowed, $in_separate_parse_section, $textual_area, $attribute_map, $status, $in_html, $in_semihtml, $pos, $in_code_tag) = _opened_tag($mindless_mode, $as_admin, $source_member, $attribute_map, $current_tag, $pos, $comcode_dangerous, $comcode_dangerous_html, $in_separate_parse_section, $in_html, $in_semihtml, $close, $len, $comcode); if ($in_code_tag) { $code_nest_stack = 0; } } $tag_output->attach($tag_raw); if ($close && $mindless_mode) { $temp_tpl = '</kbd>​'; if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($temp_tpl); } $tag_output->attach($temp_tpl); } } elseif ($status == CCP_IN_TAG_NAME) { $current_tag .= strtolower($next); } break; case CCP_STARTING_TAG: if ($mindless_mode && $next != '[') { $tag_raw .= $next; } if ($next == '[') { if (!$lax) { return comcode_parse_error($preparse_mode, array('CCP_TAG_OPEN_ANOMALY'), $pos, $comcode, $check_only); } $status = CCP_NO_MANS_LAND; $pos--; } elseif ($next == ']') { if (!$lax) { return comcode_parse_error($preparse_mode, array('CCP_TAG_CLOSE_ANOMALY'), $pos, $comcode, $check_only); } $status = CCP_NO_MANS_LAND; } elseif ($next == '/') { $close = true; } else { $current_tag .= strtolower($next); $status = CCP_IN_TAG_NAME; } break; case CCP_IN_TAG_BETWEEN_ATTRIBUTES: if ($mindless_mode && $next != '[') { $tag_raw .= $next; } if ($next == ']') { if ($current_tag == 'title') { $just_new_line = false; list($close_list, $list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($close_list); } $tag_output->attach($close_list); } array_push($tag_stack, array($current_tag, $attribute_map, $tag_output, $white_space_area, $in_separate_parse_section, $formatting_allowed, $textual_area, $mindless_mode, $comcode_dangerous, $comcode_dangerous_html)); list($tag_output, $comcode_dangerous, $comcode_dangerous_html, $white_space_area, $formatting_allowed, $in_separate_parse_section, $textual_area, $attribute_map, $status, $in_html, $in_semihtml, $pos, $in_code_tag) = _opened_tag($mindless_mode, $as_admin, $source_member, $attribute_map, $current_tag, $pos, $comcode_dangerous, $comcode_dangerous_html, $in_separate_parse_section, $in_html, $in_semihtml, $close, $len, $comcode); if ($in_code_tag) { $code_nest_stack = 0; } $tag_output->attach($tag_raw); } elseif ($next == '[') { if (!$lax) { return comcode_parse_error($preparse_mode, array('CCP_TAG_OPEN_ANOMALY'), $pos, $comcode, $check_only); } if ($current_tag == 'title') { $just_new_line = false; list($close_list, $list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($close_list); } $tag_output->attach($close_list); } array_push($tag_stack, array($current_tag, $attribute_map, $tag_output, $white_space_area, $in_separate_parse_section, $formatting_allowed, $textual_area, $mindless_mode, $comcode_dangerous, $comcode_dangerous_html)); list($tag_output, $comcode_dangerous, $comcode_dangerous_html, $white_space_area, $formatting_allowed, $in_separate_parse_section, $textual_area, $attribute_map, $status, $in_html, $in_semihtml, $pos, $in_code_tag) = _opened_tag($mindless_mode, $as_admin, $source_member, $attribute_map, $current_tag, $pos, $comcode_dangerous, $comcode_dangerous_html, $in_separate_parse_section, $in_html, $in_semihtml, $close, $len, $comcode); if ($in_code_tag) { $code_nest_stack = 0; } $tag_output->attach($tag_raw); $pos--; } elseif (trim($next) != '') { $status = CCP_IN_TAG_ATTRIBUTE_NAME; $current_attribute_name = $next; } break; case CCP_IN_TAG_ATTRIBUTE_NAME: if ($mindless_mode && $next != '[') { $tag_raw .= $next; } if ($next == '[') { $status = CCP_NO_MANS_LAND; $pos--; if (!$lax) { return comcode_parse_error($preparse_mode, array('CCP_TAG_OPEN_ANOMALY'), $pos, $comcode, $check_only); } if ($current_tag == 'title') { $just_new_line = false; list($close_list, $list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($close_list); } $tag_output->attach($close_list); } array_push($tag_stack, array($current_tag, $attribute_map, $tag_output, $white_space_area, $in_separate_parse_section, $formatting_allowed, $textual_area, $mindless_mode, $comcode_dangerous, $comcode_dangerous_html)); list($tag_output, $comcode_dangerous, $comcode_dangerous_html, $white_space_area, $formatting_allowed, $in_separate_parse_section, $textual_area, $attribute_map, $status, $in_html, $in_semihtml, $pos, $in_code_tag) = _opened_tag($mindless_mode, $as_admin, $source_member, $attribute_map, $current_tag, $pos, $comcode_dangerous, $comcode_dangerous_html, $in_separate_parse_section, $in_html, $in_semihtml, $close, $len, $comcode); if ($in_code_tag) { $code_nest_stack = 0; } $tag_output->attach($tag_raw); } elseif ($next == ']') { if ($attribute_map == array() && !$lax) { return comcode_parse_error($preparse_mode, array('CCP_TAG_CLOSE_ANOMALY'), $pos, $comcode, $check_only); } if ($attribute_map != array()) { $at_map_keys = array_keys($attribute_map); $old_attribute_name = $at_map_keys[count($at_map_keys) - 1]; $attribute_map[$old_attribute_name] .= ' ' . $current_attribute_name; } array_push($tag_stack, array($current_tag, $attribute_map, $tag_output, $white_space_area, $in_separate_parse_section, $formatting_allowed, $textual_area, $mindless_mode, $comcode_dangerous, $comcode_dangerous_html)); list($tag_output, $comcode_dangerous, $comcode_dangerous_html, $white_space_area, $formatting_allowed, $in_separate_parse_section, $textual_area, $attribute_map, $status, $in_html, $in_semihtml, $pos, $in_code_tag) = _opened_tag($mindless_mode, $as_admin, $source_member, $attribute_map, $current_tag, $pos, $comcode_dangerous, $comcode_dangerous_html, $in_separate_parse_section, $in_html, $in_semihtml, $close, $len, $comcode); if ($in_code_tag) { $code_nest_stack = 0; } $tag_output->attach($tag_raw); } elseif ($next == '=') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_RIGHT; } elseif ($next != ' ') { $current_attribute_name .= strtolower($next); } else { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_LEFT; } break; case CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_LEFT: if ($mindless_mode && $next != '[' && $next != ']') { $tag_raw .= $next; } if ($next == '=') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_RIGHT; } elseif (trim($next) != '') { if (!$lax) { return comcode_parse_error($preparse_mode, array('CCP_ATTRIBUTE_ERROR', $current_attribute_name, $current_tag), $pos, $comcode, $check_only); } if ($next == '[') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; $pos--; } elseif ($next == ']') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; $pos--; } } break; case CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_RIGHT: if ($mindless_mode && $next != '[' && $next != ']') { $tag_raw .= $next; } if ($next == '[') { if (!$lax) { return comcode_parse_error($preparse_mode, array('CCP_TAG_OPEN_ANOMALY'), $pos, $comcode, $check_only); } $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; $pos--; } elseif ($next == ']') { if (!$lax) { return comcode_parse_error($preparse_mode, array('CCP_TAG_CLOSE_ANOMALY'), $pos, $comcode, $check_only); } $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; $pos--; } elseif ($next == '"' || $in_semihtml && substr($comcode, $pos - 1, 6) == '"') { if ($next != '"') { $pos += 5; if ($mindless_mode) { $tag_raw .= 'quot;'; } } $status = CCP_IN_TAG_ATTRIBUTE_VALUE; $current_attribute_value = ''; } elseif ($next != '') { $status = CCP_IN_TAG_ATTRIBUTE_VALUE_NO_QUOTE; $current_attribute_value = $next; } break; case CCP_IN_TAG_ATTRIBUTE_VALUE_NO_QUOTE: if ($mindless_mode && $next != ']') { $tag_raw .= $next; } if ($next == ' ') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; if (isset($attribute_map[$current_attribute_name]) && !$lax) { return comcode_parse_error($preparse_mode, array('CCP_DUPLICATE_ATTRIBUTES', $current_attribute_name, $current_tag), $pos, $comcode, $check_only); } $attribute_map[$current_attribute_name] = $current_attribute_value; } elseif ($next == ']') { if (isset($attribute_map[$current_attribute_name]) && !$lax) { return comcode_parse_error($preparse_mode, array('CCP_DUPLICATE_ATTRIBUTES', $current_attribute_name, $current_tag), $pos, $comcode, $check_only); } $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; $attribute_map[$current_attribute_name] = $current_attribute_value; $pos--; } else { $current_attribute_value .= $next; } break; case CCP_IN_TAG_ATTRIBUTE_VALUE: if ($mindless_mode) { $tag_raw .= $next; } if ($next == '"' || $in_semihtml && substr($comcode, $pos - 1, 6) == '"') { if ($next != '"') { $pos += 5; if ($mindless_mode) { $tag_raw .= 'quot;'; } } $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; if (isset($attribute_map[$current_attribute_name]) && !$lax) { return comcode_parse_error($preparse_mode, array('CCP_DUPLICATE_ATTRIBUTES', $current_attribute_name, $current_tag), $pos, $comcode, $check_only); } $attribute_map[$current_attribute_name] = $current_attribute_value; } else { if ($next == '\\') { if ($comcode[$pos] == '"') { if ($mindless_mode) { $tag_raw .= '"'; } $current_attribute_value .= '"'; ++$pos; } elseif (substr($comcode, $pos - 1, 6) == '"') { if ($mindless_mode) { $tag_raw .= '"'; } $current_attribute_value .= '"'; $pos += 6; } elseif ($comcode[$pos] == '\\') { if ($mindless_mode) { $tag_raw .= '\\'; } $current_attribute_value .= '\\'; ++$pos; } else { $current_attribute_value .= $next; } } else { $current_attribute_value .= $next; } } break; } } if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($continuation); } $tag_output->attach($continuation); $continuation = ''; list($close_list, $list_indent) = _close_open_lists($list_indent, $list_type); if ($GLOBALS['XSS_DETECT']) { ocp_mark_as_escaped($close_list); } $tag_output->attach($close_list); if ($status != CCP_NO_MANS_LAND || count($tag_stack) != 0) { if (!$lax) { $stack_top = array_pop($tag_stack); return comcode_parse_error($preparse_mode, array('CCP_BROKEN_END', is_null($stack_top) ? $current_tag : $stack_top[0]), $pos, $comcode, $check_only); } else { while (count($tag_stack) > 0) { $_last = array_pop($tag_stack); /*if ($_last[0]=='title') Not sure about this { $_structure_sweep=false; break; }*/ $embed_output = _do_tags_comcode($_last[0], $_last[1], $tag_output, $comcode_dangerous, $pass_id, $pos, $source_member, $as_admin, $connection, $comcode, $wml, $structure_sweep, $semiparse_mode, NULL, NULL, $in_semihtml, $is_all_semihtml); $in_code_tag = false; $white_space_area = $_last[3]; $in_separate_parse_section = $_last[4]; $formatting_allowed = $_last[5]; $textual_area = $_last[6]; $tag_output = $_last[2]; $tag_output->attach($embed_output); $mindless_mode = $_last[7]; $comcode_dangerous = $_last[8]; $comcode_dangerous_html = $_last[9]; } } } // $tag_output->left_attach('<div class="xhtml_validator_off">'); // $tag_output->attach('</div>'); return $tag_output; }
/** * The UI to translate code. * * @return tempcode The UI */ function interface_code() { $lang = filter_naughty_harsh(get_param('lang', '')); $lang_new = get_param('lang_new', $lang); if ($lang_new != '') { require_code('type_validation'); if (!is_alphanumeric($lang_new, true)) { warn_exit(do_lang_tempcode('BAD_CODENAME')); } if (strlen($lang_new) > 5) { warn_exit(do_lang_tempcode('INVALID_LANG_CODE')); } $lang = $lang_new; } if ($lang == '') { $title = get_page_title('TRANSLATE_CODE'); $GLOBALS['HELPER_PANEL_TEXT'] = comcode_lang_string('DOC_FIND_LANG_STRING_TIP'); return $this->choose_lang($title, true, true, do_lang_tempcode('CHOOSE_EDIT_LIST_LANG_FILE')); } breadcrumb_set_parents(array(array('_SELF:_SELF:misc', do_lang_tempcode('CHOOSE')))); breadcrumb_set_self(do_lang_tempcode('TRANSLATE_CODE')); $base_lang = fallback_lang(); $map_a = get_file_base() . '/lang/langs.ini'; $map_b = get_custom_file_base() . '/lang_custom/langs.ini'; $search = get_param('search', '', true); if ($search != '') { $title = get_page_title('TRANSLATE_CODE'); require_code('form_templates'); $fields = new ocp_tempcode(); global $LANGUAGE; foreach ($LANGUAGE[user_lang()] as $key => $value) { if (strpos(strtolower($value), strtolower($search)) !== false) { $fields->attach(form_input_text($key, '', 'l_' . $key, str_replace('\\n', chr(10), $value), false)); } } if ($fields->is_empty()) { inform_exit(do_lang_tempcode('NO_ENTRIES')); } $post_url = build_url(array('page' => '_SELF', 'type' => '_code2'), '_SELF'); $hidden = new ocp_tempcode(); $hidden->attach(form_input_hidden('redirect', get_self_url(true))); $hidden->attach(form_input_hidden('lang', $lang)); return do_template('FORM_SCREEN', array('_GUID' => '2d7356fd2c4497ceb19450e65331c9c5', 'TITLE' => $title, 'HIDDEN' => $hidden, 'FIELDS' => $fields, 'URL' => $post_url, 'TEXT' => '', 'SUBMIT_NAME' => do_lang('TRANSLATE_CODE'))); } $lang_file = get_param('lang_file'); if (!file_exists($map_b)) { $map_b = $map_a; } $map = better_parse_ini_file($map_b); $title = get_page_title('_TRANSLATE_CODE', true, array(escape_html($lang_file), escape_html(array_key_exists($lang, $map) ? $map[$lang] : $lang))); // Upgrade to custom if not there yet (or maybe we are creating a new lang - same difference) $custom_dir = get_custom_file_base() . '/lang_custom/' . $lang; if (!file_exists($custom_dir)) { require_code('abstract_file_manager'); force_have_afm_details(); afm_make_directory('lang_custom/' . $lang, true); $cached_dir = get_custom_file_base() . '/lang_cached/' . $lang; if (!file_exists($cached_dir)) { afm_make_directory('lang_cached/' . $lang, true); } // Make comcode page dirs $zones = find_all_zones(); foreach ($zones as $zone) { $_special_dir = get_custom_file_base() . '/' . $zone . '/pages/comcode_custom/' . $lang; if (!file_exists($_special_dir)) { afm_make_directory($zone . ($zone == '' ? '' : '/') . 'pages/comcode_custom/' . $lang, true); } $_special_dir = get_custom_file_base() . '/' . $zone . '/pages/html_custom/' . $lang; if (!file_exists($_special_dir)) { afm_make_directory($zone . ($zone == '' ? '' : '/') . 'pages/html_custom/' . $lang, true); } } // Make templates_cached dirs require_code('themes2'); $themes = find_all_themes(); foreach (array_keys($themes) as $theme) { $_special_dir = get_custom_file_base() . '/themes/' . $theme . '/templates_cached/' . $lang; if (!file_exists($_special_dir)) { afm_make_directory('themes/' . $theme . '/templates_cached/' . $lang, true); } } } // Get some stuff $for_lang = get_lang_file_map($lang, $lang_file); $for_base_lang = get_lang_file_map($base_lang, $lang_file, true); $descriptions = get_lang_file_descriptions($base_lang, $lang_file); // Make our translation page $lines = ''; $intertrans = $this->get_intertran_conv($lang); $actions = new ocp_tempcode(); $next = 0; $trans_lot = ''; $delimit = chr(10) . '=-=-=-=-=-=-=-=-' . chr(10); foreach ($for_base_lang as $name => $old) { if (array_key_exists($name, $for_lang)) { $current = $for_lang[$name]; } else { $current = ''; //$this->find_lang_matches($old,$lang); Too slow / useless for code translation } if ($current == '' && strtolower($name) != $name) { $trans_lot .= str_replace('\\n', chr(10), str_replace(array('{', '}'), array('(((', ')))'), $old)) . $delimit; } } $translated_stuff = array(); if ($trans_lot != '' && $intertrans != '') { $result = http_download_file('http://translate.google.com/translate_t', NULL, false, false, 'ocPortal', array('text' => $trans_lot, 'langpair' => 'en|' . $intertrans)); if (!is_null($result)) { require_code('character_sets'); $result = convert_to_internal_encoding($result); $matches = array(); if (preg_match('#<div id=result_box dir="ltr">(.*)</div>#Us', convert_to_internal_encoding($result), $matches) != 0) { $result2 = $matches[1]; $result2 = @html_entity_decode($result2, ENT_QUOTES, get_charset()); $result2 = preg_replace('#\\s?<br>\\s?#', chr(10), $result2); $result2 = str_replace('> ', '>', str_replace(' <', ' <', str_replace('</ ', '</', str_replace(array('(((', ')))'), array('{', '}'), $result2)))); $translated_stuff = explode(trim($delimit), $result2 . chr(10)); } } } foreach ($for_base_lang + $for_lang as $name => $old) { if (array_key_exists($name, $for_lang)) { $current = $for_lang[$name]; } else { $current = ''; //$this->find_lang_matches($old,$lang); Too slow / useless for code translation } $description = array_key_exists($name, $descriptions) ? $descriptions[$name] : ''; if ($current == '' && strtolower($name) != $name && array_key_exists($next, $translated_stuff)) { $_current = ''; $translate_auto = trim($translated_stuff[$next]); $next++; } else { $_current = str_replace('\\n', chr(10), $current); $translate_auto = NULL; } if ($_current == '') { $_current = str_replace('\\n', chr(10), $old); } if ($intertrans != '' && get_value('google_translate_api_key') !== NULL) { $actions = do_template('TRANSLATE_ACTION', array('_GUID' => '9e9a68cb2c1a1e23a901b84c9af2280b', 'LANG_FROM' => get_site_default_lang(), 'LANG_TO' => $lang, 'NAME' => 'trans_' . $name, 'OLD' => $_current)); } $temp = do_template('TRANSLATE_LINE', array('_GUID' => '9cb331f5852ee043e6ad30b45aedc43b', 'TRANSLATE_AUTO' => $translate_auto, 'DESCRIPTION' => $description, 'NAME' => $name, 'OLD' => str_replace('\\n', chr(10), $old), 'CURRENT' => $_current, 'ACTIONS' => $actions)); $lines .= $temp->evaluate(); } $url = build_url(array('page' => '_SELF', 'type' => '_code', 'lang_file' => $lang_file, 'lang' => $lang), '_SELF'); return do_template('TRANSLATE_SCREEN', array('_GUID' => 'b3429f8bd0b4eb79c33709ca43e3207c', 'PAGE' => $lang_file, 'INTERTRANS' => get_value('google_translate_api_key') !== NULL ? $intertrans : '', 'LANG' => $lang, 'LINES' => $lines, 'TITLE' => $title, 'URL' => $url)); }
/** * Convert Comcode-Text to Comcode-XML. * * @param LONG_TEXT The comcode to convert * @param boolean Whether to not include a wrapper element (<comcode>) * @return LONG_TEXT The converted comcode */ function comcode_text__to__comcode_xml($comcode, $skip_wrapper = false) { require_code('comcode_xml'); require_code('comcode_text'); require_code('comcode_renderer'); if (substr($comcode, 0, 8) == '<comcode') { if ($skip_wrapper) { return str_replace('<comcode>', '', str_replace('</comcode>', '', $comcode)); } return $comcode; } $xml = ''; global $ALLOWED_ENTITIES, $CODE_TAGS, $DANGEROUS_TAGS, $VALID_COMCODE_TAGS, $BLOCK_TAGS, $POTENTIAL_JS_NAUGHTY_ARRAY, $TEXTUAL_TAGS, $LEET_FILTER, $IMPORTED_CUSTOM_COMCODE, $REPLACE_TARGETS; $len = strlen($comcode); require_lang('comcode'); require_code('type_validation'); if (function_exists('set_time_limit') && ini_get('max_execution_time') != '0') { @set_time_limit(300); } $comcode_dangerous = true; $comcode_dangerous_html = true; // Tag level $current_tag = ''; $attribute_map = array(); $continuation = ''; $close = mixed(); // Properties that come from our tag $white_space_area = true; $textual_area = true; $formatting_allowed = true; $in_html = false; $in_semihtml = false; $in_separate_parse_section = false; // Not escaped because it has to be passed to a secondary filter $in_code_tag = false; $lax = false; // Our state $status = CCP_NO_MANS_LAND; $tag_stack = array(); $pos = 0; $line_starting = true; $just_ended = false; $none_wrap_length = 0; $just_new_line = true; // So we can detect lists starting right away $just_title = false; global $NUM_LINES; $NUM_LINES = 0; $wrap_pos = 60; $preparse_mode = false; $is_all_semihtml = false; $smilies = $GLOBALS['FORUM_DRIVER']->find_emoticons(); // We'll be needing the smiley array $shortcuts = array('(c)' => '©', '(r)' => '®', '--' => '–', '---' => '—'); // Text syntax possibilities, that get maintained as our cursor moves through the text block $list_indent = 0; $list_type = 'ul'; while ($pos < $len) { $next = $comcode[$pos]; ++$pos; // State machine switch ($status) { case CCP_NO_MANS_LAND: if ($next == '[') { // Look ahead to make sure it's a valid tag. If it's not then it's considered normal user input, not a tag at all $dif = $pos < $len && $comcode[$pos] == '/' ? 1 : 0; $ahead = substr($comcode, $pos + $dif, 19); $equal_pos = strpos($ahead, '='); $space_pos = strpos($ahead, ' '); $end_pos = strpos($ahead, ']'); $cl_pos = strpos($ahead, chr(10)); if ($equal_pos === false) { $equal_pos = 22; } if ($space_pos === false) { $space_pos = 22; } if ($end_pos === false) { $end_pos = 22; } if ($cl_pos === false) { $cl_pos = 22; } $use_pos = min($equal_pos, $space_pos, $end_pos, $cl_pos); $potential_tag = strtolower(substr($ahead, 0, $use_pos)); if ($use_pos != 22 && (!$in_html || $potential_tag == 'html' || $potential_tag == 'semihtml') && (!$in_code_tag || isset($CODE_TAGS[$potential_tag]))) { if (!isset($VALID_COMCODE_TAGS[$potential_tag])) { if (!$IMPORTED_CUSTOM_COMCODE) { _custom_comcode_import($GLOBALS['SITE_DB']); } } if (isset($VALID_COMCODE_TAGS[$potential_tag]) && substr($ahead, 0, 2) != 'i ') { $close = false; $current_tag = ''; $xml .= $continuation; $continuation = ''; if ($potential_tag == 'html' || $potential_tag == 'semihtml') { list($close_list, $list_indent) = _convert_close_open_lists($list_indent); $xml .= $close_list; } $status = CCP_STARTING_TAG; continue; } } } if ($in_html || $in_semihtml && ($next == '<' || $next == '>')) { $ahead = substr($comcode, $pos - 1, 20); $ahead_lower = strtolower($ahead); if ($next == chr(10)) { ++$NUM_LINES; } $continuation .= $next; } else { // Text-format possibilities if ($just_new_line && $formatting_allowed) { $xml .= $continuation; $continuation = ''; // List $found_list = false; $old_list_indent = $list_indent; if ($pos + 1 < $len && is_numeric($next) && $comcode[$pos] == ')' && $comcode[$pos + 1] == ' ') { if ($list_indent != 0 && $list_type == 'ul') { list($temp_tpl, $old_list_indent) = _close_open_lists($list_indent, $list_type); $xml .= $temp_tpl; } $list_indent = 1; $found_list = true; $scan_pos = $pos; $list_type = '1'; } elseif ($pos + 1 < $len && ord($next) >= ord('a') && ord($next) <= ord('z') && $comcode[$pos] == ')' && $comcode[$pos + 1] == ' ') { if ($list_indent != 0 && $list_type == 'ul') { list($temp_tpl, $old_list_indent) = _close_open_lists($list_indent, $list_type); $xml .= $temp_tpl; } $list_indent = 1; $found_list = true; $scan_pos = $pos; $list_type = 'a'; } elseif ($next == ' ') { if ($old_list_indent != 0 && $list_type != 'ul') { list($temp_tpl, $old_list_indent) = _close_open_lists($list_indent, $list_type); $xml .= $temp_tpl; } $scan_pos = $pos - 1; $list_indent = 0; while ($scan_pos < $len) { $scan_next = $comcode[$scan_pos]; if ($scan_next == '-' && $comcode[$scan_pos + 1] == ' ') { $found_list = true; break; } else { if ($scan_next == ' ') { ++$list_indent; } else { break; } } ++$scan_pos; } if (!$found_list) { $list_indent = 0; } } else { list($close_list, $list_indent) = _convert_close_open_lists($list_indent); $xml .= $close_list; if ($next == '-' && !$just_title) { $scan_pos = $pos; $found_rule = true; while ($scan_pos < $len) { $scan_next = $comcode[$scan_pos]; if ($scan_next != '-') { if ($scan_next == chr(10)) { ++$NUM_LINES; break; } else { $found_rule = false; } } ++$scan_pos; } if ($found_rule) { $xml .= '<rule />'; $pos = $scan_pos + 1; $just_ended = true; $none_wrap_length = 0; continue; } } } // List handling if ($list_indent == $old_list_indent && $old_list_indent != 0) { $xml .= '</listElement>'; } for ($i = $list_indent; $i < $old_list_indent; ++$i) { $xml .= '</listElement>'; $xml .= '</list>'; } if ($list_indent < $old_list_indent && $list_indent != 0) { $xml .= '</listElement>'; } if ($found_list) { if ($list_indent - $old_list_indent > 1 && !$lax) { $error = comcode_parse_error($preparse_mode, array('CCP_LIST_JUMPYNESS'), $pos, $comcode); return $error->evaluate(); } for ($i = $old_list_indent; $i < $list_indent; ++$i) { switch ($list_type) { case 'ul': $xml .= '<list>'; break; case '1': $xml .= '<list type="1">'; break; case 'a': $xml .= '<list type="a">'; break; } if ($i < $list_indent - 1) { $xml .= '<listElement>'; } } $xml .= '<listElement>'; $just_ended = true; $none_wrap_length = 0; $next = ''; $pos = $scan_pos + 2; } } if ($next == chr(10) && $white_space_area && !$just_ended) { ++$NUM_LINES; $line_starting = true; $xml .= $continuation; $continuation = ''; $just_new_line = true; $none_wrap_length = 0; if ($list_indent == 0) { $xml .= '<br />' . chr(10); } } else { $just_new_line = false; if ($next == ' ' && $white_space_area) { if ($line_starting || $pos != 0 && $comcode[$pos - 2] == ' ') { $next = ' '; ++$none_wrap_length; } else { $none_wrap_length = 0; } $continuation .= $next; } elseif ($next == "\t" && $white_space_area) { $xml .= $continuation; $continuation = ''; $tab_tpl = do_template('COMCODE_TEXTCODE_TAB'); // $_tab_tpl = $tab_tpl->evaluate(); $none_wrap_length += strlen($_tab_tpl); $xml .= $tab_tpl->evaluate(); } else { if ($next == ' ' || $next == "\t" || $just_ended) { $none_wrap_length = 0; } else { if (!is_null($wrap_pos) && $none_wrap_length >= $wrap_pos && $textual_area && !$in_semihtml) { $xml .= $continuation; $continuation = ''; $xml .= '<br />' . chr(10); $none_wrap_length = 0; } elseif ($textual_area) { ++$none_wrap_length; } } $line_starting = false; $just_ended = false; $differented = false; // If somehow via lookahead we've changed this to HTML and thus won't use it in raw form // Symbol lookahead if (!$in_code_tag) { if ($next == '{' && ($comcode[$pos] == '$' || $comcode[$pos] == '+' || $comcode[$pos] == '!') && $comcode_dangerous) { $xml .= $continuation; $continuation = ''; if ($comcode[$pos] == '+') { $p_end = $pos + 5; while ($p_end < $len) { $p_portion = substr($comcode, $pos - 1, $p_end - ($pos - 1) + 5); if (substr_count($p_portion, '{+START') == substr_count($p_portion, '{+END')) { break; } $p_end++; } $p_len = 1; while ($pos + $p_len < $len) { $p_portion = substr($comcode, $pos - 1, $p_len); if (substr_count($p_portion, '{') == substr_count($p_portion, '}')) { break; } $p_len++; } $p_len--; $p_portion = substr($comcode, $pos + $p_len, $p_end - ($pos + $p_len)); $_ret = template_to_tempcode_static(substr($comcode, $pos - 1, $p_len + 1) . '!' . substr($comcode, $p_end, 6)); $ret = '<directive type="' . escape_html($_ret->bits[0][2]) . '">'; foreach ($_ret->bits[0][3] as $val) { $ret .= '<directiveParam>' . escape_html($val->evaluate()) . '</directiveParam>'; } $ret .= comcode_text__to__comcode_xml($p_portion, true); $ret .= '</directive>'; $pos = $p_end + 6; } else { $_ret = new ocp_tempcode(); $_ret->bits = array(read_single_uncompiled_variable($comcode, $pos, $len)); if ($_ret->bits[0][1] == TC_SYMBOL) { $ret = '<symbol>'; if (isset($_ret->bits[0][3])) { foreach ($_ret->bits[0][3] as $val) { $ret .= '<symbolParam>' . escape_html($val) . '</symbolParam>'; } } $ret .= $_ret->bits[0][2] . '</symbol>'; } else { $ret = '<language>'; if (isset($_ret->bits[0][3])) { foreach ($_ret->bits[0][3] as $val) { $ret .= '<languageParam>' . escape_html($val) . '</languageParam>'; } } $ret .= $_ret->bits[0][2] . '</language>'; } } $differented = true; $xml .= $ret; } } // Escaping of comcode tag starts lookahead if ($next == '\\' && !$in_code_tag) { if ($pos != $len && $comcode[$pos] == '"') { $continuation .= '"'; ++$pos; $differented = true; } elseif ($pos != $len && $comcode[$pos] == '[') { $continuation .= '['; ++$pos; $differented = true; } elseif ($pos != $len && $comcode[$pos] == '{') { $continuation .= '{'; ++$pos; $differented = true; } elseif ($pos == $len || $comcode[$pos] == '\\') { $continuation .= '\\'; ++$pos; $differented = true; } } // Smiley lookahead if (!$differented) { if (($textual_area || $in_semihtml) && trim($next) != '') { foreach ($smilies as $smiley => $imgcode) { if ($in_semihtml) { $smiley = ' ' . $smiley . ' '; } if ($next == $smiley[0]) { if (substr($comcode, $pos - 1, strlen($smiley)) == $smiley) { $xml .= $continuation; $continuation = ''; $pos += strlen($smiley) - 1; $differented = true; $xml .= '<emoticon>' . escape_html($imgcode) . '</emoticon>'; break; } } } } } if ($textual_area && trim($next) != '' && !$differented && addon_installed('cedi')) { // CEDI pages if ($pos < $len && $next == '[') { $matches = array(); if (preg_match('#^\\[([^\\[\\]]*)\\]\\]#', substr($comcode, $pos, 40), $matches) != 0) { $cedi_page_name = $matches[1]; $xml .= $continuation; $continuation = ''; $hash_pos = strpos($cedi_page_name, '#'); if ($hash_pos !== false) { $jump_to = substr($cedi_page_name, $hash_pos + 1); $cedi_page_name = substr($cedi_page_name, 0, $hash_pos); $xml .= '<cedi anchor="' . escape_html($jump_to) . '">' . escape_html($cedi_page_name) . '</cedi>'; } else { $xml .= '<cedi>' . escape_html($cedi_page_name) . '</cedi>'; } $pos += strlen($matches[1]) + 3; $differented = true; } } // Usernames if ($pos < $len && $next == '{') { $matches = array(); if (preg_match('#^\\{([^"{}&\'\\$<>]*)\\}\\}#', substr($comcode, $pos, 40), $matches) != 0) { $xml .= $continuation; $continuation = ''; $username = $matches[1]; if ($username[0] == '?') { $username = substr($username, 1); $xml .= '<member boxed="1">' . escape_html($username) . '</member>'; } else { $xml .= '<member>' . escape_html($username) . '</member>'; } $pos += strlen($matches[1]) + 3; $differented = true; } } if (!$in_code_tag && trim($next) != '' && !$differented) { // Shortcut lookahead if (!$differented) { foreach ($shortcuts as $code => $replacement) { if ($next == $code[0] && substr($comcode, $pos - 1, strlen($code)) == $code) { $xml .= $continuation; $continuation = ''; $pos += strlen($code) - 1; $differented = true; $xml .= $replacement; break; } } } } // Table syntax if (!$differented) { if ($pos < $len && $comcode[$pos] == '|') { $end_tbl = strpos($comcode, chr(10) . '|}', $pos); if ($end_tbl !== false) { $end_fst_line_pos = strpos($comcode, chr(10), $pos); $caption = substr($comcode, $pos + 2, max($end_fst_line_pos - $pos - 2, 0)); $pos += strlen($caption) + 1; $rows = preg_split('#(\\|-|\\|\\})#Um', substr($comcode, $pos, $end_tbl - $pos)); if (count($rows) == 1 && $caption == 'floats') { $cells = preg_split('/(\\n\\! | \\!\\! |\\n\\| | \\|\\| )/', $rows[0], -1, PREG_SPLIT_DELIM_CAPTURE); array_shift($cells); // First one is non-existant empty $spec = true; // Find which to float $to_float = NULL; foreach ($cells as $i => $cell) { if (!$spec) { if (strpos($cell, '!') !== false || is_null($to_float)) { $to_float = $i; } } $spec = !$spec; } $xml .= '<float>'; // Do floated one $xml .= '<fh>'; $xml .= comcode_text__to__comcode_xml(rtrim($cells[$to_float]), true); $xml .= '</fh>'; // Do non-floated ones foreach ($cells as $i => $cell) { if ($i % 2 == 1 && $i != $to_float) { $xml .= '<fd>'; $xml .= comcode_text__to__comcode_xml(rtrim($cells[$to_float]), true); $xml .= '</fd>'; } } $xml .= '</float>'; } else { $xml .= '<table summary="' . escape_html($caption) . '">'; foreach ($rows as $table_row) { $xml .= '<tr>'; $cells = preg_split('/(\\n\\! | \\!\\! |\\n\\| | \\|\\| )/', $table_row, -1, PREG_SPLIT_DELIM_CAPTURE); array_shift($cells); // First one is non-existant empty $spec = true; $c_type = ''; foreach ($cells as $cell) { if ($spec) { $c_type = strpos($cell, '!') !== false ? 'th' : 'td'; } else { $xml .= '<' . $c_type . '>'; $xml .= comcode_text__to__comcode_xml(rtrim($cell), true); $xml .= '</' . $c_type . '>'; } $spec = !$spec; } $xml .= '</tr>'; } $xml .= '</table>'; } $pos = $end_tbl + 3; $differented = true; } } } // Link lookahead if (!$differented) { if (!$in_semihtml && $next == 'h' && (substr($comcode, $pos - 1, strlen('http://')) == 'http://' || substr($comcode, $pos - 1, strlen('https://')) == 'https://' || substr($comcode, $pos - 1, strlen('ftp://')) == 'ftp://')) { list($link_end_pos, $auto_link) = detect_link($comcode, $pos); $xml .= $continuation; $continuation = ''; $downloaded_at_link = http_download_file($auto_link, 3000, false); $link_captions_title = ''; if (is_string($downloaded_at_link)) { $matches = array(); if (preg_match('#<title>\\s*(.*)\\s*</title>#', $downloaded_at_link, $matches) != 0) { require_code('character_sets'); $link_captions_title = @html_entity_decode(convert_to_internal_encoding($matches[1]), ENT_QUOTES, get_charset()); } } $xml .= '<url param="' . escape_html($auto_link) . '">' . escape_html($link_captions_title) . '</url>'; $pos += $link_end_pos - $pos; $differented = true; break; } } } if (!$differented) { if (!$in_separate_parse_section && (!$in_semihtml || !$comcode_dangerous && !$is_all_semihtml)) { if ($next == '&') { $ahead = substr($comcode, $pos, 20); $ahead_lower = strtolower($ahead); $matches = array(); $entity = preg_match('#(\\#)?([\\w]*);#', $ahead_lower, $matches) != 0; // If it is a SAFE entity, use it if ($entity) { if ($matches[1] == '' && isset($ALLOWED_ENTITIES[$matches[2]])) { $pos += strlen($matches[2]) + 1; $continuation .= '&' . $matches[2] . ';'; } elseif (is_numeric($matches[2]) && $matches[1] == '#') { $matched_entity = intval(base_convert($matches[1], 16, 10)); if ($matched_entity < 127 && array_key_exists(chr($matched_entity), $POTENTIAL_JS_NAUGHTY_ARRAY)) { $continuation .= escape_html($next); } else { $pos += strlen($matches[2]) + 2; $continuation .= '&#' . $matches[2] . ';'; } } else { $continuation .= '&'; } } else { $continuation .= '&'; } } else { $continuation .= escape_html($next); } } else { $continuation .= $next; } } } } } break; case CCP_IN_TAG_NAME: if ($next == '=') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_RIGHT; $current_attribute_name = 'param'; } elseif (trim($next) == '') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; } elseif ($next == '[') { warn_exit(do_lang_tempcode('CCP_TAG_OPEN_ANOMALY')); } elseif ($next == ']') { if ($close) { if ($formatting_allowed) { list($close_list, $list_indent) = _convert_close_open_lists($list_indent); $xml .= $close_list; } if (count($tag_stack) == 0) { warn_exit(do_lang_tempcode('CCP_NO_CLOSE', escape_html($current_tag))); } $_last = array_pop($tag_stack); if ($_last[0] != $current_tag) { warn_exit(do_lang_tempcode('CCP_NO_CLOSE_MATCH', escape_html($current_tag), escape_html($_last))); } // Do the comcode for this tag if ($in_semihtml) { foreach ($_last[1] as $index => $conv) { $_last[1][$index] = @html_entity_decode(str_replace('<br />', chr(10), $conv), ENT_QUOTES, get_charset()); } } $attributes = $_last[1]; if ($current_tag == 'html') { $in_html = false; $_last[0] = 'htmlWrap'; } elseif ($current_tag == 'semihtml') { $in_semihtml = false; $_last[0] = 'htmlWrap'; } elseif ($current_tag == 'external_table' || $current_tag == 'internal_table') { $_last[0] = 'box'; } elseif ($current_tag == 'php') { $_last[0] = 'code'; $attributes['param'] = 'php'; } elseif ($current_tag == 'codebox') { $_last[0] = 'code'; $attributes['scroll'] = '1'; } elseif ($current_tag == 'sql') { $_last[0] = 'code'; $attributes['param'] = 'sql'; } elseif ($current_tag == 'snapback') { $_last[0] = 'post'; } elseif ($current_tag == 'thread') { $_last[0] = 'topic'; } elseif ($current_tag == 'list') { $sub_elements = explode('[*]', str_replace('[/*]', '', $xml)); $xml = ''; foreach ($sub_elements as $sub_element) { $xml .= '<listElement>' . $sub_element . '</listElement>'; } } if ($_last[0] == 'box' && isset($attributes['breadth']) && !isset($attributes['dimensions'])) { $attributes['dimensions'] = $attributes['breadth']; unset($attributes['breadth']); } if ($_last[0] == 'page' && array_keys($attributes) != array('param')) { $zone = isset($attributes['param']) ? $attributes['param'] : '_SEARCH'; $page = $xml; $xml = $attributes['caption']; unset($attributes['param']); unset($attributes['caption']); $pagelink = $zone . ':' . $page; foreach ($attributes as $key => $val) { $pagelink .= ':' . $key . '=' . $val; } $attributes = array('pageLink' => $pagelink); } if ($_last[0] == 'block') { foreach ($attributes as $key => $val) { $xml .= '<blockParam key="' . escape_html($key) . '" value="' . escape_html($val) . '" />'; } $attributes = array(); } if ($_last[0] == 'random') { foreach ($attributes as $key => $val) { $xml .= '<randomTarget pickIfAbove="' . escape_html($key) . '">' . comcode_text__to__comcode_xml($val, true) . '</randomTarget>'; } $attributes = array(); } if ($_last[0] == 'jumping') { foreach ($attributes as $key => $val) { $xml .= '<jumpingTarget>' . comcode_text__to__comcode_xml($val, true) . '</jumpingTarget>'; } $attributes = array(); } if ($_last[0] == 'concepts') { foreach ($attributes as $_key => $_value) { if (substr($_key, -4) == '_key') { $key = $_value; $cid = substr($_key, 0, strlen($_key) - 4); $value = $attributes[$cid . '_value']; $xml .= '<showConcept key="' . escape_html($key) . '" value="' . escape_html($value) . '" />'; } } $attributes = array(); } if (($_last[0] == 'attachment' || $_last[0] == 'attachment_safe') && isset($attributes['description'])) { $xml .= '<attachmentDescription>' . comcode_text__to__comcode_xml($attributes['description'], true) . '</attachmentDescription>'; unset($attributes['description']); } if ($_last[0] == 'hide' && isset($attributes['param'])) { $xml .= '<hideTitle>' . comcode_text__to__comcode_xml($attributes['param'], true) . '</hideTitle>'; unset($attributes['param']); } if ($_last[0] == 'tooltip' && isset($attributes['param'])) { $xml .= '<tooltipMessage>' . comcode_text__to__comcode_xml($attributes['param'], true) . '</tooltipMessage>'; unset($attributes['param']); } global $COMCODE_XML_PARAM_RENAMING, $COMCODE_XML_SWITCH_AROUND; if (isset($attributes['param']) && isset($COMCODE_XML_PARAM_RENAMING[$_last[0]])) { $attributes[$COMCODE_XML_PARAM_RENAMING[$_last[0]]] = $attributes['param']; unset($attributes['param']); } $comcode_xml_switch_around = $COMCODE_XML_SWITCH_AROUND; if ($_last[0] == 'email' && (!isset($attributes['param']) || !is_valid_email_address($attributes['param'])) && is_valid_email_address($xml)) { $comcode_xml_switch_around[] = 'email'; } if ($_last[0] == 'url' && (!isset($attributes['param']) || !looks_like_url($attributes['param'])) && looks_like_url($xml)) { $comcode_xml_switch_around[] = 'url'; } if (in_array($_last[0], $comcode_xml_switch_around)) { $x = 'param'; if ($_last[0] == 'reference') { $x = 'title'; } if (isset($attributes[$x])) { $temp = $attributes[$x]; $attributes[$x] = $xml; $xml = comcode_text__to__comcode_xml($temp, true); } else { $attributes[$x] = $xml; } } $in_code_tag = false; $white_space_area = $_last[3]; $in_separate_parse_section = $_last[4]; $formatting_allowed = $_last[5]; $textual_area = $_last[6]; if ($_last[0] == 'htmlWrap') { $embed_output = '<htmlWrap xmlns="http://www.w3.org/1999/xhtml">'; } else { $embed_output = '<' . to_camelCase($_last[0]); foreach ($attributes as $key => $val) { $embed_output .= ' ' . to_camelCase($key) . '="' . escape_html($val) . '"'; } $embed_output .= '>'; } $embed_output .= $xml . '</' . to_camelCase($_last[0]) . '>'; $just_ended = isset($BLOCK_TAGS[$current_tag]); $xml = $_last[2] . $embed_output; if ($current_tag == 'title') { if (strlen($comcode) > $pos + 1 && $comcode[$pos] == chr(10) && $comcode[$pos + 1] == chr(10)) { $NUM_LINES += 2; $pos += 2; $just_new_line = true; list($close_list, $list_indent) = _convert_close_open_lists($list_indent); $xml .= $close_list; } } $status = CCP_NO_MANS_LAND; } else { array_push($tag_stack, array($current_tag, $attribute_map, $xml, $white_space_area, $in_separate_parse_section, $formatting_allowed, $textual_area)); list(, , , $white_space_area, $formatting_allowed, $in_separate_parse_section, $textual_area, $attribute_map, $status, $in_html, $in_semihtml, $pos, $in_code_tag) = _opened_tag(false, false, get_member(), $attribute_map, $current_tag, $pos, $comcode_dangerous, $comcode_dangerous_html, $in_separate_parse_section, $in_html, $in_semihtml, $close, $len, $comcode); $xml = ''; } } else { $current_tag .= strtolower($next); } break; case CCP_STARTING_TAG: if ($next == '[') { warn_exit(do_lang_tempcode('CCP_TAG_OPEN_ANOMALY')); } elseif ($next == ']') { warn_exit(do_lang_tempcode('CCP_TAG_CLOSE_ANOMALY')); } elseif ($next == '/') { $close = true; } else { $current_tag .= strtolower($next); $status = CCP_IN_TAG_NAME; } break; case CCP_IN_TAG_BETWEEN_ATTRIBUTES: if ($next == ']') { array_push($tag_stack, array($current_tag, $attribute_map, $xml, $white_space_area, $in_separate_parse_section, $formatting_allowed, $textual_area)); list(, , , $white_space_area, $formatting_allowed, $in_separate_parse_section, $textual_area, $attribute_map, $status, $in_html, $in_semihtml, $pos, $in_code_tag) = _opened_tag(false, false, get_member(), $attribute_map, $current_tag, $pos, $comcode_dangerous, $comcode_dangerous_html, $in_separate_parse_section, $in_html, $in_semihtml, $close, $len, $comcode); $xml = ''; } elseif ($next == '[') { warn_exit(do_lang_tempcode('CCP_TAG_OPEN_ANOMALY')); } elseif (trim($next) != '') { $status = CCP_IN_TAG_ATTRIBUTE_NAME; $current_attribute_name = $next; } break; case CCP_IN_TAG_ATTRIBUTE_NAME: if ($next == '[') { warn_exit(do_lang_tempcode('CCP_TAG_OPEN_ANOMALY')); } elseif ($next == ']') { $at_map_keys = array_keys($attribute_map); $old_attribute_name = $at_map_keys[count($at_map_keys) - 1]; $attribute_map[$old_attribute_name] .= ' ' . $current_attribute_name; array_push($tag_stack, array($current_tag, $attribute_map, $xml, $white_space_area, $in_separate_parse_section, $formatting_allowed, $textual_area)); list(, , , $white_space_area, $formatting_allowed, $in_separate_parse_section, $textual_area, $attribute_map, $status, $in_html, $in_semihtml, $pos, $in_code_tag) = _opened_tag(false, false, get_member(), $attribute_map, $current_tag, $pos, $comcode_dangerous, $comcode_dangerous_html, $in_separate_parse_section, $in_html, $in_semihtml, $close, $len, $comcode); $xml = ''; } elseif ($next == '=') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_RIGHT; } elseif ($next != ' ') { $current_attribute_name .= strtolower($next); } else { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_LEFT; } break; case CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_LEFT: if ($next == '=') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_RIGHT; } elseif (trim($next) != '') { warn_exit(do_lang_tempcode('CCP_ATTRIBUTE_ERROR', escape_html($current_attribute_name), escape_html($current_tag))); } break; case CCP_IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_RIGHT: if ($next == '[') { warn_exit(do_lang_tempcode('CCP_TAG_OPEN_ANOMALY')); } elseif ($next == ']') { warn_exit(do_lang_tempcode('CCP_TAG_CLOSE_ANOMALY')); } elseif ($next == '"' || $in_semihtml && substr($comcode, $pos - 1, 6) == '"') { if ($next != '"') { $pos += 5; } $status = CCP_IN_TAG_ATTRIBUTE_VALUE; $current_attribute_value = ''; } elseif ($next != '') { $status = CCP_IN_TAG_ATTRIBUTE_VALUE_NO_QUOTE; $current_attribute_value = $next; } break; case CCP_IN_TAG_ATTRIBUTE_VALUE_NO_QUOTE: if ($next == ' ') { $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; if (isset($attribute_map[$current_attribute_name])) { warn_exit(do_lang_tempcode('CCP_DUPLICATE_ATTRIBUTES', escape_html($current_attribute_name), escape_html($current_tag))); } $attribute_map[$current_attribute_name] = $current_attribute_value; } elseif ($next == ']') { if (isset($attribute_map[$current_attribute_name])) { warn_exit(do_lang_tempcode('CCP_DUPLICATE_ATTRIBUTES', escape_html($current_attribute_name), escape_html($current_tag))); } $attribute_map[$current_attribute_name] = $current_attribute_value; array_push($tag_stack, array($current_tag, $attribute_map, $xml, $white_space_area, $in_separate_parse_section, $formatting_allowed, $textual_area)); list(, , , $white_space_area, $formatting_allowed, $in_separate_parse_section, $textual_area, $attribute_map, $status, $in_html, $in_semihtml, $pos, $in_code_tag) = _opened_tag(false, false, get_member(), $attribute_map, $current_tag, $pos, $comcode_dangerous, $comcode_dangerous_html, $in_separate_parse_section, $in_html, $in_semihtml, $close, $len, $comcode); $xml = ''; } else { $current_attribute_value .= $next; } break; case CCP_IN_TAG_ATTRIBUTE_VALUE: if ($next == '"' || $in_semihtml && substr($comcode, $pos - 1, 6) == '"') { if ($next != '"') { $pos += 5; } $status = CCP_IN_TAG_BETWEEN_ATTRIBUTES; if (isset($attribute_map[$current_attribute_name])) { warn_exit(do_lang_tempcode('CCP_DUPLICATE_ATTRIBUTES', escape_html($current_attribute_name), escape_html($current_tag))); } $attribute_map[$current_attribute_name] = $current_attribute_value; } else { if ($next == '\\') { if ($comcode[$pos] == '"') { $current_attribute_value .= '"'; ++$pos; } elseif ($comcode[$pos] == '\\') { $current_attribute_value .= '\\'; ++$pos; } else { $current_attribute_value .= $next; } } else { $current_attribute_value .= $next; } } break; } } $xml .= $continuation; $continuation = ''; list($close_list, $list_indent) = _convert_close_open_lists($list_indent); $xml .= $close_list; if ($status != CCP_NO_MANS_LAND || count($tag_stack) != 0) { $stack_top = array_pop($tag_stack); warn_exit(do_lang_tempcode('CCP_BROKEN_END', escape_html($stack_top[0]))); } if (!$skip_wrapper) { $xml = '<comcode>' . $xml . '</comcode>'; } return $xml; }
/** * Checks the content under a tag's external references. * * @param string The name of the tag to check * @param map A map of attributes (name=>value) the tag has * @param boolean Whether this is a self-closing tag * @param boolean Whether this is a closing tag * @return ?list Array of errors (NULL: none) */ function _check_externals($tag, $attributes, $self_close, $close) { if (function_exists('get_param_integer') && get_param_integer('keep_no_ext_check', 0) == 1) { return NULL; } unset($self_close); unset($close); global $VALIDATED_ALREADY, $TAG_ATTRIBUTES, $IDS_SO_FAR, $ANCESTER_BLOCK, $ANCESTER_INLINE, $EXPECTING_TAG, $OUT, $POS, $LAST_A_TAG; $errors = array(); if ($tag == 'link' && $GLOBALS['VALIDATION_CSS'] && $GLOBALS['NO_XHTML_LINK_FOLLOW'] == 0 && isset($attributes['href']) && isset($attributes['type']) && $attributes['type'] == 'text/css' && !isset($VALIDATED_ALREADY[$attributes['href']])) { $VALIDATED_ALREADY[$attributes['href']] = 1; $url = qualify_url($attributes['href'], $GLOBALS['URL_BASE']); if ($url != '') { $sheet = http_download_file($url, NULL, false); if (!is_null($sheet)) { $css_validity = _validate_css_sheet($sheet); if (is_array($css_validity)) { $errors = array_merge($errors, $css_validity); } // Some kind of error } } } if ($GLOBALS['VALIDATION_JAVASCRIPT'] && $tag == 'script' && $GLOBALS['NO_XHTML_LINK_FOLLOW'] == 0 && isset($attributes['src']) && isset($attributes['type']) && ($attributes['type'] == 'text/javascript' || $attributes['type'] == 'application/x-javascript') && !isset($VALIDATED_ALREADY[$attributes['src']])) { $VALIDATED_ALREADY[$attributes['src']] = 1; $url = qualify_url($attributes['src'], $GLOBALS['URL_BASE']); if ($url != '') { $js = http_download_file($url, NULL, false); if (!is_null($js)) { $js = convert_to_internal_encoding($js); $VALIDATED_ALREADY[$attributes['src']] = 1; if (function_exists('require_code')) { require_code('js_validator'); } $js_validity = check_js($js, true); if (is_array($js_validity)) { $errors = array_merge($errors, $js_validity); } // Some kind of error } } } if ($tag == 'iframe' && isset($attributes['src']) && $attributes['src'] != '' && $GLOBALS['NO_XHTML_LINK_FOLLOW'] == 0 && !isset($VALIDATED_ALREADY[$attributes['src']])) { $VALIDATED_ALREADY[$attributes['src']] = 1; $url = qualify_url($attributes['src'], $GLOBALS['URL_BASE']); if ($url != '') { $iframe = http_download_file($url, NULL, false); // Sometimes disabled due to my iframe producing a weird PHP exception, that was stopping me working if (!is_null($iframe) && $iframe != '') { $iframe = convert_to_internal_encoding($iframe); global $HTTP_DOWNLOAD_MIME_TYPE; if ($HTTP_DOWNLOAD_MIME_TYPE == 'text/html' || $HTTP_DOWNLOAD_MIME_TYPE == 'application/xhtml+xml') { global $EXTRA_CHECK; $EXTRA_CHECK[] = $iframe; } } } } return $errors == array() ? NULL : $errors; }
/** * Take a URL and process it to make a hard include. We'll get the HTML and we'll also load up some global stuff for 'do_header' to use. * * @param URLPATH The URL that we're operating on. * @param URLPATH We open up linked URLs under this recursively. * @return string The cleaned up contents at the URL, set up for the recursive integrator usage. */ function reprocess_url($url, $operation_base_url) { if (url_is_local($url)) { return ''; } $trail_end = strrpos($url, '/'); if ($trail_end !== false) { $url_base = substr($url, 0, $trail_end); } $val = mixed(); // Cookie relaying from client through to server $url_bits = @parse_url($url) or warn_exit(do_lang_tempcode('HTTP_DOWNLOAD_NO_SERVER', $url)); $url_bits_2 = parse_url(get_base_url()); $cookies_relayed = NULL; if (!array_key_exists('host', $url_bits)) { $url_bits['host'] = 'localhost'; } if (!array_key_exists('host', $url_bits_2)) { $url_bits_2['host'] = 'localhost'; } if ($url_bits['host'] == $url_bits_2['host']) { $cookies_relayed = array(); foreach ($_COOKIE as $key => $val) { if (is_array($val)) { $cookies_relayed[$key] = array(); foreach ($val as $_val) { if (get_magic_quotes_gpc()) { $_val = stripslashes($_val); } $cookies_relayed[$key][] = $_val; } } else { if (get_magic_quotes_gpc()) { $val = stripslashes($val); } $cookies_relayed[$key] = $val; } } } // Download the document $ua = ocp_srv('HTTP_USER_AGENT'); if ($ua == '') { $ua = 'ocP-integrator'; } $accept = ocp_srv('HTTP_ACCEPT'); if ($accept == '') { $accept = NULL; } $accept_charset = ocp_srv('HTTP_ACCEPT_CHARSET'); if ($accept_charset == '') { $accept_charset = NULL; } $accept_language = ocp_srv('HTTP_ACCEPT_LANGUAGE'); if ($accept_language == '') { $accept_language = NULL; } $post_relayed = NULL; if (count($_POST) != 0) { $post_relayed = array(); foreach ($_POST as $key => $val) { if (is_array($val)) { $post_relayed[$key] = array(); foreach ($val as $_val) { if (get_magic_quotes_gpc()) { $_val = stripslashes($_val); } $post_relayed[$key] = $val; } } else { if (get_magic_quotes_gpc()) { $val = stripslashes($val); } $post_relayed[$key] = $val; } } } require_code('character_sets'); $document = convert_to_internal_encoding(http_download_file($url, NULL, true, false, $ua, $post_relayed, $cookies_relayed, $accept, $accept_charset, $accept_language)); global $HTTP_DOWNLOAD_MIME_TYPE; if ($HTTP_DOWNLOAD_MIME_TYPE != 'text/html' && $HTTP_DOWNLOAD_MIME_TYPE != 'application/xhtml+xml') { header('Location: ' . str_replace("\r", '', str_replace(chr(10), '', $url))); return ''; } // Were we asked to set any cookies? if ($url_bits['host'] == $url_bits_2['host']) { global $HTTP_NEW_COOKIES; if (!is_null($HTTP_NEW_COOKIES)) { foreach ($HTTP_NEW_COOKIES as $key => $val) { $parts = explode('; ', $val); foreach ($parts as $i => $part) { if ($i != 0) { $temp = explode('=', $part, 2); if (array_key_exists(1, $temp)) { $parts[trim($temp[0])] = trim(rawurldecode($temp[1])); } } } //$parts['domain']=$url_bits_2['host']; // To fix an inconvenience caused by mismatching cookie settings (e.g. cookie on subdomain) //echo($key.'->'.trim(rawurldecode($parts[0]))); //print_r($parts); //exit(); $parts['domain'] = get_cookie_domain(); setcookie($key, trim(rawurldecode($parts[0])), array_key_exists('expires', $parts) ? strtotime($parts['expires']) : 0, array_key_exists('path', $parts) ? $parts['path'] : '', array_key_exists('domain', $parts) ? $parts['domain'] : ''); } } } // Sort out title $matches = array(); if (preg_match('#<\\s*title[^>]*>(.*)<\\s*/\\s*title\\s*>#is', $document, $matches) != 0) { global $SEO_TITLE; $title = str_replace('•', '-', str_replace('–', '-', str_replace('—', '-', @html_entity_decode($matches[1], ENT_QUOTES, get_charset())))); $SEO_TITLE = $title; get_page_title(trim($title), false); } // Better base? $matches = array(); if (preg_match('#<\\s*base\\s+href\\s*=\\s*["\']?(.*)["\']?\\s*/?\\s*>#is', $document, $matches) != 0) { $url_base = trim(@html_entity_decode($matches[1], ENT_QUOTES, get_charset())); } // Sort out body if (preg_match('#<\\s*body[^>]*>(.*)<\\s*/\\s*body\\s*>#is', $document, $matches) != 0) { $body = '<div>' . $matches[1] . '</div>'; } else { $body = '<div>' . $document . '</div>'; } // Link filtering, so as to make non-external/non-new-window hyperlinks link through the ocPortal module $_self_url = build_url(array('page' => '_SELF'), '_SELF', NULL, false, true); $self_url = $_self_url->evaluate(); $expressions = array('(src)="([^"]*)"', '(src)=\'([^\'])*\'', '(href)="([^"]*)"', '(href)=\'([^\'])*\'', '(data)="([^"]*)"', '(data)=\'([^\']*)\'', '(action)="([^"]*)"', '(action)=\'([^\']*)\''); foreach ($expressions as $expression) { $all_matches = array(); $count = preg_match_all('#(<[^>]*)' . $expression . '([^>]*>)#i', $body, $all_matches); if ($count != 0) { for ($i = 0; $i < count($all_matches[0]); $i++) { $m_to_replace = $all_matches[0][$i]; $m_type = trim(@html_entity_decode($all_matches[2][$i], ENT_QUOTES, get_charset())); $m_url = trim(@html_entity_decode($all_matches[3][$i], ENT_QUOTES, get_charset())); if (url_is_local($m_url)) { $m_url = qualify_url($m_url, $url_base); } $non_local = substr($m_url, 0, strlen($operation_base_url)) != $operation_base_url; if ($m_type == 'src' || $m_type == 'data' || $non_local) { $new_url = $m_url; } else { $new_url = $self_url . '&url=' . rawurlencode($m_url); } $body = str_replace($m_to_replace, $all_matches[1][$i] . $m_type . '="' . escape_html($new_url) . '"' . $all_matches[4][$i], $body); } } } // Moving of CSS sheet imports, etc, into ocPortal's head section if (preg_match('#<head[^<>]*>(.*)</head>#is', $document, $matches) != 0) { $head = $matches[1]; // meta global $SEO_KEYWORDS, $SEO_DESCRIPTION; $count = preg_match_all('#\\<\\s*meta[^\\>]*name=["\']([^"\']*)["\'][^\\>]*content="([^"]*)"[^\\>]*/?\\s*>#i', $head, $all_matches); if ($count == 0) { $count = preg_match_all('#\\<\\s*meta\\s+[^\\>]*name=["\']([^"\']*)["\']\\s+[^\\>]*content=\'([^\']*)\'[^\\>]*/?\\s*>#i', $head, $all_matches); } if ($count != 0) { for ($i = 0; $i < count($all_matches[0]); $i++) { $m_name = trim(@html_entity_decode($all_matches[1][$i], ENT_QUOTES, get_charset())); $m_content = trim(@html_entity_decode($all_matches[2][$i], ENT_QUOTES, get_charset())); if ($m_name == 'description') { $SEO_DESCRIPTION = $m_content; } elseif ($m_name == 'keywords') { $SEO_KEYWORDS = explode(',', $m_content); } } } // Stuff to copy global $EXTRA_HEAD; $head_patterns = array('#<\\s*script.*<\\s*/\\s*script\\s*>#isU', '#<\\s*link[^<>]*>#isU', '#<\\s*style.*<\\s*/\\s*style\\s*>#isU'); foreach ($head_patterns as $pattern) { $num_matches = preg_match_all($pattern, $head, $matches); for ($i = 0; $i < $num_matches; $i++) { $x = $matches[0][$i]; $match_x = array(); if (preg_match('#\\s(src|href)=["\']([^"\']+)["\']#i', $x, $match_x) != 0) { if (url_is_local($match_x[1])) { $url_new = qualify_url($match_x[2], $url_base); $x = str_replace($match_x[0], str_replace($match_x[2], $url_new, $match_x[0]), $x); } } $EXTRA_HEAD->attach($x); } } } return $body; }
/** * Standard modular run function. * * @param array A map of parameters. * @return tempcode The result of execution. */ function run($map) { require_lang('staff_checklist'); $newdata = post_param('stafflinksedit', NULL); if (!is_null($newdata)) { $items = explode("\n", $newdata); $GLOBALS['SITE_DB']->query_delete('stafflinks'); foreach ($items as $i) { $q = trim($i); if (!empty($q)) { $bits = explode('=', $q); if (count($bits) >= 2) { $last_bit = array_pop($bits); $bits = array(implode('=', $bits), $last_bit); $link = $bits[0]; } else { $link = $q; } $link_title = $GLOBALS['SITE_DB']->query_value_null_ok('url_title_cache', 't_title', array('t_url' => $link)); if (is_null($link_title) || substr($link_title, 0, 1) == '!') { $link_title = ''; $downloaded_at_link = http_download_file($link, 3000, false); if (is_string($downloaded_at_link)) { $matches = array(); if (preg_match('#\\s*<title[^>]*\\s*>\\s*(.*)\\s*\\s*<\\s*/title\\s*>#mi', $downloaded_at_link, $matches) != 0) { require_code('character_sets'); $link_title = trim(str_replace('–', '-', str_replace('—', '-', @html_entity_decode(convert_to_internal_encoding($matches[1]), ENT_QUOTES, get_charset())))); } } $GLOBALS['SITE_DB']->query_insert('url_title_cache', array('t_url' => $link, 't_title' => $link_title), false, true); // To stop weird race-like conditions } if (count($bits) == 2) { $link_desc = $bits[1]; } else { $link_desc = $link_title; } $GLOBALS['SITE_DB']->query_insert('stafflinks', array('link' => $link, 'link_title' => $link_title, 'link_desc' => $link_desc)); } } } $rows = $GLOBALS['SITE_DB']->query_select('stafflinks', array('*')); $formattedstafflinks = array(); $unformattedstafflinks = array(); foreach ($rows as $r) { if ($r['link_title'] == '') { $r['link_title'] = $r['link_desc']; } if (strlen($r['link_title']) > strlen($r['link_desc'])) { $r['link_title'] = $r['link_desc']; } $formattedstafflinks[] = array('URL' => $r['link'], 'TITLE' => $r['link_title'], 'DESC' => $r['link_title'] == $r['link_desc'] ? '' : $r['link_desc']); $unformattedstafflinks[] = array('LINKS' => $r['link'] . '=' . $r['link_desc']); } $map_comcode = ''; foreach ($map as $key => $val) { $map_comcode .= ' ' . $key . '="' . addslashes($val) . '"'; } return do_template('BLOCK_MAIN_STAFF_LINKS', array('URL' => get_self_url(), 'BLOCK_NAME' => 'main_staff_links', 'MAP' => $map_comcode, 'FORMATTEDLINKS' => $formattedstafflinks, 'UNFORMATTEDLINKS' => $unformattedstafflinks)); }
function _send($token, $secret, $row) { require_lang('twitter'); require_code('twitter'); list($message) = render_activity($row, false); $link = static_evaluate_tempcode(pagelink_to_tempcode($row['a_pagelink_1'])); // Shorten message for Twitter purposes $chopped_message = html_entity_decode(strip_tags($message->evaluate()), ENT_COMPAT, get_charset()); $max_length = 255; $shortened_link = mixed(); if ($link != '') { $shortened_link = http_download_file('http://is.gd/api.php?longurl=' . urlencode($link)); $max_length -= strlen($shortened_link) + 1; } if (strlen($chopped_message) > $max_length) { $chopped_message = substr($chopped_message, 0, $max_length - 3) . '...'; } if ($link != '') { $chopped_message .= ' ' . $shortened_link; } require_code('character_sets'); $chopped_message = convert_to_internal_encoding($chopped_message, get_charset(), 'utf-8'); require_code('developer_tools'); destrictify(); // Initiate Twitter connection $api_key = get_option('twitter_api_key'); $api_secret = get_option('twitter_api_secret'); $twitter = new Twitter($api_key, $api_secret); $twitter->setOAuthToken($token); $twitter->setOAuthTokenSecret($secret); // Send message try { $twitter->statusesUpdate($chopped_message); } catch (TwitterException $e) { attach_message($e->getMessage(), 'warn'); return false; } return true; }
/** * Standard modular run function for CRON hooks. Searches for tasks to perform. */ function run() { if (!addon_installed('calendar')) { return; } require_code('calendar'); require_lang('calendar'); require_code('notifications'); $start = 0; do { $jobs = $GLOBALS['SITE_DB']->query('SELECT *,j.id AS id FROM ' . $GLOBALS['SITE_DB']->get_table_prefix() . 'calendar_jobs j LEFT JOIN ' . $GLOBALS['SITE_DB']->get_table_prefix() . 'calendar_events e ON e.id=j.j_event_id LEFT JOIN ' . $GLOBALS['SITE_DB']->get_table_prefix() . 'calendar_reminders n ON n.id=j.j_reminder_id WHERE (validated=1 OR e_is_public=0) AND j_time<' . strval(time()), 300, $start); $or_list = ''; foreach ($jobs as $job) { // Build up OR list of the jobs if ($or_list != '') { $or_list .= ' OR '; } $or_list .= 'id=' . strval($job['id']); $recurrences = find_periods_recurrence($job['e_timezone'], 1, $job['e_start_year'], $job['e_start_month'], $job['e_start_day'], is_null($job['e_start_hour']) ? find_timezone_start_hour_in_utc($job['e_timezone'], $job['e_start_year'], $job['e_start_month'], $job['e_start_day']) : $job['e_start_hour'], is_null($job['e_start_minute']) ? find_timezone_start_minute_in_utc($job['e_timezone'], $job['e_start_year'], $job['e_start_month'], $job['e_start_day']) : $job['e_start_minute'], $job['e_end_year'], $job['e_end_month'], $job['e_end_day'], is_null($job['e_end_hour']) ? find_timezone_end_hour_in_utc($job['e_timezone'], $job['e_end_year'], $job['e_end_month'], $job['e_end_day']) : $job['e_end_hour'], is_null($job['e_end_minute']) ? find_timezone_end_minute_in_utc($job['e_timezone'], $job['e_end_year'], $job['e_end_month'], $job['e_end_day']) : $job['e_end_minute'], $job['e_recurrence'], min(1, $job['e_recurrences'])); // Dispatch if (is_null($job['j_reminder_id'])) { // if (!has_actual_page_access($job['e_submitter'],'admin_occle')) continue; // Someone was admin but isn't anymore Actually, really ex-admins could have placed lots of other kinds of traps. It's the responsibility of the staff to check this on a wider basis. There's no use creating tangental management complexity for just one case. if ($job['e_type'] != db_get_first_id()) { continue; } // Very strange $job_text = get_translated_text($job['e_content']); if (substr($job_text, 0, 7) == 'http://') { require_code('character_sets'); echo convert_to_internal_encoding(http_download_file($job_text)); } elseif (addon_installed('occle')) { if (is_null($GLOBALS['CURRENT_SHARE_USER'])) { // Backwards-compatibility for pure PHP code (if its creation date was before the time of writing this comment [Wednesday 22nd Match, 14:58]) if ($job['e_add_date'] < 1143046670 && !defined('HIPHOP_PHP')) { @ini_set('ocproducts.xss_detect', '0'); $to_echo = eval($job_text); if ($to_echo === false) { fatal_exit(@strval($php_errormsg)); } } else { $GLOBALS['event_timestamp'] = array_key_exists(0, $recurrences) ? usertime_to_utctime($recurrences[0][0]) : mktime($job['e_start_hour'], $job['e_start_minute'], 0, $job['e_start_month'], $job['e_start_day'], $job['e_start_year']); // OcCLE code require_code('occle'); $temp = new virtual_bash($job_text); $output = $temp->output_html(true); if (is_object($output)) { echo $output->evaluate(); } } } } $job['n_seconds_before'] = 0; } else { // Send notification if (!has_category_access($job['n_member_id'], 'calendar', strval($job['e_type']))) { continue; } $title = get_translated_text($job['e_title']); $timestamp = array_key_exists(0, $recurrences) ? usertime_to_utctime($recurrences[0][0]) : mktime($job['e_start_hour'], $job['e_start_minute'], 0, $job['e_start_month'], $job['e_start_day'], $job['e_start_year']); $date = get_timezoned_date($timestamp, true, false, false, false, $job['n_member_id']); $_url = build_url(array('page' => 'calendar', 'type' => 'view', 'id' => $job['j_event_id']), get_module_zone('calendar'), NULL, false, false, true); $url = $_url->evaluate(); $subject_tag = do_lang('EVENT_REMINDER_SUBJECT', $title, NULL, NULL, get_lang($job['n_member_id'])); $message_raw = do_lang('EVENT_REMINDER_CONTENT', comcode_escape($date), comcode_escape($url), get_translated_text($job['e_content']), get_lang($job['n_member_id'])); dispatch_notification('calendar_reminder', strval($job['e_type']), $subject_tag, $message_raw, array($job['n_member_id']), A_FROM_SYSTEM_UNPRIVILEGED); //echo $subject_tag."\n\n".$message_raw; } // Recreate job for when next reminder due (if appropriate) if (array_key_exists(1, $recurrences)) { $GLOBALS['SITE_DB']->query_insert('calendar_jobs', array('j_time' => usertime_to_utctime($recurrences[1][0]) - $job['n_seconds_before'], 'j_reminder_id' => $job['j_reminder_id'], 'j_member_id' => $job['j_member_id'], 'j_event_id' => $job['j_event_id'])); } } // Delete jobs just run if ($or_list != '') { $GLOBALS['SITE_DB']->query('DELETE FROM ' . $GLOBALS['SITE_DB']->get_table_prefix() . 'calendar_jobs WHERE ' . $or_list); } $start += 300; } while (array_key_exists(0, $jobs)); }
function _send($token, $row, $post_to_uid = 'me', $member_id = NULL) { require_lang('facebook'); require_code('facebook_connect'); // Prepare message list($message) = render_activity($row, false); $name = $row['a_label_1']; require_code('character_sets'); $name = convert_to_internal_encoding($name, get_charset(), 'utf-8'); $link = $row['a_pagelink_1'] == '' ? '' : static_evaluate_tempcode(pagelink_to_tempcode($row['a_pagelink_1'])); $message = html_entity_decode(strip_tags($message->evaluate()), ENT_COMPAT, get_charset()); $message = convert_to_internal_encoding($message, get_charset(), 'utf-8'); // Send message $appid = get_option('facebook_appid'); $appsecret = get_option('facebook_secret_code'); $fb = new ocpFacebook(array('appId' => $appid, 'secret' => $appsecret)); $fb->setAccessToken($token); $attachment = array('description' => $message); if ($name != '' && $name != $message) { $attachment['name'] = $name; } if ($link != '') { $attachment['link'] = $link; } if (count($attachment) == 1) { $attachment = array('message' => $message); } if ($post_to_uid == 'me') { $post_to_uid = $fb->getUser(); } // May not be needed, but just in case try { $ret = $fb->api('/' . $post_to_uid . '/feed', 'POST', $attachment); } catch (Exception $e) { if (!is_null($member_id) && count($_POST) == 0) { $this->auth_set($member_id, get_self_url()); } warn_exit($e->getMessage()); } return true; }
/** * Standard modular run function. * * @param array A map of parameters. * @return tempcode The result of execution. */ function run($map) { define('GOOGLE_MAGIC', 0xe6359a60); $links = post_param('watchlistsites', NULL); if (!is_null($links)) { $GLOBALS['SITE_DB']->query_delete('sitewatchlist'); $items = explode("\n", $links); foreach ($items as $i) { $q = trim($i); if (!empty($q)) { $bits = explode('=', $q); if (count($bits) >= 2) { $last_bit = array_pop($bits); $bits = array(implode('=', $bits), $last_bit); $link = $bits[0]; $site_name = $bits[1]; } else { $link = $q; $site_name = $GLOBALS['SITE_DB']->query_value_null_ok('url_title_cache', 't_title', array('t_url' => $link)); if (is_null($site_name) || substr($site_name, 0, 1) == '!') { $site_name = ''; $downloaded_at_link = http_download_file($link, 3000, false); if (is_string($downloaded_at_link)) { $matches = array(); if (preg_match('#\\s*<title[^>]*\\s*>\\s*(.*)\\s*\\s*<\\s*/title\\s*>#mi', $downloaded_at_link, $matches) != 0) { require_code('character_sets'); $site_name = trim(str_replace('–', '-', str_replace('—', '-', @html_entity_decode(convert_to_internal_encoding($matches[1]), ENT_QUOTES, get_charset())))); } } $GLOBALS['SITE_DB']->query_insert('url_title_cache', array('t_url' => $link, 't_title' => $site_name), false, true); // To stop weird race-like conditions if ($site_name == '') { $site_name = $link; } } } $GLOBALS['SITE_DB']->query_insert('sitewatchlist', array('site_name' => $site_name, 'siteurl' => fixup_protocolless_urls($link))); } } } $rows = $GLOBALS['SITE_DB']->query_select('sitewatchlist'); $sitesbeingwatched = array(); $sitegriddata = array(); if (count($rows) > 0) { foreach ($rows as $r) { $alex = $this->getAlexaRank($r['siteurl']); $sitesbeingwatched[$r['siteurl']] = $r['site_name']; $googleranking = integer_format(intval($this->getPageRank($r['siteurl']))); $alexaranking = $alex[0]; $alexatraffic = $alex[1]; $sitegriddata[] = array('URL' => $r['siteurl'], 'GRANK' => $googleranking, 'ALEXAR' => $alexaranking, 'ALEXAT' => $alexatraffic, 'SITETITLE' => $r['site_name']); } } $map_comcode = ''; foreach ($map as $key => $val) { $map_comcode .= ' ' . $key . '="' . addslashes($val) . '"'; } return do_template('BLOCK_MAIN_STAFF_WEBSITE_MONITORING', array('URL' => get_self_url(), 'BLOCK_NAME' => 'main_staff_website_monitoring', 'MAP' => $map_comcode, 'SITEURLS' => $sitesbeingwatched, 'GRIDDATA' => $sitegriddata)); }
/** * Cleanup some EXIF, to the correct character set. * * @param array The EXIF data * @return array Cleaned up EXIF data */ function cleanup_exif($meta_data) { require_code('character_sets'); $val = mixed(); foreach ($meta_data as $key => $val) { // Cleanup fractions if (is_string($val)) { if (preg_match('#^[\\d.]+/[\\d.]+$#', $val) != 0) { $temp = explode('/', $val); if (is_numeric($temp[0]) && is_numeric($temp[1])) { if (floatval($temp[1]) == 0.0) { $val = floatval($temp[0]); } else { $val = floatval($temp[0]) / floatval($temp[1]); } if ($key === 'FocalLength') { $val = float_format($val) . 'mm'; } } } } // Fix character sets if (is_string($val)) { $val = preg_replace('#[[:cntrl:]]#', '', $val); $val = convert_to_internal_encoding($val, 'ISO-8859-1'); } elseif (is_array($val)) { $val = cleanup_exif($val); } $meta_data[$key] = $val; } return $meta_data; }
/** * Script to make a nice textual image, vertical writing. */ function gd_text_script() { if (!function_exists('imagefontwidth')) { return; } $text = get_param('text'); if (get_magic_quotes_gpc()) { $text = stripslashes($text); } $font_size = array_key_exists('size', $_GET) ? intval($_GET['size']) : 8; $font = get_param('font', get_file_base() . '/data/fonts/' . filter_naughty(get_param('font', 'FreeMonoBoldOblique')) . '.ttf'); if (!function_exists('imagettftext') || !array_key_exists('FreeType Support', gd_info()) || @imagettfbbox(26.0, 0.0, get_file_base() . '/data/fonts/Vera.ttf', 'test') === false || strlen($text) == 0) { $pfont = 4; $height = intval(imagefontwidth($pfont) * strlen($text) * 1.05); $width = imagefontheight($pfont); $baseline_offset = 0; } else { $scale = 4; list(, , $height, , , , , $width) = imagettfbbox(floatval($font_size * $scale), 0.0, $font, $text); $baseline_offset = 8 * intval(ceil(floatval($font_size) / 8.0)); $width = max($width, -$width); $width += $baseline_offset; $height += $font_size * $scale; // This is just due to inaccuracy in imagettfbbox, possibly due to italics not being computed correctly list(, , $real_height, , , , , $real_width) = imagettfbbox(floatval($font_size), 0.0, $font, $text); $real_width = max($real_width, -$real_width); $real_width += $baseline_offset / $scale; $real_height += 2; } if ($width == 0) { $width = 1; } if ($height == 0) { $height = 1; } $trans_color = array_key_exists('color', $_GET) ? $_GET['color'] : 'FF00FF'; $img = imagecreatetruecolor($width, $height + $baseline_offset); imagealphablending($img, false); $black_color = array_key_exists('fgcolor', $_GET) ? $_GET['fgcolor'] : '000000'; $black = imagecolorallocate($img, hexdec(substr($black_color, 0, 2)), hexdec(substr($black_color, 2, 2)), hexdec(substr($black_color, 4, 2))); if (!function_exists('imagettftext') || !array_key_exists('FreeType Support', gd_info()) || @imagettfbbox(26.0, 0.0, get_file_base() . '/data/fonts/Vera.ttf', 'test') === false || strlen($text) == 0) { $trans = imagecolorallocate($img, hexdec(substr($trans_color, 0, 2)), hexdec(substr($trans_color, 2, 2)), hexdec(substr($trans_color, 4, 2))); imagefill($img, 0, 0, $trans); imagecolortransparent($img, $trans); imagestringup($img, $pfont, 0, $height - 1 - intval($height * 0.02), $text, $black); } else { if (function_exists('imagecolorallocatealpha')) { $trans = imagecolorallocatealpha($img, hexdec(substr($trans_color, 0, 2)), hexdec(substr($trans_color, 2, 2)), hexdec(substr($trans_color, 4, 2)), 127); } else { $trans = imagecolorallocate($img, hexdec(substr($trans_color, 0, 2)), hexdec(substr($trans_color, 2, 2)), hexdec(substr($trans_color, 4, 2))); } imagefilledrectangle($img, 0, 0, $width, $height, $trans); if (@$_GET['angle'] != 90) { require_code('character_sets'); $text = utf8tohtml(convert_to_internal_encoding($text, strtolower(get_param('charset', get_charset())), 'utf-8')); if (strpos($text, '&#') === false) { $previous = mixed(); $nxpos = 0; for ($i = 0; $i < strlen($text); $i++) { if (!is_null($previous)) { list(, , $rx1, , $rx2) = imagettfbbox(floatval($font_size * $scale), 0.0, $font, $previous); $nxpos += max($rx1, $rx2) + 3; } imagettftext($img, floatval($font_size * $scale), 270.0, $baseline_offset, $nxpos, $black, $font, $text[$i]); $previous = $text[$i]; } } else { imagettftext($img, floatval($font_size * $scale), 270.0, 4, 0, $black, $font, $text); } } else { imagettftext($img, floatval($font_size * $scale), 90.0, $width - $baseline_offset, $height, $black, $font, $text); } $dest_img = imagecreatetruecolor($real_width + intval(ceil(floatval($baseline_offset) / floatval($scale))), $real_height); imagealphablending($dest_img, false); imagecopyresampled($dest_img, $img, 0, 0, 0, 0, $real_width + intval(ceil(floatval($baseline_offset) / floatval($scale))), $real_height, $width, $height); // Sizes down, for simple antialiasing-like effect imagedestroy($img); $img = $dest_img; if (function_exists('imagesavealpha')) { imagesavealpha($img, true); } } header('Content-Type: image/png'); imagepng($img); imagedestroy($img); }
/** * Unescape data from LDAP. Technically this is not unescaping, it's just a character set conversion, but function is named to provide symmetry with ocp_ldap_escape which does both escaping and character set conversion. * * @param string The escaped value. * @return string The value. */ function ldap_unescape($str) { require_code('character_sets'); return convert_to_internal_encoding($str, 'utf8', get_charset()); }