require "json" require "openssl/hmac" require "openssl/sha1" require "./gitea.cr" require "./github.cr" require "./gitlab.cr" class Payload include JSON::Serializable property kind : String property project : String property content : String property secret : String = "" def initialize(req : HTTP::Request) @content = req.body.not_nil!.gets_to_end.to_s agent = req.headers.fetch("User-Agent", "None") if agent == "GiteaServer" && req.headers.has_key?("X-Gitea-Event") @kind = "gitea" content = Gitea::Payload.from_json @content @project = content.repository.full_name @secret = content.secret elsif agent.starts_with?("GitHub-Hookshot/") && req.headers.has_key?("X-Github-Event") @kind = "github" content = Github::Payload.from_json @content @project = content.repository.full_name hash = req.headers.fetch("X-Hub-Signature", "None") if hash != "None" @secret = hash.to_s end elsif req.headers.has_key?("X-Gitlab-Event") @kind = "gitlab" content = Gitlab::Payload.from_json @content @project = content.project.path_with_namespace token = req.headers.fetch("X-Gitlab-Token", "None") if token != "None" @secret = token.to_s end else @kind = "undefined" @project = "undefined" end end def check?(token) pp token pp @secret if @kind == "github" data = JSON.parse(@content).to_json given_secret = "sha1=" + OpenSSL::HMAC.hexdigest(:sha1, @secret, data) end token == @secret end end