From 3067cee08c0a01f0868f44aea3c6ce04e4d6c328 Mon Sep 17 00:00:00 2001 From: marcobaobao Date: Fri, 23 Jun 2023 15:18:40 +0200 Subject: [PATCH] code refactoring, fixed wrong jwt expire time --- .../src/features/settings/settingsSlice.ts | 173 +++++++++--------- frontend/src/lib/argsParser.ts | 106 +++++------ frontend/src/utils.ts | 2 +- frontend/src/views/Home.tsx | 4 +- server/rest/handlers.go | 6 +- 5 files changed, 151 insertions(+), 140 deletions(-) diff --git a/frontend/src/features/settings/settingsSlice.ts b/frontend/src/features/settings/settingsSlice.ts index 0eafa42..3fa0d09 100644 --- a/frontend/src/features/settings/settingsSlice.ts +++ b/frontend/src/features/settings/settingsSlice.ts @@ -1,99 +1,108 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit" -export type LanguageUnion = "english" | "chinese" | "russian" | "italian" | "spanish" | "korean" | "japanese" | "catalan" +export type LanguageUnion = + | "english" + | "chinese" + | "russian" + | "italian" + | "spanish" + | "korean" + | "japanese" + | "catalan" + export type ThemeUnion = "light" | "dark" export interface SettingsState { - serverAddr: string - serverPort: string - language: LanguageUnion - theme: ThemeUnion - cliArgs: string - formatSelection: boolean - ratelimit: string - fileRenaming: boolean - pathOverriding: boolean - enableCustomArgs: boolean - listView: boolean + serverAddr: string + serverPort: string + language: LanguageUnion + theme: ThemeUnion + cliArgs: string + formatSelection: boolean + ratelimit: string + fileRenaming: boolean + pathOverriding: boolean + enableCustomArgs: boolean + listView: boolean } const initialState: SettingsState = { - serverAddr: localStorage.getItem("server-addr") || window.location.hostname, - serverPort: localStorage.getItem("server-port") || window.location.port, - language: (localStorage.getItem("language") || "english") as LanguageUnion, - theme: (localStorage.getItem("theme") || "light") as ThemeUnion, - cliArgs: localStorage.getItem("cli-args") ?? "", - formatSelection: localStorage.getItem("format-selection") === "true", - ratelimit: localStorage.getItem("rate-limit") ?? "", - fileRenaming: localStorage.getItem("file-renaming") === "true", - pathOverriding: localStorage.getItem("path-overriding") === "true", - enableCustomArgs: localStorage.getItem("enable-custom-args") === "true", - listView: localStorage.getItem("listview") === "true", + serverAddr: localStorage.getItem("server-addr") || window.location.hostname, + serverPort: localStorage.getItem("server-port") || window.location.port, + language: (localStorage.getItem("language") || "english") as LanguageUnion, + theme: (localStorage.getItem("theme") || "light") as ThemeUnion, + cliArgs: localStorage.getItem("cli-args") ?? "", + formatSelection: localStorage.getItem("format-selection") === "true", + ratelimit: localStorage.getItem("rate-limit") ?? "", + fileRenaming: localStorage.getItem("file-renaming") === "true", + pathOverriding: localStorage.getItem("path-overriding") === "true", + enableCustomArgs: localStorage.getItem("enable-custom-args") === "true", + listView: localStorage.getItem("listview") === "true", } export const settingsSlice = createSlice({ - name: "settings", - initialState, - reducers: { - setServerAddr: (state, action: PayloadAction) => { - state.serverAddr = action.payload - localStorage.setItem("server-addr", action.payload) - }, - setServerPort: (state, action: PayloadAction) => { - state.serverPort = action.payload - localStorage.setItem("server-port", action.payload) - }, - setLanguage: (state, action: PayloadAction) => { - state.language = action.payload - localStorage.setItem("language", action.payload) - }, - setCliArgs: (state, action: PayloadAction) => { - state.cliArgs = action.payload - localStorage.setItem("cli-args", action.payload) - }, - setTheme: (state, action: PayloadAction) => { - state.theme = action.payload - localStorage.setItem("theme", action.payload) - }, - setFormatSelection: (state, action: PayloadAction) => { - state.formatSelection = action.payload - localStorage.setItem("format-selection", action.payload.toString()) - }, - setRateLimit: (state, action: PayloadAction) => { - state.ratelimit = action.payload - localStorage.setItem("rate-limit", action.payload) - }, - setPathOverriding: (state, action: PayloadAction) => { - state.pathOverriding = action.payload - localStorage.setItem("path-overriding", action.payload.toString()) - }, - setFileRenaming: (state, action: PayloadAction) => { - state.fileRenaming = action.payload - localStorage.setItem("file-renaming", action.payload.toString()) - }, - setEnableCustomArgs: (state, action: PayloadAction) => { - state.enableCustomArgs = action.payload - localStorage.setItem("enable-custom-args", action.payload.toString()) - }, - toggleListView: (state) => { - state.listView = !state.listView - localStorage.setItem("listview", state.listView.toString()) - }, - } + name: "settings", + initialState, + reducers: { + setServerAddr: (state, action: PayloadAction) => { + state.serverAddr = action.payload + localStorage.setItem("server-addr", action.payload) + }, + setServerPort: (state, action: PayloadAction) => { + state.serverPort = action.payload + localStorage.setItem("server-port", action.payload) + }, + setLanguage: (state, action: PayloadAction) => { + state.language = action.payload + localStorage.setItem("language", action.payload) + }, + setCliArgs: (state, action: PayloadAction) => { + state.cliArgs = action.payload + localStorage.setItem("cli-args", action.payload) + }, + setTheme: (state, action: PayloadAction) => { + state.theme = action.payload + localStorage.setItem("theme", action.payload) + }, + setFormatSelection: (state, action: PayloadAction) => { + state.formatSelection = action.payload + localStorage.setItem("format-selection", action.payload.toString()) + }, + setRateLimit: (state, action: PayloadAction) => { + state.ratelimit = action.payload + localStorage.setItem("rate-limit", action.payload) + }, + setPathOverriding: (state, action: PayloadAction) => { + state.pathOverriding = action.payload + localStorage.setItem("path-overriding", action.payload.toString()) + }, + setFileRenaming: (state, action: PayloadAction) => { + state.fileRenaming = action.payload + localStorage.setItem("file-renaming", action.payload.toString()) + }, + setEnableCustomArgs: (state, action: PayloadAction) => { + state.enableCustomArgs = action.payload + localStorage.setItem("enable-custom-args", action.payload.toString()) + }, + toggleListView: (state) => { + state.listView = !state.listView + localStorage.setItem("listview", state.listView.toString()) + }, + } }) export const { - setLanguage, - setCliArgs, - setTheme, - setServerAddr, - setServerPort, - setFormatSelection, - setRateLimit, - setFileRenaming, - setPathOverriding, - setEnableCustomArgs, - toggleListView + setLanguage, + setCliArgs, + setTheme, + setServerAddr, + setServerPort, + setFormatSelection, + setRateLimit, + setFileRenaming, + setPathOverriding, + setEnableCustomArgs, + toggleListView } = settingsSlice.actions export default settingsSlice.reducer \ No newline at end of file diff --git a/frontend/src/lib/argsParser.ts b/frontend/src/lib/argsParser.ts index fec1fb2..c9709fa 100644 --- a/frontend/src/lib/argsParser.ts +++ b/frontend/src/lib/argsParser.ts @@ -1,61 +1,61 @@ export class CliArguments { - private _extractAudio: boolean - private _noMTime: boolean - private _proxy: string + private _extractAudio: boolean + private _noMTime: boolean + private _proxy: string - constructor(extractAudio = false, noMTime = true) { - this._extractAudio = extractAudio - this._noMTime = noMTime - this._proxy = "" + constructor(extractAudio = false, noMTime = true) { + this._extractAudio = extractAudio + this._noMTime = noMTime + this._proxy = "" + } + + public get extractAudio(): boolean { + return this._extractAudio + } + + public toggleExtractAudio() { + this._extractAudio = !this._extractAudio + return this + } + + public disableExtractAudio() { + this._extractAudio = false + return this + } + + public get noMTime(): boolean { + return this._noMTime + } + + public toggleNoMTime() { + this._noMTime = !this._noMTime + return this + } + + public toString(): string { + let args = '' + + if (this._extractAudio) { + args += '-x ' } - public get extractAudio(): boolean { - return this._extractAudio + if (this._noMTime) { + args += '--no-mtime ' } - public toggleExtractAudio() { - this._extractAudio = !this._extractAudio - return this - } - - public disableExtractAudio() { - this._extractAudio = false - return this - } - - public get noMTime(): boolean { - return this._noMTime - } - - public toggleNoMTime() { - this._noMTime = !this._noMTime - return this - } - - public toString(): string { - let args = '' - - if (this._extractAudio) { - args += '-x ' - } - - if (this._noMTime) { - args += '--no-mtime ' - } - - return args.trim() - } - - public fromString(str: string): CliArguments { - if (str) { - if (str.includes('-x')) { - this._extractAudio = true - } - - if (str.includes('--no-mtime')) { - this._noMTime = true - } - } - return this + return args.trim() + } + + public fromString(str: string): CliArguments { + if (str) { + if (str.includes('-x')) { + this._extractAudio = true + } + + if (str.includes('--no-mtime')) { + this._noMTime = true + } } + return this + } } \ No newline at end of file diff --git a/frontend/src/utils.ts b/frontend/src/utils.ts index ab8fd92..14cbc3c 100644 --- a/frontend/src/utils.ts +++ b/frontend/src/utils.ts @@ -95,7 +95,7 @@ export function formatGiB(bytes: number) { export const roundMiB = (bytes: number) => `${(bytes / 1_000_000).toFixed(2)} MiB` export const formatSpeedMiB = (val: number) => `${roundMiB(val)}/s` -export const dateTimeComparatorFunc = (a: string, b: string) => new Date(a).getTime() - new Date(b).getTime() +export const datetimeCompareFunc = (a: string, b: string) => new Date(a).getTime() - new Date(b).getTime() export function isRPCResponse(object: any): object is RPCResponse { return 'result' in object && 'id' in object diff --git a/frontend/src/views/Home.tsx b/frontend/src/views/Home.tsx index 47f0968..4ae9ddf 100644 --- a/frontend/src/views/Home.tsx +++ b/frontend/src/views/Home.tsx @@ -24,7 +24,7 @@ import { I18nContext } from '../providers/i18nProvider' import { RPCClientContext } from '../providers/rpcClientProvider' import { RootState } from '../stores/store' import type { RPCResponse, RPCResult } from '../types' -import { dateTimeComparatorFunc, isRPCResponse } from '../utils' +import { datetimeCompareFunc, isRPCResponse } from '../utils' export default function Home() { // redux state @@ -87,7 +87,7 @@ export default function Home() { setActiveDownloads((event.result ?? []) .filter(f => !!f.info.url) - .sort((a, b) => dateTimeComparatorFunc( + .sort((a, b) => datetimeCompareFunc( b.info.created_at, a.info.created_at, ))) diff --git a/server/rest/handlers.go b/server/rest/handlers.go index 159c586..e85ef29 100644 --- a/server/rest/handlers.go +++ b/server/rest/handlers.go @@ -160,8 +160,10 @@ func Login(ctx *fiber.Ctx) error { return ctx.SendStatus(fiber.StatusBadRequest) } + expiresAt := time.Now().Add(time.Hour * 24 * 30) + token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ - "expiresAt": time.Now().Add(time.Minute * 30), + "expiresAt": expiresAt, }) tokenString, err := token.SignedString([]byte(os.Getenv("JWT_SECRET"))) @@ -173,7 +175,7 @@ func Login(ctx *fiber.Ctx) error { Name: TOKEN_COOKIE_NAME, HTTPOnly: true, Secure: false, - Expires: time.Now().Add(time.Hour * 24 * 30), // 30 days + Expires: expiresAt, // 30 days Value: tokenString, Path: "/", })