summaryrefslogtreecommitdiffstats
path: root/security/manager/ssl/nsClientAuthRemember.h
blob: 1be5601ce0a5f3d79c5a182b921bb5f990f73219 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef __NSCLIENTAUTHREMEMBER_H__
#define __NSCLIENTAUTHREMEMBER_H__

#include "mozilla/ReentrantMonitor.h"
#include "nsTHashtable.h"
#include "nsIObserver.h"
#include "nsIX509Cert.h"
#include "nsNSSCertificate.h"
#include "nsString.h"
#include "nsWeakReference.h"
#include "mozilla/Attributes.h"

namespace mozilla {
  class NeckoOriginAttributes;
}

using mozilla::NeckoOriginAttributes;

class nsClientAuthRemember
{
public:

  nsClientAuthRemember()
  {
  }

  nsClientAuthRemember(const nsClientAuthRemember& aOther)
  {
    this->operator=(aOther);
  }

  nsClientAuthRemember& operator=(const nsClientAuthRemember& aOther)
  {
    mAsciiHost = aOther.mAsciiHost;
    mFingerprint = aOther.mFingerprint;
    mDBKey = aOther.mDBKey;
    return *this;
  }

  nsCString mAsciiHost;
  nsCString mFingerprint;
  nsCString mDBKey;
};


// hash entry class
class nsClientAuthRememberEntry final : public PLDHashEntryHdr
{
  public:
    // Hash methods
    typedef const char* KeyType;
    typedef const char* KeyTypePointer;

    // do nothing with aHost - we require mHead to be set before we're live!
    explicit nsClientAuthRememberEntry(KeyTypePointer aHostWithCertUTF8)
    {
    }

    nsClientAuthRememberEntry(const nsClientAuthRememberEntry& aToCopy)
    {
      mSettings = aToCopy.mSettings;
    }

    ~nsClientAuthRememberEntry()
    {
    }

    KeyType GetKey() const
    {
      return EntryKeyPtr();
    }

    KeyTypePointer GetKeyPointer() const
    {
      return EntryKeyPtr();
    }

    bool KeyEquals(KeyTypePointer aKey) const
    {
      return !strcmp(EntryKeyPtr(), aKey);
    }

    static KeyTypePointer KeyToPointer(KeyType aKey)
    {
      return aKey;
    }

    static PLDHashNumber HashKey(KeyTypePointer aKey)
    {
      return PLDHashTable::HashStringKey(aKey);
    }

    enum { ALLOW_MEMMOVE = false };

    // get methods
    inline const nsCString& GetEntryKey() const { return mEntryKey; }

    inline KeyTypePointer EntryKeyPtr() const
    {
      return mEntryKey.get();
    }

    nsClientAuthRemember mSettings;
    nsCString mEntryKey;
};

class nsClientAuthRememberService final : public nsIObserver,
                                          public nsSupportsWeakReference
{
public:
  NS_DECL_THREADSAFE_ISUPPORTS
  NS_DECL_NSIOBSERVER

  nsClientAuthRememberService();

  nsresult Init();

  static void GetEntryKey(const nsACString& aHostName,
                          const NeckoOriginAttributes& aOriginAttributes,
                          const nsACString& aFingerprint,
                          /*out*/ nsACString& aEntryKey);

  nsresult RememberDecision(const nsACString& aHostName,
                            const NeckoOriginAttributes& aOriginAttributes,
                            CERTCertificate* aServerCert,
                            CERTCertificate* aClientCert);

  nsresult HasRememberedDecision(const nsACString& aHostName,
                                 const NeckoOriginAttributes& aOriginAttributes,
                                 CERTCertificate* aServerCert,
                                 nsACString& aCertDBKey, bool* aRetVal);

  void ClearRememberedDecisions();
  static void ClearAllRememberedDecisions();

protected:
    ~nsClientAuthRememberService();

    mozilla::ReentrantMonitor monitor;
    nsTHashtable<nsClientAuthRememberEntry> mSettingsTable;

    void RemoveAllFromMemory();
    nsresult AddEntryToList(const nsACString& aHost,
                            const NeckoOriginAttributes& aOriginAttributes,
                            const nsACString& aServerFingerprint,
                            const nsACString& aDBKey);
};

#endif