TransportSecurityInfo.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2. *
  3. * This Source Code Form is subject to the terms of the Mozilla Public
  4. * License, v. 2.0. If a copy of the MPL was not distributed with this
  5. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6. #ifndef TransportSecurityInfo_h
  7. #define TransportSecurityInfo_h
  8. #include "ScopedNSSTypes.h"
  9. #include "certt.h"
  10. #include "mozilla/BasePrincipal.h"
  11. #include "mozilla/Mutex.h"
  12. #include "mozilla/RefPtr.h"
  13. #include "nsDataHashtable.h"
  14. #include "nsIAssociatedContentSecurity.h"
  15. #include "nsIInterfaceRequestor.h"
  16. #include "nsISSLStatusProvider.h"
  17. #include "nsITransportSecurityInfo.h"
  18. #include "nsNSSShutDown.h"
  19. #include "nsSSLStatus.h"
  20. #include "pkix/pkixtypes.h"
  21. namespace mozilla { namespace psm {
  22. enum SSLErrorMessageType {
  23. OverridableCertErrorMessage = 1, // for *overridable* certificate errors
  24. PlainErrorMessage = 2 // all other errors (or "no error")
  25. };
  26. class TransportSecurityInfo : public nsITransportSecurityInfo,
  27. public nsIInterfaceRequestor,
  28. public nsISSLStatusProvider,
  29. public nsIAssociatedContentSecurity,
  30. public nsISerializable,
  31. public nsIClassInfo,
  32. public nsNSSShutDownObject,
  33. public nsOnPK11LogoutCancelObject
  34. {
  35. protected:
  36. virtual ~TransportSecurityInfo();
  37. public:
  38. TransportSecurityInfo();
  39. NS_DECL_THREADSAFE_ISUPPORTS
  40. NS_DECL_NSITRANSPORTSECURITYINFO
  41. NS_DECL_NSIINTERFACEREQUESTOR
  42. NS_DECL_NSISSLSTATUSPROVIDER
  43. NS_DECL_NSIASSOCIATEDCONTENTSECURITY
  44. NS_DECL_NSISERIALIZABLE
  45. NS_DECL_NSICLASSINFO
  46. nsresult SetSecurityState(uint32_t aState);
  47. nsresult SetShortSecurityDescription(const char16_t *aText);
  48. const nsACString & GetHostName() const { return mHostName; }
  49. const char * GetHostNameRaw() const { return mHostName.get(); }
  50. nsresult GetHostName(char **aHostName);
  51. nsresult SetHostName(const char *aHostName);
  52. int32_t GetPort() const { return mPort; }
  53. nsresult GetPort(int32_t *aPort);
  54. nsresult SetPort(int32_t aPort);
  55. const NeckoOriginAttributes& GetOriginAttributes() const {
  56. return mOriginAttributes;
  57. }
  58. nsresult SetOriginAttributes(const NeckoOriginAttributes& aOriginAttributes);
  59. PRErrorCode GetErrorCode() const;
  60. void GetErrorLogMessage(PRErrorCode errorCode,
  61. ::mozilla::psm::SSLErrorMessageType errorMessageType,
  62. nsString &result);
  63. void SetCanceled(PRErrorCode errorCode,
  64. ::mozilla::psm::SSLErrorMessageType errorMessageType);
  65. /* Set SSL Status values */
  66. nsresult SetSSLStatus(nsSSLStatus *aSSLStatus);
  67. nsSSLStatus* SSLStatus() { return mSSLStatus; }
  68. void SetStatusErrorBits(nsNSSCertificate* cert, uint32_t collected_errors);
  69. nsresult SetFailedCertChain(UniqueCERTCertList certList);
  70. private:
  71. mutable ::mozilla::Mutex mMutex;
  72. protected:
  73. nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
  74. private:
  75. uint32_t mSecurityState;
  76. int32_t mSubRequestsBrokenSecurity;
  77. int32_t mSubRequestsNoSecurity;
  78. PRErrorCode mErrorCode;
  79. ::mozilla::psm::SSLErrorMessageType mErrorMessageType;
  80. nsString mErrorMessageCached;
  81. nsresult formatErrorMessage(::mozilla::MutexAutoLock const & proofOfLock,
  82. PRErrorCode errorCode,
  83. ::mozilla::psm::SSLErrorMessageType errorMessageType,
  84. bool wantsHtml, bool suppressPort443,
  85. nsString &result);
  86. int32_t mPort;
  87. nsXPIDLCString mHostName;
  88. NeckoOriginAttributes mOriginAttributes;
  89. /* SSL Status */
  90. RefPtr<nsSSLStatus> mSSLStatus;
  91. /* Peer cert chain for failed connections (for error reporting) */
  92. nsCOMPtr<nsIX509CertList> mFailedCertChain;
  93. virtual void virtualDestroyNSSReference() override;
  94. void destructorSafeDestroyNSSReference();
  95. };
  96. class RememberCertErrorsTable
  97. {
  98. private:
  99. RememberCertErrorsTable();
  100. struct CertStateBits
  101. {
  102. bool mIsDomainMismatch;
  103. bool mIsNotValidAtThisTime;
  104. bool mIsUntrusted;
  105. };
  106. nsDataHashtable<nsCStringHashKey, CertStateBits> mErrorHosts;
  107. public:
  108. void RememberCertHasError(TransportSecurityInfo * infoobject,
  109. nsSSLStatus * status,
  110. SECStatus certVerificationResult);
  111. void LookupCertErrorBits(TransportSecurityInfo * infoObject,
  112. nsSSLStatus* status);
  113. static nsresult Init()
  114. {
  115. sInstance = new RememberCertErrorsTable();
  116. return NS_OK;
  117. }
  118. static RememberCertErrorsTable & GetInstance()
  119. {
  120. MOZ_ASSERT(sInstance);
  121. return *sInstance;
  122. }
  123. static void Cleanup()
  124. {
  125. delete sInstance;
  126. sInstance = nullptr;
  127. }
  128. private:
  129. Mutex mMutex;
  130. static RememberCertErrorsTable * sInstance;
  131. };
  132. } } // namespace mozilla::psm
  133. // 16786594-0296-4471-8096-8f84497ca428
  134. #define TRANSPORTSECURITYINFO_CID \
  135. { 0x16786594, 0x0296, 0x4471, \
  136. { 0x80, 0x96, 0x8f, 0x84, 0x49, 0x7c, 0xa4, 0x28 } }
  137. #endif // TransportSecurityInfo_h