ghostの設定をDBに保存するように
This commit is contained in:
		
							parent
							
								
									87d4452d19
								
							
						
					
					
						commit
						2de48110bb
					
				
					 9 changed files with 55 additions and 21 deletions
				
			
		| 
						 | 
					@ -135,11 +135,6 @@ autoAdmin: true
 | 
				
			||||||
#  client_id: example-github-client-id
 | 
					#  client_id: example-github-client-id
 | 
				
			||||||
#  client_secret: example-github-client-secret
 | 
					#  client_secret: example-github-client-secret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Ghost
 | 
					 | 
				
			||||||
# Ghost account is an account used for the purpose of delegating
 | 
					 | 
				
			||||||
# followers when putting users in the list.
 | 
					 | 
				
			||||||
#ghost: user-id-of-your-ghost-account
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Clustering
 | 
					# Clustering
 | 
				
			||||||
#clusterLimit: 1
 | 
					#clusterLimit: 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1090,6 +1090,11 @@ admin/views/instance.vue:
 | 
				
			||||||
  enable-recaptcha: "reCAPTCHAを有効にする"
 | 
					  enable-recaptcha: "reCAPTCHAを有効にする"
 | 
				
			||||||
  recaptcha-site-key: "reCAPTCHA site key"
 | 
					  recaptcha-site-key: "reCAPTCHA site key"
 | 
				
			||||||
  recaptcha-secret-key: "reCAPTCHA secret key"
 | 
					  recaptcha-secret-key: "reCAPTCHA secret key"
 | 
				
			||||||
 | 
					  proxy-account-config: "プロキシアカウントの設定"
 | 
				
			||||||
 | 
					  proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
 | 
				
			||||||
 | 
					  proxy-account-username: "プロキシアカウントのユーザー名"
 | 
				
			||||||
 | 
					  proxy-account-username-desc: "プロキシとして使用するアカウントのユーザー名を指定してください。"
 | 
				
			||||||
 | 
					  proxy-account-warn: "アカウントは自動で作られないため、そのユーザー名のアカウントを予め作成しておく必要があります。"
 | 
				
			||||||
  max-note-text-length: "投稿の最大文字数"
 | 
					  max-note-text-length: "投稿の最大文字数"
 | 
				
			||||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
					  disable-registration: "ユーザー登録の受付を停止する"
 | 
				
			||||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
					  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,8 +13,8 @@
 | 
				
			||||||
		<section class="fit-bottom">
 | 
							<section class="fit-bottom">
 | 
				
			||||||
			<header><fa icon="cloud"/> %i18n:@drive-config%</header>
 | 
								<header><fa icon="cloud"/> %i18n:@drive-config%</header>
 | 
				
			||||||
			<ui-switch v-model="cacheRemoteFiles">%i18n:@cache-remote-files%<span slot="desc">%i18n:@cache-remote-files-desc%</span></ui-switch>
 | 
								<ui-switch v-model="cacheRemoteFiles">%i18n:@cache-remote-files%<span slot="desc">%i18n:@cache-remote-files-desc%</span></ui-switch>
 | 
				
			||||||
			<ui-input v-model="localDriveCapacityMb">%i18n:@local-drive-capacity-mb%<span slot="desc">%i18n:@mb%</span><span slot="suffix">MB</span></ui-input>
 | 
								<ui-input v-model="localDriveCapacityMb">%i18n:@local-drive-capacity-mb%<span slot="suffix">MB</span><span slot="desc">%i18n:@mb%</span></ui-input>
 | 
				
			||||||
			<ui-input v-model="remoteDriveCapacityMb" :disabled="!cacheRemoteFiles">%i18n:@remote-drive-capacity-mb%<span slot="desc">%i18n:@mb%</span><span slot="suffix">MB</span></ui-input>
 | 
								<ui-input v-model="remoteDriveCapacityMb" :disabled="!cacheRemoteFiles">%i18n:@remote-drive-capacity-mb%<span slot="suffix">MB</span><span slot="desc">%i18n:@mb%</span></ui-input>
 | 
				
			||||||
		</section>
 | 
							</section>
 | 
				
			||||||
		<section class="fit-bottom">
 | 
							<section class="fit-bottom">
 | 
				
			||||||
			<header><fa icon="shield-alt"/> %i18n:@recaptcha-config%</header>
 | 
								<header><fa icon="shield-alt"/> %i18n:@recaptcha-config%</header>
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,12 @@
 | 
				
			||||||
			<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>%i18n:@recaptcha-site-key%</ui-input>
 | 
								<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>%i18n:@recaptcha-site-key%</ui-input>
 | 
				
			||||||
			<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>%i18n:@recaptcha-secret-key%</ui-input>
 | 
								<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>%i18n:@recaptcha-secret-key%</ui-input>
 | 
				
			||||||
		</section>
 | 
							</section>
 | 
				
			||||||
 | 
							<section>
 | 
				
			||||||
 | 
								<header><fa icon="ghost"/> %i18n:@proxy-account-config%</header>
 | 
				
			||||||
 | 
								<ui-info>%i18n:@proxy-account-info%</ui-info>
 | 
				
			||||||
 | 
								<ui-input v-model="proxyAccount"><i slot="prefix">@</i>%i18n:@proxy-account-username%<span slot="desc">%i18n:@proxy-account-username-desc%</span></ui-input>
 | 
				
			||||||
 | 
								<ui-info warn>%i18n:@proxy-account-warn%</ui-info>
 | 
				
			||||||
 | 
							</section>
 | 
				
			||||||
		<section>
 | 
							<section>
 | 
				
			||||||
			<ui-switch v-model="disableRegistration">%i18n:@disable-registration%</ui-switch>
 | 
								<ui-switch v-model="disableRegistration">%i18n:@disable-registration%</ui-switch>
 | 
				
			||||||
		</section>
 | 
							</section>
 | 
				
			||||||
