* File Base newscan basic functionality

* Try to handle unknown options in telnet server
This commit is contained in:
Bryan Ashby 2017-07-17 19:46:38 -06:00
parent d230a2f58b
commit d57ca0873e
7 changed files with 108 additions and 60 deletions

View File

@ -1,6 +1,7 @@
/* jslint node: true */ /* jslint node: true */
'use strict'; 'use strict';
// deps
const _ = require('lodash'); const _ = require('lodash');
const uuidV4 = require('uuid/v4'); const uuidV4 = require('uuid/v4');
@ -122,22 +123,27 @@ module.exports = class FileBaseFilters {
system : true, system : true,
} }
}; };
/*
filters[U_LATEST] = {
name : 'Latest Additions',
areaTag : '', // all
terms : '', // *
tags : '', // *
order : 'descending',
sort : 'upload_timestamp',
uuid : U_LATEST,
system : true,
};
*/
return filters; return filters;
} }
static getActiveFilter(client) { static getActiveFilter(client) {
return new FileBaseFilters(client).get(client.user.properties.file_base_filter_active_uuid); return new FileBaseFilters(client).get(client.user.properties.file_base_filter_active_uuid);
} }
static getFileBaseLastViewedFileIdByUser(user) {
return user.properties.user_file_base_last_viewed || 0;
}
static setFileBaseLastViewedFileIdForUser(user, fileId, cb) {
const current = FileBaseFilters.getFileBaseLastViewedFileIdByUser(user);
if(fileId < current) {
if(cb) {
cb(null);
}
return;
}
return user.persistProperty('user_file_base_last_viewed', fileId, cb);
}
}; };

View File

@ -510,6 +510,14 @@ module.exports = class FileEntry {
); );
} }
if(_.isString(filter.newerThanTimestamp) && filter.newerThanTimestamp.length > 0) {
appendWhereClause(`DATETIME(f.upload_timestamp) > DATETIME("${filter.newerThanTimestamp}", "+1 seconds")`);
}
if(_.isNumber(filter.newerThanFileId)) {
appendWhereClause(`file_id > ${filter.newerThanFileId}`);
}
sql += `${sqlWhere} ${sqlOrderBy};`; sql += `${sqlWhere} ${sqlOrderBy};`;
const matchingFileIds = []; const matchingFileIds = [];

View File

