]> git.mxchange.org Git - friendica.git/commitdiff
Moved "privacy_image_cache" into the core. Enabled by default, can be disabled in...
authorMichael Vogel <icarus@dabo.de>
Tue, 12 Aug 2014 22:13:13 +0000 (00:13 +0200)
committerMichael Vogel <icarus@dabo.de>
Tue, 12 Aug 2014 22:13:13 +0000 (00:13 +0200)
14 files changed:
include/api.php
include/bbcode.php
include/conversation.php
include/cronhooks.php
include/oembed.php
include/poller.php
include/text.php
mod/admin.php
mod/content.php
mod/directory.php
mod/ping.php
mod/proxy.php [new file with mode: 0644]
object/Item.php
view/templates/admin_site.tpl

index 7cc72948d184d0e7c96734fdccd8c94868ce1b64..b4b59068caf0ef4b9c96b5571ac4a7eb6c1ad30f 100644 (file)
 
                $a = get_app();
 
-               $result = q("SELECT `installed` FROM `addon` WHERE `name` = 'privacy_image_cache' AND `installed`");
-               $image_cache = (count($result) > 0);
-
                $include_entities = strtolower(x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:"false");
 
                if ($include_entities != "true") {
-                       if ($image_cache) {
-                               require_once("addon/privacy_image_cache/privacy_image_cache.php");
+                       require_once("mod/proxy.php");
 
-                               preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images);
+                       preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images);
 
-                               foreach ($images[1] AS $image) {
-                                       $replace = $a->get_baseurl()."/privacy_image_cache/".privacy_image_cache_cachename($image);
-                                       $text = str_replace($image, $replace, $text);
-                               }
+                       foreach ($images[1] AS $image) {
+                               $replace = proxy_url($image);
+                               $text = str_replace($image, $replace, $text);
                        }
                        return array();
                }
                                require_once("include/Photo.php");
                                $image = get_photo_info($url);
                                if ($image) {
-                                       // If privacy_image_cache is activated, then use the following sizes:
+                                       // If image cache is activated, then use the following sizes:
                                        // thumb  (150), small (340), medium (600) and large (1024)
-                                       if ($image_cache) {
-                                               require_once("addon/privacy_image_cache/privacy_image_cache.php");
-                                               $media_url = $a->get_baseurl()."/privacy_image_cache/".privacy_image_cache_cachename($url);
+                                       if (!get_config("system", "proxy_disabled")) {
+                                               require_once("mod/proxy.php");
+                                               $media_url = proxy_url($url);
 
                                                $sizes = array();
                                                $scale = scale_image($image[0], $image[1], 150);
index df2c7101bdf6f9a8a67051c7fbf9a116b47f7401..7cf8b71fe5a0e37a928651b220838908c5484ca7 100644 (file)
@@ -145,7 +145,7 @@ function bb_cleanup_share($shared, $plaintext, $nolink) {
        if (isset($bookmark[1][0]))
                $link = $bookmark[1][0];
 
-       if (strpos($shared[1],$title) !== false)
+       if (($title != "") AND (strpos($shared[1],$title) !== false))
                $title = "";
 
 //        if (strpos($shared[1],$link) !== false)
index 95792640e3b64484738c73401d40c27dc68a1397..558942063f9382e7e95c66b3749625b910510eb7 100644 (file)
@@ -370,6 +370,7 @@ if(!function_exists('conversation')) {
 function conversation(&$a, $items, $mode, $update, $preview = false) {
 
        require_once('include/bbcode.php');
+       require_once('mod/proxy.php');
 
        $ssl_state = ((local_user()) ? true : false);
 
@@ -656,7 +657,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                        'name' => $profile_name_e,
                                        'sparkle' => $sparkle,
                                        'lock' => $lock,
-                                       'thumb' => $profile_avatar,
+                                       'thumb' => proxy_url($profile_avatar),
                                        'title' => $item['title_e'],
                                        'body' => $body_e,
                                        'tags' => $tags_e,
@@ -675,7 +676,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                        'indent' => '',
                                        'owner_name' => $owner_name_e,
                                        'owner_url' => $owner_url,
-                                       'owner_photo' => $owner_photo,
+                                       'owner_photo' => proxy_url($owner_photo),
                                        'plink' => get_plink($item),
                                        'edpost' => false,
                                        'isstarred' => $isstarred,
index 031011ac365bd9cd604ff1193cd5d3dc8795a92e..c0549dfff8a54734e00444dbe9df6197ef3af504 100644 (file)
@@ -40,7 +40,7 @@ function cronhooks_run(&$argv, &$argc){
                $pidfile = new pidfile($lockpath, 'cronhooks');
                if($pidfile->is_already_running()) {
                        logger("cronhooks: Already running");
-                       if ($pidfile->running_time() > 9*60) {
+                       if ($pidfile->running_time() > 19*60) {
                                 $pidfile->kill();
                                 logger("cronhooks: killed stale process");
                                // Calling a new instance
index 29d462d8f7d2252629e1cd3fb75b6508b90c04f2..4a95bd8a45fe1212b419ca30149d0d6ddeda71fc 100755 (executable)
@@ -109,6 +109,8 @@ function oembed_fetch_url($embedurl, $no_rich_type = false){
 }
 
 function oembed_format_object($j){
+       require_once("mod/proxy.php");
+
        $a = get_app();
        $embedurl = $j->embedurl;
        $jhtml = oembed_iframe($j->embedurl,(isset($j->width) ? $j->width : null), (isset($j->height) ? $j->height : null) );
@@ -138,8 +140,8 @@ function oembed_format_object($j){
                        $ret.="<br>";
                }; break;
                case "photo": {
-                       $ret.= "<img width='".$j->width."' src='".$j->url."'>";
-                       //$ret.= "<img width='".$j->width."' height='".$j->height."' src='".$j->url."'>";
+                       $ret.= "<img width='".$j->width."' src='".proxy_url($j->url)."'>";
+                       //$ret.= "<img width='".$j->width."' height='".$j->height."' src='".proxy_url($j->url)."'>";
                        $ret.="<br>";
                }; break;
                case "link": {
index 46f1079fd11c74042fd372f83ab1f7b14d17f633..e94ab8746f5c1f3c7cf19af166c2ff1e7a240eaa 100644 (file)
@@ -134,6 +134,16 @@ function poller_run(&$argv, &$argc){
                // clear smarty cache
                clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled");
 
+               // clear cache for image proxy
+               if (!get_config("system", "proxy_disabled")) {
+                       clear_cache($a->get_basepath(), $a->get_basepath()."/proxy");
+
+                       $cachetime = get_config('system','proxy_cache_time');
+                       if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME;
+
+                       q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
+               }
+
                set_config('system','cache_last_cleared', time());
        }
 
index 26de709e3ea1d82d1f77c4cf6bd382ca95888c2b..c7d6f4d525231eb89b1a0c49b3e288fc3669514c 100644 (file)
@@ -1353,6 +1353,8 @@ function prepare_body(&$item,$attach = false, $preview = false) {
                $s = prepare_text($item['body']);
        }
 
+       require_once("mod/proxy.php");
+       $s = proxy_parse_html($s);
 
        $prep_arr = array('item' => $item, 'html' => $s, 'preview' => $preview);
        call_hooks('prepare_body', $prep_arr);
index a7e66876c05baba5205455a4481d4b09d0437dc5..55bbde34d595d245fa8cd959b6c30595325d8700 100644 (file)
@@ -361,6 +361,7 @@ function admin_page_site_post(&$a){
        $temppath               =       ((x($_POST,'temppath'))                 ? notags(trim($_POST['temppath']))              : '');
        $basepath               =       ((x($_POST,'basepath'))                 ? notags(trim($_POST['basepath']))              : '');
        $singleuser             =       ((x($_POST,'singleuser'))               ? notags(trim($_POST['singleuser']))            : '');
+       $proxy_disabled         =       ((x($_POST,'proxy_disabled'))           ? True                                          : False);
        if($ssl_policy != intval(get_config('system','ssl_policy'))) {
                if($ssl_policy == SSL_POLICY_FULL) {
                        q("update `contact` set
@@ -484,6 +485,7 @@ function admin_page_site_post(&$a){
        set_config('system','lockpath', $lockpath);
        set_config('system','temppath', $temppath);
        set_config('system','basepath', $basepath);
+       set_config('system','proxy_disabled', $proxy_disabled);
 
        info( t('Site settings updated.') . EOL);
        goaway($a->get_baseurl(true) . '/admin/site' );
@@ -642,6 +644,7 @@ function admin_page_site(&$a) {
                '$lockpath'             => array('lockpath', t("Path for lock file"), get_config('system','lockpath'), "The lock file is used to avoid multiple pollers at one time. Only define a folder here."),
                '$temppath'             => array('temppath', t("Temp path"), get_config('system','temppath'), "If you have a restricted system where the webserver can't access the system temp path, enter another path here."),
                '$basepath'             => array('basepath', t("Base path to installation"), get_config('system','basepath'), "If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot."),
+               '$proxy_disabled'       => array('proxy_disabled', t("Disable picture proxy"), get_config('system','proxy_disabled'), t("The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwith.")),
 
                '$relocate_url'     => array('relocate_url', t("New base url"), $a->get_baseurl(), "Change base url for this server. Sends relocate message to all DFRN contacts of all users."),
 
index fa32b576cd00a2d13046480ec32e17d43aa07327..1e44bf160c508e2e13f6e3078c7fa2d53eaa03a5 100644 (file)
@@ -307,8 +307,8 @@ function content_content(&$a, $update = 0) {
 
 function render_content(&$a, $items, $mode, $update, $preview = false) {
 
-
        require_once('include/bbcode.php');
+       require_once('mod/proxy.php');
 
        $ssl_state = ((local_user()) ? true : false);
 
@@ -361,8 +361,8 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
 
        $alike = array();
        $dlike = array();
-       
-       
+
+
        // array with html for each thread (parent+comments)
        $threads = array();
        $threadsid = -1;
@@ -412,7 +412,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
                                if($sp)
                                        $sparkle = ' sparkle';
                                else
-                                       $profile_link = zrl($profile_link);                                     
+                                       $profile_link = zrl($profile_link);
 
                                $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
                                if(($normalised != 'mailbox') && (x($a->contacts[$normalised])))
@@ -440,7 +440,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
 
                                $star = false;
                                $isstarred = "unstarred";
-                               
+
                                $lock = false;
                                $likebuttons = false;
                                $shareable = false;
@@ -463,7 +463,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
                                        $location_e = $location;
                                        $owner_name_e = $owner_name;
                                }
-                               
+
                                //$tmp_item = replace_macros($tpl,array(
                                $tmp_item = array(
                                        'template' => $tpl,
@@ -474,7 +474,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
                                        'name' => $name_e,
                                        'sparkle' => $sparkle,
                                        'lock' => $lock,
-                                       'thumb' => $profile_avatar,
+                                       'thumb' => proxy_url($profile_avatar),
                                        'title' => $title_e,
                                        'body' => $body_e,
                                        'text' => $text_e,
@@ -483,7 +483,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
                                        'indent' => '',
                                        'owner_name' => $owner_name_e,
                                        'owner_url' => $owner_url,
-                                       'owner_photo' => $owner_photo,
+                                       'owner_photo' => proxy_url($owner_photo),
                                        'plink' => get_plink($item),
                                        'edpost' => false,
                                        'isstarred' => $isstarred,
@@ -591,7 +591,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
                                        $comments_seen ++;
                                        $comment_lastcollapsed  = false;
                                        $comment_firstcollapsed = false;
-                               }       
+                               }
 
                                $override_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false);
                                $show_comment_box = ((($page_writeable) && ($item_writeable) && ($comments_seen == $comments[$item['parent']])) ? true : false);
@@ -783,7 +783,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
                                if($sp)
                                        $sparkle = ' sparkle';
                                else
-                                       $profile_link = zrl($profile_link);                                     
+                                       $profile_link = zrl($profile_link);
 
                                $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
                                if(($normalised != 'mailbox') && (x($a->contacts,$normalised)))
@@ -843,7 +843,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
                                        'comment_lastcollapsed' => $comment_lastcollapsed,
                                        // template to use to render item (wall, walltowall, search)
                                        'template' => $template,
-                                       
+
                                        'type' => implode("",array_slice(explode("/",$item['verb']),-1)),
                                        'tags' => $tags,
                                        'body' => $body_e,
@@ -857,7 +857,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
                                        'profile_url' => $profile_link,
                                        'item_photo_menu' => item_photo_menu($item),
                                        'name' => $name_e,
-                                       'thumb' => $profile_avatar,
+                                       'thumb' => proxy_url($profile_avatar),
                                        'osparkle' => $osparkle,
                                        'sparkle' => $sparkle,
                                        'title' => $title_e,
@@ -867,7 +867,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
                                        'indent' => $indent,
                                        'shiny' => $shiny,
                                        'owner_url' => $owner_url,
-                                       'owner_photo' => $owner_photo,
+                                       'owner_photo' => proxy_url($owner_photo),
                                        'owner_name' => $owner_name_e,
                                        'plink' => get_plink($item),
                                        'edpost' => $edpost,
index 3e138570cbf84688f489d6dcd4addc010c691225..7fab53b6807cadd363da70227b1f3c3a6679e5aa 100644 (file)
@@ -27,6 +27,8 @@ function directory_post(&$a) {
 
 function directory_content(&$a) {
 
+       require_once("mod/proxy.php");
+
        if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
                notice( t('Public access denied.') . EOL);
                return;
@@ -90,7 +92,7 @@ function directory_content(&$a) {
 
 
                        $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
-               
+
                        $pdesc = (($rr['pdesc']) ? $rr['pdesc'] . '<br />' : '');
 
                        $details = '';
@@ -140,7 +142,7 @@ function directory_content(&$a) {
                        $homepage = ((x($profile,'homepage') == 1) ?  t('Homepage:') : False);
 
                        $about = ((x($profile,'about') == 1) ?  t('About:') : False);
-                       
+
                        $tpl = get_markup_template('directory_item.tpl');
 
                        if($a->theme['template_engine'] === 'internal') {
@@ -153,7 +155,7 @@ function directory_content(&$a) {
                        $entry = replace_macros($tpl,array(
                                '$id' => $rr['id'],
                                '$profile_link' => $profile_link,
-                               '$photo' => $a->get_cached_avatar_image($rr[$photo]),
+                               '$photo' => proxy_url($a->get_cached_avatar_image($rr[$photo])),
                                '$alt_text' => $rr['name'],
                                '$name' => $rr['name'],
                                '$details' => $pdesc . $details,
@@ -171,7 +173,7 @@ function directory_content(&$a) {
                        $arr = array('contact' => $rr, 'entry' => $entry);
 
                        call_hooks('directory_item', $arr);
-                       
+
                        unset($profile);
                        unset($location);
 
index 21154f9ffeb6805f34d65e771e3cc2e32cd14bb4..405edd3c49dedba39dee250112459c8db8c9326b 100644 (file)
@@ -188,6 +188,8 @@ function ping_init(&$a) {
 
 
                function xmlize($href, $name, $url, $photo, $date, $seen, $message){
+                       require_once("mod/proxy.php");
+                       $photo = proxy_url($photo);
                        $data = array('href' => &$href, 'name' => &$name, 'url'=>&$url, 'photo'=>&$photo, 'date'=>&$date, 'seen'=>&$seen, 'messsage'=>&$message);
                        call_hooks('ping_xmlize', $data);
                        $notsxml = '<note href="%s" name="%s" url="%s" photo="%s" date="%s" seen="%s" >%s</note>';
diff --git a/mod/proxy.php b/mod/proxy.php
new file mode 100644 (file)
index 0000000..77515bb
--- /dev/null
@@ -0,0 +1,307 @@
+<?php
+// Based upon "Privacy Image Cache" by Tobias Hößl <https://github.com/CatoTH/>
+
+define("PROXY_DEFAULT_TIME", 86400); // 1 Day
+
+require_once('include/security.php');
+require_once("include/Photo.php");
+
+function proxy_init() {
+       global $a, $_SERVER;
+
+       // Pictures are stored in one of the following ways:
+       // 1. If a folder "proxy" exists and is writeable, then use this for caching
+       // 2. If a cache path is defined, use this
+       // 3. If everything else failed, cache into the database
+       //
+       // Question: Do we really need these three methods?
+
+       if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
+               header('HTTP/1.1 304 Not Modified');
+               header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT");
+               header('Etag: '.$_SERVER['HTTP_IF_NONE_MATCH']);
+               header("Expires: " . gmdate("D, d M Y H:i:s", time() + (31536000)) . " GMT");
+               header("Cache-Control: max-age=31536000");
+               if(function_exists('header_remove')) {
+                       header_remove('Last-Modified');
+                       header_remove('Expires');
+                       header_remove('Cache-Control');
+               }
+               exit;
+       }
+
+       if(function_exists('header_remove')) {
+               header_remove('Pragma');
+               header_remove('pragma');
+       }
+
+       $thumb = false;
+       $size = 1024;
+
+       // If the cache path isn't there, try to create it
+       if (!is_dir($_SERVER["DOCUMENT_ROOT"]."/proxy"))
+               if (is_writable($_SERVER["DOCUMENT_ROOT"]))
+                       mkdir($_SERVER["DOCUMENT_ROOT"]."/proxy");
+
+       // Checking if caching into a folder in the webroot is activated and working
+       $direct_cache = (is_dir($_SERVER["DOCUMENT_ROOT"]."/proxy") AND is_writable($_SERVER["DOCUMENT_ROOT"]."/proxy"));
+
+       // Look for filename in the arguments
+       if (isset($a->argv[1]) OR isset($a->argv[2]) OR isset($a->argv[3])) {
+               if (isset($a->argv[3]))
+                       $url = $a->argv[3];
+               elseif (isset($a->argv[2]))
+                       $url = $a->argv[2];
+               else
+                       $url = $a->argv[1];
+
+               if (isset($a->argv[3]) and ($a->argv[3] == "thumb"))
+                       $size = 200;
+
+               // thumb, small, medium and large.
+               if (substr($url, -6) == ":thumb")
+                       $size = 150;
+               if (substr($url, -6) == ":small")
+                       $size = 340;
+               if (substr($url, -7) == ":medium")
+                       $size = 600;
+               if (substr($url, -6) == ":large")
+                       $size = 1024;
+
+               $pos = strrpos($url, "=.");
+               if ($pos)
+                       $url = substr($url, 0, $pos+1);
+
+               $url = str_replace(array(".jpg", ".jpeg", ".gif", ".png"), array("","","",""), $url);
+
+               $url = base64_decode(strtr($url, '-_', '+/'), true);
+
+               if ($url)
+                       $_REQUEST['url'] = $url;
+       }
+
+       if (!$direct_cache) {
+               $urlhash = 'pic:' . sha1($_REQUEST['url']);
+
+               $cachefile = get_cachefile(hash("md5", $_REQUEST['url']));
+               if ($cachefile != '') {
+                       if (file_exists($cachefile)) {
+                               $img_str = file_get_contents($cachefile);
+                               $mime = image_type_to_mime_type(exif_imagetype($cachefile));
+
+                               header("Content-type: $mime");
+                               header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT");
+                               header('Etag: "'.md5($img_str).'"');
+                               header("Expires: " . gmdate("D, d M Y H:i:s", time() + (31536000)) . " GMT");
+                               header("Cache-Control: max-age=31536000");
+
+                               // reduce quality - if it isn't a GIF
+                               if ($mime != "image/gif") {
+                                       $img = new Photo($img_str, $mime);
+                                       if($img->is_valid()) {
+                                               $img_str = $img->imageString();
+                                       }
+                               }
+
+                               echo $img_str;
+                               killme();
+                       }
+               }
+       } else
+               $cachefile = "";
+
+       $valid = true;
+
+       if (!$direct_cache AND ($cachefile == "")) {
+               $r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $urlhash);
+               if (count($r)) {
+                       $img_str = $r[0]['data'];
+                       $mime = $r[0]["desc"];
+                       if ($mime == "") $mime = "image/jpeg";
+               }
+       } else
+               $r = array();
+
+       if (!count($r)) {
+               // It shouldn't happen but it does - spaces in URL
+               $_REQUEST['url'] = str_replace(" ", "+", $_REQUEST['url']);
+               $redirects = 0;
+               $img_str = fetch_url($_REQUEST['url'],true, $redirects, 10);
+
+               $tempfile = tempnam(get_temppath(), "cache");
+               file_put_contents($tempfile, $img_str);
+               $mime = image_type_to_mime_type(exif_imagetype($tempfile));
+               unlink($tempfile);
+
+               // If there is an error then return a blank image
+               if ((substr($a->get_curl_code(), 0, 1) == "4") or (!$img_str)) {
+                       $img_str = file_get_contents("images/blank.png");
+                       $mime = "image/png";
+                       $cachefile = ""; // Clear the cachefile so that the dummy isn't stored
+                       $valid = false;
+                       $img = new Photo($img_str, "image/png");
+                       if($img->is_valid()) {
+                               $img->scaleImage(10);
+                               $img_str = $img->imageString();
+                       }
+               } else if (($mime != "image/jpeg") AND !$direct_cache AND ($cachefile == "")) {
+                       $image = @imagecreatefromstring($img_str);
+
+                       if($image === FALSE) die();
+
+                       q("INSERT INTO `photo`
+                       ( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `desc`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
+                       VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' )",
+                               0, 0, get_guid(), dbesc($urlhash),
+                               dbesc(datetime_convert()),
+                               dbesc(datetime_convert()),
+                               dbesc(basename(dbesc($_REQUEST["url"]))),
+                               dbesc(''),
+                               intval(imagesy($image)),
+                               intval(imagesx($image)),
+                               $mime,
+                               dbesc($img_str),
+                               100,
+                               intval(0),
+                               dbesc(''), dbesc(''), dbesc(''), dbesc('')
+                       );
+
+               } else {
+                       $img = new Photo($img_str, $mime);
+                       if($img->is_valid()) {
+                               if (!$direct_cache AND ($cachefile == ""))
+                                       $img->store(0, 0, $urlhash, $_REQUEST['url'], '', 100);
+                       }
+               }
+       }
+
+       // reduce quality - if it isn't a GIF
+       if ($mime != "image/gif") {
+               $img = new Photo($img_str, $mime);
+               if($img->is_valid()) {
+                       $img->scaleImage($size);
+                       $img_str = $img->imageString();
+               }
+       }
+
+       // If there is a real existing directory then put the cache file there
+       // advantage: real file access is really fast
+       // Otherwise write in cachefile
+       if ($valid AND $direct_cache)
+               file_put_contents($_SERVER["DOCUMENT_ROOT"]."/proxy/".proxy_url($_REQUEST['url'], true), $img_str);
+       elseif ($cachefile != '')
+               file_put_contents($cachefile, $img_str);
+
+       header("Content-type: $mime");
+
+       // Only output the cache headers when the file is valid
+       if ($valid) {
+               header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT");
+               header('Etag: "'.md5($img_str).'"');
+               header("Expires: " . gmdate("D, d M Y H:i:s", time() + (31536000)) . " GMT");
+               header("Cache-Control: max-age=31536000");
+       }
+
+       echo $img_str;
+
+       killme();
+}
+
+function proxy_url($url, $writemode = false) {
+       global $_SERVER;
+
+       // Only continue if it isn't a local image and the isn't deactivated
+       if (get_config("system", "proxy_disabled") OR proxy_is_local_image($url))
+               return($url);
+
+       $a = get_app();
+
+       // Creating a sub directory to reduce the amount of files in the cache directory
+       $basepath = $_SERVER["DOCUMENT_ROOT"]."/proxy";
+
+       $path = substr(hash("md5", $url), 0, 2);
+
+       if (is_dir($basepath) and $writemode)
+               if (!is_dir($basepath."/".$path)) {
+                       mkdir($basepath."/".$path);
+                       chmod($basepath."/".$path, 0777);
+               }
+
+       $path .= "/".strtr(base64_encode($url), '+/', '-_');
+
+       // Checking for valid extensions. Only add them if they are safe
+       $pos = strrpos($url, ".");
+       if ($pos) {
+               $extension = strtolower(substr($url, $pos+1));
+               $pos = strpos($extension, "?");
+               if ($pos)
+                       $extension = substr($extension, 0, $pos);
+       }
+
+       $extensions = array("jpg", "jpeg", "gif", "png");
+
+       if (in_array($extension, $extensions))
+               $path .= ".".$extension;
+
+       $proxypath = $a->get_baseurl()."/proxy/".$path;
+
+       // Too long files aren't supported by Apache
+       if (strlen($proxypath) > 250)
+               return ($url);
+       elseif ($writemode)
+               return ($path);
+       else
+               return ($proxypath);
+}
+
+/**
+ * @param $url string
+ * @return boolean
+ */
+function proxy_is_local_image($url) {
+       if ($url[0] == '/') return true;
+
+       if (strtolower(substr($url, 0, 5)) == "data:") return true;
+
+       // links normalised - bug #431
+       $baseurl = normalise_link(get_app()->get_baseurl());
+       $url = normalise_link($url);
+       return (substr($url, 0, strlen($baseurl)) == $baseurl);
+}
+
+function proxy_parse_query($var) {
+        /**
+         *  Use this function to parse out the query array element from
+         *  the output of parse_url().
+        */
+        $var  = parse_url($var, PHP_URL_QUERY);
+        $var  = html_entity_decode($var);
+        $var  = explode('&', $var);
+        $arr  = array();
+
+        foreach($var as $val) {
+                $x          = explode('=', $val);
+                $arr[$x[0]] = $x[1];
+        }
+
+        unset($val, $x, $var);
+        return $arr;
+}
+
+function proxy_img_cb($matches) {
+
+       // if the picture seems to be from another picture cache then take the original source
+       $queryvar = proxy_parse_query($matches[2]);
+       if (($queryvar['url'] != "") AND (substr($queryvar['url'], 0, 4) == "http"))
+               $matches[2] = urldecode($queryvar['url']);
+
+       // following line changed per bug #431
+       if (proxy_is_local_image($matches[2]))
+               return $matches[1] . $matches[2] . $matches[3];
+
+       return $matches[1].proxy_url(htmlspecialchars_decode($matches[2])).$matches[3];
+}
+
+function proxy_parse_html($html) {
+       return preg_replace_callback("/(<img [^>]*src *= *[\"'])([^\"']+)([\"'][^>]*>)/siU", "proxy_img_cb", $html);
+}
index 7c78a1d333ef9391ef97579df6bd42dd5c45bb78..246fecc189a15a260375105c8e992281cb9878cc 100644 (file)
@@ -81,6 +81,8 @@ class Item extends BaseObject {
         *      _ false on failure
         */
        public function get_template_data($alike, $dlike, $thread_level=1) {
+               require_once("mod/proxy.php");
+
                $result = array();
 
                $a = $this->get_app();
@@ -314,7 +316,7 @@ class Item extends BaseObject {
                        'profile_url' => $profile_link,
                        'item_photo_menu' => item_photo_menu($item),
                        'name' => $name_e,
-                       'thumb' => $profile_avatar,
+                       'thumb' => proxy_url($profile_avatar),
                        'osparkle' => $osparkle,
                        'sparkle' => $sparkle,
                        'title' => $title_e,
@@ -327,7 +329,7 @@ class Item extends BaseObject {
                        'indent' => $indent,
                        'shiny' => $shiny,
                        'owner_url' => $this->get_owner_url(),
-                       'owner_photo' => $this->get_owner_photo(),
+                       'owner_photo' => proxy_url($this->get_owner_photo()),
                        'owner_name' => $owner_name_e,
                        'plink' => get_plink($item),
                        'edpost'    => ((feature_enabled($conv->get_profile_owner(),'edit_posts')) ? $edpost : ''),
@@ -687,7 +689,7 @@ class Item extends BaseObject {
                $a = $this->get_app();
                $conv = $this->get_conversation();
                $this->wall_to_wall = false;
-               
+
                if($this->is_toplevel()) {
                        if( (! $this->get_data_value('self')) && ($conv->get_mode() !== 'profile')) {
                                if($this->get_data_value('wall')) {
index 835b027fe8ab30b0a66b07e8212710132b4570ad..5303ac48150947ab5688f321cce5c4153212e888 100644 (file)
        {{include file="field_input.tpl" field=$itemcache}}
        {{include file="field_input.tpl" field=$itemcache_duration}}
        {{include file="field_input.tpl" field=$max_comments}}
+       {{include file="field_checkbox.tpl" field=$proxy_disabled}}
        <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
 
        </form>