diff --git a/src/api.ts b/src/api.ts index d959eba..fa6925a 100644 --- a/src/api.ts +++ b/src/api.ts @@ -6,8 +6,8 @@ import { getPoolsWithUser, getUserByID, groups, - users, pools, + users, } from './data'; export const router = Router(); @@ -18,6 +18,10 @@ router.get('/user', (req, res) => { } let userID = req.query.userID; + if (userID === '@me') { + userID = req.session.accountID; + } + let user = getUserByID(userID); if (user) { diff --git a/src/auth.ts b/src/auth.ts index 831a662..c3a1c4b 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -1,20 +1,11 @@ -import * as simpleoauth2 from 'simple-oauth2'; import { v4 } from 'uuid'; import { getAccountIDFromIonCode } from './auth_ion'; const sessions: { // Maps to user ID - [sessionID: string]: string; + [sessionID: string]: SessionData; } = {}; -export function getUserIDFromSessionToken(sessionToken: string): string | null { - if (sessionToken in sessions) { - return sessions[sessionToken]; - } else { - return null; - } -} - export async function createSessionFromCodeAndProvider( code: string, provider: 'ion' @@ -26,10 +17,14 @@ export async function createSessionFromCodeAndProvider( } // Returns the newly-created session ID -export function createSession(userID: string): string { +export function createSession(accountID: string): string { const id = v4(); - sessions[id] = userID; + sessions[id] = { accountID }; return id; } + +export function getSessionByToken(token: string): SessionData { + return sessions[token]; +} diff --git a/src/getSessionID.ts b/src/getSessionID.ts new file mode 100644 index 0000000..0c429e2 --- /dev/null +++ b/src/getSessionID.ts @@ -0,0 +1,10 @@ +import { IncomingMessage } from 'http'; + +export default function getSessionID(request: IncomingMessage): string | null { + const auth = request.headers.authorization; + if (typeof auth === 'string' && auth.startsWith('Bearer ')) { + return auth.slice(7); + } else { + return null; + } +} diff --git a/src/sessionMiddleware.ts b/src/sessionMiddleware.ts new file mode 100644 index 0000000..1ff6b21 --- /dev/null +++ b/src/sessionMiddleware.ts @@ -0,0 +1,15 @@ +import { RequestHandler } from 'express'; +import { getSessionByToken } from './auth'; +import getSessionID from './getSessionID'; + +export const sessionMiddleware: RequestHandler = async (req, res, next) => { + const token = getSessionID(req); + + if (token != null) { + req.session = getSessionByToken(token); + } else { + req.session = { accountID: null }; + } + + next(); +}; diff --git a/src/typings/session.d.ts b/src/typings/session.d.ts new file mode 100644 index 0000000..644e35d --- /dev/null +++ b/src/typings/session.d.ts @@ -0,0 +1,13 @@ +export {}; + +declare global { + interface SessionData { + accountID: string; + } + + namespace Express { + interface Request { + session: SessionData; + } + } +} diff --git a/tsconfig.json b/tsconfig.json index b5da52a..2a9b7c6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,8 +2,9 @@ "compilerOptions": { "outDir": "dist/", "esModuleInterop": true, + "moduleResolution": "Node" }, - "files": ["src/types.ts"], - "include": ["src/"], - "exclude": ["node_modules/"], -} \ No newline at end of file + "files": ["src/types.ts", "src/typings/session.d.ts"], + "include": ["src/", "session.d.ts"], + "exclude": ["node_modules/"] +}