Bug 758696 - Add a dialog to the debugger to deny or allow incoming server connections (Part 1: Firefox); r=rcampbell

This commit is contained in:
Panos Astithas 2012-06-01 18:25:08 +03:00
Родитель 9d7f00830b
Коммит ffabfb5218
13 изменённых файлов: 88 добавлений и 15 удалений

Просмотреть файл

@ -201,7 +201,8 @@ DebuggerPane.prototype = {
*/
_initServer: function DP__initServer() {
if (!DebuggerServer.initialized) {
DebuggerServer.init();
// Always allow connections from nsIPipe transports.
DebuggerServer.init(function () { return true; });
DebuggerServer.addBrowserActors();
}
},
@ -405,13 +406,39 @@ ChromeDebuggerProcess.prototype = {
*/
_initServer: function RDP__initServer() {
if (!DebuggerServer.initialized) {
DebuggerServer.init();
DebuggerServer.init(this._allowConnection);
DebuggerServer.addBrowserActors();
}
DebuggerServer.closeListener();
DebuggerServer.openListener(DebuggerPreferences.remotePort, false);
},
/**
* Prompt the user to accept or decline the incoming connection.
*
* @return true if the connection should be permitted, false otherwise
*/
_allowConnection: function RDP__allowConnection() {
let title = L10N.getStr("remoteIncomingPromptTitle");
let msg = L10N.getStr("remoteIncomingPromptMessage");
let disableButton = L10N.getStr("remoteIncomingPromptDisable");
let prompt = Services.prompt;
let flags = prompt.BUTTON_POS_0 * prompt.BUTTON_TITLE_OK +
prompt.BUTTON_POS_1 * prompt.BUTTON_TITLE_CANCEL +
prompt.BUTTON_POS_2 * prompt.BUTTON_TITLE_IS_STRING +
prompt.BUTTON_POS_1_DEFAULT;
let result = prompt.confirmEx(null, title, msg, flags, null, null,
disableButton, null, { value: false });
if (result == 0) {
return true;
}
if (result == 2) {
DebuggerServer.closeListener();
Services.prefs.setBoolPref("devtools.debugger.remote-enabled", false);
}
return false;
},
/**
* Initializes a profile for the remote debugger process.
*/

Просмотреть файл

@ -105,7 +105,9 @@ let DebuggerController = {
if (!Prefs.remoteAutoConnect) {
let prompt = new RemoteDebuggerPrompt();
let result = prompt.show(!!this._remoteConnectionTimeout);
if (!result) {
// If the connection was not established before the user canceled the
// prompt, close the remote debugger.
if (!result && !DebuggerController.activeThread) {
this.dispatchEvent("Debugger:Close");
return false;
}

Просмотреть файл

@ -55,7 +55,7 @@ function test() {
},
function beforeTabAdded() {
if (!DebuggerServer.initialized) {
DebuggerServer.init();
DebuggerServer.init(function() { return true; });
DebuggerServer.addBrowserActors();
}
DebuggerServer.closeListener();

Просмотреть файл

@ -19,9 +19,15 @@ const EXAMPLE_URL = "http://example.com/browser/browser/devtools/debugger/test/"
const TAB1_URL = EXAMPLE_URL + "browser_dbg_tab1.html";
const TAB2_URL = EXAMPLE_URL + "browser_dbg_tab2.html";
const STACK_URL = EXAMPLE_URL + "browser_dbg_stack.html";
// Enable remote debugging for the relevant tests.
let gEnableRemote = Services.prefs.getBoolPref("devtools.debugger.remote-enabled");
Services.prefs.setBoolPref("devtools.debugger.remote-enabled", true);
registerCleanupFunction(function() {
Services.prefs.setBoolPref("devtools.debugger.remote-enabled", gEnableRemote);
});
if (!DebuggerServer.initialized) {
DebuggerServer.init();
DebuggerServer.init(function () { return true; });
DebuggerServer.addBrowserActors();
}

Просмотреть файл

@ -66,6 +66,19 @@ loadingText=Loading\u2026
# %1$S=URL, %2$S=status code
loadingError=Error loading %1$S: %2$S
# LOCALIZATION NOTE (remoteIncomingPromptTitle): The title displayed on the
# dialog that prompts the user to allow the incoming connection.
remoteIncomingPromptTitle=Incoming Connection
# LOCALIZATION NOTE (remoteIncomingPromptMessage): The message displayed on the
# dialog that prompts the user to allow the incoming connection.
remoteIncomingPromptMessage=An incoming request to permit remote debugging connection was detected. A remote client can take complete control over your browser! Allow connection?
# LOCALIZATION NOTE (remoteIncomingPromptDisable): The label displayed on the
# third button in the incoming connection dialog that lets the user disable the
# remote debugger server.
remoteIncomingPromptDisable=Disable
# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the
# variables pane when there are no variables to display.
emptyVariablesText=No variables to display.

Просмотреть файл

@ -59,25 +59,34 @@ var DebuggerServer = {
_listener: null,
_transportInitialized: false,
xpcInspector: null,
_allowConnection: null,
/**
* Initialize the debugger server.
*
* @param function aAllowConnectionCallback
* The embedder-provider callback, that decides whether an incoming
* remote protocol conection should be allowed or refused.
*/
init: function DH_init() {
init: function DH_init(aAllowConnectionCallback) {
if (this.initialized) {
return;
}
this.xpcInspector = Cc["@mozilla.org/jsinspector;1"].getService(Ci.nsIJSInspector);
this.initTransport();
this.initTransport(aAllowConnectionCallback);
this.addActors("chrome://global/content/devtools/dbg-script-actors.js");
},
/**
* Initialize the debugger server's transport variables. This can be
* in place of init() for cases where the jsdebugger isn't needed.
*
* @param function aAllowConnectionCallback
* The embedder-provider callback, that decides whether an incoming
* remote protocol conection should be allowed or refused.
*/
initTransport: function DH_initTransport() {
initTransport: function DH_initTransport(aAllowConnectionCallback) {
if (this._transportInitialized) {
return;
}
@ -85,6 +94,7 @@ var DebuggerServer = {
this._connections = {};
this._nextConnID = 0;
this._transportInitialized = true;
this._allowConnection = aAllowConnectionCallback;
},
get initialized() { return !!this.xpcInspector; },
@ -117,6 +127,9 @@ var DebuggerServer = {
* If true, server will listen on the loopback device.
*/
openListener: function DH_openListener(aPort, aLocalOnly) {
if (!Services.prefs.getBoolPref("devtools.debugger.remote-enabled")) {
return false;
}
this._checkInit();
if (this._listener) {
@ -209,6 +222,9 @@ var DebuggerServer = {
* after connectPipe() or after an incoming socket connection.
*/
_onConnection: function DH_onConnection(aTransport) {
if (!this._allowConnection()) {
return;
}
let connID = "conn" + this._nextConnID++ + '.';
let conn = new DebuggerServerConnection(connID, aTransport);
this._connections[connID] = conn;

Просмотреть файл

@ -12,6 +12,8 @@ Cu.import("resource://gre/modules/Services.jsm");
// Always log packets when running tests. runxpcshelltests.py will throw
// the output away anyway, unless you give it the --verbose flag.
Services.prefs.setBoolPref("devtools.debugger.log", true);
// Enable remote debugging for the relevant tests.
Services.prefs.setBoolPref("devtools.debugger.remote-enabled", true);
Cu.import("resource:///modules/devtools/dbg-server.jsm");
Cu.import("resource:///modules/devtools/dbg-client.jsm");
@ -123,7 +125,8 @@ function attachTestGlobalClientAndResume(aClient, aName, aCallback) {
function initTestDebuggerServer()
{
DebuggerServer.addActors("resource://test/testactors.js");
DebuggerServer.init();
// Allow incoming connections.
DebuggerServer.init(function () { return true; });
}
function finishClient(aClient)

Просмотреть файл

@ -8,7 +8,8 @@ function run_test()
{
DebuggerServer.addActors("resource://test/testactors.js");
DebuggerServer.init();
// Allow incoming connections.
DebuggerServer.init(function () { return true; });
gDebuggee = testGlobal("test-1");
DebuggerServer.addTestGlobal(gDebuggee);

Просмотреть файл

@ -11,7 +11,8 @@ function run_test()
{
DebuggerServer.addActors("resource://test/testactors.js");
DebuggerServer.init();
// Allow incoming connections.
DebuggerServer.init(function () { return true; });
gDebuggee = testGlobal("test-1");
DebuggerServer.addTestGlobal(gDebuggee);

Просмотреть файл

@ -11,7 +11,8 @@ function run_test()
{
DebuggerServer.addActors("resource://test/testactors.js");
DebuggerServer.init();
// Allow incoming connections.
DebuggerServer.init(function () { return true; });
gDebuggee = testGlobal("test-1");
DebuggerServer.addTestGlobal(gDebuggee);

Просмотреть файл

@ -14,7 +14,8 @@ function run_test()
check_except(DebuggerServer.closeListener);
check_except(DebuggerServer.connectPipe);
DebuggerServer.init();
// Allow incoming connections.
DebuggerServer.init(function () { return true; });
// These should still fail because we haven't added a createRootActor
// implementation yet.

Просмотреть файл

@ -6,7 +6,8 @@ Cu.import("resource:///modules/devtools/dbg-client.jsm");
function run_test()
{
DebuggerServer.init();
// Allow incoming connections.
DebuggerServer.init(function () { return true; });
DebuggerServer.addActors("resource://test/testactors.js");
add_test(test_socket_conn);

Просмотреть файл

@ -8,7 +8,8 @@ function run_test()
{
DebuggerServer.addActors("resource://test/testactors.js");
DebuggerServer.init();
// Allow incoming connections.
DebuggerServer.init(function () { return true; });
gDebuggee = testGlobal("test-1");
DebuggerServer.addTestGlobal(gDebuggee);