blob: 3d32bdafa9a4e58e38465aaf9a5c1c9269901824 [file] [log] [blame]
murgatroid99e5061512015-01-12 18:14:35 -08001#include <node.h>
2
3#include "grpc/grpc.h"
4#include "grpc/grpc_security.h"
5#include "grpc/support/log.h"
6#include "server_credentials.h"
7
8namespace grpc {
9namespace node {
10
11using ::node::Buffer;
12using v8::Arguments;
13using v8::Exception;
14using v8::External;
15using v8::Function;
16using v8::FunctionTemplate;
17using v8::Handle;
18using v8::HandleScope;
19using v8::Integer;
20using v8::Local;
21using v8::Object;
22using v8::ObjectTemplate;
23using v8::Persistent;
24using v8::Value;
25
26Persistent<Function> ServerCredentials::constructor;
27Persistent<FunctionTemplate> ServerCredentials::fun_tpl;
28
29ServerCredentials::ServerCredentials(grpc_server_credentials *credentials)
30 : wrapped_credentials(credentials) {
31}
32
33ServerCredentials::~ServerCredentials() {
34 gpr_log(GPR_DEBUG, "Destroying server credentials object");
35 grpc_server_credentials_release(wrapped_credentials);
36}
37
38void ServerCredentials::Init(Handle<Object> exports) {
39 NanScope();
40 Local<FunctionTemplate> tpl = FunctionTemplate::New(New);
41 tpl->SetClassName(NanNew("ServerCredentials"));
42 tpl->InstanceTemplate()->SetInternalFieldCount(1);
43 NanAssignPersistent(fun_tpl, tpl);
44 NanAssignPersistent(constructor, tpl->GetFunction());
45 constructor->Set(NanNew("createSsl"),
46 FunctionTemplate::New(CreateSsl)->GetFunction());
47 constructor->Set(NanNew("createFake"),
48 FunctionTemplate::New(CreateFake)->GetFunction());
49 exports->Set(NanNew("ServerCredentials"), constructor);
50}
51
52bool ServerCredentials::HasInstance(Handle<Value> val) {
53 NanScope();
54 return NanHasInstance(fun_tpl, val);
55}
56
57Handle<Value> ServerCredentials::WrapStruct(
58 grpc_server_credentials *credentials) {
59 NanEscapableScope();
60 if (credentials == NULL) {
61 return NanEscapeScope(NanNull());
62 }
63 const int argc = 1;
64 Handle<Value> argv[argc] = {
65 External::New(reinterpret_cast<void*>(credentials)) };
66 return NanEscapeScope(constructor->NewInstance(argc, argv));
67}
68
69grpc_server_credentials *ServerCredentials::GetWrappedServerCredentials() {
70 return wrapped_credentials;
71}
72
73NAN_METHOD(ServerCredentials::New) {
74 NanScope();
75
76 if (args.IsConstructCall()) {
77 if (!args[0]->IsExternal()) {
78 return NanThrowTypeError(
79 "ServerCredentials can only be created with the provide functions");
80 }
81 grpc_server_credentials *creds_value =
82 reinterpret_cast<grpc_server_credentials*>(External::Unwrap(args[0]));
83 ServerCredentials *credentials = new ServerCredentials(creds_value);
84 credentials->Wrap(args.This());
85 NanReturnValue(args.This());
86 } else {
87 const int argc = 1;
88 Local<Value> argv[argc] = { args[0] };
89 NanReturnValue(constructor->NewInstance(argc, argv));
90 }
91}
92
93NAN_METHOD(ServerCredentials::CreateSsl) {
94 NanScope();
95 char *root_certs = NULL;
96 char *private_key;
97 char *cert_chain;
98 int root_certs_length = 0, private_key_length, cert_chain_length;
99 if (Buffer::HasInstance(args[0])) {
100 root_certs = Buffer::Data(args[0]);
101 root_certs_length = Buffer::Length(args[0]);
102 } else if (!(args[0]->IsNull() || args[0]->IsUndefined())) {
103 return NanThrowTypeError(
104 "createSSl's first argument must be a Buffer if provided");
105 }
106 if (!Buffer::HasInstance(args[1])) {
107 return NanThrowTypeError(
108 "createSsl's second argument must be a Buffer");
109 }
110 private_key = Buffer::Data(args[1]);
111 private_key_length = Buffer::Length(args[1]);
112 if (!Buffer::HasInstance(args[2])) {
113 return NanThrowTypeError(
114 "createSsl's third argument must be a Buffer");
115 }
116 cert_chain = Buffer::Data(args[2]);
117 cert_chain_length = Buffer::Length(args[2]);
118 NanReturnValue(WrapStruct(grpc_ssl_server_credentials_create(
119 reinterpret_cast<unsigned char*>(root_certs), root_certs_length,
120 reinterpret_cast<unsigned char*>(private_key), private_key_length,
121 reinterpret_cast<unsigned char*>(cert_chain), cert_chain_length)));
122}
123
124NAN_METHOD(ServerCredentials::CreateFake) {
125 NanScope();
126 NanReturnValue(WrapStruct(
127 grpc_fake_transport_security_server_credentials_create()));
128}
129
130} // namespace node
131} // namespace grpc