diff options
author | Simon L'nu <simon.lnu@gmail.com> | 2012-06-08 23:58:46 -0400 |
---|---|---|
committer | Simon L'nu <simon.lnu@gmail.com> | 2012-06-08 23:58:46 -0400 |
commit | 62e9047b8d1b7f3272213a6407db34c9cd1a2cbb (patch) | |
tree | ba25995ec05d1df8632731f0da341736d47ce526 /include | |
parent | 5bb4a5912b09f6c37e8543a6ff78949a2b5b8cd5 (diff) | |
parent | ea4515aca9318429a0b859eb8b45584b382928b3 (diff) | |
download | volse-hubzilla-62e9047b8d1b7f3272213a6407db34c9cd1a2cbb.tar.gz volse-hubzilla-62e9047b8d1b7f3272213a6407db34c9cd1a2cbb.tar.bz2 volse-hubzilla-62e9047b8d1b7f3272213a6407db34c9cd1a2cbb.zip |
Merge remote-tracking branch 'remotes/upstream/master'
* remotes/upstream/master: (21 commits)
more logging on pubsub callbacks
provide ability to autofriend ostatus accounts
ostatus hub subscription issues
better events-reminder theming
png support for embedded private photos
rev update
png support: update database.sql, fix some typos, fix tinymce image browser
Add support for PNG images with alpha
fix a random profile error message
events: fix select events query select events that starts before display start date and/or ends after display end date.
more logging on subscribe_to_hub
admin page untranslated strings, remove empty list element for update
A few corrections in German translations.
rev update
set minchars to 2 for PM lookups too
set minchars to 2 for contacts search
contacts search autocomplete
add email probe logging, limit typo check to main addon files and skip additional support files
rev update
named anchors on display page
...
Diffstat (limited to 'include')
-rw-r--r-- | include/Photo.php | 131 | ||||
-rw-r--r-- | include/Scrape.php | 3 | ||||
-rw-r--r-- | include/api.php | 18 | ||||
-rw-r--r-- | include/follow.php | 13 | ||||
-rwxr-xr-x | include/items.php | 24 | ||||
-rw-r--r-- | include/network.php | 5 | ||||
-rwxr-xr-x[-rw-r--r--] | include/oembed.php | 4 | ||||
-rw-r--r-- | include/onepoll.php | 3 | ||||
-rw-r--r-- | include/user.php | 8 |
9 files changed, 169 insertions, 40 deletions
diff --git a/include/Photo.php b/include/Photo.php index fce559999..f769a70a6 100644 --- a/include/Photo.php +++ b/include/Photo.php @@ -7,14 +7,34 @@ class Photo { private $width; private $height; private $valid; + private $type; + private $types; + + /** + * supported mimetypes and corresponding file extensions + */ + static function supportedTypes() { + $t = array(); + $t['image/jpeg'] ='jpg'; + if (imagetypes() & IMG_PNG) $t['image/png'] = 'png'; + return $t; + } + + public function __construct($data, $type="image/jpeg") { - public function __construct($data) { + $this->types = $this->supportedTypes(); + if (!array_key_exists($type,$this->types)){ + $type='image/jpeg'; + } $this->valid = false; + $this->type = $type; $this->image = @imagecreatefromstring($data); if($this->image !== FALSE) { $this->width = imagesx($this->image); $this->height = imagesy($this->image); $this->valid = true; + imagealphablending($this->image, false); + imagesavealpha($this->image, true); } } @@ -38,6 +58,13 @@ class Photo { public function getImage() { return $this->image; } + + public function getType() { + return $this->type; + } + public function getExt() { + return $this->types[$this->type]; + } public function scaleImage($max) { @@ -78,6 +105,9 @@ class Photo { $dest = imagecreatetruecolor( $dest_width, $dest_height ); + imagealphablending($dest, false); + imagesavealpha($dest, true); + if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height); if($this->image) imagedestroy($this->image); @@ -134,6 +164,9 @@ class Photo { $dest = imagecreatetruecolor( $dest_width, $dest_height ); + imagealphablending($dest, false); + imagesavealpha($dest, true); + if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height); if($this->image) imagedestroy($this->image); @@ -148,6 +181,9 @@ class Photo { public function scaleImageSquare($dim) { $dest = imagecreatetruecolor( $dim, $dim ); + imagealphablending($dest, false); + imagesavealpha($dest, true); + if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dim, $dim, $this->width, $this->height); if($this->image) imagedestroy($this->image); @@ -159,6 +195,9 @@ class Photo { public function cropImage($max,$x,$y,$w,$h) { $dest = imagecreatetruecolor( $max, $max ); + imagealphablending($dest, false); + imagesavealpha($dest, true); + if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha imagecopyresampled($dest, $this->image, 0, 0, $x, $y, $max, $max, $w, $h); if($this->image) imagedestroy($this->image); @@ -168,20 +207,38 @@ class Photo { } public function saveImage($path) { - $quality = get_config('system','jpeg_quality'); - if((! $quality) || ($quality > 100)) - $quality = JPEG_QUALITY; - imagejpeg($this->image,$path,$quality); + switch($this->type){ + case "image/png": + $quality = get_config('system','png_quality'); + if((! $quality) || ($quality > 9)) + $quality = PNG_QUALITY; + imagepng($this->image, $path, $quality); + break; + default: + $quality = get_config('system','jpeg_quality'); + if((! $quality) || ($quality > 100)) + $quality = JPEG_QUALITY; + imagejpeg($this->image,$path,$quality); + } + } public function imageString() { ob_start(); - - $quality = get_config('system','jpeg_quality'); - if((! $quality) || ($quality > 100)) - $quality = JPEG_QUALITY; - - imagejpeg($this->image,NULL,$quality); + switch($this->type){ + case "image/png": + $quality = get_config('system','png_quality'); + if((! $quality) || ($quality > 9)) + $quality = PNG_QUALITY; + imagepng($this->image,NULL, $quality); + break; + default: + $quality = get_config('system','jpeg_quality'); + if((! $quality) || ($quality > 100)) + $quality = JPEG_QUALITY; + + imagejpeg($this->image,NULL,$quality); + } $s = ob_get_contents(); ob_end_clean(); return $s; @@ -200,8 +257,8 @@ class Photo { $guid = get_guid(); $r = q("INSERT INTO `photo` - ( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` ) - VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )", + ( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` ) + VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )", intval($uid), intval($cid), dbesc($guid), @@ -209,6 +266,7 @@ class Photo { dbesc(datetime_convert()), dbesc(datetime_convert()), dbesc(basename($filename)), + dbesc($this->type), dbesc($album), intval($this->height), intval($this->width), @@ -230,6 +288,40 @@ class Photo { }} +/** + * Guess image mimetype from filename or from Content-Type header + * + * @arg $filename string Image filename + * @arg $fromcurl boolean Check Content-Type header from curl request + */ +function guess_image_type($filename, $fromcurl=false) { + logger('Photo: guess_image_type: '.$filename . ($fromcurl?' from curl headers':''), LOGGER_DEBUG); + $type = null; + if ($fromcurl) { + $a = get_app(); + $headers=array(); + $h = explode("\n",$a->get_curl_headers()); + foreach ($h as $l) { + list($k,$v) = array_map("trim", explode(":", trim($l), 2)); + $headers[$k] = $v; + } + if (array_key_exists('Content-Type', $headers)) + $type = $headers['Content-Type']; + } + if (is_null($type)){ + $ext = pathinfo($filename, PATHINFO_EXTENSION); + $types = Photo::supportedTypes(); + $type = "image/jpeg"; + foreach ($types as $m=>$e){ + if ($ext==$e) $type = $m; + } + + } + logger('Photo: guess_image_type: type='.$type, LOGGER_DEBUG); + return $type; + +} + function import_profile_photo($photo,$uid,$cid) { $a = get_app(); @@ -238,7 +330,12 @@ function import_profile_photo($photo,$uid,$cid) { $filename = basename($photo); $img_str = fetch_url($photo,true); - $img = new Photo($img_str); + + // guess mimetype from headers or filename + $type = guess_image_type($photo,true); + + + $img = new Photo($img_str, $type); if($img->is_valid()) { $img->scaleImageSquare(175); @@ -266,9 +363,9 @@ function import_profile_photo($photo,$uid,$cid) { - $photo = $a->get_baseurl() . '/photo/' . $hash . '-4.jpg'; - $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5.jpg'; - $micro = $a->get_baseurl() . '/photo/' . $hash . '-6.jpg'; + $photo = $a->get_baseurl() . '/photo/' . $hash . '-4.' . $img->getExt(); + $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5.' . $img->getExt(); + $micro = $a->get_baseurl() . '/photo/' . $hash . '-6.' . $img->getExt(); } else $photo_failure = true; diff --git a/include/Scrape.php b/include/Scrape.php index 227252600..ca8f6e83a 100644 --- a/include/Scrape.php +++ b/include/Scrape.php @@ -435,10 +435,13 @@ function probe_url($url, $mode = PROBE_NORMAL) { $password = ''; openssl_private_decrypt(hex2bin($r[0]['pass']),$password,$x[0]['prvkey']); $mbox = email_connect($mailbox,$r[0]['user'],$password); + if(! $mbox) + logger('probe_url: email_connect failed.'); unset($password); } if($mbox) { $msgs = email_poll($mbox,$orig_url); + logger('probe_url: searching ' . $orig_url . ', ' . count($msgs) . ' messages found.', LOGGER_DEBUG); if(count($msgs)) { $addr = $orig_url; $network = NETWORK_MAIL; diff --git a/include/api.php b/include/api.php index 5c17b35f5..9925b5766 100644 --- a/include/api.php +++ b/include/api.php @@ -898,7 +898,7 @@ // params $id = intval($a->argv[3]); - logger('API: api_statuses_repeat: '.$id); + logger('API: api_statuses_repeat: '.$id); //$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false); @@ -915,13 +915,15 @@ intval($id) ); - $_REQUEST['body'] = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8')."[url=".$r[0]['reply_url']."]".$r[0]['reply_author']."[/url] \n".$r[0]['body']; - $_REQUEST['profile_uid'] = local_user(); - $_REQUEST['type'] = 'wall'; - $_REQUEST['api_source'] = true; + if ($r[0]['body'] != "") { + $_REQUEST['body'] = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8')."[url=".$r[0]['reply_url']."]".$r[0]['reply_author']."[/url] \n".$r[0]['body']; + $_REQUEST['profile_uid'] = local_user(); + $_REQUEST['type'] = 'wall'; + $_REQUEST['api_source'] = true; - require_once('mod/item.php'); - item_post($a); + require_once('mod/item.php'); + item_post($a); + } if ($type == 'xml') $ok = "true"; @@ -943,7 +945,7 @@ // params $id = intval($a->argv[3]); - logger('API: api_statuses_destroy: '.$id); + logger('API: api_statuses_destroy: '.$id); require_once('include/items.php'); drop_item($id, false); diff --git a/include/follow.php b/include/follow.php index d92d7577d..22288a0da 100644 --- a/include/follow.php +++ b/include/follow.php @@ -94,6 +94,9 @@ function new_contact($uid,$url,$interactive = false) { } $writeable = ((($ret['network'] === NETWORK_OSTATUS) && ($ret['notify'])) ? 1 : 0); + + $subhub = (($ret['network'] === NETWORK_OSTATUS) ? true : false); + $hidden = (($ret['network'] === NETWORK_MAIL) ? 1 : 0); if($ret['network'] === NETWORK_MAIL) { @@ -116,8 +119,9 @@ function new_contact($uid,$url,$interactive = false) { if(count($r)) { // update contact if($r[0]['rel'] == CONTACT_IS_FOLLOWER || ($network === NETWORK_DIASPORA && $r[0]['rel'] == CONTACT_IS_SHARING)) { - q("UPDATE `contact` SET `rel` = %d , `readonly` = 0 WHERE `id` = %d AND `uid` = %d LIMIT 1", + q("UPDATE `contact` SET `rel` = %d , `subhub` = %d, `readonly` = 0 WHERE `id` = %d AND `uid` = %d LIMIT 1", intval(CONTACT_IS_FRIEND), + intval($subhub), intval($r[0]['id']), intval($uid) ); @@ -131,8 +135,8 @@ function new_contact($uid,$url,$interactive = false) { // create contact record $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`, - `writable`, `hidden`, `blocked`, `readonly`, `pending` ) - VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, 0, 0, 0 ) ", + `writable`, `hidden`, `blocked`, `readonly`, `pending`, `subhub` ) + VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, 0, 0, 0, %d ) ", intval($uid), dbesc(datetime_convert()), dbesc($ret['url']), @@ -151,7 +155,8 @@ function new_contact($uid,$url,$interactive = false) { intval($new_relation), intval($ret['priority']), intval($writeable), - intval($hidden) + intval($hidden), + intval($subhub) ); } diff --git a/include/items.php b/include/items.php index 4513db1db..ccc11d5be 100755 --- a/include/items.php +++ b/include/items.php @@ -1304,6 +1304,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) $birthday = ''; $hubs = $feed->get_links('hub'); + logger('consume_feed: hubs: ' . print_r($hubs,true), LOGGER_DATA); if(count($hubs)) $hub = implode(',', $hubs); @@ -1346,7 +1347,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) } $img_str = fetch_url($photo_url,true); - $img = new Photo($img_str); + // guess mimetype from headers or filename + $type = guess_image_type($photo_url,true); + + + $img = new Photo($img_str, $type); if($img->is_valid()) { if($have_photo) { q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `contact-id` = %d AND `uid` = %d", @@ -1372,9 +1377,9 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) q("UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1", dbesc(datetime_convert()), - dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.jpg'), - dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.jpg'), - dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.jpg'), + dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()), + dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()), + dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()), intval($contact['uid']), intval($contact['id']) ); @@ -2777,6 +2782,8 @@ function lose_sharer($importer,$contact,$datarray,$item) { function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') { + $a = get_app(); + if(is_array($importer)) { $r = q("SELECT `nickname` FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer['uid']) @@ -2807,7 +2814,10 @@ function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') { ); } - post_url($url,$params); + post_url($url,$params); + + logger('subscribe_to_hub: returns: ' . $a->get_curl_code(), LOGGER_DEBUG); + return; } @@ -2943,7 +2953,7 @@ function fix_private_photos($s,$uid, $item = null, $cid = 0) { if(stristr($image , $site . '/photo/')) { $replace = false; $i = basename($image); - $i = str_replace('.jpg','',$i); + $i = str_replace(array('.jpg','.png'),array('',''),$i); $x = strpos($i,'-'); if($x) { $res = substr($i,$x+1); @@ -2985,7 +2995,7 @@ function fix_private_photos($s,$uid, $item = null, $cid = 0) { } if($replace) { logger('fix_private_photos: replacing photo', LOGGER_DEBUG); - $s = str_replace($image, 'data:image/jpg;base64,' . base64_encode($r[0]['data']), $s); + $s = str_replace($image, 'data:' . $r[0]['type'] . ';base64,' . base64_encode($r[0]['data']), $s); logger('fix_private_photos: replaced: ' . $s, LOGGER_DATA); } } diff --git a/include/network.php b/include/network.php index eeb2460d1..446413cd8 100644 --- a/include/network.php +++ b/include/network.php @@ -807,8 +807,11 @@ function scale_external_images($s,$include_link = true) { if(stristr($mtch[1],$hostname)) continue; $i = fetch_url($mtch[1]); + // guess mimetype from headers or filename + $type = guess_image_type($mtch[1],true); + if($i) { - $ph = new Photo($i); + $ph = new Photo($i, $type); if($ph->is_valid()) { $orig_width = $ph->getWidth(); $orig_height = $ph->getHeight(); diff --git a/include/oembed.php b/include/oembed.php index 1f45d2814..e2504b7eb 100644..100755 --- a/include/oembed.php +++ b/include/oembed.php @@ -65,7 +65,8 @@ function oembed_fetch_url($embedurl){ } function oembed_format_object($j){ - $embedurl = $j->embedurl; + $a = get_app(); + $embedurl = $j->embedurl; $jhtml = oembed_iframe($j->embedurl,(isset($j->width) ? $j->width : null), (isset($j->height) ? $j->height : null) ); $ret="<span class='oembed ".$j->type."'>"; switch ($j->type) { @@ -78,6 +79,7 @@ function oembed_format_object($j){ $th=120; $tw = $th*$tr; $tpl=get_markup_template('oembed_video.tpl'); $ret.=replace_macros($tpl, array( + '$baseurl' => $a->get_baseurl(), '$embedurl'=>$embedurl, '$escapedhtml'=>base64_encode($jhtml), '$tw'=>$tw, diff --git a/include/onepoll.php b/include/onepoll.php index a64922aa3..ba7d5ebaf 100644 --- a/include/onepoll.php +++ b/include/onepoll.php @@ -477,6 +477,9 @@ function onepoll_run($argv, $argc){ if($contact['network'] === NETWORK_DFRN || $contact['blocked'] || $contact['readonly']) $hubmode = 'unsubscribe'; + if($contact['network'] === NETWORK_OSTATUS && (! $contact['hub-verify'])) + $hub_update = true; + if((strlen($hub)) && ($hub_update) && ($contact['rel'] != CONTACT_IS_FOLLOWER)) { logger('poller: hub ' . $hubmode . ' : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']); $hubs = explode(',', $hub); diff --git a/include/user.php b/include/user.php index af43a2b52..2477438bf 100644 --- a/include/user.php +++ b/include/user.php @@ -284,7 +284,11 @@ function create_user($arr) { $filename = basename($photo); $img_str = fetch_url($photo,true); - $img = new Photo($img_str); + // guess mimetype from headers or filename + $type = guess_image_type($photo,true); + + + $img = new Photo($img_str, $type); if($img->is_valid()) { $img->scaleImageSquare(175); @@ -324,4 +328,4 @@ function create_user($arr) { $result['user'] = $u; return $result; -}
\ No newline at end of file +} |