diff --git a/.gitignore b/.gitignore index 3e9f1d2..5111ece 100755 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ certificate.key package-lock.json ._* .DS_Store -dist/ \ No newline at end of file +dist/ +rds-combined-ca-bundle.pem \ No newline at end of file diff --git a/backend/controllers/storage.js b/backend/controllers/storage.js deleted file mode 100644 index 4205c6c..0000000 --- a/backend/controllers/storage.js +++ /dev/null @@ -1,31 +0,0 @@ -const env = require("../enviroment/env") -const disk = require('diskusage'); - -class StorageController { - - constructor() { - - } - - async getStorageInfo(req, res) { - - if (!req.user) { - - return; - } - - try { - - const info = await disk.check(env.root); - - res.send(info) - - } catch (e) { - - console.log(e); - res.status(500).send(e); - } - } -} - -module.exports = StorageController; \ No newline at end of file diff --git a/backend/controllers/storage.ts b/backend/controllers/storage.ts new file mode 100644 index 0000000..fc8c5be --- /dev/null +++ b/backend/controllers/storage.ts @@ -0,0 +1,38 @@ +import disk from "diskusage"; +import env from "../enviroment/env"; +import { Request, Response } from "express"; +import { UserInterface } from "../models/user"; + +interface RequestType extends Request { + user?: UserInterface, + auth?: any, +} + +class StorageController { + + constructor() { + + } + + getStorageInfo = async(req: RequestType, res: Response) => { + + if (!req.user) { + + return; + } + + try { + + const info = await disk.check(env.root!); + + res.send(info) + + } catch (e) { + + console.log(e); + res.status(500).send(e); + } + } +} + +export default StorageController; \ No newline at end of file diff --git a/backend/controllers/user.js b/backend/controllers/user.ts similarity index 67% rename from backend/controllers/user.js rename to backend/controllers/user.ts index 6dd9202..6533b27 100644 --- a/backend/controllers/user.js +++ b/backend/controllers/user.ts @@ -1,21 +1,31 @@ -const env = require("../enviroment/env"); -const UserService = require("../services/UserService") + +import env from "../enviroment/env"; +import UserService from "../services/UserService"; +import { Request, Response } from "express"; +import { UserInterface } from "../models/user"; const UserProvider = new UserService(); +interface RequestType extends Request { + user?: UserInterface, + auth?: any, + busboy?: any, + encryptedToken?: any +} + class UserController { constructor() { } - async getUser(req, res) { + getUser = async(req: RequestType, res: Response) => { try { - const user = req.user; - user.tokens = undefined; - user.tempTokens = undefined; - user.password = undefined; + const user = req.user!; + user.tokens = []; + user.tempTokens = []; + user.password = ''; user.privateKey = undefined; user.publicKey = undefined; @@ -27,7 +37,7 @@ class UserController { } } - async login(req, res) { + login = async(req: RequestType, res: Response) => { try { @@ -35,9 +45,9 @@ class UserController { const {user, token} = await UserProvider.login(body); - user.tokens = undefined; - user.tempTokens = undefined; - user.password = undefined; + user.tokens = []; + user.tempTokens = []; + user.password = ''; user.privateKey = undefined; user.publicKey = undefined; @@ -52,7 +62,7 @@ class UserController { } } - async logout(req, res) { + logout = async(req: RequestType, res: Response) => { if (!req.user) { @@ -74,13 +84,13 @@ class UserController { } } - async logoutAll(req, res) { + logoutAll = async(req: RequestType, res: Response) => { try { const user = req.user; - await UserProvider.logoutAll(user); + await UserProvider.logoutAll(user!); res.send(); @@ -90,7 +100,7 @@ class UserController { } } - async createUser(req, res) { + createUser = async(req: RequestType, res: Response) => { if (env.createAcctBlocked) { @@ -101,9 +111,9 @@ class UserController { const {user, token} = await UserProvider.create(req.body); - user.tokens = undefined; - user.tempTokens = undefined; - user.password = undefined; + user.tokens = []; + user.tempTokens = [] + user.password = ''; user.privateKey = undefined; user.publicKey = undefined; @@ -118,7 +128,7 @@ class UserController { } } - async changePassword(req, res) { + changePassword = async(req: RequestType, res: Response) => { if (!req.user) { @@ -145,4 +155,4 @@ class UserController { } } -module.exports = UserController; \ No newline at end of file +export default UserController; \ No newline at end of file diff --git a/backend/db/mongoose.js b/backend/db/mongoose.js index 9e5fb05..6c6e0a4 100644 --- a/backend/db/mongoose.js +++ b/backend/db/mongoose.js @@ -1,10 +1,29 @@ const mongoose = require("mongoose"); -const env = require("../enviroment/env"); +const env = require("../enviroment/env.js"); +const fs = require("fs"); + +if (env.useDocumentDB === "true") { + + console.log("Using DocumentDB"); + + mongoose.connect(env.mongoURL, { + useNewUrlParser: true, + useCreateIndex: true, + useUnifiedTopology: true, + sslValidate: true, + useNewUrlParser: true, + sslCA: fs.readFileSync('./rds-combined-ca-bundle.pem') + }) + +} else { + + mongoose.connect(env.mongoURL, { + useNewUrlParser: true, + useCreateIndex: true, + useUnifiedTopology: true, + }) +} + -mongoose.connect(env.mongoURL, { - useNewUrlParser: true, - useCreateIndex: true, - useUnifiedTopology: true, -}) module.exports = mongoose; \ No newline at end of file diff --git a/backend/enviroment/env.js b/backend/enviroment/env.js index 3fc3d0e..5c29287 100644 --- a/backend/enviroment/env.js +++ b/backend/enviroment/env.js @@ -1,4 +1,4 @@ -module.exports = { +export default { key: process.env.KEY, newKey: process.env.NEW_KEY, password: process.env.PASSWORD, @@ -10,5 +10,6 @@ module.exports = { fsDirectory: process.env.FS_DIRECTORY, s3ID: process.env.S3_ID, s3Key: process.env.S3_KEY, - s3Bucket: process.env.S3_BUCKET + s3Bucket: process.env.S3_BUCKET, + useDocumentDB: process.env.USE_DOCUMENT_DB } \ No newline at end of file diff --git a/backend/express-routers/storage.ts b/backend/express-routers/storage.ts index f5a4966..ad32310 100644 --- a/backend/express-routers/storage.ts +++ b/backend/express-routers/storage.ts @@ -1,7 +1,7 @@ import {Router} from "express"; const router = Router(); const auth = require("../middleware/auth"); -const StorageController = require("../controllers/storage"); +import StorageController from "../controllers/storage"; const storageController = new StorageController(); router.get("/storage-service/info", auth, storageController.getStorageInfo); diff --git a/backend/express-routers/user.ts b/backend/express-routers/user.ts index 3a376de..c2ecd56 100644 --- a/backend/express-routers/user.ts +++ b/backend/express-routers/user.ts @@ -1,7 +1,8 @@ -import {Router} from "express"; +import { Router } from "express"; const router = Router(); const auth = require("../middleware/auth"); -const UserController = require("../controllers/user"); +import UserController from "../controllers/user"; + const userController = new UserController(); router.get("/user-service/user", auth, userController.getUser); diff --git a/backend/models/user.ts b/backend/models/user.ts index 3ac9450..5382bb3 100644 --- a/backend/models/user.ts +++ b/backend/models/user.ts @@ -72,6 +72,10 @@ export interface UserInterface extends Document { generateTempAuthToken: () => any; generateTempAuthTokenVideo: (cookie: string) => any; encryptToken: (tempToken: any, key: any, publicKey: any) => any; + findByCreds: (email: string, password: string) => UserInterface; + generateAuthToken: () => any; + generateEncryptionKeys: () => Promise; + changeEncryptionKey: (randomKey: Buffer) => void; } // userSchema.virtual("files", { @@ -222,7 +226,7 @@ userSchema.methods.getEncryptionKey = function() { } } -userSchema.methods.changeEncryptionKey = async function(randomKey: string) { +userSchema.methods.changeEncryptionKey = async function(randomKey: Buffer) { const user = this; const userPassword = user.password; diff --git a/backend/services/UserService/index.js b/backend/services/UserService/index.js deleted file mode 100644 index 48c376d..0000000 --- a/backend/services/UserService/index.js +++ /dev/null @@ -1,79 +0,0 @@ -import User from "../../models/user"; -const bcrypt = require("bcrypt"); -const crypto = require("crypto"); -const NotFoundError = require("../../utils/NotFoundError"); -const InternalServerError = require("../../utils/InternalServerError"); -const NotAuthorizedError = require("../../utils/NotAuthorizedError"); - -const UserService = function() { - - this.login = async(userData) => { - - const email = userData.email; - const password = userData.password; - - const user = await User.findByCreds(email, password); - - const token = await user.generateAuthToken(); - - if (!user || !token) throw new NotFoundError("Login User Not Found Error"); - - return {user, token} - } - - this.logout = async(user, userToken) => { - - user.tokens = user.tokens.filter((token) => { - return token.token !== userToken; - }) - - await user.save(); - } - - this.logoutAll = async(user) => { - - user.tokens = [] - user.tempTokens = []; - - await user.save(); - } - - this.create = async(userData) => { - - console.log("Create"); - - const user = new User(userData); - await user.save(); - - await user.generateEncryptionKeys(); - - const token = await user.generateAuthToken(); - - if (!user || !token) throw new InternalServerError("Could Not Create New User Error"); - - return {user, token} - } - - this.changePassword = async(user, oldPassword, newPassword) => { - - const isMatch = await bcrypt.compare(oldPassword, user.password); - - if (!isMatch) throw new NotAuthorizedError("Change Passwords Do Not Match Error"); - - const encryptionKey = user.getEncryptionKey(); - - user.password = newPassword; - - user.tokens = []; - user.tempTokens = []; - - await user.save(); - await user.changeEncryptionKey(encryptionKey); - - const newToken = await user.generateAuthToken(); - - return newToken; - } -} - -module.exports = UserService; \ No newline at end of file diff --git a/backend/services/UserService/index.ts b/backend/services/UserService/index.ts new file mode 100644 index 0000000..4e0232d --- /dev/null +++ b/backend/services/UserService/index.ts @@ -0,0 +1,167 @@ +import User, {UserInterface} from "../../models/user"; +const bcrypt = require("bcrypt"); +const crypto = require("crypto"); +const NotFoundError = require("../../utils/NotFoundError"); +const InternalServerError = require("../../utils/InternalServerError"); +const NotAuthorizedError = require("../../utils/NotAuthorizedError"); + +type UserDataType = { + email: string, + password: string, +} + +const uknownUserType = User as unknown; + +const UserStaticType = uknownUserType as { + findByCreds: (email: string, password: string) => Promise; +}; + + +class UserService { + + constructor() { + + } + + login = async(userData: UserDataType) => { + + const email = userData.email; + const password = userData.password; + + const user = await UserStaticType.findByCreds(email, password); + + const token = await user.generateAuthToken(); + + if (!user || !token) throw new NotFoundError("Login User Not Found Error"); + + return {user, token} + } + + logout = async(user: UserInterface, userToken: any) => { + + user.tokens = user.tokens.filter((token) => { + return token.token !== userToken; + }) + + await user.save(); + } + + logoutAll = async(user: UserInterface) => { + + user.tokens = [] + user.tempTokens = []; + + await user.save(); + } + + create = async(userData: any) => { + + console.log("Create"); + + const user = new User(userData); + await user.save(); + + await user.generateEncryptionKeys(); + + const token = await user.generateAuthToken(); + + if (!user || !token) throw new InternalServerError("Could Not Create New User Error"); + + return {user, token} + } + + changePassword = async(user: UserInterface, oldPassword: string, newPassword: string) => { + + const isMatch = await bcrypt.compare(oldPassword, user.password); + + if (!isMatch) throw new NotAuthorizedError("Change Passwords Do Not Match Error"); + + const encryptionKey = user.getEncryptionKey(); + + user.password = newPassword; + + user.tokens = []; + user.tempTokens = []; + + await user.save(); + await user.changeEncryptionKey(encryptionKey!); + + const newToken = await user.generateAuthToken(); + + return newToken; + } + +} + +// const UserService = function() { + +// this.login = async(userData) => { + +// const email = userData.email; +// const password = userData.password; + +// const user = await User.findByCreds(email, password); + +// const token = await user.generateAuthToken(); + +// if (!user || !token) throw new NotFoundError("Login User Not Found Error"); + +// return {user, token} +// } + +// this.logout = async(user, userToken) => { + +// user.tokens = user.tokens.filter((token) => { +// return token.token !== userToken; +// }) + +// await user.save(); +// } + +// this.logoutAll = async(user) => { + +// user.tokens = [] +// user.tempTokens = []; + +// await user.save(); +// } + +// this.create = async(userData) => { + +// console.log("Create"); + +// const user = new User(userData); +// await user.save(); + +// await user.generateEncryptionKeys(); + +// const token = await user.generateAuthToken(); + +// if (!user || !token) throw new InternalServerError("Could Not Create New User Error"); + +// return {user, token} +// } + +// this.changePassword = async(user, oldPassword, newPassword) => { + +// const isMatch = await bcrypt.compare(oldPassword, user.password); + +// if (!isMatch) throw new NotAuthorizedError("Change Passwords Do Not Match Error"); + +// const encryptionKey = user.getEncryptionKey(); + +// user.password = newPassword; + +// user.tokens = []; +// user.tempTokens = []; + +// await user.save(); +// await user.changeEncryptionKey(encryptionKey); + +// const newToken = await user.generateAuthToken(); + +// return newToken; +// } +// } + +export default UserService; \ No newline at end of file