diff --git a/package.json b/package.json index c7a2413ab2dd..eb0d00d7b697 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo ", - "version": "10.100.0-l190410182002", + "version": "10.100.0-l190411040726", "codename": "nighthike", "repository": { "type": "git", diff --git a/src/client/app/common/views/widgets/post-form.vue b/src/client/app/common/views/widgets/post-form.vue index f1826cc59fcc..60fc2454c03f 100644 --- a/src/client/app/common/views/widgets/post-form.vue +++ b/src/client/app/common/views/widgets/post-form.vue @@ -34,6 +34,14 @@ @@ -46,6 +54,8 @@ import define from '../../../common/define-widget'; import i18n from '../../../i18n'; import insertTextAtCursor from 'insert-text-at-cursor'; import * as XDraggable from 'vuedraggable'; +import getFace from '../../../common/scripts/get-face'; +import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; export default define({ name: 'post-form', @@ -56,7 +66,8 @@ export default define({ i18n: i18n('desktop/views/widgets/post-form.vue'), components: { - XDraggable + XDraggable, + MkVisibilityChooser }, data() { @@ -64,6 +75,8 @@ export default define({ posting: false, text: '', files: [], + visibility: 'public', + localOnly: false, }; }, @@ -81,6 +94,11 @@ export default define({ } }, + mounted() { + // デフォルト公開範囲 + this.applyVisibility(this.$store.state.settings.defaultNoteVisibility); + }, + methods: { func() { if (this.props.design == 1) { @@ -173,25 +191,39 @@ export default define({ }); }, - post() { - this.posting = true; + kao() { + this.text += getFace(); + }, - let visibility = 'public'; - let localOnly = false; + setVisibility() { + const w = this.$root.new(MkVisibilityChooser, { + source: this.$refs.visibilityButton, + currentVisibility: this.visibility + }); + w.$once('chosen', v => { + this.applyVisibility(v); + }); + }, - const m = this.$store.state.settings.defaultNoteVisibility.match(/^local-(.+)/); + applyVisibility(v :string) { + const m = v.match(/^local-(.+)/); if (m) { - visibility = m[1]; - localOnly = true; + this.localOnly = true; + this.visibility = m[1]; } else { - visibility = this.$store.state.settings.defaultNoteVisibility; + this.localOnly = false; + this.visibility = v; } + }, + + post() { + this.posting = true; this.$root.api('notes/create', { text: this.text == '' ? undefined : this.text, fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined, - visibility, - localOnly, + visibility: this.visibility, + localOnly: this.localOnly, }).then(data => { this.clear(); }).catch(err => { @@ -294,6 +326,13 @@ export default define({ &:hover color var(--textHighlighted) + > button > .localOnly + color var(--primary) + position absolute + top 0 + right 2px + transform scale(.8) + > .post display block margin 0 0 0 auto diff --git a/src/queue/processors/inbox.ts b/src/queue/processors/inbox.ts index 76d303f469d3..fe12aeb898dc 100644 --- a/src/queue/processors/inbox.ts +++ b/src/queue/processors/inbox.ts @@ -11,6 +11,7 @@ import Logger from '../../services/logger'; import { registerOrFetchInstanceDoc } from '../../services/register-or-fetch-instance-doc'; import Instance from '../../models/instance'; import instanceChart from '../../services/chart/instance'; +import { validActor } from '../../remote/activitypub/type'; const logger = new Logger('inbox'); @@ -79,7 +80,7 @@ export default async (job: Bull.Job): Promise => { // Update Person activityの場合は、ここで署名検証/更新処理まで実施して終了 if (activity.type === 'Update') { - if (activity.object && activity.object.type === 'Person') { + if (activity.object && validActor.includes(activity.object.type)) { if (user == null) { logger.warn('Update activity received, but user not registed.'); } else if (!httpSignature.verifySignature(signature, user.publicKey.publicKeyPem)) { diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index a1838dddc3c5..209b372591d3 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -6,7 +6,7 @@ import config from '../../../config'; import User, { validateUsername, isValidName, IUser, IRemoteUser, isRemoteUser } from '../../../models/user'; import Resolver from '../resolver'; import { resolveImage } from './image'; -import { isCollectionOrOrderedCollection, isCollection, IPerson, isOrderedCollection } from '../type'; +import { isCollectionOrOrderedCollection, isCollection, IPerson, isOrderedCollection, validActor } from '../type'; import { IDriveFile } from '../../../models/drive-file'; import Meta from '../../../models/meta'; import { fromHtml } from '../../../mfm/fromHtml'; @@ -38,7 +38,7 @@ function validatePerson(x: any, uri: string) { return new Error('invalid person: object is null'); } - if (x.type != 'Person' && x.type != 'Service') { + if (!validActor.includes(x.type)) { return new Error(`invalid person: object is not a person or service '${x.type}'`); } diff --git a/src/remote/activitypub/type.ts b/src/remote/activitypub/type.ts index 78514246d3ed..39f57e223be0 100644 --- a/src/remote/activitypub/type.ts +++ b/src/remote/activitypub/type.ts @@ -95,6 +95,8 @@ interface IQuestionChoice { _misskey_votes?: number; } +export const validActor = ['Person', 'Service']; + export interface IPerson extends IObject { type: 'Person'; name: string; diff --git a/src/server/api/endpoints/ap/show.ts b/src/server/api/endpoints/ap/show.ts index 7f4afa1f6e4f..a7c9e55d4f89 100644 --- a/src/server/api/endpoints/ap/show.ts +++ b/src/server/api/endpoints/ap/show.ts @@ -10,6 +10,7 @@ import Resolver from '../../../../remote/activitypub/resolver'; import { ApiError } from '../../error'; import Instance from '../../../../models/instance'; import { extractDbHost } from '../../../../misc/convert-host'; +import { validActor } from '../../../../remote/activitypub/type'; export const meta = { tags: ['federation'], @@ -95,7 +96,7 @@ async function fetchAny(uri: string) { } // それでもみつからなければ新規であるため登録 - if (object.type === 'Person') { + if (validActor.includes(object.type)) { const user = await createPerson(object.id); return { type: 'User',