| 
						 | 
					@ -62,6 +68,7 @@ export default Vue.extend({
 | 
				
			||||||
			enableRecaptcha: false,
 | 
								enableRecaptcha: false,
 | 
				
			||||||
			recaptchaSiteKey: null,
 | 
								recaptchaSiteKey: null,
 | 
				
			||||||
			recaptchaSecretKey: null,
 | 
								recaptchaSecretKey: null,
 | 
				
			||||||
 | 
								proxyAccount: null,
 | 
				
			||||||
			inviteCode: null,
 | 
								inviteCode: null,
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -78,6 +85,7 @@ export default Vue.extend({
 | 
				
			||||||
			this.enableRecaptcha = meta.enableRecaptcha;
 | 
								this.enableRecaptcha = meta.enableRecaptcha;
 | 
				
			||||||
			this.recaptchaSiteKey = meta.recaptchaSiteKey;
 | 
								this.recaptchaSiteKey = meta.recaptchaSiteKey;
 | 
				
			||||||
			this.recaptchaSecretKey = meta.recaptchaSecretKey;
 | 
								this.recaptchaSecretKey = meta.recaptchaSecretKey;
 | 
				
			||||||
 | 
								this.proxyAccount = meta.proxyAccount;
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,7 +114,8 @@ export default Vue.extend({
 | 
				
			||||||
				maxNoteTextLength: parseInt(this.maxNoteTextLength, 10),
 | 
									maxNoteTextLength: parseInt(this.maxNoteTextLength, 10),
 | 
				
			||||||
				enableRecaptcha: this.enableRecaptcha,
 | 
									enableRecaptcha: this.enableRecaptcha,
 | 
				
			||||||
				recaptchaSiteKey: this.recaptchaSiteKey,
 | 
									recaptchaSiteKey: this.recaptchaSiteKey,
 | 
				
			||||||
				recaptchaSecretKey: this.recaptchaSecretKey
 | 
									recaptchaSecretKey: this.recaptchaSecretKey,
 | 
				
			||||||
 | 
									proxyAccount: this.proxyAccount,
 | 
				
			||||||
			}).then(() => {
 | 
								}).then(() => {
 | 
				
			||||||
				this.$swal({
 | 
									this.$swal({
 | 
				
			||||||
					type: 'success',
 | 
										type: 'success',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,11 +50,6 @@ export type Source = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	autoAdmin?: boolean;
 | 
						autoAdmin?: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * ゴーストアカウントのID
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	ghost?: string;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	proxy?: string;
 | 
						proxy?: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	summalyProxy?: string;
 | 
						summalyProxy?: string;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,7 @@
 | 
				
			||||||
import db from '../db/mongodb';
 | 
					import db from '../db/mongodb';
 | 
				
			||||||
import config from '../config';
 | 
					import config from '../config';
 | 
				
			||||||
 | 
					import User from './user';
 | 
				
			||||||
 | 
					import { transform } from '../misc/cafy-id';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Meta = db.get<IMeta>('meta');
 | 
					const Meta = db.get<IMeta>('meta');
 | 
				
			||||||
export default Meta;
 | 
					export default Meta;
 | 
				
			||||||
| 
						 | 
					@ -74,6 +76,18 @@ if ((config as any).recaptcha) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					if ((config as any).ghost) {
 | 
				
			||||||
 | 
						Meta.findOne({}).then(async m => {
 | 
				
			||||||
 | 
							if (m != null && m.proxyAccount == null) {
 | 
				
			||||||
 | 
								const account = await User.findOne({ _id: transform((config as any).ghost) });
 | 
				
			||||||
 | 
								Meta.update({}, {
 | 
				
			||||||
 | 
									$set: {
 | 
				
			||||||
 | 
										proxyAccount: account.username
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type IMeta = {
 | 
					export type IMeta = {
 | 
				
			||||||
	name?: string;
 | 
						name?: string;
 | 
				
			||||||
| 
						 | 
					@ -92,6 +106,8 @@ export type IMeta = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cacheRemoteFiles?: boolean;
 | 
						cacheRemoteFiles?: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						proxyAccount?: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	enableRecaptcha?: boolean;
 | 
						enableRecaptcha?: boolean;
 | 
				
			||||||
	recaptchaSiteKey?: string;
 | 
						recaptchaSiteKey?: string;
 | 
				
			||||||
	recaptchaSecretKey?: string;
 | 
						recaptchaSecretKey?: string;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,7 @@ import Mute from './mute';
 | 
				
			||||||
import { getFriendIds } from '../server/api/common/get-friends';
 | 
					import { getFriendIds } from '../server/api/common/get-friends';
 | 
				
			||||||
import config from '../config';
 | 
					import config from '../config';
 | 
				
			||||||
import FollowRequest from './follow-request';
 | 
					import FollowRequest from './follow-request';
 | 
				
			||||||
 | 
					import fetchMeta from '../misc/fetch-meta';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const User = db.get<IUser>('users');
 | 
					const User = db.get<IUser>('users');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -376,6 +377,7 @@ function img(url) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function getGhost(): Promise<ILocalUser> {
 | 
					export async function fetchProxyAccount(): Promise<ILocalUser> {
 | 
				
			||||||
	return User.findOne({ _id: new mongo.ObjectId(config.ghost) });
 | 
						const meta = await fetchMeta();
 | 
				
			||||||
 | 
						return await User.findOne({ username: meta.proxyAccount, host: null }) as ILocalUser;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -98,17 +98,24 @@ export const meta = {
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		recaptchaSiteKey: {
 | 
							recaptchaSiteKey: {
 | 
				
			||||||
			validator: $.str.optional,
 | 
								validator: $.str.optional.nullable,
 | 
				
			||||||
			desc: {
 | 
								desc: {
 | 
				
			||||||
				'ja-JP': 'reCAPTCHA site key'
 | 
									'ja-JP': 'reCAPTCHA site key'
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		recaptchaSecretKey: {
 | 
							recaptchaSecretKey: {
 | 
				
			||||||
			validator: $.str.optional,
 | 
								validator: $.str.optional.nullable,
 | 
				
			||||||
			desc: {
 | 
								desc: {
 | 
				
			||||||
				'ja-JP': 'reCAPTCHA secret key'
 | 
									'ja-JP': 'reCAPTCHA secret key'
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							proxyAccount: {
 | 
				
			||||||
 | 
								validator: $.str.optional.nullable,
 | 
				
			||||||
 | 
								desc: {
 | 
				
			||||||
 | 
									'ja-JP': 'Proxy account username'
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -172,6 +179,10 @@ export default define(meta, (ps) => new Promise(async (res, rej) => {
 | 
				
			||||||
		set.recaptchaSecretKey = ps.recaptchaSecretKey;
 | 
							set.recaptchaSecretKey = ps.recaptchaSecretKey;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ps.proxyAccount !== undefined) {
 | 
				
			||||||
 | 
							set.proxyAccount = ps.proxyAccount;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	await Meta.update({}, {
 | 
						await Meta.update({}, {
 | 
				
			||||||
		$set: set
 | 
							$set: set
 | 
				
			||||||
	}, { upsert: true });
 | 
						}, { upsert: true });
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,6 +85,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
 | 
				
			||||||
	if (me && me.isAdmin) {
 | 
						if (me && me.isAdmin) {
 | 
				
			||||||
		response.hidedTags = instance.hidedTags;
 | 
							response.hidedTags = instance.hidedTags;
 | 
				
			||||||
		response.recaptchaSecretKey = instance.recaptchaSecretKey;
 | 
							response.recaptchaSecretKey = instance.recaptchaSecretKey;
 | 
				
			||||||
 | 
							response.proxyAccount = instance.proxyAccount;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res(response);
 | 
						res(response);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
 | 
					import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
 | 
				
			||||||
import UserList from '../../../../../models/user-list';
 | 
					import UserList from '../../../../../models/user-list';
 | 
				
			||||||
import User, { pack as packUser, isRemoteUser, getGhost } from '../../../../../models/user';
 | 
					import User, { pack as packUser, isRemoteUser, fetchProxyAccount } from '../../../../../models/user';
 | 
				
			||||||
import { publishUserListStream } from '../../../../../stream';
 | 
					import { publishUserListStream } from '../../../../../stream';
 | 
				
			||||||
import ap from '../../../../../remote/activitypub/renderer';
 | 
					import ap from '../../../../../remote/activitypub/renderer';
 | 
				
			||||||
import renderFollow from '../../../../../remote/activitypub/renderer/follow';
 | 
					import renderFollow from '../../../../../remote/activitypub/renderer/follow';
 | 
				
			||||||
| 
						 | 
					@ -71,8 +71,8 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// このインスタンス内にこのリモートユーザーをフォローしているユーザーがいなくても投稿を受け取るためにダミーのユーザーがフォローしたということにする
 | 
						// このインスタンス内にこのリモートユーザーをフォローしているユーザーがいなくても投稿を受け取るためにダミーのユーザーがフォローしたということにする
 | 
				
			||||||
	if (isRemoteUser(user)) {
 | 
						if (isRemoteUser(user)) {
 | 
				
			||||||
		const ghost = await getGhost();
 | 
							const proxy = await fetchProxyAccount();
 | 
				
			||||||
		const content = ap(renderFollow(ghost, user));
 | 
							const content = ap(renderFollow(proxy, user));
 | 
				
			||||||
		deliver(ghost, content, user.inbox);
 | 
							deliver(proxy, content, user.inbox);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}));
 | 
					}));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue