diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2020-01-30 04:37:25 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-01-30 04:37:25 +0900 |
| commit | f6154dc0af1a0d65819e87240f4385f9573095cb (patch) | |
| tree | 699a5ca07d6727b7f8497d4769f25d6d62f94b5a /src/server/api/private | |
| parent | Add Event activity-type support (#5785) (diff) | |
| download | sharkey-f6154dc0af1a0d65819e87240f4385f9573095cb.tar.gz sharkey-f6154dc0af1a0d65819e87240f4385f9573095cb.tar.bz2 sharkey-f6154dc0af1a0d65819e87240f4385f9573095cb.zip | |
v12 (#5712)
Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com>
Co-authored-by: Satsuki Yanagi <17376330+u1-liquid@users.noreply.github.com>
Diffstat (limited to 'src/server/api/private')
| -rw-r--r-- | src/server/api/private/signup.ts | 132 |
1 files changed, 12 insertions, 120 deletions
diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts index af1aefda84..79ee74389c 100644 --- a/src/server/api/private/signup.ts +++ b/src/server/api/private/signup.ts @@ -1,19 +1,8 @@ import * as Koa from 'koa'; -import * as bcrypt from 'bcryptjs'; -import { generateKeyPair } from 'crypto'; -import generateUserToken from '../common/generate-native-user-token'; -import config from '../../../config'; import { fetchMeta } from '../../../misc/fetch-meta'; import * as recaptcha from 'recaptcha-promise'; -import { Users, Signins, RegistrationTickets, UsedUsernames } from '../../../models'; -import { genId } from '../../../misc/gen-id'; -import { usersChart } from '../../../services/chart'; -import { User } from '../../../models/entities/user'; -import { UserKeypair } from '../../../models/entities/user-keypair'; -import { toPunyNullable } from '../../../misc/convert-host'; -import { UserProfile } from '../../../models/entities/user-profile'; -import { getConnection } from 'typeorm'; -import { UsedUsername } from '../../../models/entities/used-username'; +import { Users, RegistrationTickets } from '../../../models'; +import { signup } from '../common/signup'; export default async (ctx: Koa.Context) => { const body = ctx.request.body; @@ -31,7 +20,6 @@ export default async (ctx: Koa.Context) => { if (!success) { ctx.throw(400, 'recaptcha-failed'); - return; } } @@ -58,114 +46,18 @@ export default async (ctx: Koa.Context) => { RegistrationTickets.delete(ticket.id); } - // Validate username - if (!Users.validateLocalUsername.ok(username)) { - ctx.status = 400; - return; - } - - // Validate password - if (!Users.validatePassword.ok(password)) { - ctx.status = 400; - return; - } - - const usersCount = await Users.count({}); - - // Generate hash of password - const salt = await bcrypt.genSalt(8); - const hash = await bcrypt.hash(password, salt); - - // Generate secret - const secret = generateUserToken(); - - // Check username duplication - if (await Users.findOne({ usernameLower: username.toLowerCase(), host: null })) { - ctx.status = 400; - return; - } - - // Check deleted username duplication - if (await UsedUsernames.findOne({ username: username.toLowerCase() })) { - ctx.status = 400; - return; - } - - const keyPair = await new Promise<string[]>((res, rej) => - generateKeyPair('rsa', { - modulusLength: 4096, - publicKeyEncoding: { - type: 'spki', - format: 'pem' - }, - privateKeyEncoding: { - type: 'pkcs8', - format: 'pem', - cipher: undefined, - passphrase: undefined - } - } as any, (err, publicKey, privateKey) => - err ? rej(err) : res([publicKey, privateKey]) - )); - - let account!: User; + try { + const { account, secret } = await signup(username, password, host); - // Start transaction - await getConnection().transaction(async transactionalEntityManager => { - const exist = await transactionalEntityManager.findOne(User, { - usernameLower: username.toLowerCase(), - host: null + const res = await Users.pack(account, account, { + detail: true, + includeSecrets: true }); - if (exist) throw new Error(' the username is already used'); - - account = await transactionalEntityManager.save(new User({ - id: genId(), - createdAt: new Date(), - username: username, - usernameLower: username.toLowerCase(), - host: toPunyNullable(host), - token: secret, - isAdmin: config.autoAdmin && usersCount === 0, - })); - - await transactionalEntityManager.save(new UserKeypair({ - publicKey: keyPair[0], - privateKey: keyPair[1], - userId: account.id - })); - - await transactionalEntityManager.save(new UserProfile({ - userId: account.id, - autoAcceptFollowed: true, - autoWatch: false, - password: hash, - })); - - await transactionalEntityManager.save(new UsedUsername({ - createdAt: new Date(), - username: username.toLowerCase(), - })); - }); + (res as any).token = secret; - usersChart.update(account, true); - - // Append signin history - await Signins.save({ - id: genId(), - createdAt: new Date(), - userId: account.id, - ip: ctx.ip, - headers: ctx.headers, - success: true - }); - - const res = await Users.pack(account, account, { - detail: true, - includeSecrets: true - }); - - (res as any).token = secret; - - ctx.body = res; + ctx.body = res; + } catch (e) { + ctx.throw(400, e); + } }; |