@ -6,6 +6,9 @@ const msgArea = require('./message_area.js');
const MenuModule = require('./menu_module.js').MenuModule; const MenuModule = require('./menu_module.js').MenuModule;
const ViewController = require('./view_controller.js').ViewController; const ViewController = require('./view_controller.js').ViewController;
const stringFormat = require('./string_format.js'); const stringFormat = require('./string_format.js');
const FileEntry = require('./file_entry.js');
const FileBaseFilters = require('./file_base_filter.js');
const Errors = require('./enig_error.js').Errors;
// deps // deps
const _ = require('lodash'); const _ = require('lodash');
@ -30,13 +33,21 @@ const MciCodeIds = {
ScanStatusList : 2, // VM2 (appends) ScanStatusList : 2, // VM2 (appends)
}; };
const Steps = {
MessageConfs : 'messageConferences',
FileBase : 'fileBase',
Finished : 'finished',
};
exports.getModule = class NewScanModule extends MenuModule { exports.getModule = class NewScanModule extends MenuModule {
constructor(options) { constructor(options) {
super(options); super(options);
this.newScanFullExit = _.has(options, 'lastMenuResult.fullExit') ? options.lastMenuResult.fullExit : false;
this.currentStep = 'messageConferences'; this.newScanFullExit = _.get(options, 'lastMenuResult.fullExit', false);
this.currentStep = Steps.MessageConfs;
this.currentScanAux = {}; this.currentScanAux = {};
// :TODO: Make this conf/area specific: // :TODO: Make this conf/area specific:
@ -49,13 +60,6 @@ exports.getModule = class NewScanModule extends MenuModule {
updateScanStatus(statusText) { updateScanStatus(statusText) {
this.setViewText('allViews', MciCodeIds.ScanStatusLabel, statusText); this.setViewText('allViews', MciCodeIds.ScanStatusLabel, statusText);
/*
view = vc.getView(MciCodeIds.ScanStatusList);
// :TODO: MenuView needs appendItem()
if(view) {
}
*/
} }
newScanMessageConference(cb) { newScanMessageConference(cb) {
@ -88,32 +92,19 @@ exports.getModule = class NewScanModule extends MenuModule {
} }
const currentConf = this.sortedMessageConfs[this.currentScanAux.conf]; const currentConf = this.sortedMessageConfs[this.currentScanAux.conf];
const self = this;
async.series( this.newScanMessageArea(currentConf, () => {
[ if(this.sortedMessageConfs.length > this.currentScanAux.conf + 1) {
function scanArea(callback) { this.currentScanAux.conf += 1;
//self.currentScanAux.area = self.currentScanAux.area || 0; this.currentScanAux.area = 0;
self.newScanMessageArea(currentConf, () => { return this.newScanMessageConference(cb); // recursive to next conf
if(self.sortedMessageConfs.length > self.currentScanAux.conf + 1) {
self.currentScanAux.conf += 1;
self.currentScanAux.area = 0;
self.newScanMessageConference(cb); // recursive to next conf
//callback(null);
} else {
self.updateScanStatus(self.scanCompleteMsg);
callback(new Error('No more conferences'));
} }
this.updateScanStatus(this.scanCompleteMsg);
return cb(Errors.DoesNotExist('No more conferences'));
}); });
} }
],
err => {
return cb(err);
}
);
}
newScanMessageArea(conf, cb) { newScanMessageArea(conf, cb) {
// :TODO: it would be nice to cache this - must be done by conf! // :TODO: it would be nice to cache this - must be done by conf!
@ -134,7 +125,7 @@ exports.getModule = class NewScanModule extends MenuModule {
return callback(null); return callback(null);
} else { } else {
self.updateScanStatus(self.scanCompleteMsg); self.updateScanStatus(self.scanCompleteMsg);
return callback(new Error('No more areas')); // this will stop our scan return callback(Errors.DoesNotExist('No more areas')); // this will stop our scan
} }
}, },
function updateStatusScanStarted(callback) { function updateStatusScanStarted(callback) {
@ -173,6 +164,28 @@ exports.getModule = class NewScanModule extends MenuModule {
); );
} }
newScanFileBase(cb) {
// :TODO: add in steps
FileEntry.findFiles(
{ newerThanFileId : FileBaseFilters.getFileBaseLastViewedFileIdByUser(this.client.user) },
(err, fileIds) => {
if(err || 0 === fileIds.length) {
return cb(err ? err : Errors.DoesNotExist('No more new files'));
}
FileBaseFilters.setFileBaseLastViewedFileIdForUser( this.client.user, fileIds[0] );
const menuOpts = {
extraArgs : {
fileList : fileIds,
},
};
return this.gotoMenu(this.menuConfig.config.newScanFileBaseList || 'newScanFileBaseList', menuOpts);
}
);
}
getSaveState() { getSaveState() {
return { return {
currentStep : this.currentStep, currentStep : this.currentStep,
@ -185,6 +198,26 @@ exports.getModule = class NewScanModule extends MenuModule {
this.currentScanAux = savedState.currentScanAux; this.currentScanAux = savedState.currentScanAux;
} }
performScanCurrentStep(cb) {
switch(this.currentStep) {
case Steps.MessageConfs :
this.newScanMessageConference( () => {
this.currentStep = Steps.FileBase;
return this.performScanCurrentStep(cb);
});
break;
case Steps.FileBase :
this.newScanFileBase( () => {
this.currentStep = Steps.Finished;
return this.performScanCurrentStep(cb);
});
break;
default : return cb(null);
}
}
mciReady(mciData, cb) { mciReady(mciData, cb) {
if(this.newScanFullExit) { if(this.newScanFullExit) {
// user has canceled the entire scan @ message list view // user has canceled the entire scan @ message list view
@ -213,15 +246,7 @@ exports.getModule = class NewScanModule extends MenuModule {
vc.loadFromMenuConfig(loadOpts, callback); vc.loadFromMenuConfig(loadOpts, callback);
}, },
function performCurrentStepScan(callback) { function performCurrentStepScan(callback) {
switch(self.currentStep) { return self.performScanCurrentStep(callback);
case 'messageConferences' :
self.newScanMessageConference( () => {
callback(null); // finished
});
break;
default : return callback(null);
}
} }
], ],
err => { err => {

View File

@ -184,6 +184,10 @@ const OPTION_NAMES = Object.keys(OPTIONS).reduce(function(names, name) {
return names; return names;
}, {}); }, {});
function unknownOption(bufs, i, event) {
Log.warn( { bufs : bufs, i : i, event : event }, 'Unknown Telnet option');
}
const OPTION_IMPLS = {}; const OPTION_IMPLS = {};
// :TODO: fill in the rest... // :TODO: fill in the rest...
OPTION_IMPLS.NO_ARGS = OPTION_IMPLS.NO_ARGS =
@ -421,7 +425,9 @@ function parseOption(bufs, i, event) {
const option = bufs.get(i); // :TODO: fix deprecation... [i] is not the same const option = bufs.get(i); // :TODO: fix deprecation... [i] is not the same
event.optionCode = option; event.optionCode = option;
event.option = OPTION_NAMES[option]; event.option = OPTION_NAMES[option];
return OPTION_IMPLS[option](bufs, i + 1, event);
const handler = OPTION_IMPLS[option];
return handler ? handler(bufs, i + 1, event) : unknownOption(bufs, i + 1, event);
} }

View File

@ -507,6 +507,8 @@ function createCleanAnsi(input, options, cb) {
parser.parse(input); parser.parse(input);
} }
// create2dArray = (rows, columns) => [...Array(rows).keys()].map(i => Array(columns).fill({}))
/* /*
const fs = require('graceful-fs'); const fs = require('graceful-fs');

View File

@ -76,6 +76,7 @@ exports.getModule = class FileAreaList extends MenuModule {
if(options.extraArgs) { if(options.extraArgs) {
this.filterCriteria = options.extraArgs.filterCriteria; this.filterCriteria = options.extraArgs.filterCriteria;
this.fileList = options.fileList;
} }
this.dlQueue = new DownloadQueue(this.client); this.dlQueue = new DownloadQueue(this.client);

View File

@ -39,7 +39,7 @@
"ptyw.js": "NuSkooler/ptyw.js", "ptyw.js": "NuSkooler/ptyw.js",
"sanitize-filename": "^1.6.1", "sanitize-filename": "^1.6.1",
"sqlite3": "^3.1.1", "sqlite3": "^3.1.1",
"ssh2": "^0.5.1", "ssh2": "^0.5.5",
"temptmp": "^1.0.0", "temptmp": "^1.0.0",
"uuid": "^3.0.1", "uuid": "^3.0.1",
"uuid-parse": "^1.0.0", "uuid-parse": "^1.0.0",