Skip to content

Commit 1c857ea

Browse files
committed
feat(kerberos): implement client/server init, move to worker file
1 parent fd4b852 commit 1c857ea

File tree

3 files changed

+101
-7
lines changed

3 files changed

+101
-7
lines changed

src/kerberos.cc

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
#include <memory>
2+
13
#include "kerberos.h"
4+
#include "kerberos_context.h"
5+
#include "kerberos_worker.h"
26

37
using v8::FunctionTemplate;
48

@@ -12,11 +16,11 @@ class DummyWorker : public Nan::AsyncWorker {
1216
};
1317

1418
NAN_METHOD(AuthGSSClientInit) {
15-
v8::MaybeLocal<v8::String> service = Nan::To<v8::String>(info[0]);
16-
v8::MaybeLocal<v8::Object> options = Nan::To<v8::Object>(info[1]);
19+
v8::Local<v8::String> service = Nan::To<v8::String>(info[0]).ToLocalChecked();
20+
v8::Local<v8::Object> options = Nan::To<v8::Object>(info[1]).ToLocalChecked();
1721
Nan::Callback *callback = new Nan::Callback(Nan::To<v8::Function>(info[2]).ToLocalChecked());
1822

19-
AsyncQueueWorker(new DummyWorker(callback));
23+
AsyncQueueWorker(new ClientInitWorker(std::string(), std::string(), 0, 0, callback));
2024
}
2125

2226
NAN_METHOD(AuthGSSClientClean) {
@@ -51,10 +55,11 @@ NAN_METHOD(AuthGSSClientWrap) {
5155
}
5256

5357
NAN_METHOD(AuthGSSServerInit) {
54-
v8::MaybeLocal<v8::String> service = Nan::To<v8::String>(info[0]);
58+
v8::Local<v8::String> service = Nan::To<v8::String>(info[0]).ToLocalChecked();
5559
Nan::Callback *callback = new Nan::Callback(Nan::To<v8::Function>(info[2]).ToLocalChecked());
5660

57-
AsyncQueueWorker(new DummyWorker(callback));
61+
Nan::Utf8String service_str(service);
62+
AsyncQueueWorker(new ServerInitWorker(std::string(*service_str), callback));
5863
}
5964

6065
NAN_METHOD(AuthGSSServerClean) {
@@ -73,6 +78,10 @@ NAN_METHOD(AuthGSSServerStep) {
7378
}
7479

7580
NAN_MODULE_INIT(Init) {
81+
// Custom types
82+
KerberosClientContext::Init(target);
83+
KerberosServerContext::Init(target);
84+
7685
// Client
7786
Nan::Set(target, Nan::New("authGSSClientInit").ToLocalChecked(),
7887
Nan::GetFunction(Nan::New<FunctionTemplate>(AuthGSSClientInit)).ToLocalChecked());

src/kerberos.h

-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
#include <nan.h>
66

7-
#include "kerberos_gss.h"
8-
97
NAN_METHOD(AuthGSSClientInit);
108
NAN_METHOD(AuthGSSClientClean);
119
NAN_METHOD(AuthGSSClientStep);

src/kerberos_worker.h

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#ifndef KERBEROS_WORKER_H
2+
#define KERBEROS_WORKER_H
3+
4+
#include "nan.h"
5+
6+
// Provide a default custom delter for the `gss_result` type
7+
struct FreeDeleter {
8+
void operator()(void* result) { free(result); }
9+
};
10+
11+
class ClientInitWorker : public Nan::AsyncWorker {
12+
public:
13+
ClientInitWorker(std::string service, std::string principal, long int gss_flags, gss_OID mech_oid, Nan::Callback *callback)
14+
: AsyncWorker(callback, "kerberos:ClientInitWorker"),
15+
_service(service),
16+
_principal(principal),
17+
_gss_flags(gss_flags),
18+
_mech_oid(mech_oid),
19+
_client_state(NULL)
20+
{}
21+
22+
virtual void Execute() {
23+
std::unique_ptr<gss_client_state, FreeDeleter> state(gss_client_state_new());
24+
std::unique_ptr<gss_result, FreeDeleter> result(
25+
authenticate_gss_client_init(_service.c_str(), _principal.c_str(), _gss_flags, _mech_oid, state.get()));
26+
27+
if (result->code == AUTH_GSS_ERROR) {
28+
SetErrorMessage(result->message);
29+
return;
30+
}
31+
32+
_client_state = state.release();
33+
}
34+
35+
protected:
36+
virtual void HandleOKCallback() {
37+
Nan::HandleScope scope;
38+
v8::Local<v8::Object> context = KerberosClientContext::NewInstance(_client_state);
39+
v8::Local<v8::Value> argv[] = { Nan::Null(), context };
40+
callback->Call(2, argv, async_resource);
41+
}
42+
43+
private:
44+
std::string _service;
45+
std::string _principal;
46+
long int _gss_flags;
47+
gss_OID _mech_oid;
48+
gss_client_state* _client_state;
49+
50+
};
51+
52+
class ServerInitWorker : public Nan::AsyncWorker {
53+
public:
54+
ServerInitWorker(std::string service, Nan::Callback *callback)
55+
: AsyncWorker(callback, "kerberos:ServerInitWorker"),
56+
_service(service),
57+
_server_state(NULL)
58+
{}
59+
60+
virtual void Execute() {
61+
std::unique_ptr<gss_server_state, FreeDeleter> state(gss_server_state_new());
62+
std::unique_ptr<gss_result, FreeDeleter> result(
63+
authenticate_gss_server_init(_service.c_str(), state.get()));
64+
65+
if (result->code == AUTH_GSS_ERROR) {
66+
SetErrorMessage(result->message);
67+
return;
68+
}
69+
70+
_server_state = state.release();
71+
}
72+
73+
protected:
74+
virtual void HandleOKCallback() {
75+
Nan::HandleScope scope;
76+
v8::Local<v8::Object> context = KerberosServerContext::NewInstance(_server_state);
77+
v8::Local<v8::Value> argv[] = { Nan::Null(), context };
78+
callback->Call(2, argv, async_resource);
79+
}
80+
81+
private:
82+
std::string _service;
83+
gss_server_state* _server_state;
84+
85+
};
86+
87+
#endif // KERBEROS_WORKER_H

0 commit comments

Comments
 (0)