Index: src/includes/extend/buddypress/groups.php
===================================================================
--- src/includes/extend/buddypress/groups.php	(revision 5673)
+++ src/includes/extend/buddypress/groups.php	(working copy)
@@ -143,6 +143,9 @@
 			add_filter( 'bbp_current_user_can_access_create_topic_form', array( $this, 'form_permissions' ) );
 			add_filter( 'bbp_current_user_can_access_create_reply_form', array( $this, 'form_permissions' ) );
 		}
+
+		// Enforce forum privacy.
+		add_filter( 'bbp_is_forum_public', array( $this, 'enforce_forum_privacy' ), 10, 3 );
 	}
 
 	/**
@@ -1462,5 +1465,23 @@
 
 		return $args;
 	}
+
+	public function enforce_forum_privacy( $is_public, $forum_id, $check_ancestors ) {
+		$group_ids = bbp_get_forum_group_ids( $forum_id );
+
+		if ( ! empty( $group_ids ) ) {
+			foreach ( $group_ids as $group_id ) {
+				$group = groups_get_group( array( 'group_id' => $group_id ) );
+
+				// A single non-public group will force the forum to private.
+				if ( 'public' !== $group->status ) {
+					$is_public = false;
+					break;
+				}
+			}
+		}
+
+		return $is_public;
+	}
 }
 endif;
Index: tests/phpunit/testcases/extend/buddypress/groups.php
===================================================================
--- tests/phpunit/testcases/extend/buddypress/groups.php	(revision 0)
+++ tests/phpunit/testcases/extend/buddypress/groups.php	(working copy)
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @group extend
+ * @group buddypress
+ * @group groups
+ */
+class BBP_Tests_Extend_BuddyPress_Groups extends BBP_UnitTestCase {
+	public function setUp() {
+		parent::setUp();
+
+		if ( ! function_exists( 'buddypress' ) ) {
+			return;
+		}
+	}
+
+	/**
+	 * Copied from `BBP_Forums_Group_Extension::new_forum()`.
+	 */
+	private function attach_forum_to_group( $forum_id, $group_id ) {
+		bbp_add_forum_id_to_group( $group_id, $forum_id );
+		bbp_add_group_id_to_forum( $forum_id, $group_id );
+	}
+
+	/**
+	 * @ticket BBP2327
+	 */
+	public function test_bbp_is_forum_public_should_be_true_for_public_group_forums() {
+		$g = $this->bp_factory->group->create( array(
+			'status' => 'public',
+		) );
+
+		$f = $this->factory->forum->create();
+
+		$this->attach_forum_to_group( $f, $g );
+
+		$this->assertTrue( bbp_is_forum_public( $f ) );
+	}
+
+	/**
+	 * @ticket BBP2327
+	 */
+	public function test_bbp_is_forum_public_should_be_false_for_private_group_forums() {
+		$g = $this->bp_factory->group->create( array(
+			'status' => 'private',
+		) );
+
+		$f = $this->factory->forum->create();
+
+		$this->attach_forum_to_group( $f, $g );
+
+		$this->assertFalse( bbp_is_forum_public( $f ) );
+	}
+
+	/**
+	 * @ticket BBP2327
+	 */
+	public function test_bbp_is_forum_public_should_be_false_for_hidden_group_forums() {
+		$g = $this->bp_factory->group->create( array(
+			'status' => 'hidden',
+		) );
+
+		$f = $this->factory->forum->create();
+
+		$this->attach_forum_to_group( $f, $g );
+
+		$this->assertFalse( bbp_is_forum_public( $f ) );
+	}
+}
