From b32010f9051cc328e4f20000d3b2166f6f4ef272 Mon Sep 17 00:00:00 2001 From: Jordan Johnson-Doyle Date: Fri, 15 Feb 2019 21:53:13 +0000 Subject: [PATCH] Better error handling, remove all unwraps --- Cargo.lock | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/io.rs | 16 ++++++++++------ src/main.rs | 22 ++++++++++++++-------- 4 files changed, 141 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c86bcf..5e19438 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -78,6 +78,7 @@ dependencies = [ "gpw 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rocket 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", "syntect 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -576,6 +577,33 @@ dependencies = [ ] [[package]] +name = "rand" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_chacha" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "rand_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -589,6 +617,62 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_jitter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_os" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_pcg" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "rawpointer" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -675,6 +759,14 @@ dependencies = [ ] [[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "ryu" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -693,6 +785,19 @@ dependencies = [ ] [[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "serde" version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -998,8 +1103,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" +"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" +"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"checksum rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b7c690732391ae0abafced5015ffb53656abfaec61b342290e5eb56b286a679d" +"checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" +"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rawpointer 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebac11a9d2e11f2af219b8b8d833b76b1ea0e054aa0e8d8e9e4cbde353bdf019" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" @@ -1008,9 +1121,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rocket 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "242154377a85c2a9e036fc31ffc8c200b9e1f22a196e47baa3b57716606ca89d" "checksum rocket_codegen 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d907d6d458c859651c1cf4c8fa99b77685082bde0561db6a4600b365058f710" "checksum rocket_http 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba9d4f2ce5bba6e1b6d3100493bbad63879e99bbf6b4365d61e6f781daab324d" +"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" "checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)" = "2e20fde37801e83c891a2dc4ebd3b81f0da4d1fb67a9e0a2a3b921e2536a58ee" "checksum serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)" = "633e97856567e518b59ffb2ad7c7a4fd4c5d91d9c7f32dd38a27b2bf7e8114ea" "checksum serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "27dce848e7467aa0e2fcaf0a413641499c0b745452aaca1194d24dedde9e13c9" diff --git a/Cargo.toml b/Cargo.toml index 3a9fa14..7e99e1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ askama = { git = "https://github.com/djc/askama", rev = "fc5addc4", features = [ askama_escape = { git = "https://github.com/djc/askama", rev = "fc5addc4" } rocket = "0.4" lazy_static = "1.2" +rand = "0.6" gpw = "0.1" syntect = "3.0" chashmap = { git = "https://github.com/redox-os/tfs", rev = "b3e7cae1" } diff --git a/src/io.rs b/src/io.rs index 2f56676..31ce6f2 100644 --- a/src/io.rs +++ b/src/io.rs @@ -1,5 +1,9 @@ extern crate gpw; extern crate linked_hash_map; +extern crate rand; + +use rand::{Rng, thread_rng}; +use rand::distributions::Alphanumeric; use linked_hash_map::LinkedHashMap; @@ -9,7 +13,7 @@ use std::cell::RefCell; lazy_static! { static ref ENTRIES: RwLock> = RwLock::new(LinkedHashMap::new()); - static ref BUFFER_SIZE: usize = env::var("BIN_BUFFER_SIZE").map(|f| f.parse::().unwrap()).unwrap_or(1000usize); + static ref BUFFER_SIZE: usize = env::var("BIN_BUFFER_SIZE").map(|f| f.parse::().expect("Failed to parse value of BIN_BUFFER_SIZE")).unwrap_or(1000usize); } /// Ensures `ENTRIES` is less than the size of `BIN_BUFFER_SIZE`. If it isn't then @@ -17,12 +21,12 @@ lazy_static! { /// /// During the purge, `ENTRIES` is locked and the current thread will block. fn purge_old() { - let entries_len = ENTRIES.read().unwrap().len(); + let entries_len = ENTRIES.read().unwrap_or_else(|p| p.into_inner()).len(); if entries_len > *BUFFER_SIZE { let to_remove = entries_len - *BUFFER_SIZE; - let mut entries = ENTRIES.write().unwrap(); + let mut entries = ENTRIES.write().unwrap_or_else(|p| p.into_inner()); for _ in 0..to_remove { entries.pop_front(); @@ -33,18 +37,18 @@ fn purge_old() { /// Generates a 'pronounceable' random ID using gpw pub fn generate_id() -> String { thread_local!(static KEYGEN: RefCell = RefCell::new(gpw::PasswordGenerator::default())); - KEYGEN.with(|k| k.borrow_mut().next().unwrap()) + KEYGEN.with(|k| k.borrow_mut().next().unwrap_or_else(|| thread_rng().sample_iter(&Alphanumeric).take(6).collect::())) } /// Stores a paste under the given id pub fn store_paste(id: String, content: String) { purge_old(); - ENTRIES.write().unwrap().insert(id, content); + ENTRIES.write().unwrap_or_else(|p| p.into_inner()).insert(id, content); } /// Get a paste by id. /// /// Returns `None` if the paste doesn't exist. pub fn get_paste(id: &str) -> Option { - ENTRIES.read().unwrap().get(id).cloned() + ENTRIES.read().unwrap_or_else(|p| p.into_inner()).get(id).cloned() } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index b75210b..bbefa83 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,7 +23,7 @@ use rocket::Data; use rocket::request::Form; use rocket::response::Redirect; use rocket::response::content::Content; -use rocket::http::ContentType; +use rocket::http::{ContentType, Status}; use std::io::Read; @@ -83,24 +83,30 @@ struct Render { } #[get("/")] -fn render(key: String, plaintext: IsPlaintextRequest) -> Option> { +fn render(key: String, plaintext: IsPlaintextRequest) -> Result, Status> { let mut splitter = key.splitn(2, '.'); - let key = splitter.next()?; + let key = splitter.next().ok_or_else(|| Status::NotFound)?; let ext = splitter.next(); // get() returns a read-only lock, we're not going to be writing to this key // again so we can hold this for as long as we want - let entry = get_paste(key)?; + let entry = get_paste(key).ok_or_else(|| Status::NotFound)?; if *plaintext { - Some(Content(ContentType::Plain, entry)) + Ok(Content(ContentType::Plain, entry)) } else { - Some(Content(ContentType::HTML, Render { + let template = Render { content: match ext { None => MarkupDisplay::new_unsafe(entry, Html), - Some(extension) => MarkupDisplay::new_safe(highlight(&entry, extension)?, Html) + Some(extension) => highlight(&entry, extension) + .map(|h| MarkupDisplay::new_safe(h, Html)) + .ok_or_else(|| Status::NotFound)? }, - }.render().unwrap())) + }; + + template.render() + .map(|html| Content(ContentType::HTML, html)) + .map_err(|_| Status::InternalServerError) } } -- libgit2 1.7.2