UNPKG

webhooks

Version:

Easily create webhooks

76 lines (66 loc) 1.98 kB
'use strict' var express = require('express') var app = express() app.use(express.errorHandler()) app.use(express.logger()) var crypto = require('crypto') var assert = require('assert') var domain = require('domain') var fs = require('fs') var child_process = require('child_process') app.post('/:hash', function(req, res, next) { if (!req.params.hash) { console.warn('missing hash', req.params.hash) return res.send(404) } var decryptionKey = process.env.WH_SECRET || 'keyboard cat' try { var dir = decrypt(req.params.hash, decryptionKey) } catch (err) { if (err+''.match(/DecipherFinal/)) { console.warn('could not decipher', req.params.hash) return res.send(404) } else { return next(err) } } fs.exists(dir, function(exists) { if (!exists) { console.warn('directory does not exist!', dir) return res.send(404) } console.info(dir) child_process.exec(module.exports.command, { cwd: dir }, function(err) { if (err) return next(err) res.send(200) }) }) }) var getId = function() { os.hostname() + process.cwd() } module.exports = app var ALGORITHM = 'cast5-cbc' var FORMAT = 'base64' var encrypt = module.exports.encrypt = function(id, password) { assert.ok(id) assert.ok(password) var projectCipher = crypto.createCipher(ALGORITHM, password) var final = projectCipher.update(id, 'utf8', FORMAT) final += projectCipher.final(FORMAT) return final } var decrypt = module.exports.decrypt = function(encrypted, password) { assert.ok(encrypted) assert.ok(password) var projectDecipher = crypto.createDecipher(ALGORITHM, password) var final = projectDecipher.update(encrypted, FORMAT, 'utf8') final += projectDecipher.final('utf8') return final } module.exports.hashCwd = function(cwd) { return encodeURIComponent(encrypt(cwd || process.cwd(), process.env.WH_SECRET || 'keyboard cat')) } module.exports.command = '/usr/bin/env sh ./webhook'