in api/controllers/WebhookController.js [8:69]
github: function(req, res) {
var sig = req.headers['x-hub-signature'],
event = req.headers['x-github-event'],
id = req.headers['x-github-delivery'],
secret = sails.config.webhook.secret,
payload = req.body;
// Ignore non-push events
if (event !== 'push') return res.ok();
// Validate headers
if (!sig) return res.badRequest('No X-Hub-Signature found on request');
if (!event) return res.badRequest('No X-Github-Event found on request');
if (!id) return res.badRequest('No X-Github-Delivery found on request');
// Validate secret signature
if (sig !== signBlob(secret, JSON.stringify(payload))) {
return res.badRequest('X-Hub-Signature does not match blob signature');
}
// Send OK status to webhook
res.ok();
// Ignore empty commits and deleted branches
if (!payload.commits || !payload.commits.length) return;
// Log request payload (only if verbose logging is enabled)
sails.log.verbose('Received GitHub webhook payload: ', payload);
// Set up a new build model
async.parallel({
// Find a matching user
user: function(next) {
var record = { username: payload.sender.login };
User.findOrCreate(record, record, next);
},
// Find a matching site
site: function(next) {
Site.findOne({
owner: payload.repository.full_name.split('/')[0],
repository: payload.repository.full_name.split('/')[1]
}, next);
}
}, function(err, data) {
// Abort if no matching user or site found
if (err) return sails.log.warn('Unable to set up build: ', err);
// Set branch
data.branch = payload.ref.replace('refs/heads/', '');
// Create a new build
Build.create(data, function(err) {
if (err) return sails.log.warn('Unable to create build: ', err);
});
});
}