From c2e1f7ce8f1c3eec9b26ecda2f6483a869f9763d Mon Sep 17 00:00:00 2001 From: Hasin Mahmood <hasinmahmood01@gmail.com> Date: Mon, 8 May 2023 15:17:05 +0100 Subject: [PATCH] added cors option for credential --- backend/node_modules/.package-lock.json | 13 +++ backend/node_modules/fsevents/LICENSE | 22 ++++ backend/node_modules/fsevents/README.md | 83 +++++++++++++++ backend/node_modules/fsevents/fsevents.d.ts | 46 +++++++++ backend/node_modules/fsevents/fsevents.js | 82 +++++++++++++++ backend/node_modules/fsevents/fsevents.node | Bin 0 -> 147128 bytes backend/node_modules/fsevents/package.json | 62 ++++++++++++ backend/server.js | 106 ++++++++++---------- 8 files changed, 362 insertions(+), 52 deletions(-) create mode 100644 backend/node_modules/fsevents/LICENSE create mode 100644 backend/node_modules/fsevents/README.md create mode 100644 backend/node_modules/fsevents/fsevents.d.ts create mode 100644 backend/node_modules/fsevents/fsevents.js create mode 100755 backend/node_modules/fsevents/fsevents.node create mode 100644 backend/node_modules/fsevents/package.json diff --git a/backend/node_modules/.package-lock.json b/backend/node_modules/.package-lock.json index ce5bb3e7..a33cd53f 100644 --- a/backend/node_modules/.package-lock.json +++ b/backend/node_modules/.package-lock.json @@ -1972,6 +1972,19 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "optional": true }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", diff --git a/backend/node_modules/fsevents/LICENSE b/backend/node_modules/fsevents/LICENSE new file mode 100644 index 00000000..5d70441c --- /dev/null +++ b/backend/node_modules/fsevents/LICENSE @@ -0,0 +1,22 @@ +MIT License +----------- + +Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/backend/node_modules/fsevents/README.md b/backend/node_modules/fsevents/README.md new file mode 100644 index 00000000..025c9a13 --- /dev/null +++ b/backend/node_modules/fsevents/README.md @@ -0,0 +1,83 @@ +# fsevents [](https://nodei.co/npm/fsevents/) + +Native access to MacOS FSEvents in [Node.js](https://nodejs.org/) + +The FSEvents API in MacOS allows applications to register for notifications of +changes to a given directory tree. It is a very fast and lightweight alternative +to kqueue. + +This is a low-level library. For a cross-platform file watching module that +uses fsevents, check out [Chokidar](https://github.com/paulmillr/chokidar). + +## Installation + +Supports only **Node.js v8.16 and higher**. + +```sh +npm install fsevents +``` + +## Usage + +```js +const fsevents = require('fsevents'); +const stop = fsevents.watch(__dirname, (path, flags, id) => { + const info = fsevents.getInfo(path, flags, id); +}); // To start observation +stop(); // To end observation +``` + +The callback passed as the second parameter to `.watch` get's called whenever the operating system detects a +a change in the file system. It takes three arguments: + +###### `fsevents.watch(dirname: string, (path: string, flags: number, id: string) => void): () => Promise<undefined>` + + * `path: string` - the item in the filesystem that have been changed + * `flags: number` - a numeric value describing what the change was + * `id: string` - an unique-id identifying this specific event + + Returns closer callback which when called returns a Promise resolving when the watcher process has been shut down. + +###### `fsevents.getInfo(path: string, flags: number, id: string): FsEventInfo` + +The `getInfo` function takes the `path`, `flags` and `id` arguments and converts those parameters into a structure +that is easier to digest to determine what the change was. + +The `FsEventsInfo` has the following shape: + +```js +/** + * @typedef {'created'|'modified'|'deleted'|'moved'|'root-changed'|'cloned'|'unknown'} FsEventsEvent + * @typedef {'file'|'directory'|'symlink'} FsEventsType + */ +{ + "event": "created", // {FsEventsEvent} + "path": "file.txt", + "type": "file", // {FsEventsType} + "changes": { + "inode": true, // Had iNode Meta-Information changed + "finder": false, // Had Finder Meta-Data changed + "access": false, // Had access permissions changed + "xattrs": false // Had xAttributes changed + }, + "flags": 0x100000000 +} +``` + +## Changelog + +- v2.3 supports Apple Silicon ARM CPUs +- v2 supports node 8.16+ and reduces package size massively +- v1.2.8 supports node 6+ +- v1.2.7 supports node 4+ + +## Troubleshooting + +- I'm getting `EBADPLATFORM` `Unsupported platform for fsevents` error. +- It's fine, nothing is broken. fsevents is macos-only. Other platforms are skipped. If you want to hide this warning, report a bug to NPM bugtracker asking them to hide ebadplatform warnings by default. + +## License + +The MIT License Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller — see LICENSE file. + +Visit our [GitHub page](https://github.com/fsevents/fsevents) and [NPM Page](https://npmjs.org/package/fsevents) diff --git a/backend/node_modules/fsevents/fsevents.d.ts b/backend/node_modules/fsevents/fsevents.d.ts new file mode 100644 index 00000000..2723c048 --- /dev/null +++ b/backend/node_modules/fsevents/fsevents.d.ts @@ -0,0 +1,46 @@ +declare type Event = "created" | "cloned" | "modified" | "deleted" | "moved" | "root-changed" | "unknown"; +declare type Type = "file" | "directory" | "symlink"; +declare type FileChanges = { + inode: boolean; + finder: boolean; + access: boolean; + xattrs: boolean; +}; +declare type Info = { + event: Event; + path: string; + type: Type; + changes: FileChanges; + flags: number; +}; +declare type WatchHandler = (path: string, flags: number, id: string) => void; +export declare function watch(path: string, handler: WatchHandler): () => Promise<void>; +export declare function watch(path: string, since: number, handler: WatchHandler): () => Promise<void>; +export declare function getInfo(path: string, flags: number): Info; +export declare const constants: { + None: 0x00000000; + MustScanSubDirs: 0x00000001; + UserDropped: 0x00000002; + KernelDropped: 0x00000004; + EventIdsWrapped: 0x00000008; + HistoryDone: 0x00000010; + RootChanged: 0x00000020; + Mount: 0x00000040; + Unmount: 0x00000080; + ItemCreated: 0x00000100; + ItemRemoved: 0x00000200; + ItemInodeMetaMod: 0x00000400; + ItemRenamed: 0x00000800; + ItemModified: 0x00001000; + ItemFinderInfoMod: 0x00002000; + ItemChangeOwner: 0x00004000; + ItemXattrMod: 0x00008000; + ItemIsFile: 0x00010000; + ItemIsDir: 0x00020000; + ItemIsSymlink: 0x00040000; + ItemIsHardlink: 0x00100000; + ItemIsLastHardlink: 0x00200000; + OwnEvent: 0x00080000; + ItemCloned: 0x00400000; +}; +export {}; diff --git a/backend/node_modules/fsevents/fsevents.js b/backend/node_modules/fsevents/fsevents.js new file mode 100644 index 00000000..f1b31c95 --- /dev/null +++ b/backend/node_modules/fsevents/fsevents.js @@ -0,0 +1,82 @@ +/* + ** © 2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller + ** Licensed under MIT License. + */ + +/* jshint node:true */ +"use strict"; + +if (process.platform !== "darwin") { + throw new Error(`Module 'fsevents' is not compatible with platform '${process.platform}'`); +} + +const Native = require("./fsevents.node"); +const events = Native.constants; + +function watch(path, since, handler) { + if (typeof path !== "string") { + throw new TypeError(`fsevents argument 1 must be a string and not a ${typeof path}`); + } + if ("function" === typeof since && "undefined" === typeof handler) { + handler = since; + since = Native.flags.SinceNow; + } + if (typeof since !== "number") { + throw new TypeError(`fsevents argument 2 must be a number and not a ${typeof since}`); + } + if (typeof handler !== "function") { + throw new TypeError(`fsevents argument 3 must be a function and not a ${typeof handler}`); + } + + let instance = Native.start(Native.global, path, since, handler); + if (!instance) throw new Error(`could not watch: ${path}`); + return () => { + const result = instance ? Promise.resolve(instance).then(Native.stop) : Promise.resolve(undefined); + instance = undefined; + return result; + }; +} + +function getInfo(path, flags) { + return { + path, + flags, + event: getEventType(flags), + type: getFileType(flags), + changes: getFileChanges(flags), + }; +} + +function getFileType(flags) { + if (events.ItemIsFile & flags) return "file"; + if (events.ItemIsDir & flags) return "directory"; + if (events.ItemIsSymlink & flags) return "symlink"; +} +function anyIsTrue(obj) { + for (let key in obj) { + if (obj[key]) return true; + } + return false; +} +function getEventType(flags) { + if (events.ItemRemoved & flags) return "deleted"; + if (events.ItemRenamed & flags) return "moved"; + if (events.ItemCreated & flags) return "created"; + if (events.ItemModified & flags) return "modified"; + if (events.RootChanged & flags) return "root-changed"; + if (events.ItemCloned & flags) return "cloned"; + if (anyIsTrue(flags)) return "modified"; + return "unknown"; +} +function getFileChanges(flags) { + return { + inode: !!(events.ItemInodeMetaMod & flags), + finder: !!(events.ItemFinderInfoMod & flags), + access: !!(events.ItemChangeOwner & flags), + xattrs: !!(events.ItemXattrMod & flags), + }; +} + +exports.watch = watch; +exports.getInfo = getInfo; +exports.constants = events; diff --git a/backend/node_modules/fsevents/fsevents.node b/backend/node_modules/fsevents/fsevents.node new file mode 100755 index 0000000000000000000000000000000000000000..00fac7e88bbc5ed249eaaac87b210a71e2646889 GIT binary patch literal 147128 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 a|NP;OOTMqX|CF;YDn9F9zx(qahW;OGU5pd} literal 0 HcmV?d00001 diff --git a/backend/node_modules/fsevents/package.json b/backend/node_modules/fsevents/package.json new file mode 100644 index 00000000..af6da84a --- /dev/null +++ b/backend/node_modules/fsevents/package.json @@ -0,0 +1,62 @@ +{ + "name": "fsevents", + "version": "2.3.2", + "description": "Native Access to MacOS FSEvents", + "main": "fsevents.js", + "types": "fsevents.d.ts", + "os": [ + "darwin" + ], + "files": [ + "fsevents.d.ts", + "fsevents.js", + "fsevents.node" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + }, + "scripts": { + "clean": "node-gyp clean && rm -f fsevents.node", + "build": "node-gyp clean && rm -f fsevents.node && node-gyp rebuild && node-gyp clean", + "test": "/bin/bash ./test.sh 2>/dev/null", + "prepublishOnly": "npm run build" + }, + "repository": { + "type": "git", + "url": "https://github.com/fsevents/fsevents.git" + }, + "keywords": [ + "fsevents", + "mac" + ], + "contributors": [ + { + "name": "Philipp Dunkel", + "email": "pip@pipobscure.com" + }, + { + "name": "Ben Noordhuis", + "email": "info@bnoordhuis.nl" + }, + { + "name": "Elan Shankar", + "email": "elan.shanker@gmail.com" + }, + { + "name": "Miroslav Bajtoš", + "email": "mbajtoss@gmail.com" + }, + { + "name": "Paul Miller", + "url": "https://paulmillr.com" + } + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/fsevents/fsevents/issues" + }, + "homepage": "https://github.com/fsevents/fsevents", + "devDependencies": { + "node-gyp": "^6.1.0" + } +} diff --git a/backend/server.js b/backend/server.js index a7e67d31..9921a9ac 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,112 +1,114 @@ -const { createClient } = require('@supabase/supabase-js'); -const express = require('express'); -const cors = require('cors'); +const { createClient } = require("@supabase/supabase-js"); +const express = require("express"); +const cors = require("cors"); const app = express(); -const jwt = require('jsonwebtoken'); -require('dotenv').config(); -const authRouter = require('./auth'); +const jwt = require("jsonwebtoken"); +require("dotenv").config(); +const authRouter = require("./auth"); -const supabaseUrl = 'https://ppayoicayizfiezyqdtf.supabase.co'; -const supabaseKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InBwYXlvaWNheWl6ZmllenlxZHRmIiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODI0NDU2NzcsImV4cCI6MTk5ODAyMTY3N30.8BhS7mRtSyEZKeQMg9B80A_Tv9PbocQZjCQ0ZU3YisI'; +const supabaseUrl = "https://ppayoicayizfiezyqdtf.supabase.co"; +const supabaseKey = + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InBwYXlvaWNheWl6ZmllenlxZHRmIiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODI0NDU2NzcsImV4cCI6MTk5ODAyMTY3N30.8BhS7mRtSyEZKeQMg9B80A_Tv9PbocQZjCQ0ZU3YisI"; const supabase = createClient(supabaseUrl, supabaseKey); -const JWT_SECRET = 'TlJ2sQP1bhiEIqYXTFaS/LV/MQTtC9DUX4WLqKwkJ9X3uYGAfJhId7ZLq0HdNyPsmvo831W7/4pZDa1Bw1YCsQ==' - - +const JWT_SECRET = + "TlJ2sQP1bhiEIqYXTFaS/LV/MQTtC9DUX4WLqKwkJ9X3uYGAfJhId7ZLq0HdNyPsmvo831W7/4pZDa1Bw1YCsQ=="; const corsOptions = { - origin: 'http://localhost:3000', // allow requests from this origin - optionsSuccessStatus: 200// return 200 instead of 204 for OPTIONS requests + origin: "http://localhost:3000", // allow requests from this origin + optionsSuccessStatus: 200, // return 200 instead of 204 for OPTIONS requests + credentials: true, }; app.use(cors(corsOptions)); app.use(express.json()); -app.use('/auth', authRouter); +app.use("/auth", authRouter); function verifyToken(req, res, next) { - const token = req.headers.authorization?.split(' ')[1]; + const token = req.headers.authorization?.split(" ")[1]; if (!token) { - return res.status(401).json({ message: 'Authorization token is missing' }); + return res.status(401).json({ message: "Authorization token is missing" }); } try { const decoded = jwt.verify(token, JWT_SECRET); req.user = decoded; next(); } catch (error) { - return res.status(401).json({ message: 'Authorization token is invalid or expired' }); + return res + .status(401) + .json({ message: "Authorization token is invalid or expired" }); } } -app.get('/api/test', verifyToken, (req, res) => { - res.json({ message: 'Authorization successful', user: req.user }); +app.get("/api/test", verifyToken, (req, res) => { + res.json({ message: "Authorization successful", user: req.user }); }); -app.post('/api/signup',async (req, res) => { +app.post("/api/signup", async (req, res) => { const { email, password } = req.body; - console.log('email here', email); - console.log(password); + console.log("email here", email); + console.log(password); // email validation if (!email || !password) { - return res.json({ message: 'Email and password are required' }); + return res.json({ message: "Email and password are required" }); } - if (!email.endsWith('@surrey.ac.uk')) { - return res.json({ message: 'Email must end with @surrey.ac.uk' }); + if (!email.endsWith("@surrey.ac.uk")) { + return res.json({ message: "Email must end with @surrey.ac.uk" }); } if (password.length < 6) { - return res.json({ message: 'Password must be at least 6 characters long' }); + return res.json({ message: "Password must be at least 6 characters long" }); } const user = { email, password }; try { - console.log('backend connection made.'); - const { data: { user } } = await supabase.auth.signUp({ email, password }); + console.log("backend connection made."); + const { + data: { user }, + } = await supabase.auth.signUp({ email, password }); // Generate a JWT token const token = jwt.sign({ userId: user.id }, JWT_SECRET); - console.log("successful sign up") - return res.status(200).json({ message: 'Sign up successful.', user, token }); - + console.log("successful sign up"); + return res + .status(200) + .json({ message: "Sign up successful.", user, token }); } catch (error) { console.error(error.message); - res.json({ message: 'Email already exists.' }); + res.json({ message: "Email already exists." }); } }); - -app.post('/api/signin', async (req, res) => { +app.post("/api/signin", async (req, res) => { const { email, password } = req.body; // Email and password validation if (!email || !password) { - return res.json({ message: 'Email and password are required' }); + return res.json({ message: "Email and password are required" }); } const user = { email, password }; try { // Attempt to sign in the user with Supabase - const { data: { user }, error } = await supabase.auth.signInWithPassword({email, password }); + const { + data: { user }, + error, + } = await supabase.auth.signInWithPassword({ email, password }); if (error) throw error; // Generate a JWT token - const token = jwt.sign({ userId: user.id }, JWT_SECRET, - { expiresIn: '1h' }); + const token = jwt.sign({ userId: user.id }, JWT_SECRET, { + expiresIn: "1h", + }); // Return success message and user data - console.log("successful sign in") - return res.status(200).json({ message: 'Sign In Successful.', user, token }); - + console.log("successful sign in"); + return res + .status(200) + .json({ message: "Sign In Successful.", user, token }); } catch (error) { console.error(error.message); - return res.json({ message: 'Failed to sign in' }); + return res.json({ message: "Failed to sign in" }); } }); -app.get('/', (req, res) => { - res.send('Hello, world!'); +app.get("/", (req, res) => { + res.send("Hello, world!"); }); - - - - - - - process.env.PORT = 8080; // Start server app.listen(process.env.PORT, () => { console.log(`hii Server started on port ${process.env.PORT}`); }); - -- GitLab