Compare commits

...

10 Commits

Author SHA1 Message Date
syuilo 77f18f4250
Update CHANGELOG.md 2023-08-21 18:53:04 +09:00
anatawa12 5758ea463a
プレビューの表示状態を記憶するように (#11346)
* feat: keep show showPreview

* docs(changelog): add プレビューの表示した状態ををダイアログを閉じても保存するように

* chore: 記憶する領域をdeviceに
2023-08-21 18:52:20 +09:00
White-Green f664f941a2
fix: antennas validation (#11469) 2023-08-21 17:33:04 +09:00
atsuchan 49fc4cce3c
fix: Make more than 10 announcements visible on Admin (#11720) 2023-08-21 17:26:21 +09:00
syuilo e8ff281db0
Update CHANGELOG.md 2023-08-21 17:22:49 +09:00
MomentQYC 388448f298
feat: Removing stack trace info in production env (#11657)
* feat: Hiding stack traces in production env

* sytle

* style

* style

* add SPDX

* move ./error.js to ./misc/error.js

* revert: remove frontend changes

* feat: Hiding stack traces in production env

* feat: Hiding stack traces in production env

* revert

* revert

* revert

* change and fix

* revert

* fix queue endpoint test

---------

Co-authored-by: tamaina <tamaina@hotmail.co.jp>
Co-authored-by: Kagami Sascha Rosylight <saschanaz@outlook.com>
2023-08-21 17:21:57 +09:00
anatawa12 50ec129b87
feat: 'server' webhook payload which hold misskey server url (#11752) 2023-08-21 16:13:10 +09:00
かっこかり b60ff1f1ce
fix(misskey-js): Play関連の権限を追加(APIコンソールで発行可能に) (#11360)
* (add) permission: flash

* update changelog

* Update CHANGELOG.md (カレンダーリリース対応)

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2023-08-21 13:01:08 +09:00
syuilo 2939e8131d 2023.9.0-beta.1 2023-08-21 12:02:52 +09:00
syuilo 8038049068 enhance(frontend/aiscript): 現在の設定言語を取得できるように
Resolvve #11750
2023-08-21 11:53:06 +09:00
14 changed files with 59 additions and 12 deletions

View File

@ -12,7 +12,7 @@
-->
## 2023.8.0 (unreleased)
## 2023.9.0 (unreleased)
### General
- OAuth 2.0のサポート
@ -25,9 +25,11 @@
### Client
- メニューのスイッチの動作を改善
- 絵文字ピッカーの検索の表示件数を100件に増加
- 投稿フォームのプレビューの表示状態を記憶するように
- Enhance: ユーザーメニューでスイッチでユーザーリストに追加・削除できるように
- Enhance: 自分が押したリアクションのデザインを改善
- Enhance: ノート検索にローカルのみ検索可能なオプションの追加
- Enhance: AiScriptで`LOCALE`として現在の設定言語を取得できるように
- Fix: サーバー情報画面(`/instance-info/{domain}`)でブロックができないのを修正
- Fix: 未読のお知らせの「わかった」をクリック・タップしてもその場で「わかった」が消えない問題を修正
- Fix: iOSで画面を回転させるとテキストサイズが変わる問題を修正
@ -35,14 +37,17 @@
- Fix: タイムラインを下にスクロールしてノート画面に移動して再び戻ったら以前のスクロール位置を失う問題を修正
- Fix: Misskeyプラグインをインストールする際のAiScriptバージョンのチェックが0.14.0以降に対応していない問題を修正
- Fix: 他のサーバーのユーザーへ「メッセージを送信」した時の初期テキストのメンションが間違っている問題を修正
- Playの操作を行うAPI TokenをAPIコンソールから発行できるように
### Server
- Fix: ノート検索 `notes/search` にてhostを指定した際に検索結果に反映されるように
- cacheRemoteFilesの初期値はfalseになりました
- ファイルアップロード時等にファイル名の拡張子を修正する関数(correctFilename)の挙動を改善
- Webhookのペイロードにサーバーのurlが含まれるようになりました
- Fix: 一部のfeatured noteを照会できない問題を修正
- Fix: muteがapiからのuser list timeline取得で機能しない問題を修正
- Fix: ジョブキュー管理画面の認証を回避できる問題を修正
- Fix: 一部のサーバー内部エラーがスタックトレースを返さないように修正
## 13.14.2

4
locales/index.d.ts vendored
View File

@ -1862,6 +1862,10 @@ export interface Locale {
"write:gallery": string;
"read:gallery-likes": string;
"write:gallery-likes": string;
"read:flash": string;
"write:flash": string;
"read:flash-likes": string;
"write:flash-likes": string;
};
"_auth": {
"shareAccessTitle": string;

View File

@ -1780,6 +1780,10 @@ _permissions:
"write:gallery": "ギャラリーを操作する"
"read:gallery-likes": "ギャラリーのいいねを見る"
"write:gallery-likes": "ギャラリーのいいねを操作する"
"read:flash": "Playを見る"
"write:flash": "Playを操作する"
"read:flash-likes": "Playのいいねを見る"
"write:flash-likes": "Playのいいねを操作する"
_auth:
shareAccessTitle: "アプリへのアクセス許可"

View File

@ -1,6 +1,6 @@
{
"name": "misskey",
"version": "13.14.2",
"version": "2023.9.0-beta.1",
"codename": "nasubi",
"repository": {
"type": "git",

View File

@ -47,6 +47,7 @@ export class WebhookDeliverProcessorService {
'Content-Type': 'application/json',
},
body: JSON.stringify({
server: this.config.url,
hookId: job.data.webhookId,
userId: job.data.userId,
eventId: job.data.eventId,

View File

@ -85,8 +85,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
private globalEventService: GlobalEventService,
) {
super(meta, paramDef, async (ps, me) => {
if ((ps.keywords.length === 0) || ps.keywords[0].every(x => x === '')) {
throw new Error('invalid param');
if (ps.keywords.flat().every(x => x === '') && ps.excludeKeywords.flat().every(x => x === '')) {
throw new Error('either keywords or excludeKeywords is required.');
}
const currentAntennasCount = await this.antennasRepository.countBy({

View File

@ -82,6 +82,9 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
private globalEventService: GlobalEventService,
) {
super(meta, paramDef, async (ps, me) => {
if (ps.keywords.flat().every(x => x === '') && ps.excludeKeywords.flat().every(x => x === '')) {
throw new Error('either keywords or excludeKeywords is required.');
}
// Fetch the antenna
const antenna = await this.antennasRepository.findOneBy({
id: ps.antennaId,

View File

@ -148,18 +148,18 @@ export class ClientServerService {
if (url === bullBoardPath || url.startsWith(bullBoardPath + '/')) {
const token = request.cookies.token;
if (token == null) {
reply.code(401);
throw new Error('login required');
reply.code(401).send('Login required');
return;
}
const user = await this.usersRepository.findOneBy({ token });
if (user == null) {
reply.code(403);
throw new Error('no such user');
reply.code(403).send('No such user');
return;
}
const isAdministrator = await this.roleService.isAdministrator(user);
if (!isAdministrator) {
reply.code(403);
throw new Error('access denied');
reply.code(403).send('Access denied');
return;
}
}
});

View File

@ -34,6 +34,8 @@ describe('Webリソース', () => {
let aliceGalleryPost: any;
let aliceChannel: any;
let bob: misskey.entities.MeSignup;
type Request = {
path: string,
accept?: string,
@ -90,6 +92,8 @@ describe('Webリソース', () => {
fileIds: [aliceUploadedFile.body.id],
});
aliceChannel = await channel(alice, {});
bob = await signup({ username: 'alice' });
}, 1000 * 60 * 2);
afterAll(async () => {
@ -163,9 +167,15 @@ describe('Webリソース', () => {
});
describe.each([{ path: '/queue' }])('$path', ({ path }) => {
test('はログインしないとGETできない。', async () => await notOk({
path,
status: 401,
}));
test('はadminでなければGETできない。', async () => await notOk({
path,
status: 500, // FIXME? 403ではない。
cookie: cookie(bob),
status: 403,
}));
test('はadminならGETできる。', async () => await ok({

View File

@ -171,7 +171,8 @@ let poll = $ref<{
expiredAfter: string | null;
} | null>(null);
let useCw = $ref(false);
let showPreview = $ref(false);
let showPreview = $ref(defaultStore.state.showPreview);
watch($$(showPreview), () => defaultStore.set('showPreview', showPreview));
let cw = $ref<string | null>(null);
let localOnly = $ref<boolean>(props.initialLocalOnly ?? defaultStore.state.rememberNoteVisibility ? defaultStore.state.localOnly : defaultStore.state.defaultNoteLocalOnly);
let visibility = $ref(props.initialVisibility ?? (defaultStore.state.rememberNoteVisibility ? defaultStore.state.visibility : defaultStore.state.defaultNoteVisibility) as typeof misskey.noteVisibilities[number]);

View File

@ -57,6 +57,9 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
</div>
</MkFolder>
<MkButton class="button" @click="more()">
<i class="ti ti-reload"></i>{{ i18n.ts.more }}
</MkButton>
</div>
</MkSpacer>
</MkStickyContainer>
@ -124,6 +127,12 @@ async function save(announcement) {
}
}
function more() {
os.api('admin/announcements/list', { untilId: announcements.reduce((acc, announcement) => announcement.id != null ? announcement : acc).id }).then(announcementResponse => {
announcements = announcements.concat(announcementResponse);
});
}
function refresh() {
os.api('admin/announcements/list').then(announcementResponse => {
announcements = announcementResponse;

View File

@ -8,6 +8,7 @@ import * as os from '@/os';
import { $i } from '@/account';
import { miLocalStorage } from '@/local-storage';
import { customEmojis } from '@/custom-emojis';
import { lang } from '@/config';
export function createAiScriptEnv(opts) {
let apiRequests = 0;
@ -16,6 +17,7 @@ export function createAiScriptEnv(opts) {
USER_NAME: $i ? values.STR($i.name) : values.NULL,
USER_USERNAME: $i ? values.STR($i.username) : values.NULL,
CUSTOM_EMOJIS: utils.jsToVal(customEmojis.value),
LOCALE: values.STR(lang),
'Mk:dialog': values.FN_NATIVE(async ([title, text, type]) => {
await os.alert({
type: type ? type.value : 'info',

View File

@ -135,6 +135,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'deviceAccount',
default: false,
},
showPreview: {
where: 'device',
default: false,
},
statusbars: {
where: 'deviceAccount',
default: [] as {

View File

@ -39,4 +39,8 @@ export const permissions = [
'write:gallery',
'read:gallery-likes',
'write:gallery-likes',
'read:flash',
'write:flash',
'read:flash-likes',
'write:flash-likes',
];