Receive webhooks and trigger actions based on them.
Go to file
finga 8099bf773f Arbitrary header fields in commands
Adopt the parser to be able to parse header fields.
2021-03-30 01:16:15 +02:00
src Arbitrary header fields in commands 2021-03-30 01:16:15 +02:00
.gitignore Parse JSON from post request 2021-02-02 11:17:27 +01:00
Cargo.lock Cargo update 2021-03-29 02:27:13 +02:00
Cargo.toml Use signature field for verification 2021-03-28 04:18:35 +02:00
config.yml.example Housekeeping of example config and readme 2021-03-21 23:35:08 +01:00
README.md Arbitrary header fields in commands 2021-03-30 01:16:15 +02:00
webhookey.service Add Rocket config parameters to service file 2021-03-22 10:07:14 +01:00

Webhookey

Webhookey is a webserver listening for requests as for example sent by gitea's webhooks. Further, Webhookey allows you to specifiy rules which are matched against the data received to trigger certain actions.

Build

Install Rust

The Rust toolchain needs to be installed:

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Further, for Rocket we need to have the nightly toolchain installed:

    rustup toolchain install nightly

Build Webhookey

The webhookey project can be built for development:

    cargo b

or for releasing:

    cargo b --release

Install Webhookey

When a Rust toolchain installed you can also install Webhookey directly without cloning it manualy:

    cargo install --git https://git.onders.org/finga/webhookey.git webhookey

or from within the project:

    cargo install webhookey

Run Webhookey

Webhookey can either be run from the project directory with:

    cargo b

or you can copy the produced binary somewhere else from webhookey/target/{debug, release}/webhookey depending on which one you built.

Configuration

Configuration syntax is YAML and has to be done in following order:

Right now there is only the configuration parameter for hooks, here each hook has to be configured, It contains following fields:

  • command: A command to be executed if a filter matches
  • signature: Name of the HTTP header field containing the signature.
  • secrets: List of secrets.
  • filters: List of filters.

Command

To pass data to a command following two different methods can be used.

JSON Pointers

Use JSON pointers (RFC 6901) point to values of a JSON field from the JSON data.

Example: {{ /field/pointed/to }}.

Header

Use values from header fields sent with the HTTP request.

Example: {{ header X-Gitea-Event }}.

Filter

Each filter must have following fields:

  • pointer: pointer to the JSON field according to RFC 6901
  • regex: regular expression which has to match the field pointed to by the pointer

Configuration paths

Following locations are checked for a configuration file:

  • /etc/webhookey/config.yml
  • <config_dir>/webhookey/config.yml
  • ./config.yml

Whereas <config_dir> depends on the platform:

  • Linux: $XDG_CONFIG_HOME or $HOME/.config
  • macOS: $HOME/Library/Application Support
  • Windows: {FOLDERID_RoamingAppData}

TODOs

Use clap to parse command line arguments

Implement the functionality to reply to certain webhooks

Configure rocket via config.yml

Security

https support

basically supported, but related to "Configure rocket via config.yml".

Authentication features

Secure cookies?

Use proptest or quickcheck for tests of parsers