~ubuntu-branches/ubuntu/trusty/xulrunner/trusty

« back to all changes in this revision

Viewing changes to security/manager/ssl/src/nsNSSIOLayer.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Devid Antonio Filoni
  • Date: 2008-08-25 13:04:18 UTC
  • mfrom: (1.1.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20080825130418-ck1i2ms384tzb9m0
Tags: 1.8.1.16+nobinonly-0ubuntu1
* New upstream release (taken from upstream CVS), LP: #254618.
* Fix MFSA 2008-35, MFSA 2008-34, MFSA 2008-33, MFSA 2008-32, MFSA 2008-31,
  MFSA 2008-30, MFSA 2008-29, MFSA 2008-28, MFSA 2008-27, MFSA 2008-25,
  MFSA 2008-24, MFSA 2008-23, MFSA 2008-22, MFSA 2008-21, MFSA 2008-26 also
  known as CVE-2008-2933, CVE-2008-2785, CVE-2008-2811, CVE-2008-2810,
  CVE-2008-2809, CVE-2008-2808, CVE-2008-2807, CVE-2008-2806, CVE-2008-2805,
  CVE-2008-2803, CVE-2008-2802, CVE-2008-2801, CVE-2008-2800, CVE-2008-2798.
* Drop 89_bz419350_attachment_306066 patch, merged upstream.
* Bump Standards-Version to 3.8.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
58
58
#include "nsIDateTimeFormat.h"
59
59
#include "nsDateTimeFormatCID.h"
60
60
#include "nsIClientAuthDialogs.h"
 
61
#include "nsClientAuthRemember.h"
61
62
 
62
63
#include "nsXPIDLString.h"
63
64
#include "nsReadableUtils.h"
225
226
  }
226
227
}
227
228
 
228
 
NS_IMPL_THREADSAFE_ISUPPORTS4(nsNSSSocketInfo,
 
229
NS_IMPL_THREADSAFE_ISUPPORTS5(nsNSSSocketInfo,
229
230
                              nsITransportSecurityInfo,
230
231
                              nsISSLSocketControl,
231
232
                              nsIInterfaceRequestor,
232
 
                              nsISSLStatusProvider)
 
233
                              nsISSLStatusProvider,
 
234
                              nsIClientAuthUserDecision)
233
235
 
234
236
nsresult
235
237
nsNSSSocketInfo::GetHandshakePending(PRBool *aHandshakePending)
283
285
  return mCanceled;
284
286
}
285
287
 
 
288
NS_IMETHODIMP nsNSSSocketInfo::GetRememberClientAuthCertificate(PRBool *aRememberClientAuthCertificate)
 
289
{
 
290
  NS_ENSURE_ARG_POINTER(aRememberClientAuthCertificate);
 
291
  *aRememberClientAuthCertificate = mRememberClientAuthCertificate;
 
292
  return NS_OK;
 
293
}
 
294
 
 
295
NS_IMETHODIMP nsNSSSocketInfo::SetRememberClientAuthCertificate(PRBool aRememberClientAuthCertificate)
 
296
{
 
297
  mRememberClientAuthCertificate = aRememberClientAuthCertificate;
 
298
  return NS_OK;
 
299
}
 
300
 
286
301
void nsNSSSocketInfo::SetHasCleartextPhase(PRBool aHasCleartextPhase)
287
302
{
288
303
  mHasCleartextPhase = aHasCleartextPhase;
2249
2264
  nsNSSShutDownPreventionLock locker;
2250
2265
  void* wincx = NULL;
2251
2266
  SECStatus ret = SECFailure;
2252
 
  nsresult rv;
2253
2267
  nsNSSSocketInfo* info = NULL;
2254
2268
  PRArenaPool* arena = NULL;
2255
2269
  char** caNameStrings;
2256
2270
  CERTCertificate* cert = NULL;
2257
 
  CERTCertificate* serverCert = NULL;
2258
2271
  SECKEYPrivateKey* privKey = NULL;
2259
2272
  CERTCertList* certList = NULL;
2260
2273
  CERTCertListNode* node;
2378
2391
        goto noCert;
2379
2392
    }
2380
2393
  }
 
