[fractal] Remove Matrix API access token before logging



commit d6335da1a5e40c2d1b9b5a5ad00b634dfc10fe91
Author: jhaye <jhaye mailbox org>
Date:   Sat Mar 28 12:10:36 2020 +0100

    Remove Matrix API access token before logging

 fractal-gtk/src/app/backend_loop.rs | 82 ++++++++++++++++++++++++++++++++-----
 1 file changed, 72 insertions(+), 10 deletions(-)
---
diff --git a/fractal-gtk/src/app/backend_loop.rs b/fractal-gtk/src/app/backend_loop.rs
index ae1a7623..45385047 100644
--- a/fractal-gtk/src/app/backend_loop.rs
+++ b/fractal-gtk/src/app/backend_loop.rs
@@ -1,6 +1,8 @@
 use crate::app::App;
 use crate::i18n::i18n;
+use lazy_static::lazy_static;
 use log::{error, info};
+use regex::Regex;
 
 use crate::actions::{activate_action, AppState};
 
@@ -194,12 +196,20 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                 // errors
                 BKResponse::AccountDestruction(Err(err)) => {
                     let error = i18n("Couldn’t delete the account");
-                    error!("{:?}", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "{}",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
                     APPOP!(show_error_dialog_in_settings, (error));
                 }
                 BKResponse::ChangePassword(Err(err)) => {
                     let error = i18n("Couldn’t change the password");
-                    error!("{:?}", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "{}",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
                     APPOP!(show_password_error_dialog, (error));
                 }
                 BKResponse::GetThreePID(Err(_)) => {
@@ -212,16 +222,28 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                 }
                 BKResponse::GetTokenEmail(Err(err)) => {
                     let error = i18n("Couldn’t add the email address.");
-                    error!("{:?}", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "{}",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
                     APPOP!(show_error_dialog_in_settings, (error));
                 }
                 BKResponse::GetTokenPhone(Err(err)) => {
                     let error = i18n("Couldn’t add the phone number.");
-                    error!("{:?}", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "{}",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
                     APPOP!(show_error_dialog_in_settings, (error));
                 }
                 BKResponse::NewRoom(Err(err), internal_id) => {
-                    error!("{:?}", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "{}",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
 
                     let error = i18n("Can’t create the room, try again");
                     let state = AppState::NoRoom;
@@ -230,14 +252,23 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                     APPOP!(set_state, (state));
                 }
                 BKResponse::JoinRoom(Err(err)) => {
-                    error!("{:?}", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "{}",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
+
                     let error = format!("{}", i18n("Can’t join the room, try again."));
                     let state = AppState::NoRoom;
                     APPOP!(show_error, (error));
                     APPOP!(set_state, (state));
                 }
                 BKResponse::ChangeLanguage(Err(err)) => {
-                    error!("Error forming url to set room language: {:?}", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "Error forming url to set room language: {}",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
                 }
                 BKResponse::LoginError(_) => {
                     let error = i18n("Can’t login, try again");
@@ -247,7 +278,11 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                     APPOP!(set_state, (st));
                 }
                 BKResponse::AttachedFile(Err(err)) => {
-                    error!("attaching {:?}: retrying send", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "attaching {}: retrying send",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
                     APPOP!(retry_send);
                 }
                 BKResponse::SentMsg(Err(err)) => match err {
@@ -270,13 +305,40 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                     APPOP!(show_error, (error));
                 }
                 BKResponse::Sync(Err(err)) => {
-                    error!("SYNC Error: {:?}", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "SYNC Error: {}",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
                     APPOP!(sync_error);
                 }
                 err => {
-                    error!("Query error: {:?}", err);
+                    let err_str = format!("{:?}", err);
+                    error!(
+                        "Query error: {}",
+                        remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+                    );
                 }
             };
         }
     });
 }
+
+/// This function removes the value of the `access_token` query from a URL used for accessing the Matrix API.
+/// The primary use case is the removing of sensitive information for logging.
+/// Specifically, the URL is expected to be contained within quotes and the token is replaced with 
`<redacted>`.
+/// Returns `Some` on removal, otherwise `None`.
+fn remove_matrix_access_token_if_present(message: &str) -> Option<String> {
+    lazy_static! {
+    static ref RE: Regex =
+        Regex::new(r#""((http)|(https))://([^"]+)/_matrix/([^"]+)\?access_token=(?P<token>[^&"]+)([^"]*)""#,)
+        .expect("Malformed regular expression.");
+    }
+    // If the supplied string doesn't contain a match for the regex, we return `None`.
+    let cap = RE.captures(message)?;
+    let captured_token = cap
+        .name("token")
+        .expect("'token' capture group not present.")
+        .as_str();
+    Some(message.replace(captured_token, "<redacted>"))
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]