UNPKG

@hackolade/krb5

Version:

Re-published version to have all prebuilds defined as npm packages without platform constraints for cross building an Electron application - Kerberos library bindings for Node.js

262 lines (252 loc) 7.53 kB
// Generated by CoffeeScript 2.4.1 var cleanup, fs, handle_error, k, kdestroy, kinit, spnego; var os = require('os'); k = require(/* webpackIgnore: true */ /* @vite-ignore */ `@hackolade/krb5-${os.platform()}-${os.arch()}`); fs = require('fs'); cleanup = function(ctx, princ, ccache) { if (princ) { k.krb5_free_principal_sync(ctx, princ); } if (ccache) { return k.krb5_cc_close(ctx, ccache, function(err) { if (ctx) { return k.krb5_free_context_sync(ctx); } }); } else { if (ctx) { return k.krb5_free_context_sync(ctx); } } }; handle_error = function(callback, err, ctx, princ, ccache) { if (!err) { return err; } err = k.krb5_get_error_message_sync(ctx, err); cleanup(ctx, princ, ccache); return callback(Error(err)); }; kinit = function(options, callback) { var do_ccache, do_creds, do_init, do_principal, do_realm, split; if (!options.principal) { return callback(Error('Please specify principal for kinit')); } if (!(options.password || options.keytab)) { return callback(Error('Please specify password or keytab for kinit')); } if (options.principal.indexOf('@') !== -1) { split = options.principal.split('@'); options.principal = split[0]; options.realm = split[1]; } do_init = function() { return k.krb5_init_context(function(err, ctx) { if (err) { return handle_error(callback, err, ctx); } return do_realm(ctx); }); }; do_realm = function(ctx) { if (!options.realm) { return k.krb5_get_default_realm(ctx, function(err, realm) { if (err) { return handle_error(callback, err, ctx); } options.realm = realm; return do_principal(ctx); }); } else { return do_principal(ctx); } }; do_principal = function(ctx) { return k.krb5_build_principal(ctx, options.realm.length, options.realm, options.principal, function(err, princ) { if (err) { return handle_error(callback, err, ctx); } return do_ccache(ctx, princ); }); }; do_ccache = function(ctx, princ) { if (options.ccname) { if (options.ccname.indexOf(':KEYRING') !== -1) { cleanup(ctx, princ); return callback(Error('KEYRING method not supported.')); } return k.krb5_cc_resolve(ctx, options.ccname, function(err, ccache) { if (err) { return handle_error(callback, err, ctx, princ); } return do_creds(ctx, princ, ccache); }); } else { return k.krb5_cc_default(ctx, function(err, ccache) { if (err) { return handle_error(callback, err, ctx, princ); } return do_creds(ctx, princ, ccache); }); } }; do_creds = function(ctx, princ, ccache) { var ccname, get_creds_keytab, get_creds_password, store_creds; ccname = k.krb5_cc_get_name_sync(ctx, ccache); fs.exists(ccname, function(exists) { if (!exists) { return k.krb5_cc_initialize(ctx, ccache, princ, function(err) { if (err) { return handle_error(callback, err, ctx, princ); } if (options.password) { return get_creds_password(); } else { return get_creds_keytab(); } }); } else { if (options.password) { return get_creds_password(); } else { return get_creds_keytab(); } } }); get_creds_password = function() { return k.krb5_get_init_creds_password(ctx, princ, options.password, function(err, creds) { if (err) { return handle_error(callback, err, ctx, princ, ccache); } return store_creds(creds); }); }; get_creds_keytab = function() { return k.krb5_kt_resolve(ctx, options.keytab, function(err, kt) { if (err) { return handle_error(callback, err, ctx, princ, ccache); } return k.krb5_get_init_creds_keytab(ctx, princ, kt, 0, function(err, creds) { if (err) { return handle_error(callback, err, ctx, princ, ccache); } return store_creds(creds); }); }); }; return store_creds = function(creds) { return k.krb5_cc_store_cred(ctx, ccache, creds, function(err) { if (err) { return handle_error(callback, err, ctx, princ, ccache); } cleanup(ctx, princ, ccache); return callback(void 0, ccname); }); }; }; return do_init(); }; kdestroy = function(options, callback) { var do_ccache, do_destroy; k.krb5_init_context(function(err, ctx) { if (err) { return handle_error(callback, err, ctx); } return do_ccache(ctx); }); do_ccache = function(ctx) { if (options.ccname) { return k.krb5_cc_resolve(ctx, options.ccname, function(err, ccache) { if (err) { return handle_error(callback, err, ctx, null, ccache); } return do_destroy(ctx, ccache); }); } else { return k.krb5_cc_default(ctx, function(err, ccache) { if (err) { return handle_error(callback, err, ctx, null, ccache); } return do_destroy(ctx, ccache); }); } }; return do_destroy = function(ctx, ccache) { return k.krb5_cc_destroy(ctx, ccache, function(err) { if (err) { return handle_error(callback, err, ctx); } return callback(void 0); }); }; }; spnego = function(options, callback) { var input_name_type, service; if (options.ccname == null) { options.ccname = ""; } if (options.service_principal) { input_name_type = 'GSS_C_NT_USER_NAME'; service = options.service_principal; } else if (options.service_fqdn || options.hostbased_service) { input_name_type = 'GSS_C_NT_HOSTBASED_SERVICE'; service = options.service_fqdn || options.hostbased_service; if (!/.*[@]/.test(service)) { service = `HTTP@${service}`; } } else { return callback(Error('Missing option "service_principal" or "hostbased_service"')); } return k.generate_spnego_token(service, input_name_type, options.ccname, function(err, token) { return callback((err === "" ? void 0 : Error(err)), token != null ? token.toString('base64') : void 0); }); }; module.exports = { kinit: function(options, callback) { if (typeof callback === 'function') { return kinit(options, callback); } return new Promise(function(resolve, reject) { return kinit(options, function(err, ccname) { if (err) { reject(err); } return resolve(ccname); }); }); }, spnego: function(options, callback) { if (typeof callback === 'function') { return spnego(options, callback); } return new Promise(function(resolve, reject) { return spnego(options, function(err, token) { if (err) { reject(err); } return resolve(token); }); }); }, kdestroy: function(options, callback) { if (options == null) { options = {}; } if (typeof options === 'function') { callback = options; return kdestroy({}, callback); } else { if (typeof callback === 'function') { return kdestroy(options, callback); } return new Promise(function(resolve, reject) { return kdestroy(options, function(err) { if (err) { reject(err); } return resolve(); }); }); } } };