74 lines
2.1 KiB
Rust
74 lines
2.1 KiB
Rust
|
//
|
||
|
|
||
|
use git::ForgeLike;
|
||
|
use git_next_config as config;
|
||
|
use git_next_git as git;
|
||
|
|
||
|
use std::collections::HashMap;
|
||
|
|
||
|
type TestResult = Result<(), Box<dyn std::error::Error>>;
|
||
|
|
||
|
#[test]
|
||
|
fn accepts_valid_webhook_signature() -> TestResult {
|
||
|
//given
|
||
|
// we registered a webhook with this secret:
|
||
|
let webhook_auth = config::WebhookAuth::new("01HZ598CS1K9E0C193ND175XHJ")?;
|
||
|
// then recorded the following test message from github:
|
||
|
let headers = HashMap::from([(
|
||
|
"x-hub-signature-256".to_string(),
|
||
|
"sha256=6c801b0730b1ce06bf38f901de40206d3b0e93ef7b9bf09a5cf28ad9c4221bab".to_string(),
|
||
|
)]);
|
||
|
let payload = config::webhook::message::Body::new(include_str!("payload.json").to_string());
|
||
|
// this reproduces that message:
|
||
|
let message = message(headers, payload);
|
||
|
|
||
|
//when
|
||
|
// now, we attempt to recreate the signature in the header given the same message:
|
||
|
let result = forge().is_message_authorised(&message, &webhook_auth);
|
||
|
|
||
|
//then
|
||
|
// if we succeed: then result will be true:
|
||
|
assert!(result);
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
fn message(
|
||
|
headers: HashMap<String, String>,
|
||
|
payload: config::webhook::message::Body,
|
||
|
) -> config::WebhookMessage {
|
||
|
config::WebhookMessage::new(
|
||
|
config::ForgeAlias::new("".to_string()),
|
||
|
config::RepoAlias::new(""),
|
||
|
headers,
|
||
|
payload,
|
||
|
)
|
||
|
}
|
||
|
|
||
|
fn forge() -> crate::Github {
|
||
|
crate::Github::new(
|
||
|
git::RepoDetails::new(
|
||
|
git::Generation::new(),
|
||
|
&config::RepoAlias::new(""),
|
||
|
&config::ServerRepoConfig::new(
|
||
|
"a".to_string(),
|
||
|
"b".to_string(),
|
||
|
None,
|
||
|
None,
|
||
|
None,
|
||
|
None,
|
||
|
),
|
||
|
&config::ForgeAlias::new("c".to_string()),
|
||
|
&config::ForgeConfig::new(
|
||
|
config::ForgeType::GitHub,
|
||
|
"d".to_string(),
|
||
|
"e".to_string(),
|
||
|
"f".to_string(),
|
||
|
std::collections::BTreeMap::default(),
|
||
|
),
|
||
|
config::GitDir::default(),
|
||
|
),
|
||
|
kxio::network::Network::new_mock(),
|
||
|
)
|
||
|
}
|