Thu, 15 Jan 2015 15:59:08 +0100
Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 'use strict';
7 const { platform, pathFor } = require('sdk/system');
8 const { defer } = require('sdk/core/promise');
9 const { emit } = require('sdk/event/core');
10 const { join } = require('sdk/fs/path');
11 const { writeFile, unlinkSync, existsSync } = require('sdk/io/fs');
12 const PROFILE_DIR= pathFor('ProfD');
13 const isWindows = platform.toLowerCase().indexOf('win') === 0;
14 const isOSX = platform.toLowerCase().indexOf('darwin') === 0;
16 let scripts = {
17 'args.sh': 'echo $1 $2 $3 $4',
18 'args.bat': 'echo %1 %2 %3 %4',
19 'check-env.sh': 'echo $CHILD_PROCESS_ENV_TEST',
20 'check-env.bat': 'echo %CHILD_PROCESS_ENV_TEST%',
21 'check-pwd.sh': 'echo $PWD',
22 'check-pwd.bat': 'cd',
23 'large-err.sh': 'for n in `seq 0 $1` ; do echo "E" 1>&2; done',
24 'large-err-mac.sh': 'for ((i=0; i<$1; i=i+1)); do echo "E" 1>&2; done',
25 'large-err.bat': 'FOR /l %%i in (0,1,%1) DO echo "E" 1>&2',
26 'large-out.sh': 'for n in `seq 0 $1` ; do echo "O"; done',
27 'large-out-mac.sh': 'for ((i=0; i<$1; i=i+1)); do echo "O"; done',
28 'large-out.bat': 'FOR /l %%i in (0,1,%1) DO echo "O"',
29 'wait.sh': 'sleep 2',
30 // Use `ping` to an invalid IP address because `timeout` isn't
31 // on all environments? http://stackoverflow.com/a/1672349/1785755
32 'wait.bat': 'ping 1.1.1.1 -n 1 -w 2000 > nul'
33 };
35 Object.keys(scripts).forEach(filename => {
36 if (/\.sh$/.test(filename))
37 scripts[filename] = '#!/bin/sh\n' + scripts[filename];
38 else if (/\.bat$/.test(filename))
39 scripts[filename] = '@echo off\n' + scripts[filename];
40 });
42 function getScript (name) {
43 // Use specific OSX script if exists
44 if (isOSX && scripts[name + '-mac.sh'])
45 name = name + '-mac';
46 let fileName = name + (isWindows ? '.bat' : '.sh');
47 return createFile(fileName, scripts[fileName]);
48 }
49 exports.getScript = getScript;
51 function createFile (name, data) {
52 let { promise, resolve, reject } = defer();
53 let fileName = join(PROFILE_DIR, name);
54 writeFile(fileName, data, function (err) {
55 if (err) reject();
56 else {
57 makeExecutable(fileName);
58 resolve(fileName);
59 }
60 });
61 return promise;
62 }
64 // TODO Use fs.chmod once implemented, bug 914606
65 function makeExecutable (name) {
66 let { CC } = require('chrome');
67 let nsILocalFile = CC('@mozilla.org/file/local;1', 'nsILocalFile', 'initWithPath');
68 let file = nsILocalFile(name);
69 file.permissions = parseInt('0777', 8);
70 }
72 function deleteFile (name) {
73 let file = join(PROFILE_DIR, name);
74 if (existsSync(file))
75 unlinkSync(file);
76 }
78 function cleanUp () {
79 Object.keys(scripts).forEach(deleteFile);
80 }
81 exports.cleanUp = cleanUp;