kerberos_context.cc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "kerberos_context.h"
  2. Nan::Persistent<FunctionTemplate> KerberosContext::constructor_template;
  3. KerberosContext::KerberosContext() : Nan::ObjectWrap() {
  4. state = NULL;
  5. server_state = NULL;
  6. }
  7. KerberosContext::~KerberosContext() {
  8. }
  9. KerberosContext* KerberosContext::New() {
  10. Nan::HandleScope scope;
  11. Local<Object> obj = Nan::New(constructor_template)->GetFunction()->NewInstance();
  12. KerberosContext *kerberos_context = Nan::ObjectWrap::Unwrap<KerberosContext>(obj);
  13. return kerberos_context;
  14. }
  15. NAN_METHOD(KerberosContext::New) {
  16. // Create code object
  17. KerberosContext *kerberos_context = new KerberosContext();
  18. // Wrap it
  19. kerberos_context->Wrap(info.This());
  20. // Return the object
  21. info.GetReturnValue().Set(info.This());
  22. }
  23. void KerberosContext::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {
  24. // Grab the scope of the call from Node
  25. Nan::HandleScope scope;
  26. // Define a new function template
  27. Local<FunctionTemplate> t = Nan::New<v8::FunctionTemplate>(static_cast<NAN_METHOD((*))>(New));
  28. t->InstanceTemplate()->SetInternalFieldCount(1);
  29. t->SetClassName(Nan::New<String>("KerberosContext").ToLocalChecked());
  30. // Get prototype
  31. Local<ObjectTemplate> proto = t->PrototypeTemplate();
  32. // Getter for the response
  33. Nan::SetAccessor(proto, Nan::New<String>("response").ToLocalChecked(), KerberosContext::ResponseGetter);
  34. // Getter for the username
  35. Nan::SetAccessor(proto, Nan::New<String>("username").ToLocalChecked(), KerberosContext::UsernameGetter);
  36. // Getter for the targetname - server side only
  37. Nan::SetAccessor(proto, Nan::New<String>("targetname").ToLocalChecked(), KerberosContext::TargetnameGetter);
  38. Nan::SetAccessor(proto, Nan::New<String>("delegatedCredentialsCache").ToLocalChecked(), KerberosContext::DelegatedCredentialsCacheGetter);
  39. // Set persistent
  40. constructor_template.Reset(t);
  41. // NanAssignPersistent(constructor_template, t);
  42. // Set the symbol
  43. target->ForceSet(Nan::New<String>("KerberosContext").ToLocalChecked(), t->GetFunction());
  44. }
  45. // Response Setter / Getter
  46. NAN_GETTER(KerberosContext::ResponseGetter) {
  47. gss_client_state *client_state;
  48. gss_server_state *server_state;
  49. // Unpack the object
  50. KerberosContext *context = Nan::ObjectWrap::Unwrap<KerberosContext>(info.This());
  51. // Response could come from client or server state...
  52. client_state = context->state;
  53. server_state = context->server_state;
  54. // If client state is in use, take response from there, otherwise from server
  55. char *response = client_state != NULL ? client_state->response :
  56. server_state != NULL ? server_state->response : NULL;
  57. if(response == NULL) {
  58. info.GetReturnValue().Set(Nan::Null());
  59. } else {
  60. // Return the response
  61. info.GetReturnValue().Set(Nan::New<String>(response).ToLocalChecked());
  62. }
  63. }
  64. // username Getter
  65. NAN_GETTER(KerberosContext::UsernameGetter) {
  66. // Unpack the object
  67. KerberosContext *context = Nan::ObjectWrap::Unwrap<KerberosContext>(info.This());
  68. gss_client_state *client_state = context->state;
  69. gss_server_state *server_state = context->server_state;
  70. // If client state is in use, take response from there, otherwise from server
  71. char *username = client_state != NULL ? client_state->username :
  72. server_state != NULL ? server_state->username : NULL;
  73. if(username == NULL) {
  74. info.GetReturnValue().Set(Nan::Null());
  75. } else {
  76. info.GetReturnValue().Set(Nan::New<String>(username).ToLocalChecked());
  77. }
  78. }
  79. // targetname Getter - server side only
  80. NAN_GETTER(KerberosContext::TargetnameGetter) {
  81. // Unpack the object
  82. KerberosContext *context = Nan::ObjectWrap::Unwrap<KerberosContext>(info.This());
  83. gss_server_state *server_state = context->server_state;
  84. char *targetname = server_state != NULL ? server_state->targetname : NULL;
  85. if(targetname == NULL) {
  86. info.GetReturnValue().Set(Nan::Null());
  87. } else {
  88. info.GetReturnValue().Set(Nan::New<String>(targetname).ToLocalChecked());
  89. }
  90. }
  91. // targetname Getter - server side only
  92. NAN_GETTER(KerberosContext::DelegatedCredentialsCacheGetter) {
  93. // Unpack the object
  94. KerberosContext *context = Nan::ObjectWrap::Unwrap<KerberosContext>(info.This());
  95. gss_server_state *server_state = context->server_state;
  96. char *delegated_credentials_cache = server_state != NULL ? server_state->delegated_credentials_cache : NULL;
  97. if(delegated_credentials_cache == NULL) {
  98. info.GetReturnValue().Set(Nan::Null());
  99. } else {
  100. info.GetReturnValue().Set(Nan::New<String>(delegated_credentials_cache).ToLocalChecked());
  101. }
  102. }