Do not let caches keep queued or hidden images.
This commit is contained in:
+6
-1
@@ -59,7 +59,8 @@ function display_img($id) {
|
|||||||
$hidden = $is_admin ? "" : " AND hidden IS NOT TRUE";
|
$hidden = $is_admin ? "" : " AND hidden IS NOT TRUE";
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = "SELECT img, mime FROM $table WHERE 1 AND ID = ?".$hidden." LIMIT 0, 1";
|
$columns = $queue ? "img, mime" : "img, mime, hidden";
|
||||||
|
$query = "SELECT $columns FROM $table WHERE 1 AND ID = ?".$hidden." LIMIT 0, 1";
|
||||||
$result = $db->execute_query($query, array((int)$id)) or db_fail();
|
$result = $db->execute_query($query, array((int)$id)) or db_fail();
|
||||||
|
|
||||||
$row = $result->fetch_assoc();
|
$row = $result->fetch_assoc();
|
||||||
@@ -78,6 +79,10 @@ function display_img($id) {
|
|||||||
header("Content-type: ".$info['mime']);
|
header("Content-type: ".$info['mime']);
|
||||||
header("Content-length: ".strlen($img_data));
|
header("Content-length: ".strlen($img_data));
|
||||||
header("X-Content-Type-Options: nosniff");
|
header("X-Content-Type-Options: nosniff");
|
||||||
|
// Only this session can see a queued or hidden image: no cache may keep it
|
||||||
|
if ($queue || !empty($row['hidden'])) {
|
||||||
|
header("Cache-Control: private, no-store");
|
||||||
|
}
|
||||||
print $img_data;
|
print $img_data;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -84,6 +84,13 @@ class FeedAndImageTest extends PageTestCase {
|
|||||||
$this->assertSame(200, $this->get('/display?id=9&queue=1')['status']);
|
$this->assertSame(200, $this->get('/display?id=9&queue=1')['status']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testRestrictedImagesAreNotCached(): void {
|
||||||
|
$this->assertNull($this->header($this->get('/display?id=2'), 'Cache-Control'));
|
||||||
|
$this->loginAs();
|
||||||
|
$this->assertSame('private, no-store', $this->header($this->get('/display?id=3'), 'Cache-Control'));
|
||||||
|
$this->assertSame('private, no-store', $this->header($this->get('/display?id=9&queue=1'), 'Cache-Control'));
|
||||||
|
}
|
||||||
|
|
||||||
public function testThePendingUploadIsShownToItsSession(): void {
|
public function testThePendingUploadIsShownToItsSession(): void {
|
||||||
$name = bin2hex(random_bytes(16));
|
$name = bin2hex(random_bytes(16));
|
||||||
mkdir(self::$state . '/tmp/uploads', 0700);
|
mkdir(self::$state . '/tmp/uploads', 0700);
|
||||||
|
|||||||
@@ -30,9 +30,10 @@ class SiteData {
|
|||||||
$dates = array_column(self::$tables['xxx'], 'date');
|
$dates = array_column(self::$tables['xxx'], 'date');
|
||||||
return array(array('MAX(`date`)' => $dates ? max($dates) : NULL));
|
return array(array('MAX(`date`)' => $dates ? max($dates) : NULL));
|
||||||
});
|
});
|
||||||
FakeDb::on("/^SELECT img, mime FROM $stories\\b/i", function ($sql, $params) {
|
FakeDb::on("/^SELECT img, mime(, hidden)? FROM $stories\\b/i", function ($sql, $params) {
|
||||||
$rows = self::filterStories($sql, $params);
|
$rows = self::filterStories($sql, $params);
|
||||||
return array_map(function ($row) { return array('img' => $row['img'], 'mime' => $row['mime']); }, array_slice($rows, 0, 1));
|
$columns = str_starts_with($sql, 'SELECT img, mime, hidden') ? array('img', 'mime', 'hidden') : array('img', 'mime');
|
||||||
|
return array_map(function ($row) use ($columns) { return array_intersect_key($row, array_flip($columns)); }, array_slice($rows, 0, 1));
|
||||||
});
|
});
|
||||||
FakeDb::on("/^INSERT INTO $stories SET /", array(self::class, 'insertStory'));
|
FakeDb::on("/^INSERT INTO $stories SET /", array(self::class, 'insertStory'));
|
||||||
FakeDb::on("/^UPDATE $stories SET /", array(self::class, 'updateStory'));
|
FakeDb::on("/^UPDATE $stories SET /", array(self::class, 'updateStory'));
|
||||||
|
|||||||
Reference in New Issue
Block a user