2394
  else { // Not Auto => ask
 
2395
    /* Get the SSL Certificate */
 
2396
    CERTCertificate* serverCert = NULL;
 
2397
    CERTCertificateCleaner serverCertCleaner(serverCert);
 
2398
    serverCert = SSL_PeerCertificate(socket);
 
2399
    if (serverCert == NULL) {
 
2400
      /* couldn't get the server cert: what do I do? */
 
2401
      goto loser;
 
2402
    }
 
2403
 
 
2404
    nsXPIDLCString hostname;
 
2405
    info->GetHostName(getter_Copies(hostname));
 
2406
 
 
2407
    nsresult rv;
 
2408
    NS_DEFINE_CID(nssComponentCID, NS_NSSCOMPONENT_CID);
 
2409
    nsCOMPtr<nsINSSComponent> nssComponent(do_GetService(nssComponentCID, &rv));
 
2410
    nsRefPtr<nsClientAuthRememberService> cars;
 
2411
    if (nssComponent) {
 
2412
      nssComponent->GetClientAuthRememberService(getter_AddRefs(cars));
 
2413
    }
 
2414
 
 
2415
    PRBool hasRemembered = PR_FALSE;
 
2416
    nsCString rememberedNickname;
 
2417
    if (cars) {
 
2418
      PRBool found;
 
2419
      nsresult rv = cars->HasRememberedDecision(hostname, 
 
2420
                                                serverCert,
 
2421
                                                rememberedNickname, &found);
 
2422
      if (NS_SUCCEEDED(rv) && found) {
 
2423
        hasRemembered = PR_TRUE;
 
2424
      }
 
2425
    }
 
2426
 
 
2427
    PRBool canceled = PR_FALSE;
 
2428
 
 
2429
if (hasRemembered)
 
2430
{
 
2431
  if (rememberedNickname.IsEmpty())
 
2432
    canceled = PR_TRUE;
2381
2433
  else {
 
2434
    char *const_nickname = const_cast<char*>(rememberedNickname.get());
 
2435
    cert = CERT_FindCertByNickname(CERT_GetDefaultCertDB(), const_nickname);
 
2436
  }
 
2437
}
 
2438
else
 
2439
{
2382
2440
    /* user selects a cert to present */
2383
2441
    nsIClientAuthDialogs *dialogs = NULL;
2384
2442
    PRInt32 selectedIndex = -1;
2385
2443
    PRUnichar **certNicknameList = NULL;
2386
2444
    PRUnichar **certDetailsList = NULL;
2387
 
    PRBool canceled;
2388
2445
 
2389
2446
    /* find all user certs that are for SSL */
2390
2447
    /* note that we are allowing expired certs in this list */
2441
2498
 
2442
2499
    NS_ASSERTION(nicknames->numnicknames == NumberOfCerts, "nicknames->numnicknames != NumberOfCerts");
2443
2500
 
2444
 
    /* Get the SSL Certificate */
2445
 
    serverCert = SSL_PeerCertificate(socket);
2446
 
    if (serverCert == NULL) {
2447
 
      /* couldn't get the server cert: what do I do? */
2448
 
      goto loser;
2449
 
    }
2450
 
 
2451
2501
    /* Get CN and O of the subject and O of the issuer */
2452
2502
    char *ccn = CERT_GetCommonName(&serverCert->subject);
2453
2503
    NS_ConvertUTF8toUCS2 cn(ccn);
2461
2511
    NS_ConvertUTF8toUCS2 issuer(cissuer);
2462
2512
    if (cissuer) PORT_Free(cissuer);
2463
2513
 
2464
 
    CERT_DestroyCertificate(serverCert);
2465
 
 
2466
2514
    certNicknameList = (PRUnichar **)nsMemory::Alloc(sizeof(PRUnichar *) * nicknames->numnicknames);
2467
2515
    if (!certNicknameList)
2468
2516
      goto loser;
2533
2581
    
2534
2582
    if (NS_FAILED(rv)) goto loser;
2535
2583
 
2536
 
    if (canceled) { rv = NS_ERROR_NOT_AVAILABLE; goto loser; }
 
2584
    // even if the user has canceled, we want to remember that, to avoid repeating prompts
 
2585
    PRBool wantRemember = PR_FALSE;
 
2586
    info->GetRememberClientAuthCertificate(&wantRemember);
2537
2587
 
2538
2588
    int i;
 
2589
    if (!canceled)
2539
2590
    for (i = 0, node = CERT_LIST_HEAD(certList);
2540
2591
         !CERT_LIST_END(node, certList);
2541
2592
         ++i, node = CERT_LIST_NEXT(node)) {
2546
2597
      }
2547
2598
    }
2548
2599
 
 
2600
    if (cars && wantRemember) {
 
2601
      cars->RememberDecision(hostname, 
 
2602
                             serverCert, 
 
2603
                             canceled ? 0 : cert);
 
2604
    }
 
2605
}
 
2606
 
 
2607
    if (canceled) { rv = NS_ERROR_NOT_AVAILABLE; goto loser; }
 
2608
 
2549
2609
    if (cert == NULL) {
2550
2610
      goto loser;
2551
2611
    }