From d78a5c0863b75ad51f739caf6c6eb129cc958b36 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 18 Apr 2019 14:34:47 +0900
Subject: [PATCH] Fix #4703

---
 .../api/stream/channels/hybrid-timeline.ts    |  4 +--
 test/streaming.ts                             | 25 +++++++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/server/api/stream/channels/hybrid-timeline.ts b/src/server/api/stream/channels/hybrid-timeline.ts
index 18e6aa8350..5bf23715ef 100644
--- a/src/server/api/stream/channels/hybrid-timeline.ts
+++ b/src/server/api/stream/channels/hybrid-timeline.ts
@@ -20,11 +20,11 @@ export default class extends Channel {
 
 	@autobind
 	private async onNote(note: any) {
-		// 自分自身の投稿 または その投稿のユーザーをフォローしている または ローカルの投稿 の場合だけ
+		// 自分自身の投稿 または その投稿のユーザーをフォローしている または ホームのローカルの投稿 の場合だけ
 		if (!(
 			this.user!.id === note.userId ||
 			this.following.includes(note.userId) ||
-			note.user.host == null
+			(note.user.host == null && note.visibility === 'home')
 		)) return;
 
 		if (['followers', 'specified'].includes(note.visibility)) {
diff --git a/test/streaming.ts b/test/streaming.ts
index a29517148a..a9c90c216f 100644
--- a/test/streaming.ts
+++ b/test/streaming.ts
@@ -484,6 +484,31 @@ describe('Streaming', () => {
 			});
 		}));
 
+		it('フォローしていないローカルユーザーのホーム投稿は流れない', () => new Promise(async done => {
+			const alice = await signup({ username: 'alice' });
+			const bob = await signup({ username: 'bob' });
+
+			let fired = false;
+
+			const ws = await connectStream(alice, 'hybridTimeline', ({ type, body }) => {
+				if (type == 'note') {
+					fired = true;
+				}
+			});
+
+			// ホーム投稿
+			post(bob, {
+				text: 'foo',
+				visibility: 'home'
+			});
+
+			setTimeout(() => {
+				assert.strictEqual(fired, false);
+				ws.close();
+				done();
+			}, 3000);
+		}));
+
 		it('フォローしていないローカルユーザーのフォロワー宛て投稿は流れない', () => new Promise(async done => {
 			const alice = await signup({ username: 'alice' });
 			const bob = await signup({ username: 'bob' });