Przeglądaj źródła

Add reset password

jerryliao 1 rok temu
rodzic
commit
102194d42b
4 zmienionych plików z 114 dodań i 15 usunięć
  1. 2 0
      fresh.gen.ts
  2. 0 15
      import_map.json
  3. 74 0
      islands/HomeBar.tsx
  4. 38 0
      routes/api/user/reset.tsx

+ 2 - 0
fresh.gen.ts

@@ -10,6 +10,7 @@ import * as $api_share from "./routes/api/share.tsx";
 import * as $api_user_login from "./routes/api/user/login.tsx";
 import * as $api_user_logout from "./routes/api/user/logout.tsx";
 import * as $api_user_register from "./routes/api/user/register.tsx";
+import * as $api_user_reset from "./routes/api/user/reset.tsx";
 import * as $index from "./routes/index.tsx";
 import * as $login from "./routes/login.tsx";
 import * as $register from "./routes/register.tsx";
@@ -31,6 +32,7 @@ const manifest = {
     "./routes/api/user/login.tsx": $api_user_login,
     "./routes/api/user/logout.tsx": $api_user_logout,
     "./routes/api/user/register.tsx": $api_user_register,
+    "./routes/api/user/reset.tsx": $api_user_reset,
     "./routes/index.tsx": $index,
     "./routes/login.tsx": $login,
     "./routes/register.tsx": $register,

+ 0 - 15
import_map.json

@@ -1,15 +0,0 @@
-{
-  "imports": {
-    "$fresh/": "https://deno.land/x/fresh@1.1.5/",
-    "$sqlite/": "https://deno.land/x/sqlite@v3.7.1/",
-    "$usid/": "https://deno.land/x/usid@2.0.0/",
-    "$crypto/": "https://deno.land/std@0.184.0/crypto/",
-    "$async/": "https://deno.land/std@0.184.0/async/",
-    "$http/": "https://deno.land/std@0.184.0/http/",
-    "preact": "https://esm.sh/preact@10.13.2",
-    "preact/": "https://esm.sh/preact@10.13.2/",
-    "preact-render-to-string": "https://esm.sh/preact-render-to-string@6.0.2?deps=preact@10.13.2",
-    "showdown": "https://esm.sh/showdown@2.1.0",
-    "utils/": "./utils/"
-  }
-}

+ 74 - 0
islands/HomeBar.tsx

@@ -4,6 +4,8 @@ interface HomeBarProps {
   name: string;
 }
 
+const settingsData: { [key: string]: string } = {};
+
 export default function HomeBar(props: HomeBarProps) {
   const doNewPost = async () => {
     showLoading();
@@ -33,11 +35,83 @@ export default function HomeBar(props: HomeBarProps) {
     return false;
   };
 
+  const showReset = () => {
+    settingsData["old"] = "";
+    settingsData["new"] = "";
+    settingsData["repeat"] = "";
+    window.$modal?.show(
+      "Reset password",
+      <div>
+        <div style="display: flex; align-items: center; margin-bottom: 8px">
+          <span style="width: 120px; margin-right: 8px">Old password</span>
+          <input
+            type="password"
+            placeholder="Old password"
+            value={settingsData["old"]}
+            onInput={(e) => {
+              settingsData["old"] = (e.target as HTMLInputElement).value;
+            }}
+          />
+        </div>
+        <div style="display: flex; align-items: center; margin-bottom: 8px">
+          <span style="width: 120px; margin-right: 8px">New password</span>
+          <input
+            type="password"
+            placeholder="New password"
+            value={settingsData["new"]}
+            onInput={(e) => {
+              settingsData["new"] = (e.target as HTMLInputElement).value;
+            }}
+          />
+        </div>
+        <div style="display: flex; align-items: center;">
+          <span style="width: 120px; margin-right: 8px">
+            Repeat new password
+          </span>
+          <input
+            type="password"
+            placeholder="Repeat new password"
+            value={settingsData["repeat"]}
+            onInput={(e) => {
+              settingsData["repeat"] = (e.target as HTMLInputElement).value;
+            }}
+          />
+        </div>
+      </div>,
+      [
+        {
+          text: "Confirm",
+          onClick: async () => {
+            if (
+              settingsData["old"] && settingsData["new"] &&
+              settingsData["repeat"] &&
+              settingsData["new"] === settingsData["repeat"]
+            ) {
+              const resp = await fetch("/api/user/reset", {
+                method: "POST",
+                headers: { "Content-Type": "application/json" },
+                body: JSON.stringify({
+                  old: settingsData["old"],
+                  new: settingsData["new"],
+                }),
+              });
+              const respJson = await resp.json();
+              if (respJson.success) {
+                window.$modal?.hide();
+              }
+            }
+          },
+        },
+      ],
+    );
+  };
+
   return (
     <div className="pd-home-bar">
       <button onClick={doNewPost}>New Post</button>
       <div className="pd-home-user-info">
         <span>{props.name}</span>
+        <button onClick={showReset}>Password</button>
         <button onClick={doLogout}>Logout</button>
       </div>
     </div>

+ 38 - 0
routes/api/user/reset.tsx

@@ -0,0 +1,38 @@
+import { Handlers } from "$fresh/server.ts";
+import {
+  checkToken,
+  getCryptoString,
+  makeErrorResponse,
+  makeSuccessResponse,
+  setToken,
+} from "utils/server.ts";
+import { find, insert, update } from "utils/db.ts";
+
+export const handler: Handlers = {
+  async POST(req: Request) {
+    const reqJson = await req.json();
+    const tokenUserId = checkToken(req);
+    if (tokenUserId && reqJson.old && reqJson.new) {
+      const user = find(
+        "User",
+        {
+          id: tokenUserId,
+        },
+        ["password"],
+      );
+      if (user.length > 0) {
+        // Match old password
+        if (
+          await getCryptoString(reqJson.old, "MD5") === user[0][0] as string
+        ) {
+          // Store new password
+          const newUser = update("User", tokenUserId, {
+            password: await getCryptoString(reqJson.new, "MD5"),
+          });
+          return makeSuccessResponse(true);
+        }
+      }
+    }
+    return makeErrorResponse();
+  },
+};