diff --git a/doc/api/tty.md b/doc/api/tty.md
index a7c4c3a48d8707..03f86cd66052fd 100644
--- a/doc/api/tty.md
+++ b/doc/api/tty.md
@@ -80,10 +80,11 @@ added: v0.7.7
Allows configuration of `tty.ReadStream` so that it operates as a raw device.
When in raw mode, input is always available character-by-character, not
-including modifiers. Additionally, all special processing of characters by the
-terminal is disabled, including echoing input
+including modifiers. Additionally, all special processing of input characters
+by the terminal is disabled, including echoing input
characters. Ctrl+C will no longer cause a `SIGINT` when
-in this mode.
+in this mode. This mode does not affect terminal output processing, such as
+newline translation on Unix terminals.
## Class: `tty.WriteStream`
diff --git a/src/crypto/crypto_x509.cc b/src/crypto/crypto_x509.cc
index 991c4ca6bfb404..8082496a87714e 100644
--- a/src/crypto/crypto_x509.cc
+++ b/src/crypto/crypto_x509.cc
@@ -477,81 +477,64 @@ void CheckPublicKey(const FunctionCallbackInfo& args) {
cert->view().checkPublicKey(key->Data().GetAsymmetricKey()));
}
-void CheckHost(const FunctionCallbackInfo& args) {
+template
+void CheckX509Subject(const FunctionCallbackInfo& args, F check) {
Environment* env = Environment::GetCurrent(args);
X509Certificate* cert;
ASSIGN_OR_RETURN_UNWRAP(&cert, args.This());
- CHECK(args[0]->IsString()); // name
+ CHECK(args[0]->IsString()); // subject
CHECK(args[1]->IsUint32()); // flags
- Utf8Value name(env->isolate(), args[0]);
+ Utf8Value subject(env->isolate(), args[0]);
uint32_t flags = args[1].As()->Value();
- DataPointer peername;
- switch (cert->view().checkHost(name.ToStringView(), flags, &peername)) {
- case X509View::CheckMatch::MATCH: { // Match!
+ DataPointer matched_subject;
+ X509View view = cert->view();
+ auto result = check(view, subject.ToStringView(), flags, &matched_subject);
+ switch (result) {
+ case X509View::CheckMatch::MATCH: {
Local ret = args[0];
- if (peername) {
+ if (matched_subject) {
ret = OneByteString(env->isolate(),
- static_cast(peername.get()),
- peername.size());
+ matched_subject.get(),
+ matched_subject.size());
}
return args.GetReturnValue().Set(ret);
}
- case X509View::CheckMatch::NO_MATCH: // No Match!
- return; // No return value is set
- case X509View::CheckMatch::INVALID_NAME: // Error!
+ case X509View::CheckMatch::NO_MATCH:
+ break; // No return value is set.
+ case X509View::CheckMatch::INVALID_NAME:
return THROW_ERR_INVALID_ARG_VALUE(env, "Invalid name");
- default: // Error!
+ default:
return THROW_ERR_CRYPTO_OPERATION_FAILED(env);
}
}
-void CheckEmail(const FunctionCallbackInfo& args) {
- Environment* env = Environment::GetCurrent(args);
- X509Certificate* cert;
- ASSIGN_OR_RETURN_UNWRAP(&cert, args.This());
-
- CHECK(args[0]->IsString()); // name
- CHECK(args[1]->IsUint32()); // flags
-
- Utf8Value name(env->isolate(), args[0]);
- uint32_t flags = args[1].As()->Value();
+void CheckHost(const FunctionCallbackInfo& args) {
+ CheckX509Subject(
+ args,
+ [](X509View& cert,
+ std::string_view subject,
+ uint32_t flags,
+ DataPointer* match) { return cert.checkHost(subject, flags, match); });
+}
- switch (cert->view().checkEmail(name.ToStringView(), flags)) {
- case X509View::CheckMatch::MATCH: // Match!
- return args.GetReturnValue().Set(args[0]);
- case X509View::CheckMatch::NO_MATCH: // No Match!
- return; // No return value is set
- case X509View::CheckMatch::INVALID_NAME: // Error!
- return THROW_ERR_INVALID_ARG_VALUE(env, "Invalid name");
- default: // Error!
- return THROW_ERR_CRYPTO_OPERATION_FAILED(env);
- }
+void CheckEmail(const FunctionCallbackInfo& args) {
+ CheckX509Subject(
+ args,
+ [](X509View& cert,
+ std::string_view subject,
+ uint32_t flags,
+ DataPointer*) { return cert.checkEmail(subject, flags); });
}
void CheckIP(const FunctionCallbackInfo& args) {
- Environment* env = Environment::GetCurrent(args);
- X509Certificate* cert;
- ASSIGN_OR_RETURN_UNWRAP(&cert, args.This());
-
- CHECK(args[0]->IsString()); // IP
- CHECK(args[1]->IsUint32()); // flags
-
- Utf8Value name(env->isolate(), args[0]);
- uint32_t flags = args[1].As()->Value();
-
- switch (cert->view().checkIp(name.ToStringView(), flags)) {
- case X509View::CheckMatch::MATCH: // Match!
- return args.GetReturnValue().Set(args[0]);
- case X509View::CheckMatch::NO_MATCH: // No Match!
- return; // No return value is set
- case X509View::CheckMatch::INVALID_NAME: // Error!
- return THROW_ERR_INVALID_ARG_VALUE(env, "Invalid IP");
- default: // Error!
- return THROW_ERR_CRYPTO_OPERATION_FAILED(env);
- }
+ CheckX509Subject(args,
+ [](X509View& cert,
+ std::string_view subject,
+ uint32_t flags,
+ DataPointer*) { return cert.checkIp(subject, flags); });
}
void GetIssuerCert(const FunctionCallbackInfo& args) {