- Add GUIDE.md: complete user documentation covering installation, Docker deployment, AI providers, MCP server, N8N integration, email config, admin panel, env var reference, troubleshooting - Add mcp-server/.env.example with all MCP-specific variables - Update .env.docker.example with all 42 environment variables - Fix docker-compose.yml: parameterize PostgreSQL credentials, add missing env vars (CUSTOM_OPENAI, AI_PROVIDER_CHAT, ALLOW_REGISTRATION, RESEND_API_KEY) - Track memento-note/.env.example
130 lines
3.8 KiB
JavaScript
130 lines
3.8 KiB
JavaScript
/**
|
|
* Interactive password reset script
|
|
*
|
|
* USAGE:
|
|
* 1. Open a terminal in the memento-note directory
|
|
* 2. Run: node scripts/reset-password.js
|
|
* 3. Enter the email of the account to reset
|
|
* 4. Enter the new password (twice for confirmation)
|
|
* 5. Done! Log in with the new password
|
|
*/
|
|
|
|
const readline = require('readline');
|
|
const bcrypt = require('bcryptjs');
|
|
const prisma = require('../lib/prisma').default;
|
|
|
|
const rl = readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout
|
|
});
|
|
|
|
console.log('================================================================');
|
|
console.log(' INTERACTIVE PASSWORD RESET');
|
|
console.log('');
|
|
console.log(' WARNING: Use only for your own account!');
|
|
console.log('');
|
|
console.log('================================================================');
|
|
console.log('');
|
|
|
|
rl.question('Enter the EMAIL of the account to reset: ', async (email) => {
|
|
if (!email || !email.includes('@')) {
|
|
console.log('Error: Invalid email!');
|
|
rl.close();
|
|
process.exit(1);
|
|
}
|
|
|
|
email = email.toLowerCase().trim();
|
|
|
|
console.log(`Looking up account: ${email}...`);
|
|
|
|
try {
|
|
const user = await prisma.user.findUnique({
|
|
where: { email: email }
|
|
});
|
|
|
|
if (!user) {
|
|
console.log('');
|
|
console.log('ERROR: No account found with this email!');
|
|
console.log('');
|
|
console.log('AVAILABLE ACCOUNTS (if any):');
|
|
console.log('-------------------------');
|
|
|
|
const allUsers = await prisma.user.findMany({
|
|
select: { email: true, name: true, role: true, createdAt: true },
|
|
orderBy: { createdAt: 'desc' }
|
|
});
|
|
|
|
if (allUsers.length > 0) {
|
|
console.log('');
|
|
allUsers.forEach((u, index) => {
|
|
console.log(`${index + 1}. Email: ${u.email}`);
|
|
console.log(` Name: ${u.name || 'N/A'}`);
|
|
console.log(` Role: ${u.role}`);
|
|
console.log(` Created: ${u.createdAt.toLocaleString()}`);
|
|
console.log('');
|
|
});
|
|
} else {
|
|
console.log(' (No accounts in the database)');
|
|
}
|
|
|
|
console.log('-------------------------');
|
|
console.log('');
|
|
rl.close();
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log(`Account found: ${user.email} (${user.name})`);
|
|
console.log('');
|
|
|
|
rl.question('Enter the NEW password (minimum 6 characters): ', async (newPassword) => {
|
|
if (!newPassword || newPassword.length < 6) {
|
|
console.log('Error: Password must be at least 6 characters!');
|
|
rl.close();
|
|
process.exit(1);
|
|
}
|
|
|
|
rl.question('Confirm the new password: ', async (confirmPassword) => {
|
|
if (newPassword !== confirmPassword) {
|
|
console.log('Error: Passwords do not match!');
|
|
rl.close();
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log('');
|
|
console.log('Resetting password...');
|
|
|
|
const hashedPassword = await bcrypt.hash(newPassword, 10);
|
|
|
|
await prisma.user.update({
|
|
where: { id: user.id },
|
|
data: {
|
|
password: hashedPassword,
|
|
resetToken: null,
|
|
resetTokenExpiry: null
|
|
}
|
|
});
|
|
|
|
console.log('SUCCESS! Password has been reset!');
|
|
console.log('');
|
|
console.log('================================================================');
|
|
console.log('YOU CAN NOW LOG IN!');
|
|
console.log('================================================================');
|
|
console.log('');
|
|
console.log('Login URL: http://localhost:3000/login');
|
|
console.log('Email:', email);
|
|
console.log('Password:', newPassword);
|
|
console.log('');
|
|
|
|
rl.close();
|
|
process.exit(0);
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.log('');
|
|
console.log('ERROR during password reset:');
|
|
console.error(error);
|
|
rl.close();
|
|
process.exit(1);
|
|
}
|
|
});
|