From 51be07e58a4978614d71101545ffe3099dd99552 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Mon, 19 Nov 2018 20:36:42 +0100 Subject: Rename `bin/license-generator.rs` to bin/fulfillment.rs` Renames the binary. The name "license-generator" no longer seems apt at this point. That binary doesn't actually generate a license, it serves as the webhook endpoint for Paddle's license fulfillment. Our `license` binary handles the actual license generation. The URL I'll be using for the webhook is `/fulfillment`, so this also makes sense from that perspective. --- license-generator/Makefile | 2 +- license-generator/lighttpd.conf | 4 +- license-generator/src/bin/fulfillment.rs | 148 +++++++++++++++++++++++++ license-generator/src/bin/license-generator.rs | 148 ------------------------- 4 files changed, 151 insertions(+), 151 deletions(-) create mode 100644 license-generator/src/bin/fulfillment.rs delete mode 100644 license-generator/src/bin/license-generator.rs diff --git a/license-generator/Makefile b/license-generator/Makefile index 45a53bc..7f6f1c2 100644 --- a/license-generator/Makefile +++ b/license-generator/Makefile @@ -1,4 +1,4 @@ .PHONY: run run: - ls target/debug/license-generator target/debug/license | \ + ls target/debug/fulfillment target/debug/license | \ entr -r lighttpd -f lighttpd.conf -D diff --git a/license-generator/lighttpd.conf b/license-generator/lighttpd.conf index 1923c4a..c0e0a1f 100644 --- a/license-generator/lighttpd.conf +++ b/license-generator/lighttpd.conf @@ -9,9 +9,9 @@ server.modules += ( "mod_fastcgi" ) fastcgi.debug = 1 fastcgi.server = ( "/fulfillment" => (( - "socket" => "./license-generator.fcgi.socket", + "socket" => "./fulfillment.fcgi.socket", "check-local" => "disable", - "bin-path" => var.CWD + "/target/debug/license-generator", + "bin-path" => var.CWD + "/target/debug/fulfillment", "max-procs" => 1 )), "/license" => (( diff --git a/license-generator/src/bin/fulfillment.rs b/license-generator/src/bin/fulfillment.rs new file mode 100644 index 0000000..e01a8c6 --- /dev/null +++ b/license-generator/src/bin/fulfillment.rs @@ -0,0 +1,148 @@ +extern crate fastcgi; + +#[macro_use] +extern crate log; +extern crate mysql; +extern crate simplelog; +extern crate url; + +extern crate license_generator; + +use std::io::{Read, Write}; + +use url::Url; + +use license_generator::database; +use license_generator::errors::*; +use license_generator::logger; +use license_generator::params; +use license_generator::purchaser::Purchaser; +use license_generator::request; +use license_generator::response; + +fn main() -> Result<()> { + logger::init()?; + + let pool = match database::get_database_pool() + .chain_err(|| "failed to create a database connection pool") + { + Ok(pool) => pool, + Err(e) => { + error!("{}", e); + return Err(e); + }, + }; + + fastcgi::run(move |mut req| { + let mut params = String::new(); + match req.stdin().read_to_string(&mut params) { + Ok(_) => (), + Err(e) => error!("{}", e), + } + + logger::log_request(&req, ¶ms); + + match req.param("REQUEST_METHOD") { + Some(method) => { + if method != "POST" { + return response::error_405(&mut req.stdout(), "POST"); + } + }, + None => { + return response::error_500(&mut req.stdout(), None); + }, + }; + + let ps = params::parse(¶ms); + let is_verified = match request::verified(&ps) { + Ok(v) => v, + Err(e) => { + return response::error_500(&mut req.stdout(), Some(e)); + }, + }; + + if is_verified { + let name = ps.get("name"); + let email = ps.get("email"); + + if name.is_some() && email.is_some() { + let purchaser = Purchaser::new(name.unwrap(), email.unwrap()); + + let mut cx = match pool.get_conn() { + Ok(cx) => cx, + Err(e) => { + return response::error_500( + &mut req.stdout(), + Some(e.into()) + ); + }, + }; + + match purchaser.insert(&mut cx) { + Ok(_) => { + let secret = match purchaser.secret { + Some(s) => s, + None => return response::error_500( + &mut req.stdout(), + Some("Empty secret".into()) + ), + }; + + let license_download_url = match Url::parse_with_params( + "https://domekey.teddywing.com/license", + &[ + ("name", purchaser.name), + ("email", purchaser.email), + ("secret", &secret), + ], + ) { + Ok(u) => u, + Err(e) => return response::error_500( + &mut req.stdout(), + Some(e.into()) + ), + }; + + write!( + &mut req.stdout(), + "Content-Type: text/plain + +Thanks so much for purchasing DomeKey! + +Download your license here: +{url} + +Install DomeKey with: + + $ brew install teddywing/DomeKey/dome-key + +Add your license by running: + + $ dome-key --license PATH/TO/dome-key-license.plist +", + url = license_download_url, + ) + .unwrap_or(()); + + return; + }, + Err(e) => { + return response::error_500(&mut req.stdout(), Some(e)); + }, + } + } + + return response::error_500( + &mut req.stdout(), + Some("Purchaser name or email not set".into()) + ); + } + + response::error_403( + &mut req.stdout(), + Some("Invalid request signature") + ); + }); + + Ok(()) +} diff --git a/license-generator/src/bin/license-generator.rs b/license-generator/src/bin/license-generator.rs deleted file mode 100644 index e01a8c6..0000000 --- a/license-generator/src/bin/license-generator.rs +++ /dev/null @@ -1,148 +0,0 @@ -extern crate fastcgi; - -#[macro_use] -extern crate log; -extern crate mysql; -extern crate simplelog; -extern crate url; - -extern crate license_generator; - -use std::io::{Read, Write}; - -use url::Url; - -use license_generator::database; -use license_generator::errors::*; -use license_generator::logger; -use license_generator::params; -use license_generator::purchaser::Purchaser; -use license_generator::request; -use license_generator::response; - -fn main() -> Result<()> { - logger::init()?; - - let pool = match database::get_database_pool() - .chain_err(|| "failed to create a database connection pool") - { - Ok(pool) => pool, - Err(e) => { - error!("{}", e); - return Err(e); - }, - }; - - fastcgi::run(move |mut req| { - let mut params = String::new(); - match req.stdin().read_to_string(&mut params) { - Ok(_) => (), - Err(e) => error!("{}", e), - } - - logger::log_request(&req, ¶ms); - - match req.param("REQUEST_METHOD") { - Some(method) => { - if method != "POST" { - return response::error_405(&mut req.stdout(), "POST"); - } - }, - None => { - return response::error_500(&mut req.stdout(), None); - }, - }; - - let ps = params::parse(¶ms); - let is_verified = match request::verified(&ps) { - Ok(v) => v, - Err(e) => { - return response::error_500(&mut req.stdout(), Some(e)); - }, - }; - - if is_verified { - let name = ps.get("name"); - let email = ps.get("email"); - - if name.is_some() && email.is_some() { - let purchaser = Purchaser::new(name.unwrap(), email.unwrap()); - - let mut cx = match pool.get_conn() { - Ok(cx) => cx, - Err(e) => { - return response::error_500( - &mut req.stdout(), - Some(e.into()) - ); - }, - }; - - match purchaser.insert(&mut cx) { - Ok(_) => { - let secret = match purchaser.secret { - Some(s) => s, - None => return response::error_500( - &mut req.stdout(), - Some("Empty secret".into()) - ), - }; - - let license_download_url = match Url::parse_with_params( - "https://domekey.teddywing.com/license", - &[ - ("name", purchaser.name), - ("email", purchaser.email), - ("secret", &secret), - ], - ) { - Ok(u) => u, - Err(e) => return response::error_500( - &mut req.stdout(), - Some(e.into()) - ), - }; - - write!( - &mut req.stdout(), - "Content-Type: text/plain - -Thanks so much for purchasing DomeKey! - -Download your license here: -{url} - -Install DomeKey with: - - $ brew install teddywing/DomeKey/dome-key - -Add your license by running: - - $ dome-key --license PATH/TO/dome-key-license.plist -", - url = license_download_url, - ) - .unwrap_or(()); - - return; - }, - Err(e) => { - return response::error_500(&mut req.stdout(), Some(e)); - }, - } - } - - return response::error_500( - &mut req.stdout(), - Some("Purchaser name or email not set".into()) - ); - } - - response::error_403( - &mut req.stdout(), - Some("Invalid request signature") - ); - }); - - Ok(()) -} -- cgit v1.2.3