@@ -78,6 +78,14 @@ void KerberosClient::UnwrapData(const CallbackInfo& info) {
78
78
});
79
79
}
80
80
81
+ static bool isStringTooLong (const std::string& str) {
82
+ return str.length () >= ULONG_MAX;
83
+ }
84
+
85
+ static bool isWStringTooLong (const std::wstring& str) {
86
+ return str.length () >= ULONG_MAX;
87
+ }
88
+
81
89
void KerberosClient::WrapData (const CallbackInfo& info) {
82
90
auto state = this ->state ();
83
91
std::string challenge = info[0 ].ToString ();
@@ -86,9 +94,13 @@ void KerberosClient::WrapData(const CallbackInfo& info) {
86
94
std::string user = ToStringWithNonStringAsEmpty (options[" user" ]);
87
95
int protect = 0 ; // NOTE: this should be an option
88
96
97
+ if (isStringTooLong (user)) {
98
+ throw Error::New (info.Env (), " User name is too long" );
99
+ }
100
+
89
101
KerberosWorker::Run (callback, " kerberos:ClientWrap" , [=](KerberosWorker::SetOnFinishedHandler onFinished) {
90
102
sspi_result result = auth_sspi_client_wrap (
91
- state.get (), (SEC_CHAR*)challenge.c_str (), (SEC_CHAR*)user.c_str (), user.length (), protect);
103
+ state.get (), (SEC_CHAR*)challenge.c_str (), (SEC_CHAR*)user.c_str (), (ULONG) user.length (), protect);
92
104
93
105
return onFinished ([=](KerberosWorker* worker) {
94
106
Napi::Env env = worker->Env ();
@@ -119,6 +131,17 @@ void InitializeClient(const CallbackInfo& info) {
119
131
std::wstring user = ToWStringWithNonStringAsEmpty (options[" user" ]);
120
132
std::wstring domain = ToWStringWithNonStringAsEmpty (options[" domain" ]);
121
133
std::wstring password = ToWStringWithNonStringAsEmpty (options[" password" ]);
134
+
135
+ if (isWStringTooLong (user)) {
136
+ throw Error::New (info.Env (), " User name is too long" );
137
+ }
138
+ if (isWStringTooLong (domain)) {
139
+ throw Error::New (info.Env (), " Domain is too long" );
140
+ }
141
+ if (isWStringTooLong (password)) {
142
+ throw Error::New (info.Env (), " Password is too long" );
143
+ }
144
+
122
145
Value flags_v = options[" flags" ];
123
146
ULONG gss_flags = flags_v.IsNumber () ? flags_v.As <Number>().Uint32Value () : GSS_C_MUTUAL_FLAG|GSS_C_SEQUENCE_FLAG;
124
147
Value mech_oid_v = options[" mechOID" ];
@@ -131,8 +154,8 @@ void InitializeClient(const CallbackInfo& info) {
131
154
KerberosWorker::Run (callback, " kerberos:InitializeClient" , [=](KerberosWorker::SetOnFinishedHandler onFinished) {
132
155
auto client_state = std::make_shared<sspi_client_state>();
133
156
sspi_result result = auth_sspi_client_init (
134
- (WCHAR*)service.c_str (), gss_flags, (WCHAR*)user.c_str (), user.length (),
135
- (WCHAR*)domain.c_str (), domain.length (), (WCHAR*)password.c_str (), password.length (),
157
+ (WCHAR*)service.c_str (), gss_flags, (WCHAR*)user.c_str (), (ULONG) user.length (),
158
+ (WCHAR*)domain.c_str (), (ULONG) domain.length (), (WCHAR*)password.c_str (), (ULONG) password.length (),
136
159
(WCHAR*)mech_oid.c_str (), client_state.get ());
137
160
138
161
return onFinished ([=](KerberosWorker* worker) {
0 commit comments