From c5418789c967aacc42782461fdf0b6ea345f95fb Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 15 Dec 2012 11:27:26 +0100 Subject: [PATCH 1/3] privacy_image_cache: Optionally the cached images can now be stored in the webroot to improve performance. --- privacy_image_cache/privacy_image_cache.php | 113 +++++++++++++++----- 1 file changed, 85 insertions(+), 28 deletions(-) diff --git a/privacy_image_cache/privacy_image_cache.php b/privacy_image_cache/privacy_image_cache.php index 47299007..a47f0e1a 100644 --- a/privacy_image_cache/privacy_image_cache.php +++ b/privacy_image_cache/privacy_image_cache.php @@ -30,7 +30,6 @@ function privacy_image_cache_uninstall() { function privacy_image_cache_module() {} - function privacy_image_cache_init() { global $a, $_SERVER; @@ -48,14 +47,34 @@ function privacy_image_cache_init() { exit; } - if ($a->config["system"]["db_log"] != "") - $stamp1 = microtime(true); + //if ($a->config["system"]["db_log"] != "") + // $stamp1 = microtime(true); if(function_exists('header_remove')) { header_remove('Pragma'); header_remove('pragma'); } + $thumb = false; + + // Look for filename in the arguments + if (isset($a->argv[1]) OR isset($a->argv[2])) { + if (isset($a->argv[2])) + $url = $a->argv[2]; + else + $url = $a->argv[1]; + + $pos = strrpos($url, "==."); + if ($pos) + $url = substr($url, 0, $pos+2); + + $url = base64_decode(strtr($url, '-_', '+/'), true); + if ($url) + $_REQUEST['url'] = $url; + + $thumb = (isset($a->argv[3]) and ($a->argv[3] == "thumb")); + } + $urlhash = 'pic:' . sha1($_REQUEST['url']); // Double encoded url - happens with Diaspora $urlhash2 = 'pic:' . sha1(urldecode($_REQUEST['url'])); @@ -75,12 +94,12 @@ function privacy_image_cache_init() { echo $img_str; - if ($a->config["system"]["db_log"] != "") { - $stamp2 = microtime(true); - $duration = round($stamp2-$stamp1, 3); - if ($duration > $a->config["system"]["db_loglimit"]) - @file_put_contents($a->config["system"]["db_log"], $duration."\t".strlen($img_str)."\t".$_REQUEST['url']."\n", FILE_APPEND); - } + //if ($a->config["system"]["db_log"] != "") { + // $stamp2 = microtime(true); + // $duration = round($stamp2-$stamp1, 3); + // if ($duration > $a->config["system"]["db_loglimit"]) + // @file_put_contents($a->config["system"]["db_log"], $duration."\t".strlen($img_str)."\t".$_REQUEST['url']."\n", FILE_APPEND); + //} killme(); } @@ -88,6 +107,8 @@ function privacy_image_cache_init() { require_once("Photo.php"); + $valid = true; + $r = q("SELECT * FROM `photo` WHERE `resource-id` in ('%s', '%s') LIMIT 1", $urlhash, $urlhash2); if (count($r)) { $img_str = $r[0]['data']; @@ -110,6 +131,7 @@ function privacy_image_cache_init() { $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); if($img->is_valid()) { $img->scaleImage(1); @@ -142,36 +164,63 @@ function privacy_image_cache_init() { $img = new Photo($img_str); if($img->is_valid()) { $img->store(0, 0, $urlhash, $_REQUEST['url'], '', 100); - //$img->scaleImage(1000); // Test + if ($thumb) + $img->scaleImage(200); // Test $img_str = $img->imageString(); } $mime = "image/jpeg"; } } - // Writing in cachefile - // and (file_exists($cachefile)) and (exif_imagetype($cachefile) > 0)) - if ($cachefile != '') + + // 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 is_dir($_SERVER["DOCUMENT_ROOT"]."/privacy_image_cache")) + file_put_contents($_SERVER["DOCUMENT_ROOT"]."/privacy_image_cache/".privacy_image_cache_cachename($_REQUEST['url'], true), $img_str); + elseif ($cachefile != '') file_put_contents($cachefile, $img_str); 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"); + + // 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; - if ($a->config["system"]["db_log"] != "") { - $stamp2 = microtime(true); - $duration = round($stamp2-$stamp1, 3); - if ($duration > $a->config["system"]["db_loglimit"]) - @file_put_contents($a->config["system"]["db_log"], $duration."\t".strlen($img_str)."\t".$_REQUEST['url']."\n", FILE_APPEND); - } + //if ($a->config["system"]["db_log"] != "") { + // $stamp2 = microtime(true); + // $duration = round($stamp2-$stamp1, 3); + // if ($duration > $a->config["system"]["db_loglimit"]) + // @file_put_contents($a->config["system"]["db_log"], $duration."\t".strlen($img_str)."\t".$_REQUEST['url']."\n", FILE_APPEND); + //} killme(); } +function privacy_image_cache_cachename($url, $writemode = false) { + global $_SERVER; + + $basepath = $_SERVER["DOCUMENT_ROOT"]."/privacy_image_cache"; + + $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), '+/', '-_'); + + return($path); +} + /** * @param $url string * @return boolean @@ -195,7 +244,9 @@ function privacy_image_cache_img_cb($matches) { if (privacy_image_cache_is_local_image($matches[2])) return $matches[1] . $matches[2] . $matches[3]; - return $matches[1] . get_app()->get_baseurl() . "/privacy_image_cache/?url=" . addslashes(rawurlencode(htmlspecialchars_decode($matches[2]))) . $matches[3]; + //return $matches[1] . get_app()->get_baseurl() . "/privacy_image_cache/?url=" . addslashes(rawurlencode(htmlspecialchars_decode($matches[2]))) . $matches[3]; + + return $matches[1].get_app()->get_baseurl()."/privacy_image_cache/". privacy_image_cache_cachename(htmlspecialchars_decode($matches[2])).$matches[3]; } /** @@ -223,11 +274,14 @@ function privacy_image_cache_bbcode_hook(&$a, &$o) { function privacy_image_cache_display_item_hook(&$a, &$o) { if (isset($o["output"])) { if (isset($o["output"]["thumb"]) && !privacy_image_cache_is_local_image($o["output"]["thumb"])) - $o["output"]["thumb"] = $a->get_baseurl() . "/privacy_image_cache/?url=" . escape_tags(addslashes(rawurlencode($o["output"]["thumb"]))); + $o["output"]["thumb"] = $a->get_baseurl() . "/privacy_image_cache/".privacy_image_cache_cachename($o["output"]["thumb"]); + //$o["output"]["thumb"] = $a->get_baseurl() . "/privacy_image_cache/?url=" . escape_tags(addslashes(rawurlencode($o["output"]["thumb"]))); if (isset($o["output"]["author-avatar"]) && !privacy_image_cache_is_local_image($o["output"]["author-avatar"])) - $o["output"]["author-avatar"] = $a->get_baseurl() . "/privacy_image_cache/?url=" . escape_tags(addslashes(rawurlencode($o["output"]["author-avatar"]))); + $o["output"]["author-avatar"] = $a->get_baseurl() . "/privacy_image_cache/".privacy_image_cache_cachename($o["output"]["author-avatar"]); + //$o["output"]["author-avatar"] = $a->get_baseurl() . "/privacy_image_cache/?url=" . escape_tags(addslashes(rawurlencode($o["output"]["author-avatar"]))); if (isset($o["output"]["owner-avatar"]) && !privacy_image_cache_is_local_image($o["output"]["owner-avatar"])) - $o["output"]["owner-avatar"] = $a->get_baseurl() . "/privacy_image_cache/?url=" . escape_tags(addslashes(rawurlencode($o["output"]["owner-avatar"]))); + $o["output"]["owner-avatar"] = $a->get_baseurl() . "/privacy_image_cache/".privacy_image_cache_cachename($o["output"]["owner-avatar"]); + //$o["output"]["owner-avatar"] = $a->get_baseurl() . "/privacy_image_cache/?url=" . escape_tags(addslashes(rawurlencode($o["output"]["owner-avatar"]))); } } @@ -238,7 +292,8 @@ function privacy_image_cache_display_item_hook(&$a, &$o) { */ function privacy_image_cache_ping_xmlize_hook(&$a, &$o) { if ($o["photo"] != "" && !privacy_image_cache_is_local_image($o["photo"])) - $o["photo"] = $a->get_baseurl() . "/privacy_image_cache/?url=" . escape_tags(addslashes(rawurlencode($o["photo"]))); + $o["photo"] = $a->get_baseurl() . "/privacy_image_cache/".privacy_image_cache_cachename($o["photo"]); + //$o["photo"] = $a->get_baseurl() . "/privacy_image_cache/?url=" . escape_tags(addslashes(rawurlencode($o["photo"]))); } @@ -257,6 +312,8 @@ function privacy_image_cache_cron(&$a = null, &$b = null) { logger("Purging old Cache of the Privacy Image Cache", LOGGER_DEBUG); q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime); set_config('pi_cache', 'last_delete', $time); + + clear_cache($a->get_basepath(), $a->get_basepath()."/privacy_image_cache"); } From 0267222fb4a993aefde5c34a70941fe85d6c9eef Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Mon, 17 Dec 2012 03:04:13 +0100 Subject: [PATCH 2/3] Preparations for shared posts --- fbpost/fbpost.php | 29 ++++++++++++++++++++++++++++- fromgplus/fromgplus.php | 8 ++++++++ statusnet/statusnet.php | 5 ++++- twitter/twitter.php | 3 +++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index 76c5f672..dd8de039 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -345,10 +345,34 @@ function fbpost_jot_nets(&$a,&$b) { $fb_defpost = get_pconfig(local_user(),'facebook','post_by_default'); $selected = ((intval($fb_defpost) == 1) ? ' checked="checked" ' : ''); $b .= '
' - . t('Post to Facebook') . '
'; + . t('Post to Facebook') . ''; } } +function fbpost_ShareAttributes($match) { + + $attributes = $match[1]; + + $author = ""; + preg_match("/author='(.*?)'/ism", $attributes, $matches); + if ($matches[1] != "") + $author = $matches[1]; + + preg_match('/author="(.*?)"/ism', $attributes, $matches); + if ($matches[1] != "") + $author = $matches[1]; + + $headline = '
'; + + $headline .= sprintf(t('%s:'), $author); + + $headline .= "
"; + + $text = "
".$headline."
".$match[2]."
"; + + return($text); +} + /** * @param App $a @@ -562,6 +586,9 @@ function fbpost_post_hook(&$a,&$b) { $recycle = html_entity_decode("◌ ", ENT_QUOTES, 'UTF-8'); $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n\t$2:\t", $body); + // share element + $body = preg_replace_callback("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]/ism","fbpost_ShareAttributes", $body); + $bodyparts = explode("\t", $body); // Doesn't help with multiple repeats - the problem has to be solved later if (sizeof($bodyparts) == 3) { diff --git a/fromgplus/fromgplus.php b/fromgplus/fromgplus.php index d1fac25b..cc4cbb17 100644 --- a/fromgplus/fromgplus.php +++ b/fromgplus/fromgplus.php @@ -331,11 +331,19 @@ function fromgplus_fetch($a, $uid) { //$post .= html2bbcode("♻"); //$post .= fromgplus_html2bbcode("◌"); $post .= " [url=".$item->object->actor->url."]".$item->object->actor->displayName."[/url] \n"; + + /*$post .= "[share author='".$item->object->actor->displayName. + "' profile='".$item->object->actor->url. + "' avatar='".$item->object->actor->image->url. + "' link='".$item->object->url."']\n";*/ + $post .= fromgplus_html2bbcode($item->object->content); if (is_array($item->object->attachments)) $post .= "\n".trim(fromgplus_handleattachments($item)); + //$post .= "[/share]"; + if (isset($item->address)) $location = $item->address; else diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 09d01c4f..d7d490fd 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -435,6 +435,9 @@ function statusnet_shortenmsg($b, $max_char) { $recycle = html_entity_decode("◌ ", ENT_QUOTES, 'UTF-8'); $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body); + // remove the share element + $body = preg_replace("/\[share(.*?)\](.*?)\[\/share\]/ism","\n\n$2\n\n",$body); + // At first convert the text to html $html = bbcode($body, false, false); @@ -632,7 +635,7 @@ function statusnet_post_hook(&$a,&$b) { //$result = $dent->post('statuses/update', array('status' => $msg)); $result = $dent->post('statuses/update', $postdata); logger('statusnet_post send, result: ' . print_r($result, true). - "\nmessage: ".$msg, LOGGER_DEBUG."\nOriginal post: ".print_r($b)."\nPost Data: ".print_r($postdata)); + "\nmessage: ".$msg, LOGGER_DEBUG."\nOriginal post: ".print_r($b, true)."\nPost Data: ".print_r($postdata, true)); if ($result->error) { logger('Send to StatusNet failed: "' . $result->error . '"'); } diff --git a/twitter/twitter.php b/twitter/twitter.php index 6a93d9f1..ee3bd0fb 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -294,6 +294,9 @@ function twitter_shortenmsg($b) { $recycle = html_entity_decode("◌ ", ENT_QUOTES, 'UTF-8'); $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body); + // remove the share element + $body = preg_replace("/\[share(.*?)\](.*?)\[\/share\]/ism","\n\n$2\n\n",$body); + // At first convert the text to html $html = bbcode($body, false, false); From 2e049de238d725752e5d5b6b9a42490ecaacd233 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Mon, 17 Dec 2012 10:31:12 +0100 Subject: [PATCH 3/3] fbpost: Better handling of the "share" element --- fbpost/fbpost.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index dd8de039..4aeca96d 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -368,7 +368,8 @@ function fbpost_ShareAttributes($match) { $headline .= ""; - $text = "
".$headline."
".$match[2]."
"; + //$text = "
".$headline."
".$match[2]."
"; + $text = "\n\t".$match[2].":\t"; return($text); }