62 lines
1.5 KiB
Crystal
62 lines
1.5 KiB
Crystal
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
|