blob: 226fd0a1740d8fdc48f1199f61f25160f4931c77 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "Authentication.h"
static const std::string PARAM_TLS_CERT = "certificatePath";
static const std::string PARAM_TLS_KEY = "privateKeyPath";
static const std::string PARAM_TOKEN = "token";
Napi::FunctionReference Authentication::constructor;
Napi::Object Authentication::Init(Napi::Env env, Napi::Object exports) {
Napi::HandleScope scope(env);
Napi::Function func = DefineClass(env, "Authentication", {});
constructor = Napi::Persistent(func);
constructor.SuppressDestruct();
exports.Set("Authentication", func);
return exports;
}
Authentication::Authentication(const Napi::CallbackInfo &info)
: Napi::ObjectWrap<Authentication>(info), cAuthentication(nullptr) {
Napi::Env env = info.Env();
Napi::HandleScope scope(env);
if (info.Length() < 1 || !info[0].IsString() || info[0].ToString().Utf8Value().empty()) {
Napi::Error::New(env, "Authentication method is not specified").ThrowAsJavaScriptException();
return;
}
std::string authMethod = info[0].ToString().Utf8Value();
if (authMethod == "tls" || authMethod == "token") {
if (info.Length() < 2 || !info[1].IsObject()) {
Napi::Error::New(env, "Authentication parameter must be a object").ThrowAsJavaScriptException();
return;
}
Napi::Object obj = info[1].ToObject();
if (authMethod == "tls") {
if (!obj.Has(PARAM_TLS_CERT) || !obj.Get(PARAM_TLS_CERT).IsString() || !obj.Has(PARAM_TLS_KEY) ||
!obj.Get(PARAM_TLS_KEY).IsString()) {
Napi::Error::New(env, "Missing required parameter").ThrowAsJavaScriptException();
return;
}
this->cAuthentication =
pulsar_authentication_tls_create(obj.Get(PARAM_TLS_CERT).ToString().Utf8Value().c_str(),
obj.Get(PARAM_TLS_KEY).ToString().Utf8Value().c_str());
} else if (authMethod == "token") {
if (!obj.Has(PARAM_TOKEN) || !obj.Get(PARAM_TOKEN).IsString()) {
Napi::Error::New(env, "Missing required parameter").ThrowAsJavaScriptException();
return;
}
this->cAuthentication =
pulsar_authentication_token_create(obj.Get(PARAM_TOKEN).ToString().Utf8Value().c_str());
}
} else if (authMethod == "athenz") {
if (info.Length() < 2 || !info[1].IsString()) {
Napi::Error::New(env, "Authentication parameter must be a JSON string").ThrowAsJavaScriptException();
return;
}
this->cAuthentication = pulsar_authentication_athenz_create(info[1].ToString().Utf8Value().c_str());
} else {
Napi::Error::New(env, "Unsupported authentication method").ThrowAsJavaScriptException();
return;
}
}
Authentication::~Authentication() {
if (this->cAuthentication != nullptr) {
pulsar_authentication_free(this->cAuthentication);
}
}
pulsar_authentication_t *Authentication::GetCAuthentication() { return this->cAuthentication; }