2022-12-09 06:19:33 +00:00
|
|
|
/**
|
|
|
|
* This handles session specific aspects of each frame type, eg: sending to the baseline, clearing, accepting
|
|
|
|
* input, moving around the frame (and windows within one if any)
|
|
|
|
*
|
|
|
|
* @constructor
|
|
|
|
*/
|
|
|
|
function Session() {
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
// Our page object
|
|
|
|
this.page = undefined;
|
|
|
|
|
|
|
|
/* Frame type settings */
|
|
|
|
this.settings = {};
|
|
|
|
|
|
|
|
/* Frame Version */
|
|
|
|
this.version = 1;
|
|
|
|
|
|
|
|
/* Frame Number [0-9] */
|
|
|
|
this.frame = null;
|
|
|
|
|
|
|
|
/* Frame Index [a-z] */
|
|
|
|
this.index = null;
|
|
|
|
|
|
|
|
/* The Service Provider owning the frame. */
|
|
|
|
this.owner = 0;
|
|
|
|
|
|
|
|
/* The cost to view the frame @todo to implement */
|
|
|
|
this.cost = 0;
|
|
|
|
|
|
|
|
/* The frame content, base64 encoded */
|
|
|
|
this.content = '';
|
|
|
|
|
|
|
|
// Frame's owned by the system where:
|
|
|
|
// isPublic is FALSE - the user must be logged in to view it
|
|
|
|
// isPublic is TRUE - can be viewed by non-logged in users
|
|
|
|
|
|
|
|
// Frame's owned by Service Providers where:
|
|
|
|
// isPublic is FALSE - can only be viewed if a user is
|
|
|
|
// a member of the Service Providers CUG
|
|
|
|
// isPublic is TRUE - can be viewed by users (if logged in)
|
|
|
|
|
|
|
|
this.isPublic = false; // Is this frame accessible to non CUG users
|
|
|
|
// If FALSE user must be a member of the CUG to view the frame
|
|
|
|
// All users, including unauthenticated, are members of 'system' (owner = 0)
|
|
|
|
this.isAccessible = false; // Is this frame available to be accessed
|
|
|
|
// If FALSE, only the SP can view/edit the frame
|
|
|
|
|
|
|
|
this.type = FRAME_TYPE_INFO; // The frame type - see FRAME_TYPES above
|
|
|
|
this.key = [null,null,null,null,null,null,null,null,null,null]; // Key actions [0-9]
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the frames fields
|
|
|
|
*/
|
|
|
|
Object.defineProperty(this,'fields', {
|
|
|
|
get: function() {
|
|
|
|
return this.frame_fields;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if the user is already a member of the CUG
|
|
|
|
*/
|
|
|
|
Object.defineProperty(this,'isMember',{
|
|
|
|
get: function() {
|
|
|
|
log(LOG_DEBUG,'- Checking if user is a member of frame: '+this.page);
|
|
|
|
|
|
|
|
if (user.number) {
|
|
|
|
return (
|
|
|
|
(this.pageowner === SYSTEM_OWNER)
|
|
|
|
);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
Object.defineProperty(this,'pageownerlogo', {
|
|
|
|
get: function() {
|
|
|
|
return base64_decode(this.settings.ext === 'tex' ? pageOwner(this.frame).logoans : pageOwner(this.frame).logovtx);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Enable pulling out submitted value by its name
|
|
|
|
*
|
|
|
|
* @param key
|
|
|
|
* @returns {null|string|*}
|
|
|
|
*/
|
|
|
|
this.fieldValue = function(key) {
|
|
|
|
for each (var k in this.frame_fields) {
|
|
|
|
log(LOG_DEBUG,' - k:'+JSON.stringify(k));
|
|
|
|
|
|
|
|
if (k.fname === key) {
|
|
|
|
return k.fvalue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.get = function(page) {
|
|
|
|
if (!(page instanceof PageObject))
|
|
|
|
throw new Error('page must be a PageObject');
|
|
|
|
|
|
|
|
this.baselineSend('LOADING');
|
2023-12-24 09:11:40 +00:00
|
|
|
this.page = new Page();
|
2023-12-24 06:44:02 +00:00
|
|
|
this.page.get(page);
|
2022-12-09 06:19:33 +00:00
|
|
|
this.baselineClear();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load a message frame
|
|
|
|
*
|
|
|
|
* @param page
|
|
|
|
*/
|
2023-12-24 06:44:02 +00:00
|
|
|
this.loadMessage = function(page,ext) {
|
2022-12-09 06:19:33 +00:00
|
|
|
this.frame = ''+page;
|
|
|
|
this.index = 'a';
|
|
|
|
this.owner = 1;
|
|
|
|
this.isPublic = true;
|
|
|
|
this.isAccessible = true;
|
|
|
|
// @todo Keys should map to next/previous/send, etc as indicated in the template frame.
|
|
|
|
this.key = [this.frame.substr(0,7)+'1',null,null,null,null,null,null,null,null,null];
|
|
|
|
// @todo validate that FRAME_TYPE_MESSAGE is a message template
|
|
|
|
this.type = FRAME_TYPE_MESSAGE;
|
|
|
|
|
|
|
|
// Load our message
|
|
|
|
var ma = new MsgAreas()
|
|
|
|
var area = ma.getArea(this.frame);
|
|
|
|
var msg = ma.getMessage(this.frame);
|
|
|
|
var msg_header;
|
|
|
|
|
|
|
|
if (! msg)
|
|
|
|
return undefined;
|
|
|
|
|
|
|
|
// @todo Search 1zzzzEE..., 1zzzz...
|
|
|
|
var to = viewdata ? new FrameViewdata() : new FrameAnsi();
|
2023-12-24 06:44:02 +00:00
|
|
|
to.load(MAIL_TEMPLATE_FRAME,ext);
|
2022-12-09 06:19:33 +00:00
|
|
|
// @todo Check that this is a frame of type "m" and report error if not
|
|
|
|
// @todo Take the cost from the template
|
|
|
|
this.cost = 5;
|
|
|
|
|
|
|
|
if (! to) {
|
|
|
|
log(LOG_ERROR,'Echomail template missing :['+MAIL_TEMPLATE_FRAME+'] ?');
|
|
|
|
msg_header = 'TO: '+msg.to.substr(0,72)+"\n\r";
|
|
|
|
msg_header += 'FROM: '+msg.from.substr(0,72)+"\n\r";
|
|
|
|
msg_header += 'DATE: '+msg.date.substr(0,72)+"\n\r";
|
|
|
|
msg_header += 'SUBJECT: '+msg.subject.substr(0,72)+"\n\r";
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// @todo change this to use atcode()
|
|
|
|
msg_header = base64_decode(to.content).replace(/@(.*)@/g,
|
|
|
|
function (str, code, offset, s) {
|
|
|
|
var length = code.split(':')[1];
|
|
|
|
switch(code.split(':')[0]) {
|
|
|
|
case 'DATE': return msg.date.substr(0,length);
|
|
|
|
case 'TO': return msg.to.substr(0,length);
|
|
|
|
case 'FROM': return msg.from.substr(0,length);
|
|
|
|
case 'SUBJECT': return msg.subject.substr(0,length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
//log(LOG_DEBUG,'Loaded message: '+msg_header+msg.content);
|
|
|
|
this.content = base64_encode(msg_header+msg.content);
|
|
|
|
|
|
|
|
// Update the user's pointers
|
|
|
|
var stats = ma.getUserStats(this.frame);
|
|
|
|
|
|
|
|
// if this message is to the user, and the msg number > scan_ptr and it is the next message on the user's new mail list
|
|
|
|
var newmsgs = area.newMsgsToMe();
|
|
|
|
var next;
|
|
|
|
log(LOG_DEBUG,'User has: '+newmsgs.length-1+' msgs to read to ME');
|
|
|
|
if (newmsgs.length) {
|
|
|
|
next = newmsgs[1];
|
|
|
|
//log(LOG_DEBUG,'- NEXT is: '+next.tags+', this is: '+msg.tags);
|
|
|
|
|
|
|
|
if (next && (next.tags === msg.tags)) {
|
|
|
|
log(LOG_DEBUG,'- Updating scan_ptr to: '+next.number);
|
|
|
|
stats.scan_ptr = next.number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Last message
|
|
|
|
next = newmsgs[0];
|
|
|
|
if (next !== undefined) {
|
|
|
|
log(LOG_DEBUG,'- LAST TO ME is: '+next.tags);
|
|
|
|
this.key[1] = area.page(next.tags);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Next new message
|
|
|
|
next = newmsgs[2];
|
|
|
|
if (next !== undefined) {
|
|
|
|
log(LOG_DEBUG,'- NEXT TO ME is: '+next.tags);
|
|
|
|
this.key[2] = area.page(next.tags);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// if this message is the next message, update last_read
|
|
|
|
newmsgs = area.newMsgs();
|
|
|
|
log(LOG_DEBUG,'User has: '+newmsgs.length+' msgs to read');
|
|
|
|
if (newmsgs.length) {
|
|
|
|
next = newmsgs[0];
|
|
|
|
log(LOG_DEBUG,'- NEXT is: '+next.tags+', this is: '+msg.tags);
|
|
|
|
|
|
|
|
if (next.tags === msg.tags) {
|
|
|
|
log(LOG_DEBUG,'- Updating last_read to: '+next.number);
|
|
|
|
stats.last_read = next.number;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Previous Message
|
|
|
|
x = area.MessagePrev(this.frame);
|
|
|
|
if (x)
|
|
|
|
this.key[4] = area.page(x.tags);
|
|
|
|
|
|
|
|
// Next Message
|
|
|
|
x = area.MessageNext(this.frame);
|
|
|
|
if (x)
|
|
|
|
this.key[6] = area.page(x.tags);
|
|
|
|
|
|
|
|
log(LOG_DEBUG,'Built frame: ['+this.frame+']['+this.index+'] ('+this.page+')');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Render the page
|
|
|
|
this.render = function() {
|
|
|
|
this.gotoxy(0,0);
|
|
|
|
write(so.page.display().join(''));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the message for a index
|
|
|
|
*
|
|
|
|
* @param index
|
|
|
|
* @returns {string|*}
|
|
|
|
*/
|
|
|
|
Session.prototype.getMessage = function(index) {
|
|
|
|
eval('var msg = this.settings.'+index);
|
|
|
|
return msg;
|
|
|
|
}
|