1
0
mirror of https://github.com/hotomoe/hotomoe synced 2024-12-01 16:28:12 +09:00

Merge pull request #9970 from saschanaz/mkusername-empty

fix(backend/ApPersonService): normalize empty value of `name` into an absent value
This commit is contained in:
tamaina 2023-03-09 22:36:26 +09:00 committed by GitHub
commit dc49a24f07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 30 deletions

View File

@ -164,6 +164,9 @@ export class ApPersonService implements OnModuleInit {
throw new Error('invalid Actor: wrong name'); throw new Error('invalid Actor: wrong name');
} }
x.name = truncate(x.name, nameLength); x.name = truncate(x.name, nameLength);
} else if (x.name === '') {
// Mastodon emits empty string when the name is not set.
x.name = undefined;
} }
if (x.summary) { if (x.summary) {
if (!(typeof x.summary === 'string' && x.summary.length > 0)) { if (!(typeof x.summary === 'string' && x.summary.length > 0)) {

View File

@ -11,8 +11,25 @@ import { GlobalModule } from '@/GlobalModule.js';
import { CoreModule } from '@/core/CoreModule.js'; import { CoreModule } from '@/core/CoreModule.js';
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js'; import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
import { LoggerService } from '@/core/LoggerService.js'; import { LoggerService } from '@/core/LoggerService.js';
import type { IActor } from '@/core/activitypub/type.js';
import { MockResolver } from '../misc/mock-resolver.js'; import { MockResolver } from '../misc/mock-resolver.js';
const host = 'https://host1.test';
function createRandomActor(): IActor & { id: string } {
const preferredUsername = `${rndstr('A-Z', 4)}${rndstr('a-z', 4)}`;
const actorId = `${host}/users/${preferredUsername.toLowerCase()}`;
return {
'@context': 'https://www.w3.org/ns/activitystreams',
id: actorId,
type: 'Person',
preferredUsername,
inbox: `${actorId}/inbox`,
outbox: `${actorId}/outbox`,
};
}
describe('ActivityPub', () => { describe('ActivityPub', () => {
let noteService: ApNoteService; let noteService: ApNoteService;
let personService: ApPersonService; let personService: ApPersonService;
@ -36,18 +53,7 @@ describe('ActivityPub', () => {
}); });
describe('Parse minimum object', () => { describe('Parse minimum object', () => {
const host = 'https://host1.test'; const actor = createRandomActor();
const preferredUsername = `${rndstr('A-Z', 4)}${rndstr('a-z', 4)}`;
const actorId = `${host}/users/${preferredUsername.toLowerCase()}`;
const actor = {
'@context': 'https://www.w3.org/ns/activitystreams',
id: actorId,
type: 'Person',
preferredUsername,
inbox: `${actorId}/inbox`,
outbox: `${actorId}/outbox`,
};
const post = { const post = {
'@context': 'https://www.w3.org/ns/activitystreams', '@context': 'https://www.w3.org/ns/activitystreams',
@ -80,29 +86,31 @@ describe('ActivityPub', () => {
}); });
}); });
describe('Truncate long name', () => { describe('Name field', () => {
const host = 'https://host1.test'; test('Truncate long name', async () => {
const preferredUsername = `${rndstr('A-Z', 4)}${rndstr('a-z', 4)}`;
const actorId = `${host}/users/${preferredUsername.toLowerCase()}`;
const name = rndstr('0-9a-z', 129);
const actor = { const actor = {
'@context': 'https://www.w3.org/ns/activitystreams', ...createRandomActor(),
id: actorId, name: rndstr('0-9a-z', 129),
type: 'Person',
preferredUsername,
name,
inbox: `${actorId}/inbox`,
outbox: `${actorId}/outbox`,
}; };
test('Actor', async () => {
resolver._register(actor.id, actor); resolver._register(actor.id, actor);
const user = await personService.createPerson(actor.id, resolver); const user = await personService.createPerson(actor.id, resolver);
assert.deepStrictEqual(user.name, actor.name.substr(0, 128)); assert.deepStrictEqual(user.name, actor.name.slice(0, 128));
});
test('Normalize empty name', async () => {
const actor = {
...createRandomActor(),
name: '',
};
resolver._register(actor.id, actor);
const user = await personService.createPerson(actor.id, resolver);
assert.strictEqual(user.name, null);
}); });
}); });
}); });