summaryrefslogtreecommitdiff
path: root/src/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.rs')
-rw-r--r--src/server.rs50
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(&quotes));
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, &quote)?;
+ data::new_quote(&state.connection, &date, &nick, &quote, &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),
})
}