diff --git a/extensions/wallet/signonviewer/SignonViewer.js b/extensions/wallet/signonviewer/SignonViewer.js index ac6d8922c49c..8660947983aa 100644 --- a/extensions/wallet/signonviewer/SignonViewer.js +++ b/extensions/wallet/signonviewer/SignonViewer.js @@ -97,8 +97,17 @@ function LoadSignons() var currSignon = TrimString(signonList[i]); // TEMP HACK until morse fixes signon viewer functions currSignon = RemoveHTMLFormatting(currSignon); + /* parameter passed in is url:username */ var site = currSignon.substring(0,currSignon.lastIndexOf(":")); var user = currSignon.substring(currSignon.lastIndexOf(":")+1,currSignon.length); + if (user == "") { + /* no username passed in, parse if out of url */ + var uri = + Components.classes["component://netscape/network/standard-url"] + .createInstance(Components.interfaces.nsIURI); + uri.spec = site; + user = uri.username; + } AddItem("savesignonlist",[site,user],"signon_",i-1); } if (deleted_signons_count >= signonList.length) { diff --git a/extensions/wallet/src/singsign.cpp b/extensions/wallet/src/singsign.cpp index e03067e52f1f..2ec56b7d8574 100644 --- a/extensions/wallet/src/singsign.cpp +++ b/extensions/wallet/src/singsign.cpp @@ -1812,8 +1812,8 @@ si_OkToSave(char *passwordRealm, nsAutoString userName) { /* * Check for a signon submission and remember the data if so */ -PUBLIC void -SINGSIGN_RememberSignonData (char* passwordRealm, nsVoidArray * signonData) +PRIVATE void +si_RememberSignonData (char* passwordRealm, nsVoidArray * signonData) { int passwordCount = 0; int pswd[3]; @@ -1924,7 +1924,28 @@ SINGSIGN_RememberSignonData (char* passwordRealm, nsVoidArray * signonData) } PUBLIC void -SINGSIGN_RestoreSignonData (char* passwordRealm, PRUnichar* name, PRUnichar** value, PRUint32 elementNumber) { +SINGSIGN_RememberSignonData (char* passwordRealm, nsVoidArray * signonData) +{ + nsresult rv; + NS_WITH_SERVICE(nsIURL, uri, "component://netscape/network/standard-url", &rv); + if (NS_FAILED(rv)) { + return; + } + rv = uri->SetSpec(passwordRealm); + if (NS_FAILED(rv)) { + return; + } + char * strippedRealm; + rv = uri->GetHost(&strippedRealm); + if (NS_FAILED(rv)) { + return; + } + si_RememberSignonData (strippedRealm, signonData); + PR_Free(strippedRealm); +} + +PRIVATE void +si_RestoreSignonData (char* passwordRealm, PRUnichar* name, PRUnichar** value, PRUint32 elementNumber) { si_SignonUserStruct* user; si_SignonDataStruct* data; nsAutoString correctedName; @@ -2026,6 +2047,26 @@ SINGSIGN_RestoreSignonData (char* passwordRealm, PRUnichar* name, PRUnichar** va si_unlock_signon_list(); } +PUBLIC void +SINGSIGN_RestoreSignonData (char* passwordRealm, PRUnichar* name, PRUnichar** value, PRUint32 elementNumber) { + nsresult rv; + NS_WITH_SERVICE(nsIURL, uri, "component://netscape/network/standard-url", &rv); + if (NS_FAILED(rv)) { + return; + } + rv = uri->SetSpec(passwordRealm); + if (NS_FAILED(rv)) { + return; + } + char * strippedRealm; + rv = uri->GetHost(&strippedRealm); + if (NS_FAILED(rv)) { + return; + } + si_RestoreSignonData (strippedRealm, name, value, elementNumber); + PR_Free(strippedRealm); +} + /* * Remember signon data from a browser-generated password dialog */