sbbs/save.js
2022-04-16 15:36:17 +10:00

120 lines
2.7 KiB
JavaScript

// Ansitex specific includes
load('ansitex/load/defs.js');
load('ansitex/load/funcs.js');
var options = loadOptions();
// Modes of operation:
// -s -p x -i y = To send a stored page via the msgbase
// {-s} -p x -i y -f file = To update (and optionally send) a page with new content
// -all details = to create a new page
// Import
send = (argv.indexOf('-s') >= 0);
// Page
p = getArg('-p','No page specified with -p',true);
// Index
i = getArg('-i','No index specified with -i',true);
// File to convert
file = getArg('-f','No file specified with -f',false);
frame = new TexFrame();
frame.load(pageStr({frame: p,index: i}));
if (! send || ! frame || file) {
if (frame.page === null) {
frame = new TexFrame();
frame.frame = p;
frame.index = i;
}
// Key
key = getArg('-k','No index specified with -k',false);
// Cost
cost = getArg('-c','No index specified with -c',false);
// Owner
owner = getArg('-o','No owner specified with -o',false);
// Owner
type = getArg('-t','No type specified with -t',false);
if (file) {
f = new File(file);
if (! f.exists || ! f.open('r')) {
log(LOG_ERROR,'! ERROR: Unable to open ['+file+']');
exit(1);
}
frame.content = base64_encode(f.read());
f.close();
}
if (owner) {
frame.owner = base64_encode(owner.replace(/\\1/g,"\1"));
}
if (key) {
frame.key = key.split(',').map(function(t){return parseInt(t)});
if (frame.key.length !== 10) {
log(LOG_ERROR,'! ERROR: Must specify 10 keys with -k');
exit(1);
}
}
// Public
if (argv.indexOf('-P') >= 0)
frame.isPublic = true;
if (argv.indexOf('-A') >= 0)
frame.isAccessible = true;
if (cost)
frame.cost = cost;
if (type)
frame.type = type; // @todo validate this is a valid type.
// Date
frame.date = new Date().toISOString();
// Final validation
if (! frame.owner) {
log(LOG_ERROR,'! ERROR: No owner specified ['+file+']');
exit(1);
}
// Store the frame in file
frame.save();
}
// @NOTE: We need to use a binary signature then base64 encode it, as mailers may strip 0x0a while messages are in transit.
if (send === 1 && options.gpg_key) {
if (! file) {
file = system.mods_dir+'ansitex/text/'+frame.page+'.tex';
}
if (! file_exists(file)) {
log(LOG_ERROR,'! ERROR: File '+file+' doesnt exist?');
exit(1);
}
if (file_exists(file+'.asc'))
file_remove(file+'.asc')
result = system.exec('gpg --homedir '+system.mods_dir+'ansitex/keys --clearsign --batch --local-user '+options.gpg_key+' -s '+file);
w = new File(file+'.asc');
if (w.open('r')) {
msg = base64_encode(w.read());
} else {
log(LOG_ERROR,'! ERROR: Unable to send with GPG for '+frame.page + ' Error: '+w.error);
exit(1);
}
w.close();
msgBaseImport(null,frame.page,msg);
printf('GPG Result: %s',result);
}