2016-10-24

Webhooks na github-u

Kako sam se ozbiljno upustio u rad na starom projektu (https://chupcko.org/karel/), reših da ga stavim na github (https://github.com/chupcko/karel), pa ajde i da automatizujem dovlačenje current verzije na WEB sa github-a. Ovoga puta sam pitao nekoga ko zna to bolje od mene, šta da koristim. Miloš mi je samo kratko rekao: "webhooks".

Ideja je jednostavna, github poziva neki zadati URL kada se desi neki dogadjaj (recimo meni zanimljiv push). Namestio za minut jednu shell skriptu i jedan PHP koji je poziva, prijavio URL i sve to lepo radi. Ali, ček bre, svako može da ga pozove, ima li neke zaštite? Ima naravno, pa ajde da je implementiramo. Sve u svemu, evo moje verzije PHP-a:

<?php

  $secret = 'tajna';

  if
  (
    array_key_exists('REQUEST_METHOD', $_SERVER) === false or
    $_SERVER['REQUEST_METHOD'] !== 'POST' or

    array_key_exists('CONTENT_TYPE', $_SERVER) === false or
    $_SERVER['CONTENT_TYPE'] !== 'application/json' or

    array_key_exists('HTTP_USER_AGENT', $_SERVER) === false or
    strpos($_SERVER['HTTP_USER_AGENT'], 'GitHub-Hookshot/') !== 0 or

    array_key_exists('HTTP_X_GITHUB_EVENT', $_SERVER) === false or
    $_SERVER['HTTP_X_GITHUB_EVENT'] !== 'push' or

    array_key_exists('HTTP_X_HUB_SIGNATURE', $_SERVER) === false or
    $_SERVER['HTTP_X_HUB_SIGNATURE'] !== 'sha1='.hash_hmac('sha1', file_get_contents('php://input'), $secret)
  )
    die();

  system('/var/www/github.sh > /dev/null 2>&1 &');

?>
Možda nekome pomogne, ko zna?