diff options
Diffstat (limited to 'server/src/api/site.rs')
-rw-r--r-- | server/src/api/site.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/server/src/api/site.rs b/server/src/api/site.rs index ad45e8d1..4202fea0 100644 --- a/server/src/api/site.rs +++ b/server/src/api/site.rs @@ -97,6 +97,22 @@ pub struct TransferSite { auth: String, } +#[derive(Serialize, Deserialize)] +pub struct GetSiteConfig { + auth: String, +} + +#[derive(Serialize, Deserialize)] +pub struct GetSiteConfigResponse { + config_hjson: String, +} + +#[derive(Serialize, Deserialize)] +pub struct SaveSiteConfig { + config_hjson: String, + auth: String, +} + impl Perform<ListCategoriesResponse> for Oper<ListCategories> { fn perform(&self, conn: &PgConnection) -> Result<ListCategoriesResponse, Error> { let _data: &ListCategories = &self.data; @@ -514,3 +530,57 @@ impl Perform<GetSiteResponse> for Oper<TransferSite> { }) } } + +impl Perform<GetSiteConfigResponse> for Oper<GetSiteConfig> { + fn perform(&self, conn: &PgConnection) -> Result<GetSiteConfigResponse, Error> { + let data: &GetSiteConfig = &self.data; + + let claims = match Claims::decode(&data.auth) { + Ok(claims) => claims.claims, + Err(_e) => return Err(APIError::err("not_logged_in").into()), + }; + + let user_id = claims.id; + + // Only let admins read this + let admins = UserView::admins(&conn)?; + let admin_ids: Vec<i32> = admins.into_iter().map(|m| m.id).collect(); + + if !admin_ids.contains(&user_id) { + return Err(APIError::err("not_an_admin").into()); + } + + let config_hjson = Settings::read_config_file()?; + + Ok(GetSiteConfigResponse { config_hjson }) + } +} + +impl Perform<GetSiteConfigResponse> for Oper<SaveSiteConfig> { + fn perform(&self, conn: &PgConnection) -> Result<GetSiteConfigResponse, Error> { + let data: &SaveSiteConfig = &self.data; + + let claims = match Claims::decode(&data.auth) { + Ok(claims) => claims.claims, + Err(_e) => return Err(APIError::err("not_logged_in").into()), + }; + + let user_id = claims.id; + + // Only let admins read this + let admins = UserView::admins(&conn)?; + let admin_ids: Vec<i32> = admins.into_iter().map(|m| m.id).collect(); + + if !admin_ids.contains(&user_id) { + return Err(APIError::err("not_an_admin").into()); + } + + // Make sure docker doesn't have :ro at the end of the volume, so its not a read-only filesystem + let config_hjson = match Settings::save_config_file(&data.config_hjson) { + Ok(config_hjson) => config_hjson, + Err(_e) => return Err(APIError::err("couldnt_update_site").into()), + }; + + Ok(GetSiteConfigResponse { config_hjson }) + } +} |