begin authentication
parent
56b71709e2
commit
277d92d97a
|
|
@ -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') {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
UPDATE sessions
|
||||
SET expires=UNIX_TIMESTAMP() * 1000
|
||||
WHERE token=?;
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
import router from "../lib/router";
|
||||
|
||||
|
||||
|
||||
|
||||
export default router({
|
||||
async create() {
|
||||
|
||||
}
|
||||
})
|
||||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
Reference in New Issue