From 3400f6f431436552d3bef81a4b25733db2cdd9b6 Mon Sep 17 00:00:00 2001 From: Brenda Wallace Date: Wed, 26 Aug 2009 10:00:29 +1200 Subject: [PATCH 1/7] renamed to plural, for consitency --- tests/{HashTagDetectionTest.php => HashTagDetectionTests.php} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tests/{HashTagDetectionTest.php => HashTagDetectionTests.php} (93%) diff --git a/tests/HashTagDetectionTest.php b/tests/HashTagDetectionTests.php similarity index 93% rename from tests/HashTagDetectionTest.php rename to tests/HashTagDetectionTests.php index 55e1f65bf9..4f0b31b0df 100644 --- a/tests/HashTagDetectionTest.php +++ b/tests/HashTagDetectionTests.php @@ -10,7 +10,7 @@ define('LACONICA', true); require_once INSTALLDIR . '/lib/common.php'; -class HashTagDetectionTest extends PHPUnit_Framework_TestCase +class HashTagDetectionTests extends PHPUnit_Framework_TestCase { /** * @dataProvider provider From 70ef9d89fab6daaf0cf2169007475e92859d05c4 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 25 Aug 2009 22:47:54 +0000 Subject: [PATCH 2/7] Updated rgb2hex() to handle IE. It turns out that jQuery is giving hex to IE and RGB to Firefox, Opera, Safari. Fun. --- js/userdesign.go.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/userdesign.go.js b/js/userdesign.go.js index c53569beab..8ddb9ec38c 100644 --- a/js/userdesign.go.js +++ b/js/userdesign.go.js @@ -27,11 +27,12 @@ $(document).ready(function() { } } - /* rgb2hex written by R0bb13 */ function rgb2hex(rgb) { + if (rgb.slice(0,1) == '#') { return rgb; } rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); return '#' + dec2hex(rgb[1]) + dec2hex(rgb[2]) + dec2hex(rgb[3]); } + /* dec2hex written by R0bb13 */ function dec2hex(x) { hexDigits = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); return isNaN(x) ? '00' : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16]; From 0e3598cea950b7503b351af8fb4c59d6b029a16c Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 25 Aug 2009 20:45:09 -0700 Subject: [PATCH 3/7] Small update to the Facebook app section --- README | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README b/README index c13e28791d..4611b06d68 100644 --- a/README +++ b/README @@ -629,10 +629,10 @@ key and secret, e.g.: In Facebook's application editor, specify the following URLs for your app: -- Callback URL: http://example.net/mublog/facebook/ -- Post-Remove URL: http://example.net/mublog/facebook/remove +- Canvas Callback URL: http://example.net/mublog/facebook/ +- Post-Remove Callback URL: http://example.net/mublog/facebook/remove - Post-Add Redirect URL: http://apps.facebook.com/yourapp/ -- Canvas URL: http://apps.facebook.com/yourapp/ +- Canvas Page URL: http://apps.facebook.com/yourapp/ (Replace 'example.net' with your host's URL, 'mublog' with the path to your Laconica installation, and 'yourapp' with the name of the From cbdf8e51aa2826e11cc17c34bcbf568ca37e26ce Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 26 Aug 2009 14:34:41 +0000 Subject: [PATCH 4/7] Facebook app wasn't loading the theme css --- lib/facebookaction.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/facebookaction.php b/lib/facebookaction.php index 289e702c69..975ef9a504 100644 --- a/lib/facebookaction.php +++ b/lib/facebookaction.php @@ -96,6 +96,7 @@ class FacebookAction extends Action function showStylesheets() { $this->cssLink('css/display.css', 'base'); + $this->cssLink('css/display.css',null,'screen, projection, tv'); $this->cssLink('css/facebookapp.css', 'base'); } From 0b884ed9151127778cdd8d68f52294cee5f053a6 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 26 Aug 2009 19:08:30 -0400 Subject: [PATCH 5/7] Add library checking page --- install.php | 255 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 250 insertions(+), 5 deletions(-) diff --git a/install.php b/install.php index c13f70272d..6f0af32c2f 100644 --- a/install.php +++ b/install.php @@ -19,20 +19,201 @@ define('INSTALLDIR', dirname(__FILE__)); +$external_libraries=array( + array( + 'name'=>'gettext', + 'url'=>'http://us.php.net/manual/en/book.gettext.php', + 'check_function'=>'gettext' + ), + array( + 'name'=>'PEAR', + 'url'=>'http://pear.php.net/', + 'deb'=>'php-pear', + 'include'=>'PEAR.php', + 'check_class'=>'PEAR' + ), + array( + 'name'=>'DB', + 'pear'=>'DB', + 'url'=>'http://pear.php.net/package/DB', + 'deb'=>'php-db', + 'include'=>'DB/common.php', + 'check_class'=>'DB_common' + ), + array( + 'name'=>'DB_DataObject', + 'pear'=>'DB_DataObject', + 'url'=>'http://pear.php.net/package/DB_DataObject', + 'include'=>'DB/DataObject.php', + 'check_class'=>'DB_DataObject' + ), + array( + 'name'=>'Console_Getopt', + 'pear'=>'Console_Getopt', + 'url'=>'http://pear.php.net/package/Console_Getopt', + 'include'=>'Console/Getopt.php', + 'check_class'=>'Console_Getopt' + ), + array( + 'name'=>'Facebook API', + 'url'=>'http://developers.facebook.com/', + 'include'=>'facebook/facebook.php', + 'check_class'=>'Facebook' + ), + array( + 'name'=>'htmLawed', + 'url'=>'http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed', + 'include'=>'htmLawed/htmLawed.php', + 'check_function'=>'htmLawed' + ), + array( + 'name'=>'HTTP_Request', + 'pear'=>'HTTP_Request', + 'url'=>'http://pear.php.net/package/HTTP_Request', + 'deb'=>'php-http-request', + 'include'=>'HTTP/Request.php', + 'check_class'=>'HTTP_Request' + ), + array( + 'name'=>'Mail', + 'pear'=>'Mail', + 'url'=>'http://pear.php.net/package/Mail', + 'deb'=>'php-mail', + 'include'=>'Mail.php', + 'check_class'=>'Mail' + ), + array( + 'name'=>'Mail_mimeDecode', + 'pear'=>'Mail_mimeDecode', + 'url'=>'http://pear.php.net/package/Mail_mimeDecode', + 'deb'=>'php-mail-mimedecode', + 'include'=>'Mail/mimeDecode.php', + 'check_class'=>'Mail_mimeDecode' + ), + array( + 'name'=>'Mime_Type', + 'pear'=>'Mime_Type', + 'url'=>'http://pear.php.net/package/Mime_Type', + 'include'=>'MIME/Type.php', + 'check_class'=>'Mime_Type' + ), + array( + 'name'=>'Net_URL_Mapper', + 'pear'=>'Net_URL_Mapper', + 'url'=>'http://pear.php.net/package/Net_URL_Mapper', + 'include'=>'Net/URL/Mapper.php', + 'check_class'=>'Net_URL_Mapper' + ), + array( + 'name'=>'Net_Socket', + 'pear'=>'Net_Socket', + 'url'=>'http://pear.php.net/package/Net_Socket', + 'deb'=>'php-net-socket', + 'include'=>'Net/Socket.php', + 'check_class'=>'Net_Socket' + ), + array( + 'name'=>'Net_SMTP', + 'pear'=>'Net_SMTP', + 'url'=>'http://pear.php.net/package/Net_SMTP', + 'deb'=>'php-net-smtp', + 'include'=>'Net/SMTP.php', + 'check_class'=>'Net_SMTP' + ), + array( + 'name'=>'Net_URL', + 'pear'=>'Net_URL', + 'url'=>'http://pear.php.net/package/Net_URL', + 'deb'=>'php-net-url', + 'include'=>'Net/URL.php', + 'check_class'=>'Net_URL' + ), + array( + 'name'=>'Net_URL2', + 'pear'=>'Net_URL2', + 'url'=>'http://pear.php.net/package/Net_URL2', + 'include'=>'Net/URL2.php', + 'check_class'=>'Net_URL2' + ), + array( + 'name'=>'Services_oEmbed', + 'pear'=>'Services_oEmbed', + 'url'=>'http://pear.php.net/package/Services_oEmbed', + 'include'=>'Services/oEmbed.php', + 'check_class'=>'Services_oEmbed' + ), + array( + 'name'=>'Stomp', + 'url'=>'http://stomp.codehaus.org/PHP', + 'include'=>'Stomp.php', + 'check_class'=>'Stomp' + ), + array( + 'name'=>'System_Command', + 'pear'=>'System_Command', + 'url'=>'http://pear.php.net/package/System_Command', + 'include'=>'System/Command.php', + 'check_class'=>'System_Command' + ), + array( + 'name'=>'XMPPHP', + 'url'=>'http://code.google.com/p/xmpphp', + 'include'=>'XMPPHP/XMPP.php', + 'check_class'=>'XMPPHP_XMPP' + ), + array( + 'name'=>'PHP Markdown', + 'url'=>'http://www.michelf.com/projects/php-markdown/', + 'include'=>'markdown.php', + 'check_class'=>'Markdown_Parser' + ), + array( + 'name'=>'OAuth', + 'url'=>'http://code.google.com/p/oauth-php', + 'include'=>'OAuth.php', + 'check_class'=>'OAuthRequest' + ), + array( + 'name'=>'Validate', + 'pear'=>'Validate', + 'url'=>'http://pear.php.net/package/Validate', + 'include'=>'Validate.php', + 'check_class'=>'Validate' + ) +); + function main() { if (!checkPrereqs()) { return; } - - if ($_SERVER['REQUEST_METHOD'] == 'POST') { - handlePost(); - } else { - showForm(); + + if( $_GET['checklibs'] ){ + showLibs(); + }else{ + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + handlePost(); + } else { + showForm(); + } } } +function haveExternalLibrary($external_library) +{ + if(isset($external_library['include']) && ! include_once($external_library['include'])){ + return false; + } + if(isset($external_library['check_function']) && ! function_exists($external_library['check_function'])){ + return false; + } + if(isset($external_library['check_class']) && ! class_exists($external_library['check_class'])){ + return false; + } + return true; +} + function checkPrereqs() { $pass = true; @@ -94,6 +275,69 @@ function checkExtension($name) return true; } +function showLibs() +{ + global $external_libraries; + $present_libraries=array(); + $absent_libraries=array(); + foreach($external_libraries as $external_library){ + if(haveExternalLibrary($external_library)){ + $present_libraries[]=$external_library; + }else{ + $absent_libraries[]=$external_library; + } + } + echo<< +

