This commit is contained in:
syuilo 2019-06-15 00:07:41 +09:00
parent 2bd03ca725
commit 2615368b1e
No known key found for this signature in database
GPG key ID: BDC4C49D06AB9D69
8 changed files with 23 additions and 36 deletions

View file

@ -8,7 +8,7 @@ export type PackedMessagingMessage = SchemaType<typeof packedMessagingMessageSch
@EntityRepository(MessagingMessage) @EntityRepository(MessagingMessage)
export class MessagingMessageRepository extends Repository<MessagingMessage> { export class MessagingMessageRepository extends Repository<MessagingMessage> {
public isValidText(text: string): boolean { public validateText(text: string): boolean {
return text.trim().length <= 1000 && text.trim() != ''; return text.trim().length <= 1000 && text.trim() != '';
} }

View file

@ -1,3 +1,4 @@
import $ from 'cafy';
import { EntityRepository, Repository, In } from 'typeorm'; import { EntityRepository, Repository, In } from 'typeorm';
import { User, ILocalUser, IRemoteUser } from '../entities/user'; import { User, ILocalUser, IRemoteUser } from '../entities/user';
import { Emojis, Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserGroupJoinings } from '..'; import { Emojis, Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserGroupJoinings } from '..';
@ -231,29 +232,13 @@ export class UserRepository extends Repository<User> {
} }
//#region Validators //#region Validators
public validateUsername(username: string, remote = false): boolean { public validateLocalUsername = $.str.match(/^\w{1,20}$/);
return typeof username == 'string' && (remote ? /^\w([\w-]*\w)?$/ : /^\w{1,20}$/).test(username); public validateRemoteUsername = $.str.match(/^\w([\w-]*\w)?$/);
} public validatePassword = $.str.min(1);
public validateName = $.str.min(1).max(50);
public validatePassword(password: string): boolean { public validateDescription = $.str.min(1).max(500);
return typeof password == 'string' && password != ''; public validateLocation = $.str.min(1).max(50);
} public validateBirthday = $.str.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/);
public isValidName(name?: string): boolean {
return name === null || (typeof name == 'string' && name.length < 50 && name.trim() != '');
}
public isValidDescription(description: string): boolean {
return typeof description == 'string' && description.length < 500 && description.trim() != '';
}
public isValidLocation(location: string): boolean {
return typeof location == 'string' && location.length < 50 && location.trim() != '';
}
public isValidBirthday(birthday: string): boolean {
return typeof birthday == 'string' && /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/.test(birthday);
}
//#endregion //#endregion
} }

View file

@ -53,13 +53,15 @@ function validatePerson(x: any, uri: string) {
return new Error('invalid person: inbox is not a string'); return new Error('invalid person: inbox is not a string');
} }
if (!Users.validateUsername(x.preferredUsername, true)) { if (!Users.validateRemoteUsername.ok(x.preferredUsername)) {
return new Error('invalid person: invalid username'); return new Error('invalid person: invalid username');
} }
if (!Users.isValidName(x.name == '' ? null : x.name)) { if (x.name != null && x.name != '') {
if (!Users.validateName.ok(x.name)) {
return new Error('invalid person: invalid name'); return new Error('invalid person: invalid name');
} }
}
if (typeof x.id !== 'string') { if (typeof x.id !== 'string') {
return new Error('invalid person: id is not a string'); return new Error('invalid person: id is not a string');

View file

@ -29,14 +29,14 @@ export const meta = {
params: { params: {
name: { name: {
validator: $.optional.nullable.str.pipe(Users.isValidName), validator: $.optional.nullable.use(Users.validateName),
desc: { desc: {
'ja-JP': '名前(ハンドルネームやニックネーム)' 'ja-JP': '名前(ハンドルネームやニックネーム)'
} }
}, },
description: { description: {
validator: $.optional.nullable.str.pipe(Users.isValidDescription), validator: $.optional.nullable.use(Users.validateDescription),
desc: { desc: {
'ja-JP': 'アカウントの説明や自己紹介' 'ja-JP': 'アカウントの説明や自己紹介'
} }
@ -50,14 +50,14 @@ export const meta = {
}, },
location: { location: {
validator: $.optional.nullable.str.pipe(Users.isValidLocation), validator: $.optional.nullable.use(Users.validateLocation),
desc: { desc: {
'ja-JP': '住んでいる地域、所在' 'ja-JP': '住んでいる地域、所在'
} }
}, },
birthday: { birthday: {
validator: $.optional.nullable.str.pipe(Users.isValidBirthday), validator: $.optional.nullable.use(Users.validateBirthday),
desc: { desc: {
'ja-JP': '誕生日 (YYYY-MM-DD形式)' 'ja-JP': '誕生日 (YYYY-MM-DD形式)'
} }

View file

@ -44,7 +44,7 @@ export const meta = {
}, },
text: { text: {
validator: $.optional.str.pipe(MessagingMessages.isValidText) validator: $.optional.str.pipe(MessagingMessages.validateText)
}, },
fileId: { fileId: {

View file

@ -9,7 +9,7 @@ export const meta = {
params: { params: {
username: { username: {
validator: $.str.pipe(Users.validateUsername) validator: $.use(Users.validateLocalUsername)
} }
} }
}; };

View file

@ -66,7 +66,7 @@ export const meta = {
}; };
export default define(meta, async (ps, me) => { export default define(meta, async (ps, me) => {
const isUsername = Users.validateUsername(ps.query.replace('@', ''), !ps.localOnly); const isUsername = ps.localOnly ? Users.validateLocalUsername.ok(ps.query.replace('@', '')) : Users.validateRemoteUsername.ok(ps.query.replace('@', ''));
let users: User[] = []; let users: User[] = [];

View file

@ -58,13 +58,13 @@ export default async (ctx: Koa.BaseContext) => {
} }
// Validate username // Validate username
if (!Users.validateUsername(username)) { if (!Users.validateLocalUsername.ok(username)) {
ctx.status = 400; ctx.status = 400;
return; return;
} }
// Validate password // Validate password
if (!Users.validatePassword(password)) { if (!Users.validatePassword.ok(password)) {
ctx.status = 400; ctx.status = 400;
return; return;
} }