begin authentication
parent
56b71709e2
commit
277d92d97a
|
|
@ -6,6 +6,7 @@ import { Message } from './Message';
|
||||||
import { MdSend } from 'react-icons/md';
|
import { MdSend } from 'react-icons/md';
|
||||||
import useChannel from '../hooks/useChannel';
|
import useChannel from '../hooks/useChannel';
|
||||||
import useClientId from '../hooks/useClientId';
|
import useClientId from '../hooks/useClientId';
|
||||||
|
import useSessionToken from '../hooks/useSessionToken';
|
||||||
|
|
||||||
function createMessage(from: string, text: string,
|
function createMessage(from: string, text: string,
|
||||||
channel: string, t = 0): IMessage {
|
channel: string, t = 0): IMessage {
|
||||||
|
|
@ -21,6 +22,7 @@ function createMessage(from: string, text: string,
|
||||||
export default () => {
|
export default () => {
|
||||||
const [messages, setMessages] = useState<IMessage[]>([]);
|
const [messages, setMessages] = useState<IMessage[]>([]);
|
||||||
const [hist, setHist] = useState(false);
|
const [hist, setHist] = useState(false);
|
||||||
|
const { sessionToken } = useSessionToken();
|
||||||
|
|
||||||
const CHATBOX_SIZE = 64;
|
const CHATBOX_SIZE = 64;
|
||||||
const PADDING = 8;
|
const PADDING = 8;
|
||||||
|
|
@ -42,23 +44,24 @@ export default () => {
|
||||||
}, [messages]);
|
}, [messages]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
send('message:recent', { channel });
|
send('message:recent', { channel, sessionToken });
|
||||||
}, [channel]);
|
}, [channel, sessionToken]);
|
||||||
|
|
||||||
const sendMessage = useCallback(() => {
|
const sendMessage = useCallback(() => {
|
||||||
if(textBoxRef.current === null) return;
|
if(textBoxRef.current === null) return;
|
||||||
if(channel === null) return;
|
if(channel === null) return;
|
||||||
if(clientId === null) return;
|
if(clientId === null) return;
|
||||||
|
if(sessionToken === null) return;
|
||||||
send(
|
send(
|
||||||
'message:message',
|
'message:message',
|
||||||
createMessage(
|
{ ...createMessage(
|
||||||
clientId,
|
clientId,
|
||||||
textBoxRef.current.innerText,
|
textBoxRef.current.innerText,
|
||||||
channel,
|
channel,
|
||||||
),
|
), sessionToken },
|
||||||
);
|
);
|
||||||
textBoxRef.current.innerText = '';
|
textBoxRef.current.innerText = '';
|
||||||
}, [channel]);
|
}, [channel, sessionToken]);
|
||||||
|
|
||||||
const keyDown = useCallback((evt: any) => {
|
const keyDown = useCallback((evt: any) => {
|
||||||
if(evt.key === 'Enter') {
|
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 { WebSocketServer } from 'ws';
|
||||||
import { inspect } from 'util';
|
import { inspect } from 'util';
|
||||||
|
import { validateSessionToken } from '../routers/session';
|
||||||
|
|
||||||
export function expose(router: Function, port: number) {
|
export function expose(router: Function, port: number) {
|
||||||
const wss = new WebSocketServer({
|
const wss = new WebSocketServer({
|
||||||
|
|
@ -18,9 +19,14 @@ export function expose(router: Function, port: number) {
|
||||||
}
|
}
|
||||||
const {action, data} = message;
|
const {action, data} = message;
|
||||||
try {
|
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);
|
console.log('[IN]', action, data);
|
||||||
const _return = await (router(action, data) as unknown as Promise<any>);
|
const _return = await (router(action, data) as unknown as Promise<any>);
|
||||||
// console.log(_return);
|
|
||||||
if(_return) {
|
if(_return) {
|
||||||
try {
|
try {
|
||||||
switch(_return.type) {
|
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({
|
export default router({
|
||||||
async message(data: any) {
|
async message(data: any) {
|
||||||
|
if(!('$clientId' in data)) {
|
||||||
|
console.error('unauthenticated message rejected.');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
const response = await query(
|
const response = await query(
|
||||||
newMessage,
|
newMessage,
|
||||||
data.text,
|
data.text,
|
||||||
data.from,
|
data.$clientId,
|
||||||
data.uid,
|
data.uid,
|
||||||
data.timestamp,
|
data.timestamp,
|
||||||
data.channel,
|
data.channel,
|
||||||
);
|
);
|
||||||
if(response === null) return;
|
if(response === null) return;
|
||||||
// translate from to a real name
|
// translate from to a real name
|
||||||
const nameRes = await query(getName, data.from);
|
const nameRes = await query(getName, data.$clientId);
|
||||||
if(nameRes === null) return;
|
if(nameRes === null) return;
|
||||||
data.from = nameRes[0].name;
|
data.from = nameRes[0].name;
|
||||||
return broadcast(data);
|
return broadcast(data);
|
||||||
},
|
},
|
||||||
async recent(data: any) {
|
async recent(data: any) {
|
||||||
|
if(!('$clientId' in data)) {
|
||||||
|
console.error('unauthenticated request rejected.');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
const messages = await query(recentMessages, data.channel);
|
const messages = await query(recentMessages, data.channel);
|
||||||
if(messages === null) return;
|
if(messages === null) return;
|
||||||
return reply({
|
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