Files
linux-odyssey/server/src/utils/auth.js
T
wancat 182fcf643f feat: pick username
* put new registered social login user to session data
* ask to choose username
* simplify checkUsername functions
2023-10-13 00:05:59 +08:00

89 lines
1.9 KiB
JavaScript

import jwt from 'jsonwebtoken'
import bcrypt from 'bcrypt'
import config from '../config.js'
import User from '../models/user.js'
export function hashPassword(password) {
return bcrypt.hash(password, 10)
}
export async function createTestUser() {
let user = await User.findOne({ username: 'alex' })
if (!user) {
user = new User({
username: 'alex',
email: 'alex@example.com',
})
user.hashedPassword = await hashPassword('123456')
await user.save()
}
}
export function genJWT(payload) {
return new Promise((resolve, reject) => {
jwt.sign(
payload,
config.jwtSecret,
{ expiresIn: config.containerExpiry },
(err, token) => {
if (err) {
reject(err)
} else {
resolve(token)
}
}
)
})
}
export function verifyJWT(token) {
return new Promise((resolve, reject) => {
jwt.verify(token, config.jwtSecret, (err, decoded) => {
if (err) {
reject(err)
} else {
resolve(decoded)
}
})
})
}
export function isValidUsername(username) {
// Define a regular expression pattern for a valid Linux username.
const usernamePattern = /^[a-z][a-z0-9_-]*$/
// Test the username against the pattern.
if (!usernamePattern.test(username)) return false
// check if the username is between 1 and 32 characters
if (username.length < 4 || username.length > 32) {
return false
}
const reservedWords = [
'root',
'admin',
'administrator',
'sysadmin',
'system',
'daemon',
'bin',
'nobody',
'nogroup',
'guest',
'user',
]
if (reservedWords.includes(username)) {
return false
}
return true
}
export function isValidEmail(email) {
// Define a regular expression pattern for a valid email address.
const emailPattern = /^[\w-.+]+@([\w][\w-]*\.)+[\w-]{2,}$/
// Test the email against the pattern.
return emailPattern.test(email)
}