#include "kerberos_context.h" Nan::Persistent KerberosContext::constructor_template; KerberosContext::KerberosContext() : Nan::ObjectWrap() { state = NULL; server_state = NULL; } KerberosContext::~KerberosContext() { } KerberosContext* KerberosContext::New() { Nan::HandleScope scope; Local obj = Nan::New(constructor_template)->GetFunction()->NewInstance(); KerberosContext *kerberos_context = Nan::ObjectWrap::Unwrap(obj); return kerberos_context; } NAN_METHOD(KerberosContext::New) { // Create code object KerberosContext *kerberos_context = new KerberosContext(); // Wrap it kerberos_context->Wrap(info.This()); // Return the object info.GetReturnValue().Set(info.This()); } void KerberosContext::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) { // Grab the scope of the call from Node Nan::HandleScope scope; // Define a new function template Local t = Nan::New(static_cast(New)); t->InstanceTemplate()->SetInternalFieldCount(1); t->SetClassName(Nan::New("KerberosContext").ToLocalChecked()); // Get prototype Local proto = t->PrototypeTemplate(); // Getter for the response Nan::SetAccessor(proto, Nan::New("response").ToLocalChecked(), KerberosContext::ResponseGetter); // Getter for the username Nan::SetAccessor(proto, Nan::New("username").ToLocalChecked(), KerberosContext::UsernameGetter); // Getter for the targetname - server side only Nan::SetAccessor(proto, Nan::New("targetname").ToLocalChecked(), KerberosContext::TargetnameGetter); Nan::SetAccessor(proto, Nan::New("delegatedCredentialsCache").ToLocalChecked(), KerberosContext::DelegatedCredentialsCacheGetter); // Set persistent constructor_template.Reset(t); // NanAssignPersistent(constructor_template, t); // Set the symbol target->ForceSet(Nan::New("KerberosContext").ToLocalChecked(), t->GetFunction()); } // Response Setter / Getter NAN_GETTER(KerberosContext::ResponseGetter) { gss_client_state *client_state; gss_server_state *server_state; // Unpack the object KerberosContext *context = Nan::ObjectWrap::Unwrap(info.This()); // Response could come from client or server state... client_state = context->state; server_state = context->server_state; // If client state is in use, take response from there, otherwise from server char *response = client_state != NULL ? client_state->response : server_state != NULL ? server_state->response : NULL; if(response == NULL) { info.GetReturnValue().Set(Nan::Null()); } else { // Return the response info.GetReturnValue().Set(Nan::New(response).ToLocalChecked()); } } // username Getter NAN_GETTER(KerberosContext::UsernameGetter) { // Unpack the object KerberosContext *context = Nan::ObjectWrap::Unwrap(info.This()); gss_client_state *client_state = context->state; gss_server_state *server_state = context->server_state; // If client state is in use, take response from there, otherwise from server char *username = client_state != NULL ? client_state->username : server_state != NULL ? server_state->username : NULL; if(username == NULL) { info.GetReturnValue().Set(Nan::Null()); } else { info.GetReturnValue().Set(Nan::New(username).ToLocalChecked()); } } // targetname Getter - server side only NAN_GETTER(KerberosContext::TargetnameGetter) { // Unpack the object KerberosContext *context = Nan::ObjectWrap::Unwrap(info.This()); gss_server_state *server_state = context->server_state; char *targetname = server_state != NULL ? server_state->targetname : NULL; if(targetname == NULL) { info.GetReturnValue().Set(Nan::Null()); } else { info.GetReturnValue().Set(Nan::New(targetname).ToLocalChecked()); } } // targetname Getter - server side only NAN_GETTER(KerberosContext::DelegatedCredentialsCacheGetter) { // Unpack the object KerberosContext *context = Nan::ObjectWrap::Unwrap(info.This()); gss_server_state *server_state = context->server_state; char *delegated_credentials_cache = server_state != NULL ? server_state->delegated_credentials_cache : NULL; if(delegated_credentials_cache == NULL) { info.GetReturnValue().Set(Nan::Null()); } else { info.GetReturnValue().Set(Nan::New(delegated_credentials_cache).ToLocalChecked()); } }