Skip to content

Commit 5a4327c

Browse files
committed
feat(step): implement client and server step methods
1 parent 77a77ce commit 5a4327c

File tree

4 files changed

+81
-20
lines changed

4 files changed

+81
-20
lines changed

src/kerberos.cc

+14-11
Original file line numberDiff line numberDiff line change
@@ -74,31 +74,33 @@ NAN_METHOD(AuthGSSClientClean) {
7474
}
7575

7676
NAN_METHOD(AuthGSSClientStep) {
77-
v8::MaybeLocal<v8::Object> context = Nan::To<v8::Object>(info[0]);
78-
v8::MaybeLocal<v8::String> challenge = Nan::To<v8::String>(info[1]);
77+
KerberosClientContext* context =
78+
Nan::ObjectWrap::Unwrap<KerberosClientContext>(info[0]->ToObject());
79+
std::string challenge(*Nan::Utf8String(info[1]));
7980
Nan::Callback *callback = new Nan::Callback(Nan::To<v8::Function>(info[2]).ToLocalChecked());
8081

81-
AsyncQueueWorker(new DummyWorker(callback));
82+
AsyncQueueWorker(new ClientStepWorker(context, challenge, callback));
8283
}
8384

8485
NAN_METHOD(AuthGSSClientUnwrap) {
85-
v8::MaybeLocal<v8::Object> context = Nan::To<v8::Object>(info[0]);
86-
v8::MaybeLocal<v8::String> challenge = Nan::To<v8::String>(info[1]);
86+
KerberosClientContext* context =
87+
Nan::ObjectWrap::Unwrap<KerberosClientContext>(info[0]->ToObject());
88+
std::string challenge(*Nan::Utf8String(info[1]));
8789
Nan::Callback *callback = new Nan::Callback(Nan::To<v8::Function>(info[2]).ToLocalChecked());
8890

8991
AsyncQueueWorker(new DummyWorker(callback));
9092
}
9193

9294
NAN_METHOD(AuthGSSClientWrap) {
93-
v8::MaybeLocal<v8::String> service = Nan::To<v8::String>(info[0]);
94-
v8::MaybeLocal<v8::Object> options = Nan::To<v8::Object>(info[1]);
95+
std::string service(*Nan::Utf8String(info[0]));
96+
v8::Local<v8::Object> options = Nan::To<v8::Object>(info[1]).ToLocalChecked();
9597
Nan::Callback *callback = new Nan::Callback(Nan::To<v8::Function>(info[2]).ToLocalChecked());
9698

9799
AsyncQueueWorker(new DummyWorker(callback));
98100
}
99101

