#![allow(dead_code, reason = "used only by feature-gated integration tests")]
use std::fs;
use std::path::Path;
use std::time::{SystemTime, UNIX_EPOCH};
use base64::Engine;
use base64::engine::general_purpose::URL_SAFE_NO_PAD;
use ed25519_dalek::{Signer, SigningKey};
use serde_json::json;
pub const TEST_SIDECAR_SEED: [u8; 32] = [0xAA; 32];
pub const TEST_LICENSE_SEED: [u8; 32] = [0xBB; 32];
#[must_use]
pub fn sidecar_signing_key() -> SigningKey {
SigningKey::from_bytes(&TEST_SIDECAR_SEED)
}
#[must_use]
pub fn license_signing_key() -> SigningKey {
SigningKey::from_bytes(&TEST_LICENSE_SEED)
}
pub fn sign_sidecar_binary(binary_path: &Path) {
let bytes = fs::read(binary_path).expect("read sidecar binary to sign");
let signature = sidecar_signing_key().sign(&bytes);
let sig_path = {
let mut path = binary_path.as_os_str().to_os_string();
path.push(".sig");
std::path::PathBuf::from(path)
};
fs::write(&sig_path, signature.to_bytes()).expect("write .sig file");
}
#[must_use]
pub fn mint_runtime_coverage_jwt() -> String {
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("system clock before UNIX epoch")
.as_secs() as i64;
let exp = now + 30 * 24 * 60 * 60;
let header = json!({ "alg": "EdDSA", "typ": "JWT" });
let payload = json!({
"iss": "https://test.fallow.cloud",
"sub": "test-org",
"tid": "test-tenant",
"seats": 1,
"tier": "team",
"features": ["runtime_coverage"],
"iat": now,
"exp": exp,
"jti": "test-jwt-runtime-coverage",
});
encode_jwt(&header, &payload)
}
#[must_use]
pub fn mint_expired_runtime_coverage_jwt() -> String {
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("system clock before UNIX epoch")
.as_secs() as i64;
let iat = now - 180 * 24 * 60 * 60;
let exp = now - 120 * 24 * 60 * 60;
let header = json!({ "alg": "EdDSA", "typ": "JWT" });
let payload = json!({
"iss": "https://test.fallow.cloud",
"sub": "test-org",
"tid": "test-tenant",
"seats": 1,
"tier": "team",
"features": ["runtime_coverage"],
"iat": iat,
"exp": exp,
"jti": "test-jwt-expired",
});
encode_jwt(&header, &payload)
}
fn encode_jwt(header: &serde_json::Value, payload: &serde_json::Value) -> String {
let header_b64 = URL_SAFE_NO_PAD.encode(serde_json::to_vec(header).expect("encode header"));
let payload_b64 = URL_SAFE_NO_PAD.encode(serde_json::to_vec(payload).expect("encode payload"));
let signing_input = format!("{header_b64}.{payload_b64}");
let signature = license_signing_key().sign(signing_input.as_bytes());
let signature_b64 = URL_SAFE_NO_PAD.encode(signature.to_bytes());
format!("{signing_input}.{signature_b64}")
}