|
|
@ -1,5 +1,6 @@ |
|
|
|
import type { H3Event } from 'h3'; |
|
|
|
import type { ID } from '#db/schema'; |
|
|
|
import type { UserType } from '#db/repositories/user/types'; |
|
|
|
|
|
|
|
export type WGSession = Partial<{ |
|
|
|
userId: ID; |
|
|
@ -7,12 +8,12 @@ export type WGSession = Partial<{ |
|
|
|
|
|
|
|
const name = 'wg-easy'; |
|
|
|
|
|
|
|
export async function useWGSession(event: H3Event) { |
|
|
|
export async function useWGSession(event: H3Event, rememberMe = false) { |
|
|
|
const sessionConfig = await Database.sessionConfig.get(); |
|
|
|
return useSession<WGSession>(event, { |
|
|
|
password: sessionConfig.password, |
|
|
|
name, |
|
|
|
cookie: {}, |
|
|
|
cookie: { maxAge: rememberMe ? sessionConfig.timeout : undefined }, |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
@ -24,3 +25,79 @@ export async function getWGSession(event: H3Event) { |
|
|
|
cookie: {}, |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @throws |
|
|
|
*/ |
|
|
|
export async function getCurrentUser(event: H3Event) { |
|
|
|
const session = await getWGSession(event); |
|
|
|
|
|
|
|
const authorization = getHeader(event, 'Authorization'); |
|
|
|
|
|
|
|
let user: UserType | undefined = undefined; |
|
|
|
if (session.data.userId) { |
|
|
|
// Handle if authenticating using Session
|
|
|
|
user = await Database.users.get(session.data.userId); |
|
|
|
} else if (authorization) { |
|
|
|
// Handle if authenticating using Header
|
|
|
|
const [method, value] = authorization.split(' '); |
|
|
|
// Support Basic Authentication
|
|
|
|
// TODO: support personal access token or similar
|
|
|
|
if (method !== 'Basic' || !value) { |
|
|
|
throw createError({ |
|
|
|
statusCode: 401, |
|
|
|
statusMessage: 'Session failed', |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
const basicValue = Buffer.from(value, 'base64').toString('utf-8'); |
|
|
|
|
|
|
|
// Split by first ":"
|
|
|
|
const index = basicValue.indexOf(':'); |
|
|
|
const username = basicValue.substring(0, index); |
|
|
|
const password = basicValue.substring(index + 1); |
|
|
|
|
|
|
|
if (!username || !password) { |
|
|
|
throw createError({ |
|
|
|
statusCode: 401, |
|
|
|
statusMessage: 'Session failed', |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
const foundUser = await Database.users.getByUsername(username); |
|
|
|
|
|
|
|
if (!foundUser) { |
|
|
|
throw createError({ |
|
|
|
statusCode: 401, |
|
|
|
statusMessage: 'Session failed', |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
const userHashPassword = foundUser.password; |
|
|
|
const passwordValid = await isPasswordValid(password, userHashPassword); |
|
|
|
|
|
|
|
if (!passwordValid) { |
|
|
|
throw createError({ |
|
|
|
statusCode: 401, |
|
|
|
statusMessage: 'Incorrect Password', |
|
|
|
}); |
|
|
|
} |
|
|
|
user = foundUser; |
|
|
|
} |
|
|
|
|
|
|
|
if (!user) { |
|
|
|
throw createError({ |
|
|
|
statusCode: 401, |
|
|
|
statusMessage: 'Session failed. User not found', |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
if (!user.enabled) { |
|
|
|
throw createError({ |
|
|
|
statusCode: 403, |
|
|
|
statusMessage: 'User is disabled', |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
return user; |
|
|
|
} |
|
|
|