100102
NAN_METHOD(AuthGSSServerInit) {
101-
std::string service = *(Nan::Utf8String(info[0]));
103+
std::string service(*Nan::Utf8String(info[0]));
102104
Nan::Callback* callback = new Nan::Callback(Nan::To<v8::Function>(info[2]).ToLocalChecked());
103105

104106
AsyncQueueWorker(new ServerInitWorker(service, callback));
@@ -113,11 +115,12 @@ NAN_METHOD(AuthGSSServerClean) {
113115
}
114116

115117
NAN_METHOD(AuthGSSServerStep) {
116-
v8::MaybeLocal<v8::Object> context = Nan::To<v8::Object>(info[0]);
117-
v8::MaybeLocal<v8::String> challenge = Nan::To<v8::String>(info[1]);
118+
KerberosServerContext* context =
119+
Nan::ObjectWrap::Unwrap<KerberosServerContext>(info[0]->ToObject());
120+
std::string challenge(*Nan::Utf8String(info[1]));
118121
Nan::Callback *callback = new Nan::Callback(Nan::To<v8::Function>(info[2]).ToLocalChecked());
119122

120-
AsyncQueueWorker(new DummyWorker(callback));
123+
AsyncQueueWorker(new ServerStepWorker(context, challenge, callback));
121124
}
122125

123126
NAN_MODULE_INIT(Init) {

src/kerberos_context.cc

+20-7
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,19 @@ KerberosClientContext::KerberosClientContext(gss_client_state* state)
2929
: _state(state)
3030
{}
3131

32-
KerberosClientContext::~KerberosClientContext()
33-
{
32+
KerberosClientContext::~KerberosClientContext() {
33+
destroy();
34+
}
35+
36+
gss_client_state* KerberosClientContext::state() const {
37+
return _state;
3438
}
3539

3640
void KerberosClientContext::destroy() {
37-
authenticate_gss_client_clean(_state);
41+
if (_state != NULL) {
42+
authenticate_gss_client_clean(_state);
43+
_state = NULL;
44+
}
3845
}
3946

4047
NAN_GETTER(KerberosClientContext::UserNameGetter) {
@@ -91,13 +98,19 @@ KerberosServerContext::KerberosServerContext(gss_server_state* state)
9198
: _state(state)
9299
{}
93100

94-
KerberosServerContext::~KerberosServerContext()
95-
{
96-
// TODO: destroy the state with `authenticate_gss_server_clean` if it hasn't been already
101+
KerberosServerContext::~KerberosServerContext() {
102+
destroy();
103+
}
104+
105+
gss_server_state* KerberosServerContext::state() const {
106+
return _state;
97107
}
98108

99109
void KerberosServerContext::destroy() {
100-
authenticate_gss_server_clean(_state);
110+
if (_state != NULL) {
111+
authenticate_gss_server_clean(_state);
112+
_state = NULL;
113+
}
101114
}
102115

103116
NAN_GETTER(KerberosServerContext::UserNameGetter) {

src/kerberos_context.h

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ class KerberosClientContext : public Nan::ObjectWrap {
88
public:
99
static NAN_MODULE_INIT(Init);
1010
static v8::Local<v8::Object> NewInstance(gss_client_state* state);
11+
12+
gss_client_state* state() const;
1113
void destroy();
1214

1315
private:
@@ -28,6 +30,8 @@ class KerberosServerContext : public Nan::ObjectWrap {
2830
public:
2931
static NAN_MODULE_INIT(Init);
3032
static v8::Local<v8::Object> NewInstance(gss_server_state* state);
33+
34+
gss_server_state* state() const;
3135
void destroy();
3236

3337
private:

src/kerberos_worker.h

+43-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class ClientInitWorker : public Nan::AsyncWorker {
4646
long int _gss_flags;
4747
gss_OID _mech_oid;
4848
gss_client_state* _client_state;
49-
5049
};
5150

5251
class ClientCleanWorker : public Nan::AsyncWorker {
@@ -62,7 +61,28 @@ class ClientCleanWorker : public Nan::AsyncWorker {
6261

6362
private:
6463
KerberosClientContext* _context;
64+
};
65+
66+
class ClientStepWorker : public Nan::AsyncWorker {
67+
public:
68+
ClientStepWorker(KerberosClientContext* context, std::string challenge, Nan::Callback *callback)
69+
: AsyncWorker(callback, "kerberos:ClientStepWorker"),
70+
_context(context),
71+
_challenge(challenge)
72+
{}
73+
74+
virtual void Execute() {
75+
std::unique_ptr<gss_result, FreeDeleter> result(
76+
authenticate_gss_client_step(_context->state(), _challenge.c_str(), NULL));
77+
if (result->code == AUTH_GSS_ERROR) {
78+
SetErrorMessage(result->message);
79+
return;
80+
}
81+
}
6582

83+
private:
84+
KerberosClientContext* _context;
85+
std::string _challenge;
6686
};
6787

6888
class ServerInitWorker : public Nan::AsyncWorker {
@@ -97,7 +117,6 @@ class ServerInitWorker : public Nan::AsyncWorker {
97117
private:
98118
std::string _service;
99119
gss_server_state* _server_state;
100-
101120
};
102121

103122
class ServerCleanWorker : public Nan::AsyncWorker {
@@ -113,7 +132,29 @@ class ServerCleanWorker : public Nan::AsyncWorker {
113132

114133
private:
115134
KerberosServerContext* _context;
135+
};
136+
137+
class ServerStepWorker : public Nan::AsyncWorker {
138+
public:
139+
ServerStepWorker(KerberosServerContext* context, std::string challenge, Nan::Callback *callback)
140+
: AsyncWorker(callback, "kerberos:ServerStepWorker"),
141+
_context(context),
142+
_challenge(challenge)
143+
{}
116144

145+
virtual void Execute() {
146+
std::unique_ptr<gss_result, FreeDeleter> result(
147+
authenticate_gss_server_step(_context->state(), _challenge.c_str()));
148+
if (result->code == AUTH_GSS_ERROR) {
149+
SetErrorMessage(result->message);
150+
return;
151+
}
152+
}
153+
154+
private:
155+
KerberosServerContext* _context;
156+
std::string _challenge;
117157
};
118158

159+
119160
#endif // KERBEROS_WORKER_H

0 commit comments

Comments
 (0)