Example #1
0
 function __construct()
 {
     parent::__construct(Config::getCfg('site')['pagetitle'], "", 0);
     $boards = Model::get()->getBoards();
     $archiveBoards = array_filter($boards, function ($b) {
         return $b->isArchive();
     });
     $plainBoards = array_filter($boards, function ($b) {
         return !$b->isArchive();
     });
     $html = "<div class='boardlist_big'><h1>Archived Boards</h1><hr style='width:64px;'>";
     foreach ($archiveBoards as $b) {
         $html .= Site::parseHtmlFragment("indexArchiveBoard.html", ["%ago%", "%crawltime%", "%shortname%", "%longname%", "%posts%", "%threads%", "%firstcrawl%"], [ago(time() - $b->getLastCrawl()), $b->getLastCrawl(), $b->getName(), $b->getLongName(), $b->getNoPosts(), $b->getNoThreads(), date("j F Y", $b->getFirstCrawl())]);
     }
     $html .= "</div>";
     $html .= "<script type='text/javascript' src='/script/boardUpdate.js'></script>";
     if (count($plainBoards) > 0) {
         $html .= "<div class='boardlist_big'><h1>Boards</h1><hr style='width:64px;'>";
         foreach ($plainBoards as $b) {
             $html .= Site::parseHtmlFragment("indexBoard.html", ["%ago%", "%crawltime%", "%shortname%", "%longname%", "%posts%", "%threads%", "%firstcrawl%"], [ago(time() - $b->getLastCrawl()), $b->getLastCrawl(), $b->getName(), $b->getLongName(), $b->getNoPosts(), $b->getNoThreads(), date("j F Y", $b->getFirstCrawl())]);
         }
         $html .= "</div>";
     }
     $this->setBody($html);
 }
Example #2
0
 function __construct(Thread $thread)
 {
     parent::__construct($thread->getBoard());
     $topLinks = div('', 'topLinks navLinks')->append('[' . a('Home', '/index') . ']')->append(' [' . a('Return', '/' . $this->board->getName() . '/') . ']');
     if (!$thread->getBoard()->isSwfBoard()) {
         $topLinks->append(' [' . a('Catalog', '/' . $this->board->getName() . '/catalog') . ']');
     }
     if (!$thread->getBoard()->isArchive() && $thread->isActive()) {
         if ($thread->isClosed()) {
             $this->appendToBody(el('h2', 'Thread is closed.'));
         } else {
             if (!isset($_SESSION['captcha'])) {
                 $_SESSION['captcha'] = rand(100000, 999999);
             }
             $this->appendToBody(Site::parseHtmlFragment('postForm.html', ['_board_', '_resto_', '_password_'], [$thread->getBoard()->getName(), $thread->getThreadId(), 'password']));
         }
     }
     $this->appendToBody($topLinks);
     $thread->loadAll();
     $dur = secsToDHMS($thread->getPost($thread->getPosts() - 1)->getTime() - $thread->getPost(0)->getTime());
     $board = div('', 'board');
     if ($thread->getBoard()->isArchive()) {
         $threadStats = Site::parseHtmlFragment("threadStats.html", ["__threadid__", "__posts__", "__posts_actual__", "__images__", "__images_actual__", "__lifetime__", "__deleted__", "<!--4chanLink-->", "<!--tag-->"], [$thread->getThreadId(), $thread->getChanPosts(), $thread->getPosts() - 1, $thread->getChanImages(), $thread->getImages() - 1, "{$dur[0]}d {$dur[1]}h {$dur[2]}m {$dur[3]}s", $thread->getDeleted(), $thread->isActive() ? "<a target='_blank' href='//boards.4chan.org/{$this->board->getName()}/thread/{$thread->getThreadId()}'>View on 4chan</a>" : "Thread is dead.", $thread->getTag() != null ? "<br>Tagged as: " . $thread->getTag() : ""]);
         $board->append($threadStats);
     } else {
         $board->append('<hr>');
     }
     $this->appendToBody($board->append(div($thread->displayThread(), 'thread')));
     $bottomLinks = $topLinks;
     $this->appendToBody("<hr>" . $bottomLinks);
 }
Example #3
0
 public function __construct()
 {
     parent::__construct("Report Queue", el('h2', "Reports"), Config::getCfg('permissions')['delete']);
     $reports = Model::get()->getReports();
     $html = "<table class='reportTable'><tr><th colspan='3'>Report Queue</th></tr><tr><th style='width:3em;'>Times</th><th>Post</th><th style='width:20em;'>Options</th></tr>";
     foreach ($reports as $report) {
         $hash = bin2hex($report['md5']);
         $html .= "<tr id='report{$report['no']}'>";
         $html .= "<td>" . $report['count'] . "</td>";
         $html .= "<td><a href='{$report['threadid']}#p{$report['no']}' data-board='{$report['board']}' data-thread='{$report['threadid']}' data-post='{$report['no']}' class='quotelink noEmbed'>&gt;&gt;{$report['no']}</a></td>";
         $html .= "<td><a class='button' href='javascript:deletePost({$report['no']},\"{$report['board']}\");' >Delete&nbsp;Post</a>&nbsp;";
         $html .= "<a class='button' href='javascript:banImage(\"{$hash}\");' id='ban{$hash}'>Ban&nbsp;Image</a>&nbsp;";
         $html .= "<a class='button' href='javascript:deleteReport({$report['no']},\"{$report['board']}\");'>Delete&nbsp;Report</a>&nbsp;";
         $html .= "<a class='button' href='javascript:banReporter({$report['no']},\"{$report['board']}\");'>Ban&nbsp;Reporter</a></td>";
         $html .= "</tr>";
     }
     $html .= "</table>";
     if (Site::getUser()->getPrivilege() >= Config::getCfg('permissions')['owner']) {
         $html .= "<br><table class='reportTable'><tr><th colspan='3'>Last Few Deleted Posts</th></tr><tr><th style='width:3em;'>Board</th><th>Post</th><th style='width:7em;'>Options</th></tr>";
         foreach (Model::get()->getBoards() as $board) {
             $lastFew = OldModel::getLastNDeletedPosts($board->getName(), 5);
             foreach ($lastFew as $report) {
                 $html .= "<tr id='report{$report['no']}'>";
                 $html .= "<td>" . $board->getName() . "</td>";
                 $html .= "<td>&gt;&gt;{$report['no']} ({$report['name']}{$report['trip']})</td>";
                 $html .= "<td><a class='button' href='javascript:restorePost({$report['no']},\"{$board->getName()}\");' >Restore&nbsp;Post</a></td>";
                 $html .= "</tr>";
             }
         }
         $html .= "</table>";
     }
     $this->appendToBody($html);
 }
Example #4
0
 static function setStyle() : string
 {
     $styles = Config::getCfg("styles");
     if (in_array(post('style'), array_keys($styles))) {
         Site::getUser()->setTheme(post('style'));
     }
     return '';
 }
Example #5
0
 public function __construct()
 {
     parent::__construct("Banned", "You're banned.");
     $banInfo = OldModel::getBanInfo($_SERVER['REMOTE_ADDR']);
     $expires = $banInfo['expires'] == 0 ? "Never" : date("Y-m-d h:i:s T", $banInfo['expires']);
     $this->body = Site::parseHtmlFragment('banned.html', ['__ip__', '__reason__', '__expires__'], [$_SERVER['REMOTE_ADDR'], $banInfo['reason'], $expires]);
     $this->title = "/b/ stats: ACCESS DENIED";
 }
Example #6
0
 function __construct()
 {
     parent::__construct("b-stats news", "", 0);
     $this->appendToBody("<h2>News</h2>");
     $articles = Model::get()->getAllNewsArticles();
     foreach ($articles as $article) {
         $date = date("Y-m-d g:i a", $article['time']);
         $content = nl2br($article['content']);
         $this->appendToBody(Site::parseHtmlFragment("article.html", ['_author_', '_id_', '_title_', '_content_', '_date_'], [$article['username'], $article['article_id'], $article['title'], $content, $date]));
     }
 }
Example #7
0
 public function __construct()
 {
     parent::__construct("Dashboard", "", 1);
     if (isset($_GET['success'])) {
         $error = "<br>Successfully changed.";
     } else {
         if (isset($_GET['failure'])) {
             $error = "<br>Password change unsuccessful.";
         } else {
             $error = "";
         }
     }
     $user = Site::getUser();
     $this->appendToBody(Site::parseHtmlFragment("dashboard.html", ['<!-- username -->', '<!-- privilege -->', '<!-- theme -->', '<!-- error -->'], [$user->getUsername(), $user->getPrivilege(), $user->getTheme(), $error]));
 }
Example #8
0
 public function display() : string
 {
     $img = imagecreatetruecolor(96, 48);
     $image_text = empty($_SESSION['captcha']) ? 'error' : $_SESSION['captcha'];
     srand(time() / 60);
     $red = rand(0, 100);
     $green = rand(0, 100);
     $blue = rand(0, 100);
     $text_color = imagecolorallocate($img, 255 - $red, 255 - $green, 255 - $blue);
     $strlen = strlen($image_text);
     $char_array = str_split($image_text);
     for ($i = 0; $i < $strlen; $i++) {
         imagettftext($img, rand(13, 16), rand(-20, 20), 5 + 15 * $i, rand(15, 40), $text_color, Site::getPath() . "/cfg/DroidSansMono.ttf", $char_array[$i]);
     }
     header("Content-type:image/jpeg");
     header("Content-Disposition:inline ; filename=secure.jpg");
     imagejpeg($img, null, 5);
     exit;
 }
Example #9
0
 public function __construct()
 {
     parent::__construct("Apply for Access", "", 0);
     $db = Config::getMysqliConnectionRW();
     $err = '';
     if (isset($_POST['username'])) {
         if (post('captcha') == $_SESSION['captcha']) {
             $username = $db->real_escape_string(post('username'));
             $password = md5(post('password'));
             $email = $db->real_escape_string(post('email'));
             $reason = $db->real_escape_string(post('why'));
             $ip = Site::ip();
             $db->query("INSERT INTO `request` (`ip`,`username`,`password`,`email`,`reason`,`time`) VALUES ('{$ip}','{$username}',UNHEX('{$password}'),'{$email}','{$reason}',UNIX_TIMESTAMP())");
             header('Location: /');
             exit;
         } else {
             $err = 'Invalid captcha.';
         }
     }
     $q = $db->query("SELECT * FROM `request` WHERE `ip`='" . Site::ip() . "'");
     if ($q->num_rows === 0) {
         $_SESSION['captcha'] = rand(100000, 999999);
         if ($err != '') {
             $this->appendToBody("<p class='center'>{$err}</p>");
         }
         $this->appendToBody(Site::parseHtmlFragment('reqForm.html', ['__captcha__'], ['<img src="/captcha" alt="captcha">']));
     } else {
         $r = $q->fetch_assoc();
         if ($r['accepted'] == 0) {
             $this->appendToBody("<h2>Hold Your Horses</h2><p class='center'>You have successfully applied. Check this page or your email for your status.</p>");
         } else {
             if ($r['accepted'] == -1) {
                 $this->appendToBody("<h2>Oh noes ;_;</h2><p class='center'>Sorry, your application has been reviewed and denied. Now that you have seen this message, you may submit a new application.</p>");
                 $db->query("DELETE FROM `request` WHERE `ip`='" . Site::ip() . "'");
             } else {
                 if ($r['accepted'] == 1) {
                     $this->appendToBody("<h2>Congratulations</h2><p class='center'>Your application was reviewed and accepted.<br>You may now log in with the username and password that you chose.</p>");
                 }
             }
         }
     }
 }
Example #10
0
 private function renderPageNumbers(int $page, bool $catalog = true) : string
 {
     $catalogLink = $catalog ? '<div class="pages cataloglink"><a href="./catalog">Catalog</a></div>' : '';
     if ($page == 1) {
         $linkList = Site::parseHtmlFragment("pagelist/pagelist_first.html", '<!-- catalog -->', $catalogLink);
     } elseif (1 < $page && $page < $this->board->getArchivePages() - 1) {
         $linkList = Site::parseHtmlFragment("pagelist/pagelist_middle.html", '<!-- catalog -->', $catalogLink);
     } else {
         $linkList = Site::parseHtmlFragment("pagelist/pagelist_last.html", '<!-- catalog -->', $catalogLink);
     }
     $pages = "";
     for ($p = 2; $p <= min($this->board->getArchivePages(), $this->board->getPages()); $p++) {
         if ($p == $page) {
             $pages .= "[<strong><a href='{$p}'>{$p}</a></strong>] ";
         } else {
             $pages .= "[<a href='{$p}'>{$p}</a>] ";
         }
     }
     $start = max([$page - 7, $this->board->getPages() + 1]);
     $end = min([$page + 8, $this->board->getArchivePages() + 1]);
     if ($end > $this->board->getPages()) {
         if ($start > $this->board->getPages() + 1) {
             $pages .= "[...] ";
         }
         for ($i = $start; $i < $end; $i++) {
             if ($i == $page) {
                 $pages .= "[<strong><a href='{$i}'>{$i}</a></strong>] ";
             } else {
                 $pages .= "[<a href='{$i}'>{$i}</a>] ";
             }
         }
     }
     if ($end < $this->board->getArchivePages()) {
         $pages .= "[...] ";
         $pages .= "[<a href='{$this->board->getArchivePages()}'>{$this->board->getArchivePages()}</a>] ";
     }
     return str_replace(["_prev_", "_next_", "_pages_"], [$page - 1, $page + 1, $pages], $linkList);
 }
Example #11
0
 private static function makeImageBlock(Post $post, $display)
 {
     /**
      * The following block is only for posts with an image attached.
      */
     if ($post->hasImage() && !$post->imgbanned) {
         $md5Filename = str_replace('/', '-', $post->md5);
         $humanFilesize = $post->fsize > 0 ? human_filesize($post->fsize) . ", " : "";
         list($thumbW, $thumbH) = tn_Size($post->w, $post->h);
         if ($display == self::DISPLAY_OP && ($post->w > 125 || $post->h > 125)) {
             //OP thumbs are 250x250 rather than 125x125
             $thumbW *= 2;
             $thumbH *= 2;
         }
         $thumb = "<a class='fileThumb' href='{$post->getImgUrl()}' target='_blank'>" . "<img src='{$post->getThumbUrl()}' alt='' data-md5='{$post->md5}' data-md5-filename='{$md5Filename}' data-ext='{$post->ext}' data-full-img='{$post->getImgUrl()}' width='{$thumbW}' height='{$thumbH}' data-width='{$post->w}' data-height='{$post->h}' />" . "</a>";
         $chanMedia = $post->board == 'f' ? '//i.4cdn.org/f/src/' . $post->filename . $post->ext : '//i.4cdn.org/' . $post->board . '/src/' . $post->tim . $post->ext;
         $fullImgLink = $post->getExtension() == '.swf' ? $post->getSwfUrl() : $post->getImgUrl();
         $fileDiv = div('', 'file')->set('id', 'f' . $post->no);
         $fileInfo = div('', 'fileInfo');
         $fileText = span('', 'fileText')->set('id', 'fT' . $post->no)->set('data-filename', $post->filename . $post->ext);
         $fileText->append(a($post->filename . $post->ext, $chanMedia)->set("target", "_blank")->set("title", $post->filename . $post->ext)->set("class", 'imageLink')->set('rel', 'noreferrer'))->append('&nbsp;')->append("({$humanFilesize}{$post->w}x{$post->h}, " . ($post->board == 'f' ? $post->tag . ")" : "<span title='{$post->filename}{$post->ext}'>{$post->tim}{$post->ext}</span>)&nbsp;"));
         if ($post->getExtension() != '.swf') {
             $fileText->append(a('iqdb', "http://iqdb.org/?url={$post->getThumbUrl()}")->set("target", "_blank") . '&nbsp;' . a('google', "http://www.google.com/searchbyimage?image_url={$post->getThumbUrl()}")->set("target", "_blank"));
         }
         $fileText->append('&nbsp;' . a('reposts', "/{$post->board}/search/md5/{$post->getMD5Hex()}")->set("target", "_blank") . '&nbsp;' . a('full', $fullImgLink)->set("target", '_blank'));
         $fileInfo->append($fileText);
         $fileDiv->append($fileInfo);
         $fileDiv->append($thumb);
         return $fileDiv;
     } else {
         if ($post->imgbanned) {
             return Site::parseHtmlFragment("post/banned_image.html");
         } else {
             return "";
         }
     }
 }
Example #12
0
use View\Pages\FourOhFour;
define("START_TIME", microtime(true));
require_once 'inc/config.php';
require_once 'inc/globals.php';
try {
    // Page router
    try {
        if (Site::backupInProgress() && $_SERVER['REMOTE_ADDR'] != '127.0.0.1') {
            die((new Page("Backup in Progress", "<h2>Backing Up</h2><div class='centertext'>Please come back later.</div>"))->display());
        }
        if (Site::isBanned()) {
            die((new Banned())->display());
        }
        Router::route(strtok($_SERVER["REQUEST_URI"], '?'));
    } catch (NotFoundException $ex) {
        echo (new FourOhFour($ex->getMessage()))->display();
    } catch (PermissionException $ex) {
        die((new FancyPage("/b/ stats: ACCESS DENIED", Site::parseHtmlFragment('accessDenied.html', ['__privilege__', '__required__'], [$ex->has, $ex->required]), 0))->display());
    } catch (PDOException $ex) {
        $page = new Page("Database Error", "");
        $page->appendToBody(div('There was an error with the database.<br>' . 'It may be misconfigured.', 'centertext') . div($ex->getMessage() . nl2br($ex->getTraceAsString()), 'centertext'));
        header("HTTP/1.0 500 Internal Server Error");
        echo $page->display();
    } catch (Exception $ex) {
        $page = new FancyPage("Error", "", 0);
        $page->setBody("<h1>Error</h1>" . "<div class='centertext'>" . "Your request could not be processed. The following error was encountered: " . "<br>" . $ex->getMessage() . " at " . $ex->getFile() . ":" . $ex->getLine() . "</div>");
        echo $page->display();
    }
} catch (Throwable $err) {
    echo "There was a serious error encountered. The server admin likely broke a configuration file, or something." . "<br><br>" . $err->getMessage() . " in " . $err->getFile() . " at line " . $err->getLine();
}
Example #13
0
 protected function renderFooter()
 {
     if (!$this->clearFooter) {
         $this->footer = Site::parseHtmlFragment("pagefoot.html", ["<!--copyright-->"], [file_get_contents("htmls/copyright.html")]);
     } else {
         $this->footer = file_get_contents("htmls/pagefoot.html");
     }
     return $this->footer;
 }
Example #14
0
 function __construct()
 {
     parent::__construct("Server Control Panel", "", Site::LEVEL_TERRANCE);
     $this->appendToBody(Site::parseHtmlFragment("scp.html", ['<!-- uptime -->'], [`uptime` . '<br>' . human_filesize(disk_free_space(__DIR__), 2) . " free"]));
 }
Example #15
0
 public static function sitectl(array $path) : array
 {
     Site::requirePrivilege(Config::getCfg('permissions')['owner']);
     switch (strtolower($path[3])) {
         case 'enterbackupmode':
             Site::enterBackupMode();
             break;
         case 'exitbackupmode':
             Site::exitBackupMode();
             break;
     }
     return ['result' => 'success'];
 }
Example #16
0
 static function stop($board)
 {
     if (self::getStatus($board) == self::RUNNING) {
         touch(Site::getPath() . "/backend/{$board}.kill");
     }
 }
Example #17
0
 function __construct()
 {
     parent::__construct("FAQ", "", 0);
     $this->setBody(Site::parseHtmlFragment("faq.html"));
 }
Example #18
0
                $err = false;
                break;
            case "banImage":
                OldModel::banHash($_POST['hash']);
                $err = false;
                break;
            case "deleteReport":
                OldModel::deleteReport($_POST['no'], $_POST['b']);
                $err = false;
                break;
            case "banReporter":
                OldModel::banReporter($_POST['no'], $_POST['b']);
                $err = false;
                break;
            case "restorePost":
                if (Site::getUser()->getPrivilege() >= Site::LEVEL_TERRANCE) {
                    OldModel::restorePost($_POST['no'], $_POST['b']);
                } else {
                    list($err, $errmsg) = [true, "Check your privilege"];
                }
                break;
            default:
                $err = true;
                $errmsg = "No action.";
                break;
        }
    } catch (Exception $e) {
        $err = true;
        $errmsg = $e->getMessage();
    }
} else {
Example #19
0
 public function addReport(ImageBoard\Board $board, int $post, int $thread)
 {
     $time = time();
     $uid = Site::getUser()->getUID();
     $ip = $_SERVER['REMOTE_ADDR'];
     $this->conn_rw->query("INSERT INTO `reports` (`uid`,`board`,`time`,`ip`,`no`,`threadid`) " . "VALUES ('{$uid}','{$board->getName()}',{$time},'{$ip}',{$post},{$thread})");
 }
Example #20
0
 /**
  * Get the named config file.
  * If not found, throws exception.
  * @param string $name
  * @return array
  * @throws NotFoundException;
  */
 static function getCfg($name)
 {
     if (isset(self::$json_cache[$name])) {
         return self::$json_cache[$name];
     }
     if (file_exists(Site::getPath() . "/cfg/{$name}.json")) {
         self::$json_cache[$name] = json_decode(file_get_contents(Site::getPath() . "/cfg/{$name}.json"), true);
         return self::$json_cache[$name];
     }
     throw new NotFoundException("Couldn't find config: {$name} (did you run the setup script?)");
 }
Example #21
0
 /**
  * Default constructor
  * @param string $title Text in the <code>&lt;title&gt;</code> tags.
  * @param string $body Initial body text.
  * @param int $privelege The minimum access level to see the page.
  */
 function __construct($title, $body = "", $privilege = 1, $board = null)
 {
     parent::__construct($title, $body);
     $this->requiredLevel = $privilege;
     $this->board = $board;
     if ($this->user->getPrivilege() >= Site::LEVEL_SEARCH) {
         $this->addToHead("<script type='text/javascript'>\$(document).ready(function(){ImageHover.init('');});</script>");
     }
     if ($this->user->getPrivilege() >= Site::LEVEL_ADMIN) {
         $this->addToHead("<script type='text/javascript' src='/script/bstats-admin.js'></script>");
     }
     if ($this->user->getPrivilege() < $this->requiredLevel) {
         throw new PermissionException($this->user->getPrivilege(), $this->requiredLevel);
     }
     $navBarExtra = "";
     if ($this->user->getPrivilege() == 0) {
         //If not logged in, show login form.
         $navBarExtra .= Site::parseHtmlFragment("loginform.html");
     }
     if ($this->user->getPrivilege() > 0) {
         $navBarExtra .= Site::parseHtmlFragment('loginticker.html', ['%username%', '%privilege%', '<!-- more buttons -->'], [$this->user->getUsername(), $this->user->getPrivilege(), $this->renderExtraButtons()]);
     }
     $this->navbar->append($navBarExtra);
 }