added access token refresher, renamed files

This commit is contained in:
subnub
2024-12-30 09:05:37 -05:00
parent fcddd7d54a
commit 4a321e3609
17 changed files with 82 additions and 112 deletions
+1
View File
@@ -6,6 +6,7 @@ config/test.env
config/.env.development
config/.env.test
config/.env.production
config/.env.test
.env.development
.env.test
.env.production
+23
View File
@@ -0,0 +1,23 @@
MONGODB_URL=
DB_TYPE=
HTTP_PORT=
HTTPS_PORT=
PASSWORD_ACCESS=
PASSWORD_REFRESH=
PASSWORD_COOKIE=
_SECURE_COOKIES=
FS_DIRECTORY=
KEY=
EMAIL_VERIFICATION=
EMAIL_DOMAIN=
EMAIL_ADDRESS=
EMAIL_API_KEY=
EMAIL_HOST=
REMOTE_URL=
S3_ID=
S3_KEY=
S3_BUCKET=
URL=
TEMP_DIRECTORY=
VIDEO_THUMBNAILS_ENABLED=
TEMP_VIDEO_THUMBNAIL_LIMIT=
+7 -3
View File
@@ -3,11 +3,15 @@ import crypto from "crypto";
import getKeyFromTerminal from "../utils/getKeyFromTerminal";
const getKey = async () => {
if (process.env.KEY || process.env.NODE_ENV === "development") {
if (
process.env.KEY ||
process.env.NODE_ENV === "development" ||
process.env.NODE_ENV === "test"
) {
const password = process.env.KEY;
if (!password) {
console.log("Key is required for development server");
throw new Error("Key is required for development server");
console.log(`Key is required for ${process.env.NODE_ENV} server`);
throw new Error(`Key is required for ${process.env.NODE_ENV} server`);
}
env.key = crypto.createHash("md5").update(password).digest("hex");
-5
View File
@@ -77,11 +77,6 @@ const authRefresh = async (
}
}
if (!tokenFound) {
console.log("token not found", encryptedToken);
console.log("token list", user.tokens);
}
if (!tokenFound) throw new Error("Refresh Token Not Found");
req.user = user;
-95
View File
@@ -1,95 +0,0 @@
import express, { Request, Response } from "express";
import http from "http";
import path from "path";
import bodyParser from "body-parser";
import fs from "fs";
const app = express();
const getWebUIKey = () => {
console.log("Starting Server...\n");
const publicPath = path.join(__dirname, "..", "..", "webUISetup");
return new Promise<string>((resolve, reject) => {
app.use(express.static(publicPath));
app.use(express.json());
app.use(bodyParser.json({ limit: "50mb" }));
app.use(
bodyParser.urlencoded({
limit: "50mb",
extended: true,
parameterLimit: 50000,
})
);
app.post("/submit", async (req: Request, res: Response) => {
console.log("Response");
await createConfigFiles(req.body.clientObj, req.body.serverObj);
res.send();
});
app.get("*", (req: Request, res: Response) => {
res.sendFile(path.join(publicPath, "index.html"));
});
const port = process.env.HTTP_PORT || process.env.PORT || "3000";
const url = process.env.DOCKER ? undefined : "localhost";
const server = http.createServer(app) as any;
server.listen(port, () => {
console.log(
`\nPlease navigate to http://localhost:${port} to enter setup details\n`
);
});
});
};
const awaitcreateDir = (path: any) => {
return new Promise<void>((resolve, reject) => {
fs.mkdir(path, () => {
resolve();
});
});
};
const awaitWriteFile = (path: string, data: string) => {
return new Promise<void>((resolve, reject) => {
fs.writeFile(path, data, async (err: any) => {
if (err) {
console.log("file write error", err);
reject();
}
resolve();
});
});
};
const createConfigFiles = async (clientObj: any, serverObj: any) => {
await awaitcreateDir("./config");
let totalClientString = "";
let totalServerString = "";
for (let currentKey in clientObj) {
totalClientString += `${currentKey}=${clientObj[currentKey]}\n`;
}
for (let currentKey in serverObj) {
totalServerString += `${currentKey}=${serverObj[currentKey]}\n`;
}
if (serverObj.DOCKER) {
const combinedStrings = totalClientString + totalServerString;
await awaitWriteFile("./docker-variables.env", combinedStrings);
} else {
await awaitWriteFile("./.env.production", totalClientString);
await awaitWriteFile("./config/prod.env", totalServerString);
}
console.log("File(s) Created");
};
getWebUIKey();
+1 -1
View File
@@ -1,6 +1,6 @@
import { QueryFunctionContext } from "react-query";
import axios from "../axiosInterceptor";
import { getUserToken } from "./user";
import { getUserToken } from "./userAPI";
import getBackendURL from "../utils/getBackendURL";
interface QueryKeyParams {
+1 -1
View File
@@ -1,6 +1,6 @@
import { QueryFunctionContext } from "react-query";
import axios from "../axiosInterceptor";
import { getUserToken } from "./user";
import { getUserToken } from "./userAPI";
import getBackendURL from "../utils/getBackendURL";
interface QueryKeyParams {
+9
View File
@@ -45,6 +45,15 @@ export const logoutAllAPI = async () => {
return response.data;
};
export const getAccessToken = async (uuid: string) => {
const response = await axios.post("/user-service/get-token", undefined, {
headers: {
uuid,
},
});
return response.data;
};
// PATCH
export const changePasswordAPI = async (
+1 -1
View File
@@ -4,7 +4,7 @@ import {
getUserAPI,
loginAPI,
sendPasswordResetAPI,
} from "../../api/user";
} from "../../api/userAPI";
import { useLocation, useNavigate } from "react-router-dom";
import { setUser } from "../../reducers/user";
import { useAppDispatch } from "../../hooks/store";
@@ -2,7 +2,7 @@ import { useNavigate, useParams } from "react-router-dom";
import Spinner from "../Spinner/Spinner";
import { ToastContainer, toast } from "react-toastify";
import { useState } from "react";
import { resetPasswordAPI } from "../../api/user";
import { resetPasswordAPI } from "../../api/userAPI";
import AlertIcon from "../../icons/AlertIcon";
const ResetPasswordPage = () => {
@@ -1,7 +1,7 @@
import React, { useRef, useState } from "react";
import SettingsChangePasswordPopup from "./SettingsChangePasswordPopup";
import { toast } from "react-toastify";
import { logoutAPI, resendVerifyEmailAPI } from "../../api/user";
import { logoutAPI, resendVerifyEmailAPI } from "../../api/userAPI";
import Swal from "sweetalert2";
import { useNavigate } from "react-router-dom";
@@ -2,7 +2,7 @@ import { useMemo, useState } from "react";
import CloseIcon from "../../icons/CloseIcon";
import classNames from "classnames";
import { toast } from "react-toastify";
import { changePasswordAPI } from "../../api/user";
import { changePasswordAPI } from "../../api/userAPI";
interface SettingsChangePasswordPopupProps {
closePopup: () => void;
+1 -1
View File
@@ -6,7 +6,7 @@ import AccountIcon from "../../icons/AccountIcon";
import TuneIcon from "../../icons/TuneIcon";
import { useNavigate } from "react-router-dom";
import SettingsAccountSection from "./SettingsAccountSection";
import { getUserDetailedAPI, logoutAPI } from "../../api/user";
import { getUserDetailedAPI, logoutAPI } from "../../api/userAPI";
import Spinner from "../Spinner/Spinner";
import Swal from "sweetalert2";
import SettingsGeneralSection from "./SettingsGeneralSection";
@@ -1,5 +1,5 @@
import { useParams } from "react-router-dom";
import { verifyEmailAPI } from "../../api/user";
import { verifyEmailAPI } from "../../api/userAPI";
import { toast, ToastContainer } from "react-toastify";
import { useEffect } from "react";
+26
View File
@@ -0,0 +1,26 @@
import { useCallback, useEffect } from "react";
import { getAccessToken } from "../api/userAPI";
import uuid from "uuid";
const useAccessTokenHandler = () => {
const refreshAccessToken = useCallback(async () => {
try {
const randomID = uuid.v4();
localStorage.setItem("browser-id", randomID);
await getAccessToken(randomID);
} catch (e) {
console.log("Error refreshing access token", e);
}
}, []);
useEffect(() => {
refreshAccessToken();
const timer = setInterval(refreshAccessToken, 60 * 1000 * 20);
return () => {
clearInterval(timer);
};
}, []);
};
export default useAccessTokenHandler;
+6 -1
View File
@@ -4,11 +4,13 @@ import { UserType } from "../types/user";
interface UserStateType {
user?: null | UserType;
loggedIn: boolean;
lastRefreshed: number;
}
const initialState: UserStateType = {
user: null,
loggedIn: false,
lastRefreshed: 0,
};
const userSlice = createSlice({
@@ -19,9 +21,12 @@ const userSlice = createSlice({
state.user = action.payload;
state.loggedIn = true;
},
setLastRefreshed: (state) => {
state.lastRefreshed = Date.now();
},
},
});
export const { setUser } = userSlice.actions;
export const { setUser, setLastRefreshed } = userSlice.actions;
export default userSlice.reducer;
+2
View File
@@ -17,11 +17,13 @@ import ResetPasswordPage from "../components/ResetPasswordPage/ResetPasswordPage
import SettingsPage from "../components/SettingsPage/SettingsPage";
import Homepage from "../components/Homepage/Homepage";
import { usePreferenceSetter } from "../hooks/preferenceSetter";
import useAccessTokenHandler from "../hooks/user";
// export const history = createHistory();
const AppRouter = () => {
usePreferenceSetter();
useAccessTokenHandler();
return (
<BrowserRouter>