UNPKG

vibetunnel

Version:

Terminal sharing server with web interface - supports macOS, Linux, and headless environments

140 lines 15.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.authenticate = void 0; const fs = __importStar(require("fs")); const path = __importStar(require("path")); // Helper function to load native module using dlopen function loadNativeModule(modulePath) { const module = { exports: {} }; process.dlopen(module, modulePath); return module.exports; } // Try to load authenticate_pam.node let authenticate; // Check if we're in SEA mode by looking for the native module next to the executable const execDir = path.dirname(process.execPath); const seaPamPath = path.join(execDir, 'authenticate_pam.node'); const seaNativePamPath = path.join(execDir, 'native', 'authenticate_pam.node'); if (fs.existsSync(seaPamPath) || fs.existsSync(seaNativePamPath)) { // We're in SEA mode, use dlopen const possiblePaths = [ seaPamPath, seaNativePamPath, // Try different parent levels for native directory ...[1, 2, 3].map((levels) => path.join(__dirname, ...Array(levels).fill('..'), 'native', 'authenticate_pam.node')), ]; let loaded = false; for (const modulePath of possiblePaths) { if (fs.existsSync(modulePath)) { try { const nativeModule = loadNativeModule(modulePath); if (nativeModule.authenticate) { exports.authenticate = authenticate = nativeModule.authenticate; } else { throw new Error('Module does not export authenticate function'); } loaded = true; break; } catch (_loadError) { // Continue to next path } } } if (!loaded) { console.warn('Warning: authenticate-pam native module not found. PAM authentication will not work.'); // Provide a stub implementation exports.authenticate = authenticate = (_username, _password, callback) => { callback(new Error('PAM authentication not available')); }; } } else { // Development mode - use regular require let loaded = false; // First, try the normal require path try { const pamModule = require('authenticate-pam'); // Handle both direct export and default export cases exports.authenticate = authenticate = pamModule.authenticate || pamModule.default || pamModule; loaded = true; } catch (_error) { // Module not found via normal require } // If normal require failed, try the optional-modules location if (!loaded) { // Try different parent directory levels for various contexts: // 1 level up: bundled context (dist-npm/lib/) // 3 levels up: development context (src/server/services/) // 2 levels up: alternative bundled location const parentLevels = [1, 3, 2]; const modulePath = [ 'optional-modules', 'authenticate-pam', 'build', 'Release', 'authenticate_pam.node', ]; for (const levels of parentLevels) { const pathSegments = [__dirname, ...Array(levels).fill('..'), ...modulePath]; const optionalModulePath = path.join(...pathSegments); if (fs.existsSync(optionalModulePath)) { try { const nativeModule = loadNativeModule(optionalModulePath); if (nativeModule.authenticate) { exports.authenticate = authenticate = nativeModule.authenticate; loaded = true; console.log('Loaded authenticate-pam from optional-modules location:', optionalModulePath); break; } } catch (_loadError) { // Continue to next path } } } } if (!loaded) { console.warn('Warning: authenticate-pam native module not found. PAM authentication will not work.'); // Provide a stub implementation exports.authenticate = authenticate = (_username, _password, callback) => { callback(new Error('PAM authentication not available')); }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRlLXBhbS1sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL2F1dGhlbnRpY2F0ZS1wYW0tbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFRN0IscURBQXFEO0FBQ3JELFNBQVMsZ0JBQWdCLENBQUMsVUFBa0I7SUFDMUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDL0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbkMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxvQ0FBb0M7QUFDcEMsSUFBSSxZQUFrQyxDQUFDO0FBRXZDLHFGQUFxRjtBQUNyRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0FBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLHVCQUF1QixDQUFDLENBQUM7QUFFL0UsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO0lBQ2pFLGdDQUFnQztJQUNoQyxNQUFNLGFBQWEsR0FBRztRQUNwQixVQUFVO1FBQ1YsZ0JBQWdCO1FBQ2hCLG1EQUFtRDtRQUNuRCxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUs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ekMsTUFBTSxHQUFHLElBQUksQ0FBQzt3QkFDZCxPQUFPLENBQUMsR0FBRyxDQUNULHlEQUF5RCxFQUN6RCxrQkFBa0IsQ0FDbkIsQ0FBQzt3QkFDRixNQUFNO29CQUNSLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO29CQUNwQix3QkFBd0I7Z0JBQzFCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixPQUFPLENBQUMsSUFBSSxDQUNWLHNGQUFzRixDQUN2RixDQUFDO1FBQ0YsZ0NBQWdDO1FBQ2hDLHVCQUFBLFlBQVksR0FBRyxDQUNiLFNBQWlCLEVBQ2pCLFNBQWlCLEVBQ2pCLFFBQThELEVBQzlELEVBQUU7WUFDRixRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxudHlwZSBBdXRoZW50aWNhdGVGdW5jdGlvbiA9IChcbiAgdXNlcm5hbWU6IHN0cmluZyxcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgY2FsbGJhY2s6IChlcnI6IEVycm9yIHwgbnVsbCwgYXV0aGVudGljYXRlZD86IGJvb2xlYW4pID0+IHZvaWRcbikgPT4gdm9pZDtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGxvYWQgbmF0aXZlIG1vZHVsZSB1c2luZyBkbG9wZW5cbmZ1bmN0aW9uIGxvYWROYXRpdmVNb2R1bGUobW9kdWxlUGF0aDogc3RyaW5nKTogeyBhdXRoZW50aWNhdGU/OiBBdXRoZW50aWNhdGVGdW5jdGlvbiB9IHtcbiAgY29uc3QgbW9kdWxlID0geyBleHBvcnRzOiB7fSB9O1xuICBwcm9jZXNzLmRsb3Blbihtb2R1bGUsIG1vZHVsZVBhdGgpO1xuICByZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIFRyeSB0byBsb2FkIGF1dGhlbnRpY2F0ZV9wYW0ubm9kZVxubGV0IGF1dGhlbnRpY2F0ZTogQXV0aGVudGljYXRlRnVuY3Rpb247XG5cbi8vIENoZWNrIGlmIHdlJ3JlIGluIFNFQSBtb2RlIGJ5IGxvb2tpbmcgZm9yIHRoZSBuYXRpdmUgbW9kdWxlIG5leHQgdG8gdGhlIGV4ZWN1dGFibGVcbmNvbnN0IGV4ZWNEaXIgPSBwYXRoLmRpcm5hbWUocHJvY2Vzcy5leGVjUGF0aCk7XG5jb25zdCBzZWFQYW1QYXRoID0gcGF0aC5qb2luKGV4ZWNEaXIsICdhdXRoZW50aWNhdGVfcGFtLm5vZGUnKTtcbmNvbnN0IHNlYU5hdGl2ZVBhbVBhdGggPSBwYXRoLmpvaW4oZXhlY0RpciwgJ25hdGl2ZScsICdhdXRoZW50aWNhdGVfcGFtLm5vZGUnKTtcblxuaWYgKGZzLmV4aXN0c1N5bmMoc2VhUGFtUGF0aCkgfHwgZnMuZXhpc3RzU3luYyhzZWFOYXRpdmVQYW1QYXRoKSkge1xuICAvLyBXZSdyZSBpbiBTRUEgbW9kZSwgdXNlIGRsb3BlblxuICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgIHNlYVBhbVBhdGgsXG4gICAgc2VhTmF0aXZlUGFtUGF0aCxcbiAgICAvLyBUcnkgZGlmZmVyZW50IHBhcmVudCBsZXZlbHMgZm9yIG5hdGl2ZSBkaXJlY3RvcnlcbiAgICAuLi5bMSwgMiwgM10ubWFwKChsZXZlbHMpID0+XG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAuLi5BcnJheShsZXZlbHMpLmZpbGwoJy4uJyksICduYXRpdmUnLCAnYXV0aGVudGljYXRlX3BhbS5ub2RlJylcbiAgICApLFxuICBdO1xuXG4gIGxldCBsb2FkZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBtb2R1bGVQYXRoIG9mIHBvc3NpYmxlUGF0aHMpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhtb2R1bGVQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbmF0aXZlTW9kdWxlID0gbG9hZE5hdGl2ZU1vZHVsZShtb2R1bGVQYXRoKTtcbiAgICAgICAgaWYgKG5hdGl2ZU1vZHVsZS5hdXRoZW50aWNhdGUpIHtcbiAgICAgICAgICBhdXRoZW50aWNhdGUgPSBuYXRpdmVNb2R1bGUuYXV0aGVudGljYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlIGRvZXMgbm90IGV4cG9ydCBhdXRoZW50aWNhdGUgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBsb2FkZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2ggKF9sb2FkRXJyb3IpIHtcbiAgICAgICAgLy8gQ29udGludWUgdG8gbmV4dCBwYXRoXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFsb2FkZWQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnV2FybmluZzogYXV0aGVudGljYXRlLXBhbSBuYXRpdmUgbW9kdWxlIG5vdCBmb3VuZC4gUEFNIGF1dGhlbnRpY2F0aW9uIHdpbGwgbm90IHdvcmsuJ1xuICAgICk7XG4gICAgLy8gUHJvdmlkZSBhIHN0dWIgaW1wbGVtZW50YXRpb25cbiAgICBhdXRoZW50aWNhdGUgPSAoXG4gICAgICBfdXNlcm5hbWU6IHN0cmluZyxcbiAgICAgIF9wYXNzd29yZDogc3RyaW5nLFxuICAgICAgY2FsbGJhY2s6IChlcnI6IEVycm9yIHwgbnVsbCwgYXV0aGVudGljYXRlZD86IGJvb2xlYW4pID0+IHZvaWRcbiAgICApID0+IHtcbiAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignUEFNIGF1dGhlbnRpY2F0aW9uIG5vdCBhdmFpbGFibGUnKSk7XG4gICAgfTtcbiAgfVxufSBlbHNlIHtcbiAgLy8gRGV2ZWxvcG1lbnQgbW9kZSAtIHVzZSByZWd1bGFyIHJlcXVpcmVcbiAgbGV0IGxvYWRlZCA9IGZhbHNlO1xuXG4gIC8vIEZpcnN0LCB0cnkgdGhlIG5vcm1hbCByZXF1aXJlIHBhdGhcbiAgdHJ5IHtcbiAgICBjb25zdCBwYW1Nb2R1bGUgPSByZXF1aXJlKCdhdXRoZW50aWNhdGUtcGFtJyk7XG4gICAgLy8gSGFuZGxlIGJvdGggZGlyZWN0IGV4cG9ydCBhbmQgZGVmYXVsdCBleHBvcnQgY2FzZXNcbiAgICBhdXRoZW50aWNhdGUgPSBwYW1Nb2R1bGUuYXV0aGVudGljYXRlIHx8IHBhbU1vZHVsZS5kZWZhdWx0IHx8IHBhbU1vZHVsZTtcbiAgICBsb2FkZWQgPSB0cnVlO1xuICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAvLyBNb2R1bGUgbm90IGZvdW5kIHZpYSBub3JtYWwgcmVxdWlyZVxuICB9XG5cbiAgLy8gSWYgbm9ybWFsIHJlcXVpcmUgZmFpbGVkLCB0cnkgdGhlIG9wdGlvbmFsLW1vZHVsZXMgbG9jYXRpb25cbiAgaWYgKCFsb2FkZWQpIHtcbiAgICAvLyBUcnkgZGlmZmVyZW50IHBhcmVudCBkaXJlY3RvcnkgbGV2ZWxzIGZvciB2YXJpb3VzIGNvbnRleHRzOlxuICAgIC8vIDEgbGV2ZWwgdXA6IGJ1bmRsZWQgY29udGV4dCAoZGlzdC1ucG0vbGliLylcbiAgICAvLyAzIGxldmVscyB1cDogZGV2ZWxvcG1lbnQgY29udGV4dCAoc3JjL3NlcnZlci9zZXJ2aWNlcy8pXG4gICAgLy8gMiBsZXZlbHMgdXA6IGFsdGVybmF0aXZlIGJ1bmRsZWQgbG9jYXRpb25cbiAgICBjb25zdCBwYXJlbnRMZXZlbHMgPSBbMSwgMywgMl07XG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IFtcbiAgICAgICdvcHRpb25hbC1tb2R1bGVzJyxcbiAgICAgICdhdXRoZW50aWNhdGUtcGFtJyxcbiAgICAgICdidWlsZCcsXG4gICAgICAnUmVsZWFzZScsXG4gICAgICAnYXV0aGVudGljYXRlX3BhbS5ub2RlJyxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBsZXZlbHMgb2YgcGFyZW50TGV2ZWxzKSB7XG4gICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBbX19kaXJuYW1lLCAuLi5BcnJheShsZXZlbHMpLmZpbGwoJy4uJyksIC4uLm1vZHVsZVBhdGhdO1xuICAgICAgY29uc3Qgb3B0aW9uYWxNb2R1bGVQYXRoID0gcGF0aC5qb2luKC4uLnBhdGhTZWdtZW50cyk7XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbmFsTW9kdWxlUGF0aCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuYXRpdmVNb2R1bGUgPSBsb2FkTmF0aXZlTW9kdWxlKG9wdGlvbmFsTW9kdWxlUGF0aCk7XG4gICAgICAgICAgaWYgKG5hdGl2ZU1vZHVsZS5hdXRoZW50aWNhdGUpIHtcbiAgICAgICAgICAgIGF1dGhlbnRpY2F0ZSA9IG5hdGl2ZU1vZHVsZS5hdXRoZW50aWNhdGU7XG4gICAgICAgICAgICBsb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICdMb2FkZWQgYXV0aGVudGljYXRlLXBhbSBmcm9tIG9wdGlvbmFsLW1vZHVsZXMgbG9jYXRpb246JyxcbiAgICAgICAgICAgICAgb3B0aW9uYWxNb2R1bGVQYXRoXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChfbG9hZEVycm9yKSB7XG4gICAgICAgICAgLy8gQ29udGludWUgdG8gbmV4dCBwYXRoXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWxvYWRlZCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdXYXJuaW5nOiBhdXRoZW50aWNhdGUtcGFtIG5hdGl2ZSBtb2R1bGUgbm90IGZvdW5kLiBQQU0gYXV0aGVudGljYXRpb24gd2lsbCBub3Qgd29yay4nXG4gICAgKTtcbiAgICAvLyBQcm92aWRlIGEgc3R1YiBpbXBsZW1lbnRhdGlvblxuICAgIGF1dGhlbnRpY2F0ZSA9IChcbiAgICAgIF91c2VybmFtZTogc3RyaW5nLFxuICAgICAgX3Bhc3N3b3JkOiBzdHJpbmcsXG4gICAgICBjYWxsYmFjazogKGVycjogRXJyb3IgfCBudWxsLCBhdXRoZW50aWNhdGVkPzogYm9vbGVhbikgPT4gdm9pZFxuICAgICkgPT4ge1xuICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCdQQU0gYXV0aGVudGljYXRpb24gbm90IGF2YWlsYWJsZScpKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCB7IGF1dGhlbnRpY2F0ZSB9O1xuIl19