From be37104ac63cd25f2eac831ca03d6d2b19976e1c Mon Sep 17 00:00:00 2001 From: cash Date: Sun, 22 Aug 2010 21:53:48 +0000 Subject: Merged r6684:6694 from 1.7 branch to trunk (pages plugin was manually merged due to standardization of code in trunk but not branch) git-svn-id: http://code.elgg.org/elgg/trunk@6848 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/lib/entities.php | 19 +++--- engine/lib/relationships.php | 4 +- engine/lib/upgrades/2010071001.php | 48 ++++++++++++++++ engine/lib/upgrades/2010071002.php | 48 ++++++++++++++++ mod/notifications/start.php | 86 ++++++++++++++++++++++++++++ mod/pages/actions/pages/edit.php | 4 +- mod/pages/start.php | 7 +-- mod/pages/views/default/forms/pages/edit.php | 8 +-- mod/profile/actions/cropicon.php | 18 +++--- mod/profile/actions/iconupload.php | 4 +- mod/profile/icon.php | 7 +-- mod/profile/icondirect.php | 20 +------ mod/profile/start.php | 4 +- version.php | 2 +- 14 files changed, 220 insertions(+), 59 deletions(-) create mode 100644 engine/lib/upgrades/2010071001.php create mode 100644 engine/lib/upgrades/2010071002.php diff --git a/engine/lib/entities.php b/engine/lib/entities.php index 1750f12e1..e6c2baa8e 100644 --- a/engine/lib/entities.php +++ b/engine/lib/entities.php @@ -801,7 +801,9 @@ abstract class ElggEntity implements $this->attributes['subtype'] = get_subtype_id($this->attributes['type'], $this->attributes['subtype']); // Cache object handle - if ($this->attributes['guid']) cache_entity($this); + if ($this->attributes['guid']) { + cache_entity($this); + } return $this->attributes['guid']; } @@ -1693,21 +1695,24 @@ function entity_row_to_elggstar($row) { if (!($new_entity instanceof ElggEntity)) { throw new ClassException(sprintf(elgg_echo('ClassException:ClassnameNotClass'), $classname, 'ElggEntity')); } - } - else { + } else { error_log(sprintf(elgg_echo('ClassNotFoundException:MissingClass'), $classname)); } } else { switch ($row->type) { case 'object' : - $new_entity = new ElggObject($row); break; + $new_entity = new ElggObject($row); + break; case 'user' : - $new_entity = new ElggUser($row); break; + $new_entity = new ElggUser($row); + break; case 'group' : - $new_entity = new ElggGroup($row); break; + $new_entity = new ElggGroup($row); + break; case 'site' : - $new_entity = new ElggSite($row); break; + $new_entity = new ElggSite($row); + break; default: throw new InstallationException(sprintf(elgg_echo('InstallationException:TypeNotSupported'), $row->type)); } diff --git a/engine/lib/relationships.php b/engine/lib/relationships.php index f1d119452..dd59b8d3f 100644 --- a/engine/lib/relationships.php +++ b/engine/lib/relationships.php @@ -625,9 +625,7 @@ $count = false, $site_guid = 0) { $options['owner_guid'] = $owner_guid; } - if ($limit) { - $options['limit'] = $limit; - } + $options['limit'] = $limit; if ($offset) { $options['offset'] = $offset; diff --git a/engine/lib/upgrades/2010071001.php b/engine/lib/upgrades/2010071001.php new file mode 100644 index 000000000..4df044cff --- /dev/null +++ b/engine/lib/upgrades/2010071001.php @@ -0,0 +1,48 @@ +type != 'user') { + // only to be used for user directories + return FALSE; + } + + if (!$user->time_created) { + // no idea where this user has its files + return FALSE; + } + + $time_created = date('Y/m/d', $user->time_created); + return "$time_created/$user->guid/"; +} + +$sizes = array('large', 'medium', 'small', 'tiny', 'master', 'topbar'); + +global $DB_QUERY_CACHE, $DB_PROFILE, $ENTITY_CACHE, $CONFIG; +$users = mysql_query("SELECT guid, username FROM {$CONFIG->dbprefix}users_entity WHERE username != ''"); +while ($user = mysql_fetch_object($users)) { + $DB_QUERY_CACHE = $DB_PROFILE = $ENTITY_CACHE = array(); + + $user_directory = user_file_matrix_2010071001($user->guid); + if (!$user_directory) { + continue; + } + $profile_directory = $CONFIG->dataroot . $user_directory . "profile/"; + if (!file_exists($profile_directory)) { + continue; + } + + foreach ($sizes as $size) { + $old_filename = "$profile_directory{$user->username}{$size}.jpg"; + $new_filename = "$profile_directory{$user->guid}{$size}.jpg"; + if (file_exists($old_filename)) { + if (!rename($old_filename, $new_filename)) { + error_log("Failed to rename profile photo for $user->username"); + } + } + } +} diff --git a/engine/lib/upgrades/2010071002.php b/engine/lib/upgrades/2010071002.php new file mode 100644 index 000000000..cdf08c830 --- /dev/null +++ b/engine/lib/upgrades/2010071002.php @@ -0,0 +1,48 @@ +dbprefix}users_entity WHERE username != ''"); +while ($user = mysql_fetch_object($users)) { + $DB_QUERY_CACHE = $DB_PROFILE = $ENTITY_CACHE = array(); + + $user = get_entity($user->guid); + foreach ($NOTIFICATION_HANDLERS as $method => $foo) { + $notify = "notify$method"; + $metaname = "collections_notifications_preferences_$method"; + $collections_preferences = $user->$metaname; + if (!$collections_preferences) { + continue; + } + if (!is_array($collections_preferences)) { + $collections_preferences = array($collections_preferences); + } + foreach ($collections_preferences as $collection_id) { + // check the all friends notifications + if ($collection_id == -1) { + $options = array( + 'relationship' => 'friend', + 'relationship_guid' => $user->guid, + 'limit' => 0 + ); + $friends = elgg_get_entities_from_relationship($options); + foreach ($friends as $friend) { + if (!check_entity_relationship($user->guid, $notify, $friend->guid)) { + add_entity_relationship($user->guid, $notify, $friend->guid); + } + } + } else { + $members = get_members_of_access_collection($collection_id, TRUE); + foreach ($members as $member) { + if (!check_entity_relationship($user->guid, $notify, $members)) { + add_entity_relationship($user->guid, $notify, $member); + } + } + } + } + } +} diff --git a/mod/notifications/start.php b/mod/notifications/start.php index fa36d5d69..3349d0194 100644 --- a/mod/notifications/start.php +++ b/mod/notifications/start.php @@ -27,6 +27,10 @@ function notifications_plugin_init() { // update notifications based on relationships changing register_elgg_event_handler('delete', 'member', 'notifications_relationship_remove'); register_elgg_event_handler('delete', 'friend', 'notifications_relationship_remove'); + + // update notifications when new friend or access collection membership + register_elgg_event_handler('create', 'friend', 'notifications_update_friend_notify'); + register_plugin_hook('access:collections:add_user', 'collection', 'notifications_update_collection_notify'); } /** @@ -88,7 +92,89 @@ function notifications_relationship_remove($event, $object_type, $relationship) } } +/** + * Turn on notifications for new friends if all friend notifications is on + * + * @param string $event + * @param string $object_type + * @param object $relationship + */ +function notifications_update_friend_notify($event, $object_type, $relationship) { + global $NOTIFICATION_HANDLERS; + + $user_guid = $relationship->guid_one; + $friend_guid = $relationship->guid_two; + + $user = get_entity($user_guid); + + // loop through all notification types + foreach ($NOTIFICATION_HANDLERS as $method => $foo) { + $metaname = 'collections_notifications_preferences_' . $method; + $collections_preferences = $user->$metaname; + if ($collections_preferences) { + if (!empty($collections_preferences) && !is_array($collections_preferences)) { + $collections_preferences = array($collections_preferences); + } + if (is_array($collections_preferences)) { + // -1 means all friends is on - should be a define + if (in_array(-1, $collections_preferences)) { + add_entity_relationship($user_guid, 'notify' . $method, $friend_guid); + } + } + } + } +} + +/** + * Update notifications for changes in access collection membership. + * + * This function assumes that only friends can belong to access collections. + * + * @param string $event + * @param string $object_type + * @param bool $returnvalue + * @param array $params + */ +function notifications_update_collection_notify($event, $object_type, $returnvalue, $params) { + global $NOTIFICATION_HANDLERS; + + // only update notifications for user owned collections + $collection_id = $params['collection_id']; + $collection = get_access_collection($collection_id); + $user = get_entity($collection->owner_guid); + if (!($user instanceof ElggUser)) { + return $returnvalue; + } + $member_guid = $params['user_guid']; + + // loop through all notification types + foreach ($NOTIFICATION_HANDLERS as $method => $foo) { + $metaname = 'collections_notifications_preferences_' . $method; + $collections_preferences = $user->$metaname; + if (!$collections_preferences) { + continue; + } + if (!is_array($collections_preferences)) { + $collections_preferences = array($collections_preferences); + } + if (in_array(-1, $collections_preferences)) { + // if "all friends" notify is on, we don't change any notifications + // since must be a friend to be in an access collection + continue; + } + if (in_array($collection_id, $collections_preferences)) { + // notifications are on for this collection so we add/remove + if ($event == 'access:collections:add_user') { + add_entity_relationship($user->guid, "notify$method", $member_guid); + } elseif ($event == 'access:collections:remove_user') { + // removing someone from an access collection is not a guarantee + // that they should be removed from notifications + //remove_entity_relationship($user->guid, "notify$method", $member_guid); + } + } + } +} register_elgg_event_handler('init', 'system', 'notifications_plugin_init', 1000); diff --git a/mod/pages/actions/pages/edit.php b/mod/pages/actions/pages/edit.php index 004b81a25..b583563f9 100644 --- a/mod/pages/actions/pages/edit.php +++ b/mod/pages/actions/pages/edit.php @@ -64,9 +64,7 @@ if ($page instanceof ElggObject) { // Save fields - note we always save latest description as both description and annotation if (sizeof($input) > 0) { foreach($input as $shortname => $value) { - if ((!$pages_guid) || (($pages_guid) && ($shortname != 'title'))) { - $page->$shortname = $value; - } + $page->$shortname = $value; } } diff --git a/mod/pages/start.php b/mod/pages/start.php index 8f4e3b5e2..6fd0ef26d 100644 --- a/mod/pages/start.php +++ b/mod/pages/start.php @@ -70,9 +70,8 @@ function pages_init() { function pages_url($entity) { global $CONFIG; - - return $CONFIG->url . "pg/pages/view/{$entity->guid}/"; - + $title = elgg_get_friendly_title($entity->title); + return $CONFIG->url . "pg/pages/view/{$entity->guid}/$title"; } /** @@ -207,7 +206,7 @@ function page_notify_message($hook, $entity_type, $returnvalue, $params) { $owner = $entity->getOwnerEntity(); return $owner->name . ' ' . elgg_echo("pages:via") . ': ' . $title . "\n\n" . $descr . "\n\n" . $entity->getURL(); } - if ($method == 'web') { + if ($method == 'site') { $owner = $entity->getOwnerEntity(); return $owner->name . ' ' . elgg_echo("pages:via") . ': ' . $title . "\n\n" . $descr . "\n\n" . $entity->getURL(); } diff --git a/mod/pages/views/default/forms/pages/edit.php b/mod/pages/views/default/forms/pages/edit.php index 2095e4fd8..bdd721b82 100644 --- a/mod/pages/views/default/forms/pages/edit.php +++ b/mod/pages/views/default/forms/pages/edit.php @@ -45,11 +45,6 @@ if (!$vars['entity']) { echo elgg_view('input/securitytoken'); if (is_array($vars['config']->pages) && sizeof($vars['config']->pages) > 0) { foreach($vars['config']->pages as $shortname => $valtype) { - $disabled = ""; - - if (!$new_page && ($shortname == 'title')) { - $disabled = true; - } ?>

