Best JavaScript code snippet using redwood
50-cpanel.js
Source:50-cpanel.js  
1/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 fileencoding=utf-8 : */2/*3 *     Copyright 2013, 2014, 2018 James Burlingame4 *5 *     Licensed under the Apache License, Version 2.0 (the "License");6 *     you may not use this file except in compliance with the License.7 *     You may obtain a copy of the License at8 *9 *         http://www.apache.org/licenses/LICENSE-2.010 *11 *     Unless required by applicable law or agreed to in writing, software12 *     distributed under the License is distributed on an "AS IS" BASIS,13 *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.14 *     See the License for the specific language governing permissions and15 *     limitations under the License.16 *17 */18// enable JavaScript strict mode.19'use strict';20// module imports21const fs = require('fs');22const path = require('path');23const _ = require('lodash');24const when = require('when');25const yaml = require('js-yaml');26const scanfile = require('../scanfile.js');27// Constants28/** Main (non-vhost) access log. */29const CPANEL_MAIN_LOG = '/usr/local/apache/logs/access_log';30/** Panel access log pathname. */31const CPANEL_PANEL_LOG = '/usr/local/cpanel/logs/access_log';32/** Prefix to most access log files. */33const CPANEL_PREFIX = '/usr/local/apache/domlogs';34/** Pathname of the cPanel userdata directory. */35const CPANEL_USERDATA_DIR = '/var/cpanel/userdata';36/** Pathname of user domains configuration file. */37const CPANEL_USERDOMAINS = '/etc/userdomains';38/** Pathname of the cPanel version file. */39const CPANEL_VERSION_FILE = '/usr/local/cpanel/version';40/** Names of files to ignore. */41const IGNORED_FILENAME =42    [43        'ftpxferlog',44        'ftpxferlog.offset',45        'ftpxferlog.offsetftpsep'46    ];47/** Suffixes of ignored files. */48const IGNORED_SUFFIX =49    [50        '-bytes_log',51        '-bytes_log.offset',52        '-ftp_log',53        '-ftp_log.offsetftpbytes',54        '-ftp_log.offset',55        '.bkup',56        '.bkup2'57    ];58/** Patterns for ignored files. */59const IGNORED_PATTERN =60    [61        new RegExp(/-ftp_log-...-\d\d\d\d\.gz$/)62    ];63/** Name of months used in Archive file names. */64const MONTH_NAMES =65    [66        'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',67        'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'68    ];69/** Pattern used to recognize an archived log file. */70// var archivePattern = new RegExp(/^(.*)(-ssl_log)?-(...-\d\d\d\d)\.gz/);71/** promise of contents of the /etc/userdomains file */72var userdomains = null;73/** promises of the contents of the /var/cpanel/userdata/<account>/main */74const mains = { };75/**76 *  Load the contents of the /var/cpanel/userdata/<account>/main file77 *  @arg account name.78 */79function loadAccountMain(account) {80    if (!mains[account]) {81        const d = when.defer();82        mains[account] = d.promise;83        const pathname = scanfile.getRootPathname(path.join(CPANEL_USERDATA_DIR, account, 'main'));84        fs.readFile(pathname, {encoding: 'utf8', flag: 'r'}, function (err, data) {85            if (err) {86                d.resolve('');87            } else {88                d.resolve(data);89            }90        });91    }92}93/**94 *  Determine an account's home directory.95 *  @arg account name.96 *  @rtype promise for a pathname of the account's home directory.97 */98function getAccountHomeDirectory(account) {99    const d = when.defer();100    const pathname = scanfile.getRootPathname(path.join(CPANEL_USERDATA_DIR, account, 'main'));101    loadAccountMain(account);102    mains[account].then((data) => {103        var contents = null;104        try {105            contents = yaml.safeLoad(data, { filename: pathname });106        } catch (e) {107            // ignore108        }109        if (contents && contents.main_domain) {110            const pathname = scanfile.getRootPathname(path.join(CPANEL_USERDATA_DIR, account, contents.main_domain));111            const domain = fs.readFileSync(pathname, {encoding: 'utf8', flag: 'r'});112            contents = null;113            try {114                contents = yaml.safeLoad(domain, { filename: pathname });115            } catch (e) {116                // ignore117            }118        }119        if (contents && contents.homedir) {120            d.resolve(scanfile.getRootPathname(contents.homedir));121        } else {122            d.resolve(scanfile.getRootPathname('/home/' + account));123        }124    });125    return d.promise;126}127/**128 *  Determine all account names.129 *  @rtype Array of String.130 */131function getAllAccounts() {132    const d = when.defer();133    const dir = scanfile.getRootPathname(CPANEL_USERDATA_DIR);134    fs.readdir(dir, function (err, contents) {135        const accounts = [];136        if (!err) {137            contents.forEach((name) => {138                if (name != 'nobody') {139                    accounts.push(name);140                }141            });142        }143        d.resolve(accounts);144    });145    return d.promise;146}147/**148 *  Find all log files associated with an account.149 *  @arg account name.150 *  @rtype promise for an Array of ScanFile.151 */152function getAccountLogFiles(account) {153    const promises = [];154    const domains = [];155    const deferred = when.defer();156    loadAccountMain(account);157    mains[account].then(function (data) {158        var contents = null;159        try {160            contents = yaml.safeLoad(data);161        } catch (e) {162            console.error(e.message);163        }164        if (contents) {165            if (contents.main_domain) {166                domains.push({ 'domain': contents.main_domain, 'subdomain': contents.main_domain });167            }168            if (contents.addon_domains) {169                for (var domain in contents.addon_domains) {170                    domains.push({ 'domain': domain, 'subdomain': contents.addon_domains[domain] });171                }172            }173            if (contents.sub_domains) {174                contents.sub_domains.forEach((name) => {175                    const found = domains.some((domain) => domain.subdomain == name);176                    if (!found) {177                        domains.push({ 'domain': name, 'subdomain': name });178                    }179                });180            }181            domains.forEach((entry) => {182                const filename = path.join(CPANEL_PREFIX, entry.subdomain);183                const pathname = scanfile.getRootPathname(filename);184                const d = when.defer();185                const files = [];186                promises.push(d.promise);187                fs.exists(pathname, (yes) => {188                    if (yes) {189                        files.push(new scanfile.ScanFile(filename, pathname, entry.domain));190                    }191                    const sslFilename = filename + '-ssl_log';192                    const sslPathname = pathname + '-ssl_log';193                    fs.exists(sslPathname, (yes) => {194                        if (yes) {195                            files.push(new scanfile.ScanFile(sslFilename, sslPathname, entry.domain));196                        }197                        d.resolve(files);198                    });199                });200            });201        }202    }).then(() => {203        when.all(promises).then(function (array) {204            deferred.resolve(_.flatten(array));205        });206    });207    return deferred.promise;208}209/**210 *  Get a list of month-year strings used to access archived log files.211 *  @arg start : starting Date.212 *  @arg stop : ending Date.213 *  @rtype Array of String.214 */215function getArchiveMonths(start, stop) {216    var months = [];217    var month, year;218    year = start.getFullYear();219    if (year == stop.getFullYear()) {   // less than a full year220        month = start.getMonth();221    } else {    // more than one year222        // first partial year223        for (month = start.getMonth(); month < 12; month++) {224            months.push(MONTH_NAMES[month] + '-' + year);225        }226        // full years227        for (year += 1; year < stop.getFullYear(); year++) {228            for (month= 0; month < 12; month++) {229                months.push(MONTH_NAMES[month] + '-' + year);230            }231        }232        year = stop.getFullYear();233        month = 0;234    }235    // last partial year236    for (; month <= stop.getMonth(); month++) {237        months.push(MONTH_NAMES[month] + '-' + year);238    }239    return months;240}241/**242 *  Find all archived log files for an account.243 *  @arg account name.244 *  @arg months Array of String values of Month-Years to check.245 *  @rtype promise for an Array of ScanFile.246 */247function getAccountArchiveFiles(account, months) {248    var deferred = when.defer();249    var files = [];250    getAccountHomeDirectory(account).then(function (homedir) {251        var logsdir = path.join(homedir, 'logs');252        loadAccountMain(account);253        mains[account].then(function (data) {254            var contents = null;255            var domains = [];256            try {257                contents = yaml.safeLoad(data);258            } catch (e) {259                // ignore260            }261            if (!contents) {262                deferred.resolve([]);263                return;264            }265            if (contents.main_domain) {266                domains.push({ 'domain': contents.main_domain, 'subdomain': contents.main_domain });267            }268            if (contents.addon_domains) {269                for (var domain in contents.addon_domains) {270                    domains.push({ 'domain': domain, 'subdomain': contents.addon_domains[domain] });271                }272            }273            if (contents.sub_domains) {274                contents.sub_domains.forEach(function (name) {275                    var found = false;276                    for (var n=0, length= domains.length; n < length; n++) {277                        if (domains[n].subdomain == name) {278                            found = true;279                            break;280                        }281                    }282                    if (!found) {283                        domains.push({ 'domain': name, 'subdomain': name });284                    }285                });286            }287            fs.readdir(logsdir, function (err, logfiles) {288                var filename, pathname;289                if (!err) {290                    domains.forEach(function (entry) {291                        months.forEach(function (month) {292                            filename = entry.subdomain + '-' + month + '.gz';293                            if (logfiles.indexOf(filename) >= 0) {294                                pathname = path.join(logsdir, filename);295                                files.push(new scanfile.ScanFile(undefined, pathname, entry.domain));296                            }297                            filename = entry.subdomain + '-ssl_log-' + month + '.gz';298                            if (logfiles.indexOf(filename) >= 0) {299                                pathname = path.join(logsdir, filename);300                                files.push(new scanfile.ScanFile(undefined, pathname, entry.domain));301                            }302                        });303                    });304                }305                deferred.resolve(files);306            });307        });308    });309    return deferred.promise;310}311/**312 *  Determine Domain log files.313 *  @arg domain name used for filename.314 *  @arg cannoincal domain name used for grouping.315 *  @rtype promise for an Array of ScanFile.316 */317function getDomainLogFiles(domain, cannonical) {318    var deferred = when.defer();319    var files = [];320    var filename, pathname;321    // check for standard log322    filename = path.join(CPANEL_PREFIX, domain);323    pathname = scanfile.getRootPathname(filename);324    fs.exists(pathname, function (yes) {325        if (yes) {326            files.push(new scanfile.ScanFile(filename, pathname, cannonical));327        }328        // check for secure log329        filename += '-ssl_log';330        pathname += '-ssl_log';331        fs.exists(pathname, function (yes) {332            if (yes) {333                files.push(new scanfile.ScanFile(filename, pathname, cannonical));334            }335            deferred.resolve(files);336        });337    });338    return deferred.promise;339}340/**341 *  Determine the owner of a domain.342 *  @arg domain name.343 *  @rtype promise to a String account name (null if not found.)344 */345function getDomainOwner(domain) {346    if (userdomains === null) {347        var d = when.defer();348        userdomains = d.promise;349        var pathname = scanfile.getRootPathname(CPANEL_USERDOMAINS);350        fs.readFile(pathname, { encoding: 'utf8' }, (err, contents) => {351            if (err) {352                d.resolve('');353            } else {354                d.resolve(contents);355            }356        });357    }358    var deferred= when.defer();359    userdomains.then(function (contents) {360        var pattern = new RegExp('^' + domain + ': (.*)$', 'im');361        var find = pattern.exec(contents);362        if (find) {363            deferred.resolve(find[1]);364        } else {365            deferred.resolve(null);366        }367    });368    return deferred.promise;369}370/**371 *  Deterine the subdomain version of an addon domain name.372 *  @arg domain name.373 *  @rtype promise to a String subdomain version of an addon domain name.374 */375function getSubdomainName(domain) {376    var d = when.defer();377    getDomainOwner(domain).then((username) => {378        if (username === null) {379            d.resolve(null);380        } else {381            const pathname = scanfile.getRootPathname(path.join(CPANEL_USERDATA_DIR, username, 'main'));382            loadAccountMain(username);383            mains[username].then((data) => {384                var contents=null;385                try {386                    contents = yaml.safeLoad(data, { filename: pathname });387                } catch (e) {388                    d.reject(e);389                }390                if (contents && contents.addon_domains && contents.addon_domains[domain]) {391                    d.resolve(contents.addon_domains[domain]);392                } else {393                    d.resolve(null);394                }395            });396        }397    });398    return d.promise;399}400function isIgnoredFilename(filename) {401    return (IGNORED_FILENAME.indexOf(filename) >= 0);402}403function isIgnoredSuffix(filename) {404    return IGNORED_SUFFIX.some((suffix) => (suffix.length < filename.length) && (suffix == filename.substr(-suffix.length)));405}406function isIgnoredPattern(filename) {407    return IGNORED_PATTERN.some((pattern) => pattern.test(filename));408}409/**410 *  Check if file should not be included in results.411 *  @arg filename to check.412 *  @rtype Boolean - true to ignore file, false to include file.413 */414function isIgnoredFile(filename) {415    return isIgnoredFilename(filename) || isIgnoredSuffix(filename) || isIgnoredPattern(filename);416}417/**418 *  Interface to use when cPanel is found for root.419 */420var cPanel = {421    /** Identifier of the panel interface. */422    id : 'cPanel',423    /** Does this panel support --accounts option. */424    hasAccounts : true,425    /** Does this panel support --archives option. */426    hasArchives : true,427    /** Does this panel support --domains and --domlogs options. */428    hasDomains : true,429    /** Does this panel support --panel option. */430    hasPanelLog : true,431    /** Does this panel support --main option. */432    hasMainLog : true,433    /**434      * Deterine if the panel is installed.435      * @rtype Boolean. Use cPanel version file to check installation.436      */437    isActive : function() {438        var pathname = scanfile.getRootPathname(CPANEL_VERSION_FILE);439        return fs.existsSync(pathname);440    },441    /**442     *  Find all available log files for accounts and domains.443     *  @rtype promise for an Array of ScanFile.444     */445    findAllLogFiles : function () {446        const deferred = when.defer();447        const promises = [];448        const accounts = getAllAccounts();449        accounts.then((list) => {450            list.forEach((account) => {451                promises.push(getAccountLogFiles(account));452            });453            when.all(promises).then((array) => {454                deferred.resolve(_.flatten(array));455            });456        });457        return deferred.promise;458    },459    /**460     *  Find all log files associated with an account.461     *  @arg account name.462     *  @rtype promise for an Array of ScanFile.463     */464    findAccountLogFiles : function (account) {465        return getAccountLogFiles(account);466    },467    /**468     *  Find log files associated with a single domain.469     *  @arg domain name.470     *  @rtype promise for an Array of ScanFile.471     */472    findDomainLogFiles : function (domain) {473        const promises = [];474        const deferred = when.defer();475        getSubdomainName(domain).then((subdomain) => {476            if (subdomain) {477                promises.push(getDomainLogFiles(subdomain, domain));478            }479            promises.push(getDomainLogFiles(domain, domain));480            when.all(promises).then((array) => {481                deferred.resolve(_.flatten(array));482            });483        });484        return deferred.promise;485    },486    /**487     *  Find the main (no vhost) log files.488     *  @rtype promise for an Array of ScanFile.489     */490    findMainLogFiles : function () {491        const pathname = scanfile.getRootPathname(CPANEL_MAIN_LOG);492        const d = when.defer();493        fs.exists(pathname, (yes) => {494            if (yes) {495                d.resolve([ new scanfile.ScanFile(CPANEL_MAIN_LOG, pathname, 'main') ]);496            } else {497                d.resolve([]);498            }499        });500        return d.promise;501    },502    /**503     *  Find the log files associated with the panel itself.504     *  @rtype promise for an Array of ScanFile.505     */506    findPanelLogFiles : function () {507        const pathname = scanfile.getRootPathname(CPANEL_PANEL_LOG);508        const d = when.defer();509        fs.exists(pathname, (yes) => {510            if (yes) {511                d.resolve([ new scanfile.ScanFile(CPANEL_PANEL_LOG, pathname, 'panel') ]);512            } else {513                d.resolve([]);514            }515        });516        return d.promise;517    },518    /**519     *  Find all archived log files between the start and stop Date's.520     *  @arg start first Date of archives.521     *  @arg stop last Date of archives.522     *  @rtype promise for an Array of ScanFile.523     */524    findAllArchiveFiles : function (start, stop) {525        const months = getArchiveMonths(start, stop);526        const promises = [];527        const accounts = getAllAccounts();528        const deferred = when.defer();529        accounts.then((list) => {530            list.forEach((account) => {531                promises.push(getAccountArchiveFiles(account, months));532            });533            when.all(promises).then((array) => {534                deferred.resolve(_.flatten(array));535            });536        });537        return deferred.promise;538    },539    /**540     *  Find all archived log files for an account.541     *  @arg account name.542     *  @arg start first Date of archives.543     *  @arg stop last Date of archives.544     *  @rtype promise for an Array of ScanFile.545     */546    findAccountArchiveFiles : function (account, start, stop) {547        const months = getArchiveMonths(start, stop);548        return getAccountArchiveFiles(account, months);549    },550    /**551     *  Find all archived log files for a domain.552     *  @arg domain name.553     *  @arg start first Date of archives.554     *  @arg stop last Date of archives.555     *  @rtype promise for an Array of ScanFile.556     */557    findDomainArchiveFiles : function (domain, start, stop) {558        const d = when.defer();559        getDomainOwner(domain).then((account) => {560            if (!account) {561                d.resolve([]);562                return;563            }564            getSubdomainName(domain).then((subdomain) => {565                getAccountHomeDirectory(account).then((homedir) => {566                    const logsdir = path.join(homedir, 'logs');567                    const months = getArchiveMonths(start, stop);568                    const files = [];569                    fs.readdir(logsdir, (err, logfiles) => {570                        if (err) {571                            d.resolve([]);572                            return;573                        }574                        var filename, pathname;575                        months.forEach((month) => {576                            filename = domain + '-' + month + '.gz';577                            if (logfiles.indexOf(filename) >= 0) {578                                pathname = path.join(logsdir, filename);579                                files.push(new scanfile.ScanFile(undefined, pathname, domain));580                            } else if (subdomain) {581                                filename = subdomain + '-' + month + '.gz';582                                if (logfiles.indexOf(filename) >= 0) {583                                    pathname = path.join(logsdir, filename);584                                    files.push(new scanfile.ScanFile(undefined, pathname, domain));585                                }586                            }587                            filename = domain + '-ssl_log-' + month + '.gz';588                            if (logfiles.indexOf(filename) >= 0) {589                                pathname = path.join(logsdir, filename);590                                files.push(new scanfile.ScanFile(undefined, pathname, domain));591                            } else if (subdomain) {592                                filename = subdomain + '-ssl_log-' + month + '.gz';593                                if (logfiles.indexOf(filename) >= 0) {594                                    pathname = path.join(logsdir, filename);595                                    files.push(new scanfile.ScanFile(undefined, pathname, domain));596                                }597                            }598                        });599                        d.resolve(files);600                    });601                });602            });603        });604        return d.promise;605    },606    /**607     *  Find all archived main log files.608     *  @arg start first Date of archives.609     *  @arg stop last Date of archives.610     *  @rtype promise for an (empty) Array of ScanFile.611     */612    findMainArchiveFiles : function (start, stop) {     // eslint-disable-line no-unused-vars613        return when([]);614    },615    /**616     *  Find all archived panel log files.617     *  @arg start first Date of archives.618     *  @arg stop last Date of archives.619     *  @rtype promise for an (empty) Array of ScanFile.620     */621    findPanelArchiveFiles : function (start, stop) {     // eslint-disable-line no-unused-vars622        return when([]);623    },624    /**625     *  Find a single log file.626     *  @arg filename - name of the log file.627     *  @rtype promise to array of ScanFile.628     */629    findLogFile : function (filename) {630        const pathname = scanfile.getRootPathname(filename);631        const d = when.defer();632        fs.exists(pathname, (yes) => {633            if (yes) {634                d.resolve([ new scanfile.ScanFile(filename, pathname, 'file') ]);635            } else {636                fs.exists(filename, (yes) => {637                    if (yes) {638                        d.resolve([ new scanfile.ScanFile(filename, filename, 'file') ]);639                    } else if (filename == '-') {640                        d.resolve([ new scanfile.ScanFile('-', undefined, 'file') ]);641                    } else {642                        d.resolve([]);643                    }644                });645            }646        });647        return d.promise;648    },649    /**650     *  Find all log files in a directory.651     *  @arg dir directory name.652     *  @rtype promise to Array of ScanFile.653     */654    findLogFilesInDirectory : function (dir) {655        const dirpath = scanfile.getRootPathname(dir);656        const deferred = when.defer();657        const promises = [];658        fs.readdir(dirpath, (err, files) => {659            if (err) {660                deferred.resolve([]);661            } else {662                files.forEach((file) => {663                    const d = when.defer();664                    promises.push(d.promise);665                    const pathname= path.join(dirpath, file);666                    const filename= path.join(dir, file);667                    if (isIgnoredFile(file)) {668                        d.resolve([]);669                    } else {670                        fs.stat(pathname, (err, stats) => {671                            if (!err && stats.isFile()) {672                                d.resolve([ new scanfile.ScanFile(filename, pathname, 'directory') ]);673                            } else {674                                d.resolve([]);675                            }676                        });677                    }678                });679                when.all(promises).then((array) => {680                    deferred.resolve(_.flatten(array));681                });682            }683        });684        return deferred.promise;685    }686};...scanfile-test.js
Source:scanfile-test.js  
1/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 fileencoding=utf-8 : */2/*3 *     Copyright 2013 James Burlingame4 *5 *     Licensed under the Apache License, Version 2.0 (the "License");6 *     you may not use this file except in compliance with the License.7 *     You may obtain a copy of the License at8 *9 *         http://www.apache.org/licenses/LICENSE-2.010 *11 *     Unless required by applicable law or agreed to in writing, software12 *     distributed under the License is distributed on an "AS IS" BASIS,13 *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.14 *     See the License for the specific language governing permissions and15 *     limitations under the License.16 *17 */18// enable JavaScript strict mode.19'use strict';20const path = require('path');21const testData = require('../test/testData.js');22const scanfile = require('../lib/scanfile.js');23const ScanFile = scanfile.ScanFile;24var s = null;25describe('scanfile', () => {26    beforeEach(() => {27        s = scanfile;28    });29    describe('getRootPathname', () => {30        describe('default root directory', () => {31            beforeEach(() => s.setRootDirectory(''));32            test('-', () => expect(s.getRootPathname('-')).toEqual('/dev/fd/0'));33            test('/dev/null', () => expect(s.getRootPathname('/dev/null')).toEqual('/dev/null'));34            test('/etc/passwd', () => expect(s.getRootPathname('/etc/passwd')).toEqual('/etc/passwd'));35            test('filename', () => expect(s.getRootPathname('filename')).toEqual('filename'));36        });37        describe('test root directory', () => {38            beforeEach(() => s.setRootDirectory(testData.getDataDirectory()));39            test('-', () => expect(s.getRootPathname('-')).toEqual('/dev/fd/0'));40            test('filename', () => expect(s.getRootPathname('filename')).toEqual('filename'));41            test('/logs/samplx.org', () => {42                const pathname = s.getRootPathname('/logs/samplx.org');43                const expected = path.join(testData.getDataDirectory(), 'logs', 'samplx.org');44                expect(pathname).toEqual(expected);45            });46        });47    });48    describe('ScanFile class', () => {49        test('ScanFile(undefined, pathname, domain)', () => {50            s.setRootDirectory('');51            const file = new ScanFile(undefined, '/usr/local/apache/domlogs/samplx.org', 'samplx.org');52            expect(file.filename).toEqual('/usr/local/apache/domlogs/samplx.org');53            expect(file.pathname).toEqual('/usr/local/apache/domlogs/samplx.org');54            expect(file.domain).toEqual('samplx.org');55        });56        test('call constructor function directly with ScanFile(undefined, pathname, domain)', () => {57            s.setRootDirectory('');58            const file = ScanFile(undefined, '/usr/local/apache/domlogs/samplx.org', 'samplx.org');59            expect(file.filename).toEqual('/usr/local/apache/domlogs/samplx.org');60            expect(file.pathname).toEqual('/usr/local/apache/domlogs/samplx.org');61            expect(file.domain).toEqual('samplx.org');62        });63        test('ScanFile(filename, undefined, domain)', () => {64            s.setRootDirectory(testData.getDataDirectory());65            const file = new ScanFile('/usr/local/apache/domlogs/samplx.org', undefined, 'samplx.org');66            expect(file.filename).toEqual('/usr/local/apache/domlogs/samplx.org');67            const pathname = path.join(testData.getDataDirectory(), 'usr', 'local', 'apache', 'domlogs', 'samplx.org');68            expect(file.pathname).toEqual(pathname);69            expect(file.domain).toEqual('samplx.org');70        });71        test('ScanFile(undefined, undefined, domain)', () => {72            s.setRootDirectory(testData.getDataDirectory());73            const attempt = () => {74                return new ScanFile(undefined, undefined, 'samplx.org');75            };76            expect(attempt).toThrow();77        });78        test('ScanFile("-", undefined, "file")', () => {79            s.setRootDirectory('');80            const file = new ScanFile('-', undefined, 'file');81            expect(file.filename).toEqual('-');82            expect(file.pathname).toEqual('/dev/fd/0');83            expect(file.domain).toEqual('file');84        });85        test('ScanFile(undefined, "/dev/fd/0", "file")', () => {86            s.setRootDirectory('');87            const file = new ScanFile(undefined, '/dev/fd/0', 'file');88            expect(file.filename).toEqual('-');89            expect(file.pathname).toEqual('/dev/fd/0');90            expect(file.domain).toEqual('file');91        });92        describe('isCompressed', () => {93            test('isCompressed("/dev/fd/0")', () => {94                s.setRootDirectory('');95                const file = new ScanFile(undefined, '/dev/fd/0', 'file');96                expect(file.isCompressed()).toBeFalsy();97            });98            test('isCompressed("samplx.org-Apr-2012.gz")', () => {99                s.setRootDirectory('');100                const file = new ScanFile(undefined, 'samplx.org-Apr-2012.gz', 'file');101                expect(file.isCompressed()).toBeTruthy();102            });103        });104    });...scan-file.js
Source:scan-file.js  
1import moment from 'moment';2import xhr from 'xhr';3import uniqid from 'uniqid';4import SparkMD5 from 'spark-md5';5import {SCAN_STATUS} from '../constants/file';6function ScanFile() {7    return {8        id: uniqid(),9        fileName: null,10        scanTime: moment().unix(),11        sha256: null,12        md5: null,13        status: ScanFile.STATUS.SCANNING,14        scanResults: null,15        size: null,16        dataId: null17    };18}19export default ScanFile;20// methods21ScanFile.getScanStatus = getScanStatus;22ScanFile.getScanStatusLabel = getScanStatusLabel;23ScanFile.download = download;24ScanFile.isSanitizedFile = isSanitizedFile;25ScanFile.getFileSize = getFileSize;26ScanFile.getFileData = getFileData;27ScanFile.getMd5Hash = getMd5Hash;28// const29ScanFile.STATUS = SCAN_STATUS.VALUES;30ScanFile.STATUS_VALUES_CLEAN = SCAN_STATUS.CLEAN_VALUES;31ScanFile.STATUS_VALUES_INFECTED = SCAN_STATUS.INFECTED_VALUES;32const URL = window.URL || window.webkitURL || window.mozURL || window.msURL;33async function download(link, fileData, fileName) {34    let fileUrl;35    try {36        fileUrl = URL.createObjectURL(new Blob([fileData]));37    }38    catch (e) {39        // fallback40        fileUrl = link;41    }42    return new Promise((resolve) => {43        chrome.downloads.download({44            url: fileUrl,45            filename: fileName46        }, (downloadId) => {47            resolve(downloadId);48        });49    });50}51/**52 * Checks if an URL points to a sanitized file.53 * 54 * @param {string} url a file url55 * @returns {boolean} `true` if the url provided is of a sanitized file56 */57function isSanitizedFile(url) {58    const urlLow = url.toLowerCase();59    // metadefender cloud sanitized files60    for (let bucket of MCL.config.sanitizationBuckets) {61        if (urlLow.indexOf(bucket) > -1 ) {62            return true;63        }64    }65    // metadefender core sanitized files66    if (urlLow.indexOf('/file/converted/') > -1 && urlLow.indexOf('?apikey=') > -1) {67        return true;68    }69}70function getFileSize(url, filename){71    return new Promise((resolve, reject) => {72        if (url.match(/^data/)) {73            reject(chrome.i18n.getMessage('unsupportedUrl'));74        }75        if (url.match(/^ftp/)) {76            reject(chrome.i18n.getMessage('unableToScanFTP'));77        }78        if (url.match(/^file/)) {79            reject(chrome.i18n.getMessage('unableToScanFileProtocol'));80        }81        if (!url.match(/^http/)) {82            url = 'http://' + url;83        }84        xhr.head(url, (err, resp) => {85            if (err) {86                reject(err);87            }88            if ([0, 403, 404, 500, 503].indexOf(resp.statusCode) >= 0) {89                reject(chrome.i18n.getMessage('errorWhileDownloading'));90            }91            if (!filename) {92                let url = resp.url;93                filename = url.substr(url.lastIndexOf('/') + 1);94            }95            let fileSize = resp.headers['content-length'];96            resolve(fileSize);97        });98    });99}100async function getFileData(url){101    return new Promise((resolve, reject) => {102        try {103            xhr.get(url, {104                responseType: 'arraybuffer'105            }, (err, resp, body) => {106                if (err) {107                    reject(err);108                }109                if (body) {110                    var byteArray = new Uint8Array(body);111                    resolve(byteArray);112                }113            });114        }115        catch (e) {116            reject(e);117        }118    });119}120/**121 * 'clean' | 'infected' | 'scanning'122 * @param status123 */124function getScanStatus(status) {125    if (typeof status === 'undefined') {126        return ScanFile.STATUS.SCANNING;127    }128    if (ScanFile.STATUS_VALUES_CLEAN.indexOf(status) !== -1) {129        return ScanFile.STATUS.CLEAN;130    }131    if (ScanFile.STATUS_VALUES_INFECTED.indexOf(status) !== -1) {132        return ScanFile.STATUS.INFECTED;133    }134    return ScanFile.STATUS.UNKNOWN;135}136function getScanStatusLabel(status) {137    if (typeof status === 'undefined') {138        status = 255;139    }140    return chrome.i18n.getMessage('scanResult'+status);141}142function getMd5Hash(fileData) {143    let spark = new SparkMD5.ArrayBuffer();144    spark.append(fileData);145    return spark.end().toUpperCase();...Using AI Code Generation
1import { scanFile } from '@redwoodjs/api'2export const handler = async (event, context) => {3  const result = await scanFile({4  })5  return {6    body: JSON.stringify(result),7  }8}9import { S3 } from 'aws-sdk'10export const handler = async (event, context) => {11  const s3 = new S3()12    .scanFile({13    })14    .promise()15  return {16    body: JSON.stringify(result),17  }18}Using AI Code Generation
1import { scanFile } from '@redwoodjs/api'2export const handler = async () => {3  try {4    const result = await scanFile({5    })6    console.log(result)7  } catch (error) {8    console.error(error)9  }10}11-   [scanFile](#scanfile)12    -   [Parameters](#parameters)13-   [scanUrl](#scanurl)14    -   [Parameters](#parameters-1)15-   [scanFileFromS3](#scanfilefroms3)16    -   [Parameters](#parameters-2)17-   [scanFileFromS3](#scanfilefroms3-1)18    -   [Parameters](#parameters-3)19-   [scanFileFromS3](#scanfilefroms3-2)20    -   [Parameters](#parameters-4)21-   [scanFileFromS3](#scanfilefroms3-3)22    -   [Parameters](#parameters-5)23-   [scanFileFromS3](#scanfilefroms3-4)24    -   [Parameters](#parameters-6)25-   [scanFileFromS3](#scanfilefroms3-5)26    -   [Parameters](#parameters-7)27-   [scanFileFromS3](#scanfilefroms3-6)28    -   [Parameters](#parameters-8)29-   [scanFileFromS3](#scanfilefroms3-7)30    -   [Parameters](#parameters-9)31-   [scanFileFromS3](#scanfilefroms3-8)32    -   [Parameters](#parameters-10)33-   [scanFileFromS3](#scanfilefroms3-9)34    -   [Parameters](#parameters-11)35-   [scanFileFromS3](#scanfilefroms3-10)36    -   [Parameters](#parameters-12)37-   [scanFileFromS3](#scanfilefroms3-11)38    -   [Parameters](#parameters-13)Using AI Code Generation
1const redwood = require('./redwood');2const rw = new redwood();3rw.scanFile('test.txt').then((data) => {4    console.log(data);5}).catch((err) => {6    console.log(err);7});8class redwood {9    scanFile(path) {10        return new Promise((resolve, reject) => {11        });12    }13}14module.exports = redwood;15Your name to display (optional):16Your name to display (optional):17const redwood = require('./redwood');18const rw = new redwood();19rw.scanFile('test.txt').then((data) => {20    console.log(data);21}).catch((err) => {22    console.log(err);23});24module.exports = class redwood {25    scanFile(path) {26        return new Promise((resolve, reject) => {27        });28    }29}30Your name to display (optional):31const redwood = require('./redwood');32const rw = new redwood();33rw.scanFile('test.txt').then((data) => {34    console.log(data);35}).catch((err) => {36    console.log(err);37});38module.exports = class redwood {39    scanFile(path) {40        return new Promise((resolve, reject) => {41        });42    }43}44Your name to display (optional):45Your name to display (optional):Using AI Code Generation
1var redwood = require('redwood');2var fs = require('fs');3var file = fs.readFileSync('./test.txt');4var result = redwood.scanFile(file);5console.log(result);6var redwood = require('redwood');7var fs = require('fs');8var file = fs.readFileSync('./test.txt');9var result = redwood.scanFile(file);10console.log(result);Using AI Code Generation
1const redwood = require('redwood');2redwood.scanFile('test.pdf', function(err, result) {3  if (err) {4    console.log(err);5  }6  console.log(result);7});8const redwood = require('redwood');9redwood.scanFile('test.pdf', 'test.jpg', function(err, result) {10  if (err) {11    console.log(err);12  }13  console.log(result);14});15const redwood = require('redwood');16redwood.scanFile('test.pdf', 'test.txt', function(err, result) {17  if (err) {18    console.log(err);19  }20  console.log(result);21});22const redwood = require('redwood');23redwood.scanFile('test.pdf', 'test.json', function(err, result) {24  if (err) {25    console.log(err);26  }27  console.log(result);28});29const redwood = require('redwood');30redwood.scanFile('test.pdf', 'test.csv', function(err, result) {31  if (err) {32    console.log(err);33  }34  console.log(result);35});36const redwood = require('redwood');37redwood.scanFile('test.pdf', 'test.xml', function(err, result) {38  if (err) {39    console.log(err);40  }41  console.log(result);42});43const redwood = require('redwood');44redwood.scanFile('test.pdfUsing AI Code Generation
1var redwood = require("redwoodfs");2redwood.scanFile("test.txt", function(err, data) {3    console.log(data);4});5### redwoodfs.scanDir(dirPath, callback)6var redwood = require("redwoodfs");7redwood.scanDir("test", function(err, data) {8    console.log(data);9});10### redwoodfs.copyFile(sourcePath, destinationPath, callback)11var redwood = require("redwoodfs");12redwood.copyFile("test.txt", "test1.txt", function(err, data) {13    console.log(data);14});15### redwoodfs.copyDir(sourcePath, destinationPath, callback)Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
