Merge remote-tracking branch 'upstream/develop' into incoming
All checks were successful
Lint / pnpm_install (pull_request) Successful in 1m52s
Publish Docker image / Build (pull_request) Successful in 4m19s
Test (production install and build) / production (22.11.0) (pull_request) Successful in 1m1s
Lint / lint (backend) (pull_request) Successful in 2m15s
Test (backend) / unit (22.11.0) (pull_request) Successful in 8m24s
Lint / lint (frontend) (pull_request) Successful in 2m40s
Lint / lint (frontend-embed) (pull_request) Successful in 2m15s
Lint / lint (frontend-shared) (pull_request) Successful in 2m16s
Lint / lint (misskey-bubble-game) (pull_request) Successful in 2m27s
Test (backend) / e2e (22.11.0) (pull_request) Successful in 11m55s
Lint / lint (misskey-js) (pull_request) Successful in 2m39s
Lint / lint (misskey-reversi) (pull_request) Successful in 2m28s
Lint / lint (sw) (pull_request) Successful in 2m26s
Lint / typecheck (misskey-js) (pull_request) Successful in 1m38s
Lint / typecheck (backend) (pull_request) Successful in 2m25s
Lint / typecheck (sw) (pull_request) Successful in 1m40s
All checks were successful
Lint / pnpm_install (pull_request) Successful in 1m52s
Publish Docker image / Build (pull_request) Successful in 4m19s
Test (production install and build) / production (22.11.0) (pull_request) Successful in 1m1s
Lint / lint (backend) (pull_request) Successful in 2m15s
Test (backend) / unit (22.11.0) (pull_request) Successful in 8m24s
Lint / lint (frontend) (pull_request) Successful in 2m40s
Lint / lint (frontend-embed) (pull_request) Successful in 2m15s
Lint / lint (frontend-shared) (pull_request) Successful in 2m16s
Lint / lint (misskey-bubble-game) (pull_request) Successful in 2m27s
Test (backend) / e2e (22.11.0) (pull_request) Successful in 11m55s
Lint / lint (misskey-js) (pull_request) Successful in 2m39s
Lint / lint (misskey-reversi) (pull_request) Successful in 2m28s
Lint / lint (sw) (pull_request) Successful in 2m26s
Lint / typecheck (misskey-js) (pull_request) Successful in 1m38s
Lint / typecheck (backend) (pull_request) Successful in 2m25s
Lint / typecheck (sw) (pull_request) Successful in 1m40s
This commit is contained in:
commit
1025d5a4c4
12 changed files with 146 additions and 23 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -68,6 +68,8 @@ misskey-assets
|
|||
# Vite temporary files
|
||||
vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
||||
vite.config.local-dev.js.timestamp-*
|
||||
vite.config.local-dev.ts.timestamp-*
|
||||
|
||||
# blender backups
|
||||
*.blend1
|
||||
|
|
|
@ -22,6 +22,7 @@ PgroongaのCWサーチ (github.com/paricafe/misskey#d30db97b59d264450901c1dd8680
|
|||
|
||||
### Note
|
||||
- Node.js 20.xは非推奨になりました。Node.js 22.x (LTS)の利用を推奨します。
|
||||
- なお、Node.js 23.xは対応していません。
|
||||
- DockerのNode.jsが22.11.0に更新されました
|
||||
|
||||
### General
|
||||
|
@ -46,6 +47,7 @@ PgroongaのCWサーチ (github.com/paricafe/misskey#d30db97b59d264450901c1dd8680
|
|||
- Enhance: ノート詳細画面にロールのバッジを表示
|
||||
- Enhance: 過去に送信したフォローリクエストを確認できるように
|
||||
(Based on https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/663)
|
||||
- Enhance: サイドバーを簡単に展開・折りたたみできるように ( #14981 )
|
||||
- Fix: 通知の範囲指定の設定項目が必要ない通知設定でも範囲指定の設定がでている問題を修正
|
||||
- Fix: Turnstileが失敗・期限切れした際にも成功扱いとなってしまう問題を修正
|
||||
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/768)
|
||||
|
@ -64,6 +66,8 @@ PgroongaのCWサーチ (github.com/paricafe/misskey#d30db97b59d264450901c1dd8680
|
|||
(Based on https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/588)
|
||||
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/715)
|
||||
- Enhance: リモートユーザーの照会をオリジナルにリダイレクトするように
|
||||
- Fix: sharedInboxが無いActorに紐づくリモートユーザーを照会できない
|
||||
- Fix: Aproving request from GtS appears with some delay
|
||||
- Fix: フォロワーへのメッセージの絵文字をemojisに含めるように
|
||||
- Fix: Nested proxy requestsを検出した際にブロックするように
|
||||
[ghsa-gq5q-c77c-v236](https://github.com/misskey-dev/misskey/security/advisories/ghsa-gq5q-c77c-v236)
|
||||
|
|
|
@ -101,6 +101,22 @@ Be willing to comment on the good points and not just the things you want fixed
|
|||
- Are there any omissions or gaps?
|
||||
- Does it check for anomalies?
|
||||
|
||||
## Security Advisory
|
||||
### For reporter
|
||||
Thank you for your reporting!
|
||||
|
||||
If you can also create a patch to fix the vulnerability, please create a PR on the private fork.
|
||||
|
||||
> [!note]
|
||||
> There is a GitHub bug that prevents merging if a PR not following the develop branch of upstream, so please keep follow the develop branch.
|
||||
|
||||
### For misskey-dev member
|
||||
修正PRがdevelopに追従されていないとマージできないので、マージできなかったら
|
||||
|
||||
> Could you merge or rebase onto upstream develop branch?
|
||||
|
||||
などと伝える。
|
||||
|
||||
## Deploy
|
||||
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
||||
```
|
||||
|
|
|
@ -6,3 +6,10 @@ This will allow us to assess the risk, and make a fix available before we add a
|
|||
bug report to the GitHub repository.
|
||||
|
||||
Thanks for helping make Misskey safe for everyone.
|
||||
|
||||
## When create a patch
|
||||
|
||||
If you can also create a patch to fix the vulnerability, please create a PR on the private fork.
|
||||
|
||||
> [!note]
|
||||
> There is a GitHub bug that prevents merging if a PR not following the develop branch of upstream, so please keep follow the develop branch.
|
||||
|
|
16
locales/index.d.ts
vendored
16
locales/index.d.ts
vendored
|
@ -1546,10 +1546,6 @@ export interface Locale extends ILocale {
|
|||
* 登録
|
||||
*/
|
||||
"registration": string;
|
||||
/**
|
||||
* 誰でも新規登録できるようにする
|
||||
*/
|
||||
"enableRegistration": string;
|
||||
/**
|
||||
* 招待
|
||||
*/
|
||||
|
@ -5218,6 +5214,10 @@ export interface Locale extends ILocale {
|
|||
* 利用可能なロール
|
||||
*/
|
||||
"availableRoles": string;
|
||||
/**
|
||||
* 注意事項を理解した上でオンにします。
|
||||
*/
|
||||
"acknowledgeNotesAndEnable": string;
|
||||
"_accountSettings": {
|
||||
/**
|
||||
* コンテンツの表示にログインを必須にする
|
||||
|
@ -5794,6 +5794,14 @@ export interface Locale extends ILocale {
|
|||
* サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定します。
|
||||
*/
|
||||
"inquiryUrlDescription": string;
|
||||
/**
|
||||
* アカウントの作成をオープンにする
|
||||
*/
|
||||
"openRegistration": string;
|
||||
/**
|
||||
* 登録を開放することはリスクが伴います。サーバーを常に監視し、トラブルが発生した際にすぐに対応できる体制がある場合のみオンにすることを推奨します。
|
||||
*/
|
||||
"openRegistrationWarning": string;
|
||||
/**
|
||||
* 一定期間モデレーターのアクティビティが検出されなかった場合、スパム防止のためこの設定は自動でオフになります。
|
||||
*/
|
||||
|
|
|
@ -382,7 +382,6 @@ enableLocalTimeline: "ローカルタイムラインを有効にする"
|
|||
enableGlobalTimeline: "グローバルタイムラインを有効にする"
|
||||
disablingTimelinesInfo: "これらのタイムラインを無効化しても、利便性のため管理者およびモデレーターは引き続き利用することができます。"
|
||||
registration: "登録"
|
||||
enableRegistration: "誰でも新規登録できるようにする"
|
||||
invite: "招待"
|
||||
driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量"
|
||||
driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量"
|
||||
|
@ -1300,6 +1299,7 @@ thisContentsAreMarkedAsSigninRequiredByAuthor: "投稿者により、表示に
|
|||
lockdown: "ロックダウン"
|
||||
pleaseSelectAccount: "アカウントを選択してください"
|
||||
availableRoles: "利用可能なロール"
|
||||
acknowledgeNotesAndEnable: "注意事項を理解した上でオンにします。"
|
||||
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "コンテンツの表示にログインを必須にする"
|
||||
|
@ -1466,6 +1466,8 @@ _serverSettings:
|
|||
reactionsBufferingDescription: "有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。"
|
||||
inquiryUrl: "問い合わせ先URL"
|
||||
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定します。"
|
||||
openRegistration: "アカウントの作成をオープンにする"
|
||||
openRegistrationWarning: "登録を開放することはリスクが伴います。サーバーを常に監視し、トラブルが発生した際にすぐに対応できる体制がある場合のみオンにすることを推奨します。"
|
||||
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターのアクティビティが検出されなかった場合、スパム防止のためこの設定は自動でオフになります。"
|
||||
|
||||
_accountMigration:
|
||||
|
|
|
@ -355,7 +355,7 @@ export class ApPersonService implements OnModuleInit {
|
|||
usernameLower: person.preferredUsername?.toLowerCase(),
|
||||
host,
|
||||
inbox: person.inbox,
|
||||
sharedInbox: person.sharedInbox ?? person.endpoints?.sharedInbox,
|
||||
sharedInbox: person.sharedInbox ?? person.endpoints?.sharedInbox ?? null,
|
||||
followersUri: person.followers ? getApId(person.followers) : undefined,
|
||||
featured: person.featured ? getApId(person.featured) : undefined,
|
||||
uri: person.id,
|
||||
|
@ -521,7 +521,7 @@ export class ApPersonService implements OnModuleInit {
|
|||
const updates = {
|
||||
lastFetchedAt: new Date(),
|
||||
inbox: person.inbox,
|
||||
sharedInbox: person.sharedInbox ?? person.endpoints?.sharedInbox,
|
||||
sharedInbox: person.sharedInbox ?? person.endpoints?.sharedInbox ?? null,
|
||||
followersUri: person.followers ? getApId(person.followers) : undefined,
|
||||
featured: person.featured,
|
||||
emojis: emojiNames,
|
||||
|
@ -593,7 +593,7 @@ export class ApPersonService implements OnModuleInit {
|
|||
// 該当ユーザーが既にフォロワーになっていた場合はFollowingもアップデートする
|
||||
await this.followingsRepository.update(
|
||||
{ followerId: exist.id },
|
||||
{ followerSharedInbox: person.sharedInbox ?? person.endpoints?.sharedInbox },
|
||||
{ followerSharedInbox: person.sharedInbox ?? person.endpoints?.sharedInbox ?? null },
|
||||
);
|
||||
|
||||
await this.updateFeatured(exist.id, resolver).catch(err => this.logger.error(err));
|
||||
|
|
|
@ -10,9 +10,12 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
<MkSpacer :contentMax="700" :marginMin="16" :marginMax="32">
|
||||
<FormSuspense :p="init">
|
||||
<div class="_gaps_m">
|
||||
<MkSwitch v-model="enableRegistration" @change="onChange_enableRegistration">
|
||||
<template #label>{{ i18n.ts.enableRegistration }}</template>
|
||||
<template #caption>{{ i18n.ts._serverSettings.thisSettingWillAutomaticallyOffWhenModeratorsInactive }}</template>
|
||||
<MkSwitch :modelValue="enableRegistration" @update:modelValue="onChange_enableRegistration">
|
||||
<template #label>{{ i18n.ts._serverSettings.openRegistration }}</template>
|
||||
<template #caption>
|
||||
<div>{{ i18n.ts._serverSettings.thisSettingWillAutomaticallyOffWhenModeratorsInactive }}</div>
|
||||
<div><i class="ti ti-alert-triangle" style="color: var(--MI_THEME-warn);"></i> {{ i18n.ts._serverSettings.openRegistrationWarning }}</div>
|
||||
</template>
|
||||
</MkSwitch>
|
||||
|
||||
<MkSwitch v-model="emailRequiredForSignup" @change="onChange_emailRequiredForSignup">
|
||||
|
@ -164,7 +167,17 @@ async function init() {
|
|||
mediaSilencedHosts.value = meta.mediaSilencedHosts.join('\n');
|
||||
}
|
||||
|
||||
function onChange_enableRegistration(value: boolean) {
|
||||
async function onChange_enableRegistration(value: boolean) {
|
||||
if (value) {
|
||||
const { canceled } = await os.confirm({
|
||||
type: 'warning',
|
||||
text: i18n.ts.acknowledgeNotesAndEnable,
|
||||
});
|
||||
if (canceled) return;
|
||||
}
|
||||
|
||||
enableRegistration.value = value;
|
||||
|
||||
os.apiWithDialog('admin/update-meta', {
|
||||
disableRegistration: !value,
|
||||
}).then(() => {
|
||||
|
|
|
@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
</div>
|
||||
</template>
|
||||
<template #default="{items}">
|
||||
<div class="mk-follow-requests">
|
||||
<div class="mk-follow-requests _gaps">
|
||||
<div v-for="req in items" :key="req.id" class="user _panel">
|
||||
<MkAvatar class="avatar" :user="displayUser(req)" indicator link preview/>
|
||||
<div class="body">
|
||||
|
@ -94,11 +94,11 @@ const headerTabs = computed(() => [
|
|||
{
|
||||
key: 'list',
|
||||
title: i18n.ts._followRequest.recieved,
|
||||
icon: 'ti ti-mail',
|
||||
icon: 'ti ti-download',
|
||||
}, {
|
||||
key: 'sent',
|
||||
title: i18n.ts._followRequest.sent,
|
||||
icon: 'ti ti-send',
|
||||
icon: 'ti ti-upload',
|
||||
},
|
||||
]);
|
||||
|
||||
|
|
|
@ -100,10 +100,6 @@ function reset() {
|
|||
}));
|
||||
}
|
||||
|
||||
watch(menuDisplay, async () => {
|
||||
await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true });
|
||||
});
|
||||
|
||||
const headerActions = computed(() => []);
|
||||
|
||||
const headerTabs = computed(() => []);
|
||||
|
|
|
@ -48,7 +48,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
<template #label>{{ i18n.ts.lockdown }}<span class="_beta">{{ i18n.ts.beta }}</span></template>
|
||||
|
||||
<div class="_gaps_m">
|
||||
<MkSwitch v-model="requireSigninToViewContents" @update:modelValue="save()">
|
||||
<MkSwitch :modelValue="requireSigninToViewContents" @update:modelValue="update_requireSigninToViewContents">
|
||||
{{ i18n.ts._accountSettings.requireSigninToViewContents }}
|
||||
<template #caption>
|
||||
<div>{{ i18n.ts._accountSettings.requireSigninToViewContentsDescription1 }}</div>
|
||||
|
@ -172,6 +172,7 @@ import { definePageMetadata } from '@/scripts/page-metadata.js';
|
|||
import FormSlot from '@/components/form/slot.vue';
|
||||
import { formatDateTimeString } from '@/scripts/format-time-string.js';
|
||||
import MkInput from '@/components/MkInput.vue';
|
||||
import * as os from '@/os.js';
|
||||
|
||||
const $i = signinRequired();
|
||||
|
||||
|
@ -217,6 +218,19 @@ watch([makeNotesFollowersOnlyBefore, makeNotesHiddenBefore], () => {
|
|||
save();
|
||||
});
|
||||
|
||||
async function update_requireSigninToViewContents(value: boolean) {
|
||||
if (value) {
|
||||
const { canceled } = await os.confirm({
|
||||
type: 'warning',
|
||||
text: i18n.ts.acknowledgeNotesAndEnable,
|
||||
});
|
||||
if (canceled) return;
|
||||
}
|
||||
|
||||
requireSigninToViewContents.value = value;
|
||||
save();
|
||||
}
|
||||
|
||||
function save() {
|
||||
misskeyApi('i/update', {
|
||||
isLocked: !!isLocked.value,
|
||||
|
|
|
@ -56,6 +56,21 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<button v-if="!forceIconOnly" class="_button" :class="$style.toggleButton" @click="toggleIconOnly">
|
||||
<!--
|
||||
<svg viewBox="0 0 16 48" :class="$style.toggleButtonShape">
|
||||
<g transform="matrix(0.333333,0,0,0.222222,0.000895785,13.3333)">
|
||||
<path d="M23.935,-24C37.223,-24 47.995,-7.842 47.995,12.09C47.995,34.077 47.995,62.07 47.995,84.034C47.995,93.573 45.469,102.721 40.972,109.466C36.475,116.211 30.377,120 24.018,120L23.997,120C10.743,120 -0.003,136.118 -0.003,156C-0.003,156 -0.003,156 -0.003,156L-0.003,-60L-0.003,-59.901C-0.003,-50.379 2.519,-41.248 7.007,-34.515C11.496,-27.782 17.584,-24 23.931,-24C23.932,-24 23.934,-24 23.935,-24Z" style="fill:var(--MI_THEME-navBg);"/>
|
||||
</g>
|
||||
</svg>
|
||||
-->
|
||||
<svg viewBox="0 0 16 64" :class="$style.toggleButtonShape">
|
||||
<g transform="matrix(0.333333,0,0,0.222222,0.000895785,21.3333)">
|
||||
<path d="M47.488,7.995C47.79,10.11 47.943,12.266 47.943,14.429C47.997,26.989 47.997,84 47.997,84C47.997,84 44.018,118.246 23.997,133.5C-0.374,152.07 -0.003,192 -0.003,192L-0.003,-96C-0.003,-96 0.151,-56.216 23.997,-37.5C40.861,-24.265 46.043,-1.243 47.488,7.995Z" style="fill:var(--MI_THEME-navBg);"/>
|
||||
</g>
|
||||
</svg>
|
||||
<i :class="'ti ' + `ti-chevron-${ iconOnly ? 'right' : 'left' }`" style="font-size: 12px; margin-left: -8px;"></i>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -80,9 +95,11 @@ const otherMenuItemIndicated = computed(() => {
|
|||
return false;
|
||||
});
|
||||
|
||||
const calcViewState = () => {
|
||||
iconOnly.value = (window.innerWidth <= 1279) || (defaultStore.state.menuDisplay === 'sideIcon');
|
||||
};
|
||||
const forceIconOnly = window.innerWidth <= 1279;
|
||||
|
||||
function calcViewState() {
|
||||
iconOnly.value = forceIconOnly || (defaultStore.state.menuDisplay === 'sideIcon');
|
||||
}
|
||||
|
||||
calcViewState();
|
||||
|
||||
|
@ -92,6 +109,10 @@ watch(defaultStore.reactiveState.menuDisplay, () => {
|
|||
calcViewState();
|
||||
});
|
||||
|
||||
function toggleIconOnly() {
|
||||
defaultStore.set('menuDisplay', iconOnly.value ? 'sideFull' : 'sideIcon');
|
||||
}
|
||||
|
||||
function openAccountMenu(ev: MouseEvent) {
|
||||
openAccountMenu_({
|
||||
withExtraOperation: true,
|
||||
|
@ -133,6 +154,38 @@ function more(ev: MouseEvent) {
|
|||
contain: strict;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
direction: rtl; // スクロールバーを左に表示したいため
|
||||
}
|
||||
|
||||
.top {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.middle {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.bottom {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.toggleButton {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
left: var(--nav-width);
|
||||
z-index: 1001;
|
||||
width: 16px;
|
||||
height: 64px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.toggleButtonShape {
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 16px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.root:not(.iconOnly) {
|
||||
|
@ -363,6 +416,10 @@ function more(ev: MouseEvent) {
|
|||
position: relative;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.toggleButton {
|
||||
left: var(--nav-width);
|
||||
}
|
||||
}
|
||||
|
||||
.root.iconOnly {
|
||||
|
@ -563,5 +620,9 @@ function more(ev: MouseEvent) {
|
|||
font-size: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.toggleButton {
|
||||
left: var(--nav-icon-only-width);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
Loading…
Reference in a new issue