76adc7124f
* generated password on an api call * use this password to authenticate on prosody * using helper getAuthUser when available, else fallback to custom code
67 lines
1.6 KiB
TypeScript
67 lines
1.6 KiB
TypeScript
/*
|
|
This module provides user credential for the builtin prosody module.
|
|
|
|
A user can get a password thanks to a call to prosodyRegisterUser (see api user/auth).
|
|
|
|
Then, we can test that the user exists with prosodyUserRegistered, and test password with prosodyCheckUserPassword.
|
|
|
|
Passwords are randomly generated.
|
|
|
|
These password are stored internally in a global variable, and are valid for 24h.
|
|
Each call to registerUser extends the validity by 24h.
|
|
|
|
*/
|
|
|
|
interface Password {
|
|
password: string
|
|
validity: number
|
|
}
|
|
|
|
const PASSWORDS: Map<string, Password> = new Map()
|
|
|
|
function _getAndClean (user: string): Password | undefined {
|
|
const entry = PASSWORDS.get(user)
|
|
if (entry) {
|
|
if (entry.validity > Date.now()) {
|
|
return entry
|
|
}
|
|
PASSWORDS.delete(user)
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
async function prosodyRegisterUser (user: string): Promise<string> {
|
|
const entry = _getAndClean(user)
|
|
const validity = Date.now() + (24 * 60 * 60 * 1000) // 24h
|
|
if (entry) {
|
|
entry.validity = validity
|
|
return entry.password
|
|
}
|
|
|
|
const password = Math.random().toString(36).slice(2, 12) + Math.random().toString(36).slice(2, 12)
|
|
PASSWORDS.set(user, {
|
|
password: password,
|
|
validity: validity
|
|
})
|
|
return password
|
|
}
|
|
|
|
async function prosodyUserRegistered (user: string): Promise<boolean> {
|
|
const entry = _getAndClean(user)
|
|
return !!entry
|
|
}
|
|
|
|
async function prosodyCheckUserPassword (user: string, password: string): Promise<boolean> {
|
|
const entry = _getAndClean(user)
|
|
if (entry && entry.password === password) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
export {
|
|
prosodyRegisterUser,
|
|
prosodyUserRegistered,
|
|
prosodyCheckUserPassword
|
|
}
|