From d14a9532a1363b464d6d15fce86afc4983a8357e Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 24 May 2018 15:30:28 +0200 Subject: [PATCH] Handle account name in client url More consistent with AP urls --- .../src/app/+accounts/accounts.component.ts | 2 +- .../src/app/shared/account/account.service.ts | 2 +- server/helpers/custom-validators/accounts.ts | 28 ++++++++++++------- server/middlewares/validators/account.ts | 12 ++++++-- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/client/src/app/+accounts/accounts.component.ts b/client/src/app/+accounts/accounts.component.ts index 1298803c3..0a52985da 100644 --- a/client/src/app/+accounts/accounts.component.ts +++ b/client/src/app/+accounts/accounts.component.ts @@ -16,7 +16,7 @@ export class AccountsComponent implements OnInit { ) {} ngOnInit () { - const accountId = parseInt(this.route.snapshot.params['accountId'], 10) + const accountId = this.route.snapshot.params['accountId'] this.accountService.getAccount(accountId) .subscribe(account => this.account = account) diff --git a/client/src/app/shared/account/account.service.ts b/client/src/app/shared/account/account.service.ts index 20e52d946..6b261cf53 100644 --- a/client/src/app/shared/account/account.service.ts +++ b/client/src/app/shared/account/account.service.ts @@ -18,7 +18,7 @@ export class AccountService { private restExtractor: RestExtractor ) {} - getAccount (id: number): Observable { + getAccount (id: number | string): Observable { return this.authHttp.get(AccountService.BASE_ACCOUNT_URL + id) .pipe( map(accountHash => new Account(accountHash)), diff --git a/server/helpers/custom-validators/accounts.ts b/server/helpers/custom-validators/accounts.ts index cc8641d6b..00dea9039 100644 --- a/server/helpers/custom-validators/accounts.ts +++ b/server/helpers/custom-validators/accounts.ts @@ -4,16 +4,21 @@ import 'express-validator' import * as validator from 'validator' import { AccountModel } from '../../models/account/account' import { isUserDescriptionValid, isUserUsernameValid } from './users' +import { exists } from './misc' function isAccountNameValid (value: string) { return isUserUsernameValid(value) } +function isAccountIdValid (value: string) { + return exists(value) +} + function isAccountDescriptionValid (value: string) { return isUserDescriptionValid(value) } -function isAccountIdExist (id: number | string, res: Response) { +function isAccountIdExist (id: number | string, res: Response, sendNotFound = true) { let promise: Bluebird if (validator.isInt('' + id)) { @@ -22,32 +27,34 @@ function isAccountIdExist (id: number | string, res: Response) { promise = AccountModel.loadByUUID('' + id) } - return isAccountExist(promise, res) + return isAccountExist(promise, res, sendNotFound) } -function isLocalAccountNameExist (name: string, res: Response) { +function isLocalAccountNameExist (name: string, res: Response, sendNotFound = true) { const promise = AccountModel.loadLocalByName(name) - return isAccountExist(promise, res) + return isAccountExist(promise, res, sendNotFound) } -function isAccountNameWithHostExist (nameWithDomain: string, res: Response) { +function isAccountNameWithHostExist (nameWithDomain: string, res: Response, sendNotFound = true) { const [ accountName, host ] = nameWithDomain.split('@') let promise: Bluebird if (!host) promise = AccountModel.loadLocalByName(accountName) else promise = AccountModel.loadLocalByNameAndHost(accountName, host) - return isAccountExist(promise, res) + return isAccountExist(promise, res, sendNotFound) } -async function isAccountExist (p: Bluebird, res: Response) { +async function isAccountExist (p: Bluebird, res: Response, sendNotFound: boolean) { const account = await p if (!account) { - res.status(404) - .send({ error: 'Account not found' }) - .end() + if (sendNotFound === true) { + res.status(404) + .send({ error: 'Account not found' }) + .end() + } return false } @@ -60,6 +67,7 @@ async function isAccountExist (p: Bluebird, res: Response) { // --------------------------------------------------------------------------- export { + isAccountIdValid, isAccountIdExist, isLocalAccountNameExist, isAccountDescriptionValid, diff --git a/server/middlewares/validators/account.ts b/server/middlewares/validators/account.ts index 0c4b7051d..c01e742da 100644 --- a/server/middlewares/validators/account.ts +++ b/server/middlewares/validators/account.ts @@ -2,13 +2,14 @@ import * as express from 'express' import { param } from 'express-validator/check' import { isAccountIdExist, + isAccountIdValid, isAccountNameValid, isAccountNameWithHostExist, isLocalAccountNameExist } from '../../helpers/custom-validators/accounts' -import { isIdOrUUIDValid } from '../../helpers/custom-validators/misc' import { logger } from '../../helpers/logger' import { areValidationErrors } from './utils' +import { isIdOrUUIDValid } from '../../helpers/custom-validators/misc' const localAccountValidator = [ param('name').custom(isAccountNameValid).withMessage('Should have a valid account name'), @@ -24,13 +25,18 @@ const localAccountValidator = [ ] const accountsGetValidator = [ - param('id').custom(isIdOrUUIDValid).withMessage('Should have a valid id'), + param('id').custom(isAccountIdValid).withMessage('Should have a valid id/uuid/name/name with host'), async (req: express.Request, res: express.Response, next: express.NextFunction) => { logger.debug('Checking accountsGetValidator parameters', { parameters: req.params }) if (areValidationErrors(req, res)) return - if (!await isAccountIdExist(req.params.id, res)) return + + let accountFetched = false + if (isIdOrUUIDValid(req.params.id)) accountFetched = await isAccountIdExist(req.params.id, res, false) + if (!accountFetched) accountFetched = await isAccountNameWithHostExist(req.params.id, res, true) + + if (!accountFetched) return return next() } -- 2.25.1