if (!$avatar->find(true)) {
throw new NoResultException($avatar);
}
- return $avatar;
- }
-
- public static function hasUploaded(Profile $profile) {
- try {
- $avatar = Avatar::getUploaded($profile);
- } catch (NoResultException $e) {
- return false;
+ if (!file_exists(Avatar::path($avatar->filename))) {
+ // The delete call may be odd for, say, unmounted filesystems
+ // that cause a file to currently not exist, but actually it does...
+ $avatar->delete();
+ throw new FileNotFoundException(Avatar::path($avatar->filename));
}
- return file_exists(Avatar::path($avatar->filename));
+ return $avatar;
}
public static function getProfileAvatars(Profile $target) {
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Class for an exception when a database lookup returns no results
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Exception
+ * @package GNUSocial
+ * @author Mikael Nordfeldth <mmn@hethane.se>
+ * @copyright 2013 Free Software Foundation, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link http://www.gnu.org/software/social/
+ */
+
+if (!defined('GNUSOCIAL')) { exit(1); }
+
+class FileNotFoundException extends ServerException
+{
+ public $path = null;
+
+ public function __construct($path)
+ {
+ $this->path = $path;
+ parent::__construct(_('File not found in filesystem.'), 404);
+ }
+}
$profile->profileurl = $profileurl;
$profile->limit(1);
- if (!$profile->find()) {
+ if (!$profile->find(true)) {
throw new NoResultException($profile);
}
-
- $profile->fetch();
return $profile;
}
- /**
- * Check to see if this Twitter status has already been imported
- *
- * @param Profile $profile Twitter user's local profile
- * @param string $statusUri URI of the status on Twitter
- *
- * @return mixed value a matching Notice or null
- */
- function checkDupe($profile, $statusUri)
- {
- $notice = new Notice();
- $notice->uri = $statusUri;
- $notice->profile_id = $profile->id;
- $notice->limit(1);
-
- if ($notice->find()) {
- $notice->fetch();
- return $notice;
- }
-
- return null;
- }
-
protected function ensureProfile($twuser)
{
// check to see if there's already a profile for this user
$profileurl = 'http://twitter.com/' . $twuser->screen_name;
try {
$profile = $this->getProfileByUrl($twuser->screen_name, $profileurl);
- $this->checkAvatar($twuser, $profile);
+ $this->updateAvatar($twuser, $profile);
return $profile;
} catch (NoResultException $e) {
common_debug(__METHOD__ . ' - Adding profile and remote profile ' .
return $profile;
}
- protected function checkAvatar($twuser, Profile $profile)
+ /*
+ * Checks whether we have to update the profile's avatar
+ *
+ * @return true when updated, false on failure, null when no action taken
+ */
+ protected function updateAvatar($twuser, Profile $profile)
{
$path_parts = pathinfo($twuser->profile_image_url);
$ext = isset($path_parts['extension'])
? '.'.$path_parts['extension']
: ''; // some lack extension
$img_root = basename($path_parts['basename'], '_normal'.$ext); // cut off extension
- $newname = "Twitter_{$twuser->id}_{$img_root}_{$this->avatarsizename}{$ext}";
+ $filename = "Twitter_{$twuser->id}_{$img_root}_{$this->avatarsizename}{$ext}";
try {
$avatar = Avatar::getUploaded($profile);
- $oldname = $avatar->filename;
- $avatar->free();
+ if ($avatar->filename === $filename) {
+ return null;
+ }
+ // else we continue with creating a new avatar
} catch (Exception $e) {
- $oldname = null;
+ // Avatar was not found. We can catch NoResultException or FileNotFoundException
+ // but generally we just want to continue creating a new avatar.
}
- if ($newname != $oldname || !Avatar::hasUploaded($profile)) {
- common_debug(__METHOD__ . " - Avatar for {$profile->nickname} has changed.");
- $this->updateAvatar($twuser, $profile);
- }
- }
-
- protected function updateAvatar($twuser, Profile $profile)
- {
- $path_parts = pathinfo($twuser->profile_image_url);
- $ext = isset($path_parts['extension'])
- ? '.'.$path_parts['extension']
- : ''; // some lack extension
- $img_root = basename($path_parts['basename'], '_normal'.$ext); // cut off extension
$url = "{$path_parts['dirname']}/{$img_root}_{$this->avatarsizename}{$ext}";
- $filename = "Twitter_{$twuser->id}_{$img_root}_{$this->avatarsizename}{$ext}";
- $mediatype = $this->getMediatype(substr($ext, 1));
+ $mediatype = $this->getMediatype(mb_substr($ext, 1));
try {
+ common_debug(__METHOD__ . " - Updating profile avatar (profile_id={$profile->id} to {$filename}");
$this->newAvatar($profile, $url, $filename, $mediatype);
} catch (Exception $e) {
if (file_exists(Avatar::path($filename))) {
unlink(Avatar::path($filename));
}
+ return false;
}
+
+ return true;
}
protected function getMediatype($ext)