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");
}