Index: /trunk/src/wp-includes/admin-bar.php
===================================================================
--- /trunk/src/wp-includes/admin-bar.php	(revision 34121)
+++ /trunk/src/wp-includes/admin-bar.php	(revision 34122)
@@ -180,8 +180,15 @@
 	$user_id      = get_current_user_id();
 	$current_user = wp_get_current_user();
-	$profile_url  = get_edit_profile_url( $user_id );
 
 	if ( ! $user_id )
 		return;
+
+	if ( current_user_can( 'read' ) ) {
+		$profile_url = get_edit_profile_url( $user_id );
+	} elseif ( is_multisite() ) {
+		$profile_url = get_dashboard_url( $user_id, 'profile.php' );
+	} else {
+		$profile_url = false;
+	}
 
 	$avatar = get_avatar( $user_id, 26 );
@@ -210,8 +217,15 @@
 	$user_id      = get_current_user_id();
 	$current_user = wp_get_current_user();
-	$profile_url  = get_edit_profile_url( $user_id );
 
 	if ( ! $user_id )
 		return;
+
+	if ( current_user_can( 'read' ) ) {
+		$profile_url = get_edit_profile_url( $user_id );
+	} elseif ( is_multisite() ) {
+		$profile_url = get_dashboard_url( $user_id, 'profile.php' );
+	} else {
+		$profile_url = false;
+	}
 
 	$wp_admin_bar->add_group( array(
@@ -235,10 +249,14 @@
 		),
 	) );
-	$wp_admin_bar->add_menu( array(
-		'parent' => 'user-actions',
-		'id'     => 'edit-profile',
-		'title'  => __( 'Edit My Profile' ),
-		'href' => $profile_url,
-	) );
+
+	if ( false !== $profile_url ) {
+		$wp_admin_bar->add_menu( array(
+			'parent' => 'user-actions',
+			'id'     => 'edit-profile',
+			'title'  => __( 'Edit My Profile' ),
+			'href'   => $profile_url,
+		) );
+	}
+
 	$wp_admin_bar->add_menu( array(
 		'parent' => 'user-actions',
@@ -282,5 +300,5 @@
 		'id'    => 'site-name',
 		'title' => $title,
-		'href'  => is_admin() ? home_url( '/' ) : admin_url(),
+		'href'  => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(),
 	) );
 
@@ -305,5 +323,5 @@
 		}
 
-	} else {
+	} else if ( current_user_can( 'read' ) ) {
 		// We're on the front end, link to the Dashboard.
 		$wp_admin_bar->add_menu( array(
Index: /trunk/src/wp-includes/css/admin-bar.css
===================================================================
--- /trunk/src/wp-includes/css/admin-bar.css	(revision 34121)
+++ /trunk/src/wp-includes/css/admin-bar.css	(revision 34122)
@@ -28,4 +28,9 @@
 }
 
+#wpadminbar .ab-empty-item {
+	cursor: default;
+}
+
+#wpadminbar .ab-empty-item,
 #wpadminbar a.ab-item,
 #wpadminbar > #wp-toolbar span.ab-label,
@@ -452,4 +457,5 @@
 }
 
+#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,
 #wpadminbar #wp-admin-bar-my-account.with-avatar > a img {
 	width: auto;
@@ -465,4 +471,5 @@
 }
 
+#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,
 #wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > a img {
 	width: auto;
Index: /trunk/tests/phpunit/tests/adminbar.php
===================================================================
--- /trunk/tests/phpunit/tests/adminbar.php	(revision 34121)
+++ /trunk/tests/phpunit/tests/adminbar.php	(revision 34122)
@@ -16,5 +16,4 @@
 		parent::setUp();
 		$this->current_user = get_current_user_id();
-		wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
 	}
 
