From 46c5a97a204b6bff64b0e85cccf76b38d247862f Mon Sep 17 00:00:00 2001
From: Michael Vogel <icarus@dabo.de>
Date: Fri, 14 Dec 2012 22:47:30 +0100
Subject: [PATCH] New caching system for photos

---
 boot.php            | 15 ++++++++++++++-
 include/network.php |  3 +--
 include/poller.php  |  3 +++
 mod/photo.php       | 13 +++++++++++--
 4 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/boot.php b/boot.php
index 354c243203..9dacaaaec9 100644
--- a/boot.php
+++ b/boot.php
@@ -520,6 +520,19 @@ if(! class_exists('App')) {
 			$this->is_tablet = $mobile_detect->isTablet();
 		}
 
+		function get_basepath() {
+
+			$basepath = get_config("system", "basepath");
+
+			if ($basepath == "")
+				$basepath = $_SERVER["DOCUMENT_ROOT"];
+
+			if ($basepath == "")
+				$basepath = $_SERVER["PWD"];
+
+			return($basepath);
+		}
+
 		function get_baseurl($ssl = false) {
 
 			$scheme = $this->scheme;
@@ -1895,7 +1908,7 @@ function clear_cache($basepath = "", $path = "") {
 			$fullpath = $path."/".$file;
 			if ((filetype($fullpath) == "dir") and ($file != ".") and ($file != ".."))
 				clear_cache($basepath, $fullpath);
-			if ((filetype($fullpath) == "file") and filectime($fullpath) < (time() - $cachetime))
+			if ((filetype($fullpath) == "file") and (filectime($fullpath) < (time() - $cachetime)))
 				unlink($fullpath);
 		}
 		closedir($dh);
diff --git a/include/network.php b/include/network.php
index 599088a2da..5877dda41b 100644
--- a/include/network.php
+++ b/include/network.php
@@ -854,8 +854,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
 	}
 
 	// replace the special char encoding
-
-	$s = htmlspecialchars($s,ENT_QUOTES,'UTF-8');
+	$s = htmlspecialchars($s,ENT_NOQUOTES,'UTF-8');
 	return $s;
 }
 
diff --git a/include/poller.php b/include/poller.php
index 6f2eeed822..4eb5e8a2b9 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -105,6 +105,9 @@ function poller_run(&$argv, &$argc){
 	// clear old item cache files
 	clear_cache();
 
+	// clear cache for photos
+	clear_cache($a->get_basepath(), $a->get_basepath()."/photo");
+
 	$manual_id  = 0;
 	$generation = 0;
 	$hub_update = false;
diff --git a/mod/photo.php b/mod/photo.php
index e37b927385..93db82a641 100644
--- a/mod/photo.php
+++ b/mod/photo.php
@@ -7,6 +7,7 @@ function photo_init(&$a) {
 	global $_SERVER;
 
 	$prvcachecontrol = false;
+	$file = "";
 
 	switch($a->argc) {
 		case 4:
@@ -20,6 +21,7 @@ function photo_init(&$a) {
 			break;
 		case 2:
 			$photo = $a->argv[1];
+			$file = $photo;
 			break;
 		case 1:
 		default:
@@ -42,7 +44,6 @@ function photo_init(&$a) {
 		exit;
 	}
 
-
 	$default = 'images/person-175.jpg';
 
 	if(isset($type)) {
@@ -94,7 +95,7 @@ function photo_init(&$a) {
 		foreach( Photo::supportedTypes() as $m=>$e){
 			$photo = str_replace(".$e",'',$photo);
 		}
-	
+
 		if(substr($photo,-2,1) == '-') {
 			$resolution = intval(substr($photo,-1,1));
 			$photo = substr($photo,0,-2);
@@ -115,6 +116,8 @@ function photo_init(&$a) {
 				intval($resolution)
 			);
 
+			$public = ($r[0]['allow_cid'] == '') AND ($r[0]['allow_gid'] == '') AND ($r[0]['deny_cid']  == '') AND ($r[0]['deny_gid']  == '');
+
 			if(count($r)) {
 				$data = $r[0]['data'];
 				$mimetype = $r[0]['type'];
@@ -198,6 +201,12 @@ function photo_init(&$a) {
 		header("Cache-Control: max-age=31536000");
 	}
 	echo $data;
+
+	// If the photo is public and there is an existing photo directory store the photo there
+	if ($public and ($file != ""))
+		if (is_dir($_SERVER["DOCUMENT_ROOT"]."/photo"))
+			file_put_contents($_SERVER["DOCUMENT_ROOT"]."/photo/".$file, $data);
+
 	killme();
 	// NOTREACHED
 }