aboutsummaryrefslogtreecommitdiffstats
path: root/license-generator/src/bin/fulfillment.rs
diff options
context:
space:
mode:
authorTeddy Wing2018-11-19 20:36:42 +0100
committerTeddy Wing2018-11-19 20:36:42 +0100
commit51be07e58a4978614d71101545ffe3099dd99552 (patch)
tree18d46a08ef19303032c0a5d5e6fdc7f5202edcb4 /license-generator/src/bin/fulfillment.rs
parent2ea1c642d07bef0cd9e4b09a28b2f012cf50e511 (diff)
downloaddome-key-web-51be07e58a4978614d71101545ffe3099dd99552.tar.bz2
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.
Diffstat (limited to 'license-generator/src/bin/fulfillment.rs')
-rw-r--r--license-generator/src/bin/fulfillment.rs148
1 files changed, 148 insertions, 0 deletions
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, &params);
+
+ 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(&params);
+ 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(())
+}