Closed Bug 84834 Opened 23 years ago Closed 23 years ago

We need an API that returns the password given the host and/or user name

Categories

(SeaMonkey :: Passwords & Permissions, defect, P1)

x86
Windows NT

Tracking

(Not tracked)

VERIFIED FIXED
mozilla0.9.2

People

(Reporter: racham, Assigned: morse)

References

Details

(Whiteboard: [pdt+])

Attachments

(4 files)

Today, a password stored in the password manager is obtained when when we go
through routines like PromptPassword ( & GetPasswordwithUI()), which involve UI
elements to be passed in as input params. This arrangement is not convenient for
some other tasks where password is needed (if exists) without having to go
through UI tied up routines.

For example, in mailnews, we have a feature (bug 80296) where one can get
messages for multiple accounts by clicking 'Get All New Messages' on GetMsg
button dropmarker menupopup. What we do there is to get the server list and
query each server for the password. If the password value exists (say stored in
the password mgr in one of the earlier sessions), then that account is
authenticated. So, we can safely (wihtout having to worrying about password
popup) call getmessages on that server and get messages. Today, we are getting
null values back for some of the servers who passwords are already stored. Hence
the feature doesn't work as expected. So, the routine GetPassword() in
nsMsgIncomingServer has to be smarter than it is right now in returning the
password and we need Password Mgr's help to do that.

All GetPassword() does today is to make a copy of m_password and return the
same.
http://lxr.mozilla.org/seamonkey/source/mailnews/base/util/nsMsgIncomingServer.cpp#661

Today sometimes, Though the password actually exists, the m_password is not set
yet. 

Reason : we haven't made a call to GetPasswordWithUI yet (which will set the
m_password) which then will go contact SignonService and gets the password. 

Is it legal to get the password without having to go thru GetPasswordWithUI..?
Yes. It should be. 

When I query a server (whose password is stored) for it's password and if I get
back a null/empty string..then that's an error condition. So, GetPassword(), if
m_password is empty, should call nsPasswordMgr's API (that I am requesting here)
and return the passwrod if it is there. That's why we need that API. I am sure
some one else will also need such a thing as we go forward.

Another instance in mailnews where we need this feature desparately is the Biff
feature. Today Biff on any second account will fail as
http://lxr.mozilla.org/seamonkey/source/mailnews/base/src/nsMsgBiffManager.cpp#316
simply returns a null password. It works for the first account because user
might have actually clicked on GetMsg button (or some other authentication)
which calls GetPasswordWithUI(). Sheela, if you have bug number for this, please
state it here.

We need an API in nsIPasswordManager that goes something like 
string getPassword(string hostname, wstring username) or
string getPassword(string hostname)

I spoke to Steve Morse about the current abilities of the password manager. He
already has an idea on what I am looking for. 

I talked to mScott about the current scenario and we both agree we may need such
an API. I also talked to Sheel about the existing error condition in Biff.

Adding Seth & Scott Putterman to the cc list.

bhuvan
Adding the dependency and adjusted milestone of this bug based on that. 
Blocks: 80296
Severity: normal → major
Target Milestone: --- → mozilla0.9.2
Scott (Putterman) - could you add more on why this is an rtm stopper, I could
not follow the description in bug 80296 completely. Steve - how easy is this to
add i.e. time taken? 
Blocks: 85227
It's simple to implement, probably no more than a day or two.  It's a matter of 
adding the following additional attribute to 
extensions/wallet/public/nsIPassword.idl

   readonly attribute wstring password;

and then writing some c++ code in nsPasswordManager.cpp to fetch that attribute.
Vishy, mailnews has a couple of bugs where biff and Get Msgs for multiple
accounts should work for all accounts that we know the password for on startup.
 One of the goals for mailnews was to have better multiple account management
and without this the user is going to be forced to access each account before
they can do anything with them.

Bhuvan, in a worse case scenario, could you check your patch in?
Unless I misunderstood the patch, I don't think it's the kind of thing you want 
to check in.  It's not a fix at all but merely a test.

Are you going to be fetching all the mail passwords when mail starts up?  If so, 
the user would then be prompted for his master password if he chose to have his 
data encrypted.  Is that the behavior that you want?
Steve,

When user clicks on GetAllNewMessages, I do want to check all those servers
which can get messages for their passwords. Then if I find password for a given
server, it's considered as an authenticated account and hence we will get
messages for that server without putting any password prompt dialogs..

With API you susggested 'readonly attribute wstring password;' which sitename's
password is this going to return ? The API I am looking for is more specifically
looking for the password for a given hostname (and/or username). I would like
PasswordMgr to do the enumeration or any other kind of algorithm to find the
corresponding password. 

If the API you will add is just the attribute, then the caller has to do the
enumeration to extract the password from the password objects..right ? I would
like PasswordMgr to handle that logic. So, besides the API you suggested, it
will be useful if you can also provide us another API which returns password
like the ones I suggested in my previous updates 

* wstring getPassword(string hostname, wstring username)
* wstring getPassword(string hostname)

I will be on aim as bhuvanr, please do ping me or I will ping you if I find you.
thanks.

Scott, 

