From e594577e14812ff4a7ca26dd2ffb506efc469b68 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sat, 10 Nov 2018 15:07:17 +0100 Subject: paddle: Take any kind of `str` reference input, not just `&str` Use `AsRef` instead of `&str` to offer a more flexible interface. We need this because `url::form_urlencoded::parse()` gives us an iterator of `(Cow<_, str>, Cow<_, str>)`, and we want to pass that into `verify_signature()`. Also change `key.len()` and `value.len()` to `.chars().count()` because I was having a hard time getting the `len()` method from a trait (`str` doesn't implement `ExactSizeIterator`), and I learned this: > This length is in bytes, not chars or graphemes. In other words, it > may not be what a human considers the length of the string. (https://doc.rust-lang.org/std/primitive.str.html#method.len) Also: https://stackoverflow.com/questions/46290655/get-the-string-length-in-characters-in-rust/46290728#46290728 I assume the PHP serializer uses character count instead of byte length. --- license-generator/paddle/src/lib.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'license-generator/paddle/src') diff --git a/license-generator/paddle/src/lib.rs b/license-generator/paddle/src/lib.rs index 3ebc3f2..11fd87f 100644 --- a/license-generator/paddle/src/lib.rs +++ b/license-generator/paddle/src/lib.rs @@ -1,5 +1,8 @@ extern crate openssl; +use std::fmt::Display; +use std::ops::Deref; + use openssl::hash::MessageDigest; use openssl::pkey::PKey; use openssl::rsa::Rsa; @@ -7,8 +10,11 @@ use openssl::sign::Verifier; // https://paddle.com/docs/reference-verifying-webhooks/ -fn verify_signature<'a, I>(pem: &[u8], signature: &str, params: I) -> bool -where I: IntoIterator + PartialOrd { +pub fn verify_signature<'a, S, I>(pem: &[u8], signature: &str, params: I) -> bool +where + S: AsRef + Deref + Display, + I: IntoIterator + PartialOrd, +{ let rsa = Rsa::public_key_from_pem(pem).unwrap(); let pkey = PKey::from_rsa(rsa).unwrap(); let mut verifier = Verifier::new(MessageDigest::sha1(), &pkey).unwrap(); @@ -19,8 +25,11 @@ where I: IntoIterator + PartialOrd { verifier.verify(signature.as_ref()).unwrap() } -fn php_serialize<'a, I>(pairs: I) -> String -where I: IntoIterator + PartialOrd { +fn php_serialize<'a, S, I>(pairs: I) -> String +where + S: AsRef + Deref + Display, + I: IntoIterator + PartialOrd, +{ let mut serialized = String::with_capacity(500); let mut len = 0; @@ -28,9 +37,9 @@ where I: IntoIterator + PartialOrd { serialized.push_str( &format!( "s:{key_length}:\"{key}\";s:{value_length}:\"{value}\";", - key_length = key.len(), + key_length = key.chars().count(), key = key, - value_length = value.len(), + value_length = value.chars().count(), value = value ) ); -- cgit v1.2.3