Skip to content
This repository was archived by the owner on Jul 30, 2024. It is now read-only.

Commit 5e007a8

Browse files
authored
Merge pull request #87 from exoego/tls
Overhaul tls module
2 parents 565e692 + 14c23b5 commit 5e007a8

File tree

9 files changed

+149
-33
lines changed

9 files changed

+149
-33
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ The following core Node.js modules (v8.7.0+) have been implemented:
4242
| [stream](https://nodejs.org/api/stream.html) | :heavy_check_mark: |
4343
| [string-decoder](https://nodejs.org/api/string_decoder.html) | :heavy_check_mark: |
4444
| [timers](https://nodejs.org/api/timers.html) | :heavy_check_mark: |
45-
| [tls](https://nodejs.org/api/tls.html) | |
45+
| [tls](https://nodejs.org/api/tls.html) | :heavy_check_mark: |
4646
| [tty](https://nodejs.org/api/tty.html) | :heavy_check_mark: |
4747
| [url](https://nodejs.org/api/url.html) | :heavy_check_mark: |
4848
| [util](https://nodejs.org/api/util.html) | :heavy_check_mark: |
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.scalajs.nodejs.tls
2+
3+
import io.scalajs.nodejs.buffer.Buffer
4+
import io.scalajs.nodejs.{net, stream}
5+
6+
import scala.scalajs.js
7+
8+
class ConnectOptions(
9+
var host: js.UndefOr[String] = js.undefined,
10+
var port: js.UndefOr[Int] = js.undefined,
11+
var path: js.UndefOr[String] = js.undefined,
12+
var socket: js.UndefOr[stream.IDuplex] = js.undefined,
13+
var allowHalfOpen: js.UndefOr[Boolean] = js.undefined,
14+
var servername: js.UndefOr[String] = js.undefined,
15+
var checkServerIdentity: js.UndefOr[js.Function2[String, TLSCertificate, Any]] = js.undefined,
16+
var minDHSize: js.UndefOr[Int] = js.undefined,
17+
// TLSSocketOptions
18+
var enableTrace: js.UndefOr[Boolean] = js.undefined,
19+
var isServer: js.UndefOr[Boolean] = js.undefined,
20+
var server: js.UndefOr[net.Server] = js.undefined,
21+
var requestCert: js.UndefOr[Boolean] = js.undefined,
22+
var rejectUnauthorized: js.UndefOr[Boolean] = js.undefined,
23+
var NPNProtocols: js.UndefOr[Boolean] = js.undefined,
24+
var ALPNProtocols: js.UndefOr[ALPNProtocols] = js.undefined,
25+
var SNICallback: js.UndefOr[js.Function2[String, js.Function, Any]] = js.undefined,
26+
var session: js.UndefOr[Buffer] = js.undefined,
27+
var requestOCSP: js.UndefOr[Boolean] = js.undefined,
28+
var secureContext: js.UndefOr[SecureContext] = js.undefined
29+
) extends js.Object

app/current/src/main/scala/io/scalajs/nodejs/tls/SecureContextOptions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class SecureContextOptions(
1414
var crl: js.UndefOr[SecureData] = js.undefined,
1515
var dphram: js.UndefOr[String | Buffer] = js.undefined,
1616
var ecdhCurve: js.UndefOr[String] = js.undefined,
17-
var honorCihperOrder: js.UndefOr[Boolean] = js.undefined,
17+
var honorCipherOrder: js.UndefOr[Boolean] = js.undefined,
1818
var key: js.UndefOr[SecureData] = js.undefined,
1919
var maxVersion: js.UndefOr[String] = js.undefined,
2020
var minVersion: js.UndefOr[String] = js.undefined,

app/current/src/main/scala/io/scalajs/nodejs/tls/Server.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.scalajs.nodejs
22
package tls
33

4+
import com.thoughtworks.enableIf
45
import io.scalajs.nodejs.buffer.Buffer
56

67
import scala.scalajs.js
@@ -21,7 +22,10 @@ class Server extends net.Server {
2122
* @param context <Object> An object containing any of the possible properties from the tls.createSecureContext()
2223
* options arguments (e.g. key, cert, ca, etc).
2324
*/
24-
def addContext(hostname: String, context: js.Any): Unit = js.native
25+
def addContext(hostname: String, context: SecureContextOptions): Unit = js.native
26+
27+
@enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs12)
28+
def setSecureContext(context: SecureContextOptions): Unit = js.native
2529

2630
/**
2731
* Returns a Buffer instance holding the keys currently used for encryption/decryption of the TLS Session Tickets

app/current/src/main/scala/io/scalajs/nodejs/tls/ServerOptions.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class ServerOptions(
2020
// Options for net.createServers
2121
val allowHalfOpen: js.UndefOr[Boolean] = js.undefined,
2222
val pauseOnConnect: js.UndefOr[Boolean] = js.undefined,
23-
// Options for tls.createSecureContext
23+
// Options for tls.createSecureContext
2424
var ca: js.UndefOr[SecureData] = js.undefined,
2525
var cert: js.UndefOr[SecureData] = js.undefined,
2626
var sigalgs: js.UndefOr[String] = js.undefined,
@@ -29,7 +29,7 @@ class ServerOptions(
2929
var crl: js.UndefOr[SecureData] = js.undefined,
3030
var dphram: js.UndefOr[String | Buffer] = js.undefined,
3131
var ecdhCurve: js.UndefOr[String] = js.undefined,
32-
var honorCihperOrder: js.UndefOr[Boolean] = js.undefined,
32+
var honorCipherOrder: js.UndefOr[Boolean] = js.undefined,
3333
var key: js.UndefOr[SecureData] = js.undefined,
3434
var maxVersion: js.UndefOr[String] = js.undefined,
3535
var minVersion: js.UndefOr[String] = js.undefined,
Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package io.scalajs.nodejs
22
package tls
33

4+
import io.scalajs.nodejs.buffer.Buffer
5+
46
import scala.scalajs.js
7+
import scala.scalajs.js.annotation.JSName
8+
import scala.scalajs.js.|
59

610
/**
711
* TLS Certificate
@@ -10,10 +14,42 @@ import scala.scalajs.js
1014
@js.native
1115
trait TLSCertificate extends js.Object {
1216

13-
def subject: js.Any = js.native
17+
def raw: Buffer = js.native
18+
19+
def subject: Subject = js.native
20+
def issuer: Subject = js.native
21+
def issuerCertificate: TLSCertificate = js.native
22+
23+
def valid_from: String = js.native
24+
def valid_to: String = js.native
25+
26+
def serialNumber: String = js.native
27+
def fingerprint: String = js.native
28+
def fingerprint256: String = js.native
29+
def ext_key_usage: js.Array[String] = js.native
30+
def subjectaltname: String = js.native
31+
def infoAccess: js.Dictionary[js.Array[String]] = js.native
1432

15-
def issuer: js.Any = js.native
33+
// For RSA and EC keys
34+
def pubkey: js.UndefOr[Buffer] = js.native
35+
def bits: js.UndefOr[Int] = js.native
1636

17-
def issuerCertificate: js.Any = js.native
37+
// For RSA keys
38+
def exponent: js.UndefOr[String] = js.native
39+
def modulus: js.UndefOr[String] = js.native
1840

41+
// For EC keys
42+
def asn1Curve: js.UndefOr[String] = js.native
43+
def nitsCurve: js.UndefOr[String] = js.native
44+
}
45+
46+
// TODO: Remove js.Array[String] where possible
47+
@js.native
48+
trait Subject extends js.Object {
49+
@JSName("C") var country: js.UndefOr[String | js.Array[String]] = js.native
50+
@JSName("ST") var stateOrProvince: js.UndefOr[String | js.Array[String]] = js.native
51+
@JSName("L") var locality: js.UndefOr[String | js.Array[String]] = js.native
52+
@JSName("O") var organization: js.UndefOr[String | js.Array[String]] = js.native
53+
@JSName("OU") var organizationUnit: js.UndefOr[String | js.Array[String]] = js.native
54+
@JSName("CN") var commonName: js.UndefOr[String | js.Array[String]] = js.native
1955
}

app/current/src/main/scala/io/scalajs/nodejs/tls/TLSSocket.scala

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package io.scalajs.nodejs
22
package tls
33

4+
import com.thoughtworks.enableIf
45
import io.scalajs.nodejs.buffer.Buffer
5-
import io.scalajs.nodejs.net.Socket
66

77
import scala.scalajs.js
88
import scala.scalajs.js.annotation.JSImport
9+
import scala.scalajs.js.|
910

1011
/**
1112
* The tls.TLSSocket is a subclass of net.Socket that performs transparent encryption of written data
@@ -17,7 +18,21 @@ import scala.scalajs.js.annotation.JSImport
1718
*/
1819
@js.native
1920
@JSImport("tls", "TLSSocket")
20-
class TLSSocket(socket: Socket, options: TLSSocketOptions = js.native) extends net.Socket {
21+
class TLSSocket(socket: stream.IDuplex, options: TLSSocketOptions = js.native) extends net.Socket {
22+
23+
def authorizationError: js.UndefOr[Boolean] = js.native
24+
25+
def authorized: Boolean = js.native
26+
27+
def disableRenegotiation(): Unit = js.native
28+
29+
@enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs12)
30+
def enableTrace(): Unit = js.native
31+
32+
def encrypted: Boolean = js.native
33+
34+
@enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs12)
35+
def getCertificate(): TLSCertificate = js.native
2136

2237
/**
2338
* Returns an object representing the peer's certificate. The returned object has some properties corresponding to
@@ -30,20 +45,32 @@ class TLSSocket(socket: Socket, options: TLSSocketOptions = js.native) extends n
3045
*/
3146
def getPeerCertificate(detailed: String): TLSCertificate = js.native
3247

48+
@enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10)
49+
def getPeerFinished(): js.UndefOr[Buffer] = js.native
50+
3351
/**
3452
* Returns a string containing the negotiated SSL/TLS protocol version of the current connection.
3553
* The value 'unknown' will be returned for connected sockets that have not completed the handshaking process.
3654
* The value null will be returned for server sockets or disconnected client sockets.
3755
* @return a string containing the negotiated SSL/TLS protocol version
3856
*/
39-
def getProtocol(): String = js.native
57+
def getProtocol(): String | Null = js.native
4058

4159
/**
4260
* Returns the ASN.1 encoded TLS session or undefined if no session was negotiated.
4361
* Can be used to speed up handshake establishment when reconnecting to the server.
4462
* @return the ASN.1 encoded TLS session
4563
*/
46-
def getSession(): js.UndefOr[String] = js.native
64+
def getSession(): js.UndefOr[Buffer] = js.native
65+
66+
def getTLSTicket(): Buffer = js.native
67+
68+
def isSessionReused(): Boolean = js.native
69+
70+
def renegotiate(options: RenegotiateOptions, callback: js.Function1[io.scalajs.nodejs.Error, Any]): Boolean =
71+
js.native
72+
73+
def setMaxSendFragment(size: Int): Boolean = js.native
4774

4875
}
4976

@@ -66,14 +93,20 @@ class TLSSocket(socket: Socket, options: TLSSocketOptions = js.native) extends n
6693
* @param secureContext Optional TLS context object created with tls.createSecureContext(). If a secureContext
6794
* is not provided, one will be created by calling tls.createSecureContext() with no options.
6895
*/
69-
class TLSSocketOptions(val isServer: js.UndefOr[Boolean] = js.undefined,
70-
val server: js.UndefOr[net.Server] = js.undefined,
71-
val requestCert: js.UndefOr[Boolean] = js.undefined,
72-
val rejectUnauthorized: js.UndefOr[Boolean] = js.undefined,
73-
val NPNProtocols: js.UndefOr[Boolean] = js.undefined,
74-
val ALPNProtocols: js.UndefOr[Boolean] = js.undefined,
75-
val SNICallback: js.UndefOr[Boolean] = js.undefined,
76-
val session: js.UndefOr[Buffer] = js.undefined,
77-
val requestOCSP: js.UndefOr[Boolean] = js.undefined,
78-
val secureContext: js.UndefOr[SecureContext] = js.undefined)
96+
class TLSSocketOptions(var enableTrace: js.UndefOr[Boolean] = js.undefined,
97+
var isServer: js.UndefOr[Boolean] = js.undefined,
98+
var server: js.UndefOr[net.Server] = js.undefined,
99+
var requestCert: js.UndefOr[Boolean] = js.undefined,
100+
var rejectUnauthorized: js.UndefOr[Boolean] = js.undefined,
101+
var NPNProtocols: js.UndefOr[Boolean] = js.undefined,
102+
var ALPNProtocols: js.UndefOr[ALPNProtocols] = js.undefined,
103+
var SNICallback: js.UndefOr[js.Function2[String, js.Function, Any]] = js.undefined,
104+
var session: js.UndefOr[Buffer] = js.undefined,
105+
var requestOCSP: js.UndefOr[Boolean] = js.undefined,
106+
var secureContext: js.UndefOr[SecureContext] = js.undefined)
79107
extends js.Object
108+
109+
class RenegotiateOptions(
110+
var rejectUnauthorized: js.UndefOr[Boolean] = js.undefined,
111+
var requestCert: js.UndefOr[Boolean] = js.undefined
112+
) extends js.Object
Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.scalajs.nodejs
22
package tls
33

4+
import com.thoughtworks.enableIf
5+
46
import scala.scalajs.js
57
import scala.scalajs.js.annotation.JSImport
68

@@ -12,25 +14,33 @@ import scala.scalajs.js.annotation.JSImport
1214
@js.native
1315
trait Tls extends js.Object {
1416

15-
/**
16-
* Same as tls.connect() except that port and host can be provided as arguments instead of options.
17-
* @param port Default value for options.port.
18-
* @param host Optional default value for options.host.
19-
* @param options See tls.connect().
20-
* @param callback See tls.connect().
21-
* @example connect(port[, host][, options][, callback])
22-
*/
23-
def connect(port: Int, host: String, options: TlsConnectOptions, callback: js.Function): Unit = js.native
17+
def checkServerIdentity(hostname: String, cert: TLSCertificate): js.UndefOr[io.scalajs.nodejs.Error] = js.native
18+
19+
def connect(options: ConnectOptions, callback: js.Function = js.native): Unit = js.native
2420

2521
def createSecureContext(options: SecureContextOptions = js.native): SecureContext = js.native
2622

23+
def createServer(options: ServerOptions, secureConnectionListener: js.Function = js.native): Server = js.native
24+
def createServer(secureConnectionListener: js.Function): Server = js.native
25+
def createServer(): Server = js.native
26+
27+
def getCiphers(): js.Array[String] = js.native
28+
29+
@enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs12)
30+
def rootCertificates: js.Array[String] = js.native
2731
}
2832

2933
/**
3034
* TLS Singleton
3135
*/
3236
@js.native
3337
@JSImport("tls", JSImport.Namespace)
34-
object Tls extends Tls
38+
object Tls extends Tls {
39+
def DEFAULT_ECDH_CURVE: String = js.native
40+
41+
@enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs12)
42+
def DEFAULT_MAX_VERSION: String = js.native
3543

36-
class TlsConnectOptions() extends js.Object
44+
@enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs12)
45+
def DEFAULT_MIN_VERSION: String = js.native
46+
}

app/current/src/main/scala/io/scalajs/nodejs/tls/package.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.scalajs.nodejs
33
import io.scalajs.nodejs.buffer.Buffer
44

55
import scala.scalajs.js
6+
import scala.scalajs.js.typedarray.{DataView, TypedArray}
67
import scala.scalajs.js.|
78

89
package object tls {
@@ -11,4 +12,7 @@ package object tls {
1112
type SecureData = String | js.Array[String] | Buffer | js.Array[Buffer]
1213

1314
type SecureDataObjectForm = js.Object
15+
16+
type ALPNProtocols =
17+
Buffer | TypedArray[_, _] | DataView | js.Array[String] | js.Array[TypedArray[_, _]] | js.Array[DataView]
1418
}

0 commit comments

Comments
 (0)