diff options
-rw-r--r-- | addon/facebook/facebook.php | 2 | ||||
-rw-r--r-- | boot.php | 19 | ||||
-rw-r--r-- | include/items.php | 25 | ||||
-rw-r--r-- | mod/events.php | 4 |
4 files changed, 37 insertions, 13 deletions
diff --git a/addon/facebook/facebook.php b/addon/facebook/facebook.php index 9e41065de..545779cd5 100644 --- a/addon/facebook/facebook.php +++ b/addon/facebook/facebook.php @@ -908,7 +908,7 @@ function fb_consume_stream($uid,$j,$wall = false) { $likedata['body'] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink); $likedata['object'] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' . - '<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . $orig_post['plink'] . '">') . '</link><title>' . $orig_post['title'] . '</title><content>' . $orig_post['body'] . '</content></object>'; + '<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . xmlify($orig_post['plink']) . '" />') . '</link><title>' . $orig_post['title'] . '</title><content>' . $orig_post['body'] . '</content></object>'; $item = item_store($likedata); } @@ -2788,16 +2788,23 @@ function lang_selector() { if(! function_exists('parse_xml_string')) { -function parse_xml_string($s) { - if(! strstr($s,'<?xml')) - return false; - $s2 = substr($s,strpos($s,'<?xml')); +function parse_xml_string($s,$strict = true) { + if($strict) { + if(! strstr($s,'<?xml')) + return false; + $s2 = substr($s,strpos($s,'<?xml')); + } + else + $s2 = $s; libxml_use_internal_errors(true); + $x = @simplexml_load_string($s2); - if(count(libxml_get_errors())) + if(! $x) { + logger('libxml: parse: error: ' . $s2, LOGGER_DATA); foreach(libxml_get_errors() as $err) logger('libxml: parse: ' . $err->code." at ".$err->line.":".$err->column." : ".$err->message, LOGGER_DATA); - libxml_clear_errors(); + libxml_clear_errors(); + } return $x; }} diff --git a/include/items.php b/include/items.php index dfe92378a..a5d430aa2 100644 --- a/include/items.php +++ b/include/items.php @@ -180,7 +180,11 @@ function construct_activity_object($item) { if($item['object']) { $o = '<as:object>' . "\r\n"; - $r = parse_xml_string($item['object']); + $r = parse_xml_string($item['object'],false); + + + if(! $r) + return ''; if($r->type) $o .= '<as:object-type>' . xmlify($r->type) . '</as:object-type>' . "\r\n"; if($r->id) @@ -188,8 +192,15 @@ function construct_activity_object($item) { if($r->title) $o .= '<title>' . xmlify($r->title) . '</title>' . "\r\n"; if($r->link) { - if(substr($r->link,0,1) === '<') + if(substr($r->link,0,1) === '<') { + // patch up some facebook "like" activity objects that got stored incorrectly + // for a couple of months prior to 9-Jun-2011 and generated bad XML. + // we can probably remove this hack here and in the following function in a few months time. + if(strstr($r->link,'&') && (! strstr($r->link,'&'))) + $r->link = str_replace('&','&', $r->link); + $r->link = preg_replace('/\<link(.*?)\"\>/','<link$1"/>',$r->link); $o .= $r->link; + } else $o .= '<link rel="alternate" type="text/html" href="' . xmlify($r->link) . '" />' . "\r\n"; } @@ -206,7 +217,9 @@ function construct_activity_target($item) { if($item['target']) { $o = '<as:target>' . "\r\n"; - $r = parse_xml_string($item['target']); + $r = parse_xml_string($item['target'],false); + if(! $r) + return ''; if($r->type) $o .= '<as:object-type>' . xmlify($r->type) . '</as:object-type>' . "\r\n"; if($r->id) @@ -214,8 +227,12 @@ function construct_activity_target($item) { if($r->title) $o .= '<title>' . xmlify($r->title) . '</title>' . "\r\n"; if($r->link) { - if(substr($r->link,0,1) === '<') + if(substr($r->link,0,1) === '<') { + if(strstr($r->link,'&') && (! strstr($r->link,'&'))) + $r->link = str_replace('&','&', $r->link); + $r->link = preg_replace('/\<link(.*?)\"\>/','<link$1"/>',$r->link); $o .= $r->link; + } else $o .= '<link rel="alternate" type="text/html" href="' . xmlify($r->link) . '" />' . "\r\n"; } diff --git a/mod/events.php b/mod/events.php index 052c0ef60..bdc4b8d87 100644 --- a/mod/events.php +++ b/mod/events.php @@ -159,8 +159,8 @@ function events_post(&$a) { $arr['body'] = format_event_bbcode($event); - $arr['object'] = '<object><type>' . ACTIVITY_OBJ_EVENT . '</type><title></title><id>' . $uri . '</id>'; - $arr['object'] .= '<content>' . format_event_bbcode($event) . '</content>'; + $arr['object'] = '<object><type>' . xmlify(ACTIVITY_OBJ_EVENT) . '</type><title></title><id>' . xmlify($uri) . '</id>'; + $arr['object'] .= '<content>' . xmlify(format_event_bbcode($event)) . '</content>'; $arr['object'] .= '</object>' . "\n"; $item_id = item_store($arr); |