Self-hosted, federated location sharing app and server that prioritizes user privacy and security
end-to-end-encryption location-sharing privacy self-hosted federated

fixed SrvErr printing the error on construction

azom.dev c60813a9 ffbf2082

verified
Changed files
+30 -28
server
+1
server/src/auth.rs
··· 13 13 next: Next, 14 14 ) -> Result<axum::response::Response, SrvErr> { 15 15 let endpoint = req.uri().path().to_owned(); 16 + 16 17 if endpoint != "/create-account" { 17 18 // CURSED STUFF BEGIN 18 19 let (parts, body) = req.into_parts();
+6 -8
server/src/handlers.rs
··· 22 22 }; 23 23 24 24 // todo check 25 - let pub_key = match VerifyingKey::from_bytes( 26 - &pub_key_bytes 27 - .try_into() 28 - .map_err(|_| SrvErr("Invalid pubkey length".into()))?, 29 - ) { 30 - Ok(pk) => pk, 31 - Err(_) => ReqBail!("Invalid public key bytes"), 32 - }; 25 + let pub_key_arr: [u8; 32] = pub_key_bytes 26 + .as_slice() 27 + .try_into() 28 + .map_err(|_| SrvErr!("Invalid pubkey length"))?; 29 + let pub_key = VerifyingKey::from_bytes(&pub_key_arr) 30 + .map_err(|e| SrvErr!("Invalid public key bytes", e))?; 33 31 34 32 let user_id = nanoid!(5); 35 33 let mut is_admin = false;
+23 -20
server/src/types.rs
··· 126 126 } 127 127 128 128 #[derive(Debug)] 129 - pub struct SrvErr(pub String); 129 + pub struct SrvErr { 130 + pub msg: String, 131 + pub cause: Option<String>, 132 + } 130 133 131 134 impl IntoResponse for SrvErr { 132 135 fn into_response(self) -> Response { 133 - (StatusCode::INTERNAL_SERVER_ERROR, self.0).into_response() 136 + // Log once here (this runs only for real errors) 137 + match &self.cause { 138 + Some(c) => eprintln!("[ERR] {} | cause: {}", self.msg, c), 139 + None => eprintln!("[ERR] {}", self.msg), 140 + } 141 + 142 + let body = if cfg!(debug_assertions) { 143 + match &self.cause { 144 + Some(c) => format!("{} | cause: {}", self.msg, c), 145 + None => self.msg.clone(), 146 + } 147 + } else { 148 + self.msg.clone() 149 + }; 150 + 151 + (StatusCode::INTERNAL_SERVER_ERROR, body).into_response() 134 152 } 135 153 } 136 154 137 155 /// Central policy: what gets logged, what gets returned. 138 156 pub fn mk_srv_err(msg: impl Into<String>, cause: Option<String>) -> SrvErr { 139 - let msg = msg.into(); 140 - 141 - match cause { 142 - Some(c) => { 143 - // Always log server-side 144 - eprintln!("[ERR] {msg} | cause: {c}"); 145 - 146 - // Only include cause in client response in debug builds 147 - if cfg!(debug_assertions) { 148 - SrvErr(format!("{msg} | cause: {c}")) 149 - } else { 150 - SrvErr(msg) 151 - } 152 - } 153 - None => { 154 - eprintln!("[ERR] {msg}"); 155 - SrvErr(msg) 156 - } 157 + SrvErr { 158 + msg: msg.into(), 159 + cause, 157 160 } 158 161 } 159 162