begin authentication

main
Valerie 2022-07-30 04:07:38 -04:00
parent 56b71709e2
commit 277d92d97a
7 changed files with 64 additions and 18 deletions

View File

@ -6,6 +6,7 @@ import { Message } from './Message';
import { MdSend } from 'react-icons/md';
import useChannel from '../hooks/useChannel';
import useClientId from '../hooks/useClientId';
import useSessionToken from '../hooks/useSessionToken';
function createMessage(from: string, text: string,
channel: string, t = 0): IMessage {
@ -21,6 +22,7 @@ function createMessage(from: string, text: string,
export default () => {
const [messages, setMessages] = useState<IMessage[]>([]);
const [hist, setHist] = useState(false);
const { sessionToken } = useSessionToken();
const CHATBOX_SIZE = 64;
const PADDING = 8;
@ -42,23 +44,24 @@ export default () => {
}, [messages]);
useEffect(() => {
send('message:recent', { channel });
}, [channel]);
send('message:recent', { channel, sessionToken });
}, [channel, sessionToken]);
const sendMessage = useCallback(() => {
if(textBoxRef.current === null) return;
if(channel === null) return;
if(clientId === null) return;
if(sessionToken === null) return;
send(
'message:message',
createMessage(
{ ...createMessage(
clientId,
textBoxRef.current.innerText,
channel,
),
), sessionToken },
);
textBoxRef.current.innerText = '';
}, [channel]);
}, [channel, sessionToken]);
const keyDown = useCallback((evt: any) => {
if(evt.key === 'Enter') {

View File

@ -0,0 +1,12 @@
SELECT
sessions.client_uid as client_uid,
sessions.expires as expires,
clients.username as username
FROM sessions
JOIN clients
ON sessions.client_uid=clients.uid
WHERE
sessions.expires > UNIX_TIMESTAMP() * 1000
AND sessions.token=?
LIMIT 1;

View File

@ -0,0 +1,3 @@
UPDATE sessions
SET expires=UNIX_TIMESTAMP() * 1000
WHERE token=?;

View File

@ -1,5 +1,6 @@
import { WebSocketServer } from 'ws';
import { inspect } from 'util';
import { validateSessionToken } from '../routers/session';
export function expose(router: Function, port: number) {
const wss = new WebSocketServer({
@ -18,9 +19,14 @@ export function expose(router: Function, port: number) {
}
const {action, data} = message;
try {
if(typeof data === 'object' && 'sessionToken' in data) {
const auth = await validateSessionToken(data.sessionToken);
delete data['sessionToken'];
if(auth === null) return;
data.$clientId = auth;
}
console.log('[IN]', action, data);
const _return = await (router(action, data) as unknown as Promise<any>);
// console.log(_return);
if(_return) {
try {
switch(_return.type) {

View File

@ -1,10 +0,0 @@
import router from "../lib/router";
export default router({
async create() {
}
})

View File

@ -7,22 +7,30 @@ import { broadcast, reply } from '../lib/WebSocketServer';
export default router({
async message(data: any) {
if(!('$clientId' in data)) {
console.error('unauthenticated message rejected.');
return null;
}
const response = await query(
newMessage,
data.text,
data.from,
data.$clientId,
data.uid,
data.timestamp,
data.channel,
);
if(response === null) return;
// translate from to a real name
const nameRes = await query(getName, data.from);
const nameRes = await query(getName, data.$clientId);
if(nameRes === null) return;
data.from = nameRes[0].name;
return broadcast(data);
},
async recent(data: any) {
if(!('$clientId' in data)) {
console.error('unauthenticated request rejected.');
return null;
}
const messages = await query(recentMessages, data.channel);
if(messages === null) return;
return reply({

View File

@ -0,0 +1,24 @@
import router from "../lib/router"
import { reply } from "../lib/WebSocketServer"
import invalidate from '../db/snippets/session/invalidate.sql'
import _get from '../db/snippets/session/get.sql'
import query from "../db/query";
export default router({
async 'invalidate'(token: string) {
await query(invalidate, token);
return reply({
err: null
})
}
});
export async function validateSessionToken(token: string) {
console.log('ASDASDASDASD')
const res = await query(_get, token);
if(res === null) return null;
if(res.length === 1 && res[0].expires > Date.now())
return res[0].client_uid;
return null;
}