clen a bit and add verifypassword who now add to channel if good pass

This commit is contained in:
Alexandre POMMIER 2023-06-26 10:47:15 +02:00
parent baa9b90e5d
commit 369ab63f8a
11 changed files with 93 additions and 294 deletions

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/06/17 01:00:00 by apommier #+# #+# */ /* Created: 2023/06/17 01:00:00 by apommier #+# #+# */
/* Updated: 2023/06/26 08:00:13 by apommier ### ########.fr */ /* Updated: 2023/06/26 10:16:19 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -46,6 +46,21 @@ export class AppController {
return await this.userService.findOne(req.user.username); return await this.userService.findOne(req.user.username);
} }
@UseGuards(JwtAuthGuard)
@Post('/logout')
async logout(@Request() req, @Body() data: any) {
const user = await this.userService.findOne(req.user.username)
// return await this.userService.refuseInvite(user, data.username);
if(!user)
return ;
if (user.sessionNumber === 1)
{
user.status = 0;
}
user.sessionNumber--;
this.userService.save(user);
}
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard)
@Post('/user') @Post('/user')
async getUser(@Body() data: any) { async getUser(@Body() data: any) {
@ -204,6 +219,7 @@ export class AppController {
async addLoss(@Request() req, @Body() data: any) { async addLoss(@Request() req, @Body() data: any) {
const user = await this.userService.findOne(req.user.username); const user = await this.userService.findOne(req.user.username);
user.loss++; user.loss++;
user.status = 1;
const Esp = 1 / (1 + Math.pow(10, (data.opRank - user.rank) / this.scaleFactor)) const Esp = 1 / (1 + Math.pow(10, (data.opRank - user.rank) / this.scaleFactor))
const newRank = user.rank + this.kFactor * (0 - Esp); const newRank = user.rank + this.kFactor * (0 - Esp);
user.rank = newRank; user.rank = newRank;
@ -267,7 +283,10 @@ export class AppController {
@Post('/quit') @Post('/quit')
async setOffline(@Request() req) { async setOffline(@Request() req) {
const user = await this.userService.findOne(req.user.username); const user = await this.userService.findOne(req.user.username);
if (!user)
return ;
user.sessionNumber--; user.sessionNumber--;
console.log("seesion number=", user.sessionNumber)
if (!user.sessionNumber) if (!user.sessionNumber)
user.status = 0; user.status = 0;
await this.userService.save(user); await this.userService.save(user);
@ -413,13 +432,15 @@ export class AppController {
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard)
@Post('/password') @Post('/password')
async setPassword(@Body() data: any) { async setPassword(@Body() data: any) {
// console.log("PASSSSSSSSSSSSSSSSSSSSSSSSSSs= ", data.password);
return await this.chatService.setPassword(data.convId, data.password) return await this.chatService.setPassword(data.convId, data.password)
} }
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard)
@Post('/verifyPassword') @Post('/verifyPassword')
async verifyPassword(@Body() data: any) { async verifyPassword(@Request() req, @Body() data: any) {
return await this.chatService.verifyPassword(data.convId, data.password) // const user = await this.userService.findOne(req.user.username);
return await this.chatService.verifyPassword(data.convId, data.password, req.user.username)
} }
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard)

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/06/17 01:00:25 by apommier #+# #+# */ /* Created: 2023/06/17 01:00:25 by apommier #+# #+# */
/* Updated: 2023/06/26 06:56:08 by apommier ### ########.fr */ /* Updated: 2023/06/26 10:17:36 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -108,9 +108,16 @@ async setPassword(convId: number, password: string) {
this.save(conv); this.save(conv);
} }
async verifyPassword(convId: number, password: string) { async verifyPassword(convId: number, password: string, username: string) {
const conv = await this.findConv(convId); const conv = await this.findConv(convId);
return await bcrypt.compare(password, conv.password); const ret = await bcrypt.compare(password, conv.password);
if (ret === true)
{
conv.members = conv.members || [];
conv.members.push(username);
this.save(conv);
}
return ret;
} }
async muteUser(convId: number, username: string, time: string) { async muteUser(convId: number, username: string, time: string) {

View File

@ -1,58 +0,0 @@
export const Rank = [
{
rank: '1',
name: 'jean',
},
{
rank: '2',
name: 'marc',
},
{
rank: '3',
name: 'dujardain',
},
{
rank: '4',
name: 'mom',
},
{
rank: '5',
name: 'fary',
},
{
rank: '6',
name: 'aba',
},
{
rank: '7',
name: 'preach',
},
{
rank: '1',
name: 'jean',
},
{
rank: '2',
name: 'marc',
},
{
rank: '3',
name: 'dujardain',
},
{
rank: '4',
name: 'mom',
},
{
rank: '5',
name: 'fary',
},
{
rank: '6',
name: 'aba',
},
{
rank: '7',
name: 'preach',
},
]

View File

@ -1,8 +0,0 @@
import DefaultPic from '../assets/profile.jpg';
export const UserProfile = {
Pic: DefaultPic,
UserName: 'Dipper Ratman',
}
// export default UserProfile

View File

@ -1,37 +0,0 @@
export const DBWinLoss = [
{
title: 'Victory',
score: '10 - 6',
opponent: 'chef bandit'
},
{
title: 'Defeat',
score: '9 - 10',
opponent: 'ex tueur'
},
{
title: 'Victory',
score: '10 - 0',
opponent: 'tueur'
},
{
title: 'Victory',
score: '10 - 9',
opponent: 'boulanger'
},
{
title: 'Defeat',
score: '3 - 10',
opponent: 'charcutier'
},
{
title: 'Deafet',
score: '9 - 10',
opponent: 'preach'
},
{
title: 'Victory',
score: '10 - 9',
opponent: 'aba'
},
]

View File

@ -29,7 +29,6 @@ interface ModalProps {
} }
const Modal = ({handleClose}: ModalProps) => { const Modal = ({handleClose}: ModalProps) => {
// const [multi, setMulti] = useState(false);
const [selectTags, setSelectTag] = useState([{ id: 1, selectedOption: ''}]); const [selectTags, setSelectTag] = useState([{ id: 1, selectedOption: ''}]);
const [selectedOptionArray, setSelectedOptionArray] = useState<string[]>([]); const [selectedOptionArray, setSelectedOptionArray] = useState<string[]>([]);
const [users, setUsers] = useState<User[]>([]); const [users, setUsers] = useState<User[]>([]);
@ -39,7 +38,6 @@ const Modal = ({handleClose}: ModalProps) => {
const [channel, setChannel] = useState(''); const [channel, setChannel] = useState('');
useEffect(()=> { useEffect(()=> {
const getConv = async ()=>{ const getConv = async ()=>{
try { try {
const tmpUsers = await api.get("/users"); const tmpUsers = await api.get("/users");
@ -76,6 +74,7 @@ const Modal = ({handleClose}: ModalProps) => {
try { try {
console.log("channel= ", channel) console.log("channel= ", channel)
await api.post("/join", {convId: channel}) await api.post("/join", {convId: channel})
window.location.reload();
} catch(err) { } catch(err) {
console.log(err); console.log(err);
} }
@ -108,12 +107,10 @@ const Modal = ({handleClose}: ModalProps) => {
<motion.div <motion.div
onClick={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()}
className="modalSetting" className="modalSetting"
// variant={dropIn}
initial="hidden" initial="hidden"
animate="visible" animate="visible"
exit="exit" exit="exit"
> >
{/* <p>New Conversation</p> */}
<div className="settingFirstPart2"> <div className="settingFirstPart2">
{selectTags.map((selectTag) => ( {selectTags.map((selectTag) => (
@ -159,18 +156,13 @@ const Modal = ({handleClose}: ModalProps) => {
) )
))} ))}
</select> </select>
// {/* {channel.private ? (
// <input className="mdp" placeholder="passdddddword" type="text" />
// ):("")} */}
)} )}
{/* {channel.private ? (
<input className="mdp" placeholder="passdddddword" type="text" />
):("")} */}
<div className="div_submit"> <div className="div_submit">
<Link to='#' className="submit" onClick={ joinChannel }>Join</Link> <Link to='#' className="submit" onClick={ joinChannel }>Join</Link>
</div> </div>
</div> </div>
</motion.div> </motion.div>
</Backdrop> </Backdrop>

View File

@ -1,14 +1,25 @@
import React from "react"; import React from "react";
import api from "../../script/axiosApi"
function Logout(){ function Logout(){
const logout = async () =>{
try {
await api.post("/logout")
} catch (err) {
console.log(err);
}
}
logout();
localStorage.clear(); localStorage.clear();
const path = 'http://' + process.env.REACT_APP_BASE_URL + '/'; const path = 'http://' + process.env.REACT_APP_BASE_URL + '/';
// history(path, { replace: true }); // history(path, { replace: true });
// window.location.replace(path); // window.location.replace(path);
// window.history.pushState({}, '', path); // window.history.pushState({}, '', path);
window.history.pushState({}, '', path); window.history.pushState({}, '', path);
window.location.reload(); window.location.reload();
return (<></>) return (<></>)

View File

@ -1,112 +1,18 @@
import React, { useCallback, useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import api from '../script/axiosApi.tsx'; import api from '../script/axiosApi.tsx';
// function DoubleAuth() {
// // const enabled = await api.get("/2fa");
// // const response = await api.get("/2fa");
// // const enabled = response.data;
// // console.log(`enable= ${enabled.data}`)
// // const enabled = 0;
// let enabled;
// useEffect(() => {
// async function get2fa()
// {
// const response = await api.get("/2fa");
// const enabled = response.data;
// console.log(`enable= ${enabled.data}`)
// }
// // const enabled = 0;
// }, [])
// useEffect(() => {
// async function get2fa()
// {
// api.get('/api/QRcode', { responseType: 'blob' })
// .then(response => {
// const reader = new FileReader();
// reader.onloadend = () => {
// setImageSrc(reader.result);
// };
// reader.readAsDataURL(response.data);
// })
// .catch(error => {
// console.error(error);
// });
// } }, []);
// // const [verificationCode, setVerificationCode] = useState('');
// // const [invalidCode, setInvalidCode] = useState(false);
// const handleSubmit = () => {
// // async (e) => {
// // e.preventDefault();
// // const result = await verifyOtp(verificationCode);
// // if (result) return (window.location = '/');
// // setInvalidCode(true);
// // },
// // [verificationCode]
// };
// let sourceCode
// if (!enabled)
// {
// api.get('/QRcode')
// .then(response => {
// sourceCode = response.data;
// console.log(sourceCode);
// })
// .catch(error => {
// console.error(error);
// });
// }
// return (
// <div>
// {!enabled && (
// <div>
// <p>Scan the QR code on your authenticator app</p>
// <img src={sourceCode} />
// </div>
// )}
// <form onSubmit={handleSubmit}>
// {/* <Input
// id="verificationCode"
// label="Verification code"
// type="text"
// value={verificationCode}
// onChange={(e) => setVerificationCode(e.target.value)}
// /> */}
// <button type="submit">Confirm</button>
// {/* {invalidCode && <p>Invalid verification code</p>} */}
// </form>
// </div>
// );
// }
// import { toFileStream } from 'qrcode';
const DoubleAuth = () => { const DoubleAuth = () => {
const [imageSrc, setImageSrc] = useState(''); // const [imageSrc, setImageSrc] = useState('');
const [imageSrc, setImageSrc] = useState<string | ArrayBuffer | null>('');
useEffect(() => { useEffect(() => {
async function getCode(){ async function getCode(){
await api.get('/QRcode', { responseType: 'blob' }) await api.get('/QRcode', { responseType: 'blob' })
.then(response => { .then(response => {
const reader = new FileReader(); const reader = new FileReader();
if (!reader)
return ;
reader.onloadend = () => { reader.onloadend = () => {
setImageSrc(reader.result); setImageSrc(reader.result);
}; };
@ -119,23 +25,12 @@ const DoubleAuth = () => {
getCode(); getCode();
}, []); }, []);
// return (
// <div>
// {imageSrc && <img src={imageSrc} alt="QR Code" />}
// </div>
// );
// <img src={sourceCode} />
return ( return (
<div> <div>
<div> <div>
<p>Scan the QR code on your authenticator app</p> <p>Scan the QR code on your authenticator app</p>
{imageSrc && <img src={imageSrc} alt="QR Code" />} {imageSrc && <img src={imageSrc.toString()} alt="QR Code" />}
</div> </div>
{/* <form onSubmit={handleSubmit}>
<button type="submit">Confirm</button>
</form> */}
</div> </div>
); );

View File

@ -52,9 +52,6 @@ function QrCode () {
const otpData = await api.post("/otp"); const otpData = await api.post("/otp");
setUrl(otpData.data.otpauth_url); setUrl(otpData.data.otpauth_url);
setSecret(otpData.data.base32_secret); setSecret(otpData.data.base32_secret);
// const tmpUser = await api.get("/profile")
// console.log("test")
// console.table(convs);
} }
catch(err){ catch(err){
console.log(err); console.log(err);
@ -70,34 +67,22 @@ function QrCode () {
const handleKeyPress = async (e: { key: string; })=>{ const handleKeyPress = async (e: { key: string; })=>{
// console.log(`e in press= ${e.key}`)
if (e.key !== "Enter") if (e.key !== "Enter")
return ; return ;
try{ try{
console.log("code= ", code)
const res = await api.post("/verifyOtp", {token: code}) const res = await api.post("/verifyOtp", {token: code})
console.log("res= ", res.data)
console.log("res= ", res)
if (!res.data) if (!res.data)
{ {
setErr(true); setErr(true);
} }
if (res.data === 1) if (res.data === 1)
{ {
console.log("registered")
// history.push('/login')
const path = 'http://' + process.env.REACT_APP_BASE_URL + '/'; const path = 'http://' + process.env.REACT_APP_BASE_URL + '/';
window.history.pushState({}, '', path); window.history.pushState({}, '', path);
window.location.reload(); window.location.reload();
} }
else else
{
console.log("bad code") console.log("bad code")
//alert ?? retry
}
// redirect('/test')
} }
catch(err){ catch(err){
console.log(err) console.log(err)
@ -107,8 +92,6 @@ function QrCode () {
const handleDesactivate = async () => { const handleDesactivate = async () => {
try { try {
await api.post("/deleteOtp") await api.post("/deleteOtp")
// const path = 'http://' + process.env.REACT_APP_BASE_URL + '/';
// window.history.pushState({}, '', path);
window.location.reload(); window.location.reload();
} catch(err) { } catch(err) {
console.log(err); console.log(err);
@ -116,18 +99,6 @@ function QrCode () {
}; };
return ( return (
// <motion.div className="page"
// initial={{opacity: -1}}
// animate={{opacity: 1}}
// exit={{opacity: -1}}>
// <h1>QRcode</h1>
// <h3>{secret}</h3>
// <div ref={ref} />
// <input type="text" className="qr" placeholder="Type The Code"/>
// {}
// </motion.div>
<motion.div <motion.div
className="page" className="page"
initial={{ opacity: -1 }} initial={{ opacity: -1 }}
@ -140,7 +111,6 @@ function QrCode () {
<h3>{secret}</h3> <h3>{secret}</h3>
<h1>Or Scan The QRCode</h1> <h1>Or Scan The QRCode</h1>
<div ref={ref} /> <div ref={ref} />
{/* <div>{ref}</div> */}
</> </>
)} )}
@ -166,22 +136,6 @@ function QrCode () {
{err ? (<RedAlert handleClose={closeErr} text="Error: Bad intput. Try again"/>):("")} {err ? (<RedAlert handleClose={closeErr} text="Error: Bad intput. Try again"/>):("")}
</AnimatePresence> </AnimatePresence>
</> </>
{/* {!localStorage.getItem('token') && (
<>
<h1>Double Auth</h1>
<input onKeyDown={handleKeyPress}
type="text"
className="qr"
placeholder="6 Digits Code"
onChange={(e) => setCode(e.target.value)}
/>
</>
) : (<button onClick={ handleDesactivate }>Desactivate 2FA</button>)}
*/}
{/* {!activated && (
<button onClick={() => setActivated(true)}>Activate</button>
)} */}
</motion.div> </motion.div>
) )
} }

View File

@ -1,9 +0,0 @@
import React from "react";
function Social (){
return (
<div>je suis la partie social</div>
)
}
export default Social

View File

@ -1,3 +1,4 @@
import { useEffect } from 'react';
import api from '../script/axiosApi.tsx'; import api from '../script/axiosApi.tsx';
import io from 'socket.io-client'; import io from 'socket.io-client';
@ -9,6 +10,22 @@ interface GameProps {
function DrawCanvas(option: number, gameParam: GameProps) { function DrawCanvas(option: number, gameParam: GameProps) {
useEffect(() => {
const handleBeforeUnload = async (event: { preventDefault: () => void; returnValue: string; }) => {
try {
await api.post("/status", {status: 1});
} catch (err) {
console.log(err);
}
};
window.addEventListener('beforeunload', handleBeforeUnload);
return () => {
window.removeEventListener('beforeunload', handleBeforeUnload);
};
}, []);
console.log(`option= ${option}`); console.log(`option= ${option}`);
const superpowerModifier = option & 1; // Retrieves the superpower modifier const superpowerModifier = option & 1; // Retrieves the superpower modifier
const obstacleModifier = (option >> 1) & 1; // Retrieves the obstacle modifier const obstacleModifier = (option >> 1) & 1; // Retrieves the obstacle modifier
@ -38,7 +55,7 @@ function DrawCanvas(option: number, gameParam: GameProps) {
} }
console.log("start function"); console.log("start function");
const canvas = document.getElementById('myCanvas') as HTMLCanvasElement | null;; const canvas = document.getElementById('myCanvas') as HTMLCanvasElement | null;
if (!canvas) if (!canvas)
return ; return ;
@ -433,6 +450,20 @@ socket.on('pong:hisPoint', (data) => {
console.log(err) console.log(err)
} }
} }
else
{
const data = {
myScore: myScore,
opScore: 5,
opName: opName,
opRank: opRank,
};
await api.post('/loss', data);
// await api.post('/status', {status: 1});
}
//here
socket.emit('pong:disconnect', {id: myId}); socket.emit('pong:disconnect', {id: myId});
window.location.replace("http://" + process.env.REACT_APP_BASE_URL + "/pong"); window.location.replace("http://" + process.env.REACT_APP_BASE_URL + "/pong");
}; };