From f6fbada5b14d6db48d901088bf92400a335a9780 Mon Sep 17 00:00:00 2001 From: kyle hoell Date: Fri, 27 Nov 2020 17:53:15 -0500 Subject: [PATCH] make popup window removed video token and cookie when it is closed. Fixed mobile context menu not being able to download files --- backend/controllers/file.ts | 32 +++++++++++++++++++--- backend/cookies/createCookies.ts | 10 +++++++ backend/express-routers/file.ts | 2 ++ backend/middleware/authStreamVideo.ts | 2 ++ src/components/MobileContextMenu/index.js | 33 +++++++++++++++++------ src/components/PopupWindow/index.js | 7 ++--- 6 files changed, 72 insertions(+), 14 deletions(-) diff --git a/backend/controllers/file.ts b/backend/controllers/file.ts index b4da59e..9e5b61b 100644 --- a/backend/controllers/file.ts +++ b/backend/controllers/file.ts @@ -3,10 +3,11 @@ import FileService from "../services/FileService"; import MongoService from "../services/ChunkService/MongoService"; import FileSystemService from "../services/ChunkService/FileSystemService"; import S3Service from "../services/ChunkService/S3Service"; -import {UserInterface} from "../models/user"; +import User, {UserInterface} from "../models/user"; import tempStorage from "../tempStorage/tempStorage"; import sendShareEmail from "../utils/sendShareEmail"; -import { createStreamVideoCookie } from "../cookies/createCookies"; +import { createStreamVideoCookie, removeStreamVideoCookie } from "../cookies/createCookies"; +import { ObjectID } from "mongodb"; const fileService = new FileService() @@ -24,7 +25,8 @@ interface RequestTypeRefresh extends Request { interface RequestTypeFullUser extends Request { user?: UserInterface, - encryptedToken?: string + encryptedToken?: string, + accessTokenStreamVideo?: string } interface RequestType extends Request { @@ -356,6 +358,30 @@ class FileController { } + removeStreamVideoAccessToken = async(req: RequestTypeFullUser, res: Response) => { + + if (!req.user) return; + + try { + + const userID = req.user._id; + + const accessTokenStreamVideo = req.accessTokenStreamVideo!; + + await User.updateOne({_id: userID}, {$pull: {tempTokens: {token: accessTokenStreamVideo}}}); + + removeStreamVideoCookie(res); + + res.send(); + + } catch (e) { + + console.log("\Remove Video Token File Router Error:", e.message); + const code = !e.code ? 500 : e.code >= 400 && e.code <= 599 ? e.code : 500; + res.status(code).send(); + } + } + // getDownloadTokenVideo = async(req: RequestTypeFullUser, res: Response) => { // if (!req.user) { diff --git a/backend/cookies/createCookies.ts b/backend/cookies/createCookies.ts index 5473795..7281ddf 100644 --- a/backend/cookies/createCookies.ts +++ b/backend/cookies/createCookies.ts @@ -46,4 +46,14 @@ export const createStreamVideoCookie = (res: Response, streamVideoAccessToken: s sameSite: "strict", secure: process.env.NODE_ENV === "production" }) +} + +export const removeStreamVideoCookie = (res: Response) => { + + res.cookie("video-access-token", {}, { + httpOnly: true, + maxAge: 0, + sameSite: "strict", + secure: process.env.NODE_ENV === "production" + }) } \ No newline at end of file diff --git a/backend/express-routers/file.ts b/backend/express-routers/file.ts index e366af0..60c89f7 100644 --- a/backend/express-routers/file.ts +++ b/backend/express-routers/file.ts @@ -57,6 +57,8 @@ router.get("/file-service/download/access-token-stream-video", authFullUser, fil router.get("/file-service/stream-video/:id", authStreamVideo, fileController.streamVideo); +router.delete("/file-service/remove-stream-video-token", authStreamVideo, fileController.removeStreamVideoAccessToken); + //router.get("/file-service/stream-video/:id/:tempToken/:uuid", auth, fileController.streamVideo); //router.get("/file-service/stream-video/:id", auth, fileController.streamVideo); diff --git a/backend/middleware/authStreamVideo.ts b/backend/middleware/authStreamVideo.ts index dfc5196..fd3db9b 100644 --- a/backend/middleware/authStreamVideo.ts +++ b/backend/middleware/authStreamVideo.ts @@ -8,6 +8,7 @@ interface RequestType extends Request { user?: UserInterface, token?: string, encryptedToken?: string, + accessTokenStreamVideo?: string } // type jwtType = { @@ -84,6 +85,7 @@ const authStreamVideo = async(req: RequestType, res: Response, next: NextFunctio if (!tokenFound) throw new Error("Refresh Token Not Found"); req.user = user; + req.accessTokenStreamVideo = encryptedToken; next(); diff --git a/src/components/MobileContextMenu/index.js b/src/components/MobileContextMenu/index.js index aa11b66..4123aa0 100644 --- a/src/components/MobileContextMenu/index.js +++ b/src/components/MobileContextMenu/index.js @@ -79,14 +79,11 @@ class MobileContextMenuContainer extends React.Component { this.props.dispatch(setLastSelected(0)); - axios.get(currentURL +'/file-service/download/get-token') - .then((response) => { - - const tempToken = response.data.tempToken; + axios.post("/user-service/get-token").then((response) => { const finalUrl = - isGoogle ? !isGoogleDoc ? currentURL + `/file-service-google/download/${fileID}/${tempToken}` : currentURL + `/file-service-google-doc/download/${fileID}/${tempToken}` - : !isPersonal ? currentURL + `/file-service/download/${fileID}/${tempToken}` : currentURL + `/file-service-personal/download/${fileID}/${tempToken}` + isGoogle ? !isGoogleDoc ? currentURL + `/file-service-google/download/${fileID}` : currentURL + `/file-service-google-doc/download/${fileID}` + : !isPersonal ? currentURL + `/file-service/download/${fileID}` : currentURL + `/file-service-personal/download/${fileID}` const link = document.createElement('a'); document.body.appendChild(link); @@ -95,9 +92,29 @@ class MobileContextMenuContainer extends React.Component { link.setAttribute("download", true); link.click(); - }).catch((err) => { - console.log(err) + }).catch((e) => { + console.log("Download file get refresh token error", e); }) + + // axios.get(currentURL +'/file-service/download/get-token') + // .then((response) => { + + // const tempToken = response.data.tempToken; + + // const finalUrl = + // isGoogle ? !isGoogleDoc ? currentURL + `/file-service-google/download/${fileID}/${tempToken}` : currentURL + `/file-service-google-doc/download/${fileID}/${tempToken}` + // : !isPersonal ? currentURL + `/file-service/download/${fileID}/${tempToken}` : currentURL + `/file-service-personal/download/${fileID}/${tempToken}` + + // const link = document.createElement('a'); + // document.body.appendChild(link); + // link.href = finalUrl; + // link.setAttribute('type', 'hidden'); + // link.setAttribute("download", true); + // link.click(); + + // }).catch((err) => { + // console.log(err) + // }) } moveOnClick = () => { diff --git a/src/components/PopupWindow/index.js b/src/components/PopupWindow/index.js index fb234e0..690dcba 100644 --- a/src/components/PopupWindow/index.js +++ b/src/components/PopupWindow/index.js @@ -150,13 +150,14 @@ class PopupWindowContainer extends React.Component { componentWillUnmount = () => { - const uuidID = window.sessionStorage.getItem("uuid"); - document.removeEventListener('mousedown', this.handleClickOutside); if (this.props.popupFile.metadata.isVideo) { - axios.delete(currentURL +`/file-service/remove/token-video/${this.tempToken}/${uuidID}`, { + axios.delete(`/file-service/remove-stream-video-token`).then(() => { + + console.log("removed video access token"); + }).catch((err) => { console.log(err); })