{"_id":"nodeftpd","_rev":"38-87a853582e1e9bbc8342765178da21c1","name":"nodeftpd","description":"Flexible, light-weight FTP server","dist-tags":{"latest":"0.6.1"},"versions":{"0.1.0":{"name":"nodeftpd","preferGlobal":true,"version":"0.1.0","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x"},"license":"MIT","engines":{"node":">=0.8"},"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip),\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n  \"auth.mechanism\": \"pam\",\n\n  // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n  \"auth.chroot\": \"~\"\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nProgress\n--------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.1.0","dist":{"shasum":"de3482e3bdfe645349ceedf385312311cc7e7d21","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.1.0.tgz","integrity":"sha512-RFxhmZjsPVaNp1nA9TAtEtNJGu4mv5RL1PIzBJjXf0eHLKuoBbxmUKCRpBpcAcb1kmsS9Vppg4A1OTnbGSRvag==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBftyEfSfBENLOZRJkVAPhxIpmdfvsCJ0vLXqybHcuCKAiEAs8XqHPQwiUI03SN8LonzDiqTFca7gSSj5NfGoMkrp74="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.2.0":{"name":"nodeftpd","preferGlobal":true,"version":"0.2.0","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","postinstall":"mkdir /var/log/nodeftpd","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nImplementation\n--------------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.2.0","dist":{"shasum":"c5767b9b584a8e87397216f7968aa23e95a9b770","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.2.0.tgz","integrity":"sha512-rwgttFoMtORMBcgIeMWdPTTTOWFTMg4acsPFjmqXlYlmBfxidkotDb2LpwE7S2r9MSRIp3kwtGWireVcb+um6w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDNjubAPkafwkC5RN8gphpNNImjFj06NDt0IyoAgUyGoAiAnY8wYVLXJ/7cGGpgct9Q2I+asjTdsAMROSHU5iEyrvA=="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.2.1":{"name":"nodeftpd","preferGlobal":true,"version":"0.2.1","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","postinstall":"mkdir -p /var/log/nodeftpd","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nImplementation\n--------------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.2.1","dist":{"shasum":"9e99d55c6e86b72b22da399c6b16e50658d73b9a","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.2.1.tgz","integrity":"sha512-nXdv5Aaoz38Q3h6rfB7bScufAMXbdWn1rdXvvTX9Ajb3fLzbTpjrYGnF4sIT3TYfJvdDPOVkUbeRLzljcGB+wQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCR/Izz/1i2Jd4vd4aRbbyFnUuTLfcvXmoDIRswI4Hu5gIhAOuMBsnQlMbzHdPFJEMD0Ns7SczUsze4y8NZH6kCqdy6"}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.2.2":{"name":"nodeftpd","preferGlobal":true,"version":"0.2.2","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","postinstall":"mkdir -p /var/log/nodeftpd","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nImplementation\n--------------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.2.2","dist":{"shasum":"d99fd0c07552120b43b085d6d84b9b3173d53c04","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.2.2.tgz","integrity":"sha512-EpQmXY8G0xuCDhpVNmW92MClU5b7y145rjoT5jXU0Tjg6pydHjRuG9BajhH0dygOKANLGD382M1QiUAcZzpK/A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFXw/3FdhWDs8+STGVQnhPr4SuCG0ndECK6FPQvLRm5qAiAqt2gIP23qYzBGIdxptinCS3yO7okKfoFXFU7H989fWg=="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.2.3":{"name":"nodeftpd","preferGlobal":true,"version":"0.2.3","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","postinstall":"mkdir -p /var/log/nodeftpd","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nImplementation\n--------------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.2.3","dist":{"shasum":"349592be8d9acfed1db19e5d142700192d97e60c","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.2.3.tgz","integrity":"sha512-0k2G3vK8T4+OUvgfLYky1SwyfihrWDhdLBQu09AEAs6euZOdVgHSv7EXyXLDA5+/1AUgH8SDbYZb6V6e3mjTtA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDV5okAcQlJDwiHO2a2fUUPJsPlr9JnRbQmcEu1eKdGoAiBJLkFoeA0z0/r2axheIWFOifOLD9SFib7eJt/km/thKg=="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.3.0":{"name":"nodeftpd","preferGlobal":true,"version":"0.3.0","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","postinstall":"mkdir -p /var/log/nodeftpd","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nImplementation\n--------------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.3.0","dist":{"shasum":"dac8840c343dcdaa2f4f8e717a137a4e1f33bd5c","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.3.0.tgz","integrity":"sha512-WuGIPzQGnP8UF9ZKrg8e51eYikujTeXaQH9fdBGvaFAccyp6f/qbinCfVbdOtR8uKEXknMax1oTXWJmAdX1+Qw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFQTUJdMfS7m6Ow8GipKlQAFo1AzFOpBoEdBRNInL+htAiAEBBfAvzI31fZCAcG1lJDxTnpoO9owv1vPwdMuOZeJvA=="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.3.1":{"name":"nodeftpd","preferGlobal":true,"version":"0.3.1","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nImplementation\n--------------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.3.1","dist":{"shasum":"db77c46c64cd171a761dac14d218f6c8a9e25840","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.3.1.tgz","integrity":"sha512-ZXtkxfQ8gMdr7dIjZvm4TIv0/KLcmtgMs9WVKiEkkj0dkfeHwB1p2YbKgW5vwaZzHdGRvkeYSxVY2m04jHC4ig==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAlvl+2RHctdcnvk7zgtMJxw2D4p5u3eEqIOaSKbYVZJAiEA3Ai79yRx5OwwAkX4sRQdWbWywtewNVTAb95AVqmBqus="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.3.2":{"name":"nodeftpd","preferGlobal":true,"version":"0.3.2","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nImplementation\n--------------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.3.2","dist":{"shasum":"05b7240e8fba8d2b9bd6d4beebd8b02a14e87d9f","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.3.2.tgz","integrity":"sha512-ufpYCgvdCXbLLz60M+x7hPSERRItGzd2PNxppdOVJX3ewPQ3Bd4vboshXdR93fAMt9KMML4mrf/YC54FQf6EOA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZLtJt0JZ622SspDPLx/6GdO9xfbskN7Xz1ykj6f2x2QIgA/8wXky713KFMKuG1JpsX7gPeDNFawR6gF2ffYRNW8A="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.3.3":{"name":"nodeftpd","preferGlobal":true,"version":"0.3.3","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nImplementation\n--------------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.3.3","dist":{"shasum":"836033ac0195c829564355c8ccc689deb3b6a968","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.3.3.tgz","integrity":"sha512-vVkvRHzd1jcdw1ii1snJl8NB1PDhF1qqiToTs15t+Ox3pqjrwsUVeIz7Cy0qAZIWOthMElK6sUKqvvQfSRheNA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC7l1BmDhMhHH2MO5LPyz1OdHSSamvatHKfldbX4dFKeAIhAK1DFbqnJkzEIlQ/2B42VAFl63YCQTnbqlpcKoptPgQ5"}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.3.4":{"name":"nodeftpd","preferGlobal":true,"version":"0.3.4","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nImplementation\n--------------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* REST - Restart an interrupted file transfer at the given position\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.3.4","dist":{"shasum":"16fa064bae975d4ec3744fb84501a7e6ce8aa578","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.3.4.tgz","integrity":"sha512-zCRTE1uVv+d3e/6MJ7KIkyJ8BYS/u+JYiCeeyLE547ytol2bTSzrKb4jXv0b7+R3mHxh6MIGjovJr0W+W/JSuA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDd8QbR3W/2S97Grq4CxskYVE3SrgePNuc+DWtztCpxigIhAJdAvEYIyTgeHNT4FkH9KogMNKx9VBPIyUjuZucCPXjL"}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.4.0":{"name":"nodeftpd","preferGlobal":true,"version":"0.4.0","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n* [FTP: File Transfer Protocol on cr.yp.to](http://cr.yp.to/ftp.html)\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.4.0","dist":{"shasum":"52feb4a93c0fb5c72dac957cc2dc148de8fdfc07","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.4.0.tgz","integrity":"sha512-2VDNiMjCh34j5FrCWExUx8duYerVYge+TpV+U3gimlUdZ3H1T72XmWM3qPqHEbh7BKCu8gHMp1rG8oLnlDHVIg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDOCUsOQVL4CVVk9ITNtzmU674Y7Qqy6rWsXL7KC+uM+AIhAO39WWD/Fj+NaOxirT//RLifPEZCYQePoMPYXXJs10Ux"}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.4.1":{"name":"nodeftpd","preferGlobal":true,"version":"0.4.1","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n* [FTP: File Transfer Protocol on cr.yp.to](http://cr.yp.to/ftp.html)\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.4.1","dist":{"shasum":"9f3efd526e323bb4ad426cdedb31a79398cd7b57","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.4.1.tgz","integrity":"sha512-ZN66au5hsjk1N0wTnLFK6/9h0oMxdpuFa4TNuCUztUKvkEVXfTmu/Sb16iUvnYLN9Fxv8hITNdzCCxzcRJHpqg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMrODFKkH3hY+qJHUpK0Q8qiIw5Kil5z0JKJacgb3TwQIhAORQptDuLabDWCrg6+ErvU7DUp5NFf0i4oleh0g+nsfn"}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.4.2":{"name":"nodeftpd","preferGlobal":true,"version":"0.4.2","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","tmp":"0.0.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  \"auth\": {\n    // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n    \"provider\": \"pam\",\n\n    // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n    \"chroot\": \"~\"\n  }\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n* [FTP: File Transfer Protocol on cr.yp.to](http://cr.yp.to/ftp.html)\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.4.2","dist":{"shasum":"3a7832fb1772029b38e1c0a6d7a6bc41bf93411d","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.4.2.tgz","integrity":"sha512-K3qGqpQL8iCJHurfgZgqMRmJzCLjOBmqbLLps0D7HpeOapK0kJ5GoCgxgGhoJofI4VToVZgeXbzEB4rDYjHtiw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHme/ZVCXyX4d3G6LwTJ3m9T0DfZt6wOKA/EI6B/MefKAiEA/GJ+T3ahYAvzkMRejSd5YLIJ5ZbD4Eqbfe72Y/8267Q="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.5.0":{"name":"nodeftpd","preferGlobal":true,"version":"0.5.0","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./bin/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server"],"dependencies":{"lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","colors":"0.6.x","commander":"2.0.x","tmp":"0.0.x","js-yaml":"2.1.x","forever":"*"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands\n--------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n### Start NodeFTPD\n\n```\nnodeftpd start\n```\n\n### Stop NodeFTPD\n\n```\nnodeftpd stop\n```\n\n### Restart NodeFTPD\n\n```\nnodeftpd restart\n```\n\n### NodeFTPD status\n\n```\nnodeftpd status\n```\n\n### Help\n\n```\nnodeftpd help\n```\n\nLogs\n----\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nForever logs (the daemon used to run NodeFTPD) are stored in `/var/log/nodeftpd/forever.log`.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.yml`. It expects a YAML file. Example configuration below:\n\n```yaml\nport: 10021\npassive_port_range: 45000-55000\nmotd: 'NodeFTPD %pkg.version% Server (%os.hostname%)'\n```\n\nTLS/SSL\n-------\n\n### Explicit TLS\n\nThis is not yet implemented\n\n### Implicit TLS\n\n**Warning: This feature is new and unstable**\n\nAdd the following to your config file:\n\n```yaml\ntls:\n  enabled: true,\n  key: /root/server-key.pem\n  cert: /root/server-cert.pem\n  port: 990\n```\n\nListens on port 990 by default. Supports active and passive mode transfers.\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n* [FTP: File Transfer Protocol on cr.yp.to](http://cr.yp.to/ftp.html)\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.5.0","dist":{"shasum":"92899ccdc9222ae48b96ba1b0f525116a017e31c","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.5.0.tgz","integrity":"sha512-KgnVUaFXMLVgFk3rFGVtJpzAKELHR8hPbEQBgXGQ8mW/QqtN0VnBUuCfkD9A6Fdyvs0hoYUdiPpoMdHkWcHpww==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEwBX8KW1hZ+9natbtvSh1Z7d9UwrbirjKdivrPRYl7fAiEA7FO7xFytX2zcsJaCx1D30+5f0dsjzaWRyzpPb+j9rzc="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.6.0":{"name":"nodeftpd","preferGlobal":true,"version":"0.6.0","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./lib/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server","protocol","files","daemon"],"dependencies":{"async":"0.2.x","lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","commander":"2.0.x","tmp":"0.0.x","js-yaml":"2.1.x"},"devDependencies":{"grunt":"0.4.x","grunt-contrib-jshint":"~0.6.x"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not be used in production.\n\nThis is a real FTP server, and I'm aiming to implement all standard FTP functionality. I have pretty much all of the basics implemented so far, and you can definitely install this locally and use it as an FTP server. It even supports TLS!\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands Line Interface\n-----------------------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n**Start NodeFTPD**\n\n```\n$ nodeftpd start\nStarting NodeFTPD.... Done\n```\n\n**Stop NodeFTPD**\n\n```\n$ nodeftpd stop\nStopping NodeFTPD.... Stopped\n```\n\n**Restart NodeFTPD**\n\n```\n$ nodeftpd restart\nStopping NodeFTPD.... Not running\nStarting NodeFTPD.... Done\n```\n\n**NodeFTPD status**\n\n```\n$ nodeftpd status\nNodeFTPD is NOT running.\n```\n\n**Help**\n\n```\n$ nodeftpd help\n\n  Usage: nodeftpd [options] [command]\n\n  Commands:\n\n    help                   Show this help text\n    status                 Display the status of NodeFTPD\n    stop                   Stop NodeFTPD\n    restart                Restart NodeFTPD\n    *                      Start NodeFTPD\n\n  Options:\n\n    -h, --help       output usage information\n    -V, --version    output the version number\n    -D, --no-daemon  Don't run NodeFTPD as a daemon\n```\n\nLogs/PID File\n-------------\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nThe PID file (stores the process ID of the main process) is in `/var/run/nodeftpd.pid`.\n\nYou may override these values via the config file.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.yml`. It expects a YAML file. Example configuration below:\n\n```yaml\nport: 10021\npassive_port_range: 45000-55000\nmotd: 'NodeFTPD %pkg.version% Server (%os.hostname%)'\n```\n\nTo see all possible configuration values, please look at `config.yml` (contains the default config).\n\nTLS/SSL\n-------\n\n### Explicit TLS\n\nThis is not yet implemented\n\n### Implicit TLS\n\n**Warning: This feature is new and unstable**\n\nAdd the following to your config file:\n\n```yaml\ntls:\n  enabled: true,\n  key: /root/server-key.pem\n  cert: /root/server-cert.pem\n  port: 990\n```\n\nListens on port 990 by default. Supports active and passive mode transfers.\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *idle_workers* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Implementation Resources\n----------------------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n* [FTP: File Transfer Protocol on cr.yp.to](http://cr.yp.to/ftp.html)\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.6.0","dist":{"shasum":"cdbfe21ff34c0099d32635dbd847d4d06324debc","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.6.0.tgz","integrity":"sha512-rsKn/nUOiLvU8UHpjZpteuyRTSAyeErEJI9QjNnQfwfCmghGMamDv6NEOzH8nwMFlVKIWroHYNIJwC3rbzMU2Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfMoJNkq9a2FmANI6US6H63gsjdZVSn4UcLUI3ZoM1NAIhALo7pXs983OtFTTEhCXo9YNPWvoEixjcr+dBbLMZsGnZ"}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]},"0.6.1":{"name":"nodeftpd","preferGlobal":true,"version":"0.6.1","author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"description":"Flexible, light-weight FTP server","contributors":[{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"}],"bin":{"nodeftpd":"./bin/nodeftpd"},"main":"./lib/nodeftpd","scripts":{"start":"./bin/nodeftpd start","stop":"./bin/nodeftpd stop","preinstall":"./bin/install_check.sh"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"keywords":["cli","ftp","server","protocol","files","daemon"],"dependencies":{"async":"0.2.x","lodash":"1.0.x","moment":"2.0.x","authenticate-pam":"0.1.x","mongodb":"1.3.x","commander":"2.0.x","tmp":"0.0.x","js-yaml":"2.1.x"},"devDependencies":{"grunt":"0.4.x","grunt-contrib-jshint":"~0.6.x"},"license":"MIT","engines":{"node":">=0.8"},"os":["!win32"],"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not be used in production.\n\nThis is a real FTP server, and I'm aiming to implement all standard FTP functionality. I have pretty much all of the basics implemented so far, and you can definitely install this locally and use it as an FTP server. It even supports TLS!\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n### Latest Code\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip)\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\n### From NPM\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Run `npm install -g nodeftpd`\n* Run `nodeftpd start`. It will auto detect your IP and run on port 21.\n\nCommands Line Interface\n-----------------------\n\nThese instructions assume you've installed NodeFTPD via NPM or placed the NodeFTPD binary in your `PATH` variable.\n\n**Start NodeFTPD**\n\n```\n$ nodeftpd start\nStarting NodeFTPD.... Done\n```\n\n**Stop NodeFTPD**\n\n```\n$ nodeftpd stop\nStopping NodeFTPD.... Stopped\n```\n\n**Restart NodeFTPD**\n\n```\n$ nodeftpd restart\nStopping NodeFTPD.... Not running\nStarting NodeFTPD.... Done\n```\n\n**NodeFTPD status**\n\n```\n$ nodeftpd status\nNodeFTPD is NOT running.\n```\n\n**Help**\n\n```\n$ nodeftpd help\n\n  Usage: nodeftpd [options] [command]\n\n  Commands:\n\n    help                   Show this help text\n    status                 Display the status of NodeFTPD\n    stop                   Stop NodeFTPD\n    restart                Restart NodeFTPD\n    *                      Start NodeFTPD\n\n  Options:\n\n    -h, --help       output usage information\n    -V, --version    output the version number\n    -D, --no-daemon  Don't run NodeFTPD as a daemon\n```\n\nLogs/PID File\n-------------\n\nEvery FTP command and response is logged. By default, these logs are stored in `/var/log/nodeftpd/access.log`.\n\nError logs are stored in `/var/log/nodeftpd/error.log`.\n\nThe PID file (stores the process ID of the main process) is in `/var/run/nodeftpd.pid`.\n\nYou may override these values via the config file.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.yml`. It expects a YAML file. Example configuration below:\n\n```yaml\nport: 10021\npassive_port_range: 45000-55000\nmotd: 'NodeFTPD %pkg.version% Server (%os.hostname%)'\n```\n\nTo see all possible configuration values, please look at `config.yml` (contains the default config).\n\nTLS/SSL\n-------\n\n### Explicit TLS\n\nThis is not yet implemented\n\n### Implicit TLS\n\n**Warning: This feature is new and unstable**\n\nAdd the following to your config file:\n\n```yaml\ntls:\n  enabled: true,\n  key: /root/server-key.pem\n  cert: /root/server-cert.pem\n  port: 990\n```\n\nListens on port 990 by default. Supports active and passive mode transfers.\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *idle_workers* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Implementation Resources\n----------------------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n* [FTP: File Transfer Protocol on cr.yp.to](http://cr.yp.to/ftp.html)\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/brandonwamboldt/nodeftpd/issues"},"_id":"nodeftpd@0.6.1","dist":{"shasum":"5adbb07f53192290ba88347ff723e99279d5db93","tarball":"https://registry.npmjs.org/nodeftpd/-/nodeftpd-0.6.1.tgz","integrity":"sha512-CGG6+UOi/F59XECbhw1i4rFIxVuPjpzZa9i/sfrVWm/WgcVw8vtjTSOcifMGIoMpGeI72mxTsUU6m7bd90I0gQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDi1VnhOGcu0RKH2NNB/PfDqWrSuYXChUlIfKWAftSI8AiEA0niYD2q6YnVY7atGl2TIoPJxxfIQ9FCuK93PaNm9yDg="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"},"maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}]}},"readme":"NodeFTPD\n========\n\nNodeFTPD is an FTP server written for Node.js. It's currently under heavy development and should not, under any circumstances, be used in production (or any environment connected to the Internet).\n\nIt is however, a real FTP server. The bulk of basic FTP features have been implemented, and I'm working on more advanced features like alternative authentication mechanisms and SSL/TLS support (FTPS/FTPES).\n\nThe project is a Node.js/JavaScript learning project, but I intend on making it into a feature complete FTP server that I can deploy on my own servers.\n\nInstallation\n------------\n\nThis software is in **alpha**. It's **NOT** ready for use in any type of production environment.\n\n* The **PAM dev** package is required. On Ubuntu variants, install with `sudo apt-get install libpam-dev`. On CentOS variants, install with `sudo yum install pam-devel`. On Debian variants, install with `sudo apt-get install libpam0g-dev`.\n* Clone this repository or [download as a zip](https://github.com/brandonwamboldt/nodeftpd/archive/master.zip),\n* Run `npm install` to install dependencies\n* Run `npm start`. It will auto detect your IP and run on port 21.\n\nConfiguration\n-------------\n\nThe configuration file is `/etc/nodeftpd.conf`. It expects a JSON file. Example configuration below:\n\n```javascript\n{\n  // The message of the day shown when users connect\n  \"motd\": \"\",\n\n  // The port to listen on\n  \"port\": 21,\n\n  // Network interface to listen on\n  \"listen\": \"127.0.0.1\",\n\n  // The authentication mechanism to use (config, mongo, mysql, pam, postgres, redis)\n  \"auth.mechanism\": \"pam\",\n\n  // Chroot directory (~ is the user's home directory, otherwise use an absolute path)\n  \"auth.chroot\": \"~\"\n}\n```\n\nAuthentication Mechanisms\n-------------------------\n\nThe system only supports Linux accounts via PAM at the moment. More drivers are coming soon!\n\nChrooting\n---------\n\nThe chroot functionality allows you to set a user's root directory to something other than than `/`, and they will not be able to perform operations on any file or directory outside of their chroot directory. For example, you may wish to set the chroot to `~`, the user's home directory. If the user `brandon` with the home directory `/home/brandon` logs in, he'll see a current working directory of `/`, which will *actually* be `/home/brandon`.\n\nYou may also set the chroot path to an absolute pathname, such as `/var/www/html`.\n\nChrooting is implemented in the code using an abstraction of the `fs` library. This is because the node modules that provide chroot functionality are buggy and unreliable.\n\nPermissions\n-----------\n\nWhen a user authenticates, NodeFTPD sets the UID/GID of the process handling their connection. For the PAM provider, the UID/GID is set to the user's UID/GID.\n\nArchitecture\n------------\n\nThis FTP server uses a child process based design, where each connection is handled by it's own process. This is for security reasons, and to make the code easier to organize and maintain.\n\nThe parent process listens for new connections and passes them off to a process in the process pool. When this occurs, a new process is spawned to keep *x* processes free in the pool. When a connection is closed, that process is destroyed.\n\nFTP Documentation\n-----------------\n\n* [RFC 3659 - Extensions to FTP](http://tools.ietf.org/html/rfc3659)\n* [List of raw FTP commands](http://www.nsftools.com/tips/RawFTP.htm)\n* [FTP Commands](http://www.ipswitch.com/support/ws_ftp-server/guide/v5/a_ftpref3.html)\n\nProgress\n--------\n\n* ABOR - abort a file transfer\n* ACCT - send account information\n* APPE - append to a remote file\n* ~~CDUP - CWD to the parent of the current directory~~\n* ~~CWD - change working directory~~\n* ~~DELE - delete a remote file~~\n* ~~FEAT - list all new FTP features that the server supports~~\n* ~~HELP - return help on using hte server~~\n* ~~LIST - list remote files~~\n* ~~MDTM - return the modification time of a file~~\n* ~~MKD - make a remote directory~~\n* ~~MLST - list remote object~~\n* ~~MODE - set transfer mode~~\n* ~~NLST - name list of remote directory~~\n* ~~NOOP - do nothing~~\n* ~~PASS - send password~~\n* ~~PASV - enter passive mode~~\n* ~~PORT - open a data port~~\n* ~~PWD - print working directory~~\n* ~~QUIT - terminate the connection~~\n* ~~REIN - reinitialize the connection~~\n* ~~RETR - retrieve a remote file~~\n* ~~RMD - remove a remote directory~~\n* ~~RNFR - rename from~~\n* ~~RNTO - rename to~~\n* SITE - site-specific commands (partially implemented)\n* ~~SIZE - return the size of a file~~\n* ~~STAT - return server status~~\n* ~~STOR - store a file on the remote host~~\n* STOU - store a file uniquely\n* STRU - set file transfer structure\n* ~~SYST - return system type~~\n* ~~TYPE - set the transfer type~~\n* ~~USER - send username~~\n","maintainers":[{"name":"brandonwamboldt","email":"brandon.wamboldt@gmail.com"}],"time":{"modified":"2022-06-22T02:05:58.374Z","created":"2013-09-18T16:49:12.824Z","0.1.0":"2013-09-18T16:49:15.588Z","0.2.0":"2013-09-20T00:45:47.949Z","0.2.1":"2013-09-20T00:49:29.930Z","0.2.2":"2013-09-20T01:47:30.349Z","0.2.3":"2013-09-20T02:10:39.231Z","0.3.0":"2013-09-22T17:01:55.342Z","0.3.1":"2013-09-22T17:13:35.517Z","0.3.2":"2013-09-22T17:30:06.666Z","0.3.3":"2013-09-22T17:35:15.497Z","0.3.4":"2013-09-23T00:19:12.444Z","0.4.0":"2013-09-23T14:02:21.557Z","0.4.1":"2013-09-26T16:00:10.475Z","0.4.2":"2013-09-26T18:12:57.843Z","0.5.0":"2013-09-27T17:53:23.223Z","0.6.0":"2013-09-28T19:56:06.205Z","0.6.1":"2013-09-29T23:00:11.706Z"},"author":{"name":"Brandon Wamboldt","email":"brandon.wamboldt@gmail.com"},"repository":{"type":"git","url":"https://github.com/brandonwamboldt/nodeftpd.git"},"users":{"pruettti":true}}