diff --git a/actions/editgroup.php b/actions/editgroup.php index 98ebcb87ac..e7e79040a4 100644 --- a/actions/editgroup.php +++ b/actions/editgroup.php @@ -191,13 +191,13 @@ class EditgroupAction extends Action array('http', 'https')))) { $this->showForm(_('Homepage is not a valid URL.')); return; - } else if (!is_null($fullname) && strlen($fullname) > 255) { + } else if (!is_null($fullname) && mb_strlen($fullname) > 255) { $this->showForm(_('Full name is too long (max 255 chars).')); return; - } else if (!is_null($description) && strlen($description) > 140) { + } else if (!is_null($description) && mb_strlen($description) > 140) { $this->showForm(_('description is too long (max 140 chars).')); return; - } else if (!is_null($location) && strlen($location) > 255) { + } else if (!is_null($location) && mb_strlen($location) > 255) { $this->showForm(_('Location is too long (max 255 chars).')); return; } diff --git a/actions/facebookinvite.php b/actions/facebookinvite.php index 3c872f94bf..1302064ad7 100644 --- a/actions/facebookinvite.php +++ b/actions/facebookinvite.php @@ -71,13 +71,13 @@ class FacebookinviteAction extends FacebookAction common_config('site', 'name'))); $this->element('p', null, _('Invitations have been sent to the following users:')); - $friend_ids = $_POST['ids']; // XXX: Hmm... is this the best way to acces the list? + $friend_ids = $_POST['ids']; // XXX: Hmm... is this the best way to access the list? $this->elementStart('ul', array('id' => 'facebook-friends')); foreach ($friend_ids as $friend) { $this->elementStart('li'); - $this->element('fb:profile-pic', array('uid' => $friend)); + $this->element('fb:profile-pic', array('uid' => $friend, 'size' => 'square')); $this->element('fb:name', array('uid' => $friend, 'capitalize' => 'true')); $this->elementEnd('li'); @@ -92,6 +92,12 @@ class FacebookinviteAction extends FacebookAction // Get a list of users who are already using the app for exclusion $exclude_ids = $this->facebook->api_client->friends_getAppUsers(); + $exclude_ids_csv = null; + + // fbml needs these as a csv string, not an array + if ($exclude_ids) { + $exclude_ids_csv = implode(',', $exclude_ids); + } $content = sprintf(_('You have been invited to %s'), common_config('site', 'name')) . htmlentities(''); @@ -103,10 +109,17 @@ class FacebookinviteAction extends FacebookAction 'content' => $content)); $this->hidden('invite', 'true'); $actiontext = sprintf(_('Invite your friends to use %s'), common_config('site', 'name')); - $this->element('fb:multi-friend-selector', array('showborder' => 'false', - 'actiontext' => $actiontext, - 'exclude_ids' => implode(',', $exclude_ids), - 'bypass' => 'cancel')); + + $multi_params = array('showborder' => 'false'); + $multi_params['actiontext'] = $actiontext; + + if ($exclude_ids_csv) { + $multi_params['exclude_ids'] = $exclude_ids_csv; + } + + $multi_params['bypass'] = 'cancel'; + + $this->element('fb:multi-friend-selector', $multi_params); $this->elementEnd('fb:request-form'); diff --git a/actions/finishopenidlogin.php b/actions/finishopenidlogin.php index bc91511207..1e7b73a7f3 100644 --- a/actions/finishopenidlogin.php +++ b/actions/finishopenidlogin.php @@ -242,7 +242,7 @@ class FinishopenidloginAction extends Action } } - if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) { + if ($sreg['fullname'] && mb_strlen($sreg['fullname']) <= 255) { $fullname = $sreg['fullname']; } diff --git a/actions/newgroup.php b/actions/newgroup.php index 42fd380dfe..cbd8dfeec5 100644 --- a/actions/newgroup.php +++ b/actions/newgroup.php @@ -142,13 +142,13 @@ class NewgroupAction extends Action array('http', 'https')))) { $this->showForm(_('Homepage is not a valid URL.')); return; - } else if (!is_null($fullname) && strlen($fullname) > 255) { + } else if (!is_null($fullname) && mb_strlen($fullname) > 255) { $this->showForm(_('Full name is too long (max 255 chars).')); return; - } else if (!is_null($description) && strlen($description) > 140) { + } else if (!is_null($description) && mb_strlen($description) > 140) { $this->showForm(_('description is too long (max 140 chars).')); return; - } else if (!is_null($location) && strlen($location) > 255) { + } else if (!is_null($location) && mb_strlen($location) > 255) { $this->showForm(_('Location is too long (max 255 chars).')); return; } diff --git a/actions/peopletag.php b/actions/peopletag.php index 3578c53fdf..6b1e34f1ab 100644 --- a/actions/peopletag.php +++ b/actions/peopletag.php @@ -1,9 +1,12 @@ . + * + * @category Action + * @package Laconica + * @author Evan Prodromou + * @author Zach Copley + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ */ -if (!defined('LACONICA')) { exit(1); } +if (!defined('LACONICA')) { + exit(1); +} require_once INSTALLDIR.'/lib/profilelist.php'; +/** + * This class outputs a paginated list of profiles self-tagged with a given tag + * + * @category Output + * @package Laconica + * @author Evan Prodromou + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + * + * @see Action + */ + class PeopletagAction extends Action { - - var $tag = null; + + var $tag = null; var $page = null; - - function handle($args) + + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + function prepare($argarray) { - parent::handle($args); - - parent::prepare($args); + parent::prepare($argarray); $this->tag = $this->trimmed('tag'); if (!common_valid_profile_tag($this->tag)) { - $this->clientError(sprintf(_('Not a valid people tag: %s'), $this->tag)); + $this->clientError(sprintf(_('Not a valid people tag: %s'), + $this->tag)); return; } - $this->page = $this->trimmed('page'); + $this->page = ($this->arg('page')) ? $this->arg('page') : 1; - if (!$this->page) { - $this->page = 1; - } - + common_set_returnto($this->selfUrl()); + + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return boolean is read only action? + */ + function handle($argarray) + { + parent::handle($argarray); $this->showPage(); } - + + /** + * Whips up a query to get a list of profiles based on the provided + * people tag and page, initalizes a ProfileList widget, and displays + * it to the user. + * + * @return nothing + */ function showContent() { - + $profile = new Profile(); - $offset = ($page-1)*PROFILES_PER_PAGE; - $limit = PROFILES_PER_PAGE + 1; - - if (common_config('db','type') == 'pgsql') { + $offset = ($this->page - 1) * PROFILES_PER_PAGE; + $limit = PROFILES_PER_PAGE + 1; + + if (common_config('db', 'type') == 'pgsql') { $lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset; } else { $lim = ' LIMIT ' . $offset . ', ' . $limit; } - # XXX: memcached this - + // XXX: memcached this + $qry = 'SELECT profile.* ' . 'FROM profile JOIN profile_tag ' . 'ON profile.id = profile_tag.tagger ' . 'WHERE profile_tag.tagger = profile_tag.tagged ' . 'AND tag = "%s" ' . - 'ORDER BY profile_tag.modified DESC'; - + 'ORDER BY profile_tag.modified DESC%s'; + $profile->query(sprintf($qry, $this->tag, $lim)); - $pl = new ProfileList($profile, null, $this); + $pl = new ProfileList($profile, null, $this); $cnt = $pl->show(); - + $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE, $this->page, - $this->trimmed('action'), + 'peopletag', array('tag' => $this->tag)); } - - function title() + + /** + * Returns the page title + * + * @return string page title + */ + function title() { - return sprintf( _('Users self-tagged with %s - page %d'), $this->tag, $this->page); + return sprintf(_('Users self-tagged with %s - page %d'), + $this->tag, $this->page); } - + } diff --git a/actions/profilesettings.php b/actions/profilesettings.php index 82e6c3c82f..60f7c0796e 100644 --- a/actions/profilesettings.php +++ b/actions/profilesettings.php @@ -198,13 +198,13 @@ class ProfilesettingsAction extends AccountSettingsAction !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) { $this->showForm(_('Homepage is not a valid URL.')); return; - } else if (!is_null($fullname) && strlen($fullname) > 255) { + } else if (!is_null($fullname) && mb_strlen($fullname) > 255) { $this->showForm(_('Full name is too long (max 255 chars).')); return; - } else if (!is_null($bio) && strlen($bio) > 140) { + } else if (!is_null($bio) && mb_strlen($bio) > 140) { $this->showForm(_('Bio is too long (max 140 chars).')); return; - } else if (!is_null($location) && strlen($location) > 255) { + } else if (!is_null($location) && mb_strlen($location) > 255) { $this->showForm(_('Location is too long (max 255 chars).')); return; } else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) { diff --git a/actions/register.php b/actions/register.php index 01d94f4884..5d7a8ce690 100644 --- a/actions/register.php +++ b/actions/register.php @@ -167,13 +167,13 @@ class RegisterAction extends Action array('http', 'https')))) { $this->showForm(_('Homepage is not a valid URL.')); return; - } else if (!is_null($fullname) && strlen($fullname) > 255) { + } else if (!is_null($fullname) && mb_strlen($fullname) > 255) { $this->showForm(_('Full name is too long (max 255 chars).')); return; - } else if (!is_null($bio) && strlen($bio) > 140) { + } else if (!is_null($bio) && mb_strlen($bio) > 140) { $this->showForm(_('Bio is too long (max 140 chars).')); return; - } else if (!is_null($location) && strlen($location) > 255) { + } else if (!is_null($location) && mb_strlen($location) > 255) { $this->showForm(_('Location is too long (max 255 chars).')); return; } else if (strlen($password) < 6) { diff --git a/actions/twitapiaccount.php b/actions/twitapiaccount.php index dc8e2e798b..b7c09cc9dc 100644 --- a/actions/twitapiaccount.php +++ b/actions/twitapiaccount.php @@ -56,7 +56,7 @@ class TwitapiaccountAction extends TwitterapiAction $location = trim($this->arg('location')); - if (!is_null($location) && strlen($location) > 255) { + if (!is_null($location) && mb_strlen($location) > 255) { // XXX: But Twitter just truncates and runs with it. -- Zach $this->clientError(_('That\'s too long. Max notice size is 255 chars.'), 406, $apidate['content-type']); diff --git a/actions/updateprofile.php b/actions/updateprofile.php index c79112dace..898c535432 100644 --- a/actions/updateprofile.php +++ b/actions/updateprofile.php @@ -93,22 +93,22 @@ class UpdateprofileAction extends Action } # optional stuff $fullname = $req->get_parameter('omb_listenee_fullname'); - if ($fullname && strlen($fullname) > 255) { + if ($fullname && mb_strlen($fullname) > 255) { $this->clientError(_("Full name is too long (max 255 chars).")); return false; } $homepage = $req->get_parameter('omb_listenee_homepage'); - if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) { + if ($homepage && (!common_valid_http_url($homepage) || mb_strlen($homepage) > 255)) { $this->clientError(sprintf(_("Invalid homepage '%s'"), $homepage)); return false; } $bio = $req->get_parameter('omb_listenee_bio'); - if ($bio && strlen($bio) > 140) { + if ($bio && mb_strlen($bio) > 140) { $this->clientError(_("Bio is too long (max 140 chars).")); return false; } $location = $req->get_parameter('omb_listenee_location'); - if ($location && strlen($location) > 255) { + if ($location && mb_strlen($location) > 255) { $this->clientError(_("Location is too long (max 255 chars).")); return false; } diff --git a/actions/userauthorization.php b/actions/userauthorization.php index 58fc96c0eb..7455a41a6f 100644 --- a/actions/userauthorization.php +++ b/actions/userauthorization.php @@ -469,19 +469,19 @@ class UserauthorizationAction extends Action } # optional stuff $fullname = $req->get_parameter('omb_listenee_fullname'); - if ($fullname && strlen($fullname) > 255) { + if ($fullname && mb_strlen($fullname) > 255) { throw new OAuthException("Full name '$fullname' too long."); } $homepage = $req->get_parameter('omb_listenee_homepage'); - if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) { + if ($homepage && (!common_valid_http_url($homepage) || mb_strlen($homepage) > 255)) { throw new OAuthException("Invalid homepage '$homepage'"); } $bio = $req->get_parameter('omb_listenee_bio'); - if ($bio && strlen($bio) > 140) { + if ($bio && mb_strlen($bio) > 140) { throw new OAuthException("Bio too long '$bio'"); } $location = $req->get_parameter('omb_listenee_location'); - if ($location && strlen($location) > 255) { + if ($location && mb_strlen($location) > 255) { throw new OAuthException("Location too long '$location'"); } $avatar = $req->get_parameter('omb_listenee_avatar'); diff --git a/lib/mail.php b/lib/mail.php index b424d579fe..a1faefc806 100644 --- a/lib/mail.php +++ b/lib/mail.php @@ -246,7 +246,7 @@ function mail_subscribe_notify_profile($listenee, $other) "\n".'Faithfully yours,'."\n".'%7$s.'."\n\n". "----\n". "Change your email address or ". - "notification options at ".'%8$s\n'), + "notification options at ".'%8$s' ."\n"), $long_name, common_config('site', 'name'), $other->profileurl, diff --git a/lib/util.php b/lib/util.php index 7ce4e229eb..c5a092f630 100644 --- a/lib/util.php +++ b/lib/util.php @@ -478,7 +478,7 @@ function common_linkify($url) { } else $title = ''; - return "$display"; + return "$display"; } function common_longurl($short_url) diff --git a/scripts/update_facebook.php b/scripts/update_facebook.php index 141bcfe0ca..60e10417fa 100755 --- a/scripts/update_facebook.php +++ b/scripts/update_facebook.php @@ -34,22 +34,19 @@ require_once INSTALLDIR . '/lib/facebookutil.php'; $last_updated_file = INSTALLDIR . '/scripts/facebook_last_updated'; // Lock file name -$tmp_file = INSTALLDIR . '/scripts/update_facebook.lock'; +$lock_file = INSTALLDIR . '/scripts/update_facebook.lock'; // Make sure only one copy of the script is running at a time -if (!($tmp_file = @fopen($tmp_file, "w"))) -{ - die("Can't open lock file. Script already running?"); +$lock_file = @fopen($lock_file, "w+"); +if (!flock( $lock_file, LOCK_EX | LOCK_NB, &$wouldblock) || $wouldblock) { + die("Can't open lock file. Script already running?\n"); } $facebook = getFacebook(); - $current_time = time(); - $since = getLastUpdated(); - +updateLastUpdated($current_time); $notice = getFacebookNotices($since); - $cnt = 0; while($notice->fetch()) { @@ -73,26 +70,30 @@ while($notice->fetch()) { // Avoid a Loop if ($notice->source != 'Facebook') { - updateStatus($fbuid, $content); - updateProfileBox($facebook, $flink, $notice); - $cnt++; + + try { + $facebook->api_client->users_setStatus($content, + $fbuid, false, true); + updateProfileBox($facebook, $flink, $notice); + $cnt++; + } catch(FacebookRestClientException $e) { + print "Couldn't sent notice $notice->id!\n"; + print $e->getMessage(); + + // Remove flink? + } } - } + } } } if ($cnt > 0) { print date('r', $current_time) . - ": Found $cnt new notices to send to Facebook since last run at " . - date('Y-m-d H:i:s', $since) . "\n"; - + ": Found $cnt new notices for Facebook since last run at " . + date('r', $since) . "\n"; } -#Save the last updated time. It needs to do this even if there were no -#changes made, otherwise it will never create it and thus never send -#any updates at all. -updateLastUpdated($current_time); - +fclose($lock_file); exit(0); @@ -111,37 +112,30 @@ function userCanUpdate($fbuid) { return $result; } - -function updateStatus($fbuid, $content) { - global $facebook; - - try { - $result = $facebook->api_client->users_setStatus($content, $fbuid, false, true); - } catch(FacebookRestClientException $e){ - print_r($e); - } -} - function getLastUpdated(){ - global $last_updated_file, $current_time; + global $last_updated_file, $current_time; + $last = $current_time; - $file = fopen($last_updated_file, 'r'); - - if ($file) { - $last = fgets($file); - } else { - print "Unable to read $last_updated_file. Using current time.\n"; - return $current_time; - } - - fclose($file); - - return $last; + if (file_exists($last_updated_file) && + ($file = fopen($last_updated_file, 'r'))) { + $last = fgets($file); + } else { + print "$last_updated_file doesn't exit. Trying to create it...\n"; + $file = fopen($last_updated_file, 'w+') or + die("Can't open $last_updated_file for writing!\n"); + print 'Success. Using current time (' . date('r', $last) . + ") to look for new notices.\n"; + } + + fclose($file); + return $last; } function updateLastUpdated($time){ - global $last_updated_file; - $file = fopen($last_updated_file, 'w') or die("Can't open $last_updated_file for writing!"); - fwrite($file, $time); - fclose($file); + global $last_updated_file; + $file = fopen($last_updated_file, 'w') or + die("Can't open $last_updated_file for writing!"); + fwrite($file, $time); + fclose($file); } +