>quote\r\n function bbcode_to_html($text, $settings, $sub) { if ( ($settings['enable_bbcode'] == FALSE) ) { return $text; } $search = array ( '/(\[b\ )(.*)(\])/', '/(\[i\ )(.*)(\])/', '/(\[u\ )(.*)(\])/', '/(\[s\ )(.*)(\])/', '/(\[h\ )(.*)(\])/', '/(\[sp\ )(.*)(\])/', '/(\[li\ )(.*)(\])/', '/(\[url\ )(.*)(\])/', '/ s\/(.+)\/([0-9]+)/', '/>> ([0-9]+)\r\n/', '/>>(.*)\r\n/' ); $replace = array ( '$2', '$2', '$2', '$2', '

$2

', '$2', '
  • $2
  • ', '$2', ' s/$1/$2', ">$1$2
    ", '>>$1$2
    ' ); return preg_replace($search, $replace, $text); } // Break text according to config.php, also transform \r\n to
    function break_text($text, $settings) { $post_text = wordwrap($text, $settings['line_break'], "\n", TRUE); $post_text = nl2br($post_text, FALSE); return $post_text; } // Do some magic number trickery (easteregg) function make_id_text($post_id) { switch($post_id) { case 1: $id_text = 'first post - yeah'; break; case 42: $id_text = '...and thanks for all the fish...'; break; case 69: $id_text = "$post_id 😏"; break; case 104: $id_text = '10-4 affirmative'; break; case 143: $id_text = "$post_id πŸ’Œ"; break; case 404: $id_text = 'content not found'; break; case 420: $id_text = '🌿🌿🌿'; break; case 666: $id_text = 'πŸ‘ΏπŸ‘ΏπŸ‘Ώ '; break; case 911: $id_text = 'How can I help you ?'; break; case 1312: $id_text = 'all cats are beautiful'; break; default: $id_text = $post_id; } return $id_text; } // Show each post in a thread function print_thread($db, $sub, $css, $settings, $org_id, $link_to_reply) { $html_string = '
    '; if ( $link_to_reply != '' ) { $html_string .= "Jump to post $link_to_reply "; } $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE sub = '$sub' AND org_id = '$org_id' AND shadow = 'no' ORDER BY post_id DESC"); $result = $statement->execute(); while ($row = $result->fetchArray(SQLITE3_NUM)) { $post_id = "{$row[0]}"; $org_id = "{$row[1]}"; $post_text = "{$row[3]}"; $post_text = break_text(bbcode_to_html($post_text, $settings, $sub), $settings); $id_text = make_id_text($post_id); $timestamp = "{$row[4]}"; $name = "{$row[5]}"; $tripcode = "{$row[6]}"; $move_message = "{$row[7]}"; $edit_message = "{$row[8]}"; $html_string .= "

    " . "
    #$id_text"; if ( !empty($timestamp) && $settings['enable_timestamps'] ) { $html_string .= ":$timestamp"; } // $html_string .= "

    $post_text

    "; $html_string .= "

    $post_text

    "; if ( !empty($name) && $settings['enable_edit']) { $html_string .= "edit "; } if ( !empty($name) && $settings['enable_tripcodes']) { $name_string = $name; $link_string_4 = "/u/$name_string/css=$css"; $html_string .= "$name_string"; } if ( !empty($move_message) ) { $html_string .= "
    |$move_message|"; } if ( !empty($edit_message) ) { $html_string .= "
    |$edit_message|"; } $html_string .= '
    '; } echo "$html_string"; } // Show each post of the overboard (so all original posts in their // sequence, including bumps, except for the subs that are excluded) function print_overboard($db, $css, $settings, $page) { $out = ''; $pagination = $settings['pagination']; if ( (!empty($settings['no_overboard'])) ) { $last = array_pop($settings['no_overboard']); foreach($settings['no_overboard'] as $no_overboard) { $str = "'" . $no_overboard . "', "; $out .= $str; } $out .= "'" . $last . "'"; } if ($page == 'all') { $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE org_id = original AND shadow = 'no' AND sub NOT IN ($out) ORDER BY ROWID DESC"); } elseif ($page > 0) { // if the page is defined $page_start = ($page - 1) * $settings['pagination']; $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE org_id = original AND shadow = 'no' AND sub NOT IN ($out) ORDER BY ROWID DESC LIMIT '$page_start', '$pagination'"); } else { $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE org_id = original AND shadow = 'no' AND sub NOT IN ($out) ORDER BY ROWID DESC LIMIT '$pagination'"); } $result = $statement->execute(); while ($row = $result->fetchArray(SQLITE3_NUM)) { $html_string = ''; $post_id = "{$row[0]}"; $org_id = "{$row[1]}"; $sub = "{$row[2]}"; $text = "{$row[3]}"; $post_text = break_text(bbcode_to_html($text, $settings, $sub), $settings); $timestamp = "{$row[4]}"; $name = "{$row[5]}"; $tripcode = "{$row[6]}"; $move_message = "{$row[7]}"; $edit_message = "{$row[8]}"; $link_string_1 = "/r/$sub/$org_id/op/css=$css"; $link_string_2 = "/r/$sub/$org_id/css=$css"; $link_string_3 = "/s/$sub/css=$css"; $html_string .= "
    " . "

    " . "$sub:" . "#$post_id"; if ( !empty($timestamp) && $settings['enable_timestamps'] ) { $html_string .= ":$timestamp"; } $html_string .= "

    $post_text

    " . "reply "; if ( !empty($name) && $settings['enable_edit']) { $html_string .= "edit "; } if ( !empty($name) && $settings['enable_tripcodes']) { $name_string = $name; $link_string_4 = "/u/$name_string/css=$css"; $html_string .= "$name_string"; } if ( !empty($move_message) ) { $html_string .= "
    |$move_message|"; } if ( !empty($edit_message) ) { $html_string .= "
    |$edit_message|"; } $html_string .= '
    '; echo "$html_string"; if ($page == 'all') { print_replies($db, $sub, $post_id, $org_id, $settings, $css, 'open'); } else { print_replies($db, $sub, $post_id, $org_id, $settings, $css, 'closed'); } echo "

    "; } } // Show each post of an individual feed function print_individual_feed($db, $css, $settings, $ex_subs, $in_subs) { $counter = 0; if ( (!empty($ex_subs)) ) { $out = ''; $last = array_pop($ex_subs); foreach($ex_subs as $ex_sub) { $str = "'" . $ex_sub . "', "; $out .= $str; } $out .= "'" . $last . "'"; $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE org_id = original AND shadow = 'no' AND sub NOT IN ($out) ORDER BY ROWID DESC"); } elseif ( (!empty($in_subs)) ) { $in = ''; $last = array_pop($in_subs); foreach($in_subs as $in_sub) { $str = "'" . $in_sub . "', "; $in .= $str; } $in .= "'" . $last . "'"; $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE org_id = original AND shadow = 'no' AND sub IN ($in) ORDER BY ROWID DESC"); } $result = $statement->execute(); while ($row = $result->fetchArray(SQLITE3_NUM)) { $html_string = ''; $counter++; $post_id = "{$row[0]}"; $org_id = "{$row[1]}"; $sub = "{$row[2]}"; $text = "{$row[3]}"; $post_text = break_text(bbcode_to_html($text, $settings, $sub), $settings); $timestamp = "{$row[4]}"; $name = "{$row[5]}"; $tripcode = "{$row[6]}"; $move_message = "{$row[7]}"; $edit_message = "{$row[8]}"; $link_string_1 = "/r/$sub/$org_id/op/css=$css"; $link_string_2 = "/r/$sub/$org_id/css=$css"; $link_string_3 = "/s/$sub/css=$css"; $html_string .= "
    " . "

    " . "$sub:" . "#$post_id"; if ( !empty($timestamp) && $settings['enable_timestamps'] ) { $html_string .= ":$timestamp"; } // $html_string .= "

    $post_text

    " $html_string .= "

    $post_text

    " . "reply "; if ( !empty($name) && $settings['enable_edit']) { $html_string .= "edit "; } if ( !empty($name) && $settings['enable_tripcodes']) { $name_string = $name; $link_string_4 = "/u/$name_string/css=$css"; $html_string .= "$name_string"; } if ( !empty($move_message) ) { $html_string .= "
    |$move_message|"; } if ( !empty($edit_message) ) { $html_string .= "
    |$edit_message|"; } $html_string .= '
    '; echo "$html_string"; print_replies($db, $sub, $post_id, $org_id, $settings, $css, 'closed'); echo "

    "; } return $counter; } // Print the footer for the admin function print_footer_admin($css, $settings, $token) { $link_string_1 = "/lo/all/css=$css/$token"; $link_string_2 = "/lo/auth/css=$css/$token"; $link_string_3 = "/lo/bot/css=$css/$token"; $link_string_4 = "/lo/del/css=$css/$token"; $link_string_5 = "/lo/sys/css=$css/$token"; $link_string_6 = "/lo/user/css=$css/$token"; $link_string_7 = "/lo/import/css=$css/$token"; $left_section = "all logs" . "|auth" . "|user" . "|bot" . "|del" . "|import" . "|sys"; $mid_section = "log out" . "|" . "show shadowed posts and subs"; $right_section = "dump" . "|import" . "|view mods"; print_footer($left_section, $mid_section, $right_section); } // Print the footer for the landing page function print_footer_landing($db, $settings) { if ($settings['enable_admin_panel'] == TRUE) { $left_section = "Admin login"; } else { $left_section = "**********"; } if ($settings['enable_mod_panel'] == TRUE) { $mid_section = "Mod login"; } else { $mid_section = "**********"; } if ( ($settings['enable_admin_panel'] == TRUE) && (!check_admin($db, $settings)) ) { $right_section = "set admin password"; } elseif ($settings['take_applications'] == TRUE) { $right_section = "apply for mod account"; } else { $right_section = "**********"; } print_footer($left_section, $mid_section, $right_section); } // Print the footer for the mod function print_footer_mod($css, $settings, $token, $sub) { $left_section = "***************"; $mid_section = "log out"; $right_section = "***************"; print_footer($left_section, $mid_section, $right_section); } // Print the footer for multifeeds function print_footer_multifeeds($subs_string, $total_posts, $css, $settings) { $left_section = $subs_string . '|' . $total_posts . " posts total"; $mid_section = "overboard|" . "show subs"; $right_section = "get link for multifeed"; print_footer($left_section, $mid_section, $right_section); } // Print footer, with the total messages and some links, for the subs function print_footer_sub($sub, $total_posts, $css, $page, $settings) { if ( ($total_posts > $settings['pagination']) && ($page != 'all') ) { $number_first_message = ($page - 1) * $settings['pagination'] + 1; $number_last_message = $number_first_message + $settings['pagination'] - 1; if ($number_last_message > $total_posts) { $number_last_message = $total_posts; } $next_page = $page + 1; $prev_page = $page - 1; $pages_total = ceil($total_posts / $settings['pagination']); $show_string_1 = "page:$page/$pages_total|posts:" . "$number_first_message" . "-$number_last_message/$total_posts|"; $link_string_1 = "/s/$sub/$next_page/css=$css"; $link_string_2 = "/s/$sub/$prev_page/css=$css"; $link_string_3 = "/s/$sub/all/css=$css"; if ( ($number_first_message > 1) && ($number_last_message < $total_posts) ) { $left_section = "$show_string_1older|newer|all"; } elseif ($number_last_message == $total_posts) { $left_section = "$show_string_1newer|all"; } else { $left_section = "$show_string_1older|all"; } } else { $left_section = "$total_posts posts total"; } $mid_section = ''; $right_section = ''; if ($sub == 'main') { $mid_section = "overboard|" . "show subs"; $right_section = "save main"; } elseif ( ($sub == 'overboard') ) { $mid_section = "main|" . "show subs"; $right_section = "save overboard"; } else { $mid_section = "main|" . "overboard|" . "show subs"; $right_section = "save $sub"; } print_footer($left_section, $mid_section, $right_section); } // Print the footer for replies function print_footer_reply($sub, $total_posts, $css, $msg, $org_id, $settings) { $left_section = $msg; $mid_section = "back to $sub|" . "overboard"; $right_section = "save $msg"; print_footer($left_section, $mid_section, $right_section); } // prints the footer function print_footer($left_section, $mid_section, $right_section) { $html_string = "
    " . "
    $left_section
    " . "
    $mid_section
    " . "
    $right_section
    " . "
    " . "
    " . "
    "; echo "$html_string"; } // Give all the http-headers to the client, mostly for opsec reasons. // After, print the html header to open the document for the browser. function print_header($css) { // header( 'Content-Type: text/html; charset=utf-8'); // header( 'X-Frame-Options: DENY', FALSE); // header( 'HTTP Cross-Origin-Opener-Policy: same-origin', FALSE); // header( 'Cross-Origin-Resource-Policy: same-site', FALSE); // header( 'Permissions-Policy: geolocation=(), camera=(), microphone=()', // FALSE); // header( 'Permissions-Policy: interest-cohort=()', FALSE); // header( 'Server: webserver', FALSE); // header( 'X-DNS-Prefetch-Control: off', FALSE); // header( 'Cache-Control: no-cache', FALSE); // header( 'Pragma: no-cache', FALSE); // nginx throws an error with those, and gives back 502 - bad gateway // does not happen with other versions $html_string = "" . ""; echo "$html_string"; } // Show all replies to a given post function print_replies($db, $sub, $post_id, $org_id, $settings, $css, $state) { $sub_statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE sub = '$sub' AND org_id = '$org_id' AND org_id != original AND shadow = 'no'"); $sub_result = $sub_statement->execute(); $answers = array(); $counter = 0; while ($row = $sub_result->fetchArray(SQLITE3_NUM)) { $sub_post_id = "{$row[0]}"; $sub_org_id = "{$row[1]}"; $sub_text = "{$row[3]}"; $sub_timestamp = "{$row[4]}"; $sub_name = "{$row[5]}"; $sub_tripcode = "{$row[6]}"; $sub_move_message = "{$row[7]}"; $sub_edit_message = "{$row[8]}"; if ($sub_post_id != $sub_org_id) { $counter++; $post = array(); $sub_post_text = break_text(bbcode_to_html ($sub_text, $settings, $sub), $settings); array_push($post, $sub_post_id); array_push($post, $sub_org_id); array_push($post, $sub_post_text); array_push($post, $sub_timestamp); array_push($post, $sub_name); array_push($post, $sub_tripcode); array_push($post, $sub_move_message); array_push($post, $sub_edit_message); array_push($answers, $post); } } $display_number = $counter - 1; if ($counter == 0) { // no replies exist for this message return; } $last_answer = array_pop($answers); $last_post_id = $last_answer[0]; $last_post_text = $last_answer[2]; $last_post_timestamp = $last_answer[3]; $last_post_name = $last_answer[4]; $last_post_tripcode = $last_answer[5]; $last_post_move_message = $last_answer[6]; $last_post_edit_message = $last_answer[7]; $html_string = ''; if ($counter > 1) { // we have at least one reply if ($state == 'open') { $html_string .= "
    "; } else { $html_string .= "
    "; } $html_string .= "Show $display_number more replies"; foreach ($answers as $display_msg) { $answer_post_id = $display_msg[0]; $answer_post_text = $display_msg[2]; $answer_post_timestamp = $display_msg[3]; $answer_post_name = $display_msg[4]; $answer_post_tripcode = $display_msg[5]; $answer_post_move_message = $display_msg[6]; $answer_post_edit_message = $display_msg[7]; $link_string_1 = "/r/$sub/$org_id/$answer_post_id/css=$css"; $html_string .= "
    " . "

    " . "#$answer_post_id"; if ( !empty($answer_post_timestamp) && $settings['enable_timestamps'] ) { $html_string .= ":$answer_post_timestamp"; } $html_string .= "

    $answer_post_text

    "; if ( !empty($answer_post_name) && $settings['enable_edit']) { $html_string .= "edit "; } if ( !empty($answer_post_name) && $settings['enable_tripcodes']) { $name_string = $answer_post_name; $link_string_4 = "/u/$name_string/css=$css"; $html_string .= "$name_string"; } if ( !empty($answer_post_move_message) ) { $html_string .= "
    |$answer_post_move_message|" . ""; } if ( !empty($answer_post_edit_message) ) { $html_string .= "
    |$answer_post_edit_message|" . ""; } $html_string .= '
    '; } $html_string .= "
    "; } $link_string_1 = "/r/$sub/$org_id/$last_post_id/css=$css"; $html_string .= "
    " . "

    " . "#$last_post_id"; if ( !empty($last_post_timestamp) && $settings['enable_timestamps'] ) { $html_string .= ":$last_post_timestamp"; } $html_string .= "

    $last_post_text

    "; if ( !empty($last_post_name) && $settings['enable_edit']) { $html_string .= "edit "; } if ( !empty($last_post_name) && $settings['enable_tripcodes']) { $name_string = $last_post_name; $link_string_4 = "/u/$name_string/css=$css"; $html_string .= "$name_string"; } if ( !empty($last_post_move_message) ) { $html_string .= "
    |$last_post_move_message|"; } if ( !empty($last_post_edit_message) ) { $html_string .= "
    |$last_post_edit_message|"; } $html_string .= '
    '; echo "$html_string"; } // Send a rss feed function print_rss_all($db, $settings, $page) { $page_start = ($page - 1) * $settings['pagination']; $pagination = $settings['pagination']; $title = $settings['title']; $address = $settings['web_address']; $description = $settings['RSS_message']; $name = $settings['site_name']; $out = ''; if ( (!empty($settings['no_overboard'])) ) { $last = array_pop($settings['no_overboard']); foreach($settings['no_overboard'] as $no_overboard) { $str = "'" . $no_overboard . "', "; $out .= $str; } $out .= "'" . $last . "'"; } $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, move_message, edit_message FROM threads WHERE shadow = 'no' AND sub NOT IN ($out) ORDER BY ROWID DESC LIMIT '$page_start', '$pagination'"); $result = $statement->execute(); header( "Content-type: text/xml" ); $rss_string = "" . "" . "$title" . "$address" . "$description" . "en-us"; while ($row = $result->fetchArray(SQLITE3_NUM)) { $post_id = "{$row[0]}"; $org_id = "{$row[1]}"; $sub = "{$row[2]}"; $text = "{$row[3]}"; $text = htmlspecialchars($text); $timestamp = "{$row[4]}"; $user_name = "{$row[5]}"; $move_message = "{$row[6]}"; $edit_message = "{$row[7]}"; $rss_string .= "" . "<$name:sub>$sub"; if ( $post_id != $org_id ) { $rss_string .= "<$name:answer>answer to $org_id"; } if ( !empty($timestamp) && $settings['enable_timestamps'] ) { $rss_string .= "<$name:timestamp>$timestamp"; } if ( empty($user_name) ) { $user_name = "anonymous"; } $rss_string .= "<$name:author>$user_name"; if ( !empty($move_message) ) { $rss_string .= "<$name:moved>$move_message"; } if ( !empty($edit_message) ) { $rss_string .= "<$name:edited>$edit_message"; } $rss_string .= "$text" . "$address/r/$sub/$org_id"; } $rss_string .= ""; echo $rss_string; } // Show each post in a sub function print_sub($db, $sub, $css, $settings, $page) { echo "
    "; $pagination = $settings['pagination']; if ($page == 'all') { $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE sub = '$sub' AND shadow = 'no' AND original = org_id ORDER BY ROWID DESC"); } elseif ($page > 0) { // if the page is defined $page_start = ($page - 1) * $settings['pagination']; $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE sub = '$sub' AND shadow = 'no' AND original = org_id ORDER BY ROWID DESC LIMIT '$page_start', '$pagination'"); } else { $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode, move_message, edit_message FROM threads WHERE sub = '$sub' AND shadow = 'no' AND original = org_id ORDER BY ROWID DESC LIMIT '$pagination'"); } $result = $statement->execute(); while ($row = $result->fetchArray(SQLITE3_NUM)) { $html_string = ''; $post_id = "{$row[0]}"; $org_id = "{$row[1]}"; $text = "{$row[3]}"; $timestamp = "{$row[4]}"; $name = "{$row[5]}"; $tripcode = "{$row[6]}"; $move_message = "{$row[7]}"; $edit_message = "{$row[8]}"; $post_text = break_text(bbcode_to_html($text, $settings, $sub), $settings); $html_string .= "
    "; $id_text = make_id_text($post_id); $link_string_1 = "/r/$sub/$org_id/op/css=$css"; $link_string_2 = "/r/$sub/$org_id/css=$css"; $html_string .= "
    " . "

    " . "#$id_text"; if ( !empty($timestamp) && $settings['enable_timestamps'] ) { $html_string .= ":$timestamp"; } // $html_string .= "

    $post_text

    " $html_string .= "

    $post_text

    " . "reply "; if ( !empty($name) && $settings['enable_edit']) { $html_string .= "edit "; } if ( !empty($name) && $settings['enable_tripcodes']) { $name_string = $name; $link_string_4 = "/u/$name_string/css=$css"; $html_string .= "$name_string"; } if ( !empty($move_message) ) { $html_string .= "
    |$move_message|"; } if ( !empty($edit_message) ) { $html_string .= "
    |$edit_message|"; } $html_string .= '
    '; echo "$html_string"; if ($page == 'all') { print_replies($db, $sub, $post_id, $org_id, $settings, $css, 'open'); } else { print_replies($db, $sub, $post_id, $org_id, $settings, $css, 'closed'); } echo "

    "; } echo "
    "; } // prints the fixed topheader with some text function print_top_header($text) { echo "

    $text

    "; } // Show each post by a user function print_user($db, $name, $css, $settings) { echo "
    "; $statement = $db->prepare("SELECT post_id, org_id, sub, text, timestamp, name, tripcode FROM threads WHERE name = '$name' AND shadow = 'no' ORDER BY ROWID DESC"); $result = $statement->execute(); while ($row = $result->fetchArray(SQLITE3_NUM)) { $html_string = ''; $post_id = "{$row[0]}"; $org_id = "{$row[1]}"; $sub = "{$row[2]}"; $text = "{$row[3]}"; $timestamp = "{$row[4]}"; $name = "{$row[5]}"; $tripcode = "{$row[6]}"; $post_text = break_text(bbcode_to_html($text, $settings, $sub), $settings); $html_string .= "
    "; $id_text = make_id_text($post_id); $link_string_1 = "/r/$sub/$org_id/$post_id/css=$css"; $link_string_2 = "/r/$sub/$org_id/css=$css"; $html_string .= "
    " . "

    " . "#$id_text"; if ( !empty($timestamp) && $settings['enable_timestamps'] ) { $html_string .= ":$timestamp"; } // $html_string .= "

    $post_text

    " $html_string .= "

    $post_text

    " . "reply "; if ( !empty($name) && $settings['enable_edit']) { $html_string .= "edit "; } $html_string .= '


    '; echo "$html_string"; } echo "
    "; } // EOF