We can go with workaround. The only issue with that will be, it does these
enumerations everytime to find out if the password for a given server exists and
that may cost us something. That's why if we have the password string back, then
we can simply make GetPassword() to learn about it (by filling m_password) and
make it not ask the password again.

bhuvan
I disagree.  The enumeration interface is currently the way the password manager 
makes it's data available.  So if a caller wants the password for a particular 
url, it should be the caller's responsibility to go through the enumeration 
until finding the desired one.
OK Steve. That's fine. Please go ahead with readonly attribute wstring password;
in nsIPassword.idl and corresponding cpp code as you suggested.

I will attach a new patch based on that API in the dependent bugs. Once you
check in, I will do testing for correctness and then request reviews.

thanks
bhuvan
To answer Steve's question, for the case of biff, we don't want the master
password dialog coming up. For Get All Messages I think that would be ok.
> To answer Steve's question, for the case of biff, we don't want the master
> password dialog coming up.

You won't be able to stop it.  If your data is encrypted, PSM will automatically 
pop up that dialog and I have no control over that.  So tell me if you still 
want me to implement this interface change.
Jennifer what's your feeling on this?  Would you rather see a master password
come up when doing biff on startup or not have biff work for accounts that
remember their password.

Steve is there any way to make an api that allows us to specify that we want the
password only if it's unencrypted?
> Steve is there any way to make an api that allows us to specify that we
> want the password only if it's unencrypted?

Not cleanly.
racham, please review the patch, alecf please superreview it.  Thanks.
Status: NEW → ASSIGNED
Steve, 

What is the master password and how/when is it set by the user ? Will the user  
be asked for master password when the password to be featched is an encrypted 
one ? Howmuch effort is involved if we have to only fetch unencrypted passwords 
?

Though I only need info to the extent of knowing whether or not password is 
avialable to solve my bugs, it is not optimal at all. Because every time I do 
GetAllNewMessages OR when biff activity is triggered, I have to enumearate thru 
all password elements to find if the password entry is then there..that's 
expensive.

bhuvan
r=racham.
I will also test it with my patch in mailnews and post the test results.
> What is the master password and how/when is it set by the user ?

When the user decides he wants to encrypt his data, he needs to select an 
encryption key.  That's the "master password."  He "sets" it at the time that he 
asks to have his data encrypted.  Furthermore, he needs to supply it in each 
browser session at the first point in time that the database is to be accessed.

> Will the user be asked for master password when the password to be featched
> is an encrypted one ?

Yes, if he has not already supplied it for the browser session.

> Howmuch effort is involved if we have to only fetch unencrypted passwords ?

There's no clean way for you to specify that in the API

> every time I do GetAllNewMessages OR when biff activity is triggered,
> I have to enumearate thru all password elements to find if the password
> entry is then there..that's expensive.

If you are suggesting as an alternative that password manager do the iteration 
for you, that's just as expensive but on the other side of the interface.  So 
nothing would be saved.
it seems unnecessary (and unfair to developers whose first language is not
english and might not understand such abbreviations) to call this "pswd" when it
could just be called "password"

sr=alecf if you rename that attribute to "password"
> it seems unnecessary (and unfair to developers whose first language is not
> english and might not understand such abbreviations) to call this "pswd"
> when it could just be called "password"

But there is already a "password" object being used in this coding
Ignore above comment -- I hit submit button by accident when I meant to hit 
clear.
Blocks: 83989
(my sr=alecf still stands.. thanks for the change!)
Works fine when tested with mailnews patches in the dependent bugs.

Steve, thanks for adding the interface as needed so quickly. I have few more
questions regd the master password and the ways we can avoid the dialog..Will
send you mail regd that.

thanks,
bhuvan.
The hand-off of memory allocated by SINGSIGN_Enumerate to its caller follows
XPCOM rules, but then that memory is handed off to new nsPassword(...) in a
non-XPCOM fashion, and there's a leak if operator new fails:

-      nsIPassword *password = new nsPassword(host, user);
+      nsIPassword *password = new nsPassword(host, user, pswd);
       if (password == nsnull) {
         return NS_ERROR_OUT_OF_MEMORY;
       }

All of host, user and pswd are leaked should NS_ERROR_OUT_OF_MEMORY bite here. 
Why not use nsXPIDLStrings and have new nsPassword copy?  Or to minimize change
and copying overhead, at least document the non-XPCOM handoff here and spot-fix
the leak with some nsMemory::Free calls in the error return case?

/be
Keywords: nsbeta1+
Priority: -- → P1
Whiteboard: [pdt+]
>Jennifer what's your feeling on this?  Would you rather see a master password
>come up when doing biff on startup or not have biff work for accounts that
>remember their password.

If I understand correctly, if a user is using the Master Password feature to 
store their Mail passwords, when Mail launches, and a password is needed to 
retrieve messages, if the user has not already supplied their Master Password 
for another component, they should be asked for their Master Password now, at 
startup of Mail.
a=blizzard for drivers for the trunk
Fix checked in.
Status: ASSIGNED → RESOLVED
Closed: 23 years ago
Resolution: --- → FIXED
Verified fix checked into lxr.mozilla.org
Status: RESOLVED → VERIFIED
No longer blocks: 80296
Product: Browser → Seamonkey
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: