diff --git a/core/page.class.php b/core/page.class.php
index 7f90a982..c03b0853 100644
--- a/core/page.class.php
+++ b/core/page.class.php
@@ -132,6 +132,9 @@ class Page {
/** @var string[] */
public $http_headers = array();
+ /** @var string[][] */
+ public $cookies = array();
+
/** @var Block[] */
public $blocks = array();
@@ -187,6 +190,31 @@ class Page {
$this->http_headers[$position] = $line;
}
+ /**
+ * The counterpart for get_cookie, this works like php's
+ * setcookie method, but prepends the site-wide cookie prefix to
+ * the $name argument before doing anything.
+ *
+ * @param string $name
+ * @param string $value
+ * @param int $time
+ * @param string $path
+ */
+ public function add_cookie($name, $value, $time, $path) {
+ $full_name = COOKIE_PREFIX."_".$name;
+ $this->cookies[] = array($full_name, $value, $time, $path);
+ }
+
+ public function get_cookie(/*string*/ $name) {
+ $full_name = COOKIE_PREFIX."_".$name;
+ if(isset($_COOKIE[$full_name])) {
+ return $_COOKIE[$full_name];
+ }
+ else {
+ return null;
+ }
+ }
+
/**
* Get all the HTML headers that are currently set and return as a string.
* @return string
@@ -228,7 +256,12 @@ class Page {
header("X-Powered-By: SCore-".SCORE_VERSION);
if (!headers_sent()) {
- foreach($this->http_headers as $head){ header($head); }
+ foreach($this->http_headers as $head) {
+ header($head);
+ }
+ foreach($this->cookies as $c) {
+ setcookie($c[0], $c[1], $c[2], $c[3]);
+ }
} else {
print "Error: Headers have already been sent to the client.";
}
@@ -252,6 +285,9 @@ class Page {
# header("Cache-control: no-cache");
# header('Expires: ' . gmdate('D, d M Y H:i:s', time() - 600) . ' GMT');
#}
+ if($this->get_cookie("flash_message")) {
+ $this->add_cookie("flash_message", "", -1, "/");
+ }
usort($this->blocks, "blockcmp");
$this->add_auto_html_headers();
$layout = new Layout();
diff --git a/core/util.inc.php b/core/util.inc.php
index 51cf99bb..2ad3d20c 100644
--- a/core/util.inc.php
+++ b/core/util.inc.php
@@ -777,35 +777,6 @@ function get_session_ip(Config $config) {
return $addr;
}
-/**
- * similar to $_COOKIE[$name], but $name has the site-wide cookie
- * prefix prepended to it, eg username -> shm_username, to prevent
- * conflicts from multiple installs within one domain.
- */
-function get_prefixed_cookie(/*string*/ $name) {
- $full_name = COOKIE_PREFIX."_".$name;
- if(isset($_COOKIE[$full_name])) {
- return $_COOKIE[$full_name];
- }
- else {
- return null;
- }
-}
-
-/**
- * The counterpart for get_prefixed_cookie, this works like php's
- * setcookie method, but prepends the site-wide cookie prefix to
- * the $name argument before doing anything.
- *
- * @param string $name
- * @param string $value
- * @param int $time
- * @param string $path
- */
-function set_prefixed_cookie($name, $value, $time, $path) {
- $full_name = COOKIE_PREFIX."_".$name;
- setcookie($full_name, $value, $time, $path);
-}
/**
* Set (or extend) a flash-message cookie.
@@ -820,13 +791,14 @@ function set_prefixed_cookie($name, $value, $time, $path) {
* @param string $type
*/
function flash_message(/*string*/ $text, /*string*/ $type="info") {
- $current = get_prefixed_cookie("flash_message");
+ global $page;
+ $current = $page->get_cookie("flash_message");
if($current) {
$text = $current . "\n" . $text;
}
# the message should be viewed pretty much immediately,
# so 60s timeout should be more than enough
- set_prefixed_cookie("flash_message", $text, time()+60, "/");
+ $page->add_cookie("flash_message", $text, time()+60, "/");
}
/**
@@ -1628,10 +1600,10 @@ function _decaret($str) {
* @return User
*/
function _get_user() {
- global $config;
+ global $config, $page;
$user = null;
- if(get_prefixed_cookie("user") && get_prefixed_cookie("session")) {
- $tmp_user = User::by_session(get_prefixed_cookie("user"), get_prefixed_cookie("session"));
+ if($page->get_cookie("user") && $page->get_cookie("session")) {
+ $tmp_user = User::by_session($page->get_cookie("user"), $page->get_cookie("session"));
if(!is_null($tmp_user)) {
$user = $tmp_user;
}
diff --git a/ext/comment/main.php b/ext/comment/main.php
index 70c7712a..a8fd4f8d 100644
--- a/ext/comment/main.php
+++ b/ext/comment/main.php
@@ -562,7 +562,7 @@ class CommentList extends Extension {
* @throws CommentPostingException
*/
private function add_comment_wrapper(/*int*/ $image_id, User $user, /*string*/ $comment) {
- global $database, $config;
+ global $database, $config, $page;
if(!$user->can("bypass_comment_checks")) {
// will raise an exception if anything is wrong
@@ -571,7 +571,7 @@ class CommentList extends Extension {
// all checks passed
if($user->is_anonymous()) {
- set_prefixed_cookie("nocache", "Anonymous Commenter", time()+60*60*24, "/");
+ $page->add_cookie("nocache", "Anonymous Commenter", time()+60*60*24, "/");
}
$database->Execute(
"INSERT INTO comments(image_id, owner_id, owner_ip, posted, comment) ".
@@ -585,7 +585,7 @@ class CommentList extends Extension {
}
private function comment_checks(/*int*/ $image_id, User $user, /*string*/ $comment) {
- global $config;
+ global $config, $page;
// basic sanity checks
if(!$user->can("create_comment")) {
@@ -606,7 +606,7 @@ class CommentList extends Extension {
throw new CommentPostingException("Comment too repetitive~");
}
else if($user->is_anonymous() && !$this->hash_match()) {
- set_prefixed_cookie("nocache", "Anonymous Commenter", time()+60*60*24, "/");
+ $page->add_cookie("nocache", "Anonymous Commenter", time()+60*60*24, "/");
throw new CommentPostingException(
"Comment submission form is out of date; refresh the ".
"comment form to show you aren't a spammer~");
diff --git a/ext/pools/main.php b/ext/pools/main.php
index 08105b61..bc190ae7 100644
--- a/ext/pools/main.php
+++ b/ext/pools/main.php
@@ -392,7 +392,7 @@ class Pools extends Extension {
$order_by = "";
- $order = get_prefixed_cookie("ui-order-pool");
+ $order = $page->get_cookie("ui-order-pool");
if($order == "created" || is_null($order)){
$order_by = "ORDER BY p.date DESC";
}elseif($order == "updated"){
diff --git a/ext/user/main.php b/ext/user/main.php
index a0d87426..30862d48 100644
--- a/ext/user/main.php
+++ b/ext/user/main.php
@@ -165,11 +165,11 @@ class UserPage extends Extension {
$this->theme->display_user_list($page, User::by_list(0), $user);
}
else if($event->get_arg(0) == "logout") {
- set_prefixed_cookie("session", "", time()+60*60*24*$config->get_int('login_memory'), "/");
+ $page->add_cookie("session", "", time()+60*60*24*$config->get_int('login_memory'), "/");
if(CACHE_HTTP || SPEED_HAX) {
# to keep as few versions of content as possible,
# make cookies all-or-nothing
- set_prefixed_cookie("user", "", time()+60*60*24*$config->get_int('login_memory'), "/");
+ $page->add_cookie("user", "", time()+60*60*24*$config->get_int('login_memory'), "/");
}
log_info("user", "Logged out");
$page->set_mode("redirect");
@@ -476,14 +476,14 @@ class UserPage extends Extension {
* @param string $pass
*/
private function set_login_cookie(/*string*/ $name, /*string*/ $pass) {
- global $config;
+ global $config, $page;
$addr = get_session_ip($config);
$hash = User::by_name($name)->passhash;
- set_prefixed_cookie("user", $name,
+ $page->add_cookie("user", $name,
time()+60*60*24*365, '/');
- set_prefixed_cookie("session", md5($hash.$addr),
+ $page->add_cookie("session", md5($hash.$addr),
time()+60*60*24*$config->get_int('login_memory'), '/');
}
//}}}
diff --git a/themes/danbooru/layout.class.php b/themes/danbooru/layout.class.php
index 15ee6d6c..521ecf3c 100644
--- a/themes/danbooru/layout.class.php
+++ b/themes/danbooru/layout.class.php
@@ -189,11 +189,10 @@ class Layout {
$withleft = "noleft";
}
- $flash = get_prefixed_cookie("flash_message");
+ $flash = $page->get_cookie("flash_message");
$flash_html = "";
if($flash) {
$flash_html = "".nl2br(html_escape($flash))." [X]";
- set_prefixed_cookie("flash_message", "", -1, "/");
}
print <<get_cookie("flash_message");
$flash_html = "";
if($flash) {
$flash_html = "".nl2br(html_escape($flash))." [X]";
- set_prefixed_cookie("flash_message", "", -1, "/");
}
print <<get_cookie("flash_message");
$flash_html = "";
if($flash) {
$flash_html = "".nl2br(html_escape($flash))." [X]";
- set_prefixed_cookie("flash_message", "", -1, "/");
}
print <<get_cookie("flash_message");
$flash_html = "";
if($flash) {
$flash_html = "".nl2br(html_escape($flash))." [X]";
- set_prefixed_cookie("flash_message", "", -1, "/");
}
print <<{$main_block_html}";
}
- $flash = get_prefixed_cookie("flash_message");
+ $flash = $page->get_cookie("flash_message");
$flash_html = "";
if($flash) {
$flash_html = "".nl2br(html_escape($flash))." [X]";
- set_prefixed_cookie("flash_message", "", -1, "/");
}
print <<get_cookie("flash_message");
$flash_html = "";
if($flash) {
$flash_html = "".nl2br(html_escape($flash))." [X]";
- set_prefixed_cookie("flash_message", "", -1, "/");
}
print <<