@@ -28,4 +27,6 @@
 	 */
 	function test_content_post_type() {
+		wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
+
 		register_post_type( 'content', array( 'show_in_admin_bar' => true ) );
 
@@ -45,4 +46,6 @@
 	 */
 	function test_merging_existing_meta_values() {
+		wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
+
 		$admin_bar = new WP_Admin_Bar;
 
@@ -62,3 +65,193 @@
 		$this->assertEquals( array( 'class' => 'test-class', 'some-meta' => 'value' ), $node->meta );
 	}
+
+	/**
+	 * @ticket 25162
+	 */
+	public function test_admin_bar_contains_correct_links_for_users_with_no_role() {
+		if ( is_multisite() ) {
+			$this->markTestSkipped( 'Test does not run in multisite' );
+		}
+
+		$nobody = $this->factory->user->create( array( 'role' => '' ) );
+		$this->assertFalse( user_can( $nobody, 'read' ) );
+
+		wp_set_current_user( $nobody );
+
+		$wp_admin_bar = $this->get_standard_admin_bar();
+
+		$node_site_name    = $wp_admin_bar->get_node( 'site-name' );
+		$node_my_account   = $wp_admin_bar->get_node( 'my-account' );
+		$node_user_info    = $wp_admin_bar->get_node( 'user-info' );
+		$node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
+
+		// Site menu points to the home page instead of the admin URL
+		$this->assertEquals( home_url( '/' ), $node_site_name->href );
+
+		// No profile links as the user doesn't have any permissions on the site
+		$this->assertFalse( $node_my_account->href );
+		$this->assertFalse( $node_user_info->href );
+		$this->assertNull( $node_edit_profile );
+
+	}
+
+	/**
+	 * @ticket 25162
+	 */
+	public function test_admin_bar_contains_correct_links_for_users_with_role() {
+		if ( is_multisite() ) {
+			$this->markTestSkipped( 'Test does not run in multisite' );
+		}
+
+		$editor = $this->factory->user->create( array( 'role' => 'editor' ) );
+		$this->assertTrue( user_can( $editor, 'read' ) );
+
+		wp_set_current_user( $editor );
+
+		$wp_admin_bar = $this->get_standard_admin_bar();
+
+		$node_site_name    = $wp_admin_bar->get_node( 'site-name' );
+		$node_my_account   = $wp_admin_bar->get_node( 'my-account' );
+		$node_user_info    = $wp_admin_bar->get_node( 'user-info' );
+		$node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
+
+		// Site menu points to the admin URL
+		$this->assertEquals( admin_url( '/' ), $node_site_name->href );
+
+		$profile_url = admin_url( 'profile.php' );
+
+		// Profile URLs point to profile.php
+		$this->assertEquals( $profile_url, $node_my_account->href );
+		$this->assertEquals( $profile_url, $node_user_info->href );
+		$this->assertEquals( $profile_url, $node_edit_profile->href );
+
+	}
+
+	/**
+	 * @ticket 25162
+	 * @group multisite
+	 */
+	public function test_admin_bar_contains_correct_links_for_users_with_no_role_on_blog() {
+		if ( ! is_multisite() ) {
+			$this->markTestSkipped( 'Test only runs in multisite' );
+		}
+
+		$admin  = $this->factory->user->create( array( 'role' => 'administrator' ) );
+		$editor = $this->factory->user->create( array( 'role' => 'editor' ) );
+
+		$this->assertTrue( user_can( $admin, 'read' ) );
+		$this->assertTrue( user_can( $editor, 'read' ) );
+
+		$new_blog_id = $this->factory->blog->create( array(
+			'user_id' => $admin,
+		) );
+
+		$this->assertTrue( is_user_member_of_blog( $admin, $new_blog_id ) );
+		$this->assertFalse( is_user_member_of_blog( $editor, $new_blog_id ) );
+
+		wp_set_current_user( $editor );
+
+		switch_to_blog( $new_blog_id );
+
+		$wp_admin_bar = $this->get_standard_admin_bar();
+
+		$node_site_name    = $wp_admin_bar->get_node( 'site-name' );
+		$node_my_account   = $wp_admin_bar->get_node( 'my-account' );
+		$node_user_info    = $wp_admin_bar->get_node( 'user-info' );
+		$node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
+
+		// get primary blog
+		$primary = get_active_blog_for_user( $editor );
+		$this->assertInternalType( 'object', $primary );
+
+		// No Site menu as the user isn't a member of this blog
+		$this->assertNull( $node_site_name );
+
+		$primary_profile_url = get_admin_url( $primary->blog_id, 'profile.php' );
+
+		// Ensure the user's primary blog is not the same as the main site
+		$this->assertNotEquals( $primary_profile_url, admin_url( 'profile.php' ) );
+
+		// Profile URLs should go to the user's primary blog
+		$this->assertEquals( $primary_profile_url, $node_my_account->href );
+		$this->assertEquals( $primary_profile_url, $node_user_info->href );
+		$this->assertEquals( $primary_profile_url, $node_edit_profile->href );
+
+		restore_current_blog();
+
+	}
+
+	/**
+	 * @ticket 25162
+	 * @group multisite
+	 */
+	public function test_admin_bar_contains_correct_links_for_users_with_no_role_on_network() {
+		if ( ! is_multisite() ) {
+			$this->markTestSkipped( 'Test only runs in multisite' );
+		}
+
+		$admin  = $this->factory->user->create( array( 'role' => 'administrator' ) );
+		$nobody = $this->factory->user->create( array( 'role' => '' ) );
+
+		$this->assertTrue( user_can( $admin, 'read' ) );
+		$this->assertFalse( user_can( $nobody, 'read' ) );
+
+		$new_blog_id = $this->factory->blog->create( array(
+			'user_id' => $admin,
+		) );
+
+		$this->assertTrue( is_user_member_of_blog( $admin, $new_blog_id ) );
+		$this->assertFalse( is_user_member_of_blog( $nobody, $new_blog_id ) );
+		$this->assertTrue( is_user_member_of_blog( $nobody, get_current_blog_id() ) );
+
+		// Remove `$nobody` from the current blog, so they're not a member of any blog
+		$removed = remove_user_from_blog( $nobody, get_current_blog_id() );
+
+		$this->assertTrue( $removed );
+		$this->assertFalse( is_user_member_of_blog( $nobody, get_current_blog_id() ) );
+
+		wp_set_current_user( $nobody );
+
+		switch_to_blog( $new_blog_id );
+
+		$wp_admin_bar = $this->get_standard_admin_bar();
+
+		$node_site_name    = $wp_admin_bar->get_node( 'site-name' );
+		$node_my_account   = $wp_admin_bar->get_node( 'my-account' );
+		$node_user_info    = $wp_admin_bar->get_node( 'user-info' );
+		$node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
+
+		// get primary blog
+		$primary = get_active_blog_for_user( $nobody );
+		$this->assertNull( $primary );
+
+		// No Site menu as the user isn't a member of this site
+		$this->assertNull( $node_site_name );
+
+		$user_profile_url = user_admin_url( 'profile.php' );
+
+		$this->assertNotEquals( $user_profile_url, admin_url( 'profile.php' ) );
+
+		// Profile URLs should go to the user's primary blog
+		$this->assertEquals( $user_profile_url, $node_my_account->href );
+		$this->assertEquals( $user_profile_url, $node_user_info->href );
+		$this->assertEquals( $user_profile_url, $node_edit_profile->href );
+
+		restore_current_blog();
+
+	}
+
+	protected function get_standard_admin_bar() {
+		global $wp_admin_bar;
+
+		_wp_admin_bar_init();
+
+		$this->assertTrue( is_admin_bar_showing() );
+		$this->assertInstanceOf( 'WP_Admin_Bar', $wp_admin_bar );
+
+		do_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) );
+
+		return $wp_admin_bar;
+	}
+
 }
