    function checkNodeJsVersions(hosts, index) {
        index = index || 0;
        if (hosts && index < hosts.length) {
            main.socket.emit('sendToHost', hosts[index].name, 'getHostInfo', null, function (result) {
                if (result && result['Node.js']) {
                    const major = parseInt(result['Node.js'].split('.').shift().replace('v', ''), 10);
                    if (major < 6 || major === 7 || major === 9  || major === 11 ) { // we allow 6, 8, 10 and 12+
                        main.showMessage(_('This version of node.js "%s" on "%s" is deprecated. Please install node.js 6, 8 or newer', result['Node.js'], hosts[index].name), _('Suggestion'), 'error_outline');
                    }
                }
                setTimeout(function () {
                    checkNodeJsVersions(hosts, index + 1);
                }, 100);
            });
        }
    }
The software uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the software does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.