Merge branch 'develop' into abuse-report-resolver
This commit is contained in:
		
						commit
						42aa667fa7
					
				
							
								
								
									
										13
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										13
									
								
								CHANGELOG.md
								
								
								
								
							|  | @ -1,5 +1,5 @@ | |||
| <!-- | ||||
| ## 13.x.x (unreleased) | ||||
| ## 2023.x.x (unreleased) | ||||
| 
 | ||||
| ### General | ||||
| - | ||||
|  | @ -12,11 +12,20 @@ | |||
| 
 | ||||
| --> | ||||
| 
 | ||||
| ## 13.x.x (unreleased) | ||||
| ### General | ||||
| ======= | ||||
| ## 2023.8.0 (unreleased) | ||||
| 
 | ||||
| ### General | ||||
| - OAuth 2.0のサポート | ||||
| - 通報の即時解決機能を追加 | ||||
| 
 | ||||
| ### Client | ||||
| - Fix: サーバー情報画面(`/instance-info/{domain}`)でブロックができないのを修正 | ||||
| 
 | ||||
| ### Server | ||||
| - | ||||
| 
 | ||||
| ## 13.14.2 | ||||
| 
 | ||||
| ### Client | ||||
|  |  | |||
|  | @ -147,7 +147,6 @@ | |||
| 		"rss-parser": "3.13.0", | ||||
| 		"rxjs": "7.8.1", | ||||
| 		"sanitize-html": "2.11.0", | ||||
| 		"semver": "7.5.4", | ||||
| 		"sharp": "0.32.3", | ||||
| 		"sharp-read-bmp": "github:misskey-dev/sharp-read-bmp", | ||||
| 		"slacc": "0.0.10", | ||||
|  |  | |||
|  | @ -10,7 +10,6 @@ import * as os from 'node:os'; | |||
| import cluster from 'node:cluster'; | ||||
| import chalk from 'chalk'; | ||||
| import chalkTemplate from 'chalk-template'; | ||||
| import semver from 'semver'; | ||||
| import Logger from '@/logger.js'; | ||||
| import { loadConfig } from '@/config.js'; | ||||
| import type { Config } from '@/config.js'; | ||||
|  |  | |||
|  | @ -1,3 +1,8 @@ | |||
| /* | ||||
|  * SPDX-FileCopyrightText: syuilo and other misskey contributors | ||||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import dns from 'node:dns/promises'; | ||||
| import { fileURLToPath } from 'node:url'; | ||||
| import { Inject, Injectable } from '@nestjs/common'; | ||||
|  |  | |||
|  | @ -1,3 +1,8 @@ | |||
| /* | ||||
|  * SPDX-FileCopyrightText: syuilo and other misskey contributors | ||||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * Basic OAuth tests to make sure the library is correctly integrated to Misskey | ||||
|  * and not regressed by version updates or potential migration to another library. | ||||
|  |  | |||
|  | @ -751,18 +751,25 @@ async function post(ev?: MouseEvent) { | |||
| 				claimAchievement('notes1'); | ||||
| 			} | ||||
| 
 | ||||
| 			const text = postData.text?.toLowerCase() ?? ''; | ||||
| 			if ((text.includes('love') || text.includes('❤')) && text.includes('misskey')) { | ||||
| 			const text = postData.text ?? ''; | ||||
| 			const lowerCase = text.toLowerCase(); | ||||
| 			if ((lowerCase.includes('love') || lowerCase.includes('❤')) && lowerCase.includes('misskey')) { | ||||
| 				claimAchievement('iLoveMisskey'); | ||||
| 			} | ||||
| 			if ( | ||||
| 				text.includes('https://youtu.be/Efrlqw8ytg4'.toLowerCase()) || | ||||
| 				text.includes('https://www.youtube.com/watch?v=Efrlqw8ytg4'.toLowerCase()) || | ||||
| 				text.includes('https://m.youtube.com/watch?v=Efrlqw8ytg4'.toLowerCase()) || | ||||
| 				text.includes('https://youtu.be/XVCwzwxdHuA'.toLowerCase()) || | ||||
| 				text.includes('https://www.youtube.com/watch?v=XVCwzwxdHuA'.toLowerCase()) || | ||||
| 				text.includes('https://m.youtube.com/watch?v=XVCwzwxdHuA'.toLowerCase()) | ||||
| 			) { | ||||
| 			if ([ | ||||
| 				'https://youtu.be/Efrlqw8ytg4', | ||||
| 				'https://www.youtube.com/watch?v=Efrlqw8ytg4', | ||||
| 				'https://m.youtube.com/watch?v=Efrlqw8ytg4', | ||||
| 			 | ||||
| 				'https://youtu.be/XVCwzwxdHuA', | ||||
| 				'https://www.youtube.com/watch?v=XVCwzwxdHuA', | ||||
| 				'https://m.youtube.com/watch?v=XVCwzwxdHuA', | ||||
| 
 | ||||
| 				'https://open.spotify.com/track/3Cuj0mZrlLoXx9nydNi7RB', | ||||
| 				'https://open.spotify.com/track/7anfcaNPQWlWCwyCHmZqNy', | ||||
| 				'https://open.spotify.com/track/5Odr16TvEN4my22K9nbH7l', | ||||
| 				'https://open.spotify.com/album/5bOlxyl4igOrp2DwVQxBco', | ||||
| 			].some(url => text.includes(url))) { | ||||
| 				claimAchievement('brainDiver'); | ||||
| 			} | ||||
| 
 | ||||
|  |  | |||
|  | @ -34,8 +34,8 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 			<FormSection v-if="iAmModerator"> | ||||
| 				<template #label>Moderation</template> | ||||
| 				<div class="_gaps_s"> | ||||
| 					<MkSwitch v-model="suspended" @update:modelValue="toggleSuspend">{{ i18n.ts.stopActivityDelivery }}</MkSwitch> | ||||
| 					<MkSwitch v-model="isBlocked" @update:modelValue="toggleBlock">{{ i18n.ts.blockThisInstance }}</MkSwitch> | ||||
| 					<MkSwitch v-model="suspended" :disabled="!instance" @update:modelValue="toggleSuspend">{{ i18n.ts.stopActivityDelivery }}</MkSwitch> | ||||
| 					<MkSwitch v-model="isBlocked" :disabled="!meta || !instance" @update:modelValue="toggleBlock">{{ i18n.ts.blockThisInstance }}</MkSwitch> | ||||
| 					<MkButton @click="refreshMetadata"><i class="ti ti-refresh"></i> Refresh metadata</MkButton> | ||||
| 				</div> | ||||
| 			</FormSection> | ||||
|  | @ -129,7 +129,7 @@ import MkSelect from '@/components/MkSelect.vue'; | |||
| import MkSwitch from '@/components/MkSwitch.vue'; | ||||
| import * as os from '@/os'; | ||||
| import number from '@/filters/number'; | ||||
| import { iAmModerator } from '@/account'; | ||||
| import { iAmModerator, iAmAdmin } from '@/account'; | ||||
| import { definePageMetadata } from '@/scripts/page-metadata'; | ||||
| import { i18n } from '@/i18n'; | ||||
| import MkUserCardMini from '@/components/MkUserCardMini.vue'; | ||||
|  | @ -143,11 +143,11 @@ const props = defineProps<{ | |||
| 
 | ||||
| let tab = $ref('overview'); | ||||
| let chartSrc = $ref('instance-requests'); | ||||
| let meta = $ref<misskey.entities.DetailedInstanceMetadata | null>(null); | ||||
| let meta = $ref<misskey.entities.AdminInstanceMetadata | null>(null); | ||||
| let instance = $ref<misskey.entities.Instance | null>(null); | ||||
| let suspended = $ref(false); | ||||
| let isBlocked = $ref(false); | ||||
| let faviconUrl = $ref(null); | ||||
| let faviconUrl = $ref<string | null>(null); | ||||
| 
 | ||||
| const usersPagination = { | ||||
| 	endpoint: iAmModerator ? 'admin/show-users' : 'users' as const, | ||||
|  | @ -160,7 +160,10 @@ const usersPagination = { | |||
| 	offsetMode: true, | ||||
| }; | ||||
| 
 | ||||
| async function fetch() { | ||||
| async function fetch(): Promise<void> { | ||||
| 	if (iAmAdmin) { | ||||
| 		meta = await os.api('admin/meta'); | ||||
| 	} | ||||
| 	instance = await os.api('federation/show-instance', { | ||||
| 		host: props.host, | ||||
| 	}); | ||||
|  | @ -169,21 +172,25 @@ async function fetch() { | |||
| 	faviconUrl = getProxiedImageUrlNullable(instance.faviconUrl, 'preview') ?? getProxiedImageUrlNullable(instance.iconUrl, 'preview'); | ||||
| } | ||||
| 
 | ||||
| async function toggleBlock(ev) { | ||||
| 	if (meta == null) return; | ||||
| async function toggleBlock(): Promise<void> { | ||||
| 	if (!meta) throw new Error('No meta?'); | ||||
| 	if (!instance) throw new Error('No instance?'); | ||||
| 	const { host } = instance; | ||||
| 	await os.api('admin/update-meta', { | ||||
| 		blockedHosts: isBlocked ? meta.blockedHosts.concat([instance.host]) : meta.blockedHosts.filter(x => x !== instance.host), | ||||
| 		blockedHosts: isBlocked ? meta.blockedHosts.concat([host]) : meta.blockedHosts.filter(x => x !== host), | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| async function toggleSuspend(v) { | ||||
| async function toggleSuspend(): Promise<void> { | ||||
| 	if (!instance) throw new Error('No instance?'); | ||||
| 	await os.api('admin/federation/update-instance', { | ||||
| 		host: instance.host, | ||||
| 		isSuspended: suspended, | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| function refreshMetadata() { | ||||
| function refreshMetadata(): void { | ||||
| 	if (!instance) throw new Error('No instance?'); | ||||
| 	os.api('admin/federation/refresh-remote-instance-metadata', { | ||||
| 		host: instance.host, | ||||
| 	}); | ||||
|  |  | |||
|  | @ -1,3 +1,8 @@ | |||
| <!-- | ||||
| SPDX-FileCopyrightText: syuilo and other misskey contributors | ||||
| SPDX-License-Identifier: AGPL-3.0-only | ||||
| --> | ||||
| 
 | ||||
| <template> | ||||
| <MkStickyContainer> | ||||
| 	<template #header><MkPageHeader/></template> | ||||
|  |  | |||
|  | @ -17,6 +17,11 @@ export type Acct = { | |||
| // @public (undocumented) | ||||
| type Ad = TODO_2; | ||||
| 
 | ||||
| // @public (undocumented) | ||||
| type AdminInstanceMetadata = DetailedInstanceMetadata & { | ||||
|     blockedHosts: string[]; | ||||
| }; | ||||
| 
 | ||||
| // @public (undocumented) | ||||
| type Announcement = { | ||||
|     id: ID; | ||||
|  | @ -329,8 +334,8 @@ export type Endpoints = { | |||
|         res: TODO; | ||||
|     }; | ||||
|     'admin/meta': { | ||||
|         req: TODO; | ||||
|         res: TODO; | ||||
|         req: NoParams; | ||||
|         res: AdminInstanceMetadata; | ||||
|     }; | ||||
|     'admin/reset-password': { | ||||
|         req: TODO; | ||||
|  | @ -2242,6 +2247,7 @@ declare namespace entities { | |||
|         LiteInstanceMetadata, | ||||
|         DetailedInstanceMetadata, | ||||
|         InstanceMetadata, | ||||
|         AdminInstanceMetadata, | ||||
|         ServerInfo, | ||||
|         Stats, | ||||
|         Page, | ||||
|  | @ -2333,7 +2339,7 @@ type ID = string; | |||
| // @public (undocumented) | ||||
| type Instance = { | ||||
|     id: ID; | ||||
|     caughtAt: DateString; | ||||
|     firstRetrievedAt: DateString; | ||||
|     host: string; | ||||
|     usersCount: number; | ||||
|     notesCount: number; | ||||
|  | @ -2347,6 +2353,7 @@ type Instance = { | |||
|     lastCommunicatedAt: DateString; | ||||
|     isNotResponding: boolean; | ||||
|     isSuspended: boolean; | ||||
|     isBlocked: boolean; | ||||
|     softwareName: string | null; | ||||
|     softwareVersion: string | null; | ||||
|     openRegistrations: boolean | null; | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ import type { | |||
| 	Ad, Announcement, Antenna, App, AuthSession, Blocking, Channel, Clip, DateString, DetailedInstanceMetadata, DriveFile, DriveFolder, Following, FollowingFolloweePopulated, FollowingFollowerPopulated, FollowRequest, GalleryPost, Instance, | ||||
| 	LiteInstanceMetadata, | ||||
| 	MeDetailed, | ||||
| 	Note, NoteFavorite, OriginType, Page, ServerInfo, Stats, User, UserDetailed, MeSignup, UserGroup, UserList, UserSorting, Notification, NoteReaction, Signin, MessagingMessage, Invite, InviteLimit, | ||||
| 	Note, NoteFavorite, OriginType, Page, ServerInfo, Stats, User, UserDetailed, MeSignup, UserGroup, UserList, UserSorting, Notification, NoteReaction, Signin, MessagingMessage, Invite, InviteLimit, AdminInstanceMetadata, | ||||
| } from './entities.js'; | ||||
| 
 | ||||
| type TODO = Record<string, any> | null; | ||||
|  | @ -20,7 +20,7 @@ export type Endpoints = { | |||
| 	'admin/get-table-stats': { req: TODO; res: TODO; }; | ||||
| 	'admin/invite': { req: TODO; res: TODO; }; | ||||
| 	'admin/logs': { req: TODO; res: TODO; }; | ||||
| 	'admin/meta': { req: TODO; res: TODO; }; | ||||
| 	'admin/meta': { req: NoParams; res: AdminInstanceMetadata; }; | ||||
| 	'admin/reset-password': { req: TODO; res: TODO; }; | ||||
| 	'admin/resolve-abuse-user-report': { req: TODO; res: TODO; }; | ||||
| 	'admin/resync-chart': { req: TODO; res: TODO; }; | ||||
|  |  | |||
|  | @ -346,6 +346,11 @@ export type DetailedInstanceMetadata = LiteInstanceMetadata & { | |||
| 
 | ||||
| export type InstanceMetadata = LiteInstanceMetadata | DetailedInstanceMetadata; | ||||
| 
 | ||||
| export type AdminInstanceMetadata = DetailedInstanceMetadata & { | ||||
| 	// TODO: There are more fields.
 | ||||
| 	blockedHosts: string[]; | ||||
| }; | ||||
| 
 | ||||
| export type ServerInfo = { | ||||
| 	machine: string; | ||||
| 	cpu: { | ||||
|  | @ -482,7 +487,7 @@ export type Blocking = { | |||
| 
 | ||||
| export type Instance = { | ||||
| 	id: ID; | ||||
| 	caughtAt: DateString; | ||||
| 	firstRetrievedAt: DateString; | ||||
| 	host: string; | ||||
| 	usersCount: number; | ||||
| 	notesCount: number; | ||||
|  | @ -496,6 +501,7 @@ export type Instance = { | |||
| 	lastCommunicatedAt: DateString; | ||||
| 	isNotResponding: boolean; | ||||
| 	isSuspended: boolean; | ||||
| 	isBlocked: boolean; | ||||
| 	softwareName: string | null; | ||||
| 	softwareVersion: string | null; | ||||
| 	openRegistrations: boolean | null; | ||||
|  |  | |||
|  | @ -341,9 +341,6 @@ importers: | |||
|       sanitize-html: | ||||
|         specifier: 2.11.0 | ||||
|         version: 2.11.0 | ||||
|       semver: | ||||
|         specifier: 7.5.4 | ||||
|         version: 7.5.4 | ||||
|       sharp: | ||||
|         specifier: 0.32.3 | ||||
|         version: 0.32.3 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue