fix: resolve email database permission errors for multi-user setups
Issues: 1. User directories created with chmod 770 (too restrictive) - Prevents service user from reading/writing even though in group - Changed to chmod 775 (recursive) to allow group access 2. openEmailDb tries to chmod file it may not own - If file owned by different user (e.g., andrepadez), chmod fails - Wrapped chmodSync in try/catch to gracefully skip Changes: - src/servers/api/users/provision.ts: * Changed chmod 770 → 775 (owner/group rwx, others rx) * Applied recursively to all subdirectories * Added chmod after seeding files to ensure consistency - src/servers/api/email/email-db.ts: * Wrapped chmodSync in try/catch * Logs silently skip if file not owned by current process * Database still works even if chmod fails Fixes /email endpoint 500 errors for users with email data.
This commit is contained in:
@@ -82,7 +82,12 @@ export function openEmailDb(email: string): Database {
|
|||||||
db.exec(SCHEMA_TABLES);
|
db.exec(SCHEMA_TABLES);
|
||||||
migrate(db);
|
migrate(db);
|
||||||
db.exec(SCHEMA_INDEXES);
|
db.exec(SCHEMA_INDEXES);
|
||||||
chmodSync(dbPath, 0o666);
|
// Try to chmod, but don't crash if permission denied (e.g., file owned by different user)
|
||||||
|
try {
|
||||||
|
chmodSync(dbPath, 0o666);
|
||||||
|
} catch (err) {
|
||||||
|
// File exists with correct permissions, or owned by another user - that's fine
|
||||||
|
}
|
||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,9 +48,10 @@ export async function provisionLinuxUser(email: string, username: string): Promi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set ownership and permissions on user data directory
|
// Set ownership and permissions on user data directory
|
||||||
// chmod 770 so the service user (in the user's group) can read/write for background jobs
|
// chmod 775 so the service user (in the user's group) can read/write for background jobs
|
||||||
|
// The service user is added to the group below, so group permissions (rwx) are needed
|
||||||
run(['sudo', 'chown', '-R', `${shellUsername}:${shellUsername}`, userRoot]);
|
run(['sudo', 'chown', '-R', `${shellUsername}:${shellUsername}`, userRoot]);
|
||||||
run(['sudo', 'chmod', '770', userRoot]);
|
run(['sudo', 'chmod', '-R', '775', userRoot]); // Recursive chmod to fix all subdirectories
|
||||||
|
|
||||||
// Add the service user to the new user's group so server jobs can access user data
|
// Add the service user to the new user's group so server jobs can access user data
|
||||||
const serviceUser = process.env.USER ?? '';
|
const serviceUser = process.env.USER ?? '';
|
||||||
@@ -74,8 +75,9 @@ export async function provisionLinuxUser(email: string, username: string): Promi
|
|||||||
const settingsContent = await Bun.file(settingsFile).text();
|
const settingsContent = await Bun.file(settingsFile).text();
|
||||||
await Bun.write(join(claudeDir, 'settings.json'), settingsContent);
|
await Bun.write(join(claudeDir, 'settings.json'), settingsContent);
|
||||||
|
|
||||||
// Fix ownership after seeding
|
// Fix ownership and permissions after seeding
|
||||||
run(['sudo', 'chown', '-R', `${shellUsername}:${shellUsername}`, userRoot]);
|
run(['sudo', 'chown', '-R', `${shellUsername}:${shellUsername}`, userRoot]);
|
||||||
|
run(['sudo', 'chmod', '-R', '775', userRoot]);
|
||||||
|
|
||||||
console.log(`[provision] provisioning complete for ${shellUsername}`);
|
console.log(`[provision] provisioning complete for ${shellUsername}`);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user