From d3d499879c4d01bde46033a3a98f9190ea18cb63 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 16 Jun 2010 14:29:24 -0700 Subject: - More useful group info from api/statusnet/group/show - Add statusnet:group_info tag to group Atom feeds --- actions/showgroup.php | 10 +--------- classes/User_group.php | 15 +++++++++++++++ lib/apiaction.php | 40 ++++++++++++++++++++++++++-------------- lib/atomgroupnoticefeed.php | 19 +++++++++++++++++++ 4 files changed, 61 insertions(+), 23 deletions(-) diff --git a/actions/showgroup.php b/actions/showgroup.php index 3d369e9eb..17c37e4d7 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -430,14 +430,6 @@ class ShowgroupAction extends GroupDesignAction function showStatistics() { - // XXX: WORM cache this - $members = $this->group->getMembers(); - $members_count = 0; - /** $member->count() doesn't work. */ - while ($members->fetch()) { - $members_count++; - } - $this->elementStart('div', array('id' => 'entity_statistics', 'class' => 'section')); @@ -451,7 +443,7 @@ class ShowgroupAction extends GroupDesignAction $this->elementStart('dl', 'entity_members'); $this->element('dt', null, _('Members')); - $this->element('dd', null, (is_int($members_count)) ? $members_count : '0'); + $this->element('dd', null, $this->group->getMemberCount()); $this->elementEnd('dl'); $this->elementEnd('div'); diff --git a/classes/User_group.php b/classes/User_group.php index 110f08301..e04c46626 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -154,6 +154,21 @@ class User_group extends Memcached_DataObject return $members; } + function getMemberCount() + { + // XXX: WORM cache this + + $members = $this->getMembers(); + $member_count = 0; + + /** $member->count() doesn't work. */ + while ($members->fetch()) { + $member_count++; + } + + return $member_count; + } + function getAdmins($offset=0, $limit=null) { $qry = diff --git a/lib/apiaction.php b/lib/apiaction.php index 320aa0316..7cc473d51 100644 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -346,20 +346,32 @@ class ApiAction extends Action function twitterGroupArray($group) { - $twitter_group=array(); - $twitter_group['id']=$group->id; - $twitter_group['url']=$group->permalink(); - $twitter_group['nickname']=$group->nickname; - $twitter_group['fullname']=$group->fullname; - $twitter_group['original_logo']=$group->original_logo; - $twitter_group['homepage_logo']=$group->homepage_logo; - $twitter_group['stream_logo']=$group->stream_logo; - $twitter_group['mini_logo']=$group->mini_logo; - $twitter_group['homepage']=$group->homepage; - $twitter_group['description']=$group->description; - $twitter_group['location']=$group->location; - $twitter_group['created']=$this->dateTwitter($group->created); - $twitter_group['modified']=$this->dateTwitter($group->modified); + $twitter_group = array(); + + $twitter_group['id'] = $group->id; + $twitter_group['url'] = $group->permalink(); + $twitter_group['nickname'] = $group->nickname; + $twitter_group['fullname'] = $group->fullname; + + if (isset($this->auth_user)) { + $twitter_group['member'] = $this->auth_user->isMember($group); + $twitter_group['blocked'] = Group_block::isBlocked( + $group, + $this->auth_user->getProfile() + ); + } + + $twitter_group['member_count'] = $group->getMemberCount(); + $twitter_group['original_logo'] = $group->original_logo; + $twitter_group['homepage_logo'] = $group->homepage_logo; + $twitter_group['stream_logo'] = $group->stream_logo; + $twitter_group['mini_logo'] = $group->mini_logo; + $twitter_group['homepage'] = $group->homepage; + $twitter_group['description'] = $group->description; + $twitter_group['location'] = $group->location; + $twitter_group['created'] = $this->dateTwitter($group->created); + $twitter_group['modified'] = $this->dateTwitter($group->modified); + return $twitter_group; } diff --git a/lib/atomgroupnoticefeed.php b/lib/atomgroupnoticefeed.php index 7934a4f9e..761df587c 100644 --- a/lib/atomgroupnoticefeed.php +++ b/lib/atomgroupnoticefeed.php @@ -93,4 +93,23 @@ class AtomGroupNoticeFeed extends AtomNoticeFeed return $this->group; } + function initFeed() + { + parent::initFeed(); + + $attrs = array(); + + if (!empty($this->cur)) { + $attrs['member'] = $this->cur->isMember($this->group) + ? 'true' : 'false'; + $attrs['blocked'] = Group_block::isBlocked( + $this->group, + $this->cur->getProfile() + ) ? 'true' : 'false'; + } + + $attrs['member_count'] = $this->group->getMemberCount(); + + $this->element('statusnet:group_info', $attrs, null); + } } -- cgit v1.2.3 From a6ce4eef0df225dd863baf45d5615cbe22dcdea6 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 16 Jun 2010 18:27:51 -0700 Subject: Fix problem with AvatarLink in which it was sometimes leaving the width attribute empty --- lib/avatarlink.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/avatarlink.php b/lib/avatarlink.php index e67799e2e..7d4256d6e 100644 --- a/lib/avatarlink.php +++ b/lib/avatarlink.php @@ -76,8 +76,8 @@ class AvatarLink $alink = new AvatarLink(); $alink->url = $filename; $alink->height = $size; + $alink->width = $size; if (!empty($filename)) { - $alink->width = $size; $alink->type = self::mediatype($filename); } else { $alink->url = User_group::defaultLogo($size); -- cgit v1.2.3 From b66709215309126969104ad114874360785f3d57 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 17 Jun 2010 13:44:17 -0400 Subject: adding a Status_network::updateKeys() method, since DB_DataObject update doesn't do keys. --- classes/Status_network.php | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/classes/Status_network.php b/classes/Status_network.php index 4a1f2c374..64016dd79 100644 --- a/classes/Status_network.php +++ b/classes/Status_network.php @@ -144,6 +144,35 @@ class Status_network extends Safe_DataObject return parent::update($orig); } + /** + * DB_DataObject doesn't allow updating keys (even non-primary) + */ + function updateKeys(&$orig) + { + $this->_connect(); + foreach (array('hostname', 'pathname') as $k) { + if (strcmp($this->$k, $orig->$k) != 0) { + $parts[] = $k . ' = ' . $this->_quote($this->$k); + } + } + if (count($parts) == 0) { + // No changes + return true; + } + + $toupdate = implode(', ', $parts); + + $table = common_database_tablename($this->tableName()); + $qry = 'UPDATE ' . $table . ' SET ' . $toupdate . + ' WHERE nickname = ' . $this->_quote($this->nickname); + $orig->decache(); + $result = $this->query($qry); + if ($result) { + $this->encache(); + } + return $result; + } + function delete() { $this->decache(); # while we still have the values! -- cgit v1.2.3 From 105c1a22d6513d9a5cb33d6134a6d60d423ee462 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 17 Jun 2010 23:08:40 +0000 Subject: Include source client's related URL (if any) in source attribution for Atom notice feeds --- classes/Notice.php | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/classes/Notice.php b/classes/Notice.php index 0838ca2a2..f8eda5777 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1238,9 +1238,25 @@ class Notice extends Memcached_DataObject $xs->element('published', null, common_date_w3dtf($this->created)); $xs->element('updated', null, common_date_w3dtf($this->created)); + $source = null; + + $ns = $this->getSource(); + + if ($ns) { + if (!empty($ns->name) && !empty($ns->url)) { + $source = '' + . htmlspecialchars($ns->name) + . ''; + } else { + $source = $ns->code; + } + } + $noticeInfoAttr = array( - 'local_id' => $this->id, // local notice ID (useful to clients for ordering) - 'source' => $this->source, // the client name (source attribution) + 'local_id' => $this->id, // local notice ID (useful to clients for ordering) + 'source' => $source, // the client name (source attribution) ); $ns = $this->getSource(); @@ -1252,8 +1268,8 @@ class Notice extends Memcached_DataObject if (!empty($cur)) { $noticeInfoAttr['favorite'] = ($cur->hasFave($this)) ? "true" : "false"; - $profile = $cur->getProfile(); - $noticeInfoAttr['repeated'] = ($profile->hasRepeated($this->id)) ? "true" : "false"; + $profile = $cur->getProfile(); + $noticeInfoAttr['repeated'] = ($profile->hasRepeated($this->id)) ? "true" : "false"; } if (!empty($this->repeat_of)) { -- cgit v1.2.3 From 9d890e2be07364487cb3b333b49650b820dd7176 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 18 Jun 2010 09:59:11 -0700 Subject: Catch a couple of missing XML namespace declarations on API XML output. Missing NS declarations were breaking XML parsing for some clients since beaecb18d5b92b913473dfffd545dc436f50cf66 --- actions/apiaccountverifycredentials.php | 2 +- actions/apisubscriptions.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/actions/apiaccountverifycredentials.php b/actions/apiaccountverifycredentials.php index ea61a3205..79416e9b2 100644 --- a/actions/apiaccountverifycredentials.php +++ b/actions/apiaccountverifycredentials.php @@ -75,7 +75,7 @@ class ApiAccountVerifyCredentialsAction extends ApiAuthAction if ($this->format == 'xml') { $this->initDocument('xml'); - $this->showTwitterXmlUser($twitter_user); + $this->showTwitterXmlUser($twitter_user, 'user', true); $this->endDocument('xml'); } elseif ($this->format == 'json') { $this->initDocument('json'); diff --git a/actions/apisubscriptions.php b/actions/apisubscriptions.php index 0ba324057..63d65f289 100644 --- a/actions/apisubscriptions.php +++ b/actions/apisubscriptions.php @@ -206,7 +206,8 @@ class ApiSubscriptionsAction extends ApiBareAuthAction { switch ($this->format) { case 'xml': - $this->elementStart('users', array('type' => 'array')); + $this->elementStart('users', array('type' => 'array', + 'xmlns:statusnet' => 'http://status.net/schema/api/1/')); foreach ($this->profiles as $profile) { $this->showProfile( $profile, -- cgit v1.2.3 From 2e98a48f2b992c0a566689d3246880f6e81fbee3 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sun, 20 Jun 2010 19:30:12 +0000 Subject: RecaptchaPlugin: fix for missing captcha on iPhone/Android. MobileProfile serves pages out to iPhone and Android as application/xhtml+xml, which doesn't work with the default we we were loading recaptcha (as it used document.write). Switched to filling out a
from the AJAX API, which doesn't use document.write in the XHTML context. Tested that view & submission works ok in following browsers: Mobile: iPhone 3.1, Android 2.1, iPad 3.2 (this last doesn't trigger mobile theme tweaks) Ubuntu 10.04: Firefox 3.6.3, Chrome 6 Mac 10.6: Safari 5/OS X 10.6.4 Windows 7: IE 8, Opera 10.56 --- plugins/Recaptcha/RecaptchaPlugin.php | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/plugins/Recaptcha/RecaptchaPlugin.php b/plugins/Recaptcha/RecaptchaPlugin.php index c585da43c..f09d81ec0 100644 --- a/plugins/Recaptcha/RecaptchaPlugin.php +++ b/plugins/Recaptcha/RecaptchaPlugin.php @@ -62,12 +62,29 @@ class RecaptchaPlugin extends Plugin { $action->elementStart('li'); $action->raw(''); - if($this->checkssl() === true) { - $action->raw(recaptcha_get_html($this->public_key), null, true); - } else { - $action->raw(recaptcha_get_html($this->public_key)); - } + + // AJAX API will fill this div out. + // We're calling that instead of the regular one so we stay compatible + // with application/xml+xhtml output as for mobile. + $action->element('div', array('id' => 'recaptcha')); $action->elementEnd('li'); + + $action->recaptchaPluginNeedsOutput = true; + return true; + } + + function onEndShowScripts($action) + { + if (isset($action->recaptchaPluginNeedsOutput) && $action->recaptchaPluginNeedsOutput) { + // Load the AJAX API + $proto = $this->checkssl() ? 'https' : 'http'; + $url = "$proto://api.recaptcha.net/js/recaptcha_ajax.js"; + $action->script($url); + + // And when we're ready, fill out the captcha! + $key = json_encode($this->public_key); + $action->inlinescript("\$(function(){Recaptcha.create($key, 'recaptcha');});"); + } return true; } -- cgit v1.2.3 From 1852eae36f9ed9a57d37f2048dfbf2257c7eccb4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 21 Jun 2010 08:07:12 -0700 Subject: quick-fix for localization typo per #2366 (also fixed upstream in translatewiki) --- locale/de/LC_MESSAGES/statusnet.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/de/LC_MESSAGES/statusnet.po b/locale/de/LC_MESSAGES/statusnet.po index eda01937a..e453e8025 100644 --- a/locale/de/LC_MESSAGES/statusnet.po +++ b/locale/de/LC_MESSAGES/statusnet.po @@ -2620,7 +2620,7 @@ msgstr "Profil-Einstellungen ansehen" #: actions/othersettings.php:123 msgid "Show or hide profile designs." -msgstr "Prifil-Designs anzeigen oder verstecken." +msgstr "Profil-Designs anzeigen oder verstecken." #: actions/othersettings.php:153 msgid "URL shortening service is too long (max 50 chars)." -- cgit v1.2.3 From f31a6de311cfed99eb4cf27bd4ff3d0df27d5434 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 21 Jun 2010 20:10:37 +0200 Subject: Localisation updates from http://translatewiki.net --- locale/af/LC_MESSAGES/statusnet.po | 4 +- locale/ar/LC_MESSAGES/statusnet.po | 4 +- locale/arz/LC_MESSAGES/statusnet.po | 4 +- locale/bg/LC_MESSAGES/statusnet.po | 4 +- locale/br/LC_MESSAGES/statusnet.po | 4 +- locale/ca/LC_MESSAGES/statusnet.po | 33 +++--- locale/cs/LC_MESSAGES/statusnet.po | 4 +- locale/de/LC_MESSAGES/statusnet.po | 13 +-- locale/el/LC_MESSAGES/statusnet.po | 4 +- locale/en_GB/LC_MESSAGES/statusnet.po | 4 +- locale/es/LC_MESSAGES/statusnet.po | 36 +++---- locale/fa/LC_MESSAGES/statusnet.po | 7 +- locale/fi/LC_MESSAGES/statusnet.po | 4 +- locale/fr/LC_MESSAGES/statusnet.po | 33 +++--- locale/ga/LC_MESSAGES/statusnet.po | 4 +- locale/gl/LC_MESSAGES/statusnet.po | 33 +++--- locale/he/LC_MESSAGES/statusnet.po | 4 +- locale/hsb/LC_MESSAGES/statusnet.po | 34 +++--- locale/ia/LC_MESSAGES/statusnet.po | 35 ++++--- locale/is/LC_MESSAGES/statusnet.po | 4 +- locale/it/LC_MESSAGES/statusnet.po | 33 +++--- locale/ja/LC_MESSAGES/statusnet.po | 7 +- locale/ko/LC_MESSAGES/statusnet.po | 4 +- locale/mk/LC_MESSAGES/statusnet.po | 190 +++++++++++++++++----------------- locale/nb/LC_MESSAGES/statusnet.po | 4 +- locale/nl/LC_MESSAGES/statusnet.po | 33 +++--- locale/nn/LC_MESSAGES/statusnet.po | 4 +- locale/pl/LC_MESSAGES/statusnet.po | 33 +++--- locale/pt/LC_MESSAGES/statusnet.po | 9 +- locale/pt_BR/LC_MESSAGES/statusnet.po | 13 +-- locale/ru/LC_MESSAGES/statusnet.po | 36 +++---- locale/statusnet.pot | 2 +- locale/sv/LC_MESSAGES/statusnet.po | 4 +- locale/te/LC_MESSAGES/statusnet.po | 4 +- locale/tr/LC_MESSAGES/statusnet.po | 4 +- locale/uk/LC_MESSAGES/statusnet.po | 38 +++---- locale/vi/LC_MESSAGES/statusnet.po | 4 +- locale/zh_CN/LC_MESSAGES/statusnet.po | 4 +- locale/zh_TW/LC_MESSAGES/statusnet.po | 4 +- 39 files changed, 359 insertions(+), 343 deletions(-) diff --git a/locale/af/LC_MESSAGES/statusnet.po b/locale/af/LC_MESSAGES/statusnet.po index 8601961a1..aa82c30f6 100644 --- a/locale/af/LC_MESSAGES/statusnet.po +++ b/locale/af/LC_MESSAGES/statusnet.po @@ -9,11 +9,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:18:33+0000\n" +"PO-Revision-Date: 2010-06-21 18:02:38+0000\n" "Language-Team: Afrikaans\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: af\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/ar/LC_MESSAGES/statusnet.po b/locale/ar/LC_MESSAGES/statusnet.po index 9ce943fd6..3f9f58275 100644 --- a/locale/ar/LC_MESSAGES/statusnet.po +++ b/locale/ar/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:18:37+0000\n" +"PO-Revision-Date: 2010-06-21 18:02:42+0000\n" "Language-Team: Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ar\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/arz/LC_MESSAGES/statusnet.po b/locale/arz/LC_MESSAGES/statusnet.po index a172687bc..8fc629453 100644 --- a/locale/arz/LC_MESSAGES/statusnet.po +++ b/locale/arz/LC_MESSAGES/statusnet.po @@ -11,11 +11,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:18:44+0000\n" +"PO-Revision-Date: 2010-06-21 18:02:48+0000\n" "Language-Team: Egyptian Spoken Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: arz\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/bg/LC_MESSAGES/statusnet.po b/locale/bg/LC_MESSAGES/statusnet.po index c40c6b40a..6f87d49be 100644 --- a/locale/bg/LC_MESSAGES/statusnet.po +++ b/locale/bg/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:18:49+0000\n" +"PO-Revision-Date: 2010-06-21 18:02:52+0000\n" "Language-Team: Bulgarian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: bg\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/br/LC_MESSAGES/statusnet.po b/locale/br/LC_MESSAGES/statusnet.po index fefd1b382..098967713 100644 --- a/locale/br/LC_MESSAGES/statusnet.po +++ b/locale/br/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:18:54+0000\n" +"PO-Revision-Date: 2010-06-21 18:02:56+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/ca/LC_MESSAGES/statusnet.po b/locale/ca/LC_MESSAGES/statusnet.po index 79ea768e0..2b5a2076d 100644 --- a/locale/ca/LC_MESSAGES/statusnet.po +++ b/locale/ca/LC_MESSAGES/statusnet.po @@ -11,11 +11,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:18:58+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:01+0000\n" "Language-Team: Catalan\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ca\n" "X-Message-Group: out-statusnet\n" @@ -1135,13 +1135,12 @@ msgid "Theme for the site." msgstr "Tema del lloc." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Tema del lloc" +msgstr "Tema personalitzat" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "Podeu pujar un tema personalitzat de l'StatusNet amb un arxiu ZIP." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1200,11 +1199,11 @@ msgstr "Enllaços" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Avançat" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "CSS personalitzat" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -6876,48 +6875,48 @@ msgstr "Cap" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." -msgstr "" +msgstr "El servidor no pot gestionar la pujada de temes si no pot tractar ZIP." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Error del sistema en pujar el fitxer." +msgstr "La pujada del tema ha fallat o no hi és." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Error en actualitzar avatar." +msgstr "Ha fallat el desament del tema." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "El tema no és vàlid: l'estructura del directori no és correcta" #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"El tema pujat és massa gran; ha de tenir menys de %d bytes descomprimit." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "L'arxiu del tema no és vàlid: manca el fitxer de css / display.css" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"El tema conté un fitxer o un nom de carpeta que no és vàlida. Feu servir " +"només lletres ASCII, dígits, caràcters de subratllat i el símbol de menys." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." -msgstr "" +msgstr "El tema conté un tipus de fitxer «.%s», que no està permès." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "S'ha produït un error en actualitzar el perfil remot." +msgstr "S'ha produït un error en obrir l'arxiu del tema." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/cs/LC_MESSAGES/statusnet.po b/locale/cs/LC_MESSAGES/statusnet.po index 63162ccc2..f9bd7ded9 100644 --- a/locale/cs/LC_MESSAGES/statusnet.po +++ b/locale/cs/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:03+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:06+0000\n" "Language-Team: Czech\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: cs\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/de/LC_MESSAGES/statusnet.po b/locale/de/LC_MESSAGES/statusnet.po index d5598d965..3f16402f2 100644 --- a/locale/de/LC_MESSAGES/statusnet.po +++ b/locale/de/LC_MESSAGES/statusnet.po @@ -1,6 +1,7 @@ # Translation of StatusNet to German # # Author@translatewiki.net: Bavatar +# Author@translatewiki.net: Brion # Author@translatewiki.net: Lutzgh # Author@translatewiki.net: March # Author@translatewiki.net: McDutchie @@ -17,11 +18,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:08+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:12+0000\n" "Language-Team: German\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: de\n" "X-Message-Group: out-statusnet\n" @@ -706,7 +707,7 @@ msgstr "%1$s / Aktualisierungen erwähnen %2$s" #: actions/apitimelinementions.php:131 #, php-format msgid "%1$s updates that reply to updates from %2$s / %3$s." -msgstr "Nachrichten von %1$, die auf Nachrichten von %2$ / %3$ antworten." +msgstr "Nachrichten von %1$s, die auf Nachrichten von %2$s / %3$s antworten." #: actions/apitimelinepublic.php:197 actions/publicrss.php:103 #, php-format @@ -1208,11 +1209,11 @@ msgstr "Links" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Erweitert" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "Eigene CSS" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -2638,7 +2639,7 @@ msgstr "Profil-Einstellungen ansehen" #: actions/othersettings.php:123 msgid "Show or hide profile designs." -msgstr "Prifil-Designs anzeigen oder verstecken." +msgstr "Profil-Designs anzeigen oder verstecken." #: actions/othersettings.php:153 msgid "URL shortening service is too long (max 50 chars)." diff --git a/locale/el/LC_MESSAGES/statusnet.po b/locale/el/LC_MESSAGES/statusnet.po index b4d3dda98..803c3b34b 100644 --- a/locale/el/LC_MESSAGES/statusnet.po +++ b/locale/el/LC_MESSAGES/statusnet.po @@ -11,11 +11,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:12+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:17+0000\n" "Language-Team: Greek\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: el\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/en_GB/LC_MESSAGES/statusnet.po b/locale/en_GB/LC_MESSAGES/statusnet.po index dd815ca40..96dc69be6 100644 --- a/locale/en_GB/LC_MESSAGES/statusnet.po +++ b/locale/en_GB/LC_MESSAGES/statusnet.po @@ -12,11 +12,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:18+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:21+0000\n" "Language-Team: British English\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: en-gb\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/es/LC_MESSAGES/statusnet.po b/locale/es/LC_MESSAGES/statusnet.po index abaab83fc..56f866af8 100644 --- a/locale/es/LC_MESSAGES/statusnet.po +++ b/locale/es/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Spanish # +# Author@translatewiki.net: Brion # Author@translatewiki.net: Crazymadlover # Author@translatewiki.net: Locos epraix # Author@translatewiki.net: McDutchie @@ -15,11 +16,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:22+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:25+0000\n" "Language-Team: Spanish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: es\n" "X-Message-Group: out-statusnet\n" @@ -1135,13 +1136,12 @@ msgid "Theme for the site." msgstr "Tema para el sitio." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Tema del sitio" +msgstr "Personalizar tema" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "Puedes subir un tema personalizado StatusNet como un archivo .ZIP." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1201,11 +1201,11 @@ msgstr "Vínculos" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Avanzado" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "Personalizar CSS" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -1640,7 +1640,7 @@ msgstr "Avisos favoritos de %s" #: actions/favoritesrss.php:115 #, php-format msgid "Updates favored by %1$s on %2$s!" -msgstr "¡Actualizaciones favorecidas por %1$ s en %2$s!" +msgstr "¡Actualizaciones favorecidas por %1$s en %2$s!" #: actions/featured.php:69 lib/featureduserssection.php:87 #: lib/publicgroupnav.php:89 @@ -6885,48 +6885,48 @@ msgstr "Ninguno" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." -msgstr "" +msgstr "Este servidor no puede manejar cargas de temas sin soporte ZIP." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Error del sistema subir el archivo" +msgstr "Sudida del tema perdido o errado." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Error al actualizar la imagen." +msgstr "Grabado de tema errado." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Tema inválido: mala estructura de directorio." #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"Tema subido es demasiado grande; debe ser menor que %d bytes sin comprimir." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "Archivo de tema inválido: archivo perdido css/display.css" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"El tema contiene archivo o nombre de carpeta inválido. Restrínjase a letras " +"ASCII, dígitos, carácter de subrayado, y signo menos." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." -msgstr "" +msgstr "El tema contiene archivo de tipo '.%s', que no está permitido." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Error al actualizar el perfil remoto." +msgstr "Error al abrir archivo de tema." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/fa/LC_MESSAGES/statusnet.po b/locale/fa/LC_MESSAGES/statusnet.po index 6115c832b..22997fc91 100644 --- a/locale/fa/LC_MESSAGES/statusnet.po +++ b/locale/fa/LC_MESSAGES/statusnet.po @@ -1,6 +1,7 @@ # Translation of StatusNet to Persian # # Author@translatewiki.net: ArianHT +# Author@translatewiki.net: Brion # Author@translatewiki.net: Choxos # Author@translatewiki.net: Everplays # Author@translatewiki.net: Narcissus @@ -12,7 +13,7 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:31+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:35+0000\n" "Last-Translator: Ahmad Sufi Mahmudi\n" "Language-Team: Persian\n" "MIME-Version: 1.0\n" @@ -21,7 +22,7 @@ msgstr "" "X-Language-Code: fa\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" #. TRANS: Page title @@ -197,7 +198,7 @@ msgstr "شما و دوستان" #: actions/apitimelinehome.php:122 #, php-format msgid "Updates from %1$s and friends on %2$s!" -msgstr "به روز رسانی از %1$ و دوستان در %2$" +msgstr "به روز رسانی از %1$s و دوستان در %2$s" #: actions/apiaccountratelimitstatus.php:72 #: actions/apiaccountupdatedeliverydevice.php:94 diff --git a/locale/fi/LC_MESSAGES/statusnet.po b/locale/fi/LC_MESSAGES/statusnet.po index dccd62a1b..2b5f91e41 100644 --- a/locale/fi/LC_MESSAGES/statusnet.po +++ b/locale/fi/LC_MESSAGES/statusnet.po @@ -11,11 +11,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:27+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:30+0000\n" "Language-Team: Finnish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fi\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/fr/LC_MESSAGES/statusnet.po b/locale/fr/LC_MESSAGES/statusnet.po index cfa141165..5adb8b360 100644 --- a/locale/fr/LC_MESSAGES/statusnet.po +++ b/locale/fr/LC_MESSAGES/statusnet.po @@ -16,11 +16,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:36+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:40+0000\n" "Language-Team: French\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: out-statusnet\n" @@ -1144,13 +1144,13 @@ msgid "Theme for the site." msgstr "Thème pour le site." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Thème du site" +msgstr "Thème personnalisé" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." msgstr "" +"Vous pouvez importer un thème StatusNet personnalisé dans une archive .ZIP." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1210,11 +1210,11 @@ msgstr "Liens" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Avancé" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "CSS personnalisé" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -6919,47 +6919,50 @@ msgstr "Aucun" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." msgstr "" +"Le serveur ne peut pas gérer l’import de thèmes sans le support du format " +"ZIP." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Erreur système lors du transfert du fichier." +msgstr "Le thème est manquant ou son import a échoué." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "La mise à jour de l’avatar a échoué." +msgstr "L’enregistrement du thème a échoué." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Thème invalide : mauvaise arborescence." #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"Le thème importé est trop volumineux. Non compressé, il doit occuper moins " +"de %d octets." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "Archive de thème invalide : fichier css/display.css manquant" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"Le thème contient un nom de fichier ou de dossier invalide. Limitez-vous aux " +"lettres ASCII et aux chiffres, caractère de soulignement et signe moins." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." -msgstr "" +msgstr "Le thème contient un fichier de type « .%s », qui n'est pas autorisé." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Erreur lors de la mise à jour du profil distant." +msgstr "Erreur lors de l’ouverture de l’archive du thème." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/ga/LC_MESSAGES/statusnet.po b/locale/ga/LC_MESSAGES/statusnet.po index 58ed21473..ac7ad1b5f 100644 --- a/locale/ga/LC_MESSAGES/statusnet.po +++ b/locale/ga/LC_MESSAGES/statusnet.po @@ -9,11 +9,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:40+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:45+0000\n" "Language-Team: Irish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ga\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/gl/LC_MESSAGES/statusnet.po b/locale/gl/LC_MESSAGES/statusnet.po index c505db01c..14cbd03c7 100644 --- a/locale/gl/LC_MESSAGES/statusnet.po +++ b/locale/gl/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:45+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:49+0000\n" "Language-Team: Galician\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: gl\n" "X-Message-Group: out-statusnet\n" @@ -1132,13 +1132,13 @@ msgid "Theme for the site." msgstr "Tema visual para o sitio." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Tema visual do sitio" +msgstr "Tema visual personalizado" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." msgstr "" +"Pode cargar como arquivo .ZIP un tema visual personalizado para StatusNet" #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1198,11 +1198,11 @@ msgstr "Ligazóns" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Avanzado" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "CSS personalizado" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -6878,47 +6878,50 @@ msgstr "Ningún" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." msgstr "" +"O servidor non pode xestionar as cargas de temas visuais sen soporte para o " +"formato ZIP." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Houbo un erro no sistema ao cargar o ficheiro." +msgstr "Houbo un erro no sistema ao cargar o tema visual." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Non se puido actualizar o avatar." +msgstr "Non se puido gardar o tema visual." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Tema visual inválido: a estrutura do directorio é incorrecta" #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"O tema visual cargado é grande de máis; o tamaño descomprimido non pode " +"superar os %d bytes." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "Arquivo de tema visual inválido: falta o ficheiro css/display.css" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"O tema visual contén un ficheiro inválido ou nome de cartafol incorrecto. " +"Limíteo a letras ASCII, díxitos, barras baixas e signos menos." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." -msgstr "" +msgstr "O tema visual contén o tipo de ficheiro \".%s\". Non está permitido." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Houbo un erro ao actualizar o perfil remoto." +msgstr "Houbo un erro ao abrir o arquivo do tema visual." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/he/LC_MESSAGES/statusnet.po b/locale/he/LC_MESSAGES/statusnet.po index fe5c02d48..d1b13a29a 100644 --- a/locale/he/LC_MESSAGES/statusnet.po +++ b/locale/he/LC_MESSAGES/statusnet.po @@ -8,11 +8,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:49+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:54+0000\n" "Language-Team: Hebrew\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: he\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/hsb/LC_MESSAGES/statusnet.po b/locale/hsb/LC_MESSAGES/statusnet.po index 0555459d1..1c5781d51 100644 --- a/locale/hsb/LC_MESSAGES/statusnet.po +++ b/locale/hsb/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:19:54+0000\n" +"PO-Revision-Date: 2010-06-21 18:03:58+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: hsb\n" "X-Message-Group: out-statusnet\n" @@ -1099,9 +1099,8 @@ msgid "Theme for the site." msgstr "Šat za sydło." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Šat sydła" +msgstr "Swójski šat" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." @@ -1164,11 +1163,11 @@ msgstr "Wotkazy" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Rozšěrjeny" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "Swójski CSS" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -1423,7 +1422,7 @@ msgstr "" #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:193 msgid "Send me email when someone sends me a private message." -msgstr "" +msgstr "E-mejl pósłać, hdyž něchtó priwatnu powěsć sćele." #. TRANS: Checkbox label in e-mail preferences form. #: actions/emailsettings.php:199 @@ -1594,12 +1593,12 @@ msgstr "" #: actions/featured.php:69 lib/featureduserssection.php:87 #: lib/publicgroupnav.php:89 msgid "Featured users" -msgstr "" +msgstr "Nazhonići wužiwarjo" #: actions/featured.php:71 #, php-format msgid "Featured users, page %d" -msgstr "" +msgstr "Nazhonići wužiwarjo, strona %d" #: actions/featured.php:99 #, php-format @@ -3053,7 +3052,7 @@ msgstr "Sy so identifikował. Zapodaj deleka nowe hesło. " #: actions/recoverpassword.php:188 msgid "Password recovery" -msgstr "" +msgstr "Wobnowjenje hesła" #: actions/recoverpassword.php:191 msgid "Nickname or email address" @@ -3066,7 +3065,7 @@ msgstr "" #: actions/recoverpassword.php:199 actions/recoverpassword.php:200 msgid "Recover" -msgstr "" +msgstr "Wobnowić" #: actions/recoverpassword.php:208 msgid "Reset password" @@ -3074,11 +3073,11 @@ msgstr "Hesło wróćo stajić" #: actions/recoverpassword.php:209 msgid "Recover password" -msgstr "" +msgstr "Hesło wobnowić" #: actions/recoverpassword.php:210 actions/recoverpassword.php:335 msgid "Password recovery requested" -msgstr "" +msgstr "Wobnowjenje hesła požadane" #: actions/recoverpassword.php:213 msgid "Unknown action" @@ -6439,16 +6438,14 @@ msgid "This server cannot handle theme uploads without ZIP support." msgstr "" #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Systemowy zmylk při nahrawanju dataje." +msgstr "Nahraće šata faluje abo je so njeporadźiło." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Aktualizowanje awatara je so njeporadźiło." +msgstr "Składowanje šata je so njeporadźiło." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." @@ -6475,9 +6472,8 @@ msgid "Theme contains file of type '.%s', which is not allowed." msgstr "" #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Zmylk při aktualizaciji zdaleneho profila." +msgstr "Zmylk při wočinjenju šatoweho archiwa." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/ia/LC_MESSAGES/statusnet.po b/locale/ia/LC_MESSAGES/statusnet.po index 46f4b3746..cc699cef4 100644 --- a/locale/ia/LC_MESSAGES/statusnet.po +++ b/locale/ia/LC_MESSAGES/statusnet.po @@ -9,11 +9,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:00+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:03+0000\n" "Language-Team: Interlingua\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: out-statusnet\n" @@ -1129,13 +1129,14 @@ msgid "Theme for the site." msgstr "Le thema de apparentia pro le sito." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Thema del sito" +msgstr "Apparentia personalisate" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." msgstr "" +"Es possibile incargar un apparentia personalisate de StatusNet in un " +"archivo .ZIP." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1195,11 +1196,11 @@ msgstr "Ligamines" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Avantiate" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "CSS personalisate" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -4613,7 +4614,7 @@ msgstr "Acceptar" #: actions/userauthorization.php:218 lib/subscribeform.php:115 #: lib/subscribeform.php:139 msgid "Subscribe to this user" -msgstr "Subscriber me a iste usator" +msgstr "Subscriber a iste usator" #: actions/userauthorization.php:219 msgid "Reject" @@ -6848,47 +6849,51 @@ msgstr "Nulle" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." msgstr "" +"Iste servitor non pote manear le incargamento de apparentias sin supporto de " +"ZIP." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Error de systema durante le incargamento del file." +msgstr "Le file del apparentia manca o le incargamento ha fallite." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Actualisation del avatar fallite." +msgstr "Salveguarda del apparentia fallite." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Apparentia invalide: mal structura de directorios." #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"Le apparentia incargate es troppo voluminose; debe occupar minus de %d bytes " +"in forma non comprimite." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "Archivo de apparentia invalide: manca le file css/display.css" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"Le apparentia contine un nomine de file o dossier invalide. Limita te a " +"litteras ASCII, digitos, sublineamento, e signo minus." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." msgstr "" +"Le apparentia contine un file del typo '.%s', le qual non es permittite." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Error durante le actualisation del profilo remote." +msgstr "Error durante le apertura del archivo del apparentia." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/is/LC_MESSAGES/statusnet.po b/locale/is/LC_MESSAGES/statusnet.po index 511b706ca..c76c4e95f 100644 --- a/locale/is/LC_MESSAGES/statusnet.po +++ b/locale/is/LC_MESSAGES/statusnet.po @@ -9,11 +9,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:07+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:07+0000\n" "Language-Team: Icelandic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: is\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/it/LC_MESSAGES/statusnet.po b/locale/it/LC_MESSAGES/statusnet.po index 8013d4a57..1b6b39f03 100644 --- a/locale/it/LC_MESSAGES/statusnet.po +++ b/locale/it/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Italian # +# Author@translatewiki.net: HalphaZ # Author@translatewiki.net: Milocasagrande # Author@translatewiki.net: Nemo bis # -- @@ -10,11 +11,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:12+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:12+0000\n" "Language-Team: Italian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: it\n" "X-Message-Group: out-statusnet\n" @@ -1129,13 +1130,12 @@ msgid "Theme for the site." msgstr "Tema per questo sito." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Tema del sito" +msgstr "Tema personalizzato" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "Puoi caricare un tema per StatusNet personalizzato come un file ZIP." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1195,11 +1195,11 @@ msgstr "Collegamenti" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Avanzate" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "CSS personalizzato" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -6854,47 +6854,48 @@ msgstr "Nessuno" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." msgstr "" +"Questo server non è in grado di gestire caricamenti senza il supporto ZIP." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Errore di sistema nel caricare il file." +msgstr "Tema caricato mancante o caricamento non riuscito." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Aggiornamento dell'immagine non riuscito." +msgstr "Salvataggio del tema non riuscito." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Tema non valido: struttura directory non corretta." #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"Il tema caricato è troppo grande, deve essere meno di %d byte non compresso." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "File di tema non valido: manca il file css/display.css" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"Il tema contiene file non o nomi di cartelle non validi. Utilizzare " +"solamente caratteri ASCII, numeri, il trattino basso e il segno meno." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." -msgstr "" +msgstr "Il tema contiene file di tipo \".%s\" che non sono supportati." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Errore nell'aggiornare il profilo remoto." +msgstr "Errore nell'aprire il file del tema." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/ja/LC_MESSAGES/statusnet.po b/locale/ja/LC_MESSAGES/statusnet.po index b6f83d8d9..e0e1ef021 100644 --- a/locale/ja/LC_MESSAGES/statusnet.po +++ b/locale/ja/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Japanese # +# Author@translatewiki.net: Brion # Author@translatewiki.net: Fryed-peach # Author@translatewiki.net: Sonoda # Author@translatewiki.net: Whym @@ -11,11 +12,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:17+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:16+0000\n" "Language-Team: Japanese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ja\n" "X-Message-Group: out-statusnet\n" @@ -2578,7 +2579,7 @@ msgstr "つぶやきにはプロファイルはありません。" #: actions/oembed.php:87 actions/shownotice.php:175 #, php-format msgid "%1$s's status on %2$s" -msgstr "%2$s における %1$ のステータス" +msgstr "%2$s における %1$s のステータス" #. TRANS: Error message displaying attachments. %s is a raw MIME type (eg 'image/png') #: actions/oembed.php:159 diff --git a/locale/ko/LC_MESSAGES/statusnet.po b/locale/ko/LC_MESSAGES/statusnet.po index 0c9a7395c..ce2db363a 100644 --- a/locale/ko/LC_MESSAGES/statusnet.po +++ b/locale/ko/LC_MESSAGES/statusnet.po @@ -9,11 +9,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:22+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:21+0000\n" "Language-Team: Korean\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ko\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/mk/LC_MESSAGES/statusnet.po b/locale/mk/LC_MESSAGES/statusnet.po index 7103c5786..09836ffa5 100644 --- a/locale/mk/LC_MESSAGES/statusnet.po +++ b/locale/mk/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:27+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:26+0000\n" "Language-Team: Macedonian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: out-statusnet\n" @@ -29,7 +29,7 @@ msgstr "Пристап" #. TRANS: Page notice #: actions/accessadminpanel.php:67 msgid "Site access settings" -msgstr "Нагодувања за пристап на веб-страницата" +msgstr "Нагодувања за пристап на мрежното место" #. TRANS: Form legend for registration form. #: actions/accessadminpanel.php:161 @@ -40,8 +40,8 @@ msgstr "Регистрација" #: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" -"Да им забранам на анонимните (ненајавени) корисници да ја гледаат веб-" -"страницата?" +"Да им забранам на анонимните (ненајавени) корисници да го гледаат мрежното " +"место?" #. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 @@ -1101,7 +1101,7 @@ msgstr "Изглед" #: actions/designadminpanel.php:74 msgid "Design settings for this StatusNet site." -msgstr "Нагодувања на изгледот на оваа StatusNet веб-страница." +msgstr "Нагодувања на изгледот на ова StatusNet-мрежно место." #: actions/designadminpanel.php:318 msgid "Invalid logo URL." @@ -1118,28 +1118,27 @@ msgstr "Промени лого" #: actions/designadminpanel.php:431 msgid "Site logo" -msgstr "Лого на веб-страницата" +msgstr "Лого на мрежното место" #: actions/designadminpanel.php:443 msgid "Change theme" -msgstr "Промени тема" +msgstr "Промени изглед" #: actions/designadminpanel.php:460 msgid "Site theme" -msgstr "Тема на веб-страницата" +msgstr "Изглед на мрежното место" #: actions/designadminpanel.php:461 msgid "Theme for the site." -msgstr "Тема за веб-страницата." +msgstr "Изглед за мрежното место." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Тема на веб-страницата" +msgstr "Прилагоден мотив" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "Можете да подигнете свој изглед за StatusNet како .ZIP архив." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1156,7 +1155,7 @@ msgid "" "You can upload a background image for the site. The maximum file size is %1" "$s." msgstr "" -"Може да подигнете позадинска слика за оваа веб-страница. Максималната " +"Може да подигнете позадинска слика за ова мрежно место. Максималната " "големина на податотеката е %1$s." #. TRANS: Used as radio button label to add a background image. @@ -1199,11 +1198,11 @@ msgstr "Врски" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Напредно" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "Прилагодено CSS" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -1604,7 +1603,7 @@ msgstr "Популарни забелешки, стр. %d" #: actions/favorited.php:79 msgid "The most popular notices on the site right now." -msgstr "Моментално најпопуларни забелешки на веб-страницата." +msgstr "Моментално најпопуларни забелешки на мрежното место." #: actions/favorited.php:150 msgid "Favorite notices appear on this page but no one has favorited one yet." @@ -1721,7 +1720,7 @@ msgstr "Оваа улога е резервирана и не може да се #: actions/grantrole.php:75 msgid "You cannot grant user roles on this site." -msgstr "Не можете да им доделувате улоги на корисниците на оваа веб-страница." +msgstr "Не можете да им доделувате улоги на корисниците на ова мрежно место." #: actions/grantrole.php:82 msgid "User already has this role." @@ -2180,15 +2179,15 @@ msgid "" "on the site. Thanks for growing the community!" msgstr "" "Ќе добиете известување кога луѓето кои сте ги поканиле ќе ја прифатат " -"поканата и ќе се регистрираат на веб-страницата. Ви благодариме за Вашата " -"помош со проширувањето на заедницата!" +"поканата и ќе се регистрираат на мрежното место. Ви благодариме што ни " +"помагате да ја прошириме заедницата!" #: actions/invite.php:162 msgid "" "Use this form to invite your friends and colleagues to use this service." msgstr "" -"Со овој обраец можете да поканите пријатели и колеги да ја користат веб-" -"страницата." +"Со овој обраец можете да поканите пријатели и колеги да го користат мрежното " +"место." #: actions/invite.php:187 msgid "Email addresses" @@ -2251,7 +2250,7 @@ msgid "" msgstr "" "%1$s Ве кани да се придружите на %2$s (%3$s).\n" "\n" -"%2$s е веб-страница за микроблогирање што ви овозможува да бидете во тек " +"%2$s е мрежно место за микроблогирање што ви овозможува да бидете во тек " "луѓето што ги познавате и луѓето кои ве интересираат.\n" "\n" "Можете да објавувате и новости за Вас, Ваши размисли, и настани од Вашиот " @@ -2266,7 +2265,7 @@ msgstr "" "\n" "%5$s\n" "\n" -"Ако сакате да ја испробате оваа друштвена веб-страница, кликнете на врската " +"Ако сакате да ја испробате оваа друштвено мрежно место, кликнете на врската " "подолу за да ја прифатите поканата.\n" "\n" "%6$s\n" @@ -2489,8 +2488,8 @@ msgid "" "[post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!" msgstr "" "А зошто не [регистрирате сметка](%%%%action.register%%%%) и станете првиот " -"што ќе [објави нешто на оваа тема](%%%%action.newnotice%%%%?status_textarea=" -"%s)!" +"што ќе [објави нешто на оваа тема](%%%%action.newnotice%%%%?status_textarea=%" +"s)!" #: actions/noticesearchrss.php:96 #, php-format @@ -2759,7 +2758,7 @@ msgstr "Неважечки SSL-опслужувач. Дозволени се н #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 msgid "Site" -msgstr "Веб-страница" +msgstr "Мреж. место" #: actions/pathsadminpanel.php:238 msgid "Server" @@ -2775,7 +2774,7 @@ msgstr "Патека" #: actions/pathsadminpanel.php:242 msgid "Site path" -msgstr "Патека на веб-страницата" +msgstr "Патека на мрежното место" #: actions/pathsadminpanel.php:246 msgid "Path to locales" @@ -2795,7 +2794,7 @@ msgstr "Да користам интересни (почитливи и повп #: actions/pathsadminpanel.php:259 msgid "Theme" -msgstr "Тема" +msgstr "Изглед" #: actions/pathsadminpanel.php:264 msgid "Theme server" @@ -2909,8 +2908,8 @@ msgstr "Неважечка содржина на забелешката." #, php-format msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -"Лиценцата на забелешката „%1$s“ не е компатибилна со лиценцата на веб-" -"страницата „%2$s“." +"Лиценцата на забелешката „%1$s“ не е соодветна на лиценцата на мрежното " +"место „%2$s“." #: actions/profilesettings.php:60 msgid "Profile settings" @@ -2945,7 +2944,7 @@ msgstr "Домашна страница" #: actions/profilesettings.php:117 actions/register.php:462 msgid "URL of your homepage, blog, or profile on another site" -msgstr "URL на Вашата домашна страница, блог или профил на друга веб-страница." +msgstr "URL на Вашата домашна страница, блог или профил на друго мрежно место." #: actions/profilesettings.php:122 actions/register.php:468 #, php-format @@ -3108,10 +3107,10 @@ msgid "" "tool. [Join now](%%action.register%%) to share notices about yourself with " "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -"Ова е %%site.name%%, веб-страница за [микроблогирање](http://mk.wikipedia." -"org/wiki/Микроблогирање) базирана на слободната програмска алатка [StatusNet]" -"(http://status.net/). [Зачленете се](%%action.register%%) за да си " -"споделувате забелешки за себе со приајтелите, семејството и колегите! " +"Ова е %%site.name%%, мрежно место за [микроблогирање](http://mk.wikipedia." +"org/wiki/Микроблогирање) заснована на слободната програмска алатка " +"[StatusNet](http://status.net/). [Зачленете се](%%action.register%%) за да " +"си споделувате забелешки за себе со приајтелите, семејството и колегите! " "([Прочитајте повеќе](%%doc.help%%))" #: actions/public.php:247 @@ -3121,9 +3120,9 @@ msgid "" "blogging) service based on the Free Software [StatusNet](http://status.net/) " "tool." msgstr "" -"Ова е %%site.name%%, веб-страница за [микроблогирање](http://mk.wikipedia." -"org/wiki/Микроблогирање) базирана на слободната програмска алатка [StatusNet]" -"(http://status.net/)." +"Ова е %%site.name%%, мрежно место за [микроблогирање](http://mk.wikipedia." +"org/wiki/Микроблогирање) заснована на слободната програмска алатка " +"[StatusNet](http://status.net/)." #: actions/publictagcloud.php:57 msgid "Public tag cloud" @@ -3432,10 +3431,10 @@ msgid "" "register%%) a new account. If you already have an account on a [compatible " "microblogging site](%%doc.openmublog%%), enter your profile URL below." msgstr "" -"За да се претплатите, може да се [најавите](%%action.login%%) или да " +"За да се претплатите, можете да се [најавите](%%action.login%%) или да " "[регистрирате](%%action.register%%) нова сметка. Ако веќе имате сметка на " -"[компатибилна веб-страница за микроблогирање](%%doc.openmublog%%), внесете " -"го URL-то на Вашиот профил подолу." +"[усогласиво мреж. место за микроблогирање](%%doc.openmublog%%), внесете го " +"URL-то на Вашиот профил подолу." #: actions/remotesubscribe.php:112 msgid "Remote subscribe" @@ -3459,7 +3458,7 @@ msgstr "URL на профилот" #: actions/remotesubscribe.php:134 msgid "URL of your profile on another compatible microblogging service" -msgstr "URL на Вашиот профил на друга компатибилна служба за микроблогирање." +msgstr "URL на Вашиот профил на друга соодветна служба за микроблогирање." #: actions/remotesubscribe.php:137 lib/subscribeform.php:139 #: lib/userprofile.php:406 @@ -3568,7 +3567,7 @@ msgstr "Одговори на %1$s на %2$s!" #: actions/revokerole.php:75 msgid "You cannot revoke user roles on this site." -msgstr "На оваа веб-страница не можете да одземате кориснички улоги." +msgstr "На ова мрежно место не можете да одземате кориснички улоги." #: actions/revokerole.php:82 msgid "User doesn't have this role." @@ -3580,7 +3579,7 @@ msgstr "StatusNet" #: actions/sandbox.php:65 actions/unsandbox.php:65 msgid "You cannot sandbox users on this site." -msgstr "Не можете да ставате корисници во песочен режим на оваа веб-страница." +msgstr "Не можете да ставате корисници во песочен режим на ова мрежно место." #: actions/sandbox.php:72 msgid "User is already sandboxed." @@ -3594,7 +3593,7 @@ msgstr "Сесии" #: actions/sessionsadminpanel.php:65 msgid "Session settings for this StatusNet site." -msgstr "Нагодувања на сесиите за оваа StatusNet веб-страница." +msgstr "Нагодувања на сесиите за оваа StatusNet-мрежно место." #: actions/sessionsadminpanel.php:175 msgid "Handle sessions" @@ -3615,7 +3614,7 @@ msgstr "Вклучи извод од поправка на грешки за с #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292 #: actions/useradminpanel.php:294 msgid "Save site settings" -msgstr "Зачувај нагодувања на веб-страницата" +msgstr "Зачувај нагодувања на мреж. место" #: actions/showapplication.php:82 msgid "You must be logged in to view an application." @@ -3839,8 +3838,8 @@ msgid "" "their life and interests. [Join now](%%%%action.register%%%%) to become part " "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -"**%s** е корисничка група на %%%%site.name%%%%, веб-страница за " -"[микроблогирање](http://mk.wikipedia.org/wiki/Микроблогирање) базирана на " +"**%s** е корисничка група на %%%%site.name%%%%, мрежно место за " +"[микроблогирање](http://mk.wikipedia.org/wiki/Микроблогирање) заснована на " "слободната програмска алатка [StatusNet](http://status.net/). Нејзините " "членови си разменуваат кратки пораки за нивниот живот и интереси. [Зачленете " "се](%%%%action.register%%%%) за да станете дел од оваа група и многу повеќе! " @@ -3854,8 +3853,8 @@ msgid "" "[StatusNet](http://status.net/) tool. Its members share short messages about " "their life and interests. " msgstr "" -"**%s** е корисничка група на %%%%site.name%%%%, веб-страница за " -"[микроблогирање](http://mk.wikipedia.org/wiki/Микроблогирање) базирана на " +"**%s** е корисничка група на %%%%site.name%%%%, мрежно место за " +"[микроблогирање](http://mk.wikipedia.org/wiki/Микроблогирање) заснована на " "слободната програмска алатка [StatusNet](http://status.net/). Нејзините " "членови си разменуваат кратки пораки за нивниот живот и интереси. " @@ -3950,8 +3949,8 @@ msgid "" "[StatusNet](http://status.net/) tool. [Join now](%%%%action.register%%%%) to " "follow **%s**'s notices and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -"**%s** има сметка на %%%%site.name%%%%, веб-страница за [микроблогирање]" -"(http://mk.wikipedia.org/wiki/Микроблогирање) базирана на слободната " +"**%s** има сметка на %%%%site.name%%%%, мрежно место за [микроблогирање]" +"(http://mk.wikipedia.org/wiki/Микроблогирање) заснована на слободната " "програмска алатка [StatusNet](http://status.net/). [Зачленете се](%%%%action." "register%%%%) за да можете да ги следите забелешките на **%s** и многу " "повеќе! ([Прочитајте повеќе](%%%%doc.help%%%%))" @@ -3963,8 +3962,8 @@ msgid "" "wikipedia.org/wiki/Micro-blogging) service based on the Free Software " "[StatusNet](http://status.net/) tool. " msgstr "" -"**%s** има сметка на %%%%site.name%%%%, веб-страница за [микроблогирање]" -"(http://mk.wikipedia.org/wiki/Микроблогирање) базирана на слободната " +"**%s** има сметка на %%%%site.name%%%%, мрежно место за [микроблогирање]" +"(http://mk.wikipedia.org/wiki/Микроблогирање) заснована на слободната " "програмска алатка [StatusNet](http://status.net/). " #: actions/showstream.php:305 @@ -3974,7 +3973,7 @@ msgstr "Повторувања на %s" #: actions/silence.php:65 actions/unsilence.php:65 msgid "You cannot silence users on this site." -msgstr "Не можете да замолчувате корисници на оваа веб-страница." +msgstr "Не можете да замолчувате корисници на ова мрежно место." #: actions/silence.php:72 msgid "User is already silenced." @@ -3982,11 +3981,11 @@ msgstr "Корисникот е веќе замолчен." #: actions/siteadminpanel.php:69 msgid "Basic settings for this StatusNet site" -msgstr "Основни поставки за оваа StatusNet веб-страница." +msgstr "Основни поставки за оваа StatusNet-мрежно место." #: actions/siteadminpanel.php:133 msgid "Site name must have non-zero length." -msgstr "Должината на името на веб-страницата не може да изнесува нула." +msgstr "Должината на името на мрежното место не може да изнесува нула." #: actions/siteadminpanel.php:141 msgid "You must have a valid contact email address." @@ -4011,11 +4010,11 @@ msgstr "Општи" #: actions/siteadminpanel.php:224 msgid "Site name" -msgstr "Име на веб-страницата" +msgstr "Име на мрежното место" #: actions/siteadminpanel.php:225 msgid "The name of your site, like \"Yourcompany Microblog\"" -msgstr "Името на Вашата веб-страница, како на пр. „Микроблог на Вашафирма“" +msgstr "Името на Вашето мрежно место, како на пр. „Микроблог на Вашафирма“" #: actions/siteadminpanel.php:229 msgid "Brought by" @@ -4039,7 +4038,7 @@ msgstr "" #: actions/siteadminpanel.php:239 msgid "Contact email address for your site" -msgstr "Контактна е-пошта за Вашата веб-страница" +msgstr "Контактна е-пошта за Вашето мрежното место" #: actions/siteadminpanel.php:245 msgid "Local" @@ -4051,7 +4050,7 @@ msgstr "Основна часовна зона" #: actions/siteadminpanel.php:257 msgid "Default timezone for the site; usually UTC." -msgstr "Матична часовна зона за веб-страницата; обично UTC." +msgstr "Матична часовна зона за мрежното место; обично UTC." #: actions/siteadminpanel.php:262 msgid "Default language" @@ -4059,9 +4058,7 @@ msgstr "Основен јазик" #: actions/siteadminpanel.php:263 msgid "Site language when autodetection from browser settings is not available" -msgstr "" -"Јазик на мрежното место (веб-страницата) ако прелистувачот не може да го " -"препознае сам" +msgstr "Јазик на мрежното место ако прелистувачот не може да го препознае сам" #: actions/siteadminpanel.php:271 msgid "Limits" @@ -4091,24 +4088,24 @@ msgstr "Објава на страница" #: actions/sitenoticeadminpanel.php:67 msgid "Edit site-wide message" -msgstr "Уреди објава за цела веб-страница" +msgstr "Уреди објава за цело мрежно место" #: actions/sitenoticeadminpanel.php:103 msgid "Unable to save site notice." -msgstr "Не можам да ја зачувам објавата за веб-страницата." +msgstr "Не можам да ја зачувам објавата за мрежното место." #: actions/sitenoticeadminpanel.php:113 msgid "Max length for the site-wide notice is 255 chars." -msgstr "Објавата за цела веб-страница не треба да содржи повеќе од 255 знаци." +msgstr "Објавата за цело мрежно место не треба да содржи повеќе од 255 знаци." #: actions/sitenoticeadminpanel.php:176 msgid "Site notice text" -msgstr "Текст на објавата за веб-страницата" +msgstr "Текст на објавата за мрежното место" #: actions/sitenoticeadminpanel.php:178 msgid "Site-wide notice text (255 chars max; HTML okay)" msgstr "" -"Текст за главна објава по цела веб-страница (највеќе до 255 знаци; дозволено " +"Текст за главна објава по цело мрежно место (највеќе до 255 знаци; дозволено " "и HTML)" #: actions/sitenoticeadminpanel.php:198 @@ -4539,8 +4536,8 @@ msgstr "Претплатата е откажана" msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -"Лиценцата на потокот на следачот „%1$s“ не е компатибилна со лиценцата на " -"веб-страницата „%2$s“." +"Лиценцата на каналот на следачот „%1$s“ не е соодветна на лиценцата на " +"мрежното место „%2$s“." #. TRANS: User admin panel title #: actions/useradminpanel.php:59 @@ -4550,7 +4547,7 @@ msgstr "Корисник" #: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." -msgstr "Кориснички нагодувања за оваа StatusNet веб-страница." +msgstr "Кориснички нагодувања за ова StatusNet-мрежно место." #: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." @@ -4661,7 +4658,7 @@ msgid "" "subscription. Your subscription token is:" msgstr "" "Претплатата е одобрена, но не е зададена обратна URL-адреса. Проверете ги " -"инструкциите на веб-страницата за да дознаете како се одобрува претплата. " +"инструкциите на мрежното место за да дознаете како се одобрува претплата. " "Жетонот на Вашата претплата е:" #: actions/userauthorization.php:266 @@ -4675,7 +4672,7 @@ msgid "" "subscription." msgstr "" "Претплатата е одбиена, но не е зададена обратна URL-адреса. Проверете ги " -"инструкциите на веб-страницата за да дознаете како се одбива претплата во " +"инструкциите на мрежното место за да дознаете како се одбива претплата во " "потполност." #: actions/userauthorization.php:303 @@ -4773,7 +4770,7 @@ msgid "" "This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, " "Inc. and contributors." msgstr "" -"Оваа веб-страница работи на %1$s верзија %2$s, Авторски права 2008-2010 " +"Ова мрежно место работи на %1$s верзија %2$s, Авторски права 2008-2010 " "StatusNet, Inc. и учесници." #: actions/version.php:163 @@ -4910,7 +4907,7 @@ msgstr "" #: classes/Notice.php:272 msgid "You are banned from posting notices on this site." -msgstr "Забрането Ви е да објавувате забелешки на оваа веб-страница." +msgstr "Забрането Ви е да објавувате забелешки на ова мрежно место." #: classes/Notice.php:338 classes/Notice.php:364 msgid "Problem saving notice." @@ -5061,7 +5058,7 @@ msgstr "Поврзи се" #: lib/action.php:458 msgctxt "TOOLTIP" msgid "Change site configuration" -msgstr "Промена на поставките на веб-страницата" +msgstr "Промена на поставките на мрежното место" #. TRANS: Main menu option when logged in and site admin for access to site configuration #: lib/action.php:461 @@ -5143,7 +5140,7 @@ msgstr "Барај" #. TRANS: Menu item for site administration #: lib/action.php:525 lib/adminpanelaction.php:400 msgid "Site notice" -msgstr "Напомена за веб-страницата" +msgstr "Напомена за мрежното место" #. TRANS: DT element for local views block. String is hidden in default CSS. #: lib/action.php:592 @@ -5235,7 +5232,7 @@ msgstr "" #. TRANS: DT element for StatusNet site content license. #: lib/action.php:850 msgid "Site content license" -msgstr "Лиценца на содржините на веб-страницата" +msgstr "Лиценца на содржините на мрежното место" #. TRANS: Content license displayed when license is set to 'private'. #. TRANS: %1$s is the site name. @@ -5303,7 +5300,7 @@ msgstr "Сè уште не е достапна обработката на вм #. TRANS: Client error message thrown when a user tries to change admin settings but has no access rights. #: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." -msgstr "Не можете да ја менувате оваа веб-страница." +msgstr "Не можете да врште измени на ова мрежно место." #. TRANS: Client error message throw when a certain panel's settings cannot be changed. #: lib/adminpanelaction.php:110 @@ -5329,13 +5326,13 @@ msgstr "Не можам да ги избришам нагодувањата за #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:350 msgid "Basic site configuration" -msgstr "Основни нагодувања на веб-страницата" +msgstr "Основни нагодувања на мрежното место" #. TRANS: Menu item for site administration #: lib/adminpanelaction.php:352 msgctxt "MENU" msgid "Site" -msgstr "Веб-страница" +msgstr "Мреж. место" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:358 @@ -5376,7 +5373,7 @@ msgstr "Конфигурација на сесиите" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:398 msgid "Edit site notice" -msgstr "Уреди објава за веб-страницата" +msgstr "Уреди објава за мрежното место" #. TRANS: Menu item title/tooltip #: lib/adminpanelaction.php:406 @@ -6792,7 +6789,7 @@ msgstr "Стави го корисников во песочен режим" #: lib/searchaction.php:120 msgid "Search site" -msgstr "Пребарај по веб-страницата" +msgstr "Пребарај по мрежното место" #: lib/searchaction.php:126 msgid "Keyword(s)" @@ -6812,7 +6809,7 @@ msgstr "Луѓе" #: lib/searchgroupnav.php:81 msgid "Find people on this site" -msgstr "Пронајдете луѓе на оваа веб-страница" +msgstr "Пронајдете луѓе на ова мрежно место" #: lib/searchgroupnav.php:83 msgid "Find content of notices" @@ -6820,7 +6817,7 @@ msgstr "Пронајдете содржини на забелешките" #: lib/searchgroupnav.php:85 msgid "Find groups on this site" -msgstr "Пронајдете групи на оваа веб-страница" +msgstr "Пронајдете групи на ова мрежно место" #: lib/section.php:89 msgid "Untitled section" @@ -6879,47 +6876,48 @@ msgstr "Без ознаки" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." msgstr "" +"Опслужувачот не може да се справи со подигања на изгледи без ZIP-поддршка." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Системска грешка при подигањето на податотеката." +msgstr "Подигањето на мотивот недостасува или не успеа." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Подновата на аватарот не успеа." +msgstr "Зачувувањето на мотивот не успеа." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Неважечки изглед: лош состав на папката." #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"Подигнатиот изглед е преголем; мора да биде помал од %d бајти (незбиен)." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "Неважечки архив за изглеедот: недостасува податотеката css/display.css" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"Изгледот содржи неважечки назив на податотека или папка. Дозволени се само " +"ASCII-букви, бројки, долна црта и знак за минус." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." -msgstr "" +msgstr "Изгледот содржи податотека од типот „.%s“, која не е дозволена." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Грешка во подновувањето на далечинскиот профил." +msgstr "Грешка при отворањето на архивот за мотив." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/nb/LC_MESSAGES/statusnet.po b/locale/nb/LC_MESSAGES/statusnet.po index ffe7599e2..112ca76c8 100644 --- a/locale/nb/LC_MESSAGES/statusnet.po +++ b/locale/nb/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:35+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:30+0000\n" "Language-Team: Norwegian (bokmål)‬\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: no\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/nl/LC_MESSAGES/statusnet.po b/locale/nl/LC_MESSAGES/statusnet.po index bb16ff60a..a69a7c7ea 100644 --- a/locale/nl/LC_MESSAGES/statusnet.po +++ b/locale/nl/LC_MESSAGES/statusnet.po @@ -11,11 +11,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:48+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:39+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: out-statusnet\n" @@ -1143,13 +1143,12 @@ msgid "Theme for the site." msgstr "Mogelijke vormgevingen voor deze website." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Vormgeving website" +msgstr "Aangepaste vormgeving" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "U kunt een vormgeving voor StatusNet uploaden als ZIP-archief." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1209,11 +1208,11 @@ msgstr "Verwijzingen" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Uitgebreid" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "Aangepaste CSS" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -6928,48 +6927,54 @@ msgstr "Geen" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." msgstr "" +"Deze server kan niet overweg met uploads van vormgevingsbestanden zonder ZIP-" +"ondersteuning." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Er is een systeemfout opgetreden tijdens het uploaden van het bestand." +msgstr "Het uploaden van het bestand met de vormgeving is mislukt." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Het bijwerken van de avatar is mislukt." +msgstr "Het opslaan van de vormgeving is mislukt." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Ongeldige vormgeving: de mappenstructuur is onjuist." #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"De toegevoegde vormgeving is te groot. Deze moet uitgepakt kleiner zijn dan %" +"d bytes." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" msgstr "" +"Ongeldig bestand met vormgeving: het bestand display.css is niet aanwezig" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"De vormgeving bevat een ongeldige bestandsnaam of mapnaam. Gebruik alleen " +"maar ASCII-letters, getallen, liggende streepjes en het minteken." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." msgstr "" +"De vormgeving bevat een bestand van het type \".%s\". Dit is niet toegestaan." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." msgstr "" -"Er is een fout opgetreden tijdens het bijwerken van het profiel op afstand." +"Er is een fout opgetreden tijdens het openen van het archiefbestand met de " +"vormgeving." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/nn/LC_MESSAGES/statusnet.po b/locale/nn/LC_MESSAGES/statusnet.po index 6de6133b6..dc166d820 100644 --- a/locale/nn/LC_MESSAGES/statusnet.po +++ b/locale/nn/LC_MESSAGES/statusnet.po @@ -9,11 +9,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:43+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:35+0000\n" "Language-Team: Norwegian Nynorsk\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nn\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/pl/LC_MESSAGES/statusnet.po b/locale/pl/LC_MESSAGES/statusnet.po index cdeecc434..95146156b 100644 --- a/locale/pl/LC_MESSAGES/statusnet.po +++ b/locale/pl/LC_MESSAGES/statusnet.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:52+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:44+0000\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pl\n" "X-Message-Group: out-statusnet\n" @@ -1128,13 +1128,12 @@ msgid "Theme for the site." msgstr "Motyw witryny." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Motyw witryny" +msgstr "Własny motyw" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "Można wysłać własny motyw witryny StatusNet jako archiwum zip." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1192,11 +1191,11 @@ msgstr "Odnośniki" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Zaawansowane" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "Własny plik CSS" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -6848,47 +6847,49 @@ msgstr "Brak" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." msgstr "" +"Ten serwer nie może obsługiwać wysyłania motywu bez obsługi archiwów zip." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Błąd systemu podczas wysyłania pliku." +msgstr "Brak wysłania motywu lub nie powiodło się." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Zaktualizowanie awatara nie powiodło się." +msgstr "Zapisanie motywu nie powiodło się." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Nieprawidłowy motyw: błędna struktura katalogów." #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"Wysłany motyw jest za duży, musi być mniejszy niż %d bajtów po " +"zdekompresowaniu." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "Nieprawidłowe archiwum motywu: brak pliku css/display.css" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"Motyw zawiera nieprawidłowy plik lub nazwę katalogu. Należy używać tylko " +"liter, cyfr, podkreślników i znaku minus z zestawu ASCII." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." -msgstr "" +msgstr "Motyw zawiera plik typu \\\".%s\\\", który nie jest dozwolony." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Błąd podczas aktualizowania zdalnego profilu." +msgstr "Błąd podczas otwierania archiwum motywu." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/pt/LC_MESSAGES/statusnet.po b/locale/pt/LC_MESSAGES/statusnet.po index 36abe62ca..d2b2720bb 100644 --- a/locale/pt/LC_MESSAGES/statusnet.po +++ b/locale/pt/LC_MESSAGES/statusnet.po @@ -1,6 +1,7 @@ # Translation of StatusNet to Portuguese # # Author@translatewiki.net: Gallaecio +# Author@translatewiki.net: Giro720 # Author@translatewiki.net: Hamilton Abreu # Author@translatewiki.net: Ipublicis # -- @@ -11,11 +12,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:20:57+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:48+0000\n" "Language-Team: Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt\n" "X-Message-Group: out-statusnet\n" @@ -1183,7 +1184,7 @@ msgstr "Texto" #: actions/designadminpanel.php:626 lib/designsettings.php:230 msgid "Links" -msgstr "Ligações" +msgstr "Links" #: actions/designadminpanel.php:651 msgid "Advanced" @@ -6683,7 +6684,7 @@ msgstr "Todos os subscritores" #: lib/profileaction.php:191 msgid "User ID" -msgstr "ID do utilizador" +msgstr "Número de identificação" #: lib/profileaction.php:196 msgid "Member since" diff --git a/locale/pt_BR/LC_MESSAGES/statusnet.po b/locale/pt_BR/LC_MESSAGES/statusnet.po index 1f5fc708e..a12a309f3 100644 --- a/locale/pt_BR/LC_MESSAGES/statusnet.po +++ b/locale/pt_BR/LC_MESSAGES/statusnet.po @@ -13,11 +13,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:21:01+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:52+0000\n" "Language-Team: Brazilian Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt-br\n" "X-Message-Group: out-statusnet\n" @@ -1136,13 +1136,14 @@ msgid "Theme for the site." msgstr "Tema para o site." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Tema do site" +msgstr "Tema personalizado" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." msgstr "" +"Você pode enviar um tema personalizado para o StatusNet, na forma de um " +"arquivo .zip." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1202,11 +1203,11 @@ msgstr "Links" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Avançado" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "CSS personalizado" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" diff --git a/locale/ru/LC_MESSAGES/statusnet.po b/locale/ru/LC_MESSAGES/statusnet.po index b431ddd62..d276b197a 100644 --- a/locale/ru/LC_MESSAGES/statusnet.po +++ b/locale/ru/LC_MESSAGES/statusnet.po @@ -13,11 +13,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:21:06+0000\n" +"PO-Revision-Date: 2010-06-21 18:04:57+0000\n" "Language-Team: Russian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: out-statusnet\n" @@ -1134,13 +1134,12 @@ msgid "Theme for the site." msgstr "Тема для сайта." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Тема сайта" +msgstr "Особая тема" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "Вы можете загрузить особую тему StatusNet в виде ZIP-архива." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1200,11 +1199,11 @@ msgstr "Ссылки" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Расширенный" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "Особый CSS" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -4628,7 +4627,7 @@ msgstr "Принять" #: actions/userauthorization.php:218 lib/subscribeform.php:115 #: lib/subscribeform.php:139 msgid "Subscribe to this user" -msgstr "Подписаться на %s" +msgstr "Подписаться на этого пользователя" #: actions/userauthorization.php:219 msgid "Reject" @@ -6862,48 +6861,49 @@ msgstr "Нет тегов" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." -msgstr "" +msgstr "Этот сервер не может обработать загруженные темы без поддержки ZIP." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Системная ошибка при загрузке файла." +msgstr "Ошибка при загрузке файла темы." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Неудача при обновлении аватары." +msgstr "Ошибка при сохранении темы." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Ошибочная тема. Плохая структура директорий." #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"Размер загруженной темы слишком велик, в распакованном виде она должна " +"занимать не более %d байт." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "Недопустимый архив: темы. Отсутствует файл css/display.css" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"Тема содержит недопустимое имя файла или папки. Допустимы буквы ASCII, " +"цифры, подчеркивание и знак минуса." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." -msgstr "" +msgstr "Тема содержит файл недопустимого типа «.%s»." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Ошибка обновления удалённого профиля." +msgstr "Ошибка открытия архива темы." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/statusnet.pot b/locale/statusnet.pot index b95f5f42f..6661aba7b 100644 --- a/locale/statusnet.pot +++ b/locale/statusnet.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-16 22:18+0000\n" +"POT-Creation-Date: 2010-06-21 18:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locale/sv/LC_MESSAGES/statusnet.po b/locale/sv/LC_MESSAGES/statusnet.po index 40c357d00..5d8461ca0 100644 --- a/locale/sv/LC_MESSAGES/statusnet.po +++ b/locale/sv/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:21:15+0000\n" +"PO-Revision-Date: 2010-06-21 18:05:03+0000\n" "Language-Team: Swedish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: sv\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/te/LC_MESSAGES/statusnet.po b/locale/te/LC_MESSAGES/statusnet.po index 96a7bb818..c5d30c58a 100644 --- a/locale/te/LC_MESSAGES/statusnet.po +++ b/locale/te/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:21:20+0000\n" +"PO-Revision-Date: 2010-06-21 18:05:08+0000\n" "Language-Team: Telugu\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: te\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/tr/LC_MESSAGES/statusnet.po b/locale/tr/LC_MESSAGES/statusnet.po index 08f281cd3..8f59d8476 100644 --- a/locale/tr/LC_MESSAGES/statusnet.po +++ b/locale/tr/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:21:25+0000\n" +"PO-Revision-Date: 2010-06-21 18:05:12+0000\n" "Language-Team: Turkish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: tr\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/uk/LC_MESSAGES/statusnet.po b/locale/uk/LC_MESSAGES/statusnet.po index 4db4c94a0..93ef6b48a 100644 --- a/locale/uk/LC_MESSAGES/statusnet.po +++ b/locale/uk/LC_MESSAGES/statusnet.po @@ -12,11 +12,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:21:32+0000\n" +"PO-Revision-Date: 2010-06-21 18:05:17+0000\n" "Language-Team: Ukrainian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: out-statusnet\n" @@ -940,7 +940,7 @@ msgstr "Невизначений тип адреси %s." #. TRANS: Client error for an already confirmed email/jabbel/sms address. #: actions/confirmaddress.php:96 msgid "That address has already been confirmed." -msgstr "Цю адресу вже було підтверджено." +msgstr "Цю адресу вже підтверджено." #. TRANS: Server error thrown on database error updating e-mail preferences. #. TRANS: Server error thrown on database error removing a registered e-mail address. @@ -970,7 +970,7 @@ msgstr "Підтвердити адресу" #: actions/confirmaddress.php:161 #, php-format msgid "The address \"%s\" has been confirmed for your account." -msgstr "Адресу «%s» було підтверджено для Вашого акаунту." +msgstr "Адресу «%s» підтверджено для Вашого акаунту." #: actions/conversation.php:99 msgid "Conversation" @@ -1129,13 +1129,12 @@ msgid "Theme for the site." msgstr "Тема для цього сайту." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Тема сайту" +msgstr "Своя тема" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "Ви можете завантажити свою тему для сайту StatusNet як .ZIP архів." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -1195,11 +1194,11 @@ msgstr "Посилання" #: actions/designadminpanel.php:651 msgid "Advanced" -msgstr "" +msgstr "Додатково" #: actions/designadminpanel.php:655 msgid "Custom CSS" -msgstr "" +msgstr "Свій CSS" #: actions/designadminpanel.php:676 lib/designsettings.php:247 msgid "Use defaults" @@ -6844,48 +6843,49 @@ msgstr "Пусто" #: lib/themeuploader.php:50 msgid "This server cannot handle theme uploads without ZIP support." -msgstr "" +msgstr "Цей сервер не може опрацювати завантаження теми без підтримки ZIP." #: lib/themeuploader.php:58 lib/themeuploader.php:61 -#, fuzzy msgid "Theme upload missing or failed." -msgstr "Система відповіла помилкою при завантаженні цього файла." +msgstr "Завантажити тему не вдалося або процес завантаження перервано." #: lib/themeuploader.php:91 lib/themeuploader.php:102 #: lib/themeuploader.php:253 lib/themeuploader.php:257 #: lib/themeuploader.php:265 lib/themeuploader.php:272 -#, fuzzy msgid "Failed saving theme." -msgstr "Оновлення аватари невдале." +msgstr "Помилка при збереженні теми." #: lib/themeuploader.php:139 msgid "Invalid theme: bad directory structure." -msgstr "" +msgstr "Невірна тема: хибна структура каталогів." #: lib/themeuploader.php:166 #, php-format msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." msgstr "" +"Тема, що її було завантажено, надто велика; без компресії розмір має " +"становити менше ніж %d байтів." #: lib/themeuploader.php:178 msgid "Invalid theme archive: missing file css/display.css" -msgstr "" +msgstr "В архіві з темою є помилка: відсутній файл css/display.css" #: lib/themeuploader.php:205 msgid "" "Theme contains invalid file or folder name. Stick with ASCII letters, " "digits, underscore, and minus sign." msgstr "" +"Тема містить неприпустиме ім’я файлу або теки. Використовуйте літери " +"стандарту ASCII, цифри, знаки підкреслення та мінусу." #: lib/themeuploader.php:216 #, php-format msgid "Theme contains file of type '.%s', which is not allowed." -msgstr "" +msgstr "Тема містить файл типу «.%s», який є неприпустимим." #: lib/themeuploader.php:234 -#, fuzzy msgid "Error opening theme archive." -msgstr "Помилка при оновленні віддаленого профілю." +msgstr "Помилка при відкритті архіву з темою." #: lib/topposterssection.php:74 msgid "Top posters" diff --git a/locale/vi/LC_MESSAGES/statusnet.po b/locale/vi/LC_MESSAGES/statusnet.po index 5f2df5bb8..cc5899b9e 100644 --- a/locale/vi/LC_MESSAGES/statusnet.po +++ b/locale/vi/LC_MESSAGES/statusnet.po @@ -8,11 +8,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:21:37+0000\n" +"PO-Revision-Date: 2010-06-21 18:05:22+0000\n" "Language-Team: Vietnamese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: vi\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/zh_CN/LC_MESSAGES/statusnet.po b/locale/zh_CN/LC_MESSAGES/statusnet.po index bd27f2a18..d9afdf9e9 100644 --- a/locale/zh_CN/LC_MESSAGES/statusnet.po +++ b/locale/zh_CN/LC_MESSAGES/statusnet.po @@ -11,11 +11,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:21:41+0000\n" +"PO-Revision-Date: 2010-06-21 18:05:26+0000\n" "Language-Team: Simplified Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hans\n" "X-Message-Group: out-statusnet\n" diff --git a/locale/zh_TW/LC_MESSAGES/statusnet.po b/locale/zh_TW/LC_MESSAGES/statusnet.po index a5613b3ac..e002fd55d 100644 --- a/locale/zh_TW/LC_MESSAGES/statusnet.po +++ b/locale/zh_TW/LC_MESSAGES/statusnet.po @@ -8,11 +8,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-16 22:18+0000\n" -"PO-Revision-Date: 2010-06-16 22:21:46+0000\n" +"PO-Revision-Date: 2010-06-21 18:05:30+0000\n" "Language-Team: Traditional Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r68131); Translate extension (2010-06-12)\n" +"X-Generator: MediaWiki 1.17alpha (r68367); Translate extension (2010-06-12)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hant\n" "X-Message-Group: out-statusnet\n" -- cgit v1.2.3 From 87125a1395ed4bf8660e2ba47645835b9d1f4acf Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 21 Jun 2010 20:15:26 +0200 Subject: Improve error message per discussion on http://translatewiki.net/wiki/Thread:Support/Unclear_message. Spotted by Peter17 and changed per suggestion of McDutchie with approval of Brion. --- lib/themeuploader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/themeuploader.php b/lib/themeuploader.php index 18ef8c4d1..370965db0 100644 --- a/lib/themeuploader.php +++ b/lib/themeuploader.php @@ -55,10 +55,10 @@ class ThemeUploader public static function fromUpload($name) { if (!isset($_FILES[$name]['error'])) { - throw new ServerException(_("Theme upload missing or failed.")); + throw new ServerException(_("The theme file is missing or the upload failed.")); } if ($_FILES[$name]['error'] != UPLOAD_ERR_OK) { - throw new ServerException(_("Theme upload missing or failed.")); + throw new ServerException(_("The theme file is missing or the upload failed.")); } return new ThemeUploader($_FILES[$name]['tmp_name']); } -- cgit v1.2.3 From b59aba9543b46c4d9e31dbff2c490a9b03539abe Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 21 Jun 2010 20:17:32 +0200 Subject: Update pot file. --- locale/statusnet.pot | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/statusnet.pot b/locale/statusnet.pot index 6661aba7b..c81149288 100644 --- a/locale/statusnet.pot +++ b/locale/statusnet.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-21 18:02+0000\n" +"POT-Creation-Date: 2010-06-21 18:15+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -6396,7 +6396,7 @@ msgid "This server cannot handle theme uploads without ZIP support." msgstr "" #: lib/themeuploader.php:58 lib/themeuploader.php:61 -msgid "Theme upload missing or failed." +msgid "The theme file is missing or the upload failed." msgstr "" #: lib/themeuploader.php:91 lib/themeuploader.php:102 -- cgit v1.2.3 From 1eec7f779fc85b530907ea31deceadb2a30d7614 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 22 Jun 2010 16:28:06 -0700 Subject: - Add profile_info tag to Atom author - Normalize xmlns:statusnet links in the API --- classes/Notice.php | 4 ++-- classes/Profile.php | 10 +++++++++- lib/apiaction.php | 2 ++ lib/atomnoticefeed.php | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/classes/Notice.php b/classes/Notice.php index f8eda5777..c752e35a7 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1190,7 +1190,7 @@ class Notice extends Memcached_DataObject 'xmlns:media' => 'http://purl.org/syndication/atommedia', 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0', 'xmlns:ostatus' => 'http://ostatus.org/schema/1.0', - 'xmlns:statusnet' => 'http://status.net/ont/'); + 'xmlns:statusnet' => 'http://status.net/schema/api/1/'); } else { $attrs = array(); } @@ -1225,7 +1225,7 @@ class Notice extends Memcached_DataObject $xs->element('title', null, common_xml_safe_str($this->content)); if ($author) { - $xs->raw($profile->asAtomAuthor()); + $xs->raw($profile->asAtomAuthor($cur)); $xs->raw($profile->asActivityActor()); } diff --git a/classes/Profile.php b/classes/Profile.php index 54f557ea7..a303469e9 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -849,15 +849,23 @@ class Profile extends Memcached_DataObject * * Assumes that Atom has been previously set up as the base namespace. * + * @param Profile $cur the current authenticated user + * * @return string */ - function asAtomAuthor() + function asAtomAuthor($cur = null) { $xs = new XMLStringer(true); $xs->elementStart('author'); $xs->element('name', null, $this->nickname); $xs->element('uri', null, $this->getUri()); + if ($cur != null) { + $attrs = Array(); + $attrs['following'] = $cur->isSubscribed($this) ? 'true' : 'false'; + $attrs['blocking'] = $cur->hasBlocked($this) ? 'true' : 'false'; + $xs->element('statusnet:profile_info', $attrs, null); + } $xs->elementEnd('author'); return $xs->getString(); diff --git a/lib/apiaction.php b/lib/apiaction.php index 7cc473d51..226481778 100644 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -208,11 +208,13 @@ class ApiAction extends Action // Is the requesting user following this user? $twitter_user['following'] = false; + $twitter_user['statusnet:blocking'] = false; $twitter_user['notifications'] = false; if (isset($this->auth_user)) { $twitter_user['following'] = $this->auth_user->isSubscribed($profile); + $twitter_user['statusnet:blocking'] = $this->auth_user->hasBlocked($profile); // Notifications on? $sub = Subscription::pkeyGet(array('subscriber' => diff --git a/lib/atomnoticefeed.php b/lib/atomnoticefeed.php index ef44de4b6..6ed803ce4 100644 --- a/lib/atomnoticefeed.php +++ b/lib/atomnoticefeed.php @@ -95,7 +95,7 @@ class AtomNoticeFeed extends Atom10Feed $this->addNamespace( 'statusnet', - 'http://status.net/ont/' + 'http://status.net/schema/api/1/' ); } -- cgit v1.2.3 From 72e486a3226c9101f33bd86f953dbb9650c19fd1 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 23 Jun 2010 11:29:13 -0700 Subject: Fix for ticket http://status.net/open-source/issues/2380 "Autofocus shouldn't override scroll" -- Thanks @michaeltwofish! --- js/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/util.js b/js/util.js index 1320d11b4..29b33097b 100644 --- a/js/util.js +++ b/js/util.js @@ -84,7 +84,7 @@ var SN = { // StatusNet form.find('#'+SN.C.S.NoticeTextCount).text(jQuery.data(form[0], 'ElementData').MaxLength); } - if ($('body')[0].id != 'conversation' && window.location.hash.length === 0) { + if ($('body')[0].id != 'conversation' && window.location.hash.length === 0 && $(window).scrollTop() == 0) { form.find('textarea').focus(); } }, -- cgit v1.2.3 From a6408be566dc9877eb67c86d4283dd57b2255d8b Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 24 Jun 2010 15:21:04 +0000 Subject: Regression fix for Recaptcha on SSL registration page; their API is served on a different hostname for SSL. --- plugins/Recaptcha/RecaptchaPlugin.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/Recaptcha/RecaptchaPlugin.php b/plugins/Recaptcha/RecaptchaPlugin.php index f09d81ec0..7cc34c568 100644 --- a/plugins/Recaptcha/RecaptchaPlugin.php +++ b/plugins/Recaptcha/RecaptchaPlugin.php @@ -77,8 +77,11 @@ class RecaptchaPlugin extends Plugin { if (isset($action->recaptchaPluginNeedsOutput) && $action->recaptchaPluginNeedsOutput) { // Load the AJAX API - $proto = $this->checkssl() ? 'https' : 'http'; - $url = "$proto://api.recaptcha.net/js/recaptcha_ajax.js"; + if ($this->checkssl()) { + $url = "https://api-secure.recaptcha.net/js/recaptcha_ajax.js"; + } else { + $url = "http://api.recaptcha.net/js/recaptcha_ajax.js"; + } $action->script($url); // And when we're ready, fill out the captcha! -- cgit v1.2.3 From 9eb5a976b03fae6bd1e1fce6abfe4a6c7964d1ae Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 24 Jun 2010 18:11:50 -0700 Subject: Have API methods for search subclass ApiPrivateAuthAction --- actions/apisearchatom.php | 408 ++++++++++++++++++++++++++++++++++++++++++ actions/apisearchjson.php | 154 ++++++++++++++++ actions/apitrends.php | 90 ++++++++++ actions/twitapisearchatom.php | 402 ----------------------------------------- actions/twitapisearchjson.php | 151 ---------------- actions/twitapitrends.php | 88 --------- lib/router.php | 6 +- 7 files changed, 655 insertions(+), 644 deletions(-) create mode 100644 actions/apisearchatom.php create mode 100644 actions/apisearchjson.php create mode 100644 actions/apitrends.php delete mode 100644 actions/twitapisearchatom.php delete mode 100644 actions/twitapisearchjson.php delete mode 100644 actions/twitapitrends.php diff --git a/actions/apisearchatom.php b/actions/apisearchatom.php new file mode 100644 index 000000000..60bb8b040 --- /dev/null +++ b/actions/apisearchatom.php @@ -0,0 +1,408 @@ +. + * + * @category Search + * @package StatusNet + * @author Zach Copley + * @copyright 2008-2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/apiprivateauth.php'; + +/** + * Action for outputting search results in Twitter compatible Atom + * format. + * + * TODO: abstract Atom stuff into a ruseable base class like + * RSS10Action. + * + * @category Search + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + * + * @see ApiPrivateAuthAction + */ + +class ApiSearchAtomAction extends ApiPrivateAuthAction +{ + + var $cnt; + var $query; + var $lang; + var $rpp; + var $page; + var $since_id; + var $geocode; + + /** + * Constructor + * + * Just wraps the Action constructor. + * + * @param string $output URI to output to, default = stdout + * @param boolean $indent Whether to indent output, default true + * + * @see Action::__construct + */ + + function __construct($output='php://output', $indent=null) + { + parent::__construct($output, $indent); + } + + /** + * Do we need to write to the database? + * + * @return boolean true + */ + + function isReadonly() + { + return true; + } + + /** + * Read arguments and initialize members + * + * @param array $args Arguments from $_REQUEST + * + * @return boolean success + * + */ + + function prepare($args) + { + common_debug("in apisearchatom prepare()"); + + parent::prepare($args); + + + $this->query = $this->trimmed('q'); + $this->lang = $this->trimmed('lang'); + $this->rpp = $this->trimmed('rpp'); + + if (!$this->rpp) { + $this->rpp = 15; + } + + if ($this->rpp > 100) { + $this->rpp = 100; + } + + $this->page = $this->trimmed('page'); + + if (!$this->page) { + $this->page = 1; + } + + // TODO: Suppport since_id -- we need to tweak the backend + // Search classes to support it. + + $this->since_id = $this->trimmed('since_id'); + $this->geocode = $this->trimmed('geocode'); + + // TODO: Also, language and geocode + + return true; + } + + /** + * Handle a request + * + * @param array $args Arguments from $_REQUEST + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + common_debug("In apisearchatom handle()"); + $this->showAtom(); + } + + /** + * Get the notices to output as results. This also sets some class + * attrs so we can use them to calculate pagination, and output + * since_id and max_id. + * + * @return array an array of Notice objects sorted in reverse chron + */ + + function getNotices() + { + // TODO: Support search operators like from: and to:, boolean, etc. + + $notices = array(); + $notice = new Notice(); + + // lcase it for comparison + $q = strtolower($this->query); + + $search_engine = $notice->getSearchEngine('notice'); + $search_engine->set_sort_mode('chron'); + $search_engine->limit(($this->page - 1) * $this->rpp, + $this->rpp + 1, true); + if (false === $search_engine->query($q)) { + $this->cnt = 0; + } else { + $this->cnt = $notice->find(); + } + + $cnt = 0; + $this->max_id = 0; + + if ($this->cnt > 0) { + while ($notice->fetch()) { + + ++$cnt; + + if (!$this->max_id) { + $this->max_id = $notice->id; + } + + if ($cnt > $this->rpp) { + break; + } + + $notices[] = clone($notice); + } + } + + return $notices; + } + + /** + * Output search results as an Atom feed + * + * @return void + */ + + function showAtom() + { + $notices = $this->getNotices(); + + $this->initAtom(); + $this->showFeed(); + + foreach ($notices as $n) { + + $profile = $n->getProfile(); + + // Don't show notices from deleted users + + if (!empty($profile)) { + $this->showEntry($n); + } + } + + $this->endAtom(); + } + + /** + * Show feed specific Atom elements + * + * @return void + */ + + function showFeed() + { + // TODO: A9 OpenSearch stuff like search.twitter.com? + + $server = common_config('site', 'server'); + $sitename = common_config('site', 'name'); + + // XXX: Use xmlns:statusnet instead? + + $this->elementStart('feed', + array('xmlns' => 'http://www.w3.org/2005/Atom', + + // XXX: xmlns:twitter causes Atom validation to fail + // It's used for the source attr on notices + + 'xmlns:twitter' => 'http://api.twitter.com/', + 'xml:lang' => 'en-US')); // XXX Other locales ? + + $taguribase = TagURI::base(); + $this->element('id', null, "tag:$taguribase:search/$server"); + + $site_uri = common_path(false); + + $search_uri = $site_uri . 'api/search.atom?q=' . urlencode($this->query); + + if ($this->rpp != 15) { + $search_uri .= '&rpp=' . $this->rpp; + } + + // FIXME: this alternate link is not quite right because our + // web-based notice search doesn't support a rpp (responses per + // page) param yet + + $this->element('link', array('type' => 'text/html', + 'rel' => 'alternate', + 'href' => $site_uri . 'search/notice?q=' . + urlencode($this->query))); + + // self link + + $self_uri = $search_uri; + $self_uri .= ($this->page > 1) ? '&page=' . $this->page : ''; + + $this->element('link', array('type' => 'application/atom+xml', + 'rel' => 'self', + 'href' => $self_uri)); + + $this->element('title', null, "$this->query - $sitename Search"); + $this->element('updated', null, common_date_iso8601('now')); + + // XXX: The below "rel" links are not valid Atom, but it's what + // Twitter does... + + // refresh link + + $refresh_uri = $search_uri . "&since_id=" . $this->max_id; + + $this->element('link', array('type' => 'application/atom+xml', + 'rel' => 'refresh', + 'href' => $refresh_uri)); + + // pagination links + + if ($this->cnt > $this->rpp) { + + $next_uri = $search_uri . "&max_id=" . $this->max_id . + '&page=' . ($this->page + 1); + + $this->element('link', array('type' => 'application/atom+xml', + 'rel' => 'next', + 'href' => $next_uri)); + } + + if ($this->page > 1) { + + $previous_uri = $search_uri . "&max_id=" . $this->max_id . + '&page=' . ($this->page - 1); + + $this->element('link', array('type' => 'application/atom+xml', + 'rel' => 'previous', + 'href' => $previous_uri)); + } + + } + + /** + * Build an Atom entry similar to search.twitter.com's based on + * a given notice + * + * @param Notice $notice the notice to use + * + * @return void + */ + + function showEntry($notice) + { + $server = common_config('site', 'server'); + $profile = $notice->getProfile(); + $nurl = common_local_url('shownotice', array('notice' => $notice->id)); + + $this->elementStart('entry'); + + $taguribase = TagURI::base(); + + $this->element('id', null, "tag:$taguribase:$notice->id"); + $this->element('published', null, common_date_w3dtf($notice->created)); + $this->element('link', array('type' => 'text/html', + 'rel' => 'alternate', + 'href' => $nurl)); + $this->element('title', null, common_xml_safe_str(trim($notice->content))); + $this->element('content', array('type' => 'html'), $notice->rendered); + $this->element('updated', null, common_date_w3dtf($notice->created)); + $this->element('link', array('type' => 'image/png', + // XXX: Twitter uses rel="image" (not valid) + 'rel' => 'related', + 'href' => $profile->avatarUrl())); + + // @todo: Here is where we'd put in a link to an atom feed for threads + + $source = null; + + $ns = $notice->getSource(); + if ($ns) { + if (!empty($ns->name) && !empty($ns->url)) { + $source = '' + . htmlspecialchars($ns->name) + . ''; + } else { + $source = $ns->code; + } + } + + $this->element("twitter:source", null, $source); + + $this->elementStart('author'); + + $name = $profile->nickname; + + if ($profile->fullname) { + $name .= ' (' . $profile->fullname . ')'; + } + + $this->element('name', null, $name); + $this->element('uri', null, common_profile_uri($profile)); + $this->elementEnd('author'); + + $this->elementEnd('entry'); + } + + /** + * Initialize the Atom output, send headers + * + * @return void + */ + + function initAtom() + { + header('Content-Type: application/atom+xml; charset=utf-8'); + $this->startXml(); + } + + /** + * End the Atom feed + * + * @return void + */ + + function endAtom() + { + $this->elementEnd('feed'); + } + +} diff --git a/actions/apisearchjson.php b/actions/apisearchjson.php new file mode 100644 index 000000000..e44634684 --- /dev/null +++ b/actions/apisearchjson.php @@ -0,0 +1,154 @@ +. + * + * @category Search + * @package StatusNet + * @author Zach Copley + * @copyright 2008-2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/apiprivateauth.php'; +require_once INSTALLDIR.'/lib/jsonsearchresultslist.php'; + +/** + * Action handler for Twitter-compatible API search + * + * @category Search + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + * @see ApiAction + */ + +class ApiSearchJSONAction extends ApiPrivateAuthAction +{ + var $query; + var $lang; + var $rpp; + var $page; + var $since_id; + var $limit; + var $geocode; + + /** + * Initialization. + * + * @param array $args Web and URL arguments + * + * @return boolean true if nothing goes wrong + */ + + function prepare($args) + { + common_debug("apisearchjson prepare()"); + + parent::prepare($args); + + $this->query = $this->trimmed('q'); + $this->lang = $this->trimmed('lang'); + $this->rpp = $this->trimmed('rpp'); + + if (!$this->rpp) { + $this->rpp = 15; + } + + if ($this->rpp > 100) { + $this->rpp = 100; + } + + $this->page = $this->trimmed('page'); + + if (!$this->page) { + $this->page = 1; + } + + $this->since_id = $this->trimmed('since_id'); + $this->geocode = $this->trimmed('geocode'); + + return true; + } + + /** + * Handle a request + * + * @param array $args Arguments from $_REQUEST + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + $this->showResults(); + } + + /** + * Show search results + * + * @return void + */ + + function showResults() + { + + // TODO: Support search operators like from: and to:, boolean, etc. + + $notice = new Notice(); + + // lcase it for comparison + $q = strtolower($this->query); + + $search_engine = $notice->getSearchEngine('notice'); + $search_engine->set_sort_mode('chron'); + $search_engine->limit(($this->page - 1) * $this->rpp, $this->rpp + 1, true); + if (false === $search_engine->query($q)) { + $cnt = 0; + } else { + $cnt = $notice->find(); + } + + // TODO: since_id, lang, geocode + + $results = new JSONSearchResultsList($notice, $q, $this->rpp, $this->page); + + $this->initDocument('json'); + $results->show(); + $this->endDocument('json'); + } + + /** + * Do we need to write to the database? + * + * @return boolean true + */ + + function isReadOnly($args) + { + return true; + } +} diff --git a/actions/apitrends.php b/actions/apitrends.php new file mode 100644 index 000000000..5b74636c6 --- /dev/null +++ b/actions/apitrends.php @@ -0,0 +1,90 @@ +. + * + * @category Search + * @package StatusNet + * @author Zach Copley + * @copyright 2008-2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/apiprivateauth.php'; + +/** + * Returns the top ten queries that are currently trending + * + * @category Search + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + * + * @see ApiAction + */ + +class ApiTrendsAction extends ApiPrivateAuthAction +{ + + var $callback; + + /** + * Initialization. + * + * @param array $args Web and URL arguments + * + * @return boolean false if user doesn't exist + */ + function prepare($args) + { + parent::prepare($args); + return true; + } + + /** + * Handle a request + * + * @param array $args Arguments from $_REQUEST + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + $this->showTrends(); + } + + /** + * Output the trends + * + * @return void + */ + function showTrends() + { + $this->serverError(_('API method under construction.'), 501); + } + +} \ No newline at end of file diff --git a/actions/twitapisearchatom.php b/actions/twitapisearchatom.php deleted file mode 100644 index 51e8a8881..000000000 --- a/actions/twitapisearchatom.php +++ /dev/null @@ -1,402 +0,0 @@ -. - * - * @category Search - * @package StatusNet - * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -/** - * Action for outputting search results in Twitter compatible Atom - * format. - * - * TODO: abstract Atom stuff into a ruseable base class like - * RSS10Action. - * - * @category Search - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * - * @see ApiAction - */ - -class TwitapisearchatomAction extends ApiAction -{ - - var $cnt; - var $query; - var $lang; - var $rpp; - var $page; - var $since_id; - var $geocode; - - /** - * Constructor - * - * Just wraps the Action constructor. - * - * @param string $output URI to output to, default = stdout - * @param boolean $indent Whether to indent output, default true - * - * @see Action::__construct - */ - - function __construct($output='php://output', $indent=null) - { - parent::__construct($output, $indent); - } - - /** - * Do we need to write to the database? - * - * @return boolean true - */ - - function isReadonly() - { - return true; - } - - /** - * Read arguments and initialize members - * - * @param array $args Arguments from $_REQUEST - * - * @return boolean success - * - */ - - function prepare($args) - { - parent::prepare($args); - - $this->query = $this->trimmed('q'); - $this->lang = $this->trimmed('lang'); - $this->rpp = $this->trimmed('rpp'); - - if (!$this->rpp) { - $this->rpp = 15; - } - - if ($this->rpp > 100) { - $this->rpp = 100; - } - - $this->page = $this->trimmed('page'); - - if (!$this->page) { - $this->page = 1; - } - - // TODO: Suppport since_id -- we need to tweak the backend - // Search classes to support it. - - $this->since_id = $this->trimmed('since_id'); - $this->geocode = $this->trimmed('geocode'); - - // TODO: Also, language and geocode - - return true; - } - - /** - * Handle a request - * - * @param array $args Arguments from $_REQUEST - * - * @return void - */ - - function handle($args) - { - parent::handle($args); - $this->showAtom(); - } - - /** - * Get the notices to output as results. This also sets some class - * attrs so we can use them to calculate pagination, and output - * since_id and max_id. - * - * @return array an array of Notice objects sorted in reverse chron - */ - - function getNotices() - { - // TODO: Support search operators like from: and to:, boolean, etc. - - $notices = array(); - $notice = new Notice(); - - // lcase it for comparison - $q = strtolower($this->query); - - $search_engine = $notice->getSearchEngine('notice'); - $search_engine->set_sort_mode('chron'); - $search_engine->limit(($this->page - 1) * $this->rpp, - $this->rpp + 1, true); - if (false === $search_engine->query($q)) { - $this->cnt = 0; - } else { - $this->cnt = $notice->find(); - } - - $cnt = 0; - $this->max_id = 0; - - if ($this->cnt > 0) { - while ($notice->fetch()) { - - ++$cnt; - - if (!$this->max_id) { - $this->max_id = $notice->id; - } - - if ($cnt > $this->rpp) { - break; - } - - $notices[] = clone($notice); - } - } - - return $notices; - } - - /** - * Output search results as an Atom feed - * - * @return void - */ - - function showAtom() - { - $notices = $this->getNotices(); - - $this->initAtom(); - $this->showFeed(); - - foreach ($notices as $n) { - - $profile = $n->getProfile(); - - // Don't show notices from deleted users - - if (!empty($profile)) { - $this->showEntry($n); - } - } - - $this->endAtom(); - } - - /** - * Show feed specific Atom elements - * - * @return void - */ - - function showFeed() - { - // TODO: A9 OpenSearch stuff like search.twitter.com? - - $server = common_config('site', 'server'); - $sitename = common_config('site', 'name'); - - // XXX: Use xmlns:statusnet instead? - - $this->elementStart('feed', - array('xmlns' => 'http://www.w3.org/2005/Atom', - - // XXX: xmlns:twitter causes Atom validation to fail - // It's used for the source attr on notices - - 'xmlns:twitter' => 'http://api.twitter.com/', - 'xml:lang' => 'en-US')); // XXX Other locales ? - - $taguribase = TagURI::base(); - $this->element('id', null, "tag:$taguribase:search/$server"); - - $site_uri = common_path(false); - - $search_uri = $site_uri . 'api/search.atom?q=' . urlencode($this->query); - - if ($this->rpp != 15) { - $search_uri .= '&rpp=' . $this->rpp; - } - - // FIXME: this alternate link is not quite right because our - // web-based notice search doesn't support a rpp (responses per - // page) param yet - - $this->element('link', array('type' => 'text/html', - 'rel' => 'alternate', - 'href' => $site_uri . 'search/notice?q=' . - urlencode($this->query))); - - // self link - - $self_uri = $search_uri; - $self_uri .= ($this->page > 1) ? '&page=' . $this->page : ''; - - $this->element('link', array('type' => 'application/atom+xml', - 'rel' => 'self', - 'href' => $self_uri)); - - $this->element('title', null, "$this->query - $sitename Search"); - $this->element('updated', null, common_date_iso8601('now')); - - // XXX: The below "rel" links are not valid Atom, but it's what - // Twitter does... - - // refresh link - - $refresh_uri = $search_uri . "&since_id=" . $this->max_id; - - $this->element('link', array('type' => 'application/atom+xml', - 'rel' => 'refresh', - 'href' => $refresh_uri)); - - // pagination links - - if ($this->cnt > $this->rpp) { - - $next_uri = $search_uri . "&max_id=" . $this->max_id . - '&page=' . ($this->page + 1); - - $this->element('link', array('type' => 'application/atom+xml', - 'rel' => 'next', - 'href' => $next_uri)); - } - - if ($this->page > 1) { - - $previous_uri = $search_uri . "&max_id=" . $this->max_id . - '&page=' . ($this->page - 1); - - $this->element('link', array('type' => 'application/atom+xml', - 'rel' => 'previous', - 'href' => $previous_uri)); - } - - } - - /** - * Build an Atom entry similar to search.twitter.com's based on - * a given notice - * - * @param Notice $notice the notice to use - * - * @return void - */ - - function showEntry($notice) - { - $server = common_config('site', 'server'); - $profile = $notice->getProfile(); - $nurl = common_local_url('shownotice', array('notice' => $notice->id)); - - $this->elementStart('entry'); - - $taguribase = TagURI::base(); - - $this->element('id', null, "tag:$taguribase:$notice->id"); - $this->element('published', null, common_date_w3dtf($notice->created)); - $this->element('link', array('type' => 'text/html', - 'rel' => 'alternate', - 'href' => $nurl)); - $this->element('title', null, common_xml_safe_str(trim($notice->content))); - $this->element('content', array('type' => 'html'), $notice->rendered); - $this->element('updated', null, common_date_w3dtf($notice->created)); - $this->element('link', array('type' => 'image/png', - // XXX: Twitter uses rel="image" (not valid) - 'rel' => 'related', - 'href' => $profile->avatarUrl())); - - // @todo: Here is where we'd put in a link to an atom feed for threads - - $source = null; - - $ns = $notice->getSource(); - if ($ns) { - if (!empty($ns->name) && !empty($ns->url)) { - $source = '' - . htmlspecialchars($ns->name) - . ''; - } else { - $source = $ns->code; - } - } - - $this->element("twitter:source", null, $source); - - $this->elementStart('author'); - - $name = $profile->nickname; - - if ($profile->fullname) { - $name .= ' (' . $profile->fullname . ')'; - } - - $this->element('name', null, $name); - $this->element('uri', null, common_profile_uri($profile)); - $this->elementEnd('author'); - - $this->elementEnd('entry'); - } - - /** - * Initialize the Atom output, send headers - * - * @return void - */ - - function initAtom() - { - header('Content-Type: application/atom+xml; charset=utf-8'); - $this->startXml(); - } - - /** - * End the Atom feed - * - * @return void - */ - - function endAtom() - { - $this->elementEnd('feed'); - } - -} diff --git a/actions/twitapisearchjson.php b/actions/twitapisearchjson.php deleted file mode 100644 index b5c006aa7..000000000 --- a/actions/twitapisearchjson.php +++ /dev/null @@ -1,151 +0,0 @@ -. - * - * @category Search - * @package StatusNet - * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once INSTALLDIR.'/lib/jsonsearchresultslist.php'; - -/** - * Action handler for Twitter-compatible API search - * - * @category Search - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * @see ApiAction - */ - -class TwitapisearchjsonAction extends ApiAction -{ - var $query; - var $lang; - var $rpp; - var $page; - var $since_id; - var $limit; - var $geocode; - - /** - * Initialization. - * - * @param array $args Web and URL arguments - * - * @return boolean true if nothing goes wrong - */ - - function prepare($args) - { - parent::prepare($args); - - $this->query = $this->trimmed('q'); - $this->lang = $this->trimmed('lang'); - $this->rpp = $this->trimmed('rpp'); - - if (!$this->rpp) { - $this->rpp = 15; - } - - if ($this->rpp > 100) { - $this->rpp = 100; - } - - $this->page = $this->trimmed('page'); - - if (!$this->page) { - $this->page = 1; - } - - $this->since_id = $this->trimmed('since_id'); - $this->geocode = $this->trimmed('geocode'); - - return true; - } - - /** - * Handle a request - * - * @param array $args Arguments from $_REQUEST - * - * @return void - */ - - function handle($args) - { - parent::handle($args); - $this->showResults(); - } - - /** - * Show search results - * - * @return void - */ - - function showResults() - { - - // TODO: Support search operators like from: and to:, boolean, etc. - - $notice = new Notice(); - - // lcase it for comparison - $q = strtolower($this->query); - - $search_engine = $notice->getSearchEngine('notice'); - $search_engine->set_sort_mode('chron'); - $search_engine->limit(($this->page - 1) * $this->rpp, $this->rpp + 1, true); - if (false === $search_engine->query($q)) { - $cnt = 0; - } else { - $cnt = $notice->find(); - } - - // TODO: since_id, lang, geocode - - $results = new JSONSearchResultsList($notice, $q, $this->rpp, $this->page); - - $this->initDocument('json'); - $results->show(); - $this->endDocument('json'); - } - - /** - * Do we need to write to the database? - * - * @return boolean true - */ - - function isReadOnly($args) - { - return true; - } -} diff --git a/actions/twitapitrends.php b/actions/twitapitrends.php deleted file mode 100644 index 5a04569a2..000000000 --- a/actions/twitapitrends.php +++ /dev/null @@ -1,88 +0,0 @@ -. - * - * @category Search - * @package StatusNet - * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -/** - * Returns the top ten queries that are currently trending - * - * @category Search - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * - * @see ApiAction - */ - -class TwitapitrendsAction extends ApiAction -{ - - var $callback; - - /** - * Initialization. - * - * @param array $args Web and URL arguments - * - * @return boolean false if user doesn't exist - */ - function prepare($args) - { - parent::prepare($args); - return true; - } - - /** - * Handle a request - * - * @param array $args Arguments from $_REQUEST - * - * @return void - */ - - function handle($args) - { - parent::handle($args); - $this->showTrends(); - } - - /** - * Output the trends - * - * @return void - */ - function showTrends() - { - $this->serverError(_('API method under construction.'), $code = 501); - } - -} \ No newline at end of file diff --git a/lib/router.php b/lib/router.php index fec229c9b..7e1e6a2a4 100644 --- a/lib/router.php +++ b/lib/router.php @@ -667,9 +667,9 @@ class Router ); // search - $m->connect('api/search.atom', array('action' => 'twitapisearchatom')); - $m->connect('api/search.json', array('action' => 'twitapisearchjson')); - $m->connect('api/trends.json', array('action' => 'twitapitrends')); + $m->connect('api/search.atom', array('action' => 'ApiSearchAtom')); + $m->connect('api/search.json', array('action' => 'ApiSearchJSON')); + $m->connect('api/trends.json', array('action' => 'ApiTrends')); $m->connect('api/oauth/request_token', array('action' => 'apioauthrequesttoken')); -- cgit v1.2.3 From f0c5e7eca3842411d4e3ee6efb3fd6ac0ad85f4a Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sat, 26 Jun 2010 15:07:32 -0400 Subject: Fix for bug #2382: releasing claim on failed queue item works again with DB-based queues. Warning: DB-based queue doesn't currently implement discarding of items after a retry limit. Failed items will be retried until they succeed. --- classes/Queue_item.php | 13 +++++++++++++ lib/dbqueuemanager.php | 4 +--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/classes/Queue_item.php b/classes/Queue_item.php index f83c2cef1..c7e17be6e 100644 --- a/classes/Queue_item.php +++ b/classes/Queue_item.php @@ -64,4 +64,17 @@ class Queue_item extends Memcached_DataObject $qi = null; return null; } + + /** + * Release a claimed item. + */ + function releaseCLaim() + { + // DB_DataObject doesn't let us save nulls right now + $sql = sprintf("UPDATE queue_item SET claimed=NULL WHERE id=%d", $this->id); + $this->query($sql); + + $this->claimed = null; + $this->encache(); + } } diff --git a/lib/dbqueuemanager.php b/lib/dbqueuemanager.php index 3032e4ec7..3dda9fd1a 100644 --- a/lib/dbqueuemanager.php +++ b/lib/dbqueuemanager.php @@ -135,9 +135,7 @@ class DBQueueManager extends QueueManager if (empty($qi->claimed)) { $this->_log(LOG_WARNING, "[$queue:item $qi->id] Ignoring failure for unclaimed queue item"); } else { - $orig = clone($qi); - $qi->claimed = null; - $qi->update($orig); + $qi->releaseClaim(); } $this->stats('error', $queue); -- cgit v1.2.3 From 41d81b996fdd8276cc04e750297a12f852a97bf4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 10 May 2010 15:32:02 -0700 Subject: Test cases for MediaFile::getUploadedFileType() with OpenOffice, MS Office, and PDF sample files (as saved from OpenOffice 3.2) Only 3 of 16 cases pass on my dev box with default config. Ouch! --- tests/MediaFileTest.php | 77 +++++++++++++++++++++++++++++++++ tests/sample-uploads/office.pdf | Bin 0 -> 1162 bytes tests/sample-uploads/presentation.odp | Bin 0 -> 9330 bytes tests/sample-uploads/presentation.otp | Bin 0 -> 9359 bytes tests/sample-uploads/presentation.pot | Bin 0 -> 71168 bytes tests/sample-uploads/presentation.potm | Bin 0 -> 5789 bytes tests/sample-uploads/presentation.ppt | Bin 0 -> 71168 bytes tests/sample-uploads/presentation.pptx | Bin 0 -> 5790 bytes tests/sample-uploads/spreadsheet.ods | Bin 0 -> 6560 bytes tests/sample-uploads/spreadsheet.ots | Bin 0 -> 6575 bytes tests/sample-uploads/spreadsheet.xls | Bin 0 -> 6656 bytes tests/sample-uploads/spreadsheet.xlsx | Bin 0 -> 6010 bytes tests/sample-uploads/spreadsheet.xlt | Bin 0 -> 6144 bytes tests/sample-uploads/wordproc.doc | Bin 0 -> 9216 bytes tests/sample-uploads/wordproc.docx | Bin 0 -> 3350 bytes tests/sample-uploads/wordproc.odt | Bin 0 -> 7641 bytes tests/sample-uploads/wordproc.ott | Bin 0 -> 7656 bytes tests/sample-uploads/wordproc.rtf | 16 +++++++ 18 files changed, 93 insertions(+) create mode 100644 tests/MediaFileTest.php create mode 100644 tests/sample-uploads/office.pdf create mode 100644 tests/sample-uploads/presentation.odp create mode 100644 tests/sample-uploads/presentation.otp create mode 100644 tests/sample-uploads/presentation.pot create mode 100644 tests/sample-uploads/presentation.potm create mode 100644 tests/sample-uploads/presentation.ppt create mode 100644 tests/sample-uploads/presentation.pptx create mode 100644 tests/sample-uploads/spreadsheet.ods create mode 100644 tests/sample-uploads/spreadsheet.ots create mode 100644 tests/sample-uploads/spreadsheet.xls create mode 100644 tests/sample-uploads/spreadsheet.xlsx create mode 100644 tests/sample-uploads/spreadsheet.xlt create mode 100644 tests/sample-uploads/wordproc.doc create mode 100644 tests/sample-uploads/wordproc.docx create mode 100644 tests/sample-uploads/wordproc.odt create mode 100644 tests/sample-uploads/wordproc.ott create mode 100644 tests/sample-uploads/wordproc.rtf diff --git a/tests/MediaFileTest.php b/tests/MediaFileTest.php new file mode 100644 index 000000000..6fe995621 --- /dev/null +++ b/tests/MediaFileTest.php @@ -0,0 +1,77 @@ +old_attachments_supported = common_config('attachments', 'supported'); + $GLOBALS['config']['attachments']['supported'] = true; + } + + public function tearDown() + { + $GLOBALS['config']['attachments']['supported'] = $this->old_attachments_supported; + } + + /** + * @dataProvider fileTypeCases + * + */ + public function testFileType($filename, $expectedType) + { + if (!file_exists($filename)) { + throw new Exception("WTF? $filename test file missing"); + } + $this->assertEquals($expectedType, MediaFile::getUploadedFileType($filename)); + } + + static public function fileTypeCases() + { + $base = dirname(__FILE__); + $dir = "$base/sample-uploads"; + return array( + array("$dir/office.pdf", "application/pdf"), + + array("$dir/wordproc.odt", "application/vnd.oasis.opendocument.text"), + array("$dir/wordproc.ott", "application/vnd.oasis.opendocument.text-template"), + array("$dir/wordproc.doc", "application/msword"), + array("$dir/wordproc.docx", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document"), + array("$dir/wordproc.rtf", "text/rtf"), + + array("$dir/spreadsheet.ods", + "application/vnd.oasis.opendocument.spreadsheet"), + array("$dir/spreadsheet.ots", + "application/vnd.oasis.opendocument.spreadsheet-template"), + array("$dir/spreadsheet.xls", "application/vnd.ms-excel"), + array("$dir/spreadsheet.xlt", "application/vnd.ms-excel"), + array("$dir/spreadsheet.xlsx", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"), + + array("$dir/presentation.odp", + "application/vnd.oasis-opendocument.presentation"), + array("$dir/presentation.otp", + "application/vnd.oasis-opendocument.presentation-template"), + array("$dir/presentation.ppt", + "application/vnd.ms-powerpoint"), + array("$dir/presentation.pot", + "application/vnd.ms-powerpoint"), + array("$dir/presentation.pptx", + "application/vnd.openxmlformats-officedocument.presentationml.presentation"), + ); + } + +} + diff --git a/tests/sample-uploads/office.pdf b/tests/sample-uploads/office.pdf new file mode 100644 index 000000000..670bc2343 Binary files /dev/null and b/tests/sample-uploads/office.pdf differ diff --git a/tests/sample-uploads/presentation.odp b/tests/sample-uploads/presentation.odp new file mode 100644 index 000000000..8dd3a428b Binary files /dev/null and b/tests/sample-uploads/presentation.odp differ diff --git a/tests/sample-uploads/presentation.otp b/tests/sample-uploads/presentation.otp new file mode 100644 index 000000000..1927ee79d Binary files /dev/null and b/tests/sample-uploads/presentation.otp differ diff --git a/tests/sample-uploads/presentation.pot b/tests/sample-uploads/presentation.pot new file mode 100644 index 000000000..f5124ffa2 Binary files /dev/null and b/tests/sample-uploads/presentation.pot differ diff --git a/tests/sample-uploads/presentation.potm b/tests/sample-uploads/presentation.potm new file mode 100644 index 000000000..ade1bcb10 Binary files /dev/null and b/tests/sample-uploads/presentation.potm differ diff --git a/tests/sample-uploads/presentation.ppt b/tests/sample-uploads/presentation.ppt new file mode 100644 index 000000000..f5124ffa2 Binary files /dev/null and b/tests/sample-uploads/presentation.ppt differ diff --git a/tests/sample-uploads/presentation.pptx b/tests/sample-uploads/presentation.pptx new file mode 100644 index 000000000..21ea61a15 Binary files /dev/null and b/tests/sample-uploads/presentation.pptx differ diff --git a/tests/sample-uploads/spreadsheet.ods b/tests/sample-uploads/spreadsheet.ods new file mode 100644 index 000000000..7b43e7507 Binary files /dev/null and b/tests/sample-uploads/spreadsheet.ods differ diff --git a/tests/sample-uploads/spreadsheet.ots b/tests/sample-uploads/spreadsheet.ots new file mode 100644 index 000000000..5f830e6de Binary files /dev/null and b/tests/sample-uploads/spreadsheet.ots differ diff --git a/tests/sample-uploads/spreadsheet.xls b/tests/sample-uploads/spreadsheet.xls new file mode 100644 index 000000000..2d470e687 Binary files /dev/null and b/tests/sample-uploads/spreadsheet.xls differ diff --git a/tests/sample-uploads/spreadsheet.xlsx b/tests/sample-uploads/spreadsheet.xlsx new file mode 100644 index 000000000..b97a551f8 Binary files /dev/null and b/tests/sample-uploads/spreadsheet.xlsx differ diff --git a/tests/sample-uploads/spreadsheet.xlt b/tests/sample-uploads/spreadsheet.xlt new file mode 100644 index 000000000..980423b20 Binary files /dev/null and b/tests/sample-uploads/spreadsheet.xlt differ diff --git a/tests/sample-uploads/wordproc.doc b/tests/sample-uploads/wordproc.doc new file mode 100644 index 000000000..81c5e34c6 Binary files /dev/null and b/tests/sample-uploads/wordproc.doc differ diff --git a/tests/sample-uploads/wordproc.docx b/tests/sample-uploads/wordproc.docx new file mode 100644 index 000000000..04ea3c3ec Binary files /dev/null and b/tests/sample-uploads/wordproc.docx differ diff --git a/tests/sample-uploads/wordproc.odt b/tests/sample-uploads/wordproc.odt new file mode 100644 index 000000000..fa6fe5e9f Binary files /dev/null and b/tests/sample-uploads/wordproc.odt differ diff --git a/tests/sample-uploads/wordproc.ott b/tests/sample-uploads/wordproc.ott new file mode 100644 index 000000000..99ca8c068 Binary files /dev/null and b/tests/sample-uploads/wordproc.ott differ diff --git a/tests/sample-uploads/wordproc.rtf b/tests/sample-uploads/wordproc.rtf new file mode 100644 index 000000000..aad2c4605 --- /dev/null +++ b/tests/sample-uploads/wordproc.rtf @@ -0,0 +1,16 @@ +{\rtf1\ansi\deff0\adeflang1025 +{\fonttbl{\f0\froman\fprq2\fcharset128 Times New Roman;}{\f1\froman\fprq2\fcharset128 Times New Roman;}{\f2\fswiss\fprq2\fcharset128 Arial;}{\f3\fnil\fprq2\fcharset128 DejaVu Sans;}} +{\colortbl;\red0\green0\blue0;\red128\green128\blue128;} +{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\snext1 Normal;} +{\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\afs28\lang1081\ltrch\dbch\langfe2052\hich\f2\fs28\lang1033\loch\f2\fs28\lang1033\sbasedon1\snext3 Heading;} +{\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext3 Body Text;} +{\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon3\snext4 List;} +{\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ai\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\i\loch\f0\fs24\lang1033\i\sbasedon1\snext5 caption;} +{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext6 Index;} +} +{\info{\author Brion }{\creatim\yr2010\mo5\dy10\hr15\min2}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern3200}}\deftab709 +{\*\pgdsctbl +{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}} +\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc +\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par } \ No newline at end of file -- cgit v1.2.3 From 9c7b66984c46668f314f93337d28c62854b6d134 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 10 May 2010 16:18:29 -0700 Subject: Enhanced upload file type detection. If given an original filename, we'll attempt to detect type from the extension if we were unable to make a definitive match from content. Generic octet-stream, zip, and MS Office type are explicitly singled out for re-checks, which fixes OpenOffice and MS Office documents to come up with the proper types when misdetected. File extensions can also be added to the upload type whitelist; they'll be normalized to types for the actual comparison, so only known extensions will work. --- lib/mediafile.php | 54 +++++++++++++++++++++++++++-- tests/MediaFileTest.php | 73 +++++++++++++++++++++++++--------------- tests/sample-uploads/image.gif | Bin 0 -> 35 bytes tests/sample-uploads/image.jpeg | Bin 0 -> 306 bytes tests/sample-uploads/image.jpg | Bin 0 -> 306 bytes tests/sample-uploads/image.png | Bin 0 -> 159 bytes 6 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 tests/sample-uploads/image.gif create mode 100644 tests/sample-uploads/image.jpeg create mode 100644 tests/sample-uploads/image.jpg create mode 100644 tests/sample-uploads/image.png diff --git a/lib/mediafile.php b/lib/mediafile.php index 10d90d008..85d673d92 100644 --- a/lib/mediafile.php +++ b/lib/mediafile.php @@ -180,7 +180,8 @@ class MediaFile return; } - $mimetype = MediaFile::getUploadedFileType($_FILES[$param]['tmp_name']); + $mimetype = MediaFile::getUploadedFileType($_FILES[$param]['tmp_name'], + $_FILES[$param]['name']); $filename = null; @@ -241,19 +242,41 @@ class MediaFile return new MediaFile($user, $filename, $mimetype); } - static function getUploadedFileType($f) { + /** + * Attempt to identify the content type of a given file. + * + * @param mixed $f file handle resource, or filesystem path as string + * @param string $originalFilename (optional) for extension-based detection + * @return string + * + * @fixme is this an internal or public method? It's called from GetFileAction + * @fixme this seems to tie a front-end error message in, kinda confusing + * @fixme this looks like it could return a PEAR_Error in some cases, if + * type can't be identified and $config['attachments']['supported'] is true + * + * @throws ClientException if type is known, but not supported for local uploads + */ + static function getUploadedFileType($f, $originalFilename=false) { require_once 'MIME/Type.php'; + require_once 'MIME/Type/Extension.php'; + $mte = new MIME_Type_Extension(); $cmd = &PEAR::getStaticProperty('MIME_Type', 'fileCmd'); $cmd = common_config('attachments', 'filecommand'); $filetype = null; + // If we couldn't get a clear type from the file extension, + // we'll go ahead and try checking the content. Content checks + // are unambiguous for most image files, but nearly useless + // for office document formats. + if (is_string($f)) { // assuming a filename $filetype = MIME_Type::autoDetect($f); + } else { // assuming a filehandle @@ -262,7 +285,32 @@ class MediaFile $filetype = MIME_Type::autoDetect($stream['uri']); } - if (common_config('attachments', 'supported') === true || in_array($filetype, common_config('attachments', 'supported'))) { + // The content-based sources for MIME_Type::autoDetect() + // are wildly unreliable for office-type documents. If we've + // gotten an unclear reponse back or just couldn't identify it, + // we'll try detecting a type from its extension... + $unclearTypes = array('application/octet-stream', + 'application/vnd.ms-office', + 'application/zip'); + + if ($originalFilename && (!$filetype || in_array($filetype, $unclearTypes))) { + $type = $mte->getMIMEType($originalFilename); + if (is_string($type)) { + $filetype = $type; + } + } + + $supported = common_config('attachments', 'supported'); + if (is_array($supported)) { + // Normalize extensions to mime types + foreach ($supported as $i => $entry) { + if (strpos($entry, '/') === false) { + common_log(LOG_INFO, "sample.$entry"); + $supported[$i] = $mte->getMIMEType("sample.$entry"); + } + } + } + if ($supported === true || in_array($filetype, $supported)) { return $filetype; } $media = MIME_Type::getMedia($filetype); diff --git a/tests/MediaFileTest.php b/tests/MediaFileTest.php index 6fe995621..a76a4f45e 100644 --- a/tests/MediaFileTest.php +++ b/tests/MediaFileTest.php @@ -34,43 +34,62 @@ class MediaFileTest extends PHPUnit_Framework_TestCase if (!file_exists($filename)) { throw new Exception("WTF? $filename test file missing"); } - $this->assertEquals($expectedType, MediaFile::getUploadedFileType($filename)); + + $type = MediaFile::getUploadedFileType($filename, basename($filename)); + $this->assertEquals($expectedType, $type); + } + + /** + * @dataProvider fileTypeCases + * + */ + public function testUploadedFileType($filename, $expectedType) + { + if (!file_exists($filename)) { + throw new Exception("WTF? $filename test file missing"); + } + $tmp = tmpfile(); + fwrite($tmp, file_get_contents($filename)); + + $type = MediaFile::getUploadedFileType($tmp, basename($filename)); + $this->assertEquals($expectedType, $type); } static public function fileTypeCases() { $base = dirname(__FILE__); $dir = "$base/sample-uploads"; - return array( - array("$dir/office.pdf", "application/pdf"), + $files = array( + "image.png" => "image/png", + "image.gif" => "image/gif", + "image.jpg" => "image/jpeg", + "image.jpeg" => "image/jpeg", + + "office.pdf" => "application/pdf", - array("$dir/wordproc.odt", "application/vnd.oasis.opendocument.text"), - array("$dir/wordproc.ott", "application/vnd.oasis.opendocument.text-template"), - array("$dir/wordproc.doc", "application/msword"), - array("$dir/wordproc.docx", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document"), - array("$dir/wordproc.rtf", "text/rtf"), + "wordproc.odt" => "application/vnd.oasis.opendocument.text", + "wordproc.ott" => "application/vnd.oasis.opendocument.text-template", + "wordproc.doc" => "application/msword", + "wordproc.docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "wordproc.rtf" => "text/rtf", - array("$dir/spreadsheet.ods", - "application/vnd.oasis.opendocument.spreadsheet"), - array("$dir/spreadsheet.ots", - "application/vnd.oasis.opendocument.spreadsheet-template"), - array("$dir/spreadsheet.xls", "application/vnd.ms-excel"), - array("$dir/spreadsheet.xlt", "application/vnd.ms-excel"), - array("$dir/spreadsheet.xlsx", - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"), + "spreadsheet.ods" => "application/vnd.oasis.opendocument.spreadsheet", + "spreadsheet.ots" => "application/vnd.oasis.opendocument.spreadsheet-template", + "spreadsheet.xls" => "application/vnd.ms-excel", + "spreadsheet.xlt" => "application/vnd.ms-excel", + "spreadsheet.xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - array("$dir/presentation.odp", - "application/vnd.oasis-opendocument.presentation"), - array("$dir/presentation.otp", - "application/vnd.oasis-opendocument.presentation-template"), - array("$dir/presentation.ppt", - "application/vnd.ms-powerpoint"), - array("$dir/presentation.pot", - "application/vnd.ms-powerpoint"), - array("$dir/presentation.pptx", - "application/vnd.openxmlformats-officedocument.presentationml.presentation"), + "presentation.odp" => "application/vnd.oasis.opendocument.presentation", + "presentation.otp" => "application/vnd.oasis.opendocument.presentation-template", + "presentation.ppt" => "application/vnd.ms-powerpoint", + "presentation.pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", ); + + $dataset = array(); + foreach ($files as $file => $type) { + $dataset[] = array("$dir/$file", $type); + } + return $dataset; } } diff --git a/tests/sample-uploads/image.gif b/tests/sample-uploads/image.gif new file mode 100644 index 000000000..b636f4b8d Binary files /dev/null and b/tests/sample-uploads/image.gif differ diff --git a/tests/sample-uploads/image.jpeg b/tests/sample-uploads/image.jpeg new file mode 100644 index 000000000..21fcb5aef Binary files /dev/null and b/tests/sample-uploads/image.jpeg differ diff --git a/tests/sample-uploads/image.jpg b/tests/sample-uploads/image.jpg new file mode 100644 index 000000000..21fcb5aef Binary files /dev/null and b/tests/sample-uploads/image.jpg differ diff --git a/tests/sample-uploads/image.png b/tests/sample-uploads/image.png new file mode 100644 index 000000000..60cbcfd17 Binary files /dev/null and b/tests/sample-uploads/image.png differ -- cgit v1.2.3 From b2ad8ec571bd68a92e433e817531151ebf8aa4d0 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 28 Jun 2010 14:41:33 -0400 Subject: Fix for PHP notice when given an integer degrees in decimalDegreesToDMS(); using math instead of string manipulation to split integer portion from decimal remainder. --- lib/noticelist.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/noticelist.php b/lib/noticelist.php index 432ea78d5..e23cf3b6d 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -463,12 +463,14 @@ class NoticeListItem extends Widget $this->out->elementEnd('span'); } + /** + * @param number $dec decimal degrees + * @return array split into 'deg', 'min', and 'sec' + */ function decimalDegreesToDMS($dec) { - - $vars = explode(".",$dec); - $deg = $vars[0]; - $tempma = "0.".$vars[1]; + $deg = intval($dec); + $tempma = abs($dec) - abs($deg); $tempma = $tempma * 3600; $min = floor($tempma / 60); -- cgit v1.2.3 From d87b3f3d2e4b15de14987f431981445c1c9db1be Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 28 Jun 2010 12:02:08 -0700 Subject: Add notice source for StatusNet Desktop --- db/notice_source.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/notice_source.sql b/db/notice_source.sql index f5db37f04..6bfd5c5f1 100644 --- a/db/notice_source.sql +++ b/db/notice_source.sql @@ -51,6 +51,7 @@ VALUES ('smob','SMOB','http://smob.sioc-project.org/', now()), ('socialoomphBfD4pMqz31', 'SocialOomph', 'http://www.socialoomph.com/', now()), ('spaz','Spaz','http://funkatron.com/spaz', now()), + ('StatusNet Desktop', 'StatusNet Desktop', 'http://status.net/desktop', now()), ('tarpipe','tarpipe','http://tarpipe.com/', now()), ('tjunar','Tjunar','http://nederflash.nl/boek/titels/tjunar-air', now()), ('tr.im','tr.im','http://tr.im/', now()), -- cgit v1.2.3 From c9863bb864d67e5a88f5f9647ba9727d740692a2 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 28 Jun 2010 15:08:01 -0400 Subject: Update version and code name: 0.9.3 Half a World Away --- README | 4 ++-- lib/common.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README b/README index c47d3499f..452123db4 100644 --- a/README +++ b/README @@ -2,8 +2,8 @@ README ------ -StatusNet 0.9.2 ("King of Birds") -3 May 2010 +StatusNet 0.9.3 ("Half a World Away") +29 June 2010 This is the README file for StatusNet, the Open Source microblogging platform. It includes installation instructions, descriptions of diff --git a/lib/common.php b/lib/common.php index 064f6f73a..817434b97 100644 --- a/lib/common.php +++ b/lib/common.php @@ -22,10 +22,10 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } //exit with 200 response, if this is checking fancy from the installer if (isset($_REQUEST['p']) && $_REQUEST['p'] == 'check-fancy') { exit; } -define('STATUSNET_VERSION', '0.9.2'); +define('STATUSNET_VERSION', '0.9.3'); define('LACONICA_VERSION', STATUSNET_VERSION); // compatibility -define('STATUSNET_CODENAME', 'King of Birds'); +define('STATUSNET_CODENAME', 'Half a World Away'); define('AVATAR_PROFILE_SIZE', 96); define('AVATAR_STREAM_SIZE', 48); -- cgit v1.2.3 From dcfe5b24f6047aa830f107628aa3c10b9d292951 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 28 Jun 2010 15:20:50 -0400 Subject: Fix regression in 92ded7c6cb56056a89bc8b3caabd08049104898e: spewed PHP notices when checking for enclosures due to uninitialized variables. --- classes/File.php | 1 + 1 file changed, 1 insertion(+) diff --git a/classes/File.php b/classes/File.php index 0cd31075d..0f230a6ee 100644 --- a/classes/File.php +++ b/classes/File.php @@ -302,6 +302,7 @@ class File extends Memcached_DataObject if(! isset($this->filename)){ $notEnclosureMimeTypes = array(null,'text/html','application/xhtml+xml'); + $mimetype = $this->mimetype; if($mimetype != null){ $mimetype = strtolower($this->mimetype); } -- cgit v1.2.3 From 923d9ef71ce49bfa55460bf42acb8a35bf3e84be Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 28 Jun 2010 16:53:05 -0700 Subject: - Fix bugs with block and friendship API methods - Friendship API methods now use a Profile instead of User for target --- actions/apiblockcreate.php | 4 ++-- actions/apiblockdestroy.php | 4 ++-- actions/apifriendshipscreate.php | 6 +++--- actions/apifriendshipsdestroy.php | 7 +++---- actions/apifriendshipsexists.php | 19 ++++++++----------- lib/apiaction.php | 28 ++++++++++++++++++++++++++++ 6 files changed, 46 insertions(+), 22 deletions(-) diff --git a/actions/apiblockcreate.php b/actions/apiblockcreate.php index c26485f59..b355cd1c7 100644 --- a/actions/apiblockcreate.php +++ b/actions/apiblockcreate.php @@ -23,7 +23,7 @@ * @package StatusNet * @author Evan Prodromou * @author Zach Copley - * @copyright 2009 StatusNet, Inc. + * @copyright 2009-2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -65,7 +65,7 @@ class ApiBlockCreateAction extends ApiAuthAction parent::prepare($args); $this->user = $this->auth_user; - $this->other = $this->getTargetUser($this->arg('id')); + $this->other = $this->getTargetProfile($this->arg('id')); return true; } diff --git a/actions/apiblockdestroy.php b/actions/apiblockdestroy.php index 666f308f4..7ea201677 100644 --- a/actions/apiblockdestroy.php +++ b/actions/apiblockdestroy.php @@ -23,7 +23,7 @@ * @package StatusNet * @author Evan Prodromou * @author Zach Copley - * @copyright 2009 StatusNet, Inc. + * @copyright 2009-2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -64,7 +64,7 @@ class ApiBlockDestroyAction extends ApiAuthAction parent::prepare($args); $this->user = $this->auth_user; - $this->other = $this->getTargetUser($this->arg('id')); + $this->other = $this->getTargetProfile($this->arg('id')); return true; } diff --git a/actions/apifriendshipscreate.php b/actions/apifriendshipscreate.php index 1de2cc32e..a7ec5b28a 100644 --- a/actions/apifriendshipscreate.php +++ b/actions/apifriendshipscreate.php @@ -24,7 +24,7 @@ * @author Dan Moore * @author Evan Prodromou * @author Zach Copley - * @copyright 2009 StatusNet, Inc. + * @copyright 2009-2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -67,7 +67,7 @@ class ApiFriendshipsCreateAction extends ApiAuthAction parent::prepare($args); $this->user = $this->auth_user; - $this->other = $this->getTargetUser($id); + $this->other = $this->getTargetProfile($this->arg('id')); return true; } @@ -106,7 +106,7 @@ class ApiFriendshipsCreateAction extends ApiAuthAction if (empty($this->other)) { $this->clientError( - _('Could not follow user: User not found.'), + _('Could not follow user: profile not found.'), 403, $this->format ); diff --git a/actions/apifriendshipsdestroy.php b/actions/apifriendshipsdestroy.php index d48a57756..551d01682 100644 --- a/actions/apifriendshipsdestroy.php +++ b/actions/apifriendshipsdestroy.php @@ -24,7 +24,7 @@ * @author Dan Moore * @author Evan Prodromou * @author Zach Copley - * @copyright 2009 StatusNet, Inc. + * @copyright 2009-2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -67,7 +67,7 @@ class ApiFriendshipsDestroyAction extends ApiAuthAction parent::prepare($args); $this->user = $this->auth_user; - $this->other = $this->getTargetUser($id); + $this->other = $this->getTargetProfile($this->arg('id')); return true; } @@ -125,8 +125,7 @@ class ApiFriendshipsDestroyAction extends ApiAuthAction } // throws an exception on error - Subscription::cancel($this->user->getProfile(), - $this->other->getProfile()); + Subscription::cancel($this->user->getProfile(), $this->other); $this->initDocument($this->format); $this->showProfile($this->other, $this->format); diff --git a/actions/apifriendshipsexists.php b/actions/apifriendshipsexists.php index ca62b5f51..725178fd4 100644 --- a/actions/apifriendshipsexists.php +++ b/actions/apifriendshipsexists.php @@ -24,7 +24,7 @@ * @author Dan Moore * @author Evan Prodromou * @author Zach Copley - * @copyright 2009 StatusNet, Inc. + * @copyright 2009-2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -50,8 +50,8 @@ require_once INSTALLDIR . '/lib/apiprivateauth.php'; class ApiFriendshipsExistsAction extends ApiPrivateAuthAction { - var $user_a = null; - var $user_b = null; + var $profile_a = null; + var $profile_b = null; /** * Take arguments for running @@ -66,11 +66,8 @@ class ApiFriendshipsExistsAction extends ApiPrivateAuthAction { parent::prepare($args); - $user_a_id = $this->trimmed('user_a'); - $user_b_id = $this->trimmed('user_b'); - - $this->user_a = $this->getTargetUser($user_a_id); - $this->user_b = $this->getTargetUser($user_b_id); + $this->profile_a = $this->getTargetProfile($this->trimmed('user_a')); + $this->profile_b = $this->getTargetProfile($this->trimmed('user_b')); return true; } @@ -89,16 +86,16 @@ class ApiFriendshipsExistsAction extends ApiPrivateAuthAction { parent::handle($args); - if (empty($this->user_a) || empty($this->user_b)) { + if (empty($this->profile_a) || empty($this->profile_b)) { $this->clientError( - _('Two user ids or screen_names must be supplied.'), + _('Two valid IDs or screen_names must be supplied.'), 400, $this->format ); return; } - $result = $this->user_a->isSubscribed($this->user_b); + $result = Subscription::exists($this->profile_a, $this->profile_b); switch ($this->format) { case 'xml': diff --git a/lib/apiaction.php b/lib/apiaction.php index 89a487102..8de13a62d 100644 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -1374,6 +1374,34 @@ class ApiAction extends Action } } + function getTargetProfile($id) + { + if (empty($id)) { + + // Twitter supports these other ways of passing the user ID + if (is_numeric($this->arg('id'))) { + return Profile::staticGet($this->arg('id')); + } else if ($this->arg('id')) { + $nickname = common_canonical_nickname($this->arg('id')); + return Profile::staticGet('nickname', $nickname); + } else if ($this->arg('user_id')) { + // This is to ensure that a non-numeric user_id still + // overrides screen_name even if it doesn't get used + if (is_numeric($this->arg('user_id'))) { + return Profile::staticGet('id', $this->arg('user_id')); + } + } else if ($this->arg('screen_name')) { + $nickname = common_canonical_nickname($this->arg('screen_name')); + return Profile::staticGet('nickname', $nickname); + } + } else if (is_numeric($id)) { + return Profile::staticGet($id); + } else { + $nickname = common_canonical_nickname($id); + return Profile::staticGet('nickname', $nickname); + } + } + function getTargetGroup($id) { if (empty($id)) { -- cgit v1.2.3 From 2d920e05d563c9c327cf235b31ce18dfc4a83870 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 29 Jun 2010 10:24:48 -0400 Subject: Update the (formerly) Janrain OpenID library to 2.2.2 -- bug fixes including PHP 5.3 compatibility fix. Upstream release was tagged at: http://github.com/openid/php-openid/commit/a287b2d85e753c84b3b883ed8ee3ffe8692c8477 --- extlib/Auth/OpenID.php | 63 +++++++++++--------- extlib/Auth/OpenID/AX.php | 23 ++++---- extlib/Auth/OpenID/Association.php | 23 ++++---- extlib/Auth/OpenID/BigMath.php | 31 ++-------- extlib/Auth/OpenID/Consumer.php | 66 ++++++++++----------- extlib/Auth/OpenID/CryptUtil.php | 5 +- extlib/Auth/OpenID/DatabaseConnection.php | 1 - extlib/Auth/OpenID/DiffieHellman.php | 6 +- extlib/Auth/OpenID/Discover.php | 94 ++++++++++++++++++++++++------ extlib/Auth/OpenID/DumbStore.php | 1 - extlib/Auth/OpenID/Extension.php | 3 +- extlib/Auth/OpenID/FileStore.php | 6 +- extlib/Auth/OpenID/HMAC.php | 1 - extlib/Auth/OpenID/Interface.php | 1 - extlib/Auth/OpenID/KVForm.php | 5 +- extlib/Auth/OpenID/MemcachedStore.php | 1 - extlib/Auth/OpenID/Message.php | 10 ++-- extlib/Auth/OpenID/MySQLStore.php | 1 - extlib/Auth/OpenID/Nonce.php | 1 - extlib/Auth/OpenID/PAPE.php | 11 ++-- extlib/Auth/OpenID/Parse.php | 37 ++++++++++-- extlib/Auth/OpenID/PostgreSQLStore.php | 1 - extlib/Auth/OpenID/SQLStore.php | 18 +----- extlib/Auth/OpenID/SQLiteStore.php | 1 - extlib/Auth/OpenID/SReg.php | 14 ++--- extlib/Auth/OpenID/Server.php | 95 ++++++++++++++++--------------- extlib/Auth/OpenID/ServerRequest.php | 1 - extlib/Auth/OpenID/TrustRoot.php | 21 ++++--- extlib/Auth/OpenID/URINorm.php | 2 +- extlib/Auth/Yadis/HTTPFetcher.php | 33 ++++++++++- extlib/Auth/Yadis/Manager.php | 20 ++----- extlib/Auth/Yadis/Misc.php | 1 - extlib/Auth/Yadis/ParanoidHTTPFetcher.php | 29 ++++++++-- extlib/Auth/Yadis/ParseHTML.php | 1 - extlib/Auth/Yadis/PlainHTTPFetcher.php | 3 +- extlib/Auth/Yadis/XML.php | 56 ++++++------------ extlib/Auth/Yadis/XRDS.php | 16 +++--- extlib/Auth/Yadis/XRI.php | 4 +- extlib/Auth/Yadis/XRIRes.php | 6 +- extlib/Auth/Yadis/Yadis.php | 20 +++---- 40 files changed, 397 insertions(+), 335 deletions(-) diff --git a/extlib/Auth/OpenID.php b/extlib/Auth/OpenID.php index db6164256..c9d977962 100644 --- a/extlib/Auth/OpenID.php +++ b/extlib/Auth/OpenID.php @@ -20,7 +20,7 @@ /** * The library version string */ -define('Auth_OpenID_VERSION', '2.1.3'); +define('Auth_OpenID_VERSION', '2.2.2'); /** * Require the fetcher code. @@ -102,9 +102,7 @@ define('Auth_OpenID_digits', define('Auth_OpenID_punct', "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"); -if (Auth_OpenID_getMathLib() === null) { - Auth_OpenID_setNoMathSupport(); -} +Auth_OpenID_include_init(); /** * The OpenID utility function class. @@ -120,7 +118,7 @@ class Auth_OpenID { * * @access private */ - function isFailure($thing) + static function isFailure($thing) { return is_a($thing, 'Auth_OpenID_FailureResponse'); } @@ -139,9 +137,12 @@ class Auth_OpenID { * Returns an empty array if neither GET nor POST was used, or if * POST was used but php://input cannot be opened. * + * See background: + * http://lists.openidenabled.com/pipermail/dev/2007-March/000395.html + * * @access private */ - function getQuery($query_str=null) + static function getQuery($query_str=null) { $data = array(); @@ -177,7 +178,7 @@ class Auth_OpenID { return $data; } - function params_from_string($str) + static function params_from_string($str) { $chunks = explode("&", $str); @@ -190,7 +191,7 @@ class Auth_OpenID { } list($k, $v) = $parts; - $data[$k] = urldecode($v); + $data[urldecode($k)] = urldecode($v); } return $data; @@ -203,7 +204,7 @@ class Auth_OpenID { * * @access private */ - function ensureDir($dir_name) + static function ensureDir($dir_name) { if (is_dir($dir_name) || @mkdir($dir_name)) { return true; @@ -225,7 +226,7 @@ class Auth_OpenID { * * @access private */ - function addPrefix($values, $prefix) + static function addPrefix($values, $prefix) { $new_values = array(); foreach ($values as $s) { @@ -241,7 +242,7 @@ class Auth_OpenID { * * @access private */ - function arrayGet($arr, $key, $fallback = null) + static function arrayGet($arr, $key, $fallback = null) { if (is_array($arr)) { if (array_key_exists($key, $arr)) { @@ -261,7 +262,7 @@ class Auth_OpenID { /** * Replacement for PHP's broken parse_str. */ - function parse_str($query) + static function parse_str($query) { if ($query === null) { return null; @@ -278,7 +279,7 @@ class Auth_OpenID { } list($key, $value) = $pair; - $new_parts[$key] = urldecode($value); + $new_parts[urldecode($key)] = urldecode($value); } return $new_parts; @@ -295,7 +296,7 @@ class Auth_OpenID { * pairs from $data into a URL query string * (e.g. "username=bob&id=56"). */ - function httpBuildQuery($data) + static function httpBuildQuery($data) { $pairs = array(); foreach ($data as $key => $value) { @@ -323,7 +324,7 @@ class Auth_OpenID { * @return string $url The original URL with the new parameters added. * */ - function appendArgs($url, $args) + static function appendArgs($url, $args) { if (count($args) == 0) { return $url; @@ -367,7 +368,7 @@ class Auth_OpenID { * @return string $url The URL resulting from assembling the * specified components. */ - function urlunparse($scheme, $host, $port = null, $path = '/', + static function urlunparse($scheme, $host, $port = null, $path = '/', $query = '', $fragment = '') { @@ -412,7 +413,7 @@ class Auth_OpenID { * @return mixed $new_url The URL after normalization, or null if * $url was malformed. */ - function normalizeUrl($url) + static function normalizeUrl($url) { @$parsed = parse_url($url); @@ -443,7 +444,7 @@ class Auth_OpenID { * * @access private */ - function intval($value) + static function intval($value) { $re = "/^\\d+$/"; @@ -461,7 +462,7 @@ class Auth_OpenID { * @param string $str The string of bytes to count. * @return int The number of bytes in $str. */ - function bytes($str) + static function bytes($str) { return strlen(bin2hex($str)) / 2; } @@ -470,7 +471,7 @@ class Auth_OpenID { * Get the bytes in a string independently of multibyte support * conditions. */ - function toBytes($str) + static function toBytes($str) { $hex = bin2hex($str); @@ -486,7 +487,7 @@ class Auth_OpenID { return $b; } - function urldefrag($url) + static function urldefrag($url) { $parts = explode("#", $url, 2); @@ -497,7 +498,7 @@ class Auth_OpenID { } } - function filter($callback, &$sequence) + static function filter($callback, &$sequence) { $result = array(); @@ -510,7 +511,7 @@ class Auth_OpenID { return $result; } - function update(&$dest, &$src) + static function update(&$dest, &$src) { foreach ($src as $k => $v) { $dest[$k] = $v; @@ -524,14 +525,14 @@ class Auth_OpenID { * * @param string $format_string The sprintf format for the message */ - function log($format_string) + static function log($format_string) { $args = func_get_args(); $message = call_user_func_array('sprintf', $args); error_log($message); } - function autoSubmitHTML($form, $title="OpenId transaction in progress") + static function autoSubmitHTML($form, $title="OpenId transaction in progress") { return("". "". @@ -549,4 +550,14 @@ class Auth_OpenID { "</html>"); } } -?> + +/* + * Function to run when this file is included. + * Abstracted to a function to make life easier + * for some PHP optimizers. + */ +function Auth_OpenID_include_init() { + if (Auth_OpenID_getMathLib() === null) { + Auth_OpenID_setNoMathSupport(); + } +} diff --git a/extlib/Auth/OpenID/AX.php b/extlib/Auth/OpenID/AX.php index 4a617ae30..7370715e3 100644 --- a/extlib/Auth/OpenID/AX.php +++ b/extlib/Auth/OpenID/AX.php @@ -38,7 +38,7 @@ class Auth_OpenID_AX { * @return bool true if $thing is an Auth_OpenID_AX_Error; false * if not. */ - function isError($thing) + static function isError($thing) { return is_a($thing, 'Auth_OpenID_AX_Error'); } @@ -191,7 +191,7 @@ class Auth_OpenID_AX_AttrInfo { * Construct an attribute information object. For parameter * details, see the constructor. */ - function make($type_uri, $count=1, $required=false, + static function make($type_uri, $count=1, $required=false, $alias=null) { if ($alias !== null) { @@ -235,7 +235,7 @@ class Auth_OpenID_AX_AttrInfo { * return null If an alias is present in the list of aliases but * is not present in the namespace map. */ -function Auth_OpenID_AX_toTypeURIs(&$namespace_map, $alias_list_s) +function Auth_OpenID_AX_toTypeURIs($namespace_map, $alias_list_s) { $uris = array(); @@ -386,7 +386,7 @@ class Auth_OpenID_AX_FetchRequest extends Auth_OpenID_AX_Message { * Auth_OpenID_AX_FetchRequest extracted from the request message if * successful */ - function &fromOpenIDRequest($request) + static function fromOpenIDRequest($request) { $m = $request->message; $obj = new Auth_OpenID_AX_FetchRequest(); @@ -484,7 +484,7 @@ class Auth_OpenID_AX_FetchRequest extends Auth_OpenID_AX_Message { Auth_OpenID::arrayGet($ax_args, 'required')); foreach ($required as $type_uri) { - $attrib =& $this->requested_attributes[$type_uri]; + $attrib = $this->requested_attributes[$type_uri]; $attrib->required = true; } @@ -587,7 +587,7 @@ class Auth_OpenID_AX_KeyValueMessage extends Auth_OpenID_AX_Message { * * @access private */ - function _getExtensionKVArgs(&$aliases) + function _getExtensionKVArgs($aliases) { if ($aliases === null) { $aliases = new Auth_OpenID_NamespaceMap(); @@ -652,7 +652,7 @@ class Auth_OpenID_AX_KeyValueMessage extends Auth_OpenID_AX_Message { foreach ($aliases->iteritems() as $pair) { list($type_uri, $alias) = $pair; - if (array_key_exists('count.' . $alias, $ax_args)) { + if (array_key_exists('count.' . $alias, $ax_args) && ($ax_args['count.' . $alias] !== Auth_OpenID_AX_UNLIMITED_VALUES)) { $count_key = 'count.' . $alias; $count_s = $ax_args[$count_key]; @@ -888,7 +888,7 @@ class Auth_OpenID_AX_FetchResponse extends Auth_OpenID_AX_KeyValueMessage { $ax_args['update_url'] = $update_url; } - Auth_OpenID::update(&$ax_args, $kv_args); + Auth_OpenID::update($ax_args, $kv_args); return $ax_args; } @@ -922,7 +922,7 @@ class Auth_OpenID_AX_FetchResponse extends Auth_OpenID_AX_KeyValueMessage { * @return $response A FetchResponse containing the data from the * OpenID message */ - function fromSuccessResponse($success_response, $signed=true) + static function fromSuccessResponse($success_response, $signed=true) { $obj = new Auth_OpenID_AX_FetchResponse(); if ($signed) { @@ -960,7 +960,7 @@ class Auth_OpenID_AX_StoreRequest extends Auth_OpenID_AX_KeyValueMessage { { $ax_args = $this->_newArgs(); $kv_args = $this->_getExtensionKVArgs($aliases); - Auth_OpenID::update(&$ax_args, $kv_args); + Auth_OpenID::update($ax_args, $kv_args); return $ax_args; } } @@ -980,7 +980,7 @@ class Auth_OpenID_AX_StoreResponse extends Auth_OpenID_AX_Message { * Returns Auth_OpenID_AX_Error on error or an * Auth_OpenID_AX_StoreResponse object on success. */ - function &make($succeeded=true, $error_message=null) + function make($succeeded=true, $error_message=null) { if (($succeeded) && ($error_message !== null)) { return new Auth_OpenID_AX_Error('An error message may only be '. @@ -1020,4 +1020,3 @@ class Auth_OpenID_AX_StoreResponse extends Auth_OpenID_AX_Message { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/Association.php b/extlib/Auth/OpenID/Association.php index 37ce0cbf4..d1ac1ed9b 100644 --- a/extlib/Auth/OpenID/Association.php +++ b/extlib/Auth/OpenID/Association.php @@ -94,7 +94,7 @@ class Auth_OpenID_Association { * @return association An {@link Auth_OpenID_Association} * instance. */ - function fromExpiresIn($expires_in, $handle, $secret, $assoc_type) + static function fromExpiresIn($expires_in, $handle, $secret, $assoc_type) { $issued = time(); $lifetime = $expires_in; @@ -132,7 +132,7 @@ class Auth_OpenID_Association { $handle, $secret, $issued, $lifetime, $assoc_type) { if (!in_array($assoc_type, - Auth_OpenID_getSupportedAssociationTypes())) { + Auth_OpenID_getSupportedAssociationTypes(), true)) { $fmt = 'Unsupported association type (%s)'; trigger_error(sprintf($fmt, $assoc_type), E_USER_ERROR); } @@ -206,7 +206,7 @@ class Auth_OpenID_Association { * @param string $assoc_s Association as serialized by serialize() * @return Auth_OpenID_Association $result instance of this class */ - function deserialize($class_name, $assoc_s) + static function deserialize($class_name, $assoc_s) { $pairs = Auth_OpenID_KVForm::toArray($assoc_s, $strict = true); $keys = array(); @@ -327,7 +327,7 @@ class Auth_OpenID_Association { * * @access private */ - function _makePairs(&$message) + function _makePairs($message) { $signed = $message->getArg(Auth_OpenID_OPENID_NS, 'signed'); if (!$signed || Auth_OpenID::isFailure($signed)) { @@ -352,7 +352,7 @@ class Auth_OpenID_Association { * * @access private */ - function getMessageSignature(&$message) + function getMessageSignature($message) { $pairs = $this->_makePairs($message); return base64_encode($this->sign($pairs)); @@ -364,7 +364,7 @@ class Auth_OpenID_Association { * * @access private */ - function checkMessageSignature(&$message) + function checkMessageSignature($message) { $sig = $message->getArg(Auth_OpenID_OPENID_NS, 'sig'); @@ -469,18 +469,16 @@ function Auth_OpenID_getOnlyEncryptedOrder() return $result; } -function &Auth_OpenID_getDefaultNegotiator() +function Auth_OpenID_getDefaultNegotiator() { - $x = new Auth_OpenID_SessionNegotiator( + return new Auth_OpenID_SessionNegotiator( Auth_OpenID_getDefaultAssociationOrder()); - return $x; } -function &Auth_OpenID_getEncryptedNegotiator() +function Auth_OpenID_getEncryptedNegotiator() { - $x = new Auth_OpenID_SessionNegotiator( + return new Auth_OpenID_SessionNegotiator( Auth_OpenID_getOnlyEncryptedOrder()); - return $x; } /** @@ -610,4 +608,3 @@ class Auth_OpenID_SessionNegotiator { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/BigMath.php b/extlib/Auth/OpenID/BigMath.php index 45104947d..7fca2dc43 100644 --- a/extlib/Auth/OpenID/BigMath.php +++ b/extlib/Auth/OpenID/BigMath.php @@ -351,8 +351,7 @@ function Auth_OpenID_math_extensions() 'class' => 'Auth_OpenID_GmpMathWrapper'); } - $result[] = array( - 'modules' => array('bcmath', 'php_bcmath'), + $result[] = array('modules' => array('bcmath', 'php_bcmath'), 'extension' => 'bcmath', 'class' => 'Auth_OpenID_BcMathWrapper'); @@ -366,27 +365,9 @@ function Auth_OpenID_detectMathLibrary($exts) { $loaded = false; + $hasDl = function_exists('dl'); foreach ($exts as $extension) { - // See if the extension specified is already loaded. - if ($extension['extension'] && - extension_loaded($extension['extension'])) { - $loaded = true; - } - - // Try to load dynamic modules. - if (!$loaded) { - foreach ($extension['modules'] as $module) { - if (@dl($module . "." . PHP_SHLIB_SUFFIX)) { - $loaded = true; - break; - } - } - } - - // If the load succeeded, supply an instance of - // Auth_OpenID_MathWrapper which wraps the specified - // module's functionality. - if ($loaded) { + if (extension_loaded($extension['extension'])) { return $extension; } } @@ -405,7 +386,7 @@ function Auth_OpenID_detectMathLibrary($exts) * instance of a wrapper for that extension module. If no extension * module is found, an instance of {@link Auth_OpenID_MathWrapper} is * returned, which wraps the native PHP integer implementation. The - * proper calling convention for this method is $lib =& + * proper calling convention for this method is $lib = * Auth_OpenID_getMathLib(). * * This function checks for the existence of specific long number @@ -416,7 +397,7 @@ function Auth_OpenID_detectMathLibrary($exts) * * @package OpenID */ -function &Auth_OpenID_getMathLib() +function Auth_OpenID_getMathLib() { // The instance of Auth_OpenID_MathWrapper that we choose to // supply will be stored here, so that subseqent calls to this @@ -468,4 +449,4 @@ function Auth_OpenID_noMathSupport() return defined('Auth_OpenID_NO_MATH_SUPPORT'); } -?> + diff --git a/extlib/Auth/OpenID/Consumer.php b/extlib/Auth/OpenID/Consumer.php index 500890b65..021c03898 100644 --- a/extlib/Auth/OpenID/Consumer.php +++ b/extlib/Auth/OpenID/Consumer.php @@ -258,19 +258,19 @@ class Auth_OpenID_Consumer { * when creating the internal consumer object. This is used for * testing. */ - function Auth_OpenID_Consumer(&$store, $session = null, + function Auth_OpenID_Consumer($store, $session = null, $consumer_cls = null) { if ($session === null) { $session = new Auth_Yadis_PHPSession(); } - $this->session =& $session; + $this->session = $session; if ($consumer_cls !== null) { - $this->consumer =& new $consumer_cls($store); + $this->consumer = new $consumer_cls($store); } else { - $this->consumer =& new Auth_OpenID_GenericConsumer($store); + $this->consumer = new Auth_OpenID_GenericConsumer($store); } $this->_token_key = $this->session_key_prefix . $this->_token_suffix; @@ -281,7 +281,7 @@ class Auth_OpenID_Consumer { * * @access private */ - function getDiscoveryObject(&$session, $openid_url, + function getDiscoveryObject($session, $openid_url, $session_key_prefix) { return new Auth_Yadis_Discovery($session, $openid_url, @@ -339,7 +339,7 @@ class Auth_OpenID_Consumer { $this->consumer->fetcher); // Reset the 'stale' attribute of the manager. - $m =& $disco->getManager(); + $m = $disco->getManager(); if ($m) { $m->stale = false; $disco->session->set($disco->session_key, @@ -370,7 +370,7 @@ class Auth_OpenID_Consumer { * @return Auth_OpenID_AuthRequest $auth_request An OpenID * authentication request object. */ - function &beginWithoutDiscovery($endpoint, $anonymous=false) + function beginWithoutDiscovery($endpoint, $anonymous=false) { $loader = new Auth_OpenID_ServiceEndpointLoader(); $auth_req = $this->consumer->begin($endpoint); @@ -467,7 +467,7 @@ class Auth_OpenID_DiffieHellmanSHA1ConsumerSession { function getRequest() { - $math =& Auth_OpenID_getMathLib(); + $math = Auth_OpenID_getMathLib(); $cpub = $math->longToBase64($this->dh->public); @@ -496,7 +496,7 @@ class Auth_OpenID_DiffieHellmanSHA1ConsumerSession { return null; } - $math =& Auth_OpenID_getMathLib(); + $math = Auth_OpenID_getMathLib(); $spub = $math->base64ToLong($response->getArg(Auth_OpenID_OPENID_NS, 'dh_server_public')); @@ -611,11 +611,11 @@ class Auth_OpenID_GenericConsumer { * in the module description. The default value is False, which * disables immediate mode. */ - function Auth_OpenID_GenericConsumer(&$store) + function Auth_OpenID_GenericConsumer($store) { - $this->store =& $store; - $this->negotiator =& Auth_OpenID_getDefaultNegotiator(); - $this->_use_assocs = ($this->store ? true : false); + $this->store = $store; + $this->negotiator = Auth_OpenID_getDefaultNegotiator(); + $this->_use_assocs = (is_null($this->store) ? false : true); $this->fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); @@ -665,14 +665,14 @@ class Auth_OpenID_GenericConsumer { $method = Auth_OpenID::arrayGet($mode_methods, $mode, '_completeInvalid'); - return call_user_func_array(array(&$this, $method), - array($message, $endpoint, $return_to)); + return call_user_func_array(array($this, $method), + array($message, &$endpoint, $return_to)); } /** * @access private */ - function _completeInvalid($message, &$endpoint, $unused) + function _completeInvalid($message, $endpoint, $unused) { $mode = $message->getArg(Auth_OpenID_OPENID_NS, 'mode', '<No mode set>'); @@ -684,7 +684,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _complete_cancel($message, &$endpoint, $unused) + function _complete_cancel($message, $endpoint, $unused) { return new Auth_OpenID_CancelResponse($endpoint); } @@ -692,7 +692,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _complete_error($message, &$endpoint, $unused) + function _complete_error($message, $endpoint, $unused) { $error = $message->getArg(Auth_OpenID_OPENID_NS, 'error'); $contact = $message->getArg(Auth_OpenID_OPENID_NS, 'contact'); @@ -705,7 +705,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _complete_setup_needed($message, &$endpoint, $unused) + function _complete_setup_needed($message, $endpoint, $unused) { if (!$message->isOpenID2()) { return $this->_completeInvalid($message, $endpoint); @@ -719,7 +719,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _complete_id_res($message, &$endpoint, $return_to) + function _complete_id_res($message, $endpoint, $return_to) { $user_setup_url = $message->getArg(Auth_OpenID_OPENID1_NS, 'user_setup_url'); @@ -1181,7 +1181,7 @@ class Auth_OpenID_GenericConsumer { // oidutil.log('Performing discovery on %s' % (claimed_id,)) list($unused, $services) = call_user_func($this->discoverMethod, $claimed_id, - $this->fetcher); + &$this->fetcher); if (!$services) { return new Auth_OpenID_FailureResponse(null, @@ -1197,7 +1197,7 @@ class Auth_OpenID_GenericConsumer { * @access private */ function _verifyDiscoveryServices($claimed_id, - &$services, &$to_match_endpoints) + $services, $to_match_endpoints) { // Search the services resulting from discovery to find one // that matches the information from the assertion @@ -1216,8 +1216,8 @@ class Auth_OpenID_GenericConsumer { } return new Auth_OpenID_FailureResponse(null, - sprintf('No matching endpoint found after discovering %s', - $claimed_id)); + sprintf('No matching endpoint found after discovering %s: %s', + $claimed_id, $result->message)); } /** @@ -1397,7 +1397,7 @@ class Auth_OpenID_GenericConsumer { * * @access private */ - function _httpResponseToMessage($response, $server_url) + static function _httpResponseToMessage($response, $server_url) { // Should this function be named Message.fromHTTPResponse instead? $response_message = Auth_OpenID_Message::fromKVForm($response->body); @@ -1461,7 +1461,7 @@ class Auth_OpenID_GenericConsumer { * * @access private */ - function _extractSupportedAssociationType(&$server_error, &$endpoint, + function _extractSupportedAssociationType($server_error, $endpoint, $assoc_type) { // Any error message whose code is not 'unsupported-type' @@ -1566,7 +1566,7 @@ class Auth_OpenID_GenericConsumer { /** * @access private */ - function _extractAssociation(&$assoc_response, &$assoc_session) + function _extractAssociation($assoc_response, $assoc_session) { // Extract the common fields from the response, raising an // exception if they are not found @@ -1748,10 +1748,10 @@ class Auth_OpenID_AuthRequest { * class. Instances of this class are created by the library when * needed. */ - function Auth_OpenID_AuthRequest(&$endpoint, $assoc) + function Auth_OpenID_AuthRequest($endpoint, $assoc) { $this->assoc = $assoc; - $this->endpoint =& $endpoint; + $this->endpoint = $endpoint; $this->return_to_args = array(); $this->message = new Auth_OpenID_Message( $endpoint->preferredNamespace()); @@ -1764,7 +1764,7 @@ class Auth_OpenID_AuthRequest { * $extension_request: An object that implements the extension * request interface for adding arguments to an OpenID message. */ - function addExtension(&$extension_request) + function addExtension($extension_request) { $extension_request->toMessage($this->message); } @@ -2089,7 +2089,7 @@ class Auth_OpenID_SuccessResponse extends Auth_OpenID_ConsumerResponse { foreach ($msg_args as $key => $value) { if (!$this->isSigned($ns_uri, $key)) { - return null; + unset($msg_args[$key]); } } @@ -2167,7 +2167,7 @@ class Auth_OpenID_ServerErrorContainer { /** * @access private */ - function fromMessage($message) + static function fromMessage($message) { $error_text = $message->getArg( Auth_OpenID_OPENID_NS, 'error', '<no error message supplied>'); @@ -2227,4 +2227,4 @@ class Auth_OpenID_SetupNeededResponse extends Auth_OpenID_ConsumerResponse { } } -?> + diff --git a/extlib/Auth/OpenID/CryptUtil.php b/extlib/Auth/OpenID/CryptUtil.php index aacc3cd39..a92626777 100644 --- a/extlib/Auth/OpenID/CryptUtil.php +++ b/extlib/Auth/OpenID/CryptUtil.php @@ -37,7 +37,7 @@ class Auth_OpenID_CryptUtil { * @param int $num_bytes The length of the return value * @return string $bytes random bytes */ - function getBytes($num_bytes) + static function getBytes($num_bytes) { static $f = null; $bytes = ''; @@ -77,7 +77,7 @@ class Auth_OpenID_CryptUtil { * @return string $result A string of randomly-chosen characters * from $chrs */ - function randomString($length, $population = null) + static function randomString($length, $population = null) { if ($population === null) { return Auth_OpenID_CryptUtil::getBytes($length); @@ -106,4 +106,3 @@ class Auth_OpenID_CryptUtil { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/DatabaseConnection.php b/extlib/Auth/OpenID/DatabaseConnection.php index 9db6e0eb3..0c7d08f91 100644 --- a/extlib/Auth/OpenID/DatabaseConnection.php +++ b/extlib/Auth/OpenID/DatabaseConnection.php @@ -128,4 +128,3 @@ class Auth_OpenID_DatabaseConnection { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/DiffieHellman.php b/extlib/Auth/OpenID/DiffieHellman.php index f4ded7eba..3e25b7dbb 100644 --- a/extlib/Auth/OpenID/DiffieHellman.php +++ b/extlib/Auth/OpenID/DiffieHellman.php @@ -51,9 +51,9 @@ class Auth_OpenID_DiffieHellman { $private = null, $lib = null) { if ($lib === null) { - $this->lib =& Auth_OpenID_getMathLib(); + $this->lib = Auth_OpenID_getMathLib(); } else { - $this->lib =& $lib; + $this->lib = $lib; } if ($mod === null) { @@ -110,4 +110,4 @@ class Auth_OpenID_DiffieHellman { } } -?> + diff --git a/extlib/Auth/OpenID/Discover.php b/extlib/Auth/OpenID/Discover.php index 62aeb1d2b..7b0c640c5 100644 --- a/extlib/Auth/OpenID/Discover.php +++ b/extlib/Auth/OpenID/Discover.php @@ -28,8 +28,34 @@ function Auth_OpenID_getOpenIDTypeURIs() Auth_OpenID_TYPE_2_0, Auth_OpenID_TYPE_1_2, Auth_OpenID_TYPE_1_1, - Auth_OpenID_TYPE_1_0, - Auth_OpenID_RP_RETURN_TO_URL_TYPE); + Auth_OpenID_TYPE_1_0); +} + +function Auth_OpenID_getOpenIDConsumerTypeURIs() +{ + return array(Auth_OpenID_RP_RETURN_TO_URL_TYPE); +} + + +/* + * Provides a user-readable interpretation of a type uri. + * Useful for error messages. + */ +function Auth_OpenID_getOpenIDTypeName($type_uri) { + switch ($type_uri) { + case Auth_OpenID_TYPE_2_0_IDP: + return 'OpenID 2.0 IDP'; + case Auth_OpenID_TYPE_2_0: + return 'OpenID 2.0'; + case Auth_OpenID_TYPE_1_2: + return 'OpenID 1.2'; + case Auth_OpenID_TYPE_1_1: + return 'OpenID 1.1'; + case Auth_OpenID_TYPE_1_0: + return 'OpenID 1.0'; + case Auth_OpenID_RP_RETURN_TO_URL_TYPE: + return 'OpenID relying party'; + } } /** @@ -124,7 +150,7 @@ class Auth_OpenID_ServiceEndpoint { return in_array(Auth_OpenID_TYPE_2_0_IDP, $this->type_uris); } - function fromOPEndpointURL($op_endpoint_url) + static function fromOPEndpointURL($op_endpoint_url) { // Construct an OP-Identifier OpenIDServiceEndpoint object for // a given OP Endpoint URL @@ -172,15 +198,34 @@ class Auth_OpenID_ServiceEndpoint { } /* - * Parse the given document as XRDS looking for OpenID services. + * Parse the given document as XRDS looking for OpenID consumer services. * * @return array of Auth_OpenID_ServiceEndpoint or null if the * document cannot be parsed. */ - function fromXRDS($uri, $xrds_text) + function consumerFromXRDS($uri, $xrds_text) { $xrds =& Auth_Yadis_XRDS::parseXRDS($xrds_text); + if ($xrds) { + $yadis_services = + $xrds->services(array('filter_MatchesAnyOpenIDConsumerType')); + return Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services); + } + + return null; + } + + /* + * Parse the given document as XRDS looking for OpenID services. + * + * @return array of Auth_OpenID_ServiceEndpoint or null if the + * document cannot be parsed. + */ + static function fromXRDS($uri, $xrds_text) + { + $xrds = Auth_Yadis_XRDS::parseXRDS($xrds_text); + if ($xrds) { $yadis_services = $xrds->services(array('filter_MatchesAnyOpenIDType')); @@ -197,7 +242,7 @@ class Auth_OpenID_ServiceEndpoint { * @return array of Auth_OpenID_ServiceEndpoint or null if * endpoints cannot be created. */ - function fromDiscoveryResult($discoveryResult) + static function fromDiscoveryResult($discoveryResult) { if ($discoveryResult->isXRDS()) { return Auth_OpenID_ServiceEndpoint::fromXRDS( @@ -210,7 +255,7 @@ class Auth_OpenID_ServiceEndpoint { } } - function fromHTML($uri, $html) + static function fromHTML($uri, $html) { $discovery_types = array( array(Auth_OpenID_TYPE_2_0, @@ -273,7 +318,7 @@ function Auth_OpenID_findOPLocalIdentifier($service, $type_uris) $service->parser->registerNamespace('xrd', Auth_Yadis_XMLNS_XRD_2_0); - $parser =& $service->parser; + $parser = $service->parser; $permitted_tags = array(); @@ -305,7 +350,7 @@ function Auth_OpenID_findOPLocalIdentifier($service, $type_uris) return $local_id; } -function filter_MatchesAnyOpenIDType(&$service) +function filter_MatchesAnyOpenIDType($service) { $uris = $service->getTypes(); @@ -318,6 +363,19 @@ function filter_MatchesAnyOpenIDType(&$service) return false; } +function filter_MatchesAnyOpenIDConsumerType(&$service) +{ + $uris = $service->getTypes(); + + foreach ($uris as $uri) { + if (in_array($uri, Auth_OpenID_getOpenIDConsumerTypeURIs())) { + return true; + } + } + + return false; +} + function Auth_OpenID_bestMatchingService($service, $preferred_types) { // Return the index of the first matching type, or something @@ -415,7 +473,7 @@ function Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services) return $s; } -function Auth_OpenID_discoverWithYadis($uri, &$fetcher, +function Auth_OpenID_discoverWithYadis($uri, $fetcher, $endpoint_filter='Auth_OpenID_getOPOrUserServices', $discover_function=null) { @@ -433,12 +491,12 @@ function Auth_OpenID_discoverWithYadis($uri, &$fetcher, $openid_services = array(); $response = call_user_func_array($discover_function, - array($uri, &$fetcher)); + array($uri, $fetcher)); $yadis_url = $response->normalized_uri; $yadis_services = array(); - if ($response->isFailure()) { + if ($response->isFailure() && !$response->isXRDS()) { return array($uri, array()); } @@ -460,18 +518,18 @@ function Auth_OpenID_discoverWithYadis($uri, &$fetcher, } $openid_services = call_user_func_array($endpoint_filter, - array(&$openid_services)); + array($openid_services)); return array($yadis_url, $openid_services); } -function Auth_OpenID_discoverURI($uri, &$fetcher) +function Auth_OpenID_discoverURI($uri, $fetcher) { $uri = Auth_OpenID::normalizeUrl($uri); return Auth_OpenID_discoverWithYadis($uri, $fetcher); } -function Auth_OpenID_discoverWithoutYadis($uri, &$fetcher) +function Auth_OpenID_discoverWithoutYadis($uri, $fetcher) { $http_resp = @$fetcher->get($uri); @@ -490,7 +548,7 @@ function Auth_OpenID_discoverWithoutYadis($uri, &$fetcher) return array($identity_url, $openid_services); } -function Auth_OpenID_discoverXRI($iname, &$fetcher) +function Auth_OpenID_discoverXRI($iname, $fetcher) { $resolver = new Auth_Yadis_ProxyResolver($fetcher); list($canonicalID, $yadis_services) = @@ -513,7 +571,7 @@ function Auth_OpenID_discoverXRI($iname, &$fetcher) return array($iname, $openid_services); } -function Auth_OpenID_discover($uri, &$fetcher) +function Auth_OpenID_discover($uri, $fetcher) { // If the fetcher (i.e., PHP) doesn't support SSL, we can't do // discovery on an HTTPS URL. @@ -545,4 +603,4 @@ function Auth_OpenID_discover($uri, &$fetcher) return $result; } -?> + diff --git a/extlib/Auth/OpenID/DumbStore.php b/extlib/Auth/OpenID/DumbStore.php index 22fd2d366..e8f29ace5 100644 --- a/extlib/Auth/OpenID/DumbStore.php +++ b/extlib/Auth/OpenID/DumbStore.php @@ -97,4 +97,3 @@ class Auth_OpenID_DumbStore extends Auth_OpenID_OpenIDStore { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/Extension.php b/extlib/Auth/OpenID/Extension.php index f362a4b38..c4e38c038 100644 --- a/extlib/Auth/OpenID/Extension.php +++ b/extlib/Auth/OpenID/Extension.php @@ -39,7 +39,7 @@ class Auth_OpenID_Extension { * * Returns the message with the extension arguments added. */ - function toMessage(&$message) + function toMessage($message) { $implicit = $message->isOpenID1(); $added = $message->namespaces->addAlias($this->ns_uri, @@ -59,4 +59,3 @@ class Auth_OpenID_Extension { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/FileStore.php b/extlib/Auth/OpenID/FileStore.php index 29d8d20e7..074421a0b 100644 --- a/extlib/Auth/OpenID/FileStore.php +++ b/extlib/Auth/OpenID/FileStore.php @@ -367,7 +367,7 @@ class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore { } if ( abs($timestamp - time()) > $Auth_OpenID_SKEW ) { - return False; + return false; } if ($server_url) { @@ -519,7 +519,7 @@ class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore { /** * @access private */ - function _mkdtemp($dir) + static function _mkdtemp($dir) { foreach (range(0, 4) as $i) { $name = $dir . strval(DIRECTORY_SEPARATOR) . strval(getmypid()) . @@ -615,4 +615,4 @@ class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore { } } -?> + diff --git a/extlib/Auth/OpenID/HMAC.php b/extlib/Auth/OpenID/HMAC.php index ec42db8df..e9779bd4e 100644 --- a/extlib/Auth/OpenID/HMAC.php +++ b/extlib/Auth/OpenID/HMAC.php @@ -96,4 +96,3 @@ if (function_exists('hash_hmac') && define('Auth_OpenID_HMACSHA256_SUPPORTED', false); } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/Interface.php b/extlib/Auth/OpenID/Interface.php index f4c6062f8..eca6b9c50 100644 --- a/extlib/Auth/OpenID/Interface.php +++ b/extlib/Auth/OpenID/Interface.php @@ -194,4 +194,3 @@ class Auth_OpenID_OpenIDStore { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/KVForm.php b/extlib/Auth/OpenID/KVForm.php index fb342a001..dd02661d8 100644 --- a/extlib/Auth/OpenID/KVForm.php +++ b/extlib/Auth/OpenID/KVForm.php @@ -26,7 +26,7 @@ class Auth_OpenID_KVForm { * @static * @access private */ - function toArray($kvs, $strict=false) + static function toArray($kvs, $strict=false) { $lines = explode("\n", $kvs); @@ -78,7 +78,7 @@ class Auth_OpenID_KVForm { * @static * @access private */ - function fromArray($values) + static function fromArray($values) { if ($values === null) { return null; @@ -109,4 +109,3 @@ class Auth_OpenID_KVForm { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/MemcachedStore.php b/extlib/Auth/OpenID/MemcachedStore.php index d357c6b11..fc10800b1 100644 --- a/extlib/Auth/OpenID/MemcachedStore.php +++ b/extlib/Auth/OpenID/MemcachedStore.php @@ -205,4 +205,3 @@ class Auth_OpenID_MemcachedStore extends Auth_OpenID_OpenIDStore { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/Message.php b/extlib/Auth/OpenID/Message.php index 5ab115a86..9aa1fa468 100644 --- a/extlib/Auth/OpenID/Message.php +++ b/extlib/Auth/OpenID/Message.php @@ -143,7 +143,7 @@ class Auth_OpenID_Mapping { * Returns true if $thing is an Auth_OpenID_Mapping object; false * if not. */ - function isA($thing) + static function isA($thing) { return (is_object($thing) && strtolower(get_class($thing)) == 'auth_openid_mapping'); @@ -442,7 +442,7 @@ class Auth_OpenID_Message { return $this->getOpenIDNamespace() == Auth_OpenID_OPENID2_NS; } - function fromPostArgs($args) + static function fromPostArgs($args) { // Construct a Message containing a set of POST arguments $obj = new Auth_OpenID_Message(); @@ -477,7 +477,7 @@ class Auth_OpenID_Message { } } - function fromOpenIDArgs($openid_args) + static function fromOpenIDArgs($openid_args) { // Takes an array. @@ -594,7 +594,7 @@ class Auth_OpenID_Message { return $this->_openid_ns_uri; } - function fromKVForm($kvform_string) + static function fromKVForm($kvform_string) { // Create a Message from a KVForm string return Auth_OpenID_Message::fromOpenIDArgs( @@ -917,4 +917,4 @@ class Auth_OpenID_Message { } } -?> + diff --git a/extlib/Auth/OpenID/MySQLStore.php b/extlib/Auth/OpenID/MySQLStore.php index eb08af016..810f059f1 100644 --- a/extlib/Auth/OpenID/MySQLStore.php +++ b/extlib/Auth/OpenID/MySQLStore.php @@ -75,4 +75,3 @@ class Auth_OpenID_MySQLStore extends Auth_OpenID_SQLStore { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/Nonce.php b/extlib/Auth/OpenID/Nonce.php index effecac38..b83c5911f 100644 --- a/extlib/Auth/OpenID/Nonce.php +++ b/extlib/Auth/OpenID/Nonce.php @@ -106,4 +106,3 @@ function Auth_OpenID_mkNonce($when = null) return $time_str . $salt; } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/PAPE.php b/extlib/Auth/OpenID/PAPE.php index 62cba8a91..f08ca8bd0 100644 --- a/extlib/Auth/OpenID/PAPE.php +++ b/extlib/Auth/OpenID/PAPE.php @@ -21,7 +21,7 @@ define('PAPE_AUTH_PHISHING_RESISTANT', 'http://schemas.openid.net/pape/policies/2007/06/phishing-resistant'); define('PAPE_TIME_VALIDATOR', - '^[0-9]{4,4}-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]Z$'); + '/^[0-9]{4,4}-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]Z$/'); /** * A Provider Authentication Policy request, sent from a relying party * to a provider @@ -82,7 +82,7 @@ class Auth_OpenID_PAPE_Request extends Auth_OpenID_Extension { * Instantiate a Request object from the arguments in a checkid_* * OpenID message */ - function fromOpenIDRequest($request) + static function fromOpenIDRequest($request) { $obj = new Auth_OpenID_PAPE_Request(); $args = $request->message->getArgs(Auth_OpenID_PAPE_NS_URI); @@ -201,7 +201,7 @@ class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { * @returns: A provider authentication policy response from the * data that was supplied with the id_res response. */ - function fromSuccessResponse($success_response) + static function fromSuccessResponse($success_response) { $obj = new Auth_OpenID_PAPE_Response(); @@ -262,7 +262,7 @@ class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { $auth_time = Auth_OpenID::arrayGet($args, 'auth_time'); if ($auth_time !== null) { - if (ereg(PAPE_TIME_VALIDATOR, $auth_time)) { + if (preg_match(PAPE_TIME_VALIDATOR, $auth_time)) { $this->auth_time = $auth_time; } else if ($strict) { return false; @@ -287,7 +287,7 @@ class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { } if ($this->auth_time !== null) { - if (!ereg(PAPE_TIME_VALIDATOR, $this->auth_time)) { + if (!preg_match(PAPE_TIME_VALIDATOR, $this->auth_time)) { return false; } @@ -298,4 +298,3 @@ class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/Parse.php b/extlib/Auth/OpenID/Parse.php index 546f34f6b..6c2e72169 100644 --- a/extlib/Auth/OpenID/Parse.php +++ b/extlib/Auth/OpenID/Parse.php @@ -101,7 +101,7 @@ class Auth_OpenID_Parse { * Starts with the tag name at a word boundary, where the tag name * is not a namespace */ - var $_tag_expr = "<%s\b(?!:)([^>]*?)(?:\/>|>(.*?)(?:<\/?%s\s*>|\Z))"; + var $_tag_expr = "<%s\b(?!:)([^>]*?)(?:\/>|>(.*)(?:<\/?%s\s*>|\Z))"; var $_attr_find = '\b(\w+)=("[^"]*"|\'[^\']*\'|[^\'"\s\/<>]+)'; @@ -215,11 +215,31 @@ class Auth_OpenID_Parse { return $str; } } + + function match($regexp, $text, &$match) + { + if (!is_callable('mb_ereg_search_init')) { + return preg_match($regexp, $text, $match); + } + + $regexp = substr($regexp, 1, strlen($regexp) - 2 - strlen($this->_re_flags)); + mb_ereg_search_init($text); + if (!mb_ereg_search($regexp)) { + return false; + } + list($match) = mb_ereg_search_getregs(); + return true; + } /** * Find all link tags in a string representing a HTML document and * return a list of their attributes. * + * @todo This is quite ineffective and may fail with the default + * pcre.backtrack_limit of 100000 in PHP 5.2, if $html is big. + * It should rather use stripos (in PHP5) or strpos()+strtoupper() + * in PHP4 to manage this. + * * @param string $html The text to parse * @return array $list An array of arrays of attributes, one for each * link tag @@ -244,18 +264,23 @@ class Auth_OpenID_Parse { $stripped = substr($stripped, $html_begin, $html_end - $html_begin); + // Workaround to prevent PREG_BACKTRACK_LIMIT_ERROR: + $old_btlimit = ini_set( 'pcre.backtrack_limit', -1 ); + // Try to find the <HEAD> tag. $head_re = $this->headFind(); - $head_matches = array(); - if (!preg_match($head_re, $stripped, $head_matches)) { - return array(); + $head_match = ''; + if (!$this->match($head_re, $stripped, $head_match)) { + ini_set( 'pcre.backtrack_limit', $old_btlimit ); + return array(); } $link_data = array(); $link_matches = array(); - if (!preg_match_all($this->_link_find, $head_matches[0], + if (!preg_match_all($this->_link_find, $head_match, $link_matches)) { + ini_set( 'pcre.backtrack_limit', $old_btlimit ); return array(); } @@ -273,6 +298,7 @@ class Auth_OpenID_Parse { $link_data[] = $link_attrs; } + ini_set( 'pcre.backtrack_limit', $old_btlimit ); return $link_data; } @@ -349,4 +375,3 @@ function Auth_OpenID_legacy_discover($html_text, $server_rel, } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/PostgreSQLStore.php b/extlib/Auth/OpenID/PostgreSQLStore.php index 69d95e7b8..d90e43e00 100644 --- a/extlib/Auth/OpenID/PostgreSQLStore.php +++ b/extlib/Auth/OpenID/PostgreSQLStore.php @@ -110,4 +110,3 @@ class Auth_OpenID_PostgreSQLStore extends Auth_OpenID_SQLStore { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/SQLStore.php b/extlib/Auth/OpenID/SQLStore.php index da93c6aa2..c04059732 100644 --- a/extlib/Auth/OpenID/SQLStore.php +++ b/extlib/Auth/OpenID/SQLStore.php @@ -13,16 +13,6 @@ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache */ -/** - * Require the PEAR DB module because we'll need it for the SQL-based - * stores implemented here. We silence any errors from the inclusion - * because it might not be present, and a user of the SQL stores may - * supply an Auth_OpenID_DatabaseConnection instance that implements - * its own storage. - */ -global $__Auth_OpenID_PEAR_AVAILABLE; -$__Auth_OpenID_PEAR_AVAILABLE = @include_once 'DB.php'; - /** * @access private */ @@ -89,8 +79,6 @@ class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore { $associations_table = null, $nonces_table = null) { - global $__Auth_OpenID_PEAR_AVAILABLE; - $this->associations_table_name = "oid_associations"; $this->nonces_table_name = "oid_nonces"; @@ -113,7 +101,7 @@ class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore { // constant, so only try to use it if PEAR is present. Note // that Auth_Openid_Databaseconnection instances need not // implement ::setFetchMode for this reason. - if ($__Auth_OpenID_PEAR_AVAILABLE) { + if (is_subclass_of($this->connection, 'db_common')) { $this->connection->setFetchMode(DB_FETCHMODE_ASSOC); } @@ -482,7 +470,7 @@ class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore { global $Auth_OpenID_SKEW; if ( abs($timestamp - time()) > $Auth_OpenID_SKEW ) { - return False; + return false; } return $this->_add_nonce($server_url, $timestamp, $salt); @@ -566,4 +554,4 @@ class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore { } } -?> + diff --git a/extlib/Auth/OpenID/SQLiteStore.php b/extlib/Auth/OpenID/SQLiteStore.php index ec2bf58e4..4558fa1c3 100644 --- a/extlib/Auth/OpenID/SQLiteStore.php +++ b/extlib/Auth/OpenID/SQLiteStore.php @@ -68,4 +68,3 @@ class Auth_OpenID_SQLiteStore extends Auth_OpenID_SQLStore { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/SReg.php b/extlib/Auth/OpenID/SReg.php index 63280769f..5ece70724 100644 --- a/extlib/Auth/OpenID/SReg.php +++ b/extlib/Auth/OpenID/SReg.php @@ -94,7 +94,7 @@ Auth_OpenID_registerNamespaceAlias(Auth_OpenID_SREG_NS_URI_1_1, 'sreg'); * $endpoint: The endpoint object as returned by OpenID discovery. * returns whether an sreg type was advertised by the endpoint */ -function Auth_OpenID_supportsSReg(&$endpoint) +function Auth_OpenID_supportsSReg($endpoint) { return ($endpoint->usesExtension(Auth_OpenID_SREG_NS_URI_1_1) || $endpoint->usesExtension(Auth_OpenID_SREG_NS_URI_1_0)); @@ -122,7 +122,7 @@ class Auth_OpenID_SRegBase extends Auth_OpenID_Extension { * * @access private */ - function _getSRegNS(&$message) + static function _getSRegNS($message) { $alias = null; $found_ns_uri = null; @@ -173,7 +173,7 @@ class Auth_OpenID_SRegRequest extends Auth_OpenID_SRegBase { /** * Initialize an empty simple registration request. */ - function build($required=null, $optional=null, + static function build($required=null, $optional=null, $policy_url=null, $sreg_ns_uri=Auth_OpenID_SREG_NS_URI, $cls='Auth_OpenID_SRegRequest') @@ -213,7 +213,7 @@ class Auth_OpenID_SRegRequest extends Auth_OpenID_SRegBase { * * Returns the newly created simple registration request */ - function fromOpenIDRequest($request, $cls='Auth_OpenID_SRegRequest') + static function fromOpenIDRequest($request, $cls='Auth_OpenID_SRegRequest') { $obj = call_user_func_array(array($cls, 'build'), @@ -442,7 +442,7 @@ class Auth_OpenID_SRegResponse extends Auth_OpenID_SRegBase { * string (unicode) value. For instance, the nickname should be * stored under the key 'nickname'. */ - function extractResponse($request, $data) + static function extractResponse($request, $data) { $obj = new Auth_OpenID_SRegResponse(); $obj->ns_uri = $request->ns_uri; @@ -471,7 +471,7 @@ class Auth_OpenID_SRegResponse extends Auth_OpenID_SRegBase { * Returns a simple registration response containing the data that * was supplied with the C{id_res} response. */ - function fromSuccessResponse(&$success_response, $signed_only=true) + static function fromSuccessResponse($success_response, $signed_only=true) { global $Auth_OpenID_sreg_data_fields; @@ -518,4 +518,4 @@ class Auth_OpenID_SRegResponse extends Auth_OpenID_SRegBase { } } -?> + diff --git a/extlib/Auth/OpenID/Server.php b/extlib/Auth/OpenID/Server.php index f1db4d872..cc8ba961c 100644 --- a/extlib/Auth/OpenID/Server.php +++ b/extlib/Auth/OpenID/Server.php @@ -43,7 +43,7 @@ * consumers to add extensions to their requests. For example, with * sites using the Simple Registration * Extension - * (http://www.openidenabled.com/openid/simple-registration-extension/), + * (http://openid.net/specs/openid-simple-registration-extension-1_0.html), * a user can agree to have their nickname and e-mail address sent to * a site when they sign up. * @@ -365,7 +365,7 @@ class Auth_OpenID_CheckAuthRequest extends Auth_OpenID_Request { $this->message = null; } - function fromMessage($message, $server=null) + static function fromMessage($message, $server=null) { $required_keys = array('assoc_handle', 'sig', 'signed'); @@ -396,7 +396,7 @@ class Auth_OpenID_CheckAuthRequest extends Auth_OpenID_Request { return $result; } - function answer(&$signatory) + function answer($signatory) { $is_valid = $signatory->verify($this->assoc_handle, $this->signed); @@ -436,7 +436,7 @@ class Auth_OpenID_PlainTextServerSession { var $needs_math = false; var $allowed_assoc_types = array('HMAC-SHA1', 'HMAC-SHA256'); - function fromMessage($unused_request) + static function fromMessage($unused_request) { return new Auth_OpenID_PlainTextServerSession(); } @@ -469,7 +469,7 @@ class Auth_OpenID_DiffieHellmanSHA1ServerSession { $this->consumer_pubkey = $consumer_pubkey; } - function getDH($message) + static function getDH($message) { $dh_modulus = $message->getArg(Auth_OpenID_OPENID_NS, 'dh_modulus'); $dh_gen = $message->getArg(Auth_OpenID_OPENID_NS, 'dh_gen'); @@ -489,7 +489,7 @@ class Auth_OpenID_DiffieHellmanSHA1ServerSession { $missing); } - $lib =& Auth_OpenID_getMathLib(); + $lib = Auth_OpenID_getMathLib(); if ($dh_modulus || $dh_gen) { $dh_modulus = $lib->base64ToLong($dh_modulus); @@ -523,7 +523,7 @@ class Auth_OpenID_DiffieHellmanSHA1ServerSession { return array($dh, $consumer_pubkey); } - function fromMessage($message) + static function fromMessage($message) { $result = Auth_OpenID_DiffieHellmanSHA1ServerSession::getDH($message); @@ -538,7 +538,7 @@ class Auth_OpenID_DiffieHellmanSHA1ServerSession { function answer($secret) { - $lib =& Auth_OpenID_getMathLib(); + $lib = Auth_OpenID_getMathLib(); $mac_key = $this->dh->xorSecret($this->consumer_pubkey, $secret, $this->hash_func); return array( @@ -560,7 +560,7 @@ class Auth_OpenID_DiffieHellmanSHA256ServerSession var $hash_func = 'Auth_OpenID_SHA256'; var $allowed_assoc_types = array('HMAC-SHA256'); - function fromMessage($message) + static function fromMessage($message) { $result = Auth_OpenID_DiffieHellmanSHA1ServerSession::getDH($message); @@ -582,7 +582,7 @@ class Auth_OpenID_DiffieHellmanSHA256ServerSession class Auth_OpenID_AssociateRequest extends Auth_OpenID_Request { var $mode = "associate"; - function getSessionClasses() + static function getSessionClasses() { return array( 'no-encryption' => 'Auth_OpenID_PlainTextServerSession', @@ -590,14 +590,14 @@ class Auth_OpenID_AssociateRequest extends Auth_OpenID_Request { 'DH-SHA256' => 'Auth_OpenID_DiffieHellmanSHA256ServerSession'); } - function Auth_OpenID_AssociateRequest(&$session, $assoc_type) + function Auth_OpenID_AssociateRequest($session, $assoc_type) { - $this->session =& $session; + $this->session = $session; $this->namespace = Auth_OpenID_OPENID2_NS; $this->assoc_type = $assoc_type; } - function fromMessage($message, $server=null) + static function fromMessage($message, $server=null) { if ($message->isOpenID1()) { $session_type = $message->getArg(Auth_OpenID_OPENID_NS, @@ -696,7 +696,7 @@ class Auth_OpenID_AssociateRequest extends Auth_OpenID_Request { 'session_type', $preferred_session_type); } - + $response->code = AUTH_OPENID_HTTP_ERROR; return $response; } } @@ -734,7 +734,7 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { */ var $namespace; - function make(&$message, $identity, $return_to, $trust_root = null, + static function make($message, $identity, $return_to, $trust_root = null, $immediate = false, $assoc_handle = null, $server = null) { if ($server === null) { @@ -752,7 +752,7 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { $assoc_handle, $server); $r->namespace = $message->getOpenIDNamespace(); - $r->message =& $message; + $r->message = $message; if (!$r->trustRootValid()) { return new Auth_OpenID_UntrustedReturnURL($message, @@ -778,7 +778,7 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { } $this->return_to = $return_to; $this->trust_root = $trust_root; - $this->server =& $server; + $this->server = $server; if ($immediate) { $this->immediate = true; @@ -817,11 +817,12 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { */ function returnToVerified() { + $fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); return call_user_func_array($this->verifyReturnTo, - array($this->trust_root, $this->return_to)); + array($this->trust_root, $this->return_to, $fetcher)); } - - function fromMessage(&$message, $server) + + static function fromMessage($message, $server) { $mode = $message->getArg(Auth_OpenID_OPENID_NS, 'mode'); $immediate = null; @@ -1097,7 +1098,7 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { in OpenID 1.x immediate mode.'); } - $setup_request =& new Auth_OpenID_CheckIDRequest( + $setup_request = new Auth_OpenID_CheckIDRequest( $this->identity, $this->return_to, $this->trust_root, @@ -1183,9 +1184,9 @@ class Auth_OpenID_CheckIDRequest extends Auth_OpenID_Request { */ class Auth_OpenID_ServerResponse { - function Auth_OpenID_ServerResponse(&$request) + function Auth_OpenID_ServerResponse($request) { - $this->request =& $request; + $this->request = $request; $this->fields = new Auth_OpenID_Message($this->request->namespace); } @@ -1310,10 +1311,10 @@ class Auth_OpenID_Signatory { /** * Create a new signatory using a given store. */ - function Auth_OpenID_Signatory(&$store) + function Auth_OpenID_Signatory($store) { // assert store is not None - $this->store =& $store; + $this->store = $store; } /** @@ -1447,7 +1448,7 @@ class Auth_OpenID_Encoder { * Encode an {@link Auth_OpenID_ServerResponse} and return an * {@link Auth_OpenID_WebResponse}. */ - function encode(&$response) + function encode($response) { $cls = $this->responseFactory; @@ -1463,10 +1464,14 @@ class Auth_OpenID_Encoder { array('location' => $location)); } else if ($encode_as == Auth_OpenID_ENCODE_HTML_FORM) { $wr = new $cls(AUTH_OPENID_HTTP_OK, array(), - $response->toFormMarkup()); + $response->toHTML()); } else { return new Auth_OpenID_EncodingError($response); } + /* Allow the response to carry a custom error code (ex: for Association errors) */ + if(isset($response->code)) { + $wr->code = $response->code; + } return $wr; } } @@ -1478,16 +1483,16 @@ class Auth_OpenID_Encoder { */ class Auth_OpenID_SigningEncoder extends Auth_OpenID_Encoder { - function Auth_OpenID_SigningEncoder(&$signatory) + function Auth_OpenID_SigningEncoder($signatory) { - $this->signatory =& $signatory; + $this->signatory = $signatory; } /** * Sign an {@link Auth_OpenID_ServerResponse} and return an * {@link Auth_OpenID_WebResponse}. */ - function encode(&$response) + function encode($response) { // the isinstance is a bit of a kludge... it means there isn't // really an adapter to make the interfaces quite match. @@ -1516,9 +1521,9 @@ class Auth_OpenID_SigningEncoder extends Auth_OpenID_Encoder { */ class Auth_OpenID_Decoder { - function Auth_OpenID_Decoder(&$server) + function Auth_OpenID_Decoder($server) { - $this->server =& $server; + $this->server = $server; $this->handlers = array( 'checkid_setup' => 'Auth_OpenID_CheckIDRequest', @@ -1599,9 +1604,9 @@ class Auth_OpenID_Decoder { * @package OpenID */ class Auth_OpenID_EncodingError { - function Auth_OpenID_EncodingError(&$response) + function Auth_OpenID_EncodingError($response) { - $this->response =& $response; + $this->response = $response; } } @@ -1674,14 +1679,14 @@ class Auth_OpenID_UntrustedReturnURL extends Auth_OpenID_ServerError { * @package OpenID */ class Auth_OpenID_Server { - function Auth_OpenID_Server(&$store, $op_endpoint=null) + function Auth_OpenID_Server($store, $op_endpoint=null) { - $this->store =& $store; - $this->signatory =& new Auth_OpenID_Signatory($this->store); - $this->encoder =& new Auth_OpenID_SigningEncoder($this->signatory); - $this->decoder =& new Auth_OpenID_Decoder($this); + $this->store = $store; + $this->signatory = new Auth_OpenID_Signatory($this->store); + $this->encoder = new Auth_OpenID_SigningEncoder($this->signatory); + $this->decoder = new Auth_OpenID_Decoder($this); $this->op_endpoint = $op_endpoint; - $this->negotiator =& Auth_OpenID_getDefaultNegotiator(); + $this->negotiator = Auth_OpenID_getDefaultNegotiator(); } /** @@ -1699,7 +1704,7 @@ class Auth_OpenID_Server { { if (method_exists($this, "openid_" . $request->mode)) { $handler = array($this, "openid_" . $request->mode); - return call_user_func($handler, $request); + return call_user_func($handler, &$request); } return null; } @@ -1707,7 +1712,7 @@ class Auth_OpenID_Server { /** * The callback for 'check_authentication' messages. */ - function openid_check_authentication(&$request) + function openid_check_authentication($request) { return $request->answer($this->signatory); } @@ -1715,7 +1720,7 @@ class Auth_OpenID_Server { /** * The callback for 'associate' messages. */ - function openid_associate(&$request) + function openid_associate($request) { $assoc_type = $request->assoc_type; $session_type = $request->session->session_type; @@ -1738,7 +1743,7 @@ class Auth_OpenID_Server { * Encodes as response in the appropriate format suitable for * sending to the user agent. */ - function encodeResponse(&$response) + function encodeResponse($response) { return $this->encoder->encode($response); } @@ -1757,4 +1762,4 @@ class Auth_OpenID_Server { } } -?> + diff --git a/extlib/Auth/OpenID/ServerRequest.php b/extlib/Auth/OpenID/ServerRequest.php index 33a8556ce..69222a5e0 100644 --- a/extlib/Auth/OpenID/ServerRequest.php +++ b/extlib/Auth/OpenID/ServerRequest.php @@ -34,4 +34,3 @@ class Auth_OpenID_ServerRequest { } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/TrustRoot.php b/extlib/Auth/OpenID/TrustRoot.php index 4919a6065..000440b58 100644 --- a/extlib/Auth/OpenID/TrustRoot.php +++ b/extlib/Auth/OpenID/TrustRoot.php @@ -58,7 +58,7 @@ class Auth_OpenID_TrustRoot { * @return The URL upon which relying party discovery should be * run in order to verify the return_to URL */ - function buildDiscoveryURL($realm) + static function buildDiscoveryURL($realm) { $parsed = Auth_OpenID_TrustRoot::_parse($realm); @@ -93,7 +93,7 @@ class Auth_OpenID_TrustRoot { * @return mixed $parsed Either an associative array of trust root * parts or false if parsing failed. */ - function _parse($trust_root) + static function _parse($trust_root) { $trust_root = Auth_OpenID_urinorm($trust_root); if ($trust_root === null) { @@ -199,7 +199,7 @@ class Auth_OpenID_TrustRoot { * @param string $trust_root The trust root to check * @return bool $sanity Whether the trust root looks OK */ - function isSane($trust_root) + static function isSane($trust_root) { $parts = Auth_OpenID_TrustRoot::_parse($trust_root); if ($parts === false) { @@ -269,7 +269,7 @@ class Auth_OpenID_TrustRoot { * @return bool $matches Whether the URL matches against the * trust root */ - function match($trust_root, $url) + static function match($trust_root, $url) { $trust_root_parsed = Auth_OpenID_TrustRoot::_parse($trust_root); $url_parsed = Auth_OpenID_TrustRoot::_parse($url); @@ -341,7 +341,7 @@ class Auth_OpenID_TrustRoot { * @returns: The endpoint URL or None if the endpoint is not a * relying party endpoint. */ -function filter_extractReturnURL(&$endpoint) +function filter_extractReturnURL($endpoint) { if ($endpoint->matchTypes(array(Auth_OpenID_RP_RETURN_TO_URL_TYPE))) { return $endpoint; @@ -394,14 +394,14 @@ function Auth_OpenID_returnToMatches($allowed_return_to_urls, $return_to) * Given a relying party discovery URL return a list of return_to * URLs. */ -function Auth_OpenID_getAllowedReturnURLs($relying_party_url, &$fetcher, +function Auth_OpenID_getAllowedReturnURLs($relying_party_url, $fetcher, $discover_function=null) { if ($discover_function === null) { $discover_function = array('Auth_Yadis_Yadis', 'discover'); } - $xrds_parse_cb = array('Auth_OpenID_ServiceEndpoint', 'fromXRDS'); + $xrds_parse_cb = array('Auth_OpenID_ServiceEndpoint', 'consumerFromXRDS'); list($rp_url_after_redirects, $endpoints) = Auth_Yadis_getServiceEndpoints($relying_party_url, $xrds_parse_cb, @@ -413,7 +413,7 @@ function Auth_OpenID_getAllowedReturnURLs($relying_party_url, &$fetcher, } call_user_func_array($discover_function, - array($relying_party_url, $fetcher)); + array($relying_party_url, &$fetcher)); $return_to_urls = array(); $matching_endpoints = Auth_OpenID_extractReturnURL($endpoints); @@ -435,7 +435,7 @@ function Auth_OpenID_getAllowedReturnURLs($relying_party_url, &$fetcher, * * @return true if the return_to URL is valid for the realm */ -function Auth_OpenID_verifyReturnTo($realm_str, $return_to, &$fetcher, +function Auth_OpenID_verifyReturnTo($realm_str, $return_to, $fetcher, $_vrfy='Auth_OpenID_getAllowedReturnURLs') { $disco_url = Auth_OpenID_TrustRoot::buildDiscoveryURL($realm_str); @@ -445,7 +445,7 @@ function Auth_OpenID_verifyReturnTo($realm_str, $return_to, &$fetcher, } $allowable_urls = call_user_func_array($_vrfy, - array($disco_url, &$fetcher)); + array($disco_url, $fetcher)); // The realm_str could not be parsed. if ($allowable_urls === false) { @@ -459,4 +459,3 @@ function Auth_OpenID_verifyReturnTo($realm_str, $return_to, &$fetcher, } } -?> \ No newline at end of file diff --git a/extlib/Auth/OpenID/URINorm.php b/extlib/Auth/OpenID/URINorm.php index f821d836a..c051b550a 100644 --- a/extlib/Auth/OpenID/URINorm.php +++ b/extlib/Auth/OpenID/URINorm.php @@ -246,4 +246,4 @@ function Auth_OpenID_urinorm($uri) return $scheme . '://' . $authority . $path . $query . $fragment; } -?> + diff --git a/extlib/Auth/Yadis/HTTPFetcher.php b/extlib/Auth/Yadis/HTTPFetcher.php index 963b9a49a..148cde1b2 100644 --- a/extlib/Auth/Yadis/HTTPFetcher.php +++ b/extlib/Auth/Yadis/HTTPFetcher.php @@ -115,12 +115,40 @@ class Auth_Yadis_HTTPFetcher { /** * @access private */ - function _findRedirect($headers) + function _findRedirect($headers, $url) { foreach ($headers as $line) { if (strpos(strtolower($line), "location: ") === 0) { $parts = explode(" ", $line, 2); - return $parts[1]; + $loc = $parts[1]; + $ppos = strpos($loc, "://"); + if ($ppos === false || $ppos > strpos($loc, "/")) { + /* no host; add it */ + $hpos = strpos($url, "://"); + $prt = substr($url, 0, $hpos+3); + $url = substr($url, $hpos+3); + if (substr($loc, 0, 1) == "/") { + /* absolute path */ + $fspos = strpos($url, "/"); + if ($fspos) $loc = $prt.substr($url, 0, $fspos).$loc; + else $loc = $prt.$url.$loc; + } else { + /* relative path */ + $pp = $prt; + while (1) { + $xpos = strpos($url, "/"); + if ($xpos === false) break; + $apos = strpos($url, "?"); + if ($apos !== false && $apos < $xpos) break; + $apos = strpos($url, "&"); + if ($apos !== false && $apos < $xpos) break; + $pp .= substr($url, 0, $xpos+1); + $url = substr($url, $xpos+1); + } + $loc = $pp.$loc; + } + } + return $loc; } } return null; @@ -144,4 +172,3 @@ class Auth_Yadis_HTTPFetcher { } } -?> \ No newline at end of file diff --git a/extlib/Auth/Yadis/Manager.php b/extlib/Auth/Yadis/Manager.php index d50cf7ad6..ee6f68bcb 100644 --- a/extlib/Auth/Yadis/Manager.php +++ b/extlib/Auth/Yadis/Manager.php @@ -387,11 +387,11 @@ class Auth_Yadis_Discovery { * @param string $session_key_suffix The optional session key * suffix override. */ - function Auth_Yadis_Discovery(&$session, $url, + function Auth_Yadis_Discovery($session, $url, $session_key_suffix = null) { /// Initialize a discovery object - $this->session =& $session; + $this->session = $session; $this->url = $url; if ($session_key_suffix === null) { $session_key_suffix = $this->DEFAULT_SUFFIX; @@ -405,7 +405,7 @@ class Auth_Yadis_Discovery { * Return the next authentication service for the pair of * user_input and session. This function handles fallback. */ - function getNextService($discover_cb, &$fetcher) + function getNextService($discover_cb, $fetcher) { $manager = $this->getManager(); if (!$manager || (!$manager->services)) { @@ -413,7 +413,7 @@ class Auth_Yadis_Discovery { list($yadis_url, $services) = call_user_func($discover_cb, $this->url, - $fetcher); + &$fetcher); $manager = $this->createManager($services, $yadis_url); } @@ -466,7 +466,7 @@ class Auth_Yadis_Discovery { * @param $force True if the manager should be returned regardless * of whether it's a manager for $this->url. */ - function &getManager($force=false) + function getManager($force=false) { // Extract the YadisServiceManager for this object's URL and // suffix from the session. @@ -481,16 +481,13 @@ class Auth_Yadis_Discovery { if ($manager && ($manager->forURL($this->url) || $force)) { return $manager; - } else { - $unused = null; - return $unused; } } /** * @access private */ - function &createManager($services, $yadis_url = null) + function createManager($services, $yadis_url = null) { $key = $this->getSessionKey(); if ($this->getManager()) { @@ -504,10 +501,6 @@ class Auth_Yadis_Discovery { $this->session->set($this->session_key, serialize($loader->toSession($manager))); return $manager; - } else { - // Oh, PHP. - $unused = null; - return $unused; } } @@ -526,4 +519,3 @@ class Auth_Yadis_Discovery { } } -?> \ No newline at end of file diff --git a/extlib/Auth/Yadis/Misc.php b/extlib/Auth/Yadis/Misc.php index 1134a4ff4..a5afa8e9a 100644 --- a/extlib/Auth/Yadis/Misc.php +++ b/extlib/Auth/Yadis/Misc.php @@ -56,4 +56,3 @@ function Auth_Yadis_startswith($s, $stuff) return strpos($s, $stuff) === 0; } -?> \ No newline at end of file diff --git a/extlib/Auth/Yadis/ParanoidHTTPFetcher.php b/extlib/Auth/Yadis/ParanoidHTTPFetcher.php index 6a418260e..4da7c94c0 100644 --- a/extlib/Auth/Yadis/ParanoidHTTPFetcher.php +++ b/extlib/Auth/Yadis/ParanoidHTTPFetcher.php @@ -109,9 +109,9 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { } curl_setopt($c, CURLOPT_WRITEFUNCTION, - array(&$this, "_writeData")); + array($this, "_writeData")); curl_setopt($c, CURLOPT_HEADERFUNCTION, - array(&$this, "_writeHeader")); + array($this, "_writeHeader")); if ($extra_headers) { curl_setopt($c, CURLOPT_HTTPHEADER, $extra_headers); @@ -128,6 +128,10 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { curl_setopt($c, CURLOPT_TIMEOUT, $off); curl_setopt($c, CURLOPT_URL, $url); + if (defined('Auth_OpenID_VERIFY_HOST')) { + curl_setopt($c, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 2); + } curl_exec($c); $code = curl_getinfo($c, CURLINFO_HTTP_CODE); @@ -142,12 +146,17 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { } if (in_array($code, array(301, 302, 303, 307))) { - $url = $this->_findRedirect($headers); + $url = $this->_findRedirect($headers, $url); $redir = true; } else { $redir = false; curl_close($c); + if (defined('Auth_OpenID_VERIFY_HOST') && + $this->isHTTPS($url)) { + Auth_OpenID::log('OpenID: Verified SSL host %s using '. + 'curl/get', $url); + } $new_headers = array(); foreach ($headers as $header) { @@ -190,7 +199,12 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { curl_setopt($c, CURLOPT_TIMEOUT, $this->timeout); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_WRITEFUNCTION, - array(&$this, "_writeData")); + array($this, "_writeData")); + + if (defined('Auth_OpenID_VERIFY_HOST')) { + curl_setopt($c, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 2); + } curl_exec($c); @@ -198,9 +212,15 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { if (!$code) { Auth_OpenID::log("Got no response code when fetching %s", $url); + Auth_OpenID::log("CURL error (%s): %s", + curl_errno($c), curl_error($c)); return null; } + if (defined('Auth_OpenID_VERIFY_HOST') && $this->isHTTPS($url)) { + Auth_OpenID::log('OpenID: Verified SSL host %s using '. + 'curl/post', $url); + } $body = $this->data; curl_close($c); @@ -223,4 +243,3 @@ class Auth_Yadis_ParanoidHTTPFetcher extends Auth_Yadis_HTTPFetcher { } } -?> \ No newline at end of file diff --git a/extlib/Auth/Yadis/ParseHTML.php b/extlib/Auth/Yadis/ParseHTML.php index 297ccbd2c..6f0f8b7e2 100644 --- a/extlib/Auth/Yadis/ParseHTML.php +++ b/extlib/Auth/Yadis/ParseHTML.php @@ -256,4 +256,3 @@ class Auth_Yadis_ParseHTML { } } -?> \ No newline at end of file diff --git a/extlib/Auth/Yadis/PlainHTTPFetcher.php b/extlib/Auth/Yadis/PlainHTTPFetcher.php index 3e0ca2bb0..26890539a 100644 --- a/extlib/Auth/Yadis/PlainHTTPFetcher.php +++ b/extlib/Auth/Yadis/PlainHTTPFetcher.php @@ -122,7 +122,7 @@ class Auth_Yadis_PlainHTTPFetcher extends Auth_Yadis_HTTPFetcher { $code = $http_code[1]; if (in_array($code, array('301', '302'))) { - $url = $this->_findRedirect($headers); + $url = $this->_findRedirect($headers, $url); $redir = true; } else { $redir = false; @@ -246,4 +246,3 @@ class Auth_Yadis_PlainHTTPFetcher extends Auth_Yadis_HTTPFetcher { } } -?> \ No newline at end of file diff --git a/extlib/Auth/Yadis/XML.php b/extlib/Auth/Yadis/XML.php index 81b2ce221..cf1f5c41b 100644 --- a/extlib/Auth/Yadis/XML.php +++ b/extlib/Auth/Yadis/XML.php @@ -310,20 +310,16 @@ $__Auth_Yadis_defaultParser = null; * @param Auth_Yadis_XMLParser $parser An instance of a * Auth_Yadis_XMLParser subclass. */ -function Auth_Yadis_setDefaultParser(&$parser) +function Auth_Yadis_setDefaultParser($parser) { global $__Auth_Yadis_defaultParser; - $__Auth_Yadis_defaultParser =& $parser; + $__Auth_Yadis_defaultParser = $parser; } function Auth_Yadis_getSupportedExtensions() { - return array( - 'dom' => array('classname' => 'Auth_Yadis_dom', - 'libname' => array('dom.so', 'dom.dll')), - 'domxml' => array('classname' => 'Auth_Yadis_domxml', - 'libname' => array('domxml.so', 'php_domxml.dll')), - ); + return array('dom' => 'Auth_Yadis_dom', + 'domxml' => 'Auth_Yadis_domxml'); } /** @@ -332,43 +328,25 @@ function Auth_Yadis_getSupportedExtensions() * Auth_Yadis_setDefaultParser has been called, the parser used in * that call will be returned instead. */ -function &Auth_Yadis_getXMLParser() +function Auth_Yadis_getXMLParser() { global $__Auth_Yadis_defaultParser; - + if (isset($__Auth_Yadis_defaultParser)) { return $__Auth_Yadis_defaultParser; } - - $p = null; - $classname = null; - - $extensions = Auth_Yadis_getSupportedExtensions(); - - // Return a wrapper for the resident implementation, if any. - foreach ($extensions as $name => $params) { - if (!extension_loaded($name)) { - foreach ($params['libname'] as $libname) { - if (@dl($libname)) { - $classname = $params['classname']; - } - } - } else { - $classname = $params['classname']; - } - if (isset($classname)) { - $p = new $classname(); - return $p; - } - } - - if (!isset($p)) { - trigger_error('No XML parser was found', E_USER_ERROR); - } else { + + foreach(Auth_Yadis_getSupportedExtensions() as $extension => $classname) + { + if (extension_loaded($extension)) + { + $p = new $classname(); Auth_Yadis_setDefaultParser($p); + return $p; + } } - - return $p; + + return false; } -?> + diff --git a/extlib/Auth/Yadis/XRDS.php b/extlib/Auth/Yadis/XRDS.php index f14a7948e..1f5af96fb 100644 --- a/extlib/Auth/Yadis/XRDS.php +++ b/extlib/Auth/Yadis/XRDS.php @@ -255,11 +255,11 @@ class Auth_Yadis_XRDS { * Instantiate a Auth_Yadis_XRDS object. Requires an XPath * instance which has been used to parse a valid XRDS document. */ - function Auth_Yadis_XRDS(&$xmlParser, &$xrdNodes) + function Auth_Yadis_XRDS($xmlParser, $xrdNodes) { - $this->parser =& $xmlParser; + $this->parser = $xmlParser; $this->xrdNode = $xrdNodes[count($xrdNodes) - 1]; - $this->allXrdNodes =& $xrdNodes; + $this->allXrdNodes = $xrdNodes; $this->serviceList = array(); $this->_parse(); } @@ -273,7 +273,7 @@ class Auth_Yadis_XRDS { * @return mixed $xrds An instance of Auth_Yadis_XRDS or null, * depending on the validity of $xml_string */ - function &parseXRDS($xml_string, $extra_ns_map = null) + static function parseXRDS($xml_string, $extra_ns_map = null) { $_null = null; @@ -352,9 +352,9 @@ class Auth_Yadis_XRDS { $services = $this->parser->evalXPath('xrd:Service', $this->xrdNode); foreach ($services as $node) { - $s =& new Auth_Yadis_Service(); + $s = new Auth_Yadis_Service(); $s->element = $node; - $s->parser =& $this->parser; + $s->parser = $this->parser; $priority = $s->getPriority(); @@ -428,7 +428,8 @@ class Auth_Yadis_XRDS { $matches = 0; foreach ($filters as $filter) { - if (call_user_func_array($filter, array($service))) { + + if (call_user_func_array($filter, array(&$service))) { $matches++; if ($filter_mode == SERVICES_YADIS_MATCH_ANY) { @@ -475,4 +476,3 @@ class Auth_Yadis_XRDS { } } -?> \ No newline at end of file diff --git a/extlib/Auth/Yadis/XRI.php b/extlib/Auth/Yadis/XRI.php index 4e3462317..0143a692e 100644 --- a/extlib/Auth/Yadis/XRI.php +++ b/extlib/Auth/Yadis/XRI.php @@ -190,7 +190,7 @@ function Auth_Yadis_getCanonicalID($iname, $xrds) // Now nodes are in reverse order. $xrd_list = array_reverse($xrds->allXrdNodes); - $parser =& $xrds->parser; + $parser = $xrds->parser; $node = $xrd_list[0]; $canonicalID_nodes = $parser->evalXPath('xrd:CanonicalID', $node); @@ -231,4 +231,4 @@ function Auth_Yadis_getCanonicalID($iname, $xrds) return $canonicalID; } -?> + diff --git a/extlib/Auth/Yadis/XRIRes.php b/extlib/Auth/Yadis/XRIRes.php index 4e8e8d037..5e1158735 100644 --- a/extlib/Auth/Yadis/XRIRes.php +++ b/extlib/Auth/Yadis/XRIRes.php @@ -8,9 +8,9 @@ require_once 'Auth/Yadis/XRDS.php'; require_once 'Auth/Yadis/XRI.php'; class Auth_Yadis_ProxyResolver { - function Auth_Yadis_ProxyResolver(&$fetcher, $proxy_url = null) + function Auth_Yadis_ProxyResolver($fetcher, $proxy_url = null) { - $this->fetcher =& $fetcher; + $this->fetcher = $fetcher; $this->proxy_url = $proxy_url; if (!$this->proxy_url) { $this->proxy_url = Auth_Yadis_getDefaultProxy(); @@ -69,4 +69,4 @@ class Auth_Yadis_ProxyResolver { } } -?> + diff --git a/extlib/Auth/Yadis/Yadis.php b/extlib/Auth/Yadis/Yadis.php index d89f77c6d..9ea2db7f9 100644 --- a/extlib/Auth/Yadis/Yadis.php +++ b/extlib/Auth/Yadis/Yadis.php @@ -105,7 +105,7 @@ class Auth_Yadis_DiscoveryResult { function usedYadisLocation() { // Was the Yadis protocol's indirection used? - return $this->normalized_uri != $this->xrds_uri; + return ($this->xrds_uri && $this->normalized_uri != $this->xrds_uri); } function isXRDS() @@ -141,7 +141,7 @@ function Auth_Yadis_getServiceEndpoints($input_url, $xrds_parse_func, } $yadis_result = call_user_func_array($discover_func, - array($input_url, $fetcher)); + array($input_url, &$fetcher)); if ($yadis_result === null) { return array($input_url, array()); @@ -196,7 +196,7 @@ function Auth_Yadis_getServiceEndpoints($input_url, $xrds_parse_func, * The filter functions (whose names appear in the array passed to * services()) take the following form: * - * <pre> function myFilter(&$service) { + * <pre> function myFilter($service) { * // Query $service object here. Return true if the service * // matches your query; false if not. * }</pre> @@ -207,7 +207,7 @@ function Auth_Yadis_getServiceEndpoints($input_url, $xrds_parse_func, * this contrived example): * * <pre> - * function URIMatcher(&$service) { + * function URIMatcher($service) { * foreach ($service->getElements('xrd:URI') as $uri) { * if (preg_match("/some_pattern/", * $service->parser->content($uri))) { @@ -250,7 +250,7 @@ class Auth_Yadis_Yadis { * If Auth_Yadis_CURL_OVERRIDE is defined, this method will always * return a {@link Auth_Yadis_PlainHTTPFetcher}. */ - function getHTTPFetcher($timeout = 20) + static function getHTTPFetcher($timeout = 20) { if (Auth_Yadis_Yadis::curlPresent() && (!defined('Auth_Yadis_CURL_OVERRIDE'))) { @@ -261,7 +261,7 @@ class Auth_Yadis_Yadis { return $fetcher; } - function curlPresent() + static function curlPresent() { return function_exists('curl_init'); } @@ -269,7 +269,7 @@ class Auth_Yadis_Yadis { /** * @access private */ - function _getHeader($header_list, $names) + static function _getHeader($header_list, $names) { foreach ($header_list as $name => $value) { foreach ($names as $n) { @@ -285,7 +285,7 @@ class Auth_Yadis_Yadis { /** * @access private */ - function _getContentType($content_type_header) + static function _getContentType($content_type_header) { if ($content_type_header) { $parts = explode(";", $content_type_header); @@ -317,7 +317,7 @@ class Auth_Yadis_Yadis { * Auth_Yadis_Yadis, depending on whether the discovery * succeeded. */ - function discover($uri, &$fetcher, + static function discover($uri, $fetcher, $extra_ns_map = null, $timeout = 20) { $result = new Auth_Yadis_DiscoveryResult($uri); @@ -379,4 +379,4 @@ class Auth_Yadis_Yadis { } } -?> + -- cgit v1.2.3 From 21f253c5845eb17b7aa599b030855324caf9f312 Mon Sep 17 00:00:00 2001 From: Brion Vibber <brion@pobox.com> Date: Tue, 29 Jun 2010 10:31:30 -0400 Subject: Fix regression in OStatus remote group subscribe -- a bug was previously masked silently (call to nonexistent getProfileUrl() method on User_group -- now replaced with homeUrl() which does the thing we wanted here) --- plugins/OStatus/actions/ostatusgroup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/OStatus/actions/ostatusgroup.php b/plugins/OStatus/actions/ostatusgroup.php index f325ba053..1b368de63 100644 --- a/plugins/OStatus/actions/ostatusgroup.php +++ b/plugins/OStatus/actions/ostatusgroup.php @@ -104,7 +104,7 @@ class OStatusGroupAction extends OStatusSubAction } $this->showEntity($group, - $group->getProfileUrl(), + $group->homeUrl(), $group->homepage_logo, $group->description); return $ok; -- cgit v1.2.3 From 452123916d08354d11a198517cbc91980a113fcd Mon Sep 17 00:00:00 2001 From: Brion Vibber <brion@pobox.com> Date: Tue, 29 Jun 2010 11:23:35 -0400 Subject: Updates to README w/ summary changelist --- README | 51 +++++++++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/README b/README index 452123db4..9e59ccb44 100644 --- a/README +++ b/README @@ -77,40 +77,27 @@ for additional terms. New this version ================ -This is a minor bug and feature release since version 0.9.1 released 28 -March 2010. +This is a minor bug and feature release since version 0.9.2 released on +4 May 2010. -Because of fixes to OStatus bugs, it is highly recommended that all -public sites upgrade to the new version immediately. +For best compatibility with client software and site federation, and a lot of +bug fixes, it is highly recommended that all public sites upgrade to the new +version. Notable changes this version: -- Installer no longer fails with a PHP fatal error when trying to set up the - subscription to update@status.net -- Fixed email notifications for @-replies that come in via OStatus -- OStatus related Fixes to the cloudy theme -- Pass geo locations over Twitter bridge (will only be used if enabled on the - Twitter side) -- scripts/showplugins.php - script to dump the list of activated plugins and - their settings -- scripts/fixup_blocks.php - script to finds any stray subscriptions in - violation of blocks, and removes them -- Allow blocking someone who's not currently subscribed to you (prevents - seeing @-replies from them, or them subbing to you in future) -- Default 2-second timeout on Geonames web service lookups -- Improved localization for plugins -- New anti-spam measures: added nofollow rels to group members list, - subscribers list -- Shared cache key option for Geonames plugin (lets multi-instance sites - share their cached geoname lookups) -- Stability fixes to the TwitterStatusFetcher -- If user allows location sharing but turned off browser location use profile - location -- Improved group listing via the API -- Improved FOAF output -- Several other bugfixes - -A full changelog is available at http://status.net/wiki/StatusNet_0.9.2. +- Enhanced API output to aid StatusNet-specific clients +- Many updates to user interface translation from TranslateWiki +- OStatus now works subscribing to SSL-protected sites by default +- OpenID now works on PHP 5.3, supports closer site integration. +- Numerous API and FOAF output fixes. +- Fixes to Facebook integration for FB API behavior changes +- PostgreSQL support updates +- Initial version of a custom theme uploader (disabled by default) +- LDAP auth plugins cleanup +- Many other bugfixes + +A full changelog is available at http://status.net/wiki/StatusNet_0.9.3. Prerequisites ============= @@ -121,8 +108,8 @@ run correctly. - PHP 5.2.3+. It may be possible to run this software on earlier versions of PHP, but many of the functions used are only available in PHP 5.2 or above. 5.2.6 or later is needed for XMPP background - daemons on 64-bit platforms. PHP 5.3.x should work but is known - to cause some failures for OpenID. + daemons on 64-bit platforms. PHP 5.3.x should work correctly in this + release, but problems with some plugins are possible. - MySQL 5.x. The StatusNet database is stored, by default, in a MySQL server. It has been primarily tested on 5.x servers, although it may be possible to install on earlier (or later!) versions. The server -- cgit v1.2.3