Laconica comes bundled with a number of libraries required for the application to work. However, it is best that you use PEAR or you distribution to manage + libraries instead, as they tend to provide security updates faster, and may offer improved performance.

+

On Debian based distributions, such as Ubuntu, use a package manager (such as "aptitude", "apt-get", and "synaptic") to install the package listed.

+

On RPM based distributions, such as Red Hat, Fedora, CentOS, Scientific Linux, Yellow Dog Linux and Oracle Enterprise Linux, use a package manager (such as "yum", "apt-rpm", and "up2date") to install the package listed.

+

On servers without a package manager (such as Windows), or if the library is not packaged for your distribution, you can use PHP's PEAR to install the library. Simply run "pear install <name>".

+ +

Absent Libraries

+
    +E_O_T; + foreach($absent_libraries as $library) + { + echo '
  • '; + if($library['url']){ + echo ''.htmlentities($library['name']).''; + }else{ + echo htmlentities($library['name']); + } + echo '
      '; + if($library['deb']){ + echo '
    • deb: ' . htmlentities($library['deb']) . '
    • '; + } + if($library['rpm']){ + echo '
    • rpm: ' . htmlentities($library['rpm']) . '
    • '; + } + if($library['pear']){ + echo '
    • pear: ' . htmlentities($library['pear']) . '
    • '; + } + echo '
    '; + } + echo<< +

    Installed Libraries

    +
      +E_O_T; + foreach($present_libraries as $library) + { + echo '
    • '; + if($library['url']){ + echo ''.htmlentities($library['name']).''; + }else{ + echo htmlentities($library['name']); + } + echo '
    • '; + } + echo<< +E_O_T; +} + function showForm() { echo<<

      Enter your database connection information below to initialize the database.

      +

      Laconica bundles a number of libraries for ease of installation. You can see what bundled libraries you are using, versus what libraries are installed on your server.

      From b7beac36c2dbebfa27982b2fc6c82cf2ebbaae8d Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 26 Aug 2009 21:54:57 -0400 Subject: [PATCH 6/7] Support multiple attachments per facebook update --- lib/facebookutil.php | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/lib/facebookutil.php b/lib/facebookutil.php index e31a71f5eb..67c6ecbdf1 100644 --- a/lib/facebookutil.php +++ b/lib/facebookutil.php @@ -178,20 +178,38 @@ function format_attachments($attachments) $fbattachment = array(); $fbattachment['media'] = array(); - // Facebook only supports one attachment per item + foreach($attachments as $attachment) + { + $fbmedia = get_fbmedia_for_attachment($attachment); + if($fbmedia){ + $fbattachment['media'][]=$fbmedia; + }else{ + $fbattachment['name'] = ($attachment->title ? + $attachment->title : $attachment->url); + $fbattachment['href'] = $attachment->url; + } + } + if(count($fbattachment['media'])>0){ + unset($fbattachment['name']); + unset($fbattachment['href']); + } + return $fbattachment; +} - $attachment = $attachments[0]; +/** +* given an File objects, returns an associative array suitable for Facebook media +*/ +function get_fbmedia_for_attachment($attachment) +{ $fbmedia = array(); if (strncmp($attachment->mimetype, 'image/', strlen('image/')) == 0) { $fbmedia['type'] = 'image'; $fbmedia['src'] = $attachment->url; $fbmedia['href'] = $attachment->url; - $fbattachment['media'][] = $fbmedia; } else if ($attachment->mimetype == 'audio/mpeg') { $fbmedia['type'] = 'mp3'; $fbmedia['src'] = $attachment->url; - $fbattachment['media'][] = $fbmedia; }else if ($attachment->mimetype == 'application/x-shockwave-flash') { $fbmedia['type'] = 'flash'; @@ -200,14 +218,10 @@ function format_attachments($attachments) // $fbmedia['imgsrc']=''; $fbmedia['swfsrc'] = $attachment->url; - $fbattachment['media'][] = $fbmedia; }else{ - $fbattachment['name'] = ($attachment->title ? - $attachment->title : $attachment->url); - $fbattachment['href'] = $attachment->url; + return false; } - - return $fbattachment; + return $fbmedia; } function remove_facebook_app($flink) From 2dd5a5f86d5242362499c381c8d9519f40a8925b Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 27 Aug 2009 12:06:45 -0400 Subject: [PATCH 7/7] Do not used named capturing groups I'm not sure all php 5.2's are compiled with a PCRE library that supported named captures. --- lib/util.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/util.php b/lib/util.php index 7c1e219138..1e78340579 100644 --- a/lib/util.php +++ b/lib/util.php @@ -413,7 +413,7 @@ function common_replace_urls_callback($text, $callback, $notice_id = null) { // Start off with a regex $regex = '#'. '(?:^|[\s\(\)\[\]\{\}\\\'\\\";]+)(?![\@\!\#])'. - '(?P'. + '('. '(?:'. '(?:'. //Known protocols '(?:'. @@ -454,7 +454,7 @@ function common_replace_urls_callback($text, $callback, $notice_id = null) { } function callback_helper($matches, $callback, $notice_id) { - $url=$matches['url']; + $url=$matches[1]; $left = strpos($matches[0],$url); $right = $left+strlen($url);