diff --git a/client/acct_mgr.cpp b/client/acct_mgr.cpp index 1254d9ee76..d708bcf60c 100644 --- a/client/acct_mgr.cpp +++ b/client/acct_mgr.cpp @@ -383,6 +383,7 @@ int ACCT_MGR_OP::parse(FILE* f) { } if (xp.match_tag("/acct_mgr_reply")) return 0; if (xp.parse_str("name", ami.project_name, 256)) continue; + if (xp.parse_str("authenticator", ami.authenticator, 256)) continue; if (xp.parse_int("error_num", error_num)) continue; if (xp.parse_string("error", error_str)) continue; if (xp.parse_string("error_msg", error_str)) continue; diff --git a/client/acct_mgr.h b/client/acct_mgr.h index e37b2550a1..ba2638e646 100644 --- a/client/acct_mgr.h +++ b/client/acct_mgr.h @@ -78,12 +78,14 @@ struct ACCT_MGR_INFO : PROJ_AM { inline bool using_am() { if (!strlen(master_url)) return false; + if (strlen(authenticator)) return true; if (!strlen(login_name)) return false; if (!strlen(password_hash)) return false; return true; } - inline bool same_am(const char* mu, const char* ln, const char* ph) { + inline bool same_am(const char* mu, const char* ln, const char* ph, const char* auth) { if (strcmp(mu, master_url)) return false; + if (!strcmp(auth, authenticator)) return true; if (strcmp(ln, login_name)) return false; if (strcmp(ph, password_hash)) return false; return true; diff --git a/client/gui_rpc_server_ops.cpp b/client/gui_rpc_server_ops.cpp index f6f5052592..a950cccf16 100644 --- a/client/gui_rpc_server_ops.cpp +++ b/client/gui_rpc_server_ops.cpp @@ -640,7 +640,9 @@ static void handle_acct_mgr_info(GUI_RPC_CONN& grc) { gstate.acct_mgr_info.project_name ); - if (strlen(gstate.acct_mgr_info.login_name)) { + if (strlen(gstate.acct_mgr_info.login_name) + || strlen(gstate.acct_mgr_info.authenticator) + ) { grc.mfout.printf(" \n"); } @@ -938,7 +940,7 @@ static void handle_project_attach_poll(GUI_RPC_CONN& grc) { // url/name/passwd args are null // static void handle_acct_mgr_rpc(GUI_RPC_CONN& grc) { - string url, name, password; + string url, name, password, authenticator; string password_hash, name_lc; bool use_config_file = false; bool bad_arg = false; @@ -971,6 +973,7 @@ static void handle_acct_mgr_rpc(GUI_RPC_CONN& grc) { url = gstate.acct_mgr_info.master_url; name = gstate.acct_mgr_info.login_name; password_hash = gstate.acct_mgr_info.password_hash; + authenticator = gstate.acct_mgr_info.authenticator; } } else { bad_arg = !url_found || !name_found || !password_found; @@ -990,7 +993,7 @@ static void handle_acct_mgr_rpc(GUI_RPC_CONN& grc) { grc.mfout.printf("bad arg\n"); } else if (gstate.acct_mgr_info.using_am() && !url.empty() - && !gstate.acct_mgr_info.same_am(url.c_str(), name.c_str(), password_hash.c_str()) + && !gstate.acct_mgr_info.same_am(url.c_str(), name.c_str(), password_hash.c_str(), authenticator.c_str()) ){ grc.mfout.printf("attached to a different AM - detach first\n"); } else { @@ -998,6 +1001,7 @@ static void handle_acct_mgr_rpc(GUI_RPC_CONN& grc) { safe_strcpy(ami.master_url, url.c_str()); safe_strcpy(ami.login_name, name.c_str()); safe_strcpy(ami.password_hash, password_hash.c_str()); + safe_strcpy(ami.authenticator, authenticator.c_str()); gstate.acct_mgr_op.do_rpc(ami, true); grc.mfout.printf("\n"); }