Closed Bug 221329 Opened 21 years ago Closed 21 years ago

need to add nsIX509Cert::isPerm and nsIX509CertDB::addCert methods

Categories

(Core Graveyard :: Security: UI, defect)

Other Branch
x86
Windows 2000
defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: Bienvenu, Assigned: Bienvenu)

Details

Attachments

(1 file, 3 obsolete files)

For 4.x compatibility, we need to add nsIX509Cert::isPerm and
nsIX509CertDB::addCert methods so autoconfig js can add certs. Patch upcoming.
Attached patch proposed fix (obsolete) — Splinter Review
proposed fix - this patch seems to work fine, at least for root certs.
this patch also contains the patch for bug 220816, although that fix is not
neccesary. It is, however, needed if GetRawDER is ever to be called from js,
because js expects the result to be copied. Please let me know if you'd rather I
removed those diffs from the patch.
Status: NEW → ASSIGNED
Comment on attachment 132707 [details] [diff] [review]
proposed fix

requesting reviews
Attachment #132707 - Flags: superreview?(scott)
Attachment #132707 - Flags: review?(MisterSSL)
cc'ing Kaie in case he has time to review this.
Comment on attachment 132707 [details] [diff] [review]
proposed fix

I emailed my comments directly to David.
Attachment #132707 - Flags: review?(MisterSSL) → review-
Attached patch fix addressing Nelson's comments (obsolete) — Splinter Review
fix memory leak, clean up return value
Attachment #132707 - Attachment is obsolete: true
Attachment #132891 - Flags: review?(MisterSSL)
Comment on attachment 132891 [details] [diff] [review]
fix addressing Nelson's comments

I'm sorry, but both interfaces you are changing are marked @status frozen :-(

I assume we don't want to change frozen interfaces.
Attachment #132891 - Flags: review?(MisterSSL) → review-
well, cripes, that's really unfortunate. Excuse my ignorance - we've never
frozen any mailnews interfaces so I don't know the policy. I assume frozen means
frozen but it doesn't hurt to ask:

1. Does anyone care if these interfaces are frozen? Is there anyone out there
actually using them, or would we know if there were? If there were, would adding
new methods at the end break them?

2. I suppose my alternative is to create two new interfaces, one each with the
methods I need, and make the underlying objects implement those interfaces, and
QI for those interfaces. Or, roll my two methods into one new method on the new
interface nsIX509CertDB2:

 void addX509CertFromBase64(in string aBase64, in string aTrust, in string aName);

It would check if the cert already existed in the db, and if not, add it to the
db, and set the trust appropriately. 

Is that approach going to be acceptable?

thx, - David
Comment on attachment 132891 [details] [diff] [review]
fix addressing Nelson's comments

Random nits first:

>@@ -850,12 +850,24 @@
>     return NS_ERROR_NOT_AVAILABLE;
> 
>   if (mCert) {
>-    *aArray = (PRUint8 *)mCert->derCert.data;
>+    *aArray = (PRUint8 *) PR_Malloc(mCert->derCert.len);
>+    if (*aArray)
>+      memcpy(*aArray, (PRUint8 *)mCert->derCert.data, mCert->derCert.len);
>+    else
>+      return NS_ERROR_OUT_OF_MEMORY;
>     *aLength = mCert->derCert.len;
>     return NS_OK;

This control flow is arbitrarily overcomplicated -- why not return NS_ERROR_OOM
right away if (! *aArray)?  Then the memcpy is not overindented and separated
from the *aLength setting and return NS_OK.

>   }
>   *aLength = 0;
>   return NS_ERROR_FAILURE;

That nit suggests inverting the if (mCert) test to return NS_ERROR_FAILURE
early.	Also, why is *aLength zeroed only for this failure return, not for the
NS_ERROR_NOT_AVAILABLE in the first line of context?  Are any callers actually
counting on valid out params after a failed call?

>+}
>+
>+NS_IMETHODIMP
>+nsNSSCertificate::GetIsPerm(PRBool *aIsPerm)
>+{
>+  NS_ENSURE_ARG_POINTER(aIsPerm);
>+  *aIsPerm = (mCert) ? mCert->isperm : PR_FALSE;

  *aIsPerm = mCert && mCert->isperm;

is better than using ?:PR_FALSE.

Another nit, possibly a stupid question on my part: is isPerm the best name for
this attribute?  Should it be an readonly attribute, or an explicit method?

Unfortunately, FROZEN means "don't ever change this."  See bug 168452 for some
of the history leading up to the freeze.  It may be that no one actually uses
these frozen interfaces yet.  If that can be determined, adding at the end is
ok.  The trick will be determining that no one counts on this now.  I suspect
some embedders do, though perhaps not the original embedder driving the effort
in  bug 168452.

/be
this is the other approach, since the interfaces are frozen. I backed out the
getrawder changes because if we have embedders using that, their code will
start leaking, which takes care of the nits :-)
+  // need to calculate the trust bits from the aTrust string.
+  rv = CERT_DecodeTrustString(trust.GetTrust(), /* this is const, but not
declared that way */(char *) aTrust);
+  trust.SetValidCA();

what if CERT_DecodeTrustString returns an error?
I've moved things around so that we error out with a bad trust string, and also
added an error check for creating the x509 cert from base64.
Attachment #132891 - Attachment is obsolete: true
Comment on attachment 133266 [details] [diff] [review]
patch addressing Nelson's comment

requesting review for patch addressing Nelson's comments.
Attachment #133266 - Flags: review?(MisterSSL)
Comment on attachment 132964 [details] [diff] [review]
add a new interface to accomplish this

obsoleting old patch
Attachment #132964 - Attachment is obsolete: true
I realize everyone's very busy, but can any security module owner review the
last patch? It adds a new interface, so it can't break any existing clients...
Comment on attachment 133266 [details] [diff] [review]
patch addressing Nelson's comment

David,	
I looked over your patch and I believe it should do what you expect it to do
for users whose crypto software is not running in 'FIPS mode".	r=MisterSSL.  

My remaining concerns at this point are whether these interfaces, which are 
more-or-less modelled on the old C4.x ones, are right for modern mozilla.  
Old C4.x had one central cert DB.  Now, mozilla has potentially numerous 
PKCS11 crypto modules, including hardware and software modules.  The cert 
interfaces should be able to acccess (and store) certs into any module.  
The single central certDB paradigm allows access to only a limited subset 
of the underlying capability of modern mozilla.

In a perfect world, I'd say we should review all the existing mozilla 
crypto JS interfaces, and not create any more JS interfaces that would limit
the functionality (to the old paradigm), and instead devise new interfaces
that match mozilla's capabilities.  

OTOH, I think there will always be a software cert store, and having an
interface that can manipulate (only) that store is not necessarily a bad thing.
Attachment #133266 - Flags: review?(MisterSSL) → review+
Comment on attachment 133266 [details] [diff] [review]
patch addressing Nelson's comment

great, thx, Nelson.
Attachment #133266 - Flags: superreview?(scott)
Comment on attachment 133266 [details] [diff] [review]
patch addressing Nelson's comment

sr=sspitzer
Attachment #133266 - Flags: superreview?(scott) → superreview+
fixed, thx.
Status: ASSIGNED → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
Comment on attachment 132707 [details] [diff] [review]
proposed fix

removing obsolete review request
Attachment #132707 - Flags: superreview?(scott)
Product: PSM → Core
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: