diff options
Diffstat (limited to 'src/server.rs')
-rw-r--r-- | src/server.rs | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/src/server.rs b/src/server.rs index fc9ed68..55cdd01 100644 --- a/src/server.rs +++ b/src/server.rs @@ -19,6 +19,8 @@ use rand::{OsRng, Rng}; use router::Router; use iron::mime; +const ROFLCOPTER: &'static [u8] = include_bytes!("data/roflcopter.gif"); + #[derive(Debug)] pub struct State { pub connection: Connection, @@ -41,6 +43,16 @@ impl iron_sessionstorage::Value for UserId { } } +fn user_ip(r: &Request) -> IronResult<String> { + if let Some(raw) = r.headers.get_raw("X-TAT-Client-IP").and_then(|h| h.first()) { + String::from_utf8(raw.clone()).map_err(|e| { + From::from(LinoError::BadRequest(format!("{}", e))) + }) + } else { + Ok(format!("{}", r.remote_addr)) + } +} + fn user_id(r: &mut Request) -> IronResult<UserId> { if let Some(user_id) = r.session().get::<UserId>()? { return Ok(user_id); @@ -113,9 +125,10 @@ fn quotes(r: &mut Request) -> IronResult<Response> { |id| id.parse::<i64>().ok(), ); let ordering = get_param(r, "order").unwrap_or("".to_string()); - let limit = get_param(r, "limit").ok().and_then( - |limit| limit.parse::<usize>().ok(), - ).unwrap_or(200); + let limit = get_param(r, "limit") + .ok() + .and_then(|limit| limit.parse::<usize>().ok()) + .unwrap_or(200); let quotes = { let mu = r.get::<Write<State>>().unwrap(); @@ -128,7 +141,10 @@ fn quotes(r: &mut Request) -> IronResult<Response> { let quotes = quotes.into_iter().take(limit).collect::<Vec<_>>(); result.insert("quotes".to_string(), to_json("es)); result.insert("scores".to_string(), to_json(&(1..6).collect::<Vec<_>>())); - result.insert("display_more".to_string(), to_json(&(quotes.len() == limit))); + result.insert( + "display_more".to_string(), + to_json(&(quotes.len() == limit)), + ); Ok(Response::with(( status::Ok, Header(ContentType::html()), @@ -152,6 +168,7 @@ fn add_post(r: &mut Request) -> IronResult<Response> { let nick = get_param(r, "nick")?; let date = get_param(r, "date")?; let quote = get_param(r, "quote")?; + let ip = user_ip(r)?; macro_rules! check { ($i:ident) => ( @@ -168,7 +185,7 @@ fn add_post(r: &mut Request) -> IronResult<Response> { { let mu = r.get::<Write<State>>().unwrap(); let state = mu.lock().unwrap(); - data::new_quote(&state.connection, &date, &nick, "e)?; + data::new_quote(&state.connection, &date, &nick, "e, &ip)?; } Ok(Response::with(( @@ -217,6 +234,7 @@ pub fn vote(r: &mut Request) -> IronResult<Response> { From::from(LinoError::BadRequest(format!("id: {}", e))) }) })?; + let ip = user_ip(r)?; let vote = get_param(r, "vote").and_then(|id| { id.parse::<i32>().map_err(|e| { From::from(LinoError::BadRequest(format!("vote: {}", e))) @@ -229,7 +247,7 @@ pub fn vote(r: &mut Request) -> IronResult<Response> { let quote = { let mu = r.get::<Write<State>>().unwrap(); let state = mu.lock().unwrap(); - data::new_vote(&state.connection, user_id.0, quote_id, vote)?; + data::new_vote(&state.connection, user_id.0, quote_id, vote, &ip)?; data::get_quote(&state.connection, quote_id, user_id.0)? }; @@ -243,17 +261,19 @@ pub fn vote(r: &mut Request) -> IronResult<Response> { ))) } -const ROFLCOPTER: &'static [u8] = include_bytes!("data/roflcopter.gif"); - fn static_file(r: &mut Request) -> IronResult<Response> { - let file = iexpect!(r.extensions.get::<Router>().unwrap().find("file"), - status::BadRequest); - let gif = ContentType(mime::Mime(mime::TopLevel::Image, - mime::SubLevel::Gif, vec![])); + let file = iexpect!( + r.extensions.get::<Router>().unwrap().find("file"), + status::BadRequest + ); + let gif = ContentType(mime::Mime( + mime::TopLevel::Image, + mime::SubLevel::Gif, + vec![], + )); Ok(match file { - "roflcopter.gif" => - Response::with((status::Ok, Header(gif), ROFLCOPTER)), - _ => Response::with(status::NotFound) + "roflcopter.gif" => Response::with((status::Ok, Header(gif), ROFLCOPTER)), + _ => Response::with(status::NotFound), }) } |