topic: null in a permission entry now matches any topic, allowing broad grants without specifying a specific topic. set-mail-permission topic param is now optional; omitting it stores null (wildcard). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
50 lines
1.2 KiB
JavaScript
50 lines
1.2 KiB
JavaScript
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
|
|
export function load_mail_perms(file_path) {
|
|
let allowed = [];
|
|
|
|
if (file_path && existsSync(file_path)) {
|
|
try {
|
|
const parsed = JSON.parse(readFileSync(file_path, 'utf8'));
|
|
if (!Array.isArray(parsed.allowed)) {
|
|
throw new Error("'allowed' must be an array");
|
|
}
|
|
allowed = parsed.allowed;
|
|
} catch (err) {
|
|
throw new Error(`Cannot load mail permissions from ${file_path}: ${err.message}`);
|
|
}
|
|
}
|
|
|
|
function write() {
|
|
if (!file_path) {
|
|
return;
|
|
}
|
|
writeFileSync(file_path, JSON.stringify({ allowed }, null, '\t') + '\n', 'utf8');
|
|
}
|
|
|
|
function check(user, to, topic) {
|
|
return allowed.some(e => e.user === user && e.to === to && (e.topic === topic || e.topic === null));
|
|
}
|
|
|
|
function add(user, to, topic) {
|
|
if (!check(user, to, topic)) {
|
|
allowed.push({ user, to, topic });
|
|
write();
|
|
}
|
|
}
|
|
|
|
function remove(user, to, topic) {
|
|
const before = allowed.length;
|
|
allowed = allowed.filter(e => !(e.user === user && e.to === to && e.topic === topic));
|
|
if (allowed.length !== before) {
|
|
write();
|
|
}
|
|
}
|
|
|
|
function list() {
|
|
return [...allowed];
|
|
}
|
|
|
|
return { check, add, remove, list };
|
|
}
|