Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import { createHmac } from 'crypto'
- import min from 'min'
- import { EventEmitter } from 'events'
- const secret = 'foobar'
- const store = {
- data: new Map(),
- set(key, value) {
- store.data.set(key, value)
- },
- get(key) {
- if (store.data.has(key)) {
- return store.data.get(key)
- } else {
- throw new Error('no such key')
- }
- },
- remove(key) {
- store.data.delete(key)
- }
- }
- min.store = store
- class User extends EventEmitter {
- async construtor(username, nickname, password = null, salt = secret) {
- if (await User.checkUsername(username)) {
- throw new Error('User was already exists.')
- }
- this.username = username
- this.nickname = nickname
- if (password) {
- this.secretHash = User.createHash(password)
- await this.save()
- }
- }
- async save() {
- await min.hmset(`user:${this.username}`, {
- username: this.username,
- nickname: this.nickname,
- secretHash: this.secretHash
- })
- await min.sadd('users', this.username)
- }
- static fetch(username) {
- const nickname = await min.hget(`user:${username}`, 'nickname')
- return new User(username, nickname)
- }
- static checkPassword(username, password, salt = secret) {
- const secretHash = await min.hget(`user:${username}`, 'secretHash')
- return User.createHash(salt + password.toUpperCase() + salt, salt) === secretHash
- }
- static createHash(str, salt = secret) {
- return createHmac(salt + str.toUpperCase() + salt, salt)
- }
- static checkUsername(username) {
- return min.sismember('users', username)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement