|
| 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