From 156d314f95e54a661289c53239e6338a9a550ab2 Mon Sep 17 00:00:00 2001 From: "David E. Wheeler" Date: Tue, 8 Oct 2024 18:23:30 +0200 Subject: [PATCH] Remove previous JWS validation and structs With the switch from the old `release` field to the new `certs` and `release` fields as defined in [RFC 5] and implemented in 0773ad7 and acb0d22, the previously-defined JSON schemas and data structure are no longer used. So remove them and their tests. [RFC 5]: https://github.com/pgxn/rfcs/pull/5 --- schema/v2/pgxn-jws.schema.json | 114 ----- src/release/mod.rs | 26 - src/release/tests.rs | 36 -- src/tests/v2.rs | 877 --------------------------------- 4 files changed, 1053 deletions(-) delete mode 100644 schema/v2/pgxn-jws.schema.json diff --git a/schema/v2/pgxn-jws.schema.json b/schema/v2/pgxn-jws.schema.json deleted file mode 100644 index 3214006..0000000 --- a/schema/v2/pgxn-jws.schema.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://pgxn.org/meta/v2/pgxn-jws.schema.json", - "title": "PGXN Release Metadata", - "description": "JSON Web Signature release metadata populated by PGXN. Structure defined by [JWS-JS](https://datatracker.ietf.org/doc/html/draft-jones-json-web-signature-json-serialization-01). Subject to change pending expert review and approval of the [JWS-signing RFC](https://github.com/pgxn/rfcs/pull/5).", - "type": "object", - "properties": { - "headers": { - "type": "array", - "description": "Encoded JWS Header values", - "minItems": 1, - "items": { - "type": "string", - "pattern": "^eyJ[A-Za-z0-9-_]{12,}$", - "$comment": "URL-encoded base64; must start with `{\"` (`eyJ`) and be at least 15 characters long" - } - }, - "signatures": { - "type": "array", - "description": "Encoded JWS Signature values", - "minItems": 1, - "items": { - "type": "string", - "pattern": "^[A-Za-z0-9-_]{32,}$", - "$comment": "URL-encoded base64; must be at least 32 characters long" - } - }, - "payload": { - "type": "object", - "description": "Release metadata populated by PGXN.", - "properties": { - "user": { - "$ref": "term.schema.json", - "description": "The PGXN username for the user who released the distribution to PGXN.", - "examples": ["theory", "keithf4"] - }, - "date": { - "type": "string", - "format": "date-time", - "description": "The release timestamp.", - "examples": ["2024-09-12T19:56:49Z"] - }, - "uri": { - "type": "string", - "format": "uri-reference", - "pattern": "^dist/", - "description": "Path to the release file relative to a PGXN base URL.", - "examples": [ - "dist/pair/0.1.7/pair-0.1.7.zip", - "dist/plv8/3.2.3/plv8-3.2.3.zip" - ] - }, - "digests": { - "$ref": "digests.schema.json" - } - }, - "required": ["user", "date", "uri", "digests"], - "additionalProperties": false, - "examples": [ - { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - { - "user": "theory", - "date": "2024-09-13T17:32:55Z", - "uri": "dist/pair/0.1.7/pair-0.1.7.zip", - "digests": { - "sha256": "257b71aa57a28d62ddbb301333b3521ea3dc56f17551fa0e4516b03998abb089", - "sha512": "b353b5a82b3b54e95f4a2859e7a2bd0648abcb35a7c3612b126c2c75438fc2f8e8ee1f19e61f30fa54d7bb64bcf217ed1264722b497bcb613f82d78751515b67" - } - } - ] - } - }, - "required": ["headers", "signatures", "payload"], - "additionalProperties": false, - "examples": [ - { - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - } - }, - { - "headers": ["eyJhbGciOiJSUzI1NiJ9", "eyJhbGciOiJFUzI1NiJ9"], - "signatures": [ - "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw", - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": { - "user": "theory", - "date": "2024-09-13T17:32:55Z", - "uri": "dist/pair/0.1.7/pair-0.1.7.zip", - "digests": { - "sha256": "257b71aa57a28d62ddbb301333b3521ea3dc56f17551fa0e4516b03998abb089", - "sha512": "b353b5a82b3b54e95f4a2859e7a2bd0648abcb35a7c3612b126c2c75438fc2f8e8ee1f19e61f30fa54d7bb64bcf217ed1264722b497bcb613f82d78751515b67" - } - } - } - ] -} diff --git a/src/release/mod.rs b/src/release/mod.rs index 92cbf73..eff6f63 100644 --- a/src/release/mod.rs +++ b/src/release/mod.rs @@ -92,32 +92,6 @@ impl ReleasePayload { } } -/// ReleaseJws represents JSON Web Signature release metadata populated by -/// PGXN. -#[derive(Serialize, Deserialize, PartialEq, Debug)] -pub struct ReleaseJws { - headers: Vec, - signatures: Vec, - payload: ReleasePayload, -} - -impl ReleaseJws { - /// Borrows the signature headers. - pub fn headers(&self) -> &[String] { - self.headers.as_slice() - } - - /// Borrows the signatures. - pub fn signatures(&self) -> &[String] { - self.signatures.as_slice() - } - - /// Borrows the release payload. - pub fn payload(&self) -> &ReleasePayload { - self.payload.borrow() - } -} - /** Represents metadata for a PGXN release, which is the same as [`Distribution`] diff --git a/src/release/tests.rs b/src/release/tests.rs index aa6b820..eeb68f8 100644 --- a/src/release/tests.rs +++ b/src/release/tests.rs @@ -5,23 +5,6 @@ use std::{error::Error, fs::File, io::Write, path::PathBuf}; use tempfile::NamedTempFile; use wax::Glob; -fn release_meta() -> Value { - json!({"release": { - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - } - }}) -} - fn certs() -> Value { json!({ "certs": { @@ -438,25 +421,6 @@ fn release_payload() { ) } -#[test] -fn release_jws() { - let release = release_meta(); - let json = release.get("release").unwrap(); - let pay: ReleasePayload = serde_json::from_value(json.get("payload").unwrap().clone()).unwrap(); - let jws: ReleaseJws = serde_json::from_value(json.clone()).unwrap(); - assert_eq!( - json.get("headers").unwrap().as_array().unwrap(), - jws.headers(), - "headers" - ); - assert_eq!( - json.get("signatures").unwrap().as_array().unwrap(), - jws.signatures(), - "signatures" - ); - assert_eq!(&pay, jws.payload(), "payload"); -} - #[test] fn release() -> Result<(), Box> { let dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "corpus", "v2"] diff --git a/src/tests/v2.rs b/src/tests/v2.rs index f77482f..74ee953 100644 --- a/src/tests/v2.rs +++ b/src/tests/v2.rs @@ -3420,883 +3420,6 @@ fn test_v2_digests() -> Result<(), Box> { Ok(()) } -#[test] -fn test_v2_pgxn_jws() -> Result<(), Box> { - // Load the schemas and compile the maintainer schema. - let mut compiler = new_compiler("schema/v2")?; - let mut schemas = Schemas::new(); - let id = id_for(SCHEMA_VERSION, "pgxn-jws"); - let idx = compiler.compile(&id, &mut schemas)?; - - for (name, json) in [ - ( - "basic", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - } - }), - ), - ( - "multi signature", - json!({ - "headers": ["eyJhbGciOiJSUzI1NiJ9", "eyJhbGciOiJFUzI1NiJ9"], - "signatures": [ - "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw", - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": { - "user": "theory", - "date": "2024-09-13T17:32:55Z", - "uri": "dist/pair/0.1.7/pair-0.1.7.zip", - "digests": { - "sha256": "257b71aa57a28d62ddbb301333b3521ea3dc56f17551fa0e4516b03998abb089", - "sha512": "b353b5a82b3b54e95f4a2859e7a2bd0648abcb35a7c3612b126c2c75438fc2f8e8ee1f19e61f30fa54d7bb64bcf217ed1264722b497bcb613f82d78751515b67" - } - } - }), - ), - ] { - if let Err(e) = schemas.validate(&json, idx) { - panic!("{name} failed: {e}"); - } - } - - let payload = json!({ - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }); - - for (name, json) in [ - ("no data", json!({})), - ("array", json!([])), - ("string", json!("2.0.0")), - ("empty string", json!("")), - ("true", json!(true)), - ("false", json!(false)), - ("null", json!(null)), - ( - "unknown field", - json!({ - "sha1": "d833511c7ebb9c1875426ca8a93edcacd0787c46", - "foo": "hi", - }), - ), - ( - "custom field x_", - json!({ - "sha1": "d833511c7ebb9c1875426ca8a93edcacd0787c46", - "x_foo": "hi", - }), - ), - ( - "custom field X_", - json!({ - "sha1": "d833511c7ebb9c1875426ca8a93edcacd0787c46", - "x_foo": "hi", - }), - ), - // headers - ( - "no headers", - json!({ - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "empty headers", - json!({ - "headers": [], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "null headers", - json!({ - "headers": null, - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "number headers", - json!({ - "headers": 42, - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "string headers", - json!({ - "headers": "eyJhbGciOiJFUzI1NiJ9", - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "bool headers", - json!({ - "headers": true, - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "object headers", - json!({ - "headers": {"x": "eyJhbGciOiJFUzI1NiJ9"}, - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "invalid header base64", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9;"], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "header not starting with {", - json!({ - "headers": ["eyLhbGciOiJFUzI1NiJ9"], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "short header", - json!({ - "headers": ["eyJhbGciOiJFUz"], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "empty header", - json!({ - "headers": [""], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "number header", - json!({ - "headers": [42], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "bool header", - json!({ - "headers": [true], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "null header", - json!({ - "headers": [null], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "array header", - json!({ - "headers": [["eyJhbGciOiJFUzI1NiJ9"]], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - ( - "object header", - json!({ - "headers": [{"x": "eyJhbGciOiJFUzI1NiJ9"}], - "signatures": [ - "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q" - ], - "payload": payload, - }), - ), - // signatures - ( - "no signatures", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "payload": payload, - }), - ), - ( - "empty signatures", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": [], - "payload": payload, - }), - ), - ( - "number signatures", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": 42, - "payload": payload, - }), - ), - ( - "bool signatures", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": false, - "payload": payload, - }), - ), - ( - "null signatures", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": null, - "payload": payload, - }), - ), - ( - "string signatures", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-", - "payload": payload, - }), - ), - ( - "object signatures", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": {"x": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"}, - "payload": payload, - }), - ), - ( - "null signature", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": [null], - "payload": payload, - }), - ), - ( - "bool signature", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": [true], - "payload": payload, - }), - ), - ( - "number signature", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": [42], - "payload": payload, - }), - ), - ( - "array signature", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": [["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"]], - "payload": payload, - }), - ), - ( - "object signature", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": [{"x": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"}], - "payload": payload, - }), - ), - ( - "short signature", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx"], - "payload": payload, - }), - ), - ( - "invalid signature base64", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-;"], - "payload": payload, - }), - ), - // payload - ( - "no payload", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - }), - ), - ( - "null payload", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": null, - }), - ), - ( - "number payload", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": 42, - }), - ), - ( - "string payload", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": "hi", - }), - ), - ( - "bool payload", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": true, - }), - ), - ( - "payload array", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": [], - }), - ), - ( - "empty payload", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": {}, - }), - ), - // payload user - ( - "payload missing user", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload user empty", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload user number", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": 42, - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload user null", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": null, - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload user bool", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": true, - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload user array", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": ["theory"], - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload user object", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": {"x": "hi"}, - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload user too short", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "x", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - // payload date - ( - "payload missing date", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload date null", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": null, - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload date bool", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": true, - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload date number", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": 42, - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload date array", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": ["2024-07-20T20:34:34Z"], - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload date object", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": {"x": "2024-07-20T20:34:34Z"}, - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "invalid payload date", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": ["2024-07-20T27:34:34Z"], - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - // payload url - ( - "payload missing uri", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload uri null", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": null, - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload uri number", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": 42, - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload uri bool", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": true, - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload uri empty", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload uri array", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": ["/dist/semver/0.40.0/semver-0.40.0.zip"], - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "payload uri object", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": {"x": "/dist/semver/0.40.0/semver-0.40.0.zip"}, - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "invalid payload uri", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "not a URI", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - ( - "bad payload start", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "/dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { - "sha1": "fe8c013f991b5f537c39fb0c0b04bc955457675a" - } - }, - }), - ), - // payload digests - ( - "payload missing digests", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip" - }, - }), - ), - ( - "payload empty digests", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": {}, - }, - }), - ), - ( - "payload invalid digest", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": { "sha1": "nope" }, - }, - }), - ), - ( - "payload null digests", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": null, - }, - }), - ), - ( - "payload number digests", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": 42, - }, - }), - ), - ( - "payload string digests", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": "fe8c013f991b5f537c39fb0c0b04bc955457675a", - }, - }), - ), - ( - "payload array digests", - json!({ - "headers": ["eyJhbGciOiJFUzI1NiJ9"], - "signatures": ["DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-"], - "payload": { - "user": "theory", - "date": "2024-07-20T20:34:34Z", - "uri": "dist/semver/0.40.0/semver-0.40.0.zip", - "digests": ["fe8c013f991b5f537c39fb0c0b04bc955457675a"], - }, - }), - ), - ] { - if schemas.validate(&json, idx).is_ok() { - panic!("{name} unexpectedly passed!") - } - } - - Ok(()) -} - #[test] fn test_v2_payload() -> Result<(), Box> { // Load the schemas and compile the payload schema.