Index: sdk/lib/io/secure_socket.dart |
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart |
index 5d894d4d20164df37ce5fb704b17ba62c44e94e0..2a28e1356387974a21fb702d7ac973e160f75c1c 100644 |
--- a/sdk/lib/io/secure_socket.dart |
+++ b/sdk/lib/io/secure_socket.dart |
@@ -21,7 +21,22 @@ abstract class SecureSocket implements Socket { |
* client connections, and server certificates to provide on server |
* connections. The password argument should be used when creating |
* secure server sockets, to allow the private key of the server |
- * certificate to be fetched. |
+ * certificate to be fetched. If useBuiltinRoots is true (the default), |
+ * then a built-in set of root certificates for trusted certificate |
+ * authorities is merged with the certificates in the database. |
+ * |
+ * Examples: |
+ * 1) Use only the builtin root certificates: |
+ * SecureSocket.initialize(); or |
+ * |
+ * 2) Use a specified database and the builtin roots: |
+ * SecureSocket.initialize(database: 'path/to/my/database', |
+ * password: 'my_password'); |
+ * |
+ * 3) Use a specified database, without builtin roots: |
+ * SecureSocket.initialize(database: 'path/to/my/database', |
+ * password: 'my_password'. |
+ * useBuiltinRoots: false); |
* |
* The database should be an NSS certificate database directory |
* containing a cert9.db file, not a cert8.db file. This version of |
@@ -29,8 +44,9 @@ abstract class SecureSocket implements Socket { |
* front of the absolute path of the database directory, or setting the |
* environment variable NSS_DEFAULT_DB_TYPE to "sql". |
*/ |
- external static void setCertificateDatabase(String certificateDatabase, |
- [String password]); |
+ external static void initialize({String database, |
+ String password, |
+ bool useBuiltinRoots: true}); |
} |
@@ -196,7 +212,7 @@ class _SecureSocket implements SecureSocket { |
List<int> read([int len]) { |
if (_closedRead) { |
- throw new SocketException("Reading from a closed socket"); |
+ throw new SocketIOException("Reading from a closed socket"); |
} |
if (_status != CONNECTED) { |
return new List<int>(0); |
@@ -221,7 +237,7 @@ class _SecureSocket implements SecureSocket { |
int readList(List<int> data, int offset, int bytes) { |
if (_closedRead) { |
- throw new SocketException("Reading from a closed socket"); |
+ throw new SocketIOException("Reading from a closed socket"); |
} |
if (offset < 0 || bytes < 0 || offset + bytes > data.length) { |
throw new ArgumentError( |
@@ -255,7 +271,7 @@ class _SecureSocket implements SecureSocket { |
// up handlers to flush the pipeline when possible. |
int writeList(List<int> data, int offset, int bytes) { |
if (_closedWrite) { |
- throw new SocketException("Writing to a closed socket"); |
+ throw new SocketIOException("Writing to a closed socket"); |
} |
if (_status != CONNECTED) return 0; |
var buffer = _secureFilter.buffers[WRITE_PLAINTEXT]; |
@@ -298,10 +314,14 @@ class _SecureSocket implements SecureSocket { |
void _secureDataHandler() { |
if (_status == HANDSHAKE) { |
- _secureHandshake(); |
+ try { |
+ _secureHandshake(); |
+ } catch (e) { _reportError(e, "SecureSocket error"); } |
} else { |
- _writeEncryptedData(); // TODO(whesse): Removing this causes a failure. |
- _readEncryptedData(); |
+ try { |
+ _writeEncryptedData(); // TODO(whesse): Removing this causes a failure. |
+ _readEncryptedData(); |
+ } catch (e) { _reportError(e, "SecureSocket error"); } |
if (!_filterReadEmpty) { |
// Call the onData event. |
if (scheduledDataEvent != null) { |
@@ -329,6 +349,7 @@ class _SecureSocket implements SecureSocket { |
} else { |
e = new SocketIOException('$message (${error.toString()})', null); |
} |
+ close(false); |
bool reported = false; |
if (_socketErrorHandler != null) { |
reported = true; |
@@ -340,7 +361,6 @@ class _SecureSocket implements SecureSocket { |
if (_outputStream != null) { |
reported = reported || _outputStream._onSocketError(e); |
} |
- |
if (!reported) throw e; |
} |