diff --git a/pgadmin/frm/frmPgpassConfig.cpp b/pgadmin/frm/frmPgpassConfig.cpp index e160601..40f5249 100644 --- a/pgadmin/frm/frmPgpassConfig.cpp +++ b/pgadmin/frm/frmPgpassConfig.cpp @@ -172,7 +172,25 @@ void frmPgpassConfig::WriteFile(pgConn *conn) wxString str; size_t i; for (i = 0 ; i < lines.GetCount() - 1 ; i++) - str.Append(lines.Item(i).GetText() + wxT("\n")); + { + // Before writing it into the file we need to escape "\" and ":" + pgPassConfigLine line = lines.Item(i); + line.hostname.Replace(wxT("\\"), wxT("\\\\")); + line.hostname.Replace(wxT(":") , wxT("\\:")); + line.port.Replace(wxT("\\"), wxT("\\\\")); + line.port.Replace(wxT(":") , wxT("\\:")); + line.database.Replace(wxT("\\"), wxT("\\\\")); + line.database.Replace(wxT(":") , wxT("\\:")); + line.username.Replace(wxT("\\"), wxT("\\\\")); + line.username.Replace(wxT(":") , wxT("\\:")); + line.password.Replace(wxT("\\"), wxT("\\\\")); + line.password.Replace(wxT(":") , wxT("\\:")); + + wxString strLine = line.hostname + wxT(":") + line.port + wxT(":") + + line.database + wxT(":") + line.username + wxT(":") + line.password + wxT("\n"); + + str.Append(strLine); + } if (DoWriteFile(str, NULL)) { diff --git a/pgadmin/schema/pgServer.cpp b/pgadmin/schema/pgServer.cpp index 906d7ec..5d999e3 100644 --- a/pgadmin/schema/pgServer.cpp +++ b/pgadmin/schema/pgServer.cpp @@ -585,6 +585,13 @@ void pgServer::StorePassword() + username + wxT(":") ; } + // Escape ":" and "\" from the password field + if (!passwd.IsEmpty()) + { + passwd.Replace(wxT("\\"), wxT("\\\\")); + passwd.Replace(wxT(":") , wxT("\\:")); + } + file.Read(before); wxStringTokenizer lines(before, wxT("\n\r")); diff --git a/pgadmin/utils/pgconfig.cpp b/pgadmin/utils/pgconfig.cpp index a7d9a31..b59531f 100644 --- a/pgadmin/utils/pgconfig.cpp +++ b/pgadmin/utils/pgconfig.cpp @@ -570,17 +570,47 @@ void pgPassConfigLine::Init(const wxString &line) isComment = line.StartsWith(wxT("#")); - wxStringTokenizer tok(isComment ? line.Mid(1) : line, wxT(":")); - if (tok.HasMoreTokens()) - hostname = tok.GetNextToken(); - if (tok.HasMoreTokens()) - port = tok.GetNextToken(); - if (tok.HasMoreTokens()) - database = tok.GetNextToken(); - if (tok.HasMoreTokens()) - username = tok.GetNextToken(); - if (tok.HasMoreTokens()) - password = tok.GetNextToken(); + wxString tmpLine = line; + // De-escape backslash "\" + tmpLine.Replace(wxT("\\\\"), wxT("\\")); + + int iVarCount = 0; + wxStringTokenizer tok(isComment ? tmpLine.Mid(1) : tmpLine, wxT(":")); + while(tok.HasMoreTokens()) + { + wxString val = tok.GetNextToken(); + if (!val.IsEmpty()) + { + /* if last charecter of the token is backslash "\" then it means + that it is used to escape ":" so we need to add the next token. + */ + while(val.Last() == wxT('\\')) + { + val.RemoveLast(); + val = val + wxT(":") + tok.GetNextToken(); + } + + iVarCount++; + switch(iVarCount) + { + case 1: // hostname + hostname = val; + break; + case 2: // port + port = val; + break; + case 3: // database + database = val; + break; + case 4: //username + username = val; + break; + case 5: // password + password = val; + break; + } + } + } } wxString pgPassConfigLine::GetText()