From ced3fd03e4b1290db84ef1cf62610ce771771edb Mon Sep 17 00:00:00 2001 From: vibsin9322 Date: Fri, 22 Aug 2025 12:21:24 +0900 Subject: [PATCH] Add admin password reset script with mysql2 dependency --- .claude/settings.local.json | 3 +- package-lock.json | 122 ++++++++++++++++++++++++++++++++++++ package.json | 18 +++--- reset-admin.js | 61 ++++++++++++++++++ 4 files changed, 196 insertions(+), 8 deletions(-) create mode 100644 reset-admin.js diff --git a/.claude/settings.local.json b/.claude/settings.local.json index ca0b572..a9b4fc7 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -47,7 +47,8 @@ "Bash(npm install)", "Bash(powershell:*)", "Bash(schtasks:*)", - "Bash(cmd //c:*)" + "Bash(cmd //c:*)", + "Bash(npm install:*)" ], "deny": [], "ask": [], diff --git a/package-lock.json b/package-lock.json index de23ebd..23b1d74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "express": "^4.18.2", "express-session": "^1.17.3", "multer": "^1.4.5-lts.1", + "mysql2": "^3.14.3", "sqlite3": "^5.1.6", "uuid": "^9.0.1" }, @@ -1115,6 +1116,15 @@ "dev": true, "license": "MIT" }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1575,6 +1585,15 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "license": "MIT" }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2479,6 +2498,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/generic-pool": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.4.2.tgz", @@ -2913,6 +2941,12 @@ "node": ">=0.12.0" } }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -2968,6 +3002,12 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2981,6 +3021,21 @@ "node": ">=10" } }, + "node_modules/lru.min": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", + "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -3439,6 +3494,59 @@ "node": ">= 6.0.0" } }, + "node_modules/mysql2": { + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.3.tgz", + "integrity": "sha512-fD6MLV8XJ1KiNFIF0bS7Msl8eZyhlTDCDl75ajU5SJtpdx9ZPEACulJcqJWr1Y8OYyxsFc4j3+nflpmhxCU5aQ==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/napi-build-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", @@ -4197,6 +4305,11 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -4460,6 +4573,15 @@ } } }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", diff --git a/package.json b/package.json index 7d9c0e4..6a3948f 100644 --- a/package.json +++ b/package.json @@ -9,21 +9,25 @@ "build": "echo 'Build complete'" }, "dependencies": { - "express": "^4.18.2", - "cors": "^2.8.5", - "multer": "^1.4.5-lts.1", "bcrypt": "^5.1.1", + "cors": "^2.8.5", + "express": "^4.18.2", "express-session": "^1.17.3", - "uuid": "^9.0.1", - "sqlite3": "^5.1.6" + "multer": "^1.4.5-lts.1", + "mysql2": "^3.14.3", + "sqlite3": "^5.1.6", + "uuid": "^9.0.1" }, "devDependencies": { "vercel": "^32.0.0" }, - "keywords": ["file-manager", "admin"], + "keywords": [ + "file-manager", + "admin" + ], "author": "Claude Code", "license": "MIT", "engines": { "node": ">=18.0.0" } -} \ No newline at end of file +} diff --git a/reset-admin.js b/reset-admin.js new file mode 100644 index 0000000..b9046a8 --- /dev/null +++ b/reset-admin.js @@ -0,0 +1,61 @@ +const bcrypt = require('bcrypt'); +const MariaDBHelper = require('./database/mariadb-helper'); + +async function resetAdminPassword() { + const dbHelper = new MariaDBHelper(); + + try { + console.log('πŸ”„ κ΄€λ¦¬μž λΉ„λ°€λ²ˆν˜Έ μ΄ˆκΈ°ν™” μ‹œμž‘...'); + + const password = 'Hee150603!'; + const saltRounds = 10; + const hashedPassword = await bcrypt.hash(password, saltRounds); + + console.log('πŸ” ν•΄μ‹œλœ λΉ„λ°€λ²ˆν˜Έ:', hashedPassword); + + // κ΄€λ¦¬μž μ‚¬μš©μž 확인 + const existingUser = await dbHelper.getUserByEmail('admin@jaryo.com'); + + if (existingUser) { + // κΈ°μ‘΄ μ‚¬μš©μž λΉ„λ°€λ²ˆν˜Έ μ—…λ°μ΄νŠΈ + const conn = await dbHelper.connect(); + const [result] = await conn.execute( + 'UPDATE users SET password_hash = ? WHERE email = ?', + [hashedPassword, 'admin@jaryo.com'] + ); + console.log('βœ… κΈ°μ‘΄ κ΄€λ¦¬μž λΉ„λ°€λ²ˆν˜Έκ°€ μ—…λ°μ΄νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.'); + } else { + // μƒˆ κ΄€λ¦¬μž μ‚¬μš©μž 생성 + const adminData = { + email: 'admin@jaryo.com', + password_hash: hashedPassword, + name: 'κ΄€λ¦¬μž', + role: 'admin' + }; + + const result = await dbHelper.createUser(adminData); + console.log('βœ… μƒˆ κ΄€λ¦¬μž μ‚¬μš©μžκ°€ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'); + } + + // 둜그인 ν…ŒμŠ€νŠΈ + const user = await dbHelper.getUserByEmail('admin@jaryo.com'); + const isValid = await bcrypt.compare(password, user.password_hash); + + console.log('πŸ§ͺ 둜그인 ν…ŒμŠ€νŠΈ κ²°κ³Ό:', isValid ? '성곡' : 'μ‹€νŒ¨'); + + if (isValid) { + console.log('πŸŽ‰ κ΄€λ¦¬μž 계정 μ„€μ • μ™„λ£Œ!'); + console.log('πŸ“§ 이메일: admin@jaryo.com'); + console.log('πŸ”‘ λΉ„λ°€λ²ˆν˜Έ: Hee150603!'); + } + + await dbHelper.close(); + + } catch (error) { + console.error('❌ 였λ₯˜ λ°œμƒ:', error); + await dbHelper.close(); + process.exit(1); + } +} + +resetAdminPassword(); \ No newline at end of file