Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
SERVER-25335 avoid group and other permissions when creating .dbshell…
… history file
- Loading branch information
Showing
2 changed files
with
115 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,103 @@ | ||
| // Test that when running the shell for the first time creates the ~/.dbshell file, and it has | ||
| // appropriate permissions (where relevant). | ||
|
|
||
| (function() { | ||
| "use strict"; | ||
|
|
||
| // Use dataPath because it includes the trailing "/" or "\". | ||
| var tmpHome = MongoRunner.dataPath; | ||
| // Ensure it exists and is a dir (eg. if running without resmoke.py and /data/db doesn't exist). | ||
| mkdir(tmpHome); | ||
| removeFile(tmpHome + ".dbshell"); | ||
|
|
||
| var args = []; | ||
| var cmdline = "mongo --nodb"; | ||
| var redirection = ""; | ||
| var env = {}; | ||
| if (_isWindows()) { | ||
| args.push("cmd.exe"); | ||
| args.push("/c"); | ||
|
|
||
| // Input is set to NUL. The output must also be redirected to NUL, otherwise running the | ||
| // jstest manually has strange terminal IO behaviour. | ||
| redirection = "< NUL > NUL"; | ||
|
|
||
| // USERPROFILE set to the tmp homedir. | ||
| // Since NUL is a character device, isatty() will return true, which means that .mongorc.js | ||
| // will be created in the HOMEDRIVE + HOMEPATH location, so we must set them also. | ||
| if (tmpHome.match("^[a-zA-Z]:")) { | ||
| var tmpHomeDrive = tmpHome.substr(0, 2); | ||
| var tmpHomePath = tmpHome.substr(2); | ||
| } else { | ||
| var _pwd = pwd(); | ||
| assert(_pwd.match("^[a-zA-Z]:"), "pwd must include drive"); | ||
| var tmpHomeDrive = _pwd.substr(0, 2); | ||
| var tmpHomePath = tmpHome; | ||
| } | ||
| env = {USERPROFILE: tmpHome, HOMEDRIVE: tmpHomeDrive, HOMEPATH: tmpHomePath}; | ||
|
|
||
| } else { | ||
| args.push("sh"); | ||
| args.push("-c"); | ||
|
|
||
| // Use the mongo shell from the current dir, same as resmoke.py does. | ||
| // Doesn't handle resmoke's --mongo= option. | ||
| cmdline = "./" + cmdline; | ||
|
|
||
| // Set umask to 0 prior to running the shell. | ||
| cmdline = "umask 0 ; " + cmdline; | ||
|
|
||
| // stdin is /dev/null. | ||
| redirection = "< /dev/null"; | ||
|
|
||
| // HOME set to the tmp homedir. | ||
| if (!tmpHome.startsWith("/")) { | ||
| tmpHome = pwd() + "/" + tmpHome; | ||
| } | ||
| env = {HOME: tmpHome}; | ||
| } | ||
|
|
||
| // Add redirection to cmdline, and add cmdline to args. | ||
| cmdline += " " + redirection; | ||
| args.push(cmdline); | ||
| jsTestLog("Running args:\n " + tojson(args) + "\nwith env:\n " + tojson(env)); | ||
| var pid = _startMongoProgram({args, env}); | ||
| var rc = waitProgram(pid); | ||
|
|
||
| assert.eq(rc, 0); | ||
|
|
||
| var files = listFiles(tmpHome); | ||
| jsTestLog(tojson(files)); | ||
|
|
||
| var findFile = function(baseName) { | ||
| for (var i = 0; i < files.length; i++) { | ||
| if (files[i].baseName === baseName) { | ||
| return files[i]; | ||
| } | ||
| } | ||
| return undefined; | ||
| }; | ||
|
|
||
| var targetFile = ".dbshell"; | ||
| var file = findFile(targetFile); | ||
|
|
||
| assert.neq(typeof(file), "undefined", targetFile + " should exist, but it doesn't"); | ||
| assert.eq(file.isDirectory, false, targetFile + " should not be a directory, but it is"); | ||
| assert.eq(file.size, 0, targetFile + " should be empty, but it isn't"); | ||
|
|
||
| if (!_isWindows()) { | ||
| // On Unix, check that the file has the correct mode (permissions). | ||
| // The shell has no way to stat a file. | ||
| // There is no stat utility in POSIX. | ||
| // `ls -l` is POSIX, so this is the best that we have. | ||
| // Check for exactly "-rw-------". | ||
| clearRawMongoProgramOutput(); | ||
| var rc = runProgram("ls", "-l", file.name); | ||
| assert.eq(rc, 0); | ||
| var output = rawMongoProgramOutput(); | ||
| var fields = output.split(" "); | ||
| // First field is the prefix, second field is the `ls -l` permissions. | ||
| assert.eq(fields[1], "-rw-------", targetFile + " has bad permissions"); | ||
| } | ||
|
|
||
| })(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters