@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
JavaScript
// 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 */ `/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();
});
});
}
}
};