summaryrefslogtreecommitdiff
path: root/src/server/api/private
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2020-01-30 04:37:25 +0900
committerGitHub <noreply@github.com>2020-01-30 04:37:25 +0900
commitf6154dc0af1a0d65819e87240f4385f9573095cb (patch)
tree699a5ca07d6727b7f8497d4769f25d6d62f94b5a /src/server/api/private
parentAdd Event activity-type support (#5785) (diff)
downloadsharkey-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.ts132
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);
+ }
};