code refactoring, fixed wrong jwt expire time
This commit is contained in:
@@ -1,99 +1,108 @@
|
|||||||
import { createSlice, PayloadAction } from "@reduxjs/toolkit"
|
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 type ThemeUnion = "light" | "dark"
|
||||||
|
|
||||||
export interface SettingsState {
|
export interface SettingsState {
|
||||||
serverAddr: string
|
serverAddr: string
|
||||||
serverPort: string
|
serverPort: string
|
||||||
language: LanguageUnion
|
language: LanguageUnion
|
||||||
theme: ThemeUnion
|
theme: ThemeUnion
|
||||||
cliArgs: string
|
cliArgs: string
|
||||||
formatSelection: boolean
|
formatSelection: boolean
|
||||||
ratelimit: string
|
ratelimit: string
|
||||||
fileRenaming: boolean
|
fileRenaming: boolean
|
||||||
pathOverriding: boolean
|
pathOverriding: boolean
|
||||||
enableCustomArgs: boolean
|
enableCustomArgs: boolean
|
||||||
listView: boolean
|
listView: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
const initialState: SettingsState = {
|
const initialState: SettingsState = {
|
||||||
serverAddr: localStorage.getItem("server-addr") || window.location.hostname,
|
serverAddr: localStorage.getItem("server-addr") || window.location.hostname,
|
||||||
serverPort: localStorage.getItem("server-port") || window.location.port,
|
serverPort: localStorage.getItem("server-port") || window.location.port,
|
||||||
language: (localStorage.getItem("language") || "english") as LanguageUnion,
|
language: (localStorage.getItem("language") || "english") as LanguageUnion,
|
||||||
theme: (localStorage.getItem("theme") || "light") as ThemeUnion,
|
theme: (localStorage.getItem("theme") || "light") as ThemeUnion,
|
||||||
cliArgs: localStorage.getItem("cli-args") ?? "",
|
cliArgs: localStorage.getItem("cli-args") ?? "",
|
||||||
formatSelection: localStorage.getItem("format-selection") === "true",
|
formatSelection: localStorage.getItem("format-selection") === "true",
|
||||||
ratelimit: localStorage.getItem("rate-limit") ?? "",
|
ratelimit: localStorage.getItem("rate-limit") ?? "",
|
||||||
fileRenaming: localStorage.getItem("file-renaming") === "true",
|
fileRenaming: localStorage.getItem("file-renaming") === "true",
|
||||||
pathOverriding: localStorage.getItem("path-overriding") === "true",
|
pathOverriding: localStorage.getItem("path-overriding") === "true",
|
||||||
enableCustomArgs: localStorage.getItem("enable-custom-args") === "true",
|
enableCustomArgs: localStorage.getItem("enable-custom-args") === "true",
|
||||||
listView: localStorage.getItem("listview") === "true",
|
listView: localStorage.getItem("listview") === "true",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const settingsSlice = createSlice({
|
export const settingsSlice = createSlice({
|
||||||
name: "settings",
|
name: "settings",
|
||||||
initialState,
|
initialState,
|
||||||
reducers: {
|
reducers: {
|
||||||
setServerAddr: (state, action: PayloadAction<string>) => {
|
setServerAddr: (state, action: PayloadAction<string>) => {
|
||||||
state.serverAddr = action.payload
|
state.serverAddr = action.payload
|
||||||
localStorage.setItem("server-addr", action.payload)
|
localStorage.setItem("server-addr", action.payload)
|
||||||
},
|
},
|
||||||
setServerPort: (state, action: PayloadAction<string>) => {
|
setServerPort: (state, action: PayloadAction<string>) => {
|
||||||
state.serverPort = action.payload
|
state.serverPort = action.payload
|
||||||
localStorage.setItem("server-port", action.payload)
|
localStorage.setItem("server-port", action.payload)
|
||||||
},
|
},
|
||||||
setLanguage: (state, action: PayloadAction<LanguageUnion>) => {
|
setLanguage: (state, action: PayloadAction<LanguageUnion>) => {
|
||||||
state.language = action.payload
|
state.language = action.payload
|
||||||
localStorage.setItem("language", action.payload)
|
localStorage.setItem("language", action.payload)
|
||||||
},
|
},
|
||||||
setCliArgs: (state, action: PayloadAction<string>) => {
|
setCliArgs: (state, action: PayloadAction<string>) => {
|
||||||
state.cliArgs = action.payload
|
state.cliArgs = action.payload
|
||||||
localStorage.setItem("cli-args", action.payload)
|
localStorage.setItem("cli-args", action.payload)
|
||||||
},
|
},
|
||||||
setTheme: (state, action: PayloadAction<ThemeUnion>) => {
|
setTheme: (state, action: PayloadAction<ThemeUnion>) => {
|
||||||
state.theme = action.payload
|
state.theme = action.payload
|
||||||
localStorage.setItem("theme", action.payload)
|
localStorage.setItem("theme", action.payload)
|
||||||
},
|
},
|
||||||
setFormatSelection: (state, action: PayloadAction<boolean>) => {
|
setFormatSelection: (state, action: PayloadAction<boolean>) => {
|
||||||
state.formatSelection = action.payload
|
state.formatSelection = action.payload
|
||||||
localStorage.setItem("format-selection", action.payload.toString())
|
localStorage.setItem("format-selection", action.payload.toString())
|
||||||
},
|
},
|
||||||
setRateLimit: (state, action: PayloadAction<string>) => {
|
setRateLimit: (state, action: PayloadAction<string>) => {
|
||||||
state.ratelimit = action.payload
|
state.ratelimit = action.payload
|
||||||
localStorage.setItem("rate-limit", action.payload)
|
localStorage.setItem("rate-limit", action.payload)
|
||||||
},
|
},
|
||||||
setPathOverriding: (state, action: PayloadAction<boolean>) => {
|
setPathOverriding: (state, action: PayloadAction<boolean>) => {
|
||||||
state.pathOverriding = action.payload
|
state.pathOverriding = action.payload
|
||||||
localStorage.setItem("path-overriding", action.payload.toString())
|
localStorage.setItem("path-overriding", action.payload.toString())
|
||||||
},
|
},
|
||||||
setFileRenaming: (state, action: PayloadAction<boolean>) => {
|
setFileRenaming: (state, action: PayloadAction<boolean>) => {
|
||||||
state.fileRenaming = action.payload
|
state.fileRenaming = action.payload
|
||||||
localStorage.setItem("file-renaming", action.payload.toString())
|
localStorage.setItem("file-renaming", action.payload.toString())
|
||||||
},
|
},
|
||||||
setEnableCustomArgs: (state, action: PayloadAction<boolean>) => {
|
setEnableCustomArgs: (state, action: PayloadAction<boolean>) => {
|
||||||
state.enableCustomArgs = action.payload
|
state.enableCustomArgs = action.payload
|
||||||
localStorage.setItem("enable-custom-args", action.payload.toString())
|
localStorage.setItem("enable-custom-args", action.payload.toString())
|
||||||
},
|
},
|
||||||
toggleListView: (state) => {
|
toggleListView: (state) => {
|
||||||
state.listView = !state.listView
|
state.listView = !state.listView
|
||||||
localStorage.setItem("listview", state.listView.toString())
|
localStorage.setItem("listview", state.listView.toString())
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export const {
|
export const {
|
||||||
setLanguage,
|
setLanguage,
|
||||||
setCliArgs,
|
setCliArgs,
|
||||||
setTheme,
|
setTheme,
|
||||||
setServerAddr,
|
setServerAddr,
|
||||||
setServerPort,
|
setServerPort,
|
||||||
setFormatSelection,
|
setFormatSelection,
|
||||||
setRateLimit,
|
setRateLimit,
|
||||||
setFileRenaming,
|
setFileRenaming,
|
||||||
setPathOverriding,
|
setPathOverriding,
|
||||||
setEnableCustomArgs,
|
setEnableCustomArgs,
|
||||||
toggleListView
|
toggleListView
|
||||||
} = settingsSlice.actions
|
} = settingsSlice.actions
|
||||||
|
|
||||||
export default settingsSlice.reducer
|
export default settingsSlice.reducer
|
||||||
@@ -1,61 +1,61 @@
|
|||||||
export class CliArguments {
|
export class CliArguments {
|
||||||
private _extractAudio: boolean
|
private _extractAudio: boolean
|
||||||
private _noMTime: boolean
|
private _noMTime: boolean
|
||||||
private _proxy: string
|
private _proxy: string
|
||||||
|
|
||||||
constructor(extractAudio = false, noMTime = true) {
|
constructor(extractAudio = false, noMTime = true) {
|
||||||
this._extractAudio = extractAudio
|
this._extractAudio = extractAudio
|
||||||
this._noMTime = noMTime
|
this._noMTime = noMTime
|
||||||
this._proxy = ""
|
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 {
|
if (this._noMTime) {
|
||||||
return this._extractAudio
|
args += '--no-mtime '
|
||||||
}
|
}
|
||||||
|
|
||||||
public toggleExtractAudio() {
|
return args.trim()
|
||||||
this._extractAudio = !this._extractAudio
|
}
|
||||||
return this
|
|
||||||
}
|
public fromString(str: string): CliArguments {
|
||||||
|
if (str) {
|
||||||
public disableExtractAudio() {
|
if (str.includes('-x')) {
|
||||||
this._extractAudio = false
|
this._extractAudio = true
|
||||||
return this
|
}
|
||||||
}
|
|
||||||
|
if (str.includes('--no-mtime')) {
|
||||||
public get noMTime(): boolean {
|
this._noMTime = true
|
||||||
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 this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -95,7 +95,7 @@ export function formatGiB(bytes: number) {
|
|||||||
export const roundMiB = (bytes: number) => `${(bytes / 1_000_000).toFixed(2)} MiB`
|
export const roundMiB = (bytes: number) => `${(bytes / 1_000_000).toFixed(2)} MiB`
|
||||||
export const formatSpeedMiB = (val: number) => `${roundMiB(val)}/s`
|
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<any> {
|
export function isRPCResponse(object: any): object is RPCResponse<any> {
|
||||||
return 'result' in object && 'id' in object
|
return 'result' in object && 'id' in object
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import { I18nContext } from '../providers/i18nProvider'
|
|||||||
import { RPCClientContext } from '../providers/rpcClientProvider'
|
import { RPCClientContext } from '../providers/rpcClientProvider'
|
||||||
import { RootState } from '../stores/store'
|
import { RootState } from '../stores/store'
|
||||||
import type { RPCResponse, RPCResult } from '../types'
|
import type { RPCResponse, RPCResult } from '../types'
|
||||||
import { dateTimeComparatorFunc, isRPCResponse } from '../utils'
|
import { datetimeCompareFunc, isRPCResponse } from '../utils'
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
// redux state
|
// redux state
|
||||||
@@ -87,7 +87,7 @@ export default function Home() {
|
|||||||
|
|
||||||
setActiveDownloads((event.result ?? [])
|
setActiveDownloads((event.result ?? [])
|
||||||
.filter(f => !!f.info.url)
|
.filter(f => !!f.info.url)
|
||||||
.sort((a, b) => dateTimeComparatorFunc(
|
.sort((a, b) => datetimeCompareFunc(
|
||||||
b.info.created_at,
|
b.info.created_at,
|
||||||
a.info.created_at,
|
a.info.created_at,
|
||||||
)))
|
)))
|
||||||
|
|||||||
@@ -160,8 +160,10 @@ func Login(ctx *fiber.Ctx) error {
|
|||||||
return ctx.SendStatus(fiber.StatusBadRequest)
|
return ctx.SendStatus(fiber.StatusBadRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expiresAt := time.Now().Add(time.Hour * 24 * 30)
|
||||||
|
|
||||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
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")))
|
tokenString, err := token.SignedString([]byte(os.Getenv("JWT_SECRET")))
|
||||||
@@ -173,7 +175,7 @@ func Login(ctx *fiber.Ctx) error {
|
|||||||
Name: TOKEN_COOKIE_NAME,
|
Name: TOKEN_COOKIE_NAME,
|
||||||
HTTPOnly: true,
|
HTTPOnly: true,
|
||||||
Secure: false,
|
Secure: false,
|
||||||
Expires: time.Now().Add(time.Hour * 24 * 30), // 30 days
|
Expires: expiresAt, // 30 days
|
||||||
Value: tokenString,
|
Value: tokenString,
|
||||||
Path: "/",
|
Path: "/",
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user