From 6d9fe052e6b9d8150f587b64a540309a9cbba889 Mon Sep 17 00:00:00 2001
From: Robert Czechowski <czechowski@bwinf.de>
Date: Tue, 14 Aug 2018 10:36:53 +0200
Subject: [PATCH] Add MedalError AccessDenied, Add helper type aliases for
 results

---
 src/functions.rs  | 11 ++++++++---
 src/webfw_iron.rs |  7 +++++--
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/functions.rs b/src/functions.rs
index a0a87fc2..cab219ea 100644
--- a/src/functions.rs
+++ b/src/functions.rs
@@ -70,9 +70,14 @@ pub struct ContestInfo {
 
 #[derive(Clone)]
 pub enum MedalError {
-    NotLoggedIn
+    NotLoggedIn,
+    AccessDenied,
 }
 
+type MedalValue = (String, json_val::Map<String, json_val::Value>);
+type MedalResult<T> = Result<T, MedalError>;
+type MedalValueResult = MedalResult<MedalValue>;
+
 
 pub fn show_contests<T: MedalConnection>(conn: &T) -> (String, json_val::Map<String, json_val::Value>) {
     let mut data = json_val::Map::new();
@@ -276,7 +281,7 @@ pub struct GroupInfo {
     pub code: String,
 }
 
-pub fn show_groups<T: MedalConnection>(conn: &T, session_token: String) ->  (String, json_val::Map<String, json_val::Value>) {
+pub fn show_groups<T: MedalConnection>(conn: &T, session_token: String) -> Result<(String, json_val::Map<String, json_val::Value>), MedalError> {
     let session = conn.get_session(session_token).unwrap(); // TODO handle error
 
 //    let groupvec = conn.get_group(session_token);
@@ -292,7 +297,7 @@ pub fn show_groups<T: MedalConnection>(conn: &T, session_token: String) ->  (Str
     data.insert("group".to_string(), to_json(&v));
     data.insert("csrftoken".to_string(), to_json(&session.csrf_token));
     
-    ("groups".to_string(), data)
+    Ok(("groups".to_string(), data))
 }
 
 #[derive(Serialize, Deserialize)]
diff --git a/src/webfw_iron.rs b/src/webfw_iron.rs
index d1a82ab0..aae3bf79 100644
--- a/src/webfw_iron.rs
+++ b/src/webfw_iron.rs
@@ -186,7 +186,10 @@ impl<'c, 'a, 'b> From<AugMedalError<'c, 'a, 'b>> for IronError {
         match me {
             functions::MedalError::NotLoggedIn => IronError {
                 error: Box::new(SessionError { message: "Not Logged in, redirecting to login page".to_string() }),
-                response: Response::with((status::Found, RedirectRaw(format!("/login?{}", req.url.path().join("/"))))) }
+                response: Response::with((status::Found, RedirectRaw(format!("/login?{}", req.url.path().join("/"))))) },
+            functions::MedalError::AccessDenied => IronError {
+                error: Box::new(SessionError { message: "Access denied".to_string() }),
+                response: Response::with(status::Forbidden) }
         }   
     }
 }
@@ -467,7 +470,7 @@ fn groups(req: &mut Request) -> IronResult<Response> {
         let conn = mutex.lock().unwrap_or_else(|e| e.into_inner());
 
         // Antwort erstellen und zurücksenden   
-        functions::show_groups(&*conn, session_token)
+        functions::show_groups(&*conn, session_token).map_err(|me| {AugMedalError(me, req)})?
         /*let mut data = json_val::Map::new();
         data.insert("reason".to_string(), to_json(&"Not implemented".to_string()));
         ("groups", data)*/
-- 
GitLab