@@ -57,8 +52,7 @@ if (is_array($vars['config']->pages) && sizeof($vars['config']->pages) > 0) {
$shortname, - 'value' => $vars['entity']->$shortname, - 'disabled' => $disabled + 'value' => $vars['entity']->$shortname )); ?>

diff --git a/mod/profile/actions/cropicon.php b/mod/profile/actions/cropicon.php index 5bba84a8c..b0dc0fa61 100644 --- a/mod/profile/actions/cropicon.php +++ b/mod/profile/actions/cropicon.php @@ -1,7 +1,7 @@ @@ -28,28 +28,28 @@ $filehandler = new ElggFile(); $filehandler->owner_guid = $profile_owner->getGUID(); $filehandler->setFilename("profile/" . $profile_owner->username . "master" . ".jpg"); $filename = $filehandler->getFilenameOnFilestore(); - + $topbar = get_resized_image_from_existing_file($filename, 16, 16, true, $x1, $y1, $x2, $y2, TRUE); $tiny = get_resized_image_from_existing_file($filename, 25, 25, true, $x1, $y1, $x2, $y2, TRUE); $small = get_resized_image_from_existing_file($filename, 40, 40, true, $x1, $y1, $x2, $y2, TRUE); $medium = get_resized_image_from_existing_file($filename, 100, 100, true, $x1, $y1, $x2, $y2, TRUE); - + if ($small !== FALSE && $medium !== FALSE && $tiny !== FALSE) { $filehandler = new ElggFile(); $filehandler->owner_guid = $profile_owner->getGUID(); - $filehandler->setFilename("profile/" . $profile_owner->username . "medium.jpg"); + $filehandler->setFilename("profile/" . $profile_owner->guid . "medium.jpg"); $filehandler->open("write"); $filehandler->write($medium); $filehandler->close(); - $filehandler->setFilename("profile/" . $profile_owner->username . "small.jpg"); + $filehandler->setFilename("profile/" . $profile_owner->guid . "small.jpg"); $filehandler->open("write"); $filehandler->write($small); $filehandler->close(); - $filehandler->setFilename("profile/" . $profile_owner->username . "tiny.jpg"); + $filehandler->setFilename("profile/" . $profile_owner->guid . "tiny.jpg"); $filehandler->open("write"); $filehandler->write($tiny); $filehandler->close(); - $filehandler->setFilename("profile/" . $profile_owner->username . "topbar.jpg"); + $filehandler->setFilename("profile/" . $profile_owner->guid . "topbar.jpg"); $filehandler->open("write"); $filehandler->write($topbar); $filehandler->close(); @@ -58,14 +58,14 @@ if ($small !== FALSE && $medium !== FALSE && $tiny !== FALSE) { $profile_owner->x2 = $x2; $profile_owner->y1 = $y1; $profile_owner->y2 = $y2; - + $profile_owner->icontime = time(); system_message(elgg_echo("profile:icon:uploaded")); } else { register_error(elgg_echo("profile:icon:notfound")); } - + //forward the user back to the upload page to crop $url = "{$vars['url']}pg/profile/{$profile_owner->username}/edit/icon"; diff --git a/mod/profile/actions/iconupload.php b/mod/profile/actions/iconupload.php index a0cb24c3d..23d1967a6 100644 --- a/mod/profile/actions/iconupload.php +++ b/mod/profile/actions/iconupload.php @@ -1,7 +1,7 @@ @@ -41,7 +41,7 @@ foreach ($icon_sizes as $name => $size_info) { //@todo Make these actual entities. See exts #348. $file = new ElggFile(); $file->owner_guid = $profile_owner_guid; - $file->setFilename("profile/{$profile_username}{$name}.jpg"); + $file->setFilename("profile/{$profile_owner_guid}{$name}.jpg"); $file->open('write'); $file->write($resized); $file->close(); diff --git a/mod/profile/icon.php b/mod/profile/icon.php index da7667c8b..d7d7247c5 100644 --- a/mod/profile/icon.php +++ b/mod/profile/icon.php @@ -1,7 +1,7 @@ @@ -13,7 +13,6 @@ require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php"); // Get the owning user $user = page_owner_entity(); -$username = $user->username; // Get the size $size = strtolower(get_input('size')); @@ -30,13 +29,13 @@ if (!$user) { // Try and get the icon $filehandler = new ElggFile(); $filehandler->owner_guid = $user->getGUID(); -$filehandler->setFilename("profile/" . $username . $size . ".jpg"); +$filehandler->setFilename("profile/" . $user->getGUID() . $size . ".jpg"); $success = false; if ($filehandler->open("read")) { if ($contents = $filehandler->read($filehandler->size())) { $success = true; - } + } } if (!$success) { diff --git a/mod/profile/icondirect.php b/mod/profile/icondirect.php index 8a46786ab..c84955fa5 100644 --- a/mod/profile/icondirect.php +++ b/mod/profile/icondirect.php @@ -16,8 +16,6 @@ require_once(dirname(dirname(dirname(__FILE__))). '/engine/settings.php'); global $CONFIG; - -$username = $_GET['username']; $joindate = (int)$_GET['joindate']; $guid = (int)$_GET['guid']; @@ -26,20 +24,6 @@ if (!in_array($size,array('large','medium','small','tiny','master','topbar'))) { $size = "medium"; } -// security check on username string -if ( (strpos($username, '/')!==false) || - (strpos($username, '\\')!==false) || - (strpos($username, '"')!==false) || - (strpos($username, '\'')!==false) || - (strpos($username, '*')!==false) || - (strpos($username, '&')!==false) || - (strpos($username, ' ')!==false) ) { - // these characters are not allowed in usernames - exit; -} - - - $mysql_dblink = @mysql_connect($CONFIG->dbhost,$CONFIG->dbuser,$CONFIG->dbpass, true); if ($mysql_dblink) { if (@mysql_select_db($CONFIG->dbname,$mysql_dblink)) { @@ -65,7 +49,7 @@ if ($mysql_dblink) { // first try to read icon directly $user_path = date('Y/m/d/', $joindate) . $guid; - $filename = $dataroot . $user_path . "/profile/" . $username . $size . ".jpg"; + $filename = "$dataroot$user_path/profile/{$guid}{$size}.jpg"; $contents = @file_get_contents($filename); if (!empty($contents)) { header("Content-type: image/jpeg"); @@ -86,4 +70,6 @@ if ($mysql_dblink) { // simplecache is not turned on or something went wrong so load engine and try that way require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php"); +$user = get_entity($guid); +set_input('username', $user->username); require_once(dirname(__FILE__).'/icon.php'); diff --git a/mod/profile/start.php b/mod/profile/start.php index 17a55e1f9..adac92aef 100644 --- a/mod/profile/start.php +++ b/mod/profile/start.php @@ -253,11 +253,11 @@ function profile_usericon_hook($hook, $entity_type, $returnvalue, $params){ $filehandler = new ElggFile(); $filehandler->owner_guid = $entity->getGUID(); - $filehandler->setFilename("profile/" . $username . $size . ".jpg"); + $filehandler->setFilename("profile/" . $entity->guid . $size . ".jpg"); if ($filehandler->exists()) { //$url = $CONFIG->url . "pg/icon/$username/$size/$icontime.jpg"; - return $CONFIG->wwwroot . 'mod/profile/icondirect.php?lastcache='.$icontime.'&username='.$entity->username.'&joindate=' . $entity->time_created . '&guid=' . $entity->guid . '&size='.$size; + return $CONFIG->wwwroot . 'mod/profile/icondirect.php?lastcache='.$icontime.'&joindate=' . $entity->time_created . '&guid=' . $entity->guid . '&size='.$size; } } } diff --git a/version.php b/version.php index 60ce3d11b..a9aa992c6 100644 --- a/version.php +++ b/version.php @@ -12,7 +12,7 @@ // YYYYMMDD = Elgg Date // XX = Interim incrementer -$version = 2010070301; +$version = 2010071002; // Human-friendly version name $release = '1.8-svn'; -- cgit v1.2.3