added persisting tokenID after password changes on changing session
This commit is contained in:
@@ -70,10 +70,10 @@ type UserChangePassword struct {
|
||||
Password string `json:"password" validate:"required,min=12"`
|
||||
}
|
||||
|
||||
func ChangePassword(user UserChangePassword) error {
|
||||
func ChangePassword(user UserChangePassword) (string, error) {
|
||||
// try to hash teh password
|
||||
if hash, err := hashPassword(user.Password); err != nil {
|
||||
return err
|
||||
return "", err
|
||||
} else {
|
||||
execStruct := struct {
|
||||
UserName string `db:"userName"`
|
||||
@@ -86,11 +86,11 @@ func ChangePassword(user UserChangePassword) error {
|
||||
}
|
||||
|
||||
if _, err := db.DB.NamedExec("UPDATE USERS SET tokenID = :tokenID, password = :password WHERE name = :userName", execStruct); err != nil {
|
||||
return err
|
||||
return "", err
|
||||
} else {
|
||||
refresh()
|
||||
|
||||
return nil
|
||||
return execStruct.TokenID, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,10 +51,24 @@ func patchPassword(args HandlerArgs) responseMessage {
|
||||
response.Status = fiber.StatusBadRequest
|
||||
|
||||
logger.Info().Msgf("invalid body: %v", err)
|
||||
} else if err := users.ChangePassword(body); err != nil {
|
||||
} else if tokenID, err := users.ChangePassword(body); err != nil {
|
||||
response.Status = fiber.StatusInternalServerError
|
||||
|
||||
logger.Error().Msgf("can't update password: %v", err)
|
||||
|
||||
// sign a new JWT with the new tokenID
|
||||
} else if jwt, err := config.SignJWT(JWTPayload{
|
||||
UserName: body.UserName,
|
||||
TokenID: tokenID,
|
||||
|
||||
// if something failed, remove the current session-cookie
|
||||
}); err != nil {
|
||||
removeSessionCookie(args.C)
|
||||
|
||||
// set the new session-cookie
|
||||
} else {
|
||||
// update the token in the session-cookie
|
||||
setSessionCookie(args.C, &jwt)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,16 +4,10 @@ import { create } from "zustand";
|
||||
import { persist } from "zustand/middleware";
|
||||
import { apiCall } from "./lib";
|
||||
|
||||
export type Task = string;
|
||||
|
||||
export type Availability = string;
|
||||
|
||||
export const Availabilities: Availability[] = ["yes", "maybe", "no"];
|
||||
|
||||
export interface EventData {
|
||||
id: number;
|
||||
date: string;
|
||||
tasks: Partial<Record<Task, string | null>>;
|
||||
tasks: Partial<Record<string, string | null>>;
|
||||
description: string;
|
||||
}
|
||||
|
||||
@@ -70,21 +64,4 @@ const zustand = create<Zustand>()(
|
||||
),
|
||||
);
|
||||
|
||||
export async function getTasks(): Promise<
|
||||
Record<number, { text: string; disabled: boolean }>
|
||||
> {
|
||||
const result = await apiCall<{ text: string; disabled: boolean }[]>(
|
||||
"GET",
|
||||
"tasks",
|
||||
);
|
||||
|
||||
if (result.ok) {
|
||||
const tasks = await result.json();
|
||||
|
||||
return tasks;
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export default zustand;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useEffect, useReducer } from "react";
|
||||
import { useEffect, useReducer, useState } from "react";
|
||||
import { Add } from "@carbon/icons-react";
|
||||
import zustand, { getTasks, Task } from "../../Zustand";
|
||||
import zustand from "../../Zustand";
|
||||
import { getLocalTimeZone, now, ZonedDateTime } from "@internationalized/date";
|
||||
import {
|
||||
Button,
|
||||
@@ -16,12 +16,12 @@ import {
|
||||
Spinner,
|
||||
Textarea,
|
||||
} from "@nextui-org/react";
|
||||
import { apiCall } from "@/lib";
|
||||
import { apiCall, getTasks, Task } from "@/lib";
|
||||
|
||||
interface state {
|
||||
date: ZonedDateTime;
|
||||
description: string;
|
||||
tasks: Task[];
|
||||
tasks: string[];
|
||||
}
|
||||
|
||||
interface dispatchAction {
|
||||
@@ -50,11 +50,13 @@ export default function AddEvent(props: {
|
||||
}
|
||||
}
|
||||
const [state, dispatchState] = useReducer(reducer, initialState);
|
||||
const tasks = zustand((state) => state.tasks);
|
||||
const [tasks, setTasks] = useState<Record<number, Task>>({});
|
||||
|
||||
// get the available tasks
|
||||
useEffect(() => {
|
||||
void getTasks();
|
||||
(async () => {
|
||||
setTasks(await getTasks());
|
||||
})();
|
||||
}, []);
|
||||
|
||||
// sends the addEvent request to the backend
|
||||
|
||||
@@ -90,3 +90,23 @@ export function vaidatePassword(password: string): string[] {
|
||||
|
||||
return errors;
|
||||
}
|
||||
|
||||
export interface Task {
|
||||
text: string;
|
||||
disabled: boolean;
|
||||
}
|
||||
|
||||
export async function getTasks(): Promise<Record<number, Task>> {
|
||||
const result = await apiCall<{ text: string; disabled: boolean }[]>(
|
||||
"GET",
|
||||
"tasks",
|
||||
);
|
||||
|
||||
if (result.ok) {
|
||||
const tasks = await result.json();
|
||||
|
||||
